commit 4d57c022c62ee1d1ddad3035653cd635780d8a5a Author: yidao620 Date: Mon Feb 26 19:05:53 2018 +0800 first diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1e3c5bb --- /dev/null +++ b/.gitignore @@ -0,0 +1,14 @@ +# 此为注释– 将被Git 忽略 +# /结尾表示是目录,忽略目录和目录下的所有件 +# /开头表示根目录,否则是.gitignore的相对目录 +# !开头表示反选 +.idea/ +target/ +*.iml +*.ipr +*.iws +*.log +.svn/ +.project +rebel.xml +.rebel-remote.xml.* diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..83cd47d --- /dev/null +++ b/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2018 Xiong Neng + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..c9c0bb9 --- /dev/null +++ b/README.md @@ -0,0 +1,88 @@ +## SpringBoot 全家桶 + +Spring Boot 现在已经成为Java 开发领域的一颗璀璨明珠,它本身是包容万象的,可以跟各种技术集成。 + +本项目对目前Web开发中常用的各个技术,通过和SpringBoot的集成,并且对各种技术通过“一篇博客 + 一个可运行项目”的形式来详细说明。 + +每个子项目都会使用最小依赖,大家拿来即可使用,自己可以根据业务需求自由组合搭配不同的技术构建项目。 + +## 项目简介 + +![](https://xnstatic-1253397658.file.myqcloud.com/SpringBootBucket.png) + + +## 子项目列表 + +每个项目一篇博客文章的详细讲解,点击链接可以查看文章: + +* springboot-thymeleaf [集成Thymeleaf构建Web应用](https://www.xncoding.com/2017/07/01/spring/sb-thymeleaf.html) +* springboot-mybatis [集成MyBatis](https://www.xncoding.com/2017/07/02/spring/sb-mybatis.html) +* springboot-hibernate [集成Hibernate](https://www.xncoding.com/2017/07/03/spring/sb-hibernate.html) +* springboot-mongodb [集成MongoDB](https://www.xncoding.com/2017/07/04/spring/sb-mongodb.html) +* springboot-restful [实现RESTful接口](https://www.xncoding.com/2017/07/05/spring/sb-restful.html) +* springboot-resttemplate [使用RestTemplate](https://www.xncoding.com/2017/07/06/spring/sb-restclient.html) +* springboot-shiro [集成Shiro权限管理](https://www.xncoding.com/2017/07/07/spring/sb-shiro.html) +* springboot-swagger2 [集成Swagger2](https://www.xncoding.com/2017/07/08/spring/sb-swagger2.html) +* springboot-jwt [集成JWT实现接口权限认证](https://www.xncoding.com/2017/07/09/spring/sb-jwt.html) +* springboot-multisource[多数据源配置](https://www.xncoding.com/2017/07/10/spring/sb-multisource.html) +* springboot-schedule [定时任务](https://www.xncoding.com/2017/07/12/spring/sb-schedule.html) +* springboot-websocket [使用WebScoket实时通信](https://www.xncoding.com/2017/07/15/spring/sb-websocket.html) +* springboot-socketio [集成SocketIO实时通信](https://www.xncoding.com/2017/07/16/spring/sb-socketio.html) +* springboot-async [异步线程池](https://www.xncoding.com/2017/07/20/spring/sb-async.html) +* springboot-starter [教你自己写starter](https://www.xncoding.com/2017/07/22/spring/sb-starter.html) +* springboot-aop [使用AOP](https://www.xncoding.com/2017/07/24/spring/sb-aop.html) +* springboot-transaction [声明式事务](https://www.xncoding.com/2017/07/26/spring/sb-transaction.html) +* springboot-cache [使用缓存](https://www.xncoding.com/2017/07/28/spring/sb-cache.html) +* springboot-redis [Redis数据库](https://www.xncoding.com/2017/07/30/spring/sb-redis.html) +* springboot-batch [批处理](https://www.xncoding.com/2017/08/01/spring/sb-batch.html) +* springboot-rabbitmq [集成消息队列RabbitMQ](https://www.xncoding.com/2017/08/06/spring/sb-rabbitmq.html) +* springboot-echarts [集成Echarts导出图片](https://www.xncoding.com/2017/08/19/spring/sb-echarts.html) +* app-manage [一个完整的Web后台管理系统,组合使用了多种技术] +* app-manage-api [同时实现了需要认证授权访问的RESTful API接口和WebSocket接口] + +## 环境 + +* maven latest +* jdk1.8 +* spring boot 1.5.9 release +* intellij idea +* mysql5.6 +* git +* nginx + +## 运行 + +每个子项目都可以单独运行,都是打包成jar包后,通过使用内置jetty容器执行,有3种方式运行。 + +1. 在IDEA里面直接运行Application.java的main函数。 +2. 另一种方式是执行`mvn clean package`命令后传到linux服务器上面,通过命令`java -jar xxx.jar`方式运行 +3. 在linux服务器上面,配置好jdk、maven、git命令后,通过`git clone sb-xxx`拉取工程后,执行`./run.sh start test`命令来执行 + +注:每个子项目有自己的README.md文件,告诉你该怎么初始化环境,比如准备好数据库SQL文件等。 + +另外,如果你需要打包成war包放到tomcat容器中运行,可修改pom.xml文件,将打包类型从jar改成war,打包后再放到容器中运行: + +``` xml +4.0.0 +sb-cache +war +``` + +## 后续计划 + +1. 集成OAuth2认证 +1. 集成QQ、微信、新浪微博第三方登录,配合shiro使用 +1. 集成网络爬虫框架 + +## 问题反馈 + +1. 欢迎提issue一起完善这个项目 +1. Email: yidao620@gmail.com +1. 个人主站: https://www.xncoding.com/ + +## 许可证 + +Copyright (c) 2018 [Xiong Neng](https://www.xncoding.com/) + +基于 MIT 协议发布: + diff --git a/app-manage-api/.gitignore b/app-manage-api/.gitignore new file mode 100644 index 0000000..b71e0c4 --- /dev/null +++ b/app-manage-api/.gitignore @@ -0,0 +1,17 @@ +# 此为注释– 将被Git 忽略 +# /结尾表示是目录,忽略目录和目录下的所有件 +# /开头表示根目录,否则是.gitignore的相对目录 +# !开头表示反选 +.idea/ +target/ +*.iml +*.ipr +*.iws +*.log +.svn/ +.project +rebel.xml +.rebel-remote.xml.* +swagger.json +swagger.adoc + diff --git a/app-manage-api/LICENSE b/app-manage-api/LICENSE new file mode 100644 index 0000000..83cd47d --- /dev/null +++ b/app-manage-api/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2018 Xiong Neng + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/app-manage-api/README.md b/app-manage-api/README.md new file mode 100644 index 0000000..8baa929 --- /dev/null +++ b/app-manage-api/README.md @@ -0,0 +1,63 @@ + +## 简介 +同时实现了RESTful API接口和WebSocket接口,并且都需要授权才能访问,授权机制基于Token,实现技术是JWT+Shiro + +访问RESTful API接口或连接到WebSocket服务之前,都需要先调用登录接口拿到Token。 + +## JWT + Shiro实现接口认证 + +SpringBoot + JWT + Shiro实现RESTful API的授权访问 + +## WeSocket长连接 + +Socket.IO服务器端和客户端,使用Java语言实现,用于和POS机进行长连接的WebSocket通信。 + +服务器端可以实时将消息推送给POS端,比如机具解绑操作,以此来取代机具管理系统中客户端轮询机制。 + +Sockt.io官网: + +服务器端使用 [netty-socketio](https://github.com/mrniko/netty-socketio) + +客户端使用 [socket.io-client-java](https://github.com/socketio/socket.io-client-java) + +### WebSocket js客户端测试 + +``` +com.enzhico.pos.socket.server.ChatLauncher - /client/html/index.html +com.enzhico.pos.socket.server.EventChatLauncher - /client/html/event-index.html +com.enzhico.pos.socket.server.SslChatLauncher - /client/html/ssl-event-index.html +com.enzhico.pos.socket.server.NamespaceChatLauncher - /client/html/namespace-index.html +com.enzhico.pos.socket.server.AckChatLauncher - /client/html/ack-index.html +com.enzhico.pos.socket.server.BinaryEventLauncher - /client/html/binary-event-index.html +``` + +### WebSocket Java客户端测试 + +``` +服务器: +com.enzhico.pos.socket.server.SocketServer +客户端: +com.enzhico.pos.socket.client.SocketClient +``` + +### 广播消息中的namespace和room + +如果不指定namespace,有个默认namespace,默认room,房间在namespace下面。 + +netty-socketio服务器端完整实现了所有Socket.IO功能,而客户端再浏览器下面表现完美, +但是socket.io-client-java只要加上namespace就报错,不过它的room广播功能可用。 +所以目前的做法是对于每个项目下的APP,加入到对应applicationId房间中,可实现房间广播。 + +## JWT + Netty-SocketIO实现WebSocket的授权访问 + +对于需要进行认证的接口,通过JWT的Token方式实现了用户认证访问。 + +## 运行 + +该工程和app-manage工程配套,请参考app-manage工程的数据库初始化schema.sql + +## 许可证 + +Copyright (c) 2018 Xiong Neng + +基于 MIT 协议发布: diff --git a/app-manage-api/pom.xml b/app-manage-api/pom.xml new file mode 100644 index 0000000..490bcef --- /dev/null +++ b/app-manage-api/pom.xml @@ -0,0 +1,274 @@ + + + 4.0.0 + + com.xncoding + app-manage-api + 1.0.0-SNAPSHOT + jar + + app-manage-api + JWT实现RESTful API接口认证和Socket.IO认证 + + + org.springframework.boot + spring-boot-starter-parent + 1.5.9.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + 4.1.19.Final + 1.1.2 + 8.0.7-dmr + 2.1.8 + 1.0.5 + + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + org.springframework.boot + spring-boot-starter-jetty + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + org.springframework.boot + spring-boot-starter-aop + + + + com.auth0 + java-jwt + 3.3.0 + + + + mysql + mysql-connector-java + ${mysql-connector.version} + runtime + + + com.alibaba + druid + ${druid.version} + + + + com.baomidou + mybatis-plus + ${mybatis-plus.version} + + + com.baomidou + mybatisplus-spring-boot-starter + ${mybatisplus-spring-boot-starter.version} + + + + org.springframework.boot + spring-boot-starter-test + test + + + com.vaadin.external.google + android-json + + + + + commons-io + commons-io + 2.5 + + + org.apache.commons + commons-lang3 + 3.7 + + + commons-codec + commons-codec + 1.11 + + + commons-net + commons-net + 3.6 + + + + + org.apache.shiro + shiro-spring + 1.4.0 + + + slf4j-api + org.slf4j + + + + + + org.apache.shiro + shiro-ehcache + 1.4.0 + + + slf4j-api + org.slf4j + + + + + + + com.corundumstudio.socketio + netty-socketio + 1.7.13 + + + io.netty + netty-buffer + ${netty.version} + + + io.netty + netty-codec + ${netty.version} + + + io.netty + netty-codec-http + ${netty.version} + + + io.netty + netty-common + ${netty.version} + + + io.netty + netty-handler + ${netty.version} + + + io.netty + netty-resolver + ${netty.version} + + + io.netty + netty-transport + ${netty.version} + + + io.netty + netty-transport-native-epoll + ${netty.version} + + + io.netty + netty-transport-native-unix-common + ${netty.version} + + + io.socket + socket.io-client + 1.0.0 + + + + + io.springfox + springfox-swagger2 + 2.7.0 + + + com.xncoding + springfox-swagger-ui + 2.7.0 + + + org.pegdown + pegdown + 1.6.0 + test + + + io.github.swagger2markup + swagger2markup + 1.3.1 + test + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.6.1 + + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.20 + + + ${project.basedir}/src/main/resources/swagger + ${project.basedir}/src/main/resources/swagger/swagger + + true + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + + + src/main/resources + + + src/main/java + + **/*.xml + + + + + + \ No newline at end of file diff --git a/app-manage-api/run.sh b/app-manage-api/run.sh new file mode 100644 index 0000000..955efb1 --- /dev/null +++ b/app-manage-api/run.sh @@ -0,0 +1,72 @@ +#!/bin/bash +# 项目自动更新脚本 +# 先clone相应的分支下来: +# git clone ssh://git@120.24.173.142:7999/xxx.git +# 远程调试启动: +# nohup java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -Xms512m -Xmx1024m -jar -Dspring.profiles.active=${profile} ${jarfile} >/dev/null 2>&1 & + +function start { + profile="$1" + echo "启动环境profile=${profile}" + jarfile=$(ls target/*.jar) + if [[ "$?" == "0" ]]; then + stop $profile $jarfile + fi + branch=$(git branch |awk '{print $2}') + git pull origin ${branch} + echo "更新完代码开始重新打包" + mvn clean && mvn clean && mvn package -DskipTests=true + if [[ "$?" != "0" ]]; then + echo "编译出错,退出!" + exit 1 + fi + echo "nohup java -Xms512m -Xmx1024m -jar -Dspring.profiles.active=${profile} ${jarfile} >/dev/null 2>&1 &" + nohup java -Xms512m -Xmx1024m -jar -Dspring.profiles.active=${profile} ${jarfile} >/dev/null 2>&1 & + echo "启动应用中,请查看日志文件..." +} + +function stop { + profile="$1" + jarfile="$2" + ps aux | grep "${jarfile}" | grep "spring.profiles.active=${profile}" | grep -v grep > /dev/null + if [[ "$?" == "0" ]]; then + echo "该应用还在跑,我先停了它" + pid=$(ps aux | grep "${jarfile}" | grep "spring.profiles.active=${profile}" | grep -v grep |awk '{print $2}') + if [[ "$pid" != "" ]]; then + kill -9 $pid + fi + echo "停止应用成功..." + fi +} + +if [[ "$1" == "start" ]]; then + if [[ "$#" < 2 ]]; then + echo "请输入正确参数:./epay.sh start {profile}" + exit 1 + fi + profile="$2" + if [[ "$profile" != "dev" && "$profile" != "test" && "$profile" != "show" && "$profile" != "production" ]]; then + echo "参数错误,请输入正确的profile参数,使用方法:" + echo "./epay.sh start {profile} ==> 启动应用,{profile}取值:dev|test|show|production" + exit 1 + fi + start "${profile}" +elif [[ "$1" == "stop" ]]; then + if [[ "$#" < 2 ]]; then + echo "请输入正确参数:./epay.sh stop {profile}" + exit 1 + fi + profile="$2" + if [[ "$profile" != "dev" && "$profile" != "test" && "$profile" != "show" && "$profile" != "production" ]]; then + echo "参数错误,请输入正确的profile参数,使用方法:" + echo "./epay.sh stop {profile} ==> 停止应用,{profile}取值:dev|test|show|production" + exit 1 + fi + jarfile=$(ls target/*.jar) + stop $profile $jarfile +else + echo "参数错误,使用方法:{}参数是必填的,[]参数可选" + echo "./epay.sh start {profile} ==> 启动应用,{profile}取值:dev|test|show|production" + echo "./epay.sh stop {profile} ==> 停止应用,{profile}取值:dev|test|show|production" + exit 1 +fi diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/Application.java b/app-manage-api/src/main/java/com/enzhico/jwt/Application.java new file mode 100644 index 0000000..b515027 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/Application.java @@ -0,0 +1,12 @@ +package com.enzhico.jwt; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/api/ExceptionController.java b/app-manage-api/src/main/java/com/enzhico/jwt/api/ExceptionController.java new file mode 100644 index 0000000..41492d8 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/api/ExceptionController.java @@ -0,0 +1,49 @@ +package com.enzhico.jwt.api; + +import com.enzhico.jwt.api.model.BaseResponse; +import io.swagger.annotations.Api; +import org.apache.shiro.ShiroException; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authz.UnauthorizedException; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; + +/** + * 注意这个统一异常处理器只对认证过的用户调用接口中的异常有作用,对AuthenticationException没有用 + */ +@RestControllerAdvice +@Api(value = "机具管理API接口类", tags = "机具管理接口", description = "提供POS机的入网和监控的统一管理") +public class ExceptionController { + + // 捕捉shiro的异常 + @ResponseStatus(HttpStatus.UNAUTHORIZED) + @ExceptionHandler(ShiroException.class) + public BaseResponse handle401(ShiroException e) { + return new BaseResponse(false, "shiro的异常", null); + } + + // 捕捉UnauthorizedException + @ResponseStatus(HttpStatus.UNAUTHORIZED) + @ExceptionHandler(UnauthorizedException.class) + public BaseResponse handle401() { + return new BaseResponse(false, "UnauthorizedException", null); + } + + // 捕捉其他所有异常 + @ExceptionHandler(Exception.class) + @ResponseStatus(HttpStatus.BAD_REQUEST) + public BaseResponse globalException(HttpServletRequest request, Throwable ex) { + return new BaseResponse(false, "其他异常", null); + } + + private HttpStatus getStatus(HttpServletRequest request) { + Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code"); + if (statusCode == null) { + return HttpStatus.INTERNAL_SERVER_ERROR; + } + return HttpStatus.valueOf(statusCode); + } +} + diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/api/LoginController.java b/app-manage-api/src/main/java/com/enzhico/jwt/api/LoginController.java new file mode 100644 index 0000000..4be0b6e --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/api/LoginController.java @@ -0,0 +1,87 @@ +package com.enzhico.jwt.api; + +import com.enzhico.jwt.api.model.BaseResponse; +import com.enzhico.jwt.api.model.LoginParam; +import com.enzhico.jwt.common.util.JWTUtil; +import com.enzhico.jwt.dao.entity.ManagerInfo; +import com.enzhico.jwt.service.ManagerInfoService; +import com.enzhico.jwt.shiro.ShiroKit; +import io.swagger.annotations.*; +import org.apache.commons.lang3.StringUtils; +import org.apache.shiro.authz.UnauthorizedException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.*; +import springfox.documentation.annotations.ApiIgnore; + +import javax.annotation.Resource; + +/** + * 登录接口类 + */ +@Api(value = "登录请求接口类", tags = "登录", description = "用户请求登录获取Token") +@ApiResponses(value = { + @ApiResponse(code = 200, message = "请求已完成"), + @ApiResponse(code = 201, message = "资源成功被创建"), + @ApiResponse(code = 400, message = "请求中有语法问题,或不能满足请求"), + @ApiResponse(code = 401, message = "未授权客户机访问数据"), + @ApiResponse(code = 403, message = "服务器接受请求,但是拒绝处理"), + @ApiResponse(code = 404, message = "服务器找不到给定的资源;文档不存在"), + @ApiResponse(code = 500, message = "服务器出现异常")} +) +@RestController +public class LoginController { + + @Resource + private ManagerInfoService managerInfoService; + + private static final Logger _logger = LoggerFactory.getLogger(LoginController.class); + + @ApiOperation(value = "登录认证接口", notes = "不管是接口还是WebSocket连接都需要先调用此接口拿到Token,然后再通过Token调用相应接口,最好使用HTTPS协议。调用RESTful API方式不需要传后面两个参数,如果通过WebSocket连接需要传递", produces = "application/json") + @PostMapping("/login") + public BaseResponse login(@RequestHeader(name="Content-Type", defaultValue = "application/json") String contentType, + @ApiParam(value = "登录参数") @RequestBody LoginParam loginParam) { + _logger.info("用户请求登录获取Token"); + String username = loginParam.getUsername(); + String password = loginParam.getPassword(); + String appid = loginParam.getAppid(); + String imei = loginParam.getImei(); + ManagerInfo user = managerInfoService.findByUsername(username); + //盐(用户名+随机数) + String salt = user.getSalt(); + //原密码 + String encodedPassword = ShiroKit.md5(password, username + salt); + if (user.getPassword().equals(encodedPassword)) { + if (StringUtils.isNotEmpty(appid) && StringUtils.isNotEmpty(imei)) { + return new BaseResponse<>(true, "Login success", JWTUtil.signSocket(username, encodedPassword, appid, imei)); + } + return new BaseResponse<>(true, "Login success", JWTUtil.sign(username, encodedPassword)); + } else { + throw new UnauthorizedException(); + } + } + + @ApiOperation(value = "推送消息登录认证接口", notes = "这里的密码是加密后的密码", produces = "application/json") + @PostMapping("/notifyLogin") + public BaseResponse notifyLogin(@RequestHeader(name="Content-Type", defaultValue = "application/json") String contentType, + @ApiParam(value = "登录参数") @RequestBody LoginParam loginParam) { + _logger.info("登录用户推送请求登录获取Token"); + String username = loginParam.getUsername(); + String password = loginParam.getPassword(); + ManagerInfo user = managerInfoService.findByUsername(username); + if (user.getPassword().equals(password)) { + return new BaseResponse<>(true, "Login success", JWTUtil.sign(username, password)); + } else { + throw new UnauthorizedException(); + } + } + + @GetMapping(path = "/401") + @ResponseStatus(HttpStatus.UNAUTHORIZED) + @ApiIgnore + public BaseResponse unauthorized() { + return new BaseResponse<>(false, "Unauthorized", null); + } + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/api/NotifyController.java b/app-manage-api/src/main/java/com/enzhico/jwt/api/NotifyController.java new file mode 100644 index 0000000..4aee320 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/api/NotifyController.java @@ -0,0 +1,52 @@ +package com.enzhico.jwt.api; + +import com.enzhico.jwt.api.model.BaseResponse; +import com.enzhico.jwt.api.model.UnbindParam; +import com.enzhico.jwt.service.ApiService; +import io.swagger.annotations.*; +import org.apache.shiro.authz.annotation.RequiresUser; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +/** + * 通知接口类 + */ +@Api(value = "通知接口类", tags = "通知", description = "服务器给相应客户端推送通知") +@ApiResponses(value = { + @ApiResponse(code = 200, message = "请求已完成"), + @ApiResponse(code = 201, message = "资源成功被创建"), + @ApiResponse(code = 400, message = "请求中有语法问题,或不能满足请求"), + @ApiResponse(code = 401, message = "未授权客户机访问数据"), + @ApiResponse(code = 403, message = "服务器接受请求,但是拒绝处理"), + @ApiResponse(code = 404, message = "服务器找不到给定的资源;文档不存在"), + @ApiResponse(code = 500, message = "服务器出现异常")} +) +@RestController +@RequestMapping(value = "/notify") +public class NotifyController { + + @Resource + private ApiService apiService; + + private static final Logger _logger = LoggerFactory.getLogger(NotifyController.class); + + @ApiOperation(value = "解绑通知接口", notes = "后台管理员解除网点绑定后需调用此接口通知相应的POS机", produces = "application/json") + @PostMapping("/unbind") + @RequiresUser + public BaseResponse unbind(@RequestHeader(name="Content-Type", defaultValue = "application/json") String contentType, + @RequestHeader(name="Authorization", defaultValue="token") String token, + @RequestBody UnbindParam unbindParam) { + _logger.info("解绑通知接口start"); + String imei = unbindParam.getImei(); + String location = unbindParam.getLocation(); + String errMsg = apiService.sendUnbind(imei, location); + if (errMsg != null) { + return new BaseResponse<>(false, errMsg, null); + } + return new BaseResponse<>(true, "解绑通知发送成功", null); + } + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/api/PublicController.java b/app-manage-api/src/main/java/com/enzhico/jwt/api/PublicController.java new file mode 100644 index 0000000..e447f68 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/api/PublicController.java @@ -0,0 +1,285 @@ +package com.enzhico.jwt.api; + +import com.enzhico.jwt.api.model.*; +import com.enzhico.jwt.common.dao.entity.Pos; +import com.enzhico.jwt.common.dao.entity.Project; +import com.enzhico.jwt.service.ApiService; +import com.enzhico.jwt.service.ManagerInfoService; +import io.swagger.annotations.*; +import org.apache.commons.lang3.StringUtils; +import org.apache.shiro.authz.annotation.RequiresUser; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.Date; + +/** + * 机具管理API接口类 + */ +@Api(value = "机具管理业务接口类", tags = "机具管理", description = "机具管理业务接口类") +@ApiResponses(value = { + @ApiResponse(code = 200, message = "请求已完成"), + @ApiResponse(code = 201, message = "资源成功被创建"), + @ApiResponse(code = 400, message = "请求中有语法问题,或不能满足请求"), + @ApiResponse(code = 401, message = "未授权客户机访问数据"), + @ApiResponse(code = 403, message = "服务器接受请求,但是拒绝处理"), + @ApiResponse(code = 404, message = "服务器找不到给定的资源;文档不存在"), + @ApiResponse(code = 500, message = "服务器出现异常")} +) +@RestController +@RequestMapping(value = "/api/v1") +public class PublicController { + + @Resource + private ApiService apiService; + + @Resource + private ManagerInfoService managerInfoService; + + private static final Logger _logger = LoggerFactory.getLogger(PublicController.class); + + /** + * 入网绑定查询接口 + * + * @return 是否入网 + */ + @ApiOperation(value = "入网绑定查询接口", notes = "根据IMEI码来查询该POS机是否入网并绑定了网点
每次打开APP的时候需要调用这个接口来进行检查
如果入网并且绑定了网点才能打开APP,否则必须调用入网或绑定网点接口成功后才能继续下一步", produces = "application/json") + @ApiImplicitParam(name = "imei", value = "IMEI码", required = true, dataType = "String", paramType = "query", defaultValue = "1234555SHA") + @RequestMapping(value = "/join", method = RequestMethod.GET) + @RequiresUser + public JoinBindResponse join(@RequestHeader(name="Accept", defaultValue = "application/json", required = false) String accept, + @RequestHeader(name="Authorization", defaultValue="token") String token, + @RequestParam("imei") String imei) { + _logger.info("入网查询接口 start...."); + JoinBindResponse result = new JoinBindResponse(); + int posCount = apiService.selectCount(imei); + if (posCount > 0) { + // 如果入网了再去查询是否绑定了网点 + int bindCount = apiService.selectBindCount(imei); + Pos pos = apiService.selectByImei(imei); + result.setPosState(pos.getPosState()); + if (bindCount == 0) { + result.setSuccess(false); + result.setCode(2); + result.setMsg("已入网但尚未绑定网点"); + } else { + result.setSuccess(true); + result.setCode(1); + result.setMsg("已入网并绑定了网点"); + } + } else { + result.setSuccess(false); + result.setCode(3); + result.setMsg("未入网"); + } + return result; + } + + /** + * 请求入网接口 + * + * @return 处理结果 + */ + @ApiOperation(value = "请求入网接口", notes = "通过收集POS硬件信息请求入网,另外还必须传入网点名称", produces = "application/json") + @RequestMapping(value = "/join", method = RequestMethod.POST) + @RequiresUser + public ResponseEntity doJoin(@RequestHeader(name="Content-Type", defaultValue = "application/json") String contentType, + @RequestHeader(name="Authorization", defaultValue="token") String token, + @RequestBody PosParam posParam) { + _logger.info("请求入网接口 start...."); + BaseResponse result = new BaseResponse(); + // imei码约束检查 + if (StringUtils.isEmpty(posParam.getImei()) || posParam.getImei().length() > 32) { + result.setSuccess(false); + result.setMsg("IMEI码长度不是1-32位,入网失败。"); + return new ResponseEntity<>(result, HttpStatus.OK); + } + // 序列号SN约束检查 + if (StringUtils.isEmpty(posParam.getSn()) || posParam.getSn().length() > 64) { + result.setSuccess(false); + result.setMsg("序列号长度不是1-64位,入网失败。"); + return new ResponseEntity<>(result, HttpStatus.OK); + } + // 机具型号约束检查 + if (StringUtils.isEmpty(posParam.getSeries()) || posParam.getSeries().length() > 32) { + result.setSuccess(false); + result.setMsg("机具型号不是1-32位,入网失败。"); + return new ResponseEntity<>(result, HttpStatus.OK); + } + // Android版本约束检查 + if (StringUtils.isEmpty(posParam.getAndroidVersion()) || posParam.getAndroidVersion().length() > 32) { + result.setSuccess(false); + result.setMsg("Android版本号不是1-32位,入网失败。"); + return new ResponseEntity<>(result, HttpStatus.OK); + } + // 版本号约束检查 + if (StringUtils.isEmpty(posParam.getVersion()) || posParam.getVersion().length() > 32) { + result.setSuccess(false); + result.setMsg("版本号不是1-32位,入网失败。"); + return new ResponseEntity<>(result, HttpStatus.OK); + } + // 归属网点约束检查 + if (StringUtils.isEmpty(posParam.getLocation()) || posParam.getLocation().length() > 64) { + result.setSuccess(false); + result.setMsg("归属网点不是1-64位,入网失败。"); + return new ResponseEntity<>(result, HttpStatus.OK); + } + // 产权方约束检查 + if (StringUtils.isEmpty(posParam.getOwner()) || posParam.getOwner().length() > 64) { + result.setSuccess(false); + result.setMsg("产权方不是1-64位,入网失败。"); + return new ResponseEntity<>(result, HttpStatus.OK); + } + // 应用ID约束检查 + if (StringUtils.isEmpty(posParam.getApplicationId()) || posParam.getApplicationId().length() > 64) { + result.setSuccess(false); + result.setMsg("应用ID不是1-64位,入网失败。"); + return new ResponseEntity<>(result, HttpStatus.OK); + } + // 备注约束检查 + if (StringUtils.isNotEmpty(posParam.getTips()) && posParam.getTips().length() > 255) { + result.setSuccess(false); + result.setMsg("备注超过255个字符,入网失败。"); + return new ResponseEntity<>(result, HttpStatus.OK); + } + Pos pos = new Pos(); + Date now = new Date(); + pos.setJointime(now); + pos.setBindtime(now); + BeanUtils.copyProperties(posParam, pos); + // 根据applicationId设置归属项目ID + Project project = apiService.selectProjectByApplicationId(posParam.getApplicationId()); + if (project == null) { + result.setSuccess(false); + result.setMsg("Application Id不正确,入网失败。"); + return new ResponseEntity<>(result, HttpStatus.OK); + } + // 重复检查 + int posCount = apiService.selectCount(posParam.getImei()); + if (posCount > 0) { + result.setSuccess(false); + result.setMsg("入网失败,该机具之前已经入网了。"); + return new ResponseEntity<>(result, HttpStatus.OK); + } + // 插入一条新纪录 + pos.setProjectId(project.getId()); + int insert = apiService.insertPos(pos); + if (insert > 0) { + result.setSuccess(true); + result.setMsg("入网成功"); + return new ResponseEntity<>(result, HttpStatus.CREATED); + } else { + result.setSuccess(false); + result.setMsg("入网失败,请联系管理员。"); + return new ResponseEntity<>(result, HttpStatus.OK); + } + } + + /** + * 请求绑定网点接口 + * + * @return 处理结果 + */ + @ApiOperation(value = "请求绑定网点接口", notes = "POS机重新绑定新的网点", produces = "application/json") + @RequestMapping(value = "/bind", method = RequestMethod.POST) +// @RequiresPermissions(logical = Logical.AND, value = {"view", "edit"}) + @RequiresUser + public ResponseEntity doBind(@RequestHeader(name="Content-Type", defaultValue = "application/json") String contentType, + @RequestHeader(name="Authorization", defaultValue="token") String token, + @RequestBody BindParam bindParam) { + _logger.info("请求绑定网点接口 start...."); + BaseResponse result = new BaseResponse(); + // imei码约束检查 + if (StringUtils.isEmpty(bindParam.getImei()) || bindParam.getImei().length() > 32) { + result.setSuccess(false); + result.setMsg("IMEI码长度不是1-32位,绑定网点失败。"); + return new ResponseEntity<>(result, HttpStatus.OK); + } + // 归属网点约束检查 + if (StringUtils.isEmpty(bindParam.getLocation()) || bindParam.getLocation().length() > 64) { + result.setSuccess(false); + result.setMsg("归属网点不是1-64位,绑定网点失败。"); + return new ResponseEntity<>(result, HttpStatus.OK); + } + + Pos pos = apiService.selectByImei(bindParam.getImei()); + if (pos == null) { + result.setSuccess(false); + result.setMsg("该POS机尚未入网。"); + return new ResponseEntity<>(result, HttpStatus.OK); + } + + Pos pos2 = apiService.selectBindByImei(bindParam.getImei()); + if (pos2 != null) { + result.setSuccess(false); + result.setMsg("该POS机已经绑定了网点,请先解绑。"); + return new ResponseEntity<>(result, HttpStatus.OK); + } + + pos.setLocation(bindParam.getLocation()); + pos.setUpdatedTime(new Date()); + apiService.bindLocation(pos); + + result.setSuccess(true); + result.setMsg("绑定网点成功"); + return new ResponseEntity<>(result, HttpStatus.OK); + } + + /** + * 报告位置接口 + * + * @return 报告结果 + */ + @ApiOperation(value = "报告位置接口", notes = "终端设备定时报告位置信息", produces = "application/json") + @RequestMapping(value = "/report", method = RequestMethod.POST) + @RequiresUser + public BaseResponse report(@RequestHeader(name="Content-Type", defaultValue = "application/json") String contentType, + @RequestHeader(name="Authorization", defaultValue="token") String token, + @RequestBody ReportParam param) { + _logger.info("定时报告接口 start...."); + BaseResponse result = new BaseResponse(); + // IMEI码约束检查 + if (StringUtils.isEmpty(param.getImei()) || param.getImei().length() > 32) { + result.setSuccess(false); + result.setMsg("IMEI码不是1-32位,心跳报告失败。"); + return result; + } + // 地址约束检查 + if (StringUtils.isEmpty(param.getLocation()) || param.getLocation().length() > 255) { + result.setSuccess(false); + result.setMsg("地址不是1-255位,心跳报告失败。"); + return result; + } + + int r = apiService.report(param); + if (r > 0) { + result.setSuccess(true); + result.setMsg("心跳报告成功"); + } else { + result.setSuccess(false); + result.setMsg("该POS机还没有入网,心跳报告失败。"); + } + return result; + } + + /** + * 版本检查接口 + * + * @return 版本检查结果 + */ + @ApiOperation(value = "APP版本更新检查", notes = "APP版本更新检查", produces = "application/json") + @RequestMapping(value = "/version", method = RequestMethod.POST) + @RequiresUser + public VersionResult version(@RequestHeader(name="Content-Type", defaultValue = "application/json") String contentType, + @RequestHeader(name="Authorization", defaultValue="token") String token, + @RequestBody VersionParam param) { + _logger.info("版本检查接口 start...."); + return apiService.selectPublishCount(param); + } + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/api/model/BaseResponse.java b/app-manage-api/src/main/java/com/enzhico/jwt/api/model/BaseResponse.java new file mode 100644 index 0000000..cd33c20 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/api/model/BaseResponse.java @@ -0,0 +1,68 @@ +package com.enzhico.jwt.api.model; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import springfox.documentation.annotations.ApiIgnore; + +/** + * API接口的基础返回类 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/7 + */ +@ApiModel(value = "BaseResponse", description = "API接口的返回对象") +public class BaseResponse { + /** + * 是否成功 + */ + @ApiModelProperty(value = "是否成功", name = "success", example = "true", required = true) + private boolean success; + + /** + * 说明 + */ + @ApiModelProperty(value = "返回的详细说明", name = "msg", example = "成功") + private String msg; + + /** + * 返回数据 + */ + @ApiModelProperty(value = "返回的数据", name = "data") + private T data; + + public BaseResponse() { + + } + + public BaseResponse(boolean success, String msg, T data) { + this.success = success; + this.msg = msg; + this.data = data; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/api/model/BindParam.java b/app-manage-api/src/main/java/com/enzhico/jwt/api/model/BindParam.java new file mode 100644 index 0000000..2c2d772 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/api/model/BindParam.java @@ -0,0 +1,41 @@ +package com.enzhico.jwt.api.model; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * POS绑定网点参数 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/7 + */ +@ApiModel(value = "POS绑定网点参数", description = "POSPOS绑定网点请求时候需要传入的参数") +public class BindParam { + /** + * 机具IMEI码 + */ + @ApiModelProperty(value = "IMEI码(长度1-32位)", name = "imei", dataType = "String", example = "2324DEEFAXX122", required = true) + private String imei; + /** + * 归属网点 + */ + @ApiModelProperty(value = "归属网点(长度1-64位)", name = "location", dataType = "String", example = "昆明市公安局交通警察支队车辆管理所", required = true) + private String location; + + public String getImei() { + return imei; + } + + public void setImei(String imei) { + this.imei = imei; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/api/model/JoinBindResponse.java b/app-manage-api/src/main/java/com/enzhico/jwt/api/model/JoinBindResponse.java new file mode 100644 index 0000000..ff82259 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/api/model/JoinBindResponse.java @@ -0,0 +1,42 @@ +package com.enzhico.jwt.api.model; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 入网绑定返回 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/16 + */ +@ApiModel(value = "入网绑定返回信息", description = "入网绑定的返回对象") +public class JoinBindResponse extends BaseResponse { + /** + * 返回码 1:已入网并绑定了网点 2:已入网但尚未绑定网点 3:未入网 + */ + @ApiModelProperty(value = "返回码 1:已入网并绑定了网点 2:已入网但尚未绑定网点 3:未入网", name = "code", example = "1", required = true) + private int code; + + /** + * 机具状态: 1:正常 2:故障 3:维修中(返厂) 4:已禁用(丢失) 5:已停用(回收) + */ + @ApiModelProperty(value = "机具状态 1:正常 2:故障 3:维修中(返厂) 4:已禁用(丢失) 5:已停用(回收)", name = "posState", example = "1", required = true) + private Integer posState; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public Integer getPosState() { + return posState; + } + + public void setPosState(Integer posState) { + this.posState = posState; + } +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/api/model/LoginParam.java b/app-manage-api/src/main/java/com/enzhico/jwt/api/model/LoginParam.java new file mode 100644 index 0000000..5bfe8f1 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/api/model/LoginParam.java @@ -0,0 +1,67 @@ +package com.enzhico.jwt.api.model; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 登录认证接口参数 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/9 + */ +@ApiModel(value = "登录认证接口参数", description = "登录认证接口参数") +public class LoginParam { + /** + * 用户名 + */ + @ApiModelProperty(value = "用户名", name = "username", example = "admin", required = true) + private String username; + /** + * 密码 + */ + @ApiModelProperty(value = "密码", name = "password", example = "123456", required = true) + private String password; + /** + * Application ID + */ + @ApiModelProperty(value = "Application ID", name = "appid", example = "com.enzhico.xzpay", required = false) + private String appid; + /** + * IMEI码 + */ + @ApiModelProperty(value = "IMEI码", name = "imei", example = "TUYIUOIU234234YUII", required = false) + private String imei; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getAppid() { + return appid; + } + + public void setAppid(String appid) { + this.appid = appid; + } + + public String getImei() { + return imei; + } + + public void setImei(String imei) { + this.imei = imei; + } +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/api/model/PosParam.java b/app-manage-api/src/main/java/com/enzhico/jwt/api/model/PosParam.java new file mode 100644 index 0000000..2b7d2f3 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/api/model/PosParam.java @@ -0,0 +1,133 @@ +package com.enzhico.jwt.api.model; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * POS入网参数 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/7 + */ +@ApiModel(value = "POS入网参数", description = "POS入网请求时候需要传入的参数") +public class PosParam { + /** + * 机具IMEI码 + */ + @ApiModelProperty(value = "IMEI码(长度1-32位)", name = "imei", dataType = "String", example = "2324DEEFAXX122", required = true) + private String imei; + /** + * 序列号(SN) + */ + @ApiModelProperty(value = "序列号SN(长度1-64位)", name = "sn", dataType = "String", example = "ssssssnnnn", required = true) + private String sn; + /** + * 机具型号 + */ + @ApiModelProperty(value = "机具型号(长度1-32位)", name = "series", dataType = "String", example = "APOS A8", required = true) + private String series; + /** + * Android版本 + */ + @ApiModelProperty(value = "Android版本(长度1-32位)", name = "androidVersion", dataType = "String", example = "6.2.0", required = true) + private String androidVersion; + /** + * 版本号 + */ + @ApiModelProperty(value = "版本号(长度1-32位)", name = "version", dataType = "String", example = "B0182_C2BOM_V1.1.4_20171213/4.0.28", required = true) + private String version; + /** + * 归属网点 + */ + @ApiModelProperty(value = "归属网点(长度1-64位)", name = "location", dataType = "String", example = "昆明市公安局交通警察支队车辆管理所", required = true) + private String location; + /** + * 产权方 + */ + @ApiModelProperty(value = "机具产权方(长度1-64位)", name = "owner", dataType = "String", example = "招商银行昆明分行", required = true) + private String owner; + /** + * 备注 + */ + @ApiModelProperty(value = "备注说明(长度0-255位)", name = "tips", dataType = "String", example = "备注说明") + private String tips; + /** + * 应用ID + */ + @ApiModelProperty(value = "APP应用ID(长度1-64位),每个APP都有唯一的Application Id,并且这个应用ID必须已经存在于系统之中", + name = "applicationId", dataType = "String", example = "com.enzhico.xzpay", required = true) + private String applicationId; + + public String getImei() { + return imei; + } + + public void setImei(String imei) { + this.imei = imei; + } + + public String getSn() { + return sn; + } + + public void setSn(String sn) { + this.sn = sn; + } + + public String getSeries() { + return series; + } + + public void setSeries(String series) { + this.series = series; + } + + public String getAndroidVersion() { + return androidVersion; + } + + public void setAndroidVersion(String androidVersion) { + this.androidVersion = androidVersion; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + + public String getOwner() { + return owner; + } + + public void setOwner(String owner) { + this.owner = owner; + } + + public String getTips() { + return tips; + } + + public void setTips(String tips) { + this.tips = tips; + } + + public String getApplicationId() { + return applicationId; + } + + public void setApplicationId(String applicationId) { + this.applicationId = applicationId; + } +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/api/model/ReportParam.java b/app-manage-api/src/main/java/com/enzhico/jwt/api/model/ReportParam.java new file mode 100644 index 0000000..314ff07 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/api/model/ReportParam.java @@ -0,0 +1,41 @@ +package com.enzhico.jwt.api.model; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 报告参数 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/7 + */ +@ApiModel(value = "报告参数", description = "报告参数") +public class ReportParam { + /** + * IMEI码 + */ + @ApiModelProperty(value = "IMEI码(长度1-32位)", name = "imei", example = "2324DEEFAXX122", required = true) + private String imei; + /** + * 位置 + */ + @ApiModelProperty(value = "位置(长度1-255位)", name = "location", example = "广东省广州市天河区五山路321号", required = true) + private String location; + + public String getImei() { + return imei; + } + + public void setImei(String imei) { + this.imei = imei; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/api/model/UnbindParam.java b/app-manage-api/src/main/java/com/enzhico/jwt/api/model/UnbindParam.java new file mode 100644 index 0000000..b86eb02 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/api/model/UnbindParam.java @@ -0,0 +1,41 @@ +package com.enzhico.jwt.api.model; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * 解绑通知参数 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/9 + */ +@ApiModel(value = "解绑通知参数", description = "解绑通知参数") +public class UnbindParam { + /** + * IMEI码 + */ + @ApiModelProperty(value = "IMEI码", name = "imei", example = "TUYIUOIU234234YUII") + private String imei; + /** + * 网点 + */ + @ApiModelProperty(value = "网点", name = "location", example = "广州市天河区交警7区") + private String location; + + public String getImei() { + return imei; + } + + public void setImei(String imei) { + this.imei = imei; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/api/model/VersionParam.java b/app-manage-api/src/main/java/com/enzhico/jwt/api/model/VersionParam.java new file mode 100644 index 0000000..ee13ba8 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/api/model/VersionParam.java @@ -0,0 +1,54 @@ +package com.enzhico.jwt.api.model; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +/** + * APP版本检查接口参数 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/9 + */ +@ApiModel(value = "APP版本检查参数", description = "APP版本检查参数") +public class VersionParam { + /** + * 机具IMEI码 + */ + @ApiModelProperty(value = "IMEI码", name = "imei", example = "2324DEEFAXX122", required = true) + private String imei; + /** + * 应用ID + */ + @ApiModelProperty(value = "APP应用ID,每个APP都有唯一的Application Id", name = "applicationId", example = "com.enzhico.xzpay", required = true) + private String applicationId; + /** + * 当前版本号 + */ + @ApiModelProperty(value = "APP的当前版本号", name = "version", example = "1.2.0", required = true) + private String version; + + public String getApplicationId() { + return applicationId; + } + + public void setApplicationId(String applicationId) { + this.applicationId = applicationId; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getImei() { + return imei; + } + + public void setImei(String imei) { + this.imei = imei; + } +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/api/model/VersionResult.java b/app-manage-api/src/main/java/com/enzhico/jwt/api/model/VersionResult.java new file mode 100644 index 0000000..d6ea017 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/api/model/VersionResult.java @@ -0,0 +1,96 @@ +package com.enzhico.jwt.api.model; + +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; + +import java.util.Date; + +/** + * 版本检查结果 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/9 + */ +@ApiModel(value = "APP版本检查结果", description = "APP版本检查结果") +public class VersionResult { + /** + * 是否发现新版本 + */ + @ApiModelProperty(value = "是否发现新版本(true:发现新版本,false:没有发现新版本)", name = "findNew", example = "true", required = true) + private boolean findNew; + /** + * APP名称 + */ + @ApiModelProperty(value = "APP名称", name = "appName", example = "行政收费") + private String appName; + /** + * 新版本号 + */ + @ApiModelProperty(value = "新版本号", name = "version", example = "v1.3.8") + private String version; + /** + * 新版本说明 + */ + @ApiModelProperty(value = "新版本说明", name = "tips", example = "增加人脸识别功能") + private String tips; + /** + * 新版本发布时间 + */ + @ApiModelProperty(value = "新版本发布时间", name = "publishtime", example = "2017-12-24 12:32:19") + private Date publishtime; + + /** + * 新版本下载地址 + */ + @ApiModelProperty(value = "新版本下载地址", name = "downloadUrl", example = "http://enzhico.net/files/行政收费_1.3.0.apk") + private String downloadUrl; + + public boolean isFindNew() { + return findNew; + } + + public void setFindNew(boolean findNew) { + this.findNew = findNew; + } + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public String getAppName() { + return appName; + } + + public void setAppName(String appName) { + this.appName = appName; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getTips() { + return tips; + } + + public void setTips(String tips) { + this.tips = tips; + } + + public Date getPublishtime() { + return publishtime; + } + + public void setPublishtime(Date publishtime) { + this.publishtime = publishtime; + } +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/common/ServerRunner.java b/app-manage-api/src/main/java/com/enzhico/jwt/common/ServerRunner.java new file mode 100644 index 0000000..907856e --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/common/ServerRunner.java @@ -0,0 +1,34 @@ +package com.enzhico.jwt.common; + +import com.corundumstudio.socketio.SocketIOServer; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +/** + * SpringBoot启动之后执行 + * + * @author XiongNeng + * @version 1.0 + * @since 2017/7/31 + */ +@Component +@Order(1) +public class ServerRunner implements CommandLineRunner { + private final SocketIOServer server; + private static final Logger logger = LoggerFactory.getLogger(ServerRunner.class); + + @Autowired + public ServerRunner(SocketIOServer server) { + this.server = server; + } + + @Override + public void run(String... args) { + logger.info("ServerRunner 开始启动啦..."); + server.start(); + } +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/common/constant/ConstantsList.java b/app-manage-api/src/main/java/com/enzhico/jwt/common/constant/ConstantsList.java new file mode 100644 index 0000000..5316c70 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/common/constant/ConstantsList.java @@ -0,0 +1,37 @@ +package com.enzhico.jwt.common.constant; + +import java.util.ArrayList; +import java.util.List; + +/** + * 常量列表 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/01/07 + */ +public class ConstantsList { + // 应收款项列表 + public static final List INCOME_TYPE_LIST = new ArrayList() {{ + add("租金"); + add("市场管理费"); + add("物业管理费"); + add("其他"); + }}; + + // 市场列表 + public static final List MARKET_LIST = new ArrayList() {{ + add("一期市场"); + add("二期市场"); + add("三期市场"); + }}; + + // 业态 + public static final List BUSINESS_LIST = new ArrayList() {{ + add("男装"); + add("女装"); + add("玩具"); + add("餐饮"); + add("家具"); + }}; +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/common/constant/DictMap.java b/app-manage-api/src/main/java/com/enzhico/jwt/common/constant/DictMap.java new file mode 100644 index 0000000..5ade1dc --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/common/constant/DictMap.java @@ -0,0 +1,80 @@ +package com.enzhico.jwt.common.constant; + +import java.util.HashMap; +import java.util.Map; +import java.util.TreeMap; + +/** + * 表常量字典 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/01/07 + */ +public class DictMap { + /** + * 后台管理用户表 - 状态(1:正常 2:禁用) + */ + public static final String KEY_USER_STATUS = "t_manager.status"; + /** + * POS机表 - 机具状态(1:正常 2:故障 3:维修中(返厂) 4:已禁用(丢失) 5:已停用(回收)) + */ + public static final String KEY_POS_POS_STATUS = "t_pos.pos_state"; + /** + * POS机监控表 - 在线状态(1:在线 2:离线) + */ + public static final String KEY_POS_MONITOR_STATUS = "t_pos_monitor.online_state"; + /** + * APP表 - 发布范围(1:全网发布 2:灰度发布) + */ + public static final String KEY_APP_PUBLISH_RANGE = "t_app.publish_range"; + + /** + * 内部用,ClassName + FieldName为key + */ + private static final Map> _imap = new HashMap<>(); + + static { + _imap.put(KEY_USER_STATUS, new TreeMap() {{ + put(1, "正常"); + put(2, "禁用"); + }}); + _imap.put(KEY_POS_POS_STATUS, new TreeMap() {{ + put(1, "正常"); + put(2, "故障"); + put(3, "维修中(返厂)"); + put(4, "已禁用(丢失)"); + put(5, "已停用(回收)"); + }}); + _imap.put(KEY_POS_MONITOR_STATUS, new TreeMap() {{ + put(1, "在线"); + put(2, "离线"); + }}); + _imap.put(KEY_APP_PUBLISH_RANGE, new TreeMap() {{ + put(1, "全网发布"); + put(2, "灰度发布"); + }}); + } + + /** + * 根据字典类型key获取某个字典Map + * + * @param type 常量类型 + * @return 字典Map + */ + public static TreeMap map(String type) { + return _imap.get(type); + } + + /** + * 根据字典类型和数字获取对应的字符串 + * + * @param type 字典类型 + * @param key 数字 + * @return 对应的字符串 + */ + public static String value(String type, Integer key) { + return key != null ? map(type).get(key) : null; + } + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/App.java b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/App.java new file mode 100644 index 0000000..ef6ce45 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/App.java @@ -0,0 +1,273 @@ +package com.enzhico.jwt.common.dao.entity; + +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.activerecord.Model; + +import java.io.Serializable; + +/** + * APP表 + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +@TableName(value = "t_app") +public class App extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + /** + * 应用编号 + */ + private String applicationId; + /** + * 应用名称 + */ + private String name; + /** + * 版本号 + */ + private String version; + /** + * 版本说明 + */ + private String tips; + /** + * 归属项目ID + */ + private Integer projectId; + /** + * 发布时间 + */ + private Date publishtime; + /** + * 发布范围 1:全网发布 2:灰度发布 + */ + private Integer publishRange; + /** + * 操作者ID + */ + private Integer operatorId; + /** + * 创建时间 + */ + private Date createdTime; + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 获取 主键ID. + * + * @return 主键ID. + */ + public Integer getId() { + return id; + } + + /** + * 设置 主键ID. + * + * @param id 主键ID. + */ + public void setId(Integer id) { + this.id = id; + } + + /** + * 获取 应用编号. + * + * @return 应用编号. + */ + public String getApplicationId() { + return applicationId; + } + + /** + * 设置 应用编号. + * + * @param applicationId 应用编号. + */ + public void setApplicationId(String applicationId) { + this.applicationId = applicationId; + } + + /** + * 获取 应用名称. + * + * @return 应用名称. + */ + public String getName() { + return name; + } + + /** + * 设置 应用名称. + * + * @param name 应用名称. + */ + public void setName(String name) { + this.name = name; + } + + /** + * 获取 版本号. + * + * @return 版本号. + */ + public String getVersion() { + return version; + } + + /** + * 设置 版本号. + * + * @param version 版本号. + */ + public void setVersion(String version) { + this.version = version; + } + + /** + * 获取 版本说明. + * + * @return 版本说明. + */ + public String getTips() { + return tips; + } + + /** + * 设置 版本说明. + * + * @param tips 版本说明. + */ + public void setTips(String tips) { + this.tips = tips; + } + + /** + * 获取 归属项目ID. + * + * @return 归属项目ID. + */ + public Integer getProjectId() { + return projectId; + } + + /** + * 设置 归属项目ID. + * + * @param projectId 归属项目ID. + */ + public void setProjectId(Integer projectId) { + this.projectId = projectId; + } + + /** + * 获取 发布时间. + * + * @return 发布时间. + */ + public Date getPublishtime() { + return publishtime; + } + + /** + * 设置 发布时间. + * + * @param publishtime 发布时间. + */ + public void setPublishtime(Date publishtime) { + this.publishtime = publishtime; + } + + /** + * 获取 发布范围 1:全网发布 2:灰度发布. + * + * @return 发布范围 1:全网发布 2:灰度发布. + */ + public Integer getPublishRange() { + return publishRange; + } + + /** + * 设置 发布范围 1:全网发布 2:灰度发布. + * + * @param publishRange 发布范围 1:全网发布 2:灰度发布. + */ + public void setPublishRange(Integer publishRange) { + this.publishRange = publishRange; + } + + /** + * 获取 操作者ID. + * + * @return 操作者ID. + */ + public Integer getOperatorId() { + return operatorId; + } + + /** + * 设置 操作者ID. + * + * @param operatorId 操作者ID. + */ + public void setOperatorId(Integer operatorId) { + this.operatorId = operatorId; + } + + /** + * 获取 创建时间. + * + * @return 创建时间. + */ + public Date getCreatedTime() { + return createdTime; + } + + /** + * 设置 创建时间. + * + * @param createdTime 创建时间. + */ + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + /** + * 获取 更新时间. + * + * @return 更新时间. + */ + public Date getUpdatedTime() { + return updatedTime; + } + + /** + * 设置 更新时间. + * + * @param updatedTime 更新时间. + */ + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/AppPublish.java b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/AppPublish.java new file mode 100644 index 0000000..832398a --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/AppPublish.java @@ -0,0 +1,141 @@ +package com.enzhico.jwt.common.dao.entity; + +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.activerecord.Model; + +import java.io.Serializable; + +/** + * APP发布表 + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +@TableName(value = "t_app_publish") +public class AppPublish extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + /** + * APP主键 + */ + private Integer appId; + /** + * POS主键 + */ + private Integer posId; + /** + * 创建时间 + */ + private Date createdTime; + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 获取 主键ID. + * + * @return 主键ID. + */ + public Integer getId() { + return id; + } + + /** + * 设置 主键ID. + * + * @param id 主键ID. + */ + public void setId(Integer id) { + this.id = id; + } + + /** + * 获取 APP主键. + * + * @return APP主键. + */ + public Integer getAppId() { + return appId; + } + + /** + * 设置 APP主键. + * + * @param appId APP主键. + */ + public void setAppId(Integer appId) { + this.appId = appId; + } + + /** + * 获取 POS主键. + * + * @return POS主键. + */ + public Integer getPosId() { + return posId; + } + + /** + * 设置 POS主键. + * + * @param posId POS主键. + */ + public void setPosId(Integer posId) { + this.posId = posId; + } + + /** + * 获取 创建时间. + * + * @return 创建时间. + */ + public Date getCreatedTime() { + return createdTime; + } + + /** + * 设置 创建时间. + * + * @param createdTime 创建时间. + */ + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + /** + * 获取 更新时间. + * + * @return 更新时间. + */ + public Date getUpdatedTime() { + return updatedTime; + } + + /** + * 设置 更新时间. + * + * @param updatedTime 更新时间. + */ + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/Manager.java b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/Manager.java new file mode 100644 index 0000000..2109a7a --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/Manager.java @@ -0,0 +1,251 @@ +package com.enzhico.jwt.common.dao.entity; + +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.activerecord.Model; + +import java.io.Serializable; + +/** + * 后台管理用户表 + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +@TableName(value = "t_manager") +public class Manager extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + /** + * 账号 + */ + private String username; + /** + * 名字 + */ + private String name; + /** + * 密码 + */ + private String password; + /** + * md5密码盐 + */ + private String salt; + /** + * 联系电话 + */ + private String phone; + /** + * 备注 + */ + private String tips; + /** + * 状态 1:正常 2:禁用 + */ + private Integer state; + /** + * 创建时间 + */ + private Date createdTime; + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 获取 主键ID. + * + * @return 主键ID. + */ + public Integer getId() { + return id; + } + + /** + * 设置 主键ID. + * + * @param id 主键ID. + */ + public void setId(Integer id) { + this.id = id; + } + + /** + * 获取 账号. + * + * @return 账号. + */ + public String getUsername() { + return username; + } + + /** + * 设置 账号. + * + * @param username 账号. + */ + public void setUsername(String username) { + this.username = username; + } + + /** + * 获取 名字. + * + * @return 名字. + */ + public String getName() { + return name; + } + + /** + * 设置 名字. + * + * @param name 名字. + */ + public void setName(String name) { + this.name = name; + } + + /** + * 获取 密码. + * + * @return 密码. + */ + public String getPassword() { + return password; + } + + /** + * 设置 密码. + * + * @param password 密码. + */ + public void setPassword(String password) { + this.password = password; + } + + /** + * 获取 md5密码盐. + * + * @return md5密码盐. + */ + public String getSalt() { + return salt; + } + + /** + * 设置 md5密码盐. + * + * @param salt md5密码盐. + */ + public void setSalt(String salt) { + this.salt = salt; + } + + /** + * 获取 联系电话. + * + * @return 联系电话. + */ + public String getPhone() { + return phone; + } + + /** + * 设置 联系电话. + * + * @param phone 联系电话. + */ + public void setPhone(String phone) { + this.phone = phone; + } + + /** + * 获取 备注. + * + * @return 备注. + */ + public String getTips() { + return tips; + } + + /** + * 设置 备注. + * + * @param tips 备注. + */ + public void setTips(String tips) { + this.tips = tips; + } + + /** + * 获取 状态 1:正常 2:禁用. + * + * @return 状态 1:正常 2:禁用. + */ + public Integer getState() { + return state; + } + + /** + * 设置 状态 1:正常 2:禁用. + * + * @param state 状态 1:正常 2:禁用. + */ + public void setState(Integer state) { + this.state = state; + } + + /** + * 获取 创建时间. + * + * @return 创建时间. + */ + public Date getCreatedTime() { + return createdTime; + } + + /** + * 设置 创建时间. + * + * @param createdTime 创建时间. + */ + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + /** + * 获取 更新时间. + * + * @return 更新时间. + */ + public Date getUpdatedTime() { + return updatedTime; + } + + /** + * 设置 更新时间. + * + * @param updatedTime 更新时间. + */ + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/ManagerRole.java b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/ManagerRole.java new file mode 100644 index 0000000..d6ad29c --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/ManagerRole.java @@ -0,0 +1,141 @@ +package com.enzhico.jwt.common.dao.entity; + +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.activerecord.Model; + +import java.io.Serializable; + +/** + * 用户角色关联表 + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +@TableName(value = "t_manager_role") +public class ManagerRole extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + /** + * 管理用户ID + */ + private Integer managerId; + /** + * 角色ID + */ + private Integer roleId; + /** + * 创建时间 + */ + private Date createdTime; + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 获取 主键ID. + * + * @return 主键ID. + */ + public Integer getId() { + return id; + } + + /** + * 设置 主键ID. + * + * @param id 主键ID. + */ + public void setId(Integer id) { + this.id = id; + } + + /** + * 获取 管理用户ID. + * + * @return 管理用户ID. + */ + public Integer getManagerId() { + return managerId; + } + + /** + * 设置 管理用户ID. + * + * @param managerId 管理用户ID. + */ + public void setManagerId(Integer managerId) { + this.managerId = managerId; + } + + /** + * 获取 角色ID. + * + * @return 角色ID. + */ + public Integer getRoleId() { + return roleId; + } + + /** + * 设置 角色ID. + * + * @param roleId 角色ID. + */ + public void setRoleId(Integer roleId) { + this.roleId = roleId; + } + + /** + * 获取 创建时间. + * + * @return 创建时间. + */ + public Date getCreatedTime() { + return createdTime; + } + + /** + * 设置 创建时间. + * + * @param createdTime 创建时间. + */ + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + /** + * 获取 更新时间. + * + * @return 更新时间. + */ + public Date getUpdatedTime() { + return updatedTime; + } + + /** + * 设置 更新时间. + * + * @param updatedTime 更新时间. + */ + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/OperationLog.java b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/OperationLog.java new file mode 100644 index 0000000..e8ca1ea --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/OperationLog.java @@ -0,0 +1,207 @@ +package com.enzhico.jwt.common.dao.entity; + +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.activerecord.Model; + +import java.io.Serializable; + +/** + * 操作日志表 + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +@TableName(value = "t_operation_log") +public class OperationLog extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + /** + * 操作者ID + */ + private Integer operatorId; + /** + * 操作对象ID + */ + private Integer targetId; + /** + * 操作对象名称 + */ + private String targetName; + /** + * 操作类型 + */ + private String operateType; + /** + * 备注 + */ + private String tips; + /** + * 创建时间 + */ + private Date createdTime; + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 获取 主键ID. + * + * @return 主键ID. + */ + public Integer getId() { + return id; + } + + /** + * 设置 主键ID. + * + * @param id 主键ID. + */ + public void setId(Integer id) { + this.id = id; + } + + /** + * 获取 操作者ID. + * + * @return 操作者ID. + */ + public Integer getOperatorId() { + return operatorId; + } + + /** + * 设置 操作者ID. + * + * @param operatorId 操作者ID. + */ + public void setOperatorId(Integer operatorId) { + this.operatorId = operatorId; + } + + /** + * 获取 操作对象ID. + * + * @return 操作对象ID. + */ + public Integer getTargetId() { + return targetId; + } + + /** + * 设置 操作对象ID. + * + * @param targetId 操作对象ID. + */ + public void setTargetId(Integer targetId) { + this.targetId = targetId; + } + + /** + * 获取 操作对象名称. + * + * @return 操作对象名称. + */ + public String getTargetName() { + return targetName; + } + + /** + * 设置 操作对象名称. + * + * @param targetName 操作对象名称. + */ + public void setTargetName(String targetName) { + this.targetName = targetName; + } + + /** + * 获取 操作类型. + * + * @return 操作类型. + */ + public String getOperateType() { + return operateType; + } + + /** + * 设置 操作类型. + * + * @param operateType 操作类型. + */ + public void setOperateType(String operateType) { + this.operateType = operateType; + } + + /** + * 获取 备注. + * + * @return 备注. + */ + public String getTips() { + return tips; + } + + /** + * 设置 备注. + * + * @param tips 备注. + */ + public void setTips(String tips) { + this.tips = tips; + } + + /** + * 获取 创建时间. + * + * @return 创建时间. + */ + public Date getCreatedTime() { + return createdTime; + } + + /** + * 设置 创建时间. + * + * @param createdTime 创建时间. + */ + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + /** + * 获取 更新时间. + * + * @return 更新时间. + */ + public Date getUpdatedTime() { + return updatedTime; + } + + /** + * 设置 更新时间. + * + * @param updatedTime 更新时间. + */ + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/Permission.java b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/Permission.java new file mode 100644 index 0000000..e9acf4e --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/Permission.java @@ -0,0 +1,141 @@ +package com.enzhico.jwt.common.dao.entity; + +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.activerecord.Model; + +import java.io.Serializable; + +/** + * 权限表 + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +@TableName(value = "t_permission") +public class Permission extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + /** + * 权限名称 + */ + private String permission; + /** + * 权限说明 + */ + private String description; + /** + * 创建时间 + */ + private Date createdTime; + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 获取 主键ID. + * + * @return 主键ID. + */ + public Integer getId() { + return id; + } + + /** + * 设置 主键ID. + * + * @param id 主键ID. + */ + public void setId(Integer id) { + this.id = id; + } + + /** + * 获取 权限名称. + * + * @return 权限名称. + */ + public String getPermission() { + return permission; + } + + /** + * 设置 权限名称. + * + * @param permission 权限名称. + */ + public void setPermission(String permission) { + this.permission = permission; + } + + /** + * 获取 权限说明. + * + * @return 权限说明. + */ + public String getDescription() { + return description; + } + + /** + * 设置 权限说明. + * + * @param description 权限说明. + */ + public void setDescription(String description) { + this.description = description; + } + + /** + * 获取 创建时间. + * + * @return 创建时间. + */ + public Date getCreatedTime() { + return createdTime; + } + + /** + * 设置 创建时间. + * + * @param createdTime 创建时间. + */ + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + /** + * 获取 更新时间. + * + * @return 更新时间. + */ + public Date getUpdatedTime() { + return updatedTime; + } + + /** + * 设置 更新时间. + * + * @param updatedTime 更新时间. + */ + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/Pos.java b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/Pos.java new file mode 100644 index 0000000..64fbc39 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/Pos.java @@ -0,0 +1,361 @@ +package com.enzhico.jwt.common.dao.entity; + +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.activerecord.Model; + +import java.io.Serializable; + +/** + * POS机表 + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +@TableName(value = "t_pos") +public class Pos extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + /** + * 机具IMEI码 + */ + private String imei; + /** + * 序列号(SN) + */ + private String sn; + /** + * 机具型号 + */ + private String series; + /** + * Android版本 + */ + private String androidVersion; + /** + * 版本号 + */ + private String version; + /** + * 归属网点 + */ + private String location; + /** + * 归属项目ID + */ + private Integer projectId; + /** + * 入网时间 + */ + private Date jointime; + /** + * 绑定时间 + */ + private Date bindtime; + /** + * 产权方 + */ + private String owner; + /** + * 备注 + */ + private String tips; + /** + * 机具状态: 1:正常 2:故障 3:维修中(返厂) 4:已禁用(丢失) 5:已停用(回收) + */ + private Integer posState; + /** + * 创建时间 + */ + private Date createdTime; + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 获取 主键ID. + * + * @return 主键ID. + */ + public Integer getId() { + return id; + } + + /** + * 设置 主键ID. + * + * @param id 主键ID. + */ + public void setId(Integer id) { + this.id = id; + } + + /** + * 获取 机具IMEI码. + * + * @return 机具IMEI码. + */ + public String getImei() { + return imei; + } + + /** + * 设置 机具IMEI码. + * + * @param imei 机具IMEI码. + */ + public void setImei(String imei) { + this.imei = imei; + } + + /** + * 获取 序列号(SN). + * + * @return 序列号(SN). + */ + public String getSn() { + return sn; + } + + /** + * 设置 序列号(SN). + * + * @param sn 序列号(SN). + */ + public void setSn(String sn) { + this.sn = sn; + } + + /** + * 获取 机具型号. + * + * @return 机具型号. + */ + public String getSeries() { + return series; + } + + /** + * 设置 机具型号. + * + * @param series 机具型号. + */ + public void setSeries(String series) { + this.series = series; + } + + /** + * 获取 Android版本. + * + * @return Android版本. + */ + public String getAndroidVersion() { + return androidVersion; + } + + /** + * 设置 Android版本. + * + * @param androidVersion Android版本. + */ + public void setAndroidVersion(String androidVersion) { + this.androidVersion = androidVersion; + } + + /** + * 获取 版本号. + * + * @return 版本号. + */ + public String getVersion() { + return version; + } + + /** + * 设置 版本号. + * + * @param version 版本号. + */ + public void setVersion(String version) { + this.version = version; + } + + /** + * 获取 归属网点. + * + * @return 归属网点. + */ + public String getLocation() { + return location; + } + + /** + * 设置 归属网点. + * + * @param location 归属网点. + */ + public void setLocation(String location) { + this.location = location; + } + + /** + * 获取 归属项目ID. + * + * @return 归属项目ID. + */ + public Integer getProjectId() { + return projectId; + } + + /** + * 设置 归属项目ID. + * + * @param projectId 归属项目ID. + */ + public void setProjectId(Integer projectId) { + this.projectId = projectId; + } + + /** + * 获取 入网时间. + * + * @return 入网时间. + */ + public Date getJointime() { + return jointime; + } + + /** + * 设置 入网时间. + * + * @param jointime 入网时间. + */ + public void setJointime(Date jointime) { + this.jointime = jointime; + } + + /** + * 获取 绑定时间. + * + * @return 绑定时间. + */ + public Date getBindtime() { + return bindtime; + } + + /** + * 设置 绑定时间. + * + * @param bindtime 绑定时间. + */ + public void setBindtime(Date bindtime) { + this.bindtime = bindtime; + } + + /** + * 获取 产权方. + * + * @return 产权方. + */ + public String getOwner() { + return owner; + } + + /** + * 设置 产权方. + * + * @param owner 产权方. + */ + public void setOwner(String owner) { + this.owner = owner; + } + + /** + * 获取 备注. + * + * @return 备注. + */ + public String getTips() { + return tips; + } + + /** + * 设置 备注. + * + * @param tips 备注. + */ + public void setTips(String tips) { + this.tips = tips; + } + + /** + * 获取 机具状态: 1:正常 2:故障 3:维修中(返厂) 4:已禁用(丢失) 5:已停用(回收). + * + * @return 机具状态: 1:正常 2:故障 3:维修中(返厂) 4:已禁用(丢失) 5:已停用(回收). + */ + public Integer getPosState() { + return posState; + } + + /** + * 设置 机具状态: 1:正常 2:故障 3:维修中(返厂) 4:已禁用(丢失) 5:已停用(回收). + * + * @param posState 机具状态: 1:正常 2:故障 3:维修中(返厂) 4:已禁用(丢失) 5:已停用(回收). + */ + public void setPosState(Integer posState) { + this.posState = posState; + } + + /** + * 获取 创建时间. + * + * @return 创建时间. + */ + public Date getCreatedTime() { + return createdTime; + } + + /** + * 设置 创建时间. + * + * @param createdTime 创建时间. + */ + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + /** + * 获取 更新时间. + * + * @return 更新时间. + */ + public Date getUpdatedTime() { + return updatedTime; + } + + /** + * 设置 更新时间. + * + * @param updatedTime 更新时间. + */ + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/PosHistory.java b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/PosHistory.java new file mode 100644 index 0000000..bfbb81b --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/PosHistory.java @@ -0,0 +1,185 @@ +package com.enzhico.jwt.common.dao.entity; + +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.activerecord.Model; + +import java.io.Serializable; + +/** + * POS机历史归属表 + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +@TableName(value = "t_pos_history") +public class PosHistory extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + /** + * POS机ID + */ + private Integer posId; + /** + * 归属网点 + */ + private String location; + /** + * 绑定时间 + */ + private Date bindtime; + /** + * 解绑时间 + */ + private Date unbindtime; + /** + * 创建时间 + */ + private Date createdTime; + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 获取 主键ID. + * + * @return 主键ID. + */ + public Integer getId() { + return id; + } + + /** + * 设置 主键ID. + * + * @param id 主键ID. + */ + public void setId(Integer id) { + this.id = id; + } + + /** + * 获取 POS机ID. + * + * @return POS机ID. + */ + public Integer getPosId() { + return posId; + } + + /** + * 设置 POS机ID. + * + * @param posId POS机ID. + */ + public void setPosId(Integer posId) { + this.posId = posId; + } + + /** + * 获取 归属网点. + * + * @return 归属网点. + */ + public String getLocation() { + return location; + } + + /** + * 设置 归属网点. + * + * @param location 归属网点. + */ + public void setLocation(String location) { + this.location = location; + } + + /** + * 获取 绑定时间. + * + * @return 绑定时间. + */ + public Date getBindtime() { + return bindtime; + } + + /** + * 设置 绑定时间. + * + * @param bindtime 绑定时间. + */ + public void setBindtime(Date bindtime) { + this.bindtime = bindtime; + } + + /** + * 获取 解绑时间. + * + * @return 解绑时间. + */ + public Date getUnbindtime() { + return unbindtime; + } + + /** + * 设置 解绑时间. + * + * @param unbindtime 解绑时间. + */ + public void setUnbindtime(Date unbindtime) { + this.unbindtime = unbindtime; + } + + /** + * 获取 创建时间. + * + * @return 创建时间. + */ + public Date getCreatedTime() { + return createdTime; + } + + /** + * 设置 创建时间. + * + * @param createdTime 创建时间. + */ + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + /** + * 获取 更新时间. + * + * @return 更新时间. + */ + public Date getUpdatedTime() { + return updatedTime; + } + + /** + * 设置 更新时间. + * + * @param updatedTime 更新时间. + */ + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/PosMonitor.java b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/PosMonitor.java new file mode 100644 index 0000000..aee870e --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/PosMonitor.java @@ -0,0 +1,207 @@ +package com.enzhico.jwt.common.dao.entity; + +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.activerecord.Model; + +import java.io.Serializable; + +/** + * POS机监控表 + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +@TableName(value = "t_pos_monitor") +public class PosMonitor extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + /** + * POS机ID + */ + private Integer posId; + /** + * Socket会话ID + */ + private String sessionId; + /** + * 最近一次报告时间 + */ + private Date reportTime; + /** + * 最近一次报告地址 + */ + private String reportLocation; + /** + * 在线状态: 1:在线 2:离线 + */ + private Integer onlineState; + /** + * 创建时间 + */ + private Date createdTime; + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 获取 主键ID. + * + * @return 主键ID. + */ + public Integer getId() { + return id; + } + + /** + * 设置 主键ID. + * + * @param id 主键ID. + */ + public void setId(Integer id) { + this.id = id; + } + + /** + * 获取 POS机ID. + * + * @return POS机ID. + */ + public Integer getPosId() { + return posId; + } + + /** + * 设置 POS机ID. + * + * @param posId POS机ID. + */ + public void setPosId(Integer posId) { + this.posId = posId; + } + + /** + * 获取 Socket会话ID. + * + * @return Socket会话ID. + */ + public String getSessionId() { + return sessionId; + } + + /** + * 设置 Socket会话ID. + * + * @param sessionId Socket会话ID. + */ + public void setSessionId(String sessionId) { + this.sessionId = sessionId; + } + + /** + * 获取 最近一次报告时间. + * + * @return 最近一次报告时间. + */ + public Date getReportTime() { + return reportTime; + } + + /** + * 设置 最近一次报告时间. + * + * @param reportTime 最近一次报告时间. + */ + public void setReportTime(Date reportTime) { + this.reportTime = reportTime; + } + + /** + * 获取 最近一次报告地址. + * + * @return 最近一次报告地址. + */ + public String getReportLocation() { + return reportLocation; + } + + /** + * 设置 最近一次报告地址. + * + * @param reportLocation 最近一次报告地址. + */ + public void setReportLocation(String reportLocation) { + this.reportLocation = reportLocation; + } + + /** + * 获取 在线状态: 1:在线 2:离线. + * + * @return 在线状态: 1:在线 2:离线. + */ + public Integer getOnlineState() { + return onlineState; + } + + /** + * 设置 在线状态: 1:在线 2:离线. + * + * @param onlineState 在线状态: 1:在线 2:离线. + */ + public void setOnlineState(Integer onlineState) { + this.onlineState = onlineState; + } + + /** + * 获取 创建时间. + * + * @return 创建时间. + */ + public Date getCreatedTime() { + return createdTime; + } + + /** + * 设置 创建时间. + * + * @param createdTime 创建时间. + */ + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + /** + * 获取 更新时间. + * + * @return 更新时间. + */ + public Date getUpdatedTime() { + return updatedTime; + } + + /** + * 设置 更新时间. + * + * @param updatedTime 更新时间. + */ + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/Project.java b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/Project.java new file mode 100644 index 0000000..9f9a3e7 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/Project.java @@ -0,0 +1,163 @@ +package com.enzhico.jwt.common.dao.entity; + +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.activerecord.Model; + +import java.io.Serializable; + +/** + * 项目表 + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +@TableName(value = "t_project") +public class Project extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + /** + * 项目名称 + */ + private String name; + /** + * 应用编号 + */ + private String applicationId; + /** + * 项目图片 + */ + private String icon; + /** + * 创建时间 + */ + private Date createdTime; + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 获取 主键ID. + * + * @return 主键ID. + */ + public Integer getId() { + return id; + } + + /** + * 设置 主键ID. + * + * @param id 主键ID. + */ + public void setId(Integer id) { + this.id = id; + } + + /** + * 获取 项目名称. + * + * @return 项目名称. + */ + public String getName() { + return name; + } + + /** + * 设置 项目名称. + * + * @param name 项目名称. + */ + public void setName(String name) { + this.name = name; + } + + /** + * 获取 应用编号. + * + * @return 应用编号. + */ + public String getApplicationId() { + return applicationId; + } + + /** + * 设置 应用编号. + * + * @param applicationId 应用编号. + */ + public void setApplicationId(String applicationId) { + this.applicationId = applicationId; + } + + /** + * 获取 项目图片. + * + * @return 项目图片. + */ + public String getIcon() { + return icon; + } + + /** + * 设置 项目图片. + * + * @param icon 项目图片. + */ + public void setIcon(String icon) { + this.icon = icon; + } + + /** + * 获取 创建时间. + * + * @return 创建时间. + */ + public Date getCreatedTime() { + return createdTime; + } + + /** + * 设置 创建时间. + * + * @param createdTime 创建时间. + */ + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + /** + * 获取 更新时间. + * + * @return 更新时间. + */ + public Date getUpdatedTime() { + return updatedTime; + } + + /** + * 设置 更新时间. + * + * @param updatedTime 更新时间. + */ + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/ProjectUser.java b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/ProjectUser.java new file mode 100644 index 0000000..33877e6 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/ProjectUser.java @@ -0,0 +1,141 @@ +package com.enzhico.jwt.common.dao.entity; + +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.activerecord.Model; + +import java.io.Serializable; + +/** + * 项目用户关联表 + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +@TableName(value = "t_project_user") +public class ProjectUser extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + /** + * 用户ID + */ + private Integer userId; + /** + * 项目ID + */ + private Integer projectId; + /** + * 创建时间 + */ + private Date createdTime; + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 获取 主键ID. + * + * @return 主键ID. + */ + public Integer getId() { + return id; + } + + /** + * 设置 主键ID. + * + * @param id 主键ID. + */ + public void setId(Integer id) { + this.id = id; + } + + /** + * 获取 用户ID. + * + * @return 用户ID. + */ + public Integer getUserId() { + return userId; + } + + /** + * 设置 用户ID. + * + * @param userId 用户ID. + */ + public void setUserId(Integer userId) { + this.userId = userId; + } + + /** + * 获取 项目ID. + * + * @return 项目ID. + */ + public Integer getProjectId() { + return projectId; + } + + /** + * 设置 项目ID. + * + * @param projectId 项目ID. + */ + public void setProjectId(Integer projectId) { + this.projectId = projectId; + } + + /** + * 获取 创建时间. + * + * @return 创建时间. + */ + public Date getCreatedTime() { + return createdTime; + } + + /** + * 设置 创建时间. + * + * @param createdTime 创建时间. + */ + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + /** + * 获取 更新时间. + * + * @return 更新时间. + */ + public Date getUpdatedTime() { + return updatedTime; + } + + /** + * 设置 更新时间. + * + * @param updatedTime 更新时间. + */ + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/Role.java b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/Role.java new file mode 100644 index 0000000..d0a549a --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/Role.java @@ -0,0 +1,141 @@ +package com.enzhico.jwt.common.dao.entity; + +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.activerecord.Model; + +import java.io.Serializable; + +/** + * 角色表 + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +@TableName(value = "t_role") +public class Role extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + /** + * 角色名称 + */ + private String role; + /** + * 角色说明 + */ + private String description; + /** + * 创建时间 + */ + private Date createdTime; + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 获取 主键ID. + * + * @return 主键ID. + */ + public Integer getId() { + return id; + } + + /** + * 设置 主键ID. + * + * @param id 主键ID. + */ + public void setId(Integer id) { + this.id = id; + } + + /** + * 获取 角色名称. + * + * @return 角色名称. + */ + public String getRole() { + return role; + } + + /** + * 设置 角色名称. + * + * @param role 角色名称. + */ + public void setRole(String role) { + this.role = role; + } + + /** + * 获取 角色说明. + * + * @return 角色说明. + */ + public String getDescription() { + return description; + } + + /** + * 设置 角色说明. + * + * @param description 角色说明. + */ + public void setDescription(String description) { + this.description = description; + } + + /** + * 获取 创建时间. + * + * @return 创建时间. + */ + public Date getCreatedTime() { + return createdTime; + } + + /** + * 设置 创建时间. + * + * @param createdTime 创建时间. + */ + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + /** + * 获取 更新时间. + * + * @return 更新时间. + */ + public Date getUpdatedTime() { + return updatedTime; + } + + /** + * 设置 更新时间. + * + * @param updatedTime 更新时间. + */ + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/RolePermission.java b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/RolePermission.java new file mode 100644 index 0000000..1c628c5 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/entity/RolePermission.java @@ -0,0 +1,141 @@ +package com.enzhico.jwt.common.dao.entity; + +import java.util.Date; + +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.activerecord.Model; + +import java.io.Serializable; + +/** + * 角色权限关联表 + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +@TableName(value = "t_role_permission") +public class RolePermission extends Model { + + private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + /** + * 角色ID + */ + private Integer roleId; + /** + * 权限ID + */ + private Integer permissionId; + /** + * 创建时间 + */ + private Date createdTime; + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 获取 主键ID. + * + * @return 主键ID. + */ + public Integer getId() { + return id; + } + + /** + * 设置 主键ID. + * + * @param id 主键ID. + */ + public void setId(Integer id) { + this.id = id; + } + + /** + * 获取 角色ID. + * + * @return 角色ID. + */ + public Integer getRoleId() { + return roleId; + } + + /** + * 设置 角色ID. + * + * @param roleId 角色ID. + */ + public void setRoleId(Integer roleId) { + this.roleId = roleId; + } + + /** + * 获取 权限ID. + * + * @return 权限ID. + */ + public Integer getPermissionId() { + return permissionId; + } + + /** + * 设置 权限ID. + * + * @param permissionId 权限ID. + */ + public void setPermissionId(Integer permissionId) { + this.permissionId = permissionId; + } + + /** + * 获取 创建时间. + * + * @return 创建时间. + */ + public Date getCreatedTime() { + return createdTime; + } + + /** + * 设置 创建时间. + * + * @param createdTime 创建时间. + */ + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + /** + * 获取 更新时间. + * + * @return 更新时间. + */ + public Date getUpdatedTime() { + return updatedTime; + } + + /** + * 设置 更新时间. + * + * @param updatedTime 更新时间. + */ + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/AppMapper.java b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/AppMapper.java new file mode 100644 index 0000000..cabf548 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/AppMapper.java @@ -0,0 +1,15 @@ +package com.enzhico.jwt.common.dao.repository; + +import com.enzhico.jwt.common.dao.entity.App; +import com.baomidou.mybatisplus.mapper.BaseMapper; + +/** + * APP表 Mapper + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +public interface AppMapper extends BaseMapper { + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/AppPublishMapper.java b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/AppPublishMapper.java new file mode 100644 index 0000000..b130923 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/AppPublishMapper.java @@ -0,0 +1,15 @@ +package com.enzhico.jwt.common.dao.repository; + +import com.enzhico.jwt.common.dao.entity.AppPublish; +import com.baomidou.mybatisplus.mapper.BaseMapper; + +/** + * APP发布表 Mapper + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +public interface AppPublishMapper extends BaseMapper { + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/ManagerMapper.java b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/ManagerMapper.java new file mode 100644 index 0000000..e28f440 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/ManagerMapper.java @@ -0,0 +1,15 @@ +package com.enzhico.jwt.common.dao.repository; + +import com.enzhico.jwt.common.dao.entity.Manager; +import com.baomidou.mybatisplus.mapper.BaseMapper; + +/** + * 后台管理用户表 Mapper + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +public interface ManagerMapper extends BaseMapper { + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/ManagerRoleMapper.java b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/ManagerRoleMapper.java new file mode 100644 index 0000000..fa6a16e --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/ManagerRoleMapper.java @@ -0,0 +1,15 @@ +package com.enzhico.jwt.common.dao.repository; + +import com.enzhico.jwt.common.dao.entity.ManagerRole; +import com.baomidou.mybatisplus.mapper.BaseMapper; + +/** + * 用户角色关联表 Mapper + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +public interface ManagerRoleMapper extends BaseMapper { + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/OperationLogMapper.java b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/OperationLogMapper.java new file mode 100644 index 0000000..590864e --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/OperationLogMapper.java @@ -0,0 +1,15 @@ +package com.enzhico.jwt.common.dao.repository; + +import com.enzhico.jwt.common.dao.entity.OperationLog; +import com.baomidou.mybatisplus.mapper.BaseMapper; + +/** + * 操作日志表 Mapper + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +public interface OperationLogMapper extends BaseMapper { + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/PermissionMapper.java b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/PermissionMapper.java new file mode 100644 index 0000000..e4bf460 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/PermissionMapper.java @@ -0,0 +1,15 @@ +package com.enzhico.jwt.common.dao.repository; + +import com.enzhico.jwt.common.dao.entity.Permission; +import com.baomidou.mybatisplus.mapper.BaseMapper; + +/** + * 权限表 Mapper + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +public interface PermissionMapper extends BaseMapper { + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/PosHistoryMapper.java b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/PosHistoryMapper.java new file mode 100644 index 0000000..e3295fe --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/PosHistoryMapper.java @@ -0,0 +1,15 @@ +package com.enzhico.jwt.common.dao.repository; + +import com.enzhico.jwt.common.dao.entity.PosHistory; +import com.baomidou.mybatisplus.mapper.BaseMapper; + +/** + * POS机历史归属表 Mapper + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +public interface PosHistoryMapper extends BaseMapper { + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/PosMapper.java b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/PosMapper.java new file mode 100644 index 0000000..8caf4d7 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/PosMapper.java @@ -0,0 +1,15 @@ +package com.enzhico.jwt.common.dao.repository; + +import com.enzhico.jwt.common.dao.entity.Pos; +import com.baomidou.mybatisplus.mapper.BaseMapper; + +/** + * POS机表 Mapper + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +public interface PosMapper extends BaseMapper { + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/PosMonitorMapper.java b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/PosMonitorMapper.java new file mode 100644 index 0000000..1497d5a --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/PosMonitorMapper.java @@ -0,0 +1,15 @@ +package com.enzhico.jwt.common.dao.repository; + +import com.enzhico.jwt.common.dao.entity.PosMonitor; +import com.baomidou.mybatisplus.mapper.BaseMapper; + +/** + * POS机监控表 Mapper + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +public interface PosMonitorMapper extends BaseMapper { + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/ProjectMapper.java b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/ProjectMapper.java new file mode 100644 index 0000000..e58a5e1 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/ProjectMapper.java @@ -0,0 +1,15 @@ +package com.enzhico.jwt.common.dao.repository; + +import com.enzhico.jwt.common.dao.entity.Project; +import com.baomidou.mybatisplus.mapper.BaseMapper; + +/** + * 项目表 Mapper + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +public interface ProjectMapper extends BaseMapper { + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/ProjectUserMapper.java b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/ProjectUserMapper.java new file mode 100644 index 0000000..acdd5c5 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/ProjectUserMapper.java @@ -0,0 +1,15 @@ +package com.enzhico.jwt.common.dao.repository; + +import com.enzhico.jwt.common.dao.entity.ProjectUser; +import com.baomidou.mybatisplus.mapper.BaseMapper; + +/** + * 项目用户关联表 Mapper + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +public interface ProjectUserMapper extends BaseMapper { + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/RoleMapper.java b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/RoleMapper.java new file mode 100644 index 0000000..73ea167 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/RoleMapper.java @@ -0,0 +1,15 @@ +package com.enzhico.jwt.common.dao.repository; + +import com.enzhico.jwt.common.dao.entity.Role; +import com.baomidou.mybatisplus.mapper.BaseMapper; + +/** + * 角色表 Mapper + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +public interface RoleMapper extends BaseMapper { + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/RolePermissionMapper.java b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/RolePermissionMapper.java new file mode 100644 index 0000000..eed6052 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/common/dao/repository/RolePermissionMapper.java @@ -0,0 +1,15 @@ +package com.enzhico.jwt.common.dao.repository; + +import com.enzhico.jwt.common.dao.entity.RolePermission; +import com.baomidou.mybatisplus.mapper.BaseMapper; + +/** + * 角色权限关联表 Mapper + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +public interface RolePermissionMapper extends BaseMapper { + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/common/util/CommonUtil.java b/app-manage-api/src/main/java/com/enzhico/jwt/common/util/CommonUtil.java new file mode 100644 index 0000000..d440cb4 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/common/util/CommonUtil.java @@ -0,0 +1,41 @@ +package com.enzhico.jwt.common.util; + +/** + * 常用工具类,字符串、数字相关 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/15 + */ +public class CommonUtil { + /** + * 检查某版本是否比现在版本更大些 + * + * @param version 某版本 + * @param nowVersion 现在使用的版本 + * @return 是否版本数更大 + */ + public static boolean isNewer(String version, String nowVersion) { + try { + String[] versions = version.split("\\."); + String[] nowVersions = nowVersion.split("\\."); + + if (versions.length != nowVersions.length) { + return false; + } + int sum = 0; + for (String v : versions) { + sum += sum * 10 + Integer.valueOf(v); + } + + int nowSum = 0; + for (String nv : nowVersions) { + nowSum += nowSum * 10 + Integer.valueOf(nv); + } + + return sum > nowSum; + } catch (NumberFormatException e) { + return false; + } + } +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/common/util/DateUtil.java b/app-manage-api/src/main/java/com/enzhico/jwt/common/util/DateUtil.java new file mode 100644 index 0000000..b5c4285 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/common/util/DateUtil.java @@ -0,0 +1,296 @@ +/** + * Copyright (c) 2015-2016, Chill Zhuang 庄骞 (smallchill@163.com). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.enzhico.jwt.common.util; + +import java.sql.Timestamp; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +public class DateUtil { + private final static SimpleDateFormat sdfYear = new SimpleDateFormat("yyyy"); + + private final static SimpleDateFormat sdfDay = new SimpleDateFormat("yyyy-MM-dd"); + + private final static SimpleDateFormat sdfDays = new SimpleDateFormat("yyyyMMdd"); + + private final static SimpleDateFormat sdfTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + private final static SimpleDateFormat sdfmsTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + + private final static SimpleDateFormat allTime = new SimpleDateFormat("yyyyMMddHHmmss"); + + private final static SimpleDateFormat sdfDay_ = new SimpleDateFormat("yyyy/MM/dd"); + + + /** + * 获取YYYY格式 + * + * @return + */ + public static String getYear() { + return sdfYear.format(new Date()); + } + + /** + * 获取YYYY格式 + * + * @return + */ + public static String getYear(Date date) { + return sdfYear.format(date); + } + + /** + * 获取YYYY-MM-DD格式 + * + * @return + */ + public static String getDay() { + return sdfDay.format(new Date()); + } + + /** + * 获取YYYY-MM-DD格式 + * + * @return + */ + public static String getDay(Date date) { + return sdfDay.format(date); + } + + /** + * 获取YYYYMMDD格式 + * + * @return + */ + public static String getDays() { + return sdfDays.format(new Date()); + } + + /** + * 获取YYYYMMDD格式 + * + * @return + */ + public static String getDays(Date date) { + return sdfDays.format(date); + } + + /** + * 获取YYYY/MM/DD格式 + * + * @return + */ + public static String getDays_(Date date) { + return sdfDay_.format(date); + } + + /** + * 获取YYYY-MM-DD HH:mm:ss格式 + * + * @return + */ + public static String getTime() { + return sdfTime.format(new Date()); + } + + /** + * 获取YYYY-MM-DD HH:mm:ss.SSS格式 + * + * @return + */ + public static String getMsTime() { + return sdfmsTime.format(new Date()); + } + + /** + * 获取YYYYMMDDHHmmss格式 + * + * @return + */ + public static String getAllTime() { + return allTime.format(new Date()); + } + + /** + * 获取YYYY-MM-DD HH:mm:ss格式 + * + * @return + */ + public static String getTime(Date date) { + return sdfTime.format(date); + } + + /** + * @param s + * @param e + * @return boolean + * @throws + * @Title: compareDate + * @Description:(日期比较,如果s>=e 返回true 否则返回false) + * @author luguosui + */ + public static boolean compareDate(String s, String e) { + if (parseDate(s) == null || parseDate(e) == null) { + return false; + } + return parseDate(s).getTime() >= parseDate(e).getTime(); + } + + /** + * 格式化日期 + * + * @return + */ + public static Date parseDate(String date) { + try { + return sdfDay.parse(date); + } catch (ParseException e) { + e.printStackTrace(); + return null; + } + } + + /** + * 格式化日期 + * + * @return + */ + public static Date parseTime(String date) { + try { + return sdfTime.parse(date); + } catch (ParseException e) { + e.printStackTrace(); + return null; + } + } + + /** + * 格式化日期 + * + * @return + */ + public static Date parse(String date, String pattern) { + DateFormat fmt = new SimpleDateFormat(pattern); + try { + return fmt.parse(date); + } catch (ParseException e) { + e.printStackTrace(); + return null; + } + } + + /** + * 格式化日期 + * + * @return + */ + public static String format(Date date, String pattern) { + DateFormat fmt = new SimpleDateFormat(pattern); + return fmt.format(date); + } + + /** + * 把日期转换为Timestamp + * + * @param date + * @return + */ + public static Timestamp format(Date date) { + return new Timestamp(date.getTime()); + } + + /** + * 校验日期是否合法 + * + * @return + */ + public static boolean isValidDate(String s) { + try { + sdfTime.parse(s); + return true; + } catch (Exception e) { + // 如果throw java.text.ParseException或者NullPointerException,就说明格式不对 + return false; + } + } + + /** + * 校验日期是否合法 + * + * @return + */ + public static boolean isValidDate(String s, String pattern) { + DateFormat fmt = new SimpleDateFormat(pattern); + try { + fmt.parse(s); + return true; + } catch (Exception e) { + // 如果throw java.text.ParseException或者NullPointerException,就说明格式不对 + return false; + } + } + + /** + * 获取指定日期偏移指定时间后的时间 + * + * @param date 基准日期 + * @param calendarField 偏移的粒度大小(小时、天、月等)使用Calendar中的常数 + * @param offsite 偏移量,正数为向后偏移,负数为向前偏移 + * @return 偏移后的日期 + */ + public static Date offsiteDate(Date date, int calendarField, int offsite) { + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + cal.add(calendarField, offsite); + return cal.getTime(); + } + + /** + * 返回日期零时 + * + * @param date 目标日期 + * @return 目标日期零时 + */ + public static Date getDateStartTime(Date date) { + String str = format(date, "yyyyMMdd") + "000000"; + try { + return allTime.parse(str); + } catch (ParseException e) { + return null; + } + } + + + /** + * 返回日期最后时间End + * + * @param date 目标日期 + * @return 目标日日期最后时间 + */ + public static Date getDateEndTime(Date date) { + String str = format(date, "yyyyMMdd") + "235959"; + try { + return allTime.parse(str); + } catch (ParseException e) { + return null; + } + } + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/common/util/JWTUtil.java b/app-manage-api/src/main/java/com/enzhico/jwt/common/util/JWTUtil.java new file mode 100644 index 0000000..d854b8c --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/common/util/JWTUtil.java @@ -0,0 +1,173 @@ +package com.enzhico.jwt.common.util; + +import com.auth0.jwt.JWT; +import com.auth0.jwt.JWTVerifier; +import com.auth0.jwt.algorithms.Algorithm; +import com.auth0.jwt.exceptions.JWTDecodeException; +import com.auth0.jwt.interfaces.DecodedJWT; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.UnsupportedEncodingException; +import java.util.Date; + +public class JWTUtil { + + private static final Logger log = LoggerFactory.getLogger(JWTUtil.class); + + // 过期时间5分钟 + private static final long EXPIRE_TIME = 5 * 60 * 1000; + + /** + * 校验token是否正确 + * + * @param token 密钥 + * @param secret 用户的密码 + * @return 是否正确 + */ + public static boolean verify(String token, String username, String secret) { + try { + Algorithm algorithm = Algorithm.HMAC256(secret); + JWTVerifier verifier = JWT.require(algorithm) + .withClaim("username", username) + .build(); + DecodedJWT jwt = verifier.verify(token); + return true; + } catch (Exception exception) { + log.error("校验token失败", exception); + return false; + } + } + + /** + * 获得token中的信息无需secret解密也能获得 + * + * @return token中包含的用户名 + */ + public static String getUsername(String token) { + try { + DecodedJWT jwt = JWT.decode(token); + return jwt.getClaim("username").asString(); + } catch (JWTDecodeException e) { + return null; + } + } + + /** + * 生成签名,5min后过期 + * + * @param username 用户名 + * @param secret 用户的密码 + * @return 加密的token + */ + public static String sign(String username, String secret) { + try { + Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME); + Algorithm algorithm = Algorithm.HMAC256(secret); + // 附带username信息 + return JWT.create() + .withClaim("username", username) + .withExpiresAt(date) + .sign(algorithm); + } catch (UnsupportedEncodingException e) { + return null; + } + } + + /*----------------------------以下是socket校验--------------------------*/ + /** + * 生成Socket Token签名, 5min后过期 + * + * @param username 用户名 + * @param secret 用户的密码 + * @param appid applicationId + * @param imei IMEI码 + * @return 加密的token + */ + public static String signSocket(String username, String secret, String appid, String imei) { + try { + Date date = new Date(System.currentTimeMillis() + EXPIRE_TIME); + Algorithm algorithm = Algorithm.HMAC256(secret); + // 附带username信息 + return JWT.create() + .withClaim("username", username) + .withClaim("appid", appid) + .withClaim("imei", imei) + .withExpiresAt(date) + .sign(algorithm); + } catch (UnsupportedEncodingException e) { + return null; + } + } + + /** + * 校验token是否正确 + * + * @param token 密钥 + * @param secret 用户的密码 + * @return 是否正确 + */ + public static boolean verifySocket(String token, String secret) { + try { + DecodedJWT jwt1 = JWT.decode(token); + String username = jwt1.getClaim("username").asString(); + String appid = jwt1.getClaim("appid").asString(); + String imei = jwt1.getClaim("imei").asString(); + + Algorithm algorithm = Algorithm.HMAC256(secret); + JWTVerifier verifier = JWT.require(algorithm) + .withClaim("username", username) + .withClaim("appid", appid) + .withClaim("imei", imei) + .build(); + DecodedJWT jwt = verifier.verify(token); + return true; + } catch (Exception exception) { + log.error("校验token失败", exception); + return false; + } + } + + /** + * 获得token中的信息无需secret解密也能获得 + * + * @return token中包含的用户名 + */ + public static String getSocketUsername(String token) { + try { + DecodedJWT jwt1 = JWT.decode(token); + return jwt1.getClaim("username").asString(); + } catch (JWTDecodeException e) { + return null; + } + } + + /** + * 获得token中的信息无需secret解密也能获得 + * + * @return token中包含的Appid + */ + public static String getSocketAppid(String token) { + try { + DecodedJWT jwt1 = JWT.decode(token); + return jwt1.getClaim("appid").asString(); + } catch (JWTDecodeException e) { + return null; + } + } + + /** + * 获得token中的信息无需secret解密也能获得 + * + * @return token中包含的IMEI码 + */ + public static String getSocketImei(String token) { + try { + DecodedJWT jwt1 = JWT.decode(token); + return jwt1.getClaim("imei").asString(); + } catch (JWTDecodeException e) { + return null; + } + } + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/common/util/JsonConverter.java b/app-manage-api/src/main/java/com/enzhico/jwt/common/util/JsonConverter.java new file mode 100644 index 0000000..b401b1b --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/common/util/JsonConverter.java @@ -0,0 +1,47 @@ +package com.enzhico.jwt.common.util; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; + +/** + * 对象和Json转换器 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/18 + */ +public class JsonConverter { + public static JSONObject objectToJSONObject(Object object) { + try { + String jsonString = new ObjectMapper().writeValueAsString(object); + return new JSONObject(jsonString); + } catch (JSONException | JsonProcessingException e) { + e.printStackTrace(); + return null; + } + } + + public static JSONArray objectToJSONArray(Object object) { + try { + String jsonString = new ObjectMapper().writeValueAsString(object); + return new JSONArray(jsonString); + } catch (JSONException | JsonProcessingException e) { + e.printStackTrace(); + return null; + } + } + + public static T jsonObjectToObject(Object jsonObject, Class clazz) { + try { + // List listCar = objectMapper.readValue(jsonCarArray, new TypeReference>(){}); + return new ObjectMapper().readValue(jsonObject.toString(), clazz); + } catch (IOException e) { + return null; + } + } +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/config/MybatisPlusConfig.java b/app-manage-api/src/main/java/com/enzhico/jwt/config/MybatisPlusConfig.java new file mode 100644 index 0000000..05af447 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/config/MybatisPlusConfig.java @@ -0,0 +1,47 @@ +package com.enzhico.jwt.config; + +import com.alibaba.druid.pool.DruidDataSource; +import com.baomidou.mybatisplus.plugins.PaginationInterceptor; +import com.enzhico.jwt.config.properties.DruidProperties; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import javax.annotation.Resource; + +/** + * MybatisPlus配置 + * + * @author xiongneng + * @since 2017/5/20 21:58 + */ +@Configuration +@EnableTransactionManagement(order = 2) +@MapperScan(basePackages = { + "com.enzhico.jwt.common.dao.repository", + "com.enzhico.jwt.dao.repository"}) +public class MybatisPlusConfig { + + @Resource + private DruidProperties druidProperties; + + /** + * 单数据源连接池配置 + */ + @Bean + public DruidDataSource singleDatasource() { + DruidDataSource dataSource = new DruidDataSource(); + druidProperties.config(dataSource); + return dataSource; + } + + /** + * mybatis-plus分页插件 + */ + @Bean + public PaginationInterceptor paginationInterceptor() { + return new PaginationInterceptor(); + } +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/config/NettySocketConfig.java b/app-manage-api/src/main/java/com/enzhico/jwt/config/NettySocketConfig.java new file mode 100644 index 0000000..53e76c6 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/config/NettySocketConfig.java @@ -0,0 +1,72 @@ +package com.enzhico.jwt.config; + +import com.corundumstudio.socketio.AuthorizationListener; +import com.corundumstudio.socketio.HandshakeData; +import com.corundumstudio.socketio.SocketIOServer; +import com.corundumstudio.socketio.annotation.SpringAnnotationScanner; +import com.enzhico.jwt.common.util.JWTUtil; +import com.enzhico.jwt.config.properties.MyProperties; +import com.enzhico.jwt.dao.entity.ManagerInfo; +import com.enzhico.jwt.service.ApiService; +import com.enzhico.jwt.service.ManagerInfoService; +import com.enzhico.jwt.shiro.ShiroKit; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.annotation.Resource; + +/** + * NettySocketConfig + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/19 + */ +@Configuration +public class NettySocketConfig { + + @Resource + private MyProperties myProperties; + + @Resource + private ApiService apiService; + + @Resource + private ManagerInfoService managerInfoService; + + private static final Logger logger = LoggerFactory.getLogger(NettySocketConfig.class); + + @Bean + public SocketIOServer socketIOServer() { + /* + * 创建Socket,并设置监听端口 + */ + com.corundumstudio.socketio.Configuration config = new com.corundumstudio.socketio.Configuration(); + // 设置主机名,默认是0.0.0.0 + // config.setHostname("localhost"); + // 设置监听端口 + config.setPort(myProperties.getSocketPort()); + // 协议升级超时时间(毫秒),默认10000。HTTP握手升级为ws协议超时时间 + config.setUpgradeTimeout(10000); + // Ping消息间隔(毫秒),默认25000。客户端向服务器发送一条心跳消息间隔 + config.setPingInterval(myProperties.getPingInterval()); + // Ping消息超时时间(毫秒),默认60000,这个时间间隔内没有接收到心跳消息就会发送超时事件 + config.setPingTimeout(myProperties.getPingTimeout()); + // 握手协议参数使用JWT的Token认证方案 + config.setAuthorizationListener(data -> { + // 可以使用如下代码获取用户密码信息 + String token = data.getSingleUrlParam("token"); + String username = JWTUtil.getSocketUsername(token); + ManagerInfo managerInfo = managerInfoService.findByUsername(username); + return JWTUtil.verifySocket(token, managerInfo.getPassword()); + }); + return new SocketIOServer(config); + } + + @Bean + public SpringAnnotationScanner springAnnotationScanner(SocketIOServer socketServer) { + return new SpringAnnotationScanner(socketServer); + } +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/config/ShiroConfig.java b/app-manage-api/src/main/java/com/enzhico/jwt/config/ShiroConfig.java new file mode 100644 index 0000000..45327f4 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/config/ShiroConfig.java @@ -0,0 +1,134 @@ +package com.enzhico.jwt.config; + +import com.enzhico.jwt.shiro.JWTFilter; +import com.enzhico.jwt.shiro.MyShiroRealm; +import org.apache.shiro.cache.ehcache.EhCacheManager; +import org.apache.shiro.mgt.DefaultSessionStorageEvaluator; +import org.apache.shiro.mgt.DefaultSubjectDAO; +import org.apache.shiro.mgt.SecurityManager; +import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; +import org.apache.shiro.spring.web.ShiroFilterFactoryBean; +import org.apache.shiro.web.mgt.DefaultWebSecurityManager; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; + +import javax.servlet.Filter; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * Description : Apache Shiro 核心通过 Filter 来实现,就好像SpringMvc 通过DispachServlet 来主控制一样。 + * 既然是使用 Filter 一般也就能猜到,是通过URL规则来进行过滤和权限校验,所以我们需要定义一系列关于URL的规则和访问权限。 + */ + +@Configuration +@Order(1) +public class ShiroConfig { + /** + * ShiroFilterFactoryBean 处理拦截资源文件问题。 + * 注意:单独一个ShiroFilterFactoryBean配置是或报错的,以为在 + * 初始化ShiroFilterFactoryBean的时候需要注入:SecurityManager Filter Chain定义说明 + * 1、一个URL可以配置多个Filter,使用逗号分隔 + * 2、当设置多个过滤器时,全部验证通过,才视为通过 + * 3、部分过滤器可指定参数,如perms,roles + */ + @Bean + public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) { + + ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); + // 必须设置 SecurityManager + shiroFilterFactoryBean.setSecurityManager(securityManager); + //验证码过滤器 + Map filtersMap = shiroFilterFactoryBean.getFilters(); + filtersMap.put("jwt", new JWTFilter()); + shiroFilterFactoryBean.setFilters(filtersMap); + + // 拦截器 + //rest:比如/admins/user/**=rest[user],根据请求的方法,相当于/admins/user/**=perms[user:method] ,其中method为post,get,delete等。 + //port:比如/admins/user/**=port[8081],当请求的url的端口不是8081是跳转到schemal://serverName:8081?queryString,其中schmal是协议http或https等,serverName是你访问的host,8081是url配置里port的端口,queryString是你访问的url里的?后面的参数。 + //perms:比如/admins/user/**=perms[user:add:*],perms参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,比如/admins/user/**=perms["user:add:*,user:modify:*"],当有多个参数时必须每个参数都通过才通过,想当于isPermitedAll()方法。 + //roles:比如/admins/user/**=roles[admin],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,当有多个参数时,比如/admins/user/**=roles["admin,guest"],每个参数通过才算通过,相当于hasAllRoles()方法。//要实现or的效果看http://zgzty.blog.163.com/blog/static/83831226201302983358670/ + //anon:比如/admins/**=anon 没有参数,表示可以匿名使用。 + //authc:比如/admins/user/**=authc表示需要认证才能使用,没有参数 + //authcBasic:比如/admins/user/**=authcBasic没有参数表示httpBasic认证 + //ssl:比如/admins/user/**=ssl没有参数,表示安全的url请求,协议为https + //user:比如/admins/user/**=user没有参数表示必须存在用户,当登入操作时不做检查 + Map filterChainDefinitionMap = new LinkedHashMap(); + + // swagger接口文档 + filterChainDefinitionMap.put("/v2/api-docs", "anon"); + filterChainDefinitionMap.put("/webjars/**", "anon"); + filterChainDefinitionMap.put("/swagger-resources/**", "anon"); + filterChainDefinitionMap.put("/swagger-ui.html", "anon"); + filterChainDefinitionMap.put("/doc.html", "anon"); + + // 其他的 + filterChainDefinitionMap.put("/**", "jwt"); + + // 访问401和404页面不通过我们的Filter + filterChainDefinitionMap.put("/401", "anon"); + filterChainDefinitionMap.put("/404", "anon"); + + shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); + return shiroFilterFactoryBean; + } + + @Bean + public SecurityManager securityManager() { + DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); + // 设置realm. + securityManager.setRealm(myShiroRealm()); + //注入缓存管理器 + securityManager.setCacheManager(ehCacheManager()); + /* + * 关闭shiro自带的session,详情见文档 + * http://shiro.apache.org/session-management.html#SessionManagement-StatelessApplications%28Sessionless%29 + */ + DefaultSubjectDAO subjectDAO = new DefaultSubjectDAO(); + DefaultSessionStorageEvaluator defaultSessionStorageEvaluator = new DefaultSessionStorageEvaluator(); + defaultSessionStorageEvaluator.setSessionStorageEnabled(false); + subjectDAO.setSessionStorageEvaluator(defaultSessionStorageEvaluator); + securityManager.setSubjectDAO(subjectDAO); + + return securityManager; + } + + /** + * 身份认证realm; (这个需要自己写,账号密码校验;权限等) + */ + @Bean + public MyShiroRealm myShiroRealm() { + MyShiroRealm myShiroRealm = new MyShiroRealm(); + return myShiroRealm; + } + + /** + * 开启shiro aop注解支持. 使用代理方式; 所以需要开启代码支持; + * + * @param securityManager 安全管理器 + * @return 授权Advisor + */ + @Bean + public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) { + AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor(); + authorizationAttributeSourceAdvisor.setSecurityManager(securityManager); + return authorizationAttributeSourceAdvisor; + } + + /** + * shiro缓存管理器; + * 需要注入对应的其它的实体类中: + * 1、安全管理器:securityManager + * 可见securityManager是整个shiro的核心; + * + * @return + */ + @Bean + public EhCacheManager ehCacheManager() { + EhCacheManager cacheManager = new EhCacheManager(); + cacheManager.setCacheManagerConfigFile("classpath:ehcache.xml"); + return cacheManager; + } + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/config/Swagger2Config.java b/app-manage-api/src/main/java/com/enzhico/jwt/config/Swagger2Config.java new file mode 100644 index 0000000..5ca0d6b --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/config/Swagger2Config.java @@ -0,0 +1,55 @@ +package com.enzhico.jwt.config; + +import com.google.common.collect.Sets; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import springfox.documentation.builders.ApiInfoBuilder; +import springfox.documentation.builders.PathSelectors; +import springfox.documentation.builders.RequestHandlerSelectors; +import springfox.documentation.service.ApiInfo; +import springfox.documentation.service.Contact; +import springfox.documentation.spi.DocumentationType; +import springfox.documentation.spring.web.plugins.Docket; +import springfox.documentation.swagger2.annotations.EnableSwagger2; + +/** + * Swagger2的Java配置类 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/7 + */ +@Configuration +@EnableSwagger2 +public class Swagger2Config { + + @Bean + public Docket createRestApi() { + return new Docket(DocumentationType.SWAGGER_2) + .produces(Sets.newHashSet("application/json")) + .consumes(Sets.newHashSet("application/json")) + .protocols(Sets.newHashSet("http", "https")) + .apiInfo(apiInfo()) + .forCodeGeneration(true) + .select() + // 指定controller存放的目录路径 + .apis(RequestHandlerSelectors.basePackage("com.enzhico.jwt.api")) +// .paths(PathSelectors.ant("/api/v1/*")) + .paths(PathSelectors.any()) + .build(); + } + + private ApiInfo apiInfo() { + return new ApiInfoBuilder() + // 文档标题 + .title("系统API服务") + // 文档描述 + .description("系统API接口文档") + // .termsOfServiceUrl("https://github.com/yidao620c") + .version("v1") + // .license("MIT 协议") + // .licenseUrl("http://www.opensource.org/licenses/MIT") + // .contact(new Contact("熊能","https://github.com/yidao620c","yidao620@gmail.com")) + .build(); + } +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/config/WebConfig.java b/app-manage-api/src/main/java/com/enzhico/jwt/config/WebConfig.java new file mode 100644 index 0000000..b133c3f --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/config/WebConfig.java @@ -0,0 +1,102 @@ +package com.enzhico.jwt.config; + +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.support.http.StatViewServlet; +import com.alibaba.druid.support.http.WebStatFilter; +import com.alibaba.druid.support.spring.stat.BeanTypeAutoProxyCreator; +import com.alibaba.druid.support.spring.stat.DruidStatInterceptor; +import org.springframework.aop.Advisor; +import org.springframework.aop.support.DefaultPointcutAdvisor; +import org.springframework.aop.support.JdkRegexpMethodPointcut; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.boot.web.servlet.ServletListenerRegistrationBean; +import org.springframework.boot.web.servlet.ServletRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.context.request.RequestContextListener; + +/** + * web 配置类 + * + * @author xiongneng + * @since 2016年11月12日 下午5:03:32 + */ +@Configuration +public class WebConfig { + + /** + * druidServlet注册 + */ + @Bean + public ServletRegistrationBean druidServletRegistration() { + ServletRegistrationBean registration = new ServletRegistrationBean(new StatViewServlet()); + registration.addUrlMappings("/druid/*"); + return registration; + } + + /** + * druid监控 配置URI拦截策略 + * + * @return + */ + @Bean + public FilterRegistrationBean druidStatFilter() { + FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter()); + //添加过滤规则. + filterRegistrationBean.addUrlPatterns("/*"); + //添加不需要忽略的格式信息. + filterRegistrationBean.addInitParameter( + "exclusions", "/static/*,*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid,/druid/*"); + //用于session监控页面的用户名显示 需要登录后主动将username注入到session里 + filterRegistrationBean.addInitParameter("principalSessionName", "username"); + return filterRegistrationBean; + } + + /** + * druid数据库连接池监控 + */ + @Bean + public DruidStatInterceptor druidStatInterceptor() { + return new DruidStatInterceptor(); + } + + + @Bean + public JdkRegexpMethodPointcut druidStatPointcut() { + JdkRegexpMethodPointcut druidStatPointcut = new JdkRegexpMethodPointcut(); + String patterns = "com.enzhico.jwt.*.service.*"; + //可以set多个 + druidStatPointcut.setPatterns(patterns); + return druidStatPointcut; + } + + /** + * druid数据库连接池监控 + */ + @Bean + public BeanTypeAutoProxyCreator beanTypeAutoProxyCreator() { + BeanTypeAutoProxyCreator beanTypeAutoProxyCreator = new BeanTypeAutoProxyCreator(); + beanTypeAutoProxyCreator.setTargetBeanType(DruidDataSource.class); + beanTypeAutoProxyCreator.setInterceptorNames("druidStatInterceptor"); + return beanTypeAutoProxyCreator; + } + + /** + * druid 为druidStatPointcut添加拦截 + * + * @return + */ + @Bean + public Advisor druidStatAdvisor() { + return new DefaultPointcutAdvisor(druidStatPointcut(), druidStatInterceptor()); + } + + /** + * RequestContextListener注册 + */ + @Bean + public ServletListenerRegistrationBean requestContextListenerRegistration() { + return new ServletListenerRegistrationBean<>(new RequestContextListener()); + } + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/config/properties/DruidProperties.java b/app-manage-api/src/main/java/com/enzhico/jwt/config/properties/DruidProperties.java new file mode 100644 index 0000000..5657248 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/config/properties/DruidProperties.java @@ -0,0 +1,249 @@ +package com.enzhico.jwt.config.properties; + +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.util.JdbcConstants; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.sql.SQLException; + +/** + *

数据库数据源配置

+ *

说明:这个类中包含了许多默认配置,若这些配置符合您的情况,您可以不用管,若不符合,建议不要修改本类,建议直接在"application.yml"中配置即可

+ * + * @author xiongneng + * @since 2017-05-21 11:18 + */ +@Component +@ConfigurationProperties(prefix = "spring.datasource") +public class DruidProperties { + + private String url = "jdbc:mysql://127.0.0.1:3306/cloudsepay?autoReconnect=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull"; + + private String username = "root"; + + private String password = "root"; + + private String driverClassName = "com.mysql.cj.jdbc.Driver"; + + private Integer initialSize = 10; + + private Integer minIdle = 3; + + private Integer maxActive = 60; + + private Integer maxWait = 60000; + + private Boolean removeAbandoned = true; + + private Integer removeAbandonedTimeout = 180; + + private Integer timeBetweenEvictionRunsMillis = 60000; + + private Integer minEvictableIdleTimeMillis = 300000; + + private String validationQuery = "SELECT 'x'"; + + private Boolean testWhileIdle = true; + + private Boolean testOnBorrow = false; + + private Boolean testOnReturn = false; + + private Boolean poolPreparedStatements = true; + + private Integer maxPoolPreparedStatementPerConnectionSize = 50; + + private String filters = "stat"; + + public void config(DruidDataSource dataSource) { + dataSource.setDbType(JdbcConstants.MYSQL); + dataSource.setUrl(url); + dataSource.setUsername(username); + dataSource.setPassword(password); + dataSource.setDriverClassName(driverClassName); + dataSource.setInitialSize(initialSize); // 定义初始连接数 + dataSource.setMinIdle(minIdle); // 最小空闲 + dataSource.setMaxActive(maxActive); // 定义最大连接数 + dataSource.setMaxWait(maxWait); // 获取连接等待超时的时间 + dataSource.setRemoveAbandoned(removeAbandoned); // 超过时间限制是否回收 + dataSource.setRemoveAbandonedTimeout(removeAbandonedTimeout); // 超过时间限制多长 + + // 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + dataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); + // 配置一个连接在池中最小生存的时间,单位是毫秒 + dataSource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); + // 用来检测连接是否有效的sql,要求是一个查询语句 + dataSource.setValidationQuery(validationQuery); + // 申请连接的时候检测 + dataSource.setTestWhileIdle(testWhileIdle); + // 申请连接时执行validationQuery检测连接是否有效,配置为true会降低性能 + dataSource.setTestOnBorrow(testOnBorrow); + // 归还连接时执行validationQuery检测连接是否有效,配置为true会降低性能 + dataSource.setTestOnReturn(testOnReturn); + // 打开PSCache,并且指定每个连接上PSCache的大小 + dataSource.setPoolPreparedStatements(poolPreparedStatements); + dataSource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize); + // 属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有: + // 监控统计用的filter:stat + // 日志用的filter:log4j + // 防御SQL注入的filter:wall + try { + dataSource.setFilters(filters); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getDriverClassName() { + return driverClassName; + } + + public void setDriverClassName(String driverClassName) { + this.driverClassName = driverClassName; + } + + public Integer getInitialSize() { + return initialSize; + } + + public void setInitialSize(Integer initialSize) { + this.initialSize = initialSize; + } + + public Integer getMinIdle() { + return minIdle; + } + + public void setMinIdle(Integer minIdle) { + this.minIdle = minIdle; + } + + public Integer getMaxActive() { + return maxActive; + } + + public void setMaxActive(Integer maxActive) { + this.maxActive = maxActive; + } + + public Integer getMaxWait() { + return maxWait; + } + + public void setMaxWait(Integer maxWait) { + this.maxWait = maxWait; + } + + public Integer getTimeBetweenEvictionRunsMillis() { + return timeBetweenEvictionRunsMillis; + } + + public void setTimeBetweenEvictionRunsMillis(Integer timeBetweenEvictionRunsMillis) { + this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis; + } + + public Integer getMinEvictableIdleTimeMillis() { + return minEvictableIdleTimeMillis; + } + + public void setMinEvictableIdleTimeMillis(Integer minEvictableIdleTimeMillis) { + this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis; + } + + public String getValidationQuery() { + return validationQuery; + } + + public void setValidationQuery(String validationQuery) { + this.validationQuery = validationQuery; + } + + public Boolean getTestWhileIdle() { + return testWhileIdle; + } + + public void setTestWhileIdle(Boolean testWhileIdle) { + this.testWhileIdle = testWhileIdle; + } + + public Boolean getTestOnBorrow() { + return testOnBorrow; + } + + public void setTestOnBorrow(Boolean testOnBorrow) { + this.testOnBorrow = testOnBorrow; + } + + public Boolean getTestOnReturn() { + return testOnReturn; + } + + public void setTestOnReturn(Boolean testOnReturn) { + this.testOnReturn = testOnReturn; + } + + public Boolean getPoolPreparedStatements() { + return poolPreparedStatements; + } + + public void setPoolPreparedStatements(Boolean poolPreparedStatements) { + this.poolPreparedStatements = poolPreparedStatements; + } + + public Integer getMaxPoolPreparedStatementPerConnectionSize() { + return maxPoolPreparedStatementPerConnectionSize; + } + + public void setMaxPoolPreparedStatementPerConnectionSize(Integer maxPoolPreparedStatementPerConnectionSize) { + this.maxPoolPreparedStatementPerConnectionSize = maxPoolPreparedStatementPerConnectionSize; + } + + public String getFilters() { + return filters; + } + + public void setFilters(String filters) { + this.filters = filters; + } + + public Boolean getRemoveAbandoned() { + return removeAbandoned; + } + + public void setRemoveAbandoned(Boolean removeAbandoned) { + this.removeAbandoned = removeAbandoned; + } + + public Integer getRemoveAbandonedTimeout() { + return removeAbandonedTimeout; + } + + public void setRemoveAbandonedTimeout(Integer removeAbandonedTimeout) { + this.removeAbandonedTimeout = removeAbandonedTimeout; + } +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/config/properties/MyProperties.java b/app-manage-api/src/main/java/com/enzhico/jwt/config/properties/MyProperties.java new file mode 100644 index 0000000..2c07950 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/config/properties/MyProperties.java @@ -0,0 +1,64 @@ +package com.enzhico.jwt.config.properties; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + + +/** + * 本项目自定义配置 + * + * @author xiongneng + * @since 2018/01/06 21:09 + */ +@Component +@ConfigurationProperties(prefix = "enzhico") +public class MyProperties { + /** + * socket端口 + */ + private Integer socketPort; + /** + * Ping消息间隔(毫秒) + */ + private Integer pingInterval; + /** + * Ping消息超时时间(毫秒) + */ + private Integer pingTimeout; + /** + * APK文件访问URL前缀 + */ + private String apkUrlPrefix; + + public Integer getSocketPort() { + return socketPort; + } + + public void setSocketPort(Integer socketPort) { + this.socketPort = socketPort; + } + + public Integer getPingInterval() { + return pingInterval; + } + + public void setPingInterval(Integer pingInterval) { + this.pingInterval = pingInterval; + } + + public Integer getPingTimeout() { + return pingTimeout; + } + + public void setPingTimeout(Integer pingTimeout) { + this.pingTimeout = pingTimeout; + } + + public String getApkUrlPrefix() { + return apkUrlPrefix; + } + + public void setApkUrlPrefix(String apkUrlPrefix) { + this.apkUrlPrefix = apkUrlPrefix; + } +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/AppInfo.java b/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/AppInfo.java new file mode 100644 index 0000000..de7ce4d --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/AppInfo.java @@ -0,0 +1,79 @@ +package com.enzhico.jwt.dao.entity; + +import com.enzhico.jwt.common.constant.DictMap; +import com.enzhico.jwt.common.dao.entity.App; + +import java.io.Serializable; + +/** + * Description: App信息 + */ +public class AppInfo extends App implements Serializable { + + private static final long serialVersionUID = 1L; + /** + * 操作者用户名 + */ + private String operatorUsername; + /** + * 操作者姓名 + */ + private String operatorName; + /** + * 归属项目名称 + */ + private String projectName; + + /** + * 发布范围显示 + */ + private String publishRangeStr; + /** + * APK下载链接 + */ + private String downloadUrl; + + public String getProjectName() { + return projectName; + } + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + public String getOperatorUsername() { + return operatorUsername; + } + + public void setOperatorUsername(String operatorUsername) { + this.operatorUsername = operatorUsername; + } + + public String getOperatorName() { + return operatorName; + } + + public void setOperatorName(String operatorName) { + this.operatorName = operatorName; + } + + public String getPublishRangeStr() { + return publishRangeStr; + } + + public void setPublishRangeStr(String publishRangeStr) { + this.publishRangeStr = publishRangeStr; + } + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public void buildTable() { + publishRangeStr = DictMap.value(DictMap.KEY_APP_PUBLISH_RANGE, getPublishRange()); + } +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/AppVersionInfo.java b/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/AppVersionInfo.java new file mode 100644 index 0000000..a9364e3 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/AppVersionInfo.java @@ -0,0 +1,37 @@ +package com.enzhico.jwt.dao.entity; + +import java.util.List; + +/** + * App名字和版本对应类 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/17 + */ +public class AppVersionInfo { + /** + * 应用名称 + */ + private String appName; + /** + * 版本号列表 + */ + private List versions; + + public String getAppName() { + return appName; + } + + public void setAppName(String appName) { + this.appName = appName; + } + + public List getVersions() { + return versions; + } + + public void setVersions(List versions) { + this.versions = versions; + } +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/FileInfo.java b/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/FileInfo.java new file mode 100644 index 0000000..feffe2e --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/FileInfo.java @@ -0,0 +1,27 @@ +package com.enzhico.jwt.dao.entity; + +/** + * FileInfo + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/10 + */ +public class FileInfo { + private String filename; + + public FileInfo() { + } + + public FileInfo(String filename) { + this.filename = filename; + } + + public String getFilename() { + return filename; + } + + public void setFilename(String filename) { + this.filename = filename; + } +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/ManagerInfo.java b/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/ManagerInfo.java new file mode 100644 index 0000000..afde1eb --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/ManagerInfo.java @@ -0,0 +1,97 @@ +package com.enzhico.jwt.dao.entity; + +import com.enzhico.jwt.common.constant.DictMap; +import com.enzhico.jwt.common.dao.entity.Manager; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + * Description: 后台运维管理员信息 + */ +public class ManagerInfo extends Manager implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 状态 + */ + private String stateStr; + /** + * 所属项目id列表(逗号分隔) + */ + private String pids; + /** + * 所属项目名列表(逗号分隔) + */ + private String pnames; + /** + * 所属项目id列表 + */ + private List pidsList; + + /** + * 一个管理员具有多个角色 + */ + private List roles;// 一个用户具有多个角色 + + public ManagerInfo() { + } + + public List getRoles() { + return roles; + } + + public void setRoles(List roles) { + this.roles = roles; + } + + /** + * 密码盐 + */ + public String getCredentialsSalt() { + return getUsername() + getSalt(); + } + + @Override + public String toString() { + return "username:" + getUsername() + "|name=" + getName(); + } + + public String getStateStr() { + return stateStr; + } + + public void setStateStr(String stateStr) { + this.stateStr = stateStr; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public List getPidsList() { + return pidsList; + } + + public void setPidsList(List pidsList) { + this.pidsList = pidsList; + } + + public String getPnames() { + return pnames; + } + + public void setPnames(String pnames) { + this.pnames = pnames; + } + + public void buildTable() { + stateStr = DictMap.value(DictMap.KEY_USER_STATUS, getState()); + } +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/MonitorInfo.java b/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/MonitorInfo.java new file mode 100644 index 0000000..77aa49f --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/MonitorInfo.java @@ -0,0 +1,58 @@ +package com.enzhico.jwt.dao.entity; + +import com.enzhico.jwt.common.constant.DictMap; +import com.enzhico.jwt.common.dao.entity.Pos; +import com.enzhico.jwt.common.dao.entity.PosMonitor; + +import java.io.Serializable; + +/** + * Description: 机具信息 + */ +public class MonitorInfo extends PosMonitor implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 机具状态 + */ + private String onlineStateStr; + + /** + * 机具IMEI码 + */ + private String imei; + + /** + * 机具型号 + */ + private String series; + + public String getOnlineStateStr() { + return onlineStateStr; + } + + public void setOnlineStateStr(String onlineStateStr) { + this.onlineStateStr = onlineStateStr; + } + + public String getImei() { + return imei; + } + + public void setImei(String imei) { + this.imei = imei; + } + + public String getSeries() { + return series; + } + + public void setSeries(String series) { + this.series = series; + } + + public void buildTable() { + onlineStateStr = DictMap.value(DictMap.KEY_POS_MONITOR_STATUS, getOnlineState()); + } +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/PosGroupInfo.java b/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/PosGroupInfo.java new file mode 100644 index 0000000..40e284e --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/PosGroupInfo.java @@ -0,0 +1,40 @@ +package com.enzhico.jwt.dao.entity; + +import com.enzhico.jwt.common.constant.DictMap; +import com.enzhico.jwt.common.dao.entity.Pos; + +import java.io.Serializable; + +/** + * Description: 以网点为分组的机具信息 + */ +public class PosGroupInfo extends Pos implements Serializable { + + private static final long serialVersionUID = 1L; + /** + * 归属项目名称 + */ + private String projectName; + + /** + * 机具数量(网点分组) + */ + private Integer posCount; + + public String getProjectName() { + return projectName; + } + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + public Integer getPosCount() { + return posCount; + } + + public void setPosCount(Integer posCount) { + this.posCount = posCount; + } + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/PosInfo.java b/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/PosInfo.java new file mode 100644 index 0000000..e0df74b --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/PosInfo.java @@ -0,0 +1,45 @@ +package com.enzhico.jwt.dao.entity; + +import com.enzhico.jwt.common.constant.DictMap; +import com.enzhico.jwt.common.dao.entity.Manager; +import com.enzhico.jwt.common.dao.entity.Pos; + +import java.io.Serializable; +import java.util.List; + +/** + * Description: 机具信息 + */ +public class PosInfo extends Pos implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 机具状态 + */ + private String posStateStr; + /** + * 归属项目名称 + */ + private String projectName; + + public String getPosStateStr() { + return posStateStr; + } + + public void setPosStateStr(String posStateStr) { + this.posStateStr = posStateStr; + } + + public String getProjectName() { + return projectName; + } + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + public void buildTable() { + posStateStr = DictMap.value(DictMap.KEY_POS_POS_STATUS, getPosState()); + } +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/PublishParam.java b/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/PublishParam.java new file mode 100644 index 0000000..81b14f7 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/PublishParam.java @@ -0,0 +1,76 @@ +package com.enzhico.jwt.dao.entity; + +import org.springframework.web.multipart.MultipartFile; + +/** + * APP版本发布参数 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/10 + */ +public class PublishParam { + private String name; + private String version; + private String applicationId; + private String tips; + private Integer publishRange; + private String grayIds; + private MultipartFile file; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getTips() { + return tips; + } + + public void setTips(String tips) { + this.tips = tips; + } + + public Integer getPublishRange() { + return publishRange; + } + + public void setPublishRange(Integer publishRange) { + this.publishRange = publishRange; + } + + public String getGrayIds() { + return grayIds; + } + + public void setGrayIds(String grayIds) { + this.grayIds = grayIds; + } + + public MultipartFile getFile() { + return file; + } + + public void setFile(MultipartFile file) { + this.file = file; + } + + public String getApplicationId() { + return applicationId; + } + + public void setApplicationId(String applicationId) { + this.applicationId = applicationId; + } +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/SearchApp.java b/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/SearchApp.java new file mode 100644 index 0000000..c5e5f4e --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/SearchApp.java @@ -0,0 +1,106 @@ +package com.enzhico.jwt.dao.entity; + +import java.util.Date; +import java.util.List; + +/** + * 查询APP列表参数 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/8 + */ +public class SearchApp { + private Integer pageNumber; + private Integer pageSize; + + private String appName; + private String appVersion; + private Integer projectId; + private Integer publishRange; + private String publishtimeRange; + private Date publishTimeStart; + private Date publishTimeEnd; + + private List pidList; + + public Integer getPageNumber() { + return pageNumber; + } + + public void setPageNumber(Integer pageNumber) { + this.pageNumber = pageNumber; + } + + public Integer getPageSize() { + return pageSize; + } + + public void setPageSize(Integer pageSize) { + this.pageSize = pageSize; + } + + public Integer getProjectId() { + return projectId; + } + + public void setProjectId(Integer projectId) { + this.projectId = projectId; + } + + public String getAppName() { + return appName; + } + + public void setAppName(String appName) { + this.appName = appName; + } + + public String getAppVersion() { + return appVersion; + } + + public void setAppVersion(String appVersion) { + this.appVersion = appVersion; + } + + public Integer getPublishRange() { + return publishRange; + } + + public void setPublishRange(Integer publishRange) { + this.publishRange = publishRange; + } + + public Date getPublishTimeStart() { + return publishTimeStart; + } + + public void setPublishTimeStart(Date publishTimeStart) { + this.publishTimeStart = publishTimeStart; + } + + public Date getPublishTimeEnd() { + return publishTimeEnd; + } + + public void setPublishTimeEnd(Date publishTimeEnd) { + this.publishTimeEnd = publishTimeEnd; + } + + public String getPublishtimeRange() { + return publishtimeRange; + } + + public void setPublishtimeRange(String publishtimeRange) { + this.publishtimeRange = publishtimeRange; + } + + public List getPidList() { + return pidList; + } + + public void setPidList(List pidList) { + this.pidList = pidList; + } +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/SearchMonitor.java b/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/SearchMonitor.java new file mode 100644 index 0000000..fe3e0ba --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/SearchMonitor.java @@ -0,0 +1,77 @@ +package com.enzhico.jwt.dao.entity; + +import java.util.List; + +/** + * SearchUser + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/8 + */ +public class SearchMonitor { + private Integer pageNumber; + private Integer pageSize; + private String imei; + private String location; + private Integer projectId; + private Integer onlineState; + + private List pidList; + + public Integer getPageNumber() { + return pageNumber; + } + + public void setPageNumber(Integer pageNumber) { + this.pageNumber = pageNumber; + } + + public Integer getPageSize() { + return pageSize; + } + + public void setPageSize(Integer pageSize) { + this.pageSize = pageSize; + } + + public String getImei() { + return imei; + } + + public void setImei(String imei) { + this.imei = imei; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + + public Integer getProjectId() { + return projectId; + } + + public void setProjectId(Integer projectId) { + this.projectId = projectId; + } + + public Integer getOnlineState() { + return onlineState; + } + + public void setOnlineState(Integer onlineState) { + this.onlineState = onlineState; + } + + public List getPidList() { + return pidList; + } + + public void setPidList(List pidList) { + this.pidList = pidList; + } +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/SearchPos.java b/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/SearchPos.java new file mode 100644 index 0000000..18d1fd0 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/SearchPos.java @@ -0,0 +1,69 @@ +package com.enzhico.jwt.dao.entity; + +import java.util.Date; +import java.util.List; + +/** + * SearchUser + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/8 + */ +public class SearchPos { + private Integer pageNumber; + private Integer pageSize; + private String imei; + private String location; + private Integer projectId; + + private List pidList; + + public Integer getPageNumber() { + return pageNumber; + } + + public void setPageNumber(Integer pageNumber) { + this.pageNumber = pageNumber; + } + + public Integer getPageSize() { + return pageSize; + } + + public void setPageSize(Integer pageSize) { + this.pageSize = pageSize; + } + + public String getImei() { + return imei; + } + + public void setImei(String imei) { + this.imei = imei; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + + public Integer getProjectId() { + return projectId; + } + + public void setProjectId(Integer projectId) { + this.projectId = projectId; + } + + public List getPidList() { + return pidList; + } + + public void setPidList(List pidList) { + this.pidList = pidList; + } +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/SearchUser.java b/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/SearchUser.java new file mode 100644 index 0000000..ead9c58 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/SearchUser.java @@ -0,0 +1,85 @@ +package com.enzhico.jwt.dao.entity; + +import java.util.Date; + +/** + * SearchUser + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/8 + */ +public class SearchUser { + private Integer pageNumber; + private Integer pageSize; + private String username; + private String phone; + private Integer state; + private String createdTime; + private Date createdTimeStart; + private Date createdTimeEnd; + + public Integer getPageNumber() { + return pageNumber; + } + + public void setPageNumber(Integer pageNumber) { + this.pageNumber = pageNumber; + } + + public Integer getPageSize() { + return pageSize; + } + + public void setPageSize(Integer pageSize) { + this.pageSize = pageSize; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public String getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(String createdTime) { + this.createdTime = createdTime; + } + + public Date getCreatedTimeStart() { + return createdTimeStart; + } + + public void setCreatedTimeStart(Date createdTimeStart) { + this.createdTimeStart = createdTimeStart; + } + + public Date getCreatedTimeEnd() { + return createdTimeEnd; + } + + public void setCreatedTimeEnd(Date createdTimeEnd) { + this.createdTimeEnd = createdTimeEnd; + } +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/SysRole.java b/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/SysRole.java new file mode 100644 index 0000000..872d893 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/dao/entity/SysRole.java @@ -0,0 +1,29 @@ +package com.enzhico.jwt.dao.entity; + +import com.enzhico.jwt.common.dao.entity.Permission; +import com.enzhico.jwt.common.dao.entity.Role; + +import java.io.Serializable; +import java.util.List; + +/** + * Description : 角色信息 + */ +public class SysRole extends Role implements Serializable { + + private static final long serialVersionUID = 1L; + + // 拥有的权限列表 + private List permissions; + + public SysRole() { + } + + public List getPermissions() { + return permissions; + } + + public void setPermissions(List permissions) { + this.permissions = permissions; + } +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/dao/repository/ApiDao.java b/app-manage-api/src/main/java/com/enzhico/jwt/dao/repository/ApiDao.java new file mode 100644 index 0000000..8e5f44b --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/dao/repository/ApiDao.java @@ -0,0 +1,26 @@ +package com.enzhico.jwt.dao.repository; + +import com.enzhico.jwt.api.model.VersionParam; +import com.enzhico.jwt.api.model.VersionResult; +import org.apache.ibatis.annotations.Param; + +/** + * Description : + */ +public interface ApiDao { + /** + * 查询版本发布 + * + * @param param + * @return + */ + VersionResult selectPublishCount(VersionParam param); + + /** + * 根据imei码获取session id + * + * @param imei imei码 + * @return session id + */ + String selectSessionId(@Param("imei") String imei); +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/dao/repository/ManagerInfoDao.java b/app-manage-api/src/main/java/com/enzhico/jwt/dao/repository/ManagerInfoDao.java new file mode 100644 index 0000000..0fa05b8 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/dao/repository/ManagerInfoDao.java @@ -0,0 +1,20 @@ +package com.enzhico.jwt.dao.repository; + +import com.baomidou.mybatisplus.plugins.pagination.Pagination; +import com.enzhico.jwt.common.dao.repository.ManagerMapper; +import com.enzhico.jwt.dao.entity.ManagerInfo; +import com.enzhico.jwt.dao.entity.SearchUser; + +import java.util.List; +import java.util.Map; + +/** + * Description : + */ +public interface ManagerInfoDao extends ManagerMapper { + ManagerInfo findByUsername(String username); + + List selectUsers(Pagination page, SearchUser param); + + ManagerInfo selectUser(Integer id); +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/dao/repository/mapping/ApiDao.xml b/app-manage-api/src/main/java/com/enzhico/jwt/dao/repository/mapping/ApiDao.xml new file mode 100644 index 0000000..6a58aea --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/dao/repository/mapping/ApiDao.xml @@ -0,0 +1,32 @@ + + + + + + + + + + \ No newline at end of file diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/dao/repository/mapping/ManagerInfoDao.xml b/app-manage-api/src/main/java/com/enzhico/jwt/dao/repository/mapping/ManagerInfoDao.xml new file mode 100644 index 0000000..f520468 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/dao/repository/mapping/ManagerInfoDao.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/exception/ForbiddenUserException.java b/app-manage-api/src/main/java/com/enzhico/jwt/exception/ForbiddenUserException.java new file mode 100644 index 0000000..c5e5e0f --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/exception/ForbiddenUserException.java @@ -0,0 +1,14 @@ +package com.enzhico.jwt.exception; + +import org.apache.shiro.authc.AuthenticationException; + +/** + * 禁用用户异常 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/12 + */ +public class ForbiddenUserException extends AuthenticationException { + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/exception/UnauthorizedException.java b/app-manage-api/src/main/java/com/enzhico/jwt/exception/UnauthorizedException.java new file mode 100644 index 0000000..7e19f19 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/exception/UnauthorizedException.java @@ -0,0 +1,18 @@ +package com.enzhico.jwt.exception; + +/** + * UnauthorizedException + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/22 + */ +public class UnauthorizedException extends RuntimeException { + public UnauthorizedException(String msg) { + super(msg); + } + + public UnauthorizedException() { + super(); + } +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/handler/MessageEventHandler.java b/app-manage-api/src/main/java/com/enzhico/jwt/handler/MessageEventHandler.java new file mode 100644 index 0000000..85561f4 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/handler/MessageEventHandler.java @@ -0,0 +1,344 @@ +package com.enzhico.jwt.handler; + +import com.corundumstudio.socketio.AckRequest; +import com.corundumstudio.socketio.SocketIOClient; +import com.corundumstudio.socketio.SocketIOServer; +import com.corundumstudio.socketio.annotation.OnConnect; +import com.corundumstudio.socketio.annotation.OnDisconnect; +import com.corundumstudio.socketio.annotation.OnEvent; +import com.enzhico.jwt.api.model.*; +import com.enzhico.jwt.common.dao.entity.Pos; +import com.enzhico.jwt.common.dao.entity.Project; +import com.enzhico.jwt.common.util.JWTUtil; +import com.enzhico.jwt.service.ApiService; +import io.socket.client.Socket; +import org.apache.commons.lang3.StringUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import java.util.Date; +import java.util.UUID; + +/** + * 消息事件处理器 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/19 + */ +@Component +public class MessageEventHandler { + + private final SocketIOServer server; + private final ApiService apiService; + + private static final Logger logger = LoggerFactory.getLogger(MessageEventHandler.class); + + @Autowired + public MessageEventHandler(SocketIOServer server, ApiService apiService) { + this.server = server; + this.apiService = apiService; + } + + //添加connect事件,当客户端发起连接时调用 + @OnConnect + public void onConnect(SocketIOClient client) { + if (client != null) { + String token = client.getHandshakeData().getSingleUrlParam("token"); + String applicationId = JWTUtil.getSocketAppid(token); + String imei = JWTUtil.getSocketImei(token); + String sessionId = client.getSessionId().toString(); + logger.info("连接成功, applicationId=" + applicationId + ", imei=" + imei + ", sessionId=" + sessionId); + client.joinRoom(applicationId); + // 更新POS监控,sessionId和状态 + ReportParam param = new ReportParam(); + param.setImei(imei); + apiService.updateJustState(param, sessionId, 1); + } else { + logger.error("客户端为空"); + } + } + + //添加@OnDisconnect事件,客户端断开连接时调用,刷新客户端信息 + @OnDisconnect + public void onDisconnect(SocketIOClient client) { + String token = client.getHandshakeData().getSingleUrlParam("token"); + String imei = JWTUtil.getSocketImei(token); + logger.info("客户端断开连接, imei=" + imei + ", sessionId=" + client.getSessionId().toString()); + // 更新POS监控,sessionId和状态 + ReportParam param = new ReportParam(); + param.setImei(imei); + apiService.updateJustState(param, "", 2); + client.disconnect(); + } + + // 消息接收入口 + @OnEvent(value = Socket.EVENT_MESSAGE) + public void onEvent(SocketIOClient client, AckRequest ackRequest, Object data) { + logger.info("接收到客户端消息"); + if (ackRequest.isAckRequested()) { + // send ack response with data to client + ackRequest.sendAckData("服务器回答Socket.EVENT_MESSAGE", "好的"); + } + } + + // 广播消息接收入口 + @OnEvent(value = "broadcast") + public void onBroadcast(SocketIOClient client, AckRequest ackRequest, Object data) { + logger.info("接收到广播消息"); + // 房间广播消息 + String token = client.getHandshakeData().getSingleUrlParam("token"); + String room = JWTUtil.getSocketAppid(token); + server.getRoomOperations(room).sendEvent("broadcast", "广播啦啦啦啦"); + } + + /** + * 入网绑定查询接口 + * @param client 客户端 + * @param ackRequest 回执消息 + * @param imei imei码 + */ + @OnEvent(value = "askJoin") + public void onAskJoin(SocketIOClient client, AckRequest ackRequest, String imei) { + logger.info("入网绑定查询接口,imei=" + imei); + JoinBindResponse result = searchJoin(imei); + ackRequest.sendAckData(result); + } + + /** + * 执行入网绑定接口 + * @param client 客户端 + * @param ackRequest 回执消息 + * @param param 入网绑定参数 + */ + @OnEvent(value = "doJoin") + public void onDoJoin(SocketIOClient client, AckRequest ackRequest, PosParam param) { + logger.info("执行入网绑定接口 start...."); + BaseResponse result = postJoin(param); + ackRequest.sendAckData(result); + } + + /** + * 绑定网点接口 + * @param client 客户端 + * @param ackRequest 回执消息 + * @param param 绑定网点参数 + */ + @OnEvent(value = "doBind") + public void onDoBind(SocketIOClient client, AckRequest ackRequest,BindParam param) { + logger.info("绑定网点接口 start...."); + BaseResponse result = postBind(param); + ackRequest.sendAckData(result); + } + + /** + * 报告地址接口 + * @param client 客户端 + * @param ackRequest 回执消息 + * @param param 报告地址参数 + */ + @OnEvent(value = "doReport") + public void onDoReport(SocketIOClient client, AckRequest ackRequest, ReportParam param) { + logger.info("报告地址接口 start...."); + BaseResponse result = postReport(param); + ackRequest.sendAckData(result); + } + + /** + * 版本检查接口 + * @param client 客户端 + * @param ackRequest 回执消息 + * @param param 报告地址参数 + */ + @OnEvent(value = "askVersion") + public void onAskVersion(SocketIOClient client, AckRequest ackRequest, VersionParam param) { + logger.info("版本检查接口 start...."); + VersionResult result = apiService.selectPublishCount(param);; + ackRequest.sendAckData(result); + } + + /*----------------------------------------下面是私有方法-------------------------------------*/ + private JoinBindResponse searchJoin(String imei) { + JoinBindResponse result = new JoinBindResponse(); + int posCount = apiService.selectCount(imei); + if (posCount > 0) { + // 如果入网了再去查询是否绑定了网点 + int bindCount = apiService.selectBindCount(imei); + Pos pos = apiService.selectByImei(imei); + result.setPosState(pos.getPosState()); + if (bindCount == 0) { + result.setSuccess(false); + result.setCode(2); + result.setMsg("已入网但尚未绑定网点"); + } else { + result.setSuccess(true); + result.setCode(1); + result.setMsg("已入网并绑定了网点"); + } + } else { + result.setSuccess(false); + result.setCode(3); + result.setMsg("未入网"); + } + return result; + } + + private BaseResponse postJoin(PosParam posParam) { + BaseResponse result = new BaseResponse(); + // imei码约束检查 + if (StringUtils.isEmpty(posParam.getImei()) || posParam.getImei().length() > 32) { + result.setSuccess(false); + result.setMsg("IMEI码长度不是1-32位,入网失败。"); + return result; + } + // 序列号SN约束检查 + if (StringUtils.isEmpty(posParam.getSn()) || posParam.getSn().length() > 64) { + result.setSuccess(false); + result.setMsg("序列号长度不是1-64位,入网失败。"); + return result; + } + // 机具型号约束检查 + if (StringUtils.isEmpty(posParam.getSeries()) || posParam.getSeries().length() > 32) { + result.setSuccess(false); + result.setMsg("机具型号不是1-32位,入网失败。"); + return result; + } + // Android版本约束检查 + if (StringUtils.isEmpty(posParam.getAndroidVersion()) || posParam.getAndroidVersion().length() > 32) { + result.setSuccess(false); + result.setMsg("Android版本号不是1-32位,入网失败。"); + return result; + } + // 版本号约束检查 + if (StringUtils.isEmpty(posParam.getVersion()) || posParam.getVersion().length() > 32) { + result.setSuccess(false); + result.setMsg("版本号不是1-32位,入网失败。"); + return result; + } + // 归属网点约束检查 + if (StringUtils.isEmpty(posParam.getLocation()) || posParam.getLocation().length() > 64) { + result.setSuccess(false); + result.setMsg("归属网点不是1-64位,入网失败。"); + return result; + } + // 产权方约束检查 + if (StringUtils.isEmpty(posParam.getOwner()) || posParam.getOwner().length() > 64) { + result.setSuccess(false); + result.setMsg("产权方不是1-64位,入网失败。"); + return result; + } + // 应用ID约束检查 + if (StringUtils.isEmpty(posParam.getApplicationId()) || posParam.getApplicationId().length() > 64) { + result.setSuccess(false); + result.setMsg("应用ID不是1-64位,入网失败。"); + return result; + } + // 备注约束检查 + if (StringUtils.isNotEmpty(posParam.getTips()) && posParam.getTips().length() > 255) { + result.setSuccess(false); + result.setMsg("备注超过255个字符,入网失败。"); + return result; + } + Pos pos = new Pos(); + Date now = new Date(); + pos.setJointime(now); + pos.setBindtime(now); + BeanUtils.copyProperties(posParam, pos); + // 根据applicationId设置归属项目ID + Project project = apiService.selectProjectByApplicationId(posParam.getApplicationId()); + if (project == null) { + result.setSuccess(false); + result.setMsg("Application Id不正确,入网失败。"); + return result; + } + // 重复检查 + int posCount = apiService.selectCount(posParam.getImei()); + if (posCount > 0) { + result.setSuccess(false); + result.setMsg("入网失败,该机具之前已经入网了。"); + return result; + } + // 插入一条新纪录 + pos.setProjectId(project.getId()); + int insert = apiService.insertPos(pos); + if (insert > 0) { + result.setSuccess(true); + result.setMsg("入网成功"); + return result; + } else { + result.setSuccess(false); + result.setMsg("入网失败,请联系管理员。"); + return result; + } + } + + private BaseResponse postBind(BindParam bindParam) { + BaseResponse result = new BaseResponse(); + // imei码约束检查 + if (StringUtils.isEmpty(bindParam.getImei()) || bindParam.getImei().length() > 32) { + result.setSuccess(false); + result.setMsg("IMEI码长度不是1-32位,绑定网点失败。"); + return result; + } + // 归属网点约束检查 + if (StringUtils.isEmpty(bindParam.getLocation()) || bindParam.getLocation().length() > 64) { + result.setSuccess(false); + result.setMsg("归属网点不是1-64位,绑定网点失败。"); + return result; + } + + Pos pos = apiService.selectByImei(bindParam.getImei()); + if (pos == null) { + result.setSuccess(false); + result.setMsg("该POS机尚未入网。"); + return result; + } + + Pos pos2 = apiService.selectBindByImei(bindParam.getImei()); + if (pos2 != null) { + result.setSuccess(false); + result.setMsg("该POS机已经绑定了网点,请先解绑。"); + return result; + } + + pos.setLocation(bindParam.getLocation()); + Date now = new Date(); + pos.setBindtime(now); + pos.setUpdatedTime(now); + apiService.bindLocation(pos); + + result.setSuccess(true); + result.setMsg("绑定网点成功"); + return result; + } + + private BaseResponse postReport(ReportParam param) { + BaseResponse result = new BaseResponse(); + // IMEI码约束检查 + if (StringUtils.isEmpty(param.getImei()) || param.getImei().length() > 32) { + result.setSuccess(false); + result.setMsg("IMEI码不是1-32位,报告地址接口失败。"); + return result; + } + // 地址约束检查 + if (StringUtils.isEmpty(param.getLocation()) || param.getLocation().length() > 255) { + result.setSuccess(false); + result.setMsg("地址不是1-255位,报告地址接口失败。"); + return result; + } + + int r = apiService.report(param); + if (r > 0) { + result.setSuccess(true); + result.setMsg("报告地址成功"); + } else { + result.setSuccess(false); + result.setMsg("该POS机还没有入网,报告地址接口失败。"); + } + return result; + } + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/service/ApiService.java b/app-manage-api/src/main/java/com/enzhico/jwt/service/ApiService.java new file mode 100644 index 0000000..b7a6ca0 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/service/ApiService.java @@ -0,0 +1,264 @@ +package com.enzhico.jwt.service; + +import com.baomidou.mybatisplus.mapper.Condition; +import com.corundumstudio.socketio.SocketIOClient; +import com.corundumstudio.socketio.SocketIOServer; +import com.enzhico.jwt.api.model.ReportParam; +import com.enzhico.jwt.api.model.VersionParam; +import com.enzhico.jwt.api.model.VersionResult; +import com.enzhico.jwt.common.dao.entity.Pos; +import com.enzhico.jwt.common.dao.entity.PosHistory; +import com.enzhico.jwt.common.dao.entity.PosMonitor; +import com.enzhico.jwt.common.dao.entity.Project; +import com.enzhico.jwt.common.dao.repository.PosHistoryMapper; +import com.enzhico.jwt.common.dao.repository.PosMapper; +import com.enzhico.jwt.common.dao.repository.PosMonitorMapper; +import com.enzhico.jwt.common.dao.repository.ProjectMapper; +import com.enzhico.jwt.common.util.CommonUtil; +import com.enzhico.jwt.config.properties.MyProperties; +import com.enzhico.jwt.dao.repository.ApiDao; +import org.apache.commons.lang3.StringUtils; +import org.apache.ibatis.annotations.Param; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; +import java.util.UUID; + +/** + * 专门用来服务对外接口用Service + */ + +@Service +public class ApiService { + + private static final Logger logger = LoggerFactory.getLogger(ApiService.class); + + @Resource + private PosMapper posMapper; + @Resource + private PosHistoryMapper posHistoryMapper; + @Resource + private PosMonitorMapper posMonitorMapper; + @Resource + private ApiDao apiDao; + @Resource + private MyProperties myProperties; + @Resource + private ProjectMapper projectMapper; + @Resource + private SocketIOServer server; + + /** + * 根据IMEI码查询POS机是否已经入网 + * + * @param imei IMEI码 + * @return 数量 + */ + public int selectCount(String imei) { + return posMapper.selectCount(Condition.create().eq("imei", imei)); + } + + /** + * 根据IMEI码查找POS + * + * @param imei + * @return + */ + public Pos selectByImei(String imei) { + Pos p = new Pos(); + p.setImei(imei); + return posMapper.selectOne(p); + } + + /** + * 根据IMEI码查找绑定网点的POS + * + * @param imei + * @return + */ + public Pos selectBindByImei(String imei) { + Pos p = new Pos(); + p.setImei(imei); + List list = posMapper.selectList(Condition.create().eq("imei", imei).ne("location", "").isNotNull("location")); + return list != null && list.size() > 0 ? list.get(0) : null; + } + + /** + * 根据IMEI码查询POS机是否绑定了网点 + * + * @param imei IMEI码 + * @return 绑定数量 + */ + public int selectBindCount(String imei) { + return posMapper.selectCount(Condition.create().eq("imei", imei).isNotNull("location").ne("location", "")); + } + + /** + * 更新机具信息 + * + * @param pos + * @return + */ + public int bindLocation(Pos pos) { + // 先更新POS网点信息 + posMapper.updateById(pos); + + // 然后插入新的POS绑定历史记录 + PosHistory posHistory = new PosHistory(); + posHistory.setPosId(pos.getId()); + posHistory.setLocation(pos.getLocation()); + posHistory.setBindtime(pos.getBindtime()); + return posHistoryMapper.insert(posHistory); + } + + /** + * 执行POS机入网 + * + * @param param 参数 + * @return 结果 + */ + public int insertPos(Pos param) { + param.setPosState(1); + // 插入一条pos记录 + posMapper.insert(param); + // 插入一条历史记录 + PosHistory posHistory = new PosHistory(); + posHistory.setPosId(param.getId()); + posHistory.setLocation(param.getLocation()); + posHistory.setBindtime(new Date()); + return posHistoryMapper.insert(posHistory); + } + + /** + * 根据Application Id查询项目 + * + * @param applicationId Application Id + * @return 项目 + */ + public Project selectProjectByApplicationId(String applicationId) { + Project p = new Project(); + p.setApplicationId(applicationId); + return projectMapper.selectOne(p); + } + + /** + * 更新报告 + * + * @param param 报告参数 + * @return 结果 + */ + public int report(ReportParam param) { + Pos p = new Pos(); + p.setImei(param.getImei()); + Pos pos = posMapper.selectOne(p); + if (pos == null) { + return 0; + } + Date now = new Date(); + PosMonitor pmParam = new PosMonitor(); + pmParam.setPosId(pos.getId()); + PosMonitor posMonitor = posMonitorMapper.selectOne(pmParam); + if (posMonitor == null) { + PosMonitor plast = new PosMonitor(); + plast.setPosId(pos.getId()); + plast.setOnlineState(1); + plast.setReportTime(now); + plast.setReportLocation(param.getLocation()); + return posMonitorMapper.insert(plast); + } else { + posMonitor.setOnlineState(1); + posMonitor.setReportTime(now); + posMonitor.setUpdatedTime(now); + posMonitor.setReportLocation(param.getLocation()); + return posMonitorMapper.updateById(posMonitor); + } + } + + /** + * Just Update monitor state + * + * @param param report param + * @param sessionId session id. + * @param state 1:在线 2:离线. + * @return result + */ + public int updateJustState(ReportParam param, String sessionId, Integer state) { + Pos p = new Pos(); + p.setImei(param.getImei()); + Pos pos = posMapper.selectOne(p); + if (pos == null) { + return 0; + } + Date now = new Date(); + PosMonitor pmParam = new PosMonitor(); + pmParam.setPosId(pos.getId()); + PosMonitor posMonitor = posMonitorMapper.selectOne(pmParam); + if (posMonitor == null) { + PosMonitor plast = new PosMonitor(); + plast.setPosId(pos.getId()); + plast.setSessionId(sessionId); + plast.setOnlineState(state); + return posMonitorMapper.insert(plast); + } else { + posMonitor.setSessionId(sessionId); + posMonitor.setOnlineState(state); + posMonitor.setUpdatedTime(now); + return posMonitorMapper.updateById(posMonitor); + } + } + + /** + * 根据imei码获取session id + * + * @param imei imei码 + * @return sessionId + */ + public String selectSessionId(String imei) { + return apiDao.selectSessionId(imei); + } + + /** + * 查询版本发布 + * @param param 查询版本参数 + * @return 结果 + */ + public VersionResult selectPublishCount(VersionParam param) { + VersionResult r = apiDao.selectPublishCount(param); + if (r != null && CommonUtil.isNewer(r.getVersion(), param.getVersion())) { + r.setFindNew(true); + r.setDownloadUrl(myProperties.getApkUrlPrefix() + r.getAppName() + "_" + r.getVersion() + ".apk"); + } else { + r = new VersionResult(); + r.setFindNew(false); + } + return r; + } + + /** + * 给某个POS机推送网点解除绑定消息 + * @param imei imei码 + * @param location 解除的网点 + * @return error msg + */ + public String sendUnbind(String imei, String location) { + logger.info("开始给POS机推送解绑消息"); + // 先获取session id + String sessionId = selectSessionId(imei); + if (StringUtils.isEmpty(sessionId)) { + logger.error("找不到可用的sessionId"); + return "找不到可用的sessionId"; + } + SocketIOClient targetClient = this.server.getClient(UUID.fromString(sessionId)); + if (targetClient == null) { + logger.error("sessionId=" + sessionId + "在server中获取不到client"); + return "sessionId=" + sessionId + "在server中获取不到client"; + } + targetClient.sendEvent("unbind", location); + return null; + } + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/service/ManagerInfoService.java b/app-manage-api/src/main/java/com/enzhico/jwt/service/ManagerInfoService.java new file mode 100644 index 0000000..d438676 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/service/ManagerInfoService.java @@ -0,0 +1,204 @@ +package com.enzhico.jwt.service; + +import com.baomidou.mybatisplus.mapper.Condition; +import com.baomidou.mybatisplus.plugins.Page; +import com.enzhico.jwt.common.dao.entity.Manager; +import com.enzhico.jwt.common.dao.entity.Project; +import com.enzhico.jwt.common.dao.entity.ProjectUser; +import com.enzhico.jwt.common.dao.repository.ProjectMapper; +import com.enzhico.jwt.common.dao.repository.ProjectUserMapper; +import com.enzhico.jwt.dao.entity.ManagerInfo; +import com.enzhico.jwt.dao.entity.SearchUser; +import com.enzhico.jwt.dao.repository.ManagerInfoDao; +import com.enzhico.jwt.exception.ForbiddenUserException; +import com.enzhico.jwt.shiro.ShiroKit; +import org.apache.commons.lang3.StringUtils; +import org.apache.shiro.authc.UnknownAccountException; +import org.apache.shiro.crypto.hash.SimpleHash; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.*; + +/** + * 后台用户管理 + */ + +@Service +public class ManagerInfoService { + + @Resource + private ManagerInfoDao managerInfoDao; + @Resource + private ProjectMapper projectMapper; + @Resource + private ProjectUserMapper projectUserMapper; + + /** + * 通过名称查找用户 + * + * @param username + * @return + */ + public ManagerInfo findByUsername(String username) { + ManagerInfo managerInfo = managerInfoDao.findByUsername(username); + if (managerInfo == null) { + throw new UnknownAccountException(); + } + if (managerInfo.getState() == 2) { + throw new ForbiddenUserException(); + } + if (managerInfo.getPidsList() == null) { + managerInfo.setPidsList(Collections.singletonList(0)); + } else if (managerInfo.getPidsList().size() == 0) { + managerInfo.getPidsList().add(0); + } + return managerInfo; + } + + /** + * 检查用户名重复 + * + * @param username + * @return + */ + public int checkUsername(String username) { + return managerInfoDao.selectCount(Condition.create().eq("username", username)); + } + + /** + * 通过ID查找用户 + * + * @param id + * @return + */ + public ManagerInfo selectUser(Integer id) { + ManagerInfo managerInfo = managerInfoDao.selectUser(id); + List li = new ArrayList<>(); + if (StringUtils.isNotEmpty(managerInfo.getPids())) { + for (String s : managerInfo.getPids().split(",")) { + li.add(Integer.parseInt(s)); + } + } + managerInfo.setPidsList(li); + return managerInfo; + } + + /** + * 所有项目列表 + * + * @return + */ + public List allProjects() { + return projectMapper.selectList(null); + } + + /** + * 执行添加用户 + * + * @param manager + * @return + */ + public int addUser(ManagerInfo manager) { + String salt = ShiroKit.getRandomSalt(16); + //进行散列 + SimpleHash hash = new SimpleHash("md5", "12345678", manager.getUsername() + salt, 2); + manager.setSalt(salt); + manager.setPassword(hash.toHex()); + managerInfoDao.insert(manager); + + // 更新项目用户关联表 + if (StringUtils.isNotEmpty(manager.getPids())) { + for (String pid : manager.getPids().split(",")) { + ProjectUser projectUser = new ProjectUser(); + projectUser.setUserId(manager.getId()); + projectUser.setProjectId(Integer.valueOf(pid)); + projectUserMapper.insert(projectUser); + } + } + return 1; + } + + /** + * 执行更新用户 + * + * @param manager + * @return + */ + public int editUser(ManagerInfo manager) { + managerInfoDao.updateById(manager); + // 更新项目用户关联表 + if (StringUtils.isNotEmpty(manager.getPids())) { + // 先把该用户的项目关联删了 + projectUserMapper.delete(Condition.create().eq("user_id", manager.getId())); + // 然后插入选择的项目关系 + for (String pid : manager.getPids().split(",")) { + ProjectUser projectUser = new ProjectUser(); + projectUser.setUserId(manager.getId()); + projectUser.setProjectId(Integer.valueOf(pid)); + projectUserMapper.insert(projectUser); + } + } + return 1; + } + + /** + * 执行重置密码 + * + * @param id 用户ID + * @return + */ + public int resetPassword(Integer id, String username) { + String salt = ShiroKit.getRandomSalt(16); + //进行散列 + SimpleHash hash = new SimpleHash("md5", "12345678", username + salt, 2); + String password = hash.toHex(); + Manager p = new Manager(); + p.setId(id); + p.setPassword(password); + p.setSalt(salt); + p.setUpdatedTime(new Date()); + return managerInfoDao.updateById(p); + } + + /** + * 执行删除用户 + * + * @param id 用户ID + * @return + */ + public int deleteUer(Integer id) { + return managerInfoDao.deleteById(id); + } + + /** + * 修改密码 + * + * @param username 用户名 + * @param password 加密后的密码 + * @return result + */ + public int updatePassword(String username, String password) { + Manager v = new Manager(); + v.setPassword(password); + v.setUpdatedTime(new Date()); + return managerInfoDao.update(v, Condition.create().eq("username", username)); + } + + /** + * 分页查询用户 + * + * @param page + * @param searchUser + * @return + */ + public List searchUsers(Page page, SearchUser searchUser) { + List list = managerInfoDao.selectUsers(page, searchUser); + for (ManagerInfo managerInfo : list) { + managerInfo.buildTable(); + } + return list; + } + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/shiro/JWTFilter.java b/app-manage-api/src/main/java/com/enzhico/jwt/shiro/JWTFilter.java new file mode 100644 index 0000000..816f036 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/shiro/JWTFilter.java @@ -0,0 +1,94 @@ +package com.enzhico.jwt.shiro; + +import org.apache.shiro.web.filter.authc.BasicHttpAuthenticationFilter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; +import org.springframework.web.bind.annotation.RequestMethod; + +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +public class JWTFilter extends BasicHttpAuthenticationFilter { + + private Logger LOGGER = LoggerFactory.getLogger(this.getClass()); + + /** + * 判断用户是否想要登入。 + * 检测header里面是否包含Authorization字段即可 + */ + @Override + protected boolean isLoginAttempt(ServletRequest request, ServletResponse response) { + HttpServletRequest req = (HttpServletRequest) request; + String authorization = req.getHeader("Authorization"); + return authorization != null; + } + + /** + * + */ + @Override + protected boolean executeLogin(ServletRequest request, ServletResponse response) throws Exception { + HttpServletRequest httpServletRequest = (HttpServletRequest) request; + String authorization = httpServletRequest.getHeader("Authorization"); + JWTToken token = new JWTToken(authorization); + // 提交给realm进行登入,如果错误他会抛出异常并被捕获 + getSubject(request, response).login(token); + // 如果没有抛出异常则代表登入成功,返回true + return true; + } + + /** + * 这里我们详细说明下为什么最终返回的都是true,即允许访问 + * 例如我们提供一个地址 GET /article + * 登入用户和游客看到的内容是不同的 + * 如果在这里返回了false,请求会被直接拦截,用户看不到任何东西 + * 所以我们在这里返回true,Controller中可以通过 subject.isAuthenticated() 来判断用户是否登入 + * 如果有些资源只有登入用户才能访问,我们只需要在方法上面加上 @RequiresAuthentication 注解即可 + * 但是这样做有一个缺点,就是不能够对GET,POST等请求进行分别过滤鉴权(因为我们重写了官方的方法),但实际上对应用影响不大 + */ + @Override + protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) { + if (isLoginAttempt(request, response)) { + try { + executeLogin(request, response); + } catch (Exception e) { + response401(request, response); + } + } + return true; + } + + /** + * 对跨域提供支持 + */ + @Override + protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception { + HttpServletRequest httpServletRequest = (HttpServletRequest) request; + HttpServletResponse httpServletResponse = (HttpServletResponse) response; + httpServletResponse.setHeader("Access-control-Allow-Origin", httpServletRequest.getHeader("Origin")); + httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS,PUT,DELETE"); + httpServletResponse.setHeader("Access-Control-Allow-Headers", httpServletRequest.getHeader("Access-Control-Request-Headers")); + // 跨域时会首先发送一个option请求,这里我们给option请求直接返回正常状态 + if (httpServletRequest.getMethod().equals(RequestMethod.OPTIONS.name())) { + httpServletResponse.setStatus(HttpStatus.OK.value()); + return false; + } + return super.preHandle(request, response); + } + + /** + * 将非法请求跳转到 /401 + */ + private void response401(ServletRequest req, ServletResponse resp) { + try { + HttpServletResponse httpServletResponse = (HttpServletResponse) resp; + httpServletResponse.sendRedirect("/401"); + } catch (IOException e) { + LOGGER.error(e.getMessage()); + } + } +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/shiro/JWTToken.java b/app-manage-api/src/main/java/com/enzhico/jwt/shiro/JWTToken.java new file mode 100644 index 0000000..1358de1 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/shiro/JWTToken.java @@ -0,0 +1,23 @@ +package com.enzhico.jwt.shiro; + +import org.apache.shiro.authc.AuthenticationToken; + +public class JWTToken implements AuthenticationToken { + + // 密钥 + private String token; + + public JWTToken(String token) { + this.token = token; + } + + @Override + public Object getPrincipal() { + return token; + } + + @Override + public Object getCredentials() { + return token; + } +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/shiro/MyShiroRealm.java b/app-manage-api/src/main/java/com/enzhico/jwt/shiro/MyShiroRealm.java new file mode 100644 index 0000000..72b3d30 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/shiro/MyShiroRealm.java @@ -0,0 +1,121 @@ +package com.enzhico.jwt.shiro; + +import com.enzhico.jwt.common.dao.entity.Permission; +import com.enzhico.jwt.common.util.JWTUtil; +import com.enzhico.jwt.dao.entity.ManagerInfo; +import com.enzhico.jwt.dao.entity.SysRole; +import com.enzhico.jwt.service.ManagerInfoService; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.AuthenticationInfo; +import org.apache.shiro.authc.AuthenticationToken; +import org.apache.shiro.authc.SimpleAuthenticationInfo; +import org.apache.shiro.authz.AuthorizationInfo; +import org.apache.shiro.authz.SimpleAuthorizationInfo; +import org.apache.shiro.realm.AuthorizingRealm; +import org.apache.shiro.subject.PrincipalCollection; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * Description : 身份校验核心类 + */ + +public class MyShiroRealm extends AuthorizingRealm { + + private static final Logger _logger = LoggerFactory.getLogger(MyShiroRealm.class); + + @Autowired + ManagerInfoService managerInfoService; + + /** + * JWT签名密钥 + */ + public static final String SECRET = "9281e268b77b7c439a20b46fd1483b9a"; + + /** + * 必须重写此方法,不然Shiro会报错 + */ + @Override + public boolean supports(AuthenticationToken token) { + return token instanceof JWTToken; + } + + /** + * 认证信息(身份验证) + * Authentication 是用来验证用户身份 + * + * @param auth + * @return + * @throws AuthenticationException + */ + @Override + protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken auth) + throws AuthenticationException { + _logger.info("MyShiroRealm.doGetAuthenticationInfo()"); + + String token = (String) auth.getCredentials(); + // 解密获得username,用于和数据库进行对比 + String username = JWTUtil.getUsername(token); + if (username == null) { + throw new AuthenticationException("token invalid"); + } + + //通过username从数据库中查找 ManagerInfo对象 + //实际项目中,这里可以根据实际情况做缓存,如果不做,Shiro自己也是有时间间隔机制,2分钟内不会重复执行该方法 + ManagerInfo managerInfo = managerInfoService.findByUsername(username); + + if (managerInfo == null) { + throw new AuthenticationException("用户不存在!"); + } + + if (!JWTUtil.verify(token, username, managerInfo.getPassword())) { + throw new AuthenticationException("Token认证失败"); + } + + return new SimpleAuthenticationInfo(token, token, "my_realm"); + } + + /** + * 此方法调用hasRole,hasPermission的时候才会进行回调. + *

+ * 权限信息.(授权): + * 1、如果用户正常退出,缓存自动清空; + * 2、如果用户非正常退出,缓存自动清空; + * 3、如果我们修改了用户的权限,而用户不退出系统,修改的权限无法立即生效。 + * (需要手动编程进行实现;放在service进行调用) + * 在权限修改后调用realm中的方法,realm已经由spring管理,所以从spring中获取realm实例,调用clearCached方法; + * :Authorization 是授权访问控制,用于对用户进行的操作授权,证明该用户是否允许进行当前操作,如访问某个链接,某个资源文件等。 + * + * @param principals + * @return + */ + @Override + protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { + /* + * 当没有使用缓存的时候,不断刷新页面的话,这个代码会不断执行, + * 当其实没有必要每次都重新设置权限信息,所以我们需要放到缓存中进行管理; + * 当放到缓存中时,这样的话,doGetAuthorizationInfo就只会执行一次了, + * 缓存过期之后会再次执行。 + */ + _logger.info("权限配置-->MyShiroRealm.doGetAuthorizationInfo()"); + String username = JWTUtil.getUsername(principals.toString()); + + // 下面的可以使用缓存提升速度 + ManagerInfo managerInfo = managerInfoService.findByUsername(username); + + SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); + + //设置相应角色的权限信息 + for (SysRole role : managerInfo.getRoles()) { + //设置角色 + authorizationInfo.addRole(role.getRole()); + for (Permission p : role.getPermissions()) { + //设置权限 + authorizationInfo.addStringPermission(p.getPermission()); + } + } + return authorizationInfo; + } + +} diff --git a/app-manage-api/src/main/java/com/enzhico/jwt/shiro/ShiroKit.java b/app-manage-api/src/main/java/com/enzhico/jwt/shiro/ShiroKit.java new file mode 100644 index 0000000..cb9afb3 --- /dev/null +++ b/app-manage-api/src/main/java/com/enzhico/jwt/shiro/ShiroKit.java @@ -0,0 +1,187 @@ +/** + * Copyright (c) 2015-2017, Chill Zhuang 庄骞 (smallchill@163.com). + *

+ * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

+ * http://www.apache.org/licenses/LICENSE-2.0 + *

+ * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.enzhico.jwt.shiro; + +import com.enzhico.jwt.dao.entity.ManagerInfo; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.crypto.SecureRandomNumberGenerator; +import org.apache.shiro.crypto.hash.SimpleHash; +import org.apache.shiro.session.Session; +import org.apache.shiro.subject.Subject; + +/** + * shiro工具类 + * + * @author dafei, Chill Zhuang + */ +public class ShiroKit { + + private static final String NAMES_DELIMETER = ","; + + /** + * 散列算法 + */ + public final static String HASH_ALGORITHM_NAME = "MD5"; + + /** + * 循环次数 + */ + public final static int HASH_ITERATIONS = 2; + + /** + * shiro密码加密工具类 + * + * @param credentials 密码 + * @param saltSource 密码盐 + * @return + */ + public static String md5(String credentials, String saltSource) { + return new SimpleHash(HASH_ALGORITHM_NAME, credentials, saltSource, HASH_ITERATIONS).toHex(); + } + + /** + * 获取随机盐值 + * + * @param length 字节长度,一个字节2位16进制数表示 + * @return + */ + public static String getRandomSalt(int length) { + return new SecureRandomNumberGenerator().nextBytes(length).toHex(); + } + + /** + * 获取当前 Subject + * + * @return Subject + */ + public static Subject getSubject() { + return SecurityUtils.getSubject(); + } + + + /** + * 验证当前用户是否属于该角色?,使用时与lacksRole 搭配使用 + * + * @param roleName 角色名 + * @return 属于该角色:true,否则false + */ + public static boolean hasRole(String roleName) { + return getSubject() != null && roleName != null + && roleName.length() > 0 && getSubject().hasRole(roleName); + } + + /** + * 与hasRole标签逻辑相反,当用户不属于该角色时验证通过。 + * + * @param roleName 角色名 + * @return 不属于该角色:true,否则false + */ + public static boolean lacksRole(String roleName) { + return !hasRole(roleName); + } + + /** + * 验证当前用户是否属于以下任意一个角色。 + * + * @param roleNames 角色列表 + * @return 属于:true,否则false + */ + public static boolean hasAnyRoles(String roleNames) { + boolean hasAnyRole = false; + Subject subject = getSubject(); + if (subject != null && roleNames != null && roleNames.length() > 0) { + for (String role : roleNames.split(NAMES_DELIMETER)) { + if (subject.hasRole(role.trim())) { + hasAnyRole = true; + break; + } + } + } + return hasAnyRole; + } + + /** + * 验证当前用户是否拥有指定权限,使用时与lacksPermission 搭配使用 + * + * @param permission 权限名 + * @return 拥有权限:true,否则false + */ + public static boolean hasPermission(String permission) { + return getSubject() != null && permission != null + && permission.length() > 0 + && getSubject().isPermitted(permission); + } + + /** + * 与hasPermission标签逻辑相反,当前用户没有制定权限时,验证通过。 + * + * @param permission 权限名 + * @return 拥有权限:true,否则false + */ + public static boolean lacksPermission(String permission) { + return !hasPermission(permission); + } + + /** + * 已认证通过的用户,不包含已记住的用户,这是与user标签的区别所在。与notAuthenticated搭配使用 + * + * @return 通过身份验证:true,否则false + */ + public static boolean isAuthenticated() { + return getSubject() != null && getSubject().isAuthenticated(); + } + + /** + * 未认证通过用户,与authenticated标签相对应。与guest标签的区别是,该标签包含已记住用户。。 + * + * @return 没有通过身份验证:true,否则false + */ + public static boolean notAuthenticated() { + return !isAuthenticated(); + } + + /** + * 认证通过或已记住的用户。与guset搭配使用。 + * + * @return 用户:true,否则 false + */ + public static boolean isUser() { + return getSubject() != null && getSubject().getPrincipal() != null; + } + + /** + * 验证当前用户是否为“访客”,即未认证(包含未记住)的用户。用user搭配使用 + * + * @return 访客:true,否则false + */ + public static boolean isGuest() { + return !isUser(); + } + + /** + * 输出当前用户信息,通常为登录帐号信息。 + * + * @return 当前用户信息 + */ + public static String principal() { + if (getSubject() != null) { + Object principal = getSubject().getPrincipal(); + return principal.toString(); + } + return ""; + } + +} diff --git a/app-manage-api/src/main/resources/application.yml b/app-manage-api/src/main/resources/application.yml new file mode 100644 index 0000000..2c2839f --- /dev/null +++ b/app-manage-api/src/main/resources/application.yml @@ -0,0 +1,97 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## + +################### 自定义项目配置 ################### +enzhico: + socket-port: 9096 #socket端口 + ping-interval: 60000 #Ping消息间隔(毫秒) + ping-timeout: 180000 #Ping消息超时时间(毫秒) + +################### 项目启动端口 ################### +server.port: 9095 + +################### spring配置 ################### +spring: + profiles: + active: dev + http: + multipart: + max-request-size: 100MB #最大请求大小 + max-file-size: 100MB #最大文件大小 + +################### mybatis-plus配置 ################### +mybatis-plus: + mapper-locations: classpath*:com/enzhico/jwt/dao/repository/mapping/*.xml + typeAliasesPackage: > + com.enzhico.jwt.api.model, + com.enzhico.jwt.dao.entity, + com.enzhico.jwt.common.dao.entity + global-config: + id-type: 0 # 0:数据库ID自增 1:用户输入id 2:全局唯一id(IdWorker) 3:全局唯一ID(uuid) + db-column-underline: false + refresh-mapper: true + configuration: + map-underscore-to-camel-case: true + cache-enabled: true #配置的缓存的全局开关 + lazyLoadingEnabled: true #延时加载的开关 + multipleResultSetsEnabled: true #开启的话,延时加载一个属性时会加载该对象全部属性,否则按需加载属性 + +################### spring security配置 ################### +security: + ignored: /static/** + +logging: + level: + org.springframework.web.servlet: ERROR + +--- + +##################################################################### +######################## 开发环境profile ########################## +##################################################################### +spring: + profiles: dev + datasource: + url: jdbc:mysql://123.207.66.156:3306/pos?useSSL=false&autoReconnect=true&tinyInt1isBit=false&useUnicode=true&characterEncoding=utf8 + username: root + password: _EnZhi123 + thymeleaf: + cache: false + +################### 自定义项目配置 ################### +enzhico: + apk-url-prefix: http://enzhico.net/files/ #APK文件访问URL前缀 + +logging: + level: + ROOT: INFO + com: + enzhico: DEBUG + file: E:/logs/pos-api.log + +--- + +##################################################################### +######################## 测试环境profile ########################## +##################################################################### + +spring: + profiles: test + datasource: + url: jdbc:mysql://123.207.66.156:3306/pos?useSSL=false&autoReconnect=true&tinyInt1isBit=false&useUnicode=true&characterEncoding=utf8 + username: root + password: _EnZhi123 + thymeleaf: + cache: false + +################### 自定义项目配置 ################### +enzhico: + apk-url-prefix: https://show.enzhico.net/files/ #APK文件访问URL前缀 + +logging: + level: + ROOT: INFO + com: + enzhico: DEBUG + file: /var/logs/app-manage-api.log diff --git a/app-manage-api/src/main/resources/ehcache.xml b/app-manage-api/src/main/resources/ehcache.xml new file mode 100644 index 0000000..b580e22 --- /dev/null +++ b/app-manage-api/src/main/resources/ehcache.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + diff --git a/app-manage-api/src/main/resources/sql/generate_mapper.py b/app-manage-api/src/main/resources/sql/generate_mapper.py new file mode 100644 index 0000000..4e14d7f --- /dev/null +++ b/app-manage-api/src/main/resources/sql/generate_mapper.py @@ -0,0 +1,314 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- +""" +通过一个schema.sql来生成标准表结构的Domain和基础Mapper +基于mybatis-plus库使用 + +使用方法2种: + +1. python generate_mapper.py src_base_dir domain_package mapper_package schema_name author +2. 配置好下面的参数后直接运行此文件 python generate_mapper.py + +参数: +1. src_base_dir 源码基础路径 +2. domain_package domain类的包名 +3. mapper_package mapper类的包名 +4. schema_name schema sql文件的绝对路径 +5. author 源代码的作者:熊能 +""" + +###################################下面的参数你来指定########################### +src_base_dir = r'E:\enzhico\app-manage\src\main\java' +domain_package = r'com.enzhico.jwt.common.dao.entity' +mapper_package = r'com.enzhico.jwt.common.dao.repository' +schema_name = r'E:\enzhico\app-manage\src\main\resources\sql\schema.sql' +author = r'熊能' +TODAY_STR = '2018/01/02' +############################################################################### + +import sys +import os +import datetime +import shutil + +# 基类功能列 +BASE_FIELS = {} + +# MySQL type to java type +MYSQL_TYPE_MAP = { + 'BIT(1)': ('Boolean',) + , 'BIT': ('byte[]',) + , 'TINYINT': ('Integer',) + , 'BOOLEAN': ('Boolean',) + , 'BOOL': ('Boolean',) + , 'SMALLINT': ('Integer',) + , 'MEDIUMINT': ('Integer',) + , 'INT': ('Integer',) + , 'INTEGER': ('Integer',) + , 'BIGINT': ('Long',) + , 'FLOAT': ('Float',) + , 'DOUBLE': ('Double',) + , 'DECIMAL': ('BigDecimal', 'java.math.BigDecimal') + , 'DATE': ('Date', 'java.util.Date') + , 'DATETIME': ('Date', 'java.util.Date') + , 'TIMESTAMP': ('Date', 'java.util.Date') + , 'TIME': ('Date', 'java.util.Date') + , 'CHAR': ('String ',) + , 'VARCHAR': ('String',) + , 'BINARY': ('byte[]',) + , 'VARBINARY': ('byte[]',) + , 'TINYBLOB': ('byte[]',) + , 'TINYTEXT': ('String',) + , 'BLOB': ('byte[]',) + , 'TEXT': ('String',) + , 'MEDIUMBLOB': ('byte[]',) + , 'MEDIUMTEXT': ('String',) + , 'LONGBLOB': ('byte[]',) + , 'LONGTEXT': ('String',) + , 'ENUM': ('String',) + , 'SET': ('String',) + , 'bit(1)': ('Boolean',) + , 'bit': ('byte[]',) + , 'tinyint': ('Integer',) + , 'boolean': ('Boolean',) + , 'bool': ('Boolean',) + , 'smallint': ('Integer',) + , 'mediumint': ('Integer',) + , 'int': ('Integer',) + , 'integer': ('Integer',) + , 'bigint': ('Long',) + , 'float': ('Float',) + , 'double': ('Double',) + , 'decimal': ('BigDecimal', 'java.math.BigDecimal') + , 'date': ('Date', 'java.util.Date') + , 'datetime': ('Date', 'java.util.Date') + , 'timestamp': ('Date', 'java.util.Date') + , 'time': ('Date', 'java.util.Date') + , 'char': ('String ',) + , 'varchar': ('String',) + , 'binary': ('byte[]',) + , 'varbinary': ('byte[]',) + , 'tinyblob': ('byte[]',) + , 'tinytext': ('String',) + , 'blob': ('byte[]',) + , 'text': ('String',) + , 'mediumblob': ('byte[]',) + , 'mediumtext': ('String',) + , 'longblob': ('byte[]',) + , 'longtext': ('String',) + , 'enum': ('String',) + , 'set': ('String',) +} + + +def camel_to_underline(camel_format): + """ + 驼峰命名格式转下划线命名格式 + """ + return ''.join([s if s.islower() else '_' + s.lower() for s in camel_format])[1:] + + +def underline_to_camel(underline_format, is_field=False): + """ + 下划线命名格式驼峰命名格式 + """ + try: + result = ''.join([s.capitalize() for s in underline_format.split('_')]) + except: + print(underline_format + "...error...") + return result[0].lower() + result[1:] if is_field else result + + +def load_schema(filename): + """先加载schema.sql文件来获取所有建表语句""" + result = [] + with open(filename, encoding='utf-8') as sqlfile: + each_table = [] # 每张表定义 + for line in sqlfile: + linestrip = line.strip() + if not linestrip or linestrip.startswith("#") \ + or linestrip.startswith("INDEX") or linestrip.startswith("ALTER TABLE"): + continue + line = line.replace("`", "") + if line.startswith('--'): + temp_comment = line.split('--')[1].strip() + elif 'DROP TABLE' in line: + each_table.insert(0, temp_comment) + each_table.insert(1, line.strip().split()[-1][:-1]) + elif ' COMMENT ' in line and 'ENGINE=' not in line: + col_arr = line.split() + col_name = col_arr[0] + col_type = col_arr[1] + if 'PRIMARY KEY' in line or 'NOT NULL' in line: + col_null = 'NOT NULL' + else: + col_null = '' + col_remark = line.split(' COMMENT ') + cr = col_remark[-1].strip().replace("'", "") + each_table.append((col_name, col_type, col_null, cr[:-1] if cr.endswith(',') else cr)) + elif 'ENGINE=' in line: + # 单个表定义结束 + result.append(list(each_table)) + each_table.clear() + return result + + +def write_beans(src_base_dir, domain_package, mapper_package, schema_name, author): + + beans_dir = os.path.join(src_base_dir, domain_package.replace('.', os.sep)) + mapper_dir = os.path.join(src_base_dir, mapper_package.replace('.', os.sep)) + + if not os.path.exists(beans_dir): + os.makedirs(beans_dir) + if not os.path.exists(mapper_dir): + os.makedirs(mapper_dir) + shutil.rmtree(beans_dir) + os.mkdir(beans_dir) + shutil.rmtree(mapper_dir) + os.mkdir(mapper_dir) + + domain_package_with_semicolon = domain_package + ";" + mapper_package_with_semicolon = mapper_package + ";" + + # 今日格式化字符串 + # today_today = datetime.datetime.now().strftime('%Y/%m/%d') + today_today = TODAY_STR + today_str = ' * @since {}'.format(today_today) + + table_data = load_schema(schema_name) + # 然后开始对每个表生成一个Domain类 + for table in table_data: + table_name_comment = table[0] + table_name_real = table[1] + class_name = underline_to_camel(table_name_real[2:]) + lines = [] + lines.append('package ' + domain_package_with_semicolon) + lines.append('\n') + lines.append('import com.baomidou.mybatisplus.annotations.TableName;') + lines.append('import com.baomidou.mybatisplus.enums.IdType;') + lines.append('import com.baomidou.mybatisplus.annotations.TableId;') + lines.append('import com.baomidou.mybatisplus.activerecord.Model;') + lines.append('import java.io.Serializable;') + lines.append('\n') + lines.append('/**') + lines.append(' * ' + table_name_comment) + lines.append(' *') + lines.append(' * @author {}'.format(author)) + lines.append(' * @version 1.0') + lines.append(today_str) + lines.append(' */') + lines.append('@TableName(value = "{}")'.format(table_name_real)) + lines.append('public class {} extends Model<{}> {{'.format(class_name, class_name)) + lines.append('\n') + lines.append('private static final long serialVersionUID = 1L;') + lines.append('\n') + lines_fields = [] + lines_methods = [] + other_import = set() + field_name_list = [] + + for each_column in table[2:]: + # 列名 + column_name = each_column[0] + if column_name in BASE_FIELS: + continue + field_name = underline_to_camel(column_name, is_field=True) + field_name_list.append(field_name) + field_name_method = underline_to_camel(column_name) + # 类型 + ctype = each_column[1] + java_type_t = MYSQL_TYPE_MAP[ctype.split('(')[0] if ctype != 'BIT(1)' else ctype] + java_type = java_type_t[0] + import_str = 'import {};'.format(java_type_t[1]) if len(java_type_t) > 1 else None + # 空值约束 + column_null = each_column[2] + # 字段生成 + column_comment = each_column[3] + lines_fields.append(' /**') + lines_fields.append(' * {}'.format(column_comment)) + lines_fields.append(' */') + if column_name == 'id': + lines_fields.append(' @TableId(value="id", type= IdType.AUTO)') + lines_fields.append(' private {} {};'.format(java_type, field_name)) + if import_str: + other_import.add(import_str) + + # get方法生成 + lines_methods.append(' /**') + lines_methods.append(' * 获取 {}.'.format(column_comment)) + lines_methods.append(' *') + lines_methods.append(' * @return {}.'.format(column_comment)) + lines_methods.append(' */') + lines_methods.append(' public {} get{}() {{'.format(java_type, field_name_method)) + lines_methods.append(' return {};'.format(field_name)) + lines_methods.append(' }') + lines_methods.append('\n') + # set方法生成 + lines_methods.append(' /**') + lines_methods.append(' * 设置 {}.'.format(column_comment)) + lines_methods.append(' *') + lines_methods.append(' * @param {} {}.'.format(field_name, column_comment)) + lines_methods.append(' */') + lines_methods.append(' public void set{}({} {}) {{'.format( + field_name_method, java_type, field_name)) + lines_methods.append(' this.{} = {};'.format(field_name, field_name)) + lines_methods.append(' }') + lines_methods.append('\n') + + for each_other in sorted(other_import): + lines.insert(2, each_other) + lines.extend(lines_fields) + lines.append('\n') + lines.extend(lines_methods) + # 最后加上pkVal()实现 + lines.append(' @Override') + lines.append(' protected Serializable pkVal() {') + lines.append(' return this.id;') + lines.append(' }') + lines.append('\n') + lines.append('}') + + # 加上换行符 + lines = [line + "\n" if line != '\n' else line for line in lines] + # 开始写java源文件 + java_file = class_name + '.java' + with open(os.path.join(beans_dir, java_file), mode='w', encoding='utf-8') as jf: + jf.writelines(lines) + + # 然后开始对每个表生成一个Mapper类 + for table in table_data: + table_name_comment = table[0] + table_name_real = table[1] + class_name = underline_to_camel(table_name_real[2:]) + lines = [] + lines.append('package ' + mapper_package_with_semicolon) + lines.append('\n') + lines.append('import {}.{};'.format(domain_package, class_name)) + lines.append('import com.baomidou.mybatisplus.mapper.BaseMapper;') + lines.append('\n') + lines.append('/**') + lines.append(' * ' + table_name_comment + " Mapper") + lines.append(' *') + lines.append(' * @author {}'.format(author)) + lines.append(' * @version 1.0') + lines.append(today_str) + lines.append(' */') + lines.append('public interface {0}Mapper extends BaseMapper<{0}> {{'.format(class_name)) + lines.append('\n') + lines.append('}') + + lines = [line + "\n" if line != '\n' else line for line in lines] + # 开始写mapper源文件 + with open(os.path.join(mapper_dir, '{}Mapper.java'.format(class_name)), mode='w', encoding='utf-8') as jf: + jf.writelines(lines) + print('successful...') + pass + +if __name__ == '__main__': + if len(sys.argv) > 4: + src_base_dir = sys.argv[1] + domain_package = sys.argv[2] + mapper_package = sys.argv[3] + schema_name = sys.argv[4] + author = sys.argv[5] + write_beans(src_base_dir, domain_package, mapper_package, schema_name, author) diff --git a/app-manage-api/src/main/resources/sql/schema.sql b/app-manage-api/src/main/resources/sql/schema.sql new file mode 100644 index 0000000..62b8d3b --- /dev/null +++ b/app-manage-api/src/main/resources/sql/schema.sql @@ -0,0 +1,177 @@ +# -------------------------------------以下业务表开始------------------------------------------- + +-- 项目表 +DROP TABLE IF EXISTS `t_project`; +CREATE TABLE `t_project` ( + `id` INT(11) PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + `name` VARCHAR(64) DEFAULT '' COMMENT '项目名称', + `application_id` VARCHAR(64) DEFAULT '' COMMENT '应用编号', + `icon` VARCHAR(64) DEFAULT '' COMMENT '项目图片', + `created_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='项目表'; + +-- 项目用户关联表 +DROP TABLE IF EXISTS `t_project_user`; +CREATE TABLE `t_project_user` ( + `id` INT(11) PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + `user_id` INT(11) NOT NULL COMMENT '用户ID', + `project_id` INT(11) NOT NULL COMMENT '项目ID', + `created_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='项目用户关联表'; + +-- POS机表 +DROP TABLE IF EXISTS `t_pos`; +CREATE TABLE `t_pos` ( + `id` INT(11) PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + `imei` VARCHAR(32) DEFAULT '' COMMENT '机具IMEI码', + `sn` VARCHAR(64) DEFAULT '' COMMENT '序列号(SN)', + `series` VARCHAR(32) DEFAULT '' COMMENT '机具型号', + `android_version` VARCHAR(32) DEFAULT '' COMMENT 'Android版本', + `version` VARCHAR(64) DEFAULT '' COMMENT '版本号', + `location` VARCHAR(64) DEFAULT '' COMMENT '归属网点', + `project_id` INT(11) DEFAULT 0 COMMENT '归属项目ID', + `jointime` DATETIME COMMENT '入网时间', + `bindtime` DATETIME COMMENT '绑定时间', + `owner` VARCHAR(64) DEFAULT '' COMMENT '产权方', + `tips` VARCHAR(255) DEFAULT '' COMMENT '备注', + `pos_state` TINYINT(1) COMMENT '机具状态: 1:正常 2:故障 3:维修中(返厂) 4:已禁用(丢失) 5:已停用(回收)', + `created_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='POS机表'; + +-- POS机监控表 +DROP TABLE IF EXISTS `t_pos_monitor`; +CREATE TABLE `t_pos_monitor` ( + `id` INT(11) PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + `pos_id` INT(11) COMMENT 'POS机ID', + `session_id` VARCHAR(64) DEFAULT '' COMMENT 'Socket会话ID', + `report_time` DATETIME COMMENT '最近一次报告时间', + `report_location` VARCHAR(255) DEFAULT '' COMMENT '最近一次报告地址', + `online_state` TINYINT(1) COMMENT '在线状态: 1:在线 2:离线', + `created_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='POS机历史归属表'; + +-- POS机历史归属表 +DROP TABLE IF EXISTS `t_pos_history`; +CREATE TABLE `t_pos_history` ( + `id` INT(11) PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + `pos_id` INT(11) COMMENT 'POS机ID', + `location` VARCHAR(64) DEFAULT '' COMMENT '归属网点', + `bindtime` DATETIME COMMENT '绑定时间', + `unbindtime` DATETIME COMMENT '解绑时间', + `created_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='POS机历史归属表'; + +-- APP表 +DROP TABLE IF EXISTS `t_app`; +CREATE TABLE `t_app` ( + `id` INT(11) PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + `application_id` VARCHAR(64) DEFAULT '' COMMENT '应用编号', + `name` VARCHAR(32) DEFAULT '' COMMENT '应用名称', + `version` VARCHAR(8) DEFAULT '' COMMENT '版本号', + `tips` VARCHAR(255) DEFAULT '' COMMENT '版本说明', + `project_id` INT(11) DEFAULT 0 COMMENT '归属项目ID', + `publishtime` DATETIME COMMENT '发布时间', + `publish_range` TINYINT(1) COMMENT '发布范围 1:全网发布 2:灰度发布', + `operator_id` INT(11) COMMENT '操作者ID', + `created_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='APP表'; + +-- APP发布表 +DROP TABLE IF EXISTS `t_app_publish`; +CREATE TABLE `t_app_publish` ( + `id` INT(11) PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + `app_id` INT(11) COMMENT 'APP主键', + `pos_id` INT(11) COMMENT 'POS主键', + `created_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='APP发布表'; + + +# -------------------------------------以下用户管理表开始------------------------------------------- + +-- 后台管理用户表 +DROP TABLE IF EXISTS `t_manager`; +CREATE TABLE `t_manager` ( + `id` INT(11) PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + `username` VARCHAR(32) NOT NULL COMMENT '账号', + `name` VARCHAR(16) DEFAULT '' COMMENT '名字', + `password` VARCHAR(128) DEFAULT '' COMMENT '密码', + `salt` VARCHAR(64) DEFAULT '' COMMENT 'md5密码盐', + `phone` VARCHAR(32) DEFAULT '' COMMENT '联系电话', + `tips` VARCHAR(255) COMMENT '备注', + `state` TINYINT(1) DEFAULT 1 COMMENT '状态 1:正常 2:禁用', + `created_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='后台管理用户表'; +INSERT INTO `t_manager` VALUES (1,'admin','大Boss','8e801b56148cd65c8c9af9253794f48c','26edbd50d8ee398294f31b30e0803298', '17890908889', '', 1, '2017-12-12 09:46:12', '2017-12-12 09:46:12'); +INSERT INTO `t_manager` VALUES (2,'aix','张三','2412d3972722eb186f69a8f4011fbd48','20545a7eaea0241ddf6652a3f9a4ae24', '17859569358', '', 1, '2017-12-12 09:46:12', '2017-12-12 09:46:12'); + +-- 角色表 +DROP TABLE IF EXISTS `t_role`; +CREATE TABLE `t_role` ( + `id` INT(11) PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + `role` VARCHAR(16) DEFAULT '' COMMENT '角色名称', + `description` VARCHAR(255) DEFAULT '' COMMENT '角色说明', + `created_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='角色表'; +INSERT INTO `t_role` VALUES (1,'admin','超级管理员', '2017-12-12 09:46:12', '2017-12-12 09:46:12'); +INSERT INTO `t_role` VALUES (2,'aix','系统监控员', '2017-12-12 09:46:12', '2017-12-12 09:46:12'); + +-- 用户角色关联表 +DROP TABLE IF EXISTS `t_manager_role`; +CREATE TABLE `t_manager_role` ( + `id` INT(11) PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + `manager_id` INT(11) NOT NULL COMMENT '管理用户ID', + `role_id` INT(11) NOT NULL COMMENT '角色ID', + `created_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='用户角色关联表'; +INSERT INTO `t_manager_role` VALUES (1, 1, 1, '2017-05-05 00:00:00','2017-05-05 00:00:00'); +INSERT INTO `t_manager_role` VALUES (2, 2, 2, '2017-05-05 00:00:00','2017-05-05 00:00:00'); + +-- 权限表 +DROP TABLE IF EXISTS `t_permission`; +CREATE TABLE `t_permission` ( + `id` INT(11) PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + `permission` VARCHAR(16) DEFAULT '' COMMENT '权限名称', + `description` VARCHAR(255) DEFAULT '' COMMENT '权限说明', + `created_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='权限表'; +INSERT INTO `t_permission` VALUES (1,'permission:admin','超级管理权限', '2017-12-12 09:46:12', '2017-12-12 09:46:12'); +INSERT INTO `t_permission` VALUES (2,'permission:aix','监控权限', '2017-12-12 09:46:12', '2017-12-12 09:46:12'); +INSERT INTO `t_permission` VALUES (3,'permission:adduser','添加用户权限', '2017-12-12 09:46:12', '2017-12-12 09:46:12'); + +-- 角色权限关联表 +DROP TABLE IF EXISTS `t_role_permission`; +CREATE TABLE `t_role_permission` ( + `id` INT(11) PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + `role_id` INT(11) NOT NULL COMMENT '角色ID', + `permission_id` INT(11) NOT NULL COMMENT '权限ID', + `created_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='角色权限关联表'; +INSERT INTO `t_role_permission` VALUES (1, 1, 1, '2017-12-12 09:46:12', '2017-12-12 09:46:12'); +INSERT INTO `t_role_permission` VALUES (2, 1, 3, '2017-12-12 09:46:12', '2017-12-12 09:46:12'); +INSERT INTO `t_role_permission` VALUES (3, 2, 2, '2017-12-12 09:46:12', '2017-12-12 09:46:12'); + +-- 操作日志表 +DROP TABLE IF EXISTS `t_operation_log`; +CREATE TABLE `t_operation_log` ( + `id` INT(11) PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + `operator_id` INT(11) NOT NULL COMMENT '操作者ID', + `target_id` INT(11) NOT NULL COMMENT '操作对象ID', + `target_name` VARCHAR(32) DEFAULT '' COMMENT '操作对象名称', + `operate_type` VARCHAR(32) DEFAULT '' COMMENT '操作类型', + `tips` VARCHAR(255) DEFAULT '' COMMENT '备注', + `created_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' +) ENGINE=InnoDB AUTO_INCREMENT=985 DEFAULT CHARSET=utf8 COMMENT='操作日志表'; + diff --git a/app-manage-api/src/main/resources/swagger/swagger.pdf b/app-manage-api/src/main/resources/swagger/swagger.pdf new file mode 100644 index 0000000..78147ad --- /dev/null +++ b/app-manage-api/src/main/resources/swagger/swagger.pdf @@ -0,0 +1,31624 @@ +%PDF-1.3 +% +1 0 obj +<< /Title +/Creator (Asciidoctor PDF 1.5.0.alpha.15, based on Prawn 2.2.2) +/Producer (Asciidoctor PDF 1.5.0.alpha.15, based on Prawn 2.2.2) +/ModDate (D:20180126142436+08'00') +/CreationDate (D:20180126142436+08'00') +>> +endobj +2 0 obj +<< /Type /Catalog +/Pages 3 0 R +/Names 13 0 R +/Outlines 219 0 R +/PageLabels 250 0 R +/PageMode /UseOutlines +/OpenAction [7 0 R /FitH 793.0] +/ViewerPreferences << /DisplayDocTitle true +>> +>> +endobj +3 0 obj +<< /Type /Pages +/Count 20 +/Kids [7 0 R 11 0 R 30 0 R 43 0 R 54 0 R 65 0 R 76 0 R 88 0 R 99 0 R 110 0 R 123 0 R 134 0 R 149 0 R 159 0 R 174 0 R 186 0 R 196 0 R 203 0 R 208 0 R 214 0 R] +>> +endobj +4 0 obj +<< /Length 2 +>> +stream +q + +endstream +endobj +5 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 612.0 792.0] +/CropBox [0 0 612.0 792.0] +/BleedBox [0 0 612.0 792.0] +/TrimBox [0 0 612.0 792.0] +/ArtBox [0 0 612.0 792.0] +/Contents 4 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +>> +>> +endobj +6 0 obj +<< /Length 191 +>> +stream +q +/DeviceRGB cs +0.6 0.6 0.6 scn +/DeviceRGB CS +0.6 0.6 0.6 SCN + +BT +414.396 344.322 Td +/F1.1 27 Tf +<2122> Tj +/F1.0 27 Tf +<415049> Tj +/F1.1 27 Tf +<2324> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q + +endstream +endobj +7 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 612.0 792.0] +/CropBox [0 0 612.0 792.0] +/BleedBox [0 0 612.0 792.0] +/TrimBox [0 0 612.0 792.0] +/ArtBox [0 0 612.0 792.0] +/Contents 6 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F1.1 8 0 R +/F1.0 9 0 R +>> +>> +>> +endobj +8 0 obj +<< /Type /Font +/BaseFont /df59a1+KaiGenGothicCN +/Subtype /TrueType +/FontDescriptor 252 0 R +/FirstChar 32 +/LastChar 255 +/Widths 254 0 R +/ToUnicode 253 0 R +>> +endobj +9 0 obj +<< /Type /Font +/BaseFont /2e7566+KaiGenGothicCN +/Subtype /TrueType +/FontDescriptor 256 0 R +/FirstChar 32 +/LastChar 255 +/Widths 258 0 R +/ToUnicode 257 0 R +>> +endobj +10 0 obj +<< /Length 5615 +>> +stream +q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +BT +48.24 734.44 Td +/F2.0 22 Tf +<312e20> Tj +/F2.1 22 Tf +<2122> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 706.11 Td +/F1.1 10.5 Tf +<2122> Tj +/F1.0 10.5 Tf +<415049> Tj +/F1.1 10.5 Tf +<25262728> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 669.96 Td +/F2.0 18 Tf +<312e312e20> Tj +/F2.1 18 Tf +<23242526> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 642.51 Td +/F3.1 10.5 Tf +<2122> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +69.24 642.51 Td +/F1.0 10.5 Tf +<203a207631> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 606.36 Td +/F2.0 18 Tf +<312e322e2055524920736368656d65> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 578.91 Td +/F3.1 10.5 Tf +<2324> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +69.24 578.91 Td +/F1.0 10.5 Tf +[<203a206c6f63> 11.0 <616c686f73> 22.0 <74>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 563.91 Td +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 563.91 Td +/F3.1 10.5 Tf +<25262728> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +90.24 563.91 Td +/F1.0 10.5 Tf +<203a202f> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 548.91 Td +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 548.91 Td +/F3.1 10.5 Tf +<292a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +69.24 548.91 Td +/F1.0 10.5 Tf +[<203a2048545450> 125.0 <2c2048545450> 11.0 <53>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 512.76 Td +/F2.0 18 Tf +<312e332e20> Tj +/F2.1 18 Tf +<2728> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +55.511 485.31 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +70.74 485.31 Td +/F1.0 10.5 Tf +[<7075626c6963> 22.0 <2d63> 24.0 <6f6e7472> 11.0 <6f6c6c6572203a205075626c696320436f6e7472> 11.0 <6f6c6c6572>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +55.511 462.81 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +70.74 462.81 Td +/F1.1 10.5 Tf +<292a20> Tj +/F1.0 10.5 Tf +<3a20> Tj +/F1.1 10.5 Tf +<2b2c2d2e292a2f30> Tj +/F1.0 10.5 Tf +[<54> 74.0 <6f6b> 20.0 <656e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +55.511 440.31 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +70.74 440.31 Td +/F1.1 10.5 Tf +<313220> Tj +/F1.0 10.5 Tf +<3a20> Tj +/F1.1 10.5 Tf +<232433343536372c38393a3132> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 404.16 Td +/F2.0 18 Tf +<312e342e20> Tj +/F2.1 18 Tf +<292a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +55.511 376.71 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +70.74 378.075 Td +/F4.0 10.5 Tf +<6170706c69636174696f6e2f6a736f6e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 340.56 Td +/F2.0 18 Tf +<312e352e20> Tj +/F2.1 18 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +55.511 313.11 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +70.74 314.475 Td +/F4.0 10.5 Tf +<6170706c69636174696f6e2f6a736f6e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 273.04 Td +/F2.0 22 Tf +<322e20> Tj +/F2.1 22 Tf +<2d2e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 235.56 Td +/F2.0 18 Tf +[<322e312e205075626c6963> 35.0 <2d63> 30.0 <6f6e7472> 12.0 <6f6c6c6572>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 208.11 Td +/F1.0 10.5 Tf +[<5075626c696320436f6e7472> 11.0 <6f6c6c6572>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 176.86 Td +/F2.0 13 Tf +<322e312e312e20> Tj +/F2.1 13 Tf +<2f30313233343536> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 162.0 m +559.76 162.0 l +561.9691 162.0 563.76 160.2091 563.76 158.0 c +563.76 129.711 l +563.76 127.5019 561.9691 125.711 559.76 125.711 c +52.24 125.711 l +50.0309 125.711 48.24 127.5019 48.24 129.711 c +48.24 158.0 l +48.24 160.2091 50.0309 162.0 52.24 162.0 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 162.0 m +559.76 162.0 l +561.9691 162.0 563.76 160.2091 563.76 158.0 c +563.76 129.711 l +563.76 127.5019 561.9691 125.711 559.76 125.711 c +52.24 125.711 l +50.0309 125.711 48.24 127.5019 48.24 129.711 c +48.24 158.0 l +48.24 160.2091 50.0309 162.0 52.24 162.0 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 140.836 Td +/F4.0 11 Tf +<504f5354202f6170692f76312f62696e64> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 100.421 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 74.621 Td +/F1.0 10.5 Tf +<504f53> Tj +/F1.1 10.5 Tf +<3b3c3d3e3f3d404142> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp1 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +557.765 11.04 Td +/F1.0 9 Tf +<31> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +11 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 612.0 792.0] +/CropBox [0 0 612.0 792.0] +/BleedBox [0 0 612.0 792.0] +/TrimBox [0 0 612.0 792.0] +/ArtBox [0 0 612.0 792.0] +/Contents 10 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F2.0 16 0 R +/F2.1 17 0 R +/F1.1 8 0 R +/F1.0 9 0 R +/F3.1 19 0 R +/F4.0 23 0 R +>> +/XObject << /Stamp1 217 0 R +>> +>> +>> +endobj +12 0 obj +[11 0 R /XYZ 0 792.0 null] +endobj +13 0 obj +<< /Type /Names +/Dests 14 0 R +>> +endobj +14 0 obj +<< /Kids [46 0 R 151 0 R 78 0 R 128 0 R 47 0 R 167 0 R 82 0 R 216 0 R 131 0 R] +>> +endobj +15 0 obj +[11 0 R /XYZ 0 792.0 null] +endobj +16 0 obj +<< /Type /Font +/BaseFont /535de2+KaiGenGothicCN +/Subtype /TrueType +/FontDescriptor 260 0 R +/FirstChar 32 +/LastChar 255 +/Widths 262 0 R +/ToUnicode 261 0 R +>> +endobj +17 0 obj +<< /Type /Font +/BaseFont /35a677+KaiGenGothicCN +/Subtype /TrueType +/FontDescriptor 264 0 R +/FirstChar 32 +/LastChar 255 +/Widths 266 0 R +/ToUnicode 265 0 R +>> +endobj +18 0 obj +[11 0 R /XYZ 0 690.6 null] +endobj +19 0 obj +<< /Type /Font +/BaseFont /f54632+KaiGenGothicCN +/Subtype /TrueType +/FontDescriptor 268 0 R +/FirstChar 32 +/LastChar 255 +/Widths 270 0 R +/ToUnicode 269 0 R +>> +endobj +20 0 obj +[11 0 R /XYZ 0 627.0 null] +endobj +21 0 obj +[11 0 R /XYZ 0 533.4 null] +endobj +22 0 obj +[11 0 R /XYZ 0 424.8 null] +endobj +23 0 obj +<< /Type /Font +/BaseFont /771c19+RobotoMono-Regular +/Subtype /TrueType +/FontDescriptor 272 0 R +/FirstChar 32 +/LastChar 255 +/Widths 274 0 R +/ToUnicode 273 0 R +>> +endobj +24 0 obj +[11 0 R /XYZ 0 361.2 null] +endobj +25 0 obj +[11 0 R /XYZ 0 297.6 null] +endobj +26 0 obj +[11 0 R /XYZ 0 256.2 null] +endobj +27 0 obj +[11 0 R /XYZ 0 192.6 null] +endobj +28 0 obj +[11 0 R /XYZ 0 113.711 null] +endobj +29 0 obj +<< /Length 24955 +>> +stream +q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +BT +48.24 745.71 Td +/F2.1 10.5 Tf +<393a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 711.9 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 711.9 77.328 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +177.12 711.9 154.656 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +331.776 711.9 103.104 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +434.88 711.9 128.88 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 681.9 51.552 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 681.9 77.328 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +177.12 681.9 154.656 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +331.776 681.9 103.104 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +434.88 681.9 128.88 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 651.9 51.552 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +99.792 651.9 77.328 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +177.12 651.9 154.656 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +331.776 651.9 103.104 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +434.88 651.9 128.88 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 621.9 51.552 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 621.9 77.328 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +177.12 621.9 154.656 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +331.776 621.9 103.104 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +434.88 621.9 128.88 30.0 re +f +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 731.4 m +99.792 731.4 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 711.9 m +99.792 711.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 731.65 m +48.24 711.275 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 731.65 m +99.792 711.275 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 718.03 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 731.4 m +177.12 731.4 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +99.792 711.9 m +177.12 711.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 731.65 m +99.792 711.275 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 731.65 m +177.12 711.275 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 718.03 Td +/F2.1 10.5 Tf +<3d3e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 731.4 m +331.776 731.4 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +177.12 711.9 m +331.776 711.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 731.65 m +177.12 711.275 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 731.65 m +331.776 711.275 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +180.12 718.03 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 731.4 m +434.88 731.4 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +331.776 711.9 m +434.88 711.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 731.65 m +331.776 711.275 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 731.65 m +434.88 711.275 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +334.776 718.03 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 731.4 m +563.76 731.4 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +434.88 711.9 m +563.76 711.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 731.65 m +434.88 711.275 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 731.65 m +563.76 711.275 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +437.88 718.03 Td +/F2.1 10.5 Tf +<3f4041> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 711.9 m +99.792 711.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 681.9 m +99.792 681.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 712.525 m +48.24 681.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 712.525 m +99.792 681.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 693.28 Td +/F2.0 10.5 Tf +[<4865> 14.0 <61646572>] TJ +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +99.792 711.9 m +177.12 711.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 681.9 m +177.12 681.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 712.525 m +99.792 681.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 712.525 m +177.12 681.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 698.53 Td +/F2.0 10.5 Tf +[<41> 3.0 <7574686f72697a> 19.0 <61> 19.0 <74696f6e>] TJ +ET + + +BT +102.792 688.03 Td +ET + + +BT +102.792 688.03 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +177.12 711.9 m +331.776 711.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 681.9 m +331.776 681.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 712.525 m +177.12 681.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 712.525 m +331.776 681.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +180.12 693.28 Td +/F1.0 10.5 Tf +[<41> 7.0 <7574686f72697a> 26.0 <61> 15.0 <74696f6e>] TJ +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +331.776 711.9 m +434.88 711.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 681.9 m +434.88 681.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 712.525 m +331.776 681.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 712.525 m +434.88 681.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +334.776 693.28 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +434.88 711.9 m +563.76 711.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 681.9 m +563.76 681.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 712.525 m +434.88 681.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 712.525 m +563.76 681.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +437.88 693.9625 Td +/F4.0 10.5 Tf +<22746f6b656e22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 681.9 m +99.792 681.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 651.9 m +99.792 651.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 682.15 m +48.24 651.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 682.15 m +99.792 651.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 663.28 Td +/F2.0 10.5 Tf +[<4865> 14.0 <61646572>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 681.9 m +177.12 681.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 651.9 m +177.12 651.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 682.15 m +99.792 651.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 682.15 m +177.12 651.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 668.53 Td +/F2.0 10.5 Tf +[<436f6e74> 19.0 <656e74> 38.0 <2d> 61.0 <54> 30.0 <797065>] TJ +ET + + +BT +102.792 658.03 Td +ET + + +BT +102.792 658.03 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 681.9 m +331.776 681.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 651.9 m +331.776 651.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 682.15 m +177.12 651.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 682.15 m +331.776 651.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +180.12 663.28 Td +/F1.0 10.5 Tf +[<436f6e74> 15.0 <656e74> 29.0 <2d> 53.0 <54> 37.0 <797065>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 681.9 m +434.88 681.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 651.9 m +434.88 651.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 682.15 m +331.776 651.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 682.15 m +434.88 651.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +334.776 663.28 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 681.9 m +563.76 681.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 651.9 m +563.76 651.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 682.15 m +434.88 651.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 682.15 m +563.76 651.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +437.88 663.9625 Td +/F4.0 10.5 Tf +<226170706c69636174696f6e2f6a736f6e22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 651.9 m +99.792 651.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 621.9 m +99.792 621.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 652.15 m +48.24 621.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 652.15 m +99.792 621.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 633.28 Td +/F2.0 10.5 Tf +<426f6479> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 651.9 m +177.12 651.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 621.9 m +177.12 621.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 652.15 m +99.792 621.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 652.15 m +177.12 621.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 638.53 Td +/F2.0 10.5 Tf +[<62696e6450> 41.0 <6172> 31.0 <616d>] TJ +ET + + +BT +102.792 628.03 Td +ET + + +BT +102.792 628.03 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 651.9 m +331.776 651.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 621.9 m +331.776 621.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 652.15 m +177.12 621.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 652.15 m +331.776 621.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +180.12 633.28 Td +/F1.0 10.5 Tf +[<62696e6450> 48.0 <6172> 27.0 <616d>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 651.9 m +434.88 651.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 621.9 m +434.88 621.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 652.15 m +331.776 621.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 652.15 m +434.88 621.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +334.776 633.28 Td +/F1.0 10.5 Tf +<504f53> Tj +/F1.1 10.5 Tf +<3e3f41424344> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 651.9 m +563.76 651.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 621.9 m +563.76 621.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 652.15 m +434.88 621.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 652.15 m +563.76 621.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 596.61 Td +/F2.1 10.5 Tf +<4243> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 552.3 51.552 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 552.3 360.864 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 552.3 103.104 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 532.8 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 532.8 360.864 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 532.8 103.104 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 513.3 51.552 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +99.792 513.3 360.864 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +460.656 513.3 103.104 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 493.8 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 493.8 360.864 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 493.8 103.104 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 474.3 51.552 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +99.792 474.3 360.864 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +460.656 474.3 103.104 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 454.8 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 454.8 360.864 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 454.8 103.104 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 435.3 51.552 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +99.792 435.3 360.864 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +460.656 435.3 103.104 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 415.8 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 415.8 360.864 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 415.8 103.104 19.5 re +f +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 582.3 m +99.792 582.3 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 552.3 m +99.792 552.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 582.55 m +48.24 551.675 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 582.55 m +99.792 551.675 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 568.93 Td +/F2.0 10.5 Tf +<48545450> Tj +/F2.1 10.5 Tf +<44> Tj +ET + + +BT +51.24 558.43 Td +/F2.1 10.5 Tf +<45> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 582.3 m +460.656 582.3 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +99.792 552.3 m +460.656 552.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 582.55 m +99.792 551.675 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 582.55 m +460.656 551.675 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 563.68 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 582.3 m +563.76 582.3 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +460.656 552.3 m +563.76 552.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 582.55 m +460.656 551.675 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 582.55 m +563.76 551.675 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 563.68 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 552.3 m +99.792 552.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 532.8 m +99.792 532.8 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 552.925 m +48.24 532.55 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 552.925 m +99.792 532.55 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 538.93 Td +/F2.0 10.5 Tf +<323030> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +99.792 552.3 m +460.656 552.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 532.8 m +460.656 532.8 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 552.925 m +99.792 532.55 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 552.925 m +460.656 532.55 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 538.93 Td +/F1.1 10.5 Tf +<2d2e454647> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +460.656 552.3 m +563.76 552.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 532.8 m +563.76 532.8 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 552.925 m +460.656 532.55 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 552.925 m +563.76 532.55 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +463.656 538.93 Td +/F1.0 10.5 Tf +[<4261736552> 11.0 <6573706f6e7365>] TJ +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 532.8 m +99.792 532.8 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 513.3 m +99.792 513.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 533.05 m +48.24 513.05 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 533.05 m +99.792 513.05 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 519.43 Td +/F2.0 10.5 Tf +<323031> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 532.8 m +460.656 532.8 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 513.3 m +460.656 513.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 533.05 m +99.792 513.05 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 533.05 m +460.656 513.05 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 519.43 Td +/F1.1 10.5 Tf +<4849474a4b4c4d> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 532.8 m +563.76 532.8 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 513.3 m +563.76 513.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 533.05 m +460.656 513.05 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 533.05 m +563.76 513.05 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +463.656 519.43 Td +/F1.0 10.5 Tf +[<4261736552> 11.0 <6573706f6e7365>] TJ +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 513.3 m +99.792 513.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 493.8 m +99.792 493.8 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 513.55 m +48.24 493.55 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 513.55 m +99.792 493.55 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 499.93 Td +/F2.0 10.5 Tf +<343030> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 513.3 m +460.656 513.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 493.8 m +460.656 493.8 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 513.55 m +99.792 493.55 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 513.55 m +460.656 493.55 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 499.93 Td +/F1.1 10.5 Tf +<2d2e4e4f505152535455565758592d2e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 513.3 m +563.76 513.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 493.8 m +563.76 493.8 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 513.55 m +460.656 493.55 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 513.55 m +563.76 493.55 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 499.93 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 493.8 m +99.792 493.8 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 474.3 m +99.792 474.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 494.05 m +48.24 474.05 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 494.05 m +99.792 474.05 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 480.43 Td +/F2.0 10.5 Tf +<343031> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 493.8 m +460.656 493.8 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 474.3 m +460.656 474.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 494.05 m +99.792 474.05 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 494.05 m +460.656 474.05 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 480.43 Td +/F1.1 10.5 Tf +<5d5e5f372c3b60524461> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 493.8 m +563.76 493.8 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 474.3 m +563.76 474.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 494.05 m +460.656 474.05 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 494.05 m +563.76 474.05 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 480.43 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 474.3 m +99.792 474.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 454.8 m +99.792 454.8 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 474.55 m +48.24 454.55 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 474.55 m +99.792 454.55 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 460.93 Td +/F2.0 10.5 Tf +<343033> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 474.3 m +460.656 474.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 454.8 m +460.656 454.8 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 474.55 m +99.792 454.55 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 474.55 m +460.656 454.55 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 460.93 Td +/F1.1 10.5 Tf +<23243325622d2e54636465666768> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 474.3 m +563.76 474.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 454.8 m +563.76 454.8 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 474.55 m +460.656 454.55 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 474.55 m +563.76 454.55 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 460.93 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 454.8 m +99.792 454.8 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 435.3 m +99.792 435.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 455.05 m +48.24 435.05 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 455.05 m +99.792 435.05 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 441.43 Td +/F2.0 10.5 Tf +<343034> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 454.8 m +460.656 454.8 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 435.3 m +460.656 435.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 455.05 m +99.792 435.05 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 455.05 m +460.656 435.05 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 441.43 Td +/F1.1 10.5 Tf +<23243369566a343f4048496b2728566c6d> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 454.8 m +563.76 454.8 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 435.3 m +563.76 435.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 455.05 m +460.656 435.05 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 455.05 m +563.76 435.05 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 441.43 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 435.3 m +99.792 435.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 415.8 m +99.792 415.8 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 435.55 m +48.24 415.55 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 435.55 m +99.792 415.55 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 421.93 Td +/F2.0 10.5 Tf +<353030> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 435.3 m +460.656 435.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 415.8 m +460.656 415.8 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 435.55 m +99.792 415.55 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 435.55 m +460.656 415.55 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 421.93 Td +/F1.1 10.5 Tf +<2324336e6f7071> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 435.3 m +563.76 435.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 415.8 m +563.76 415.8 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 435.55 m +460.656 415.55 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 435.55 m +563.76 415.55 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 421.93 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 390.51 Td +/F2.1 10.5 Tf +<292a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +55.511 364.71 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +70.74 366.075 Td +/F4.0 10.5 Tf +<6170706c69636174696f6e2f6a736f6e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 335.91 Td +/F2.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +55.511 310.11 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +70.74 311.475 Td +/F4.0 10.5 Tf +<6170706c69636174696f6e2f6a736f6e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 281.31 Td +/F2.0 10.5 Tf +<48545450> Tj +/F2.1 10.5 Tf +<2f304647> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 255.18 Td +/F2.1 9 Tf +<2f3020> Tj +/F2.0 9 Tf +[<70> 14.0 <61> 19.0 <7468>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 241.2 m +559.76 241.2 l +561.9691 241.2 563.76 239.4091 563.76 237.2 c +563.76 208.911 l +563.76 206.7019 561.9691 204.911 559.76 204.911 c +52.24 204.911 l +50.0309 204.911 48.24 206.7019 48.24 208.911 c +48.24 237.2 l +48.24 239.4091 50.0309 241.2 52.24 241.2 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 241.2 m +559.76 241.2 l +561.9691 241.2 563.76 239.4091 563.76 237.2 c +563.76 208.911 l +563.76 206.7019 561.9691 204.911 559.76 204.911 c +52.24 204.911 l +50.0309 204.911 48.24 206.7019 48.24 208.911 c +48.24 237.2 l +48.24 239.4091 50.0309 241.2 52.24 241.2 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 220.036 Td +/F4.0 11 Tf +<2f6170692f76312f62696e64> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 181.091 Td +/F2.1 9 Tf +<2f3020> Tj +/F2.0 9 Tf +[<6865> 14.0 <61646572>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 167.111 m +559.76 167.111 l +561.9691 167.111 563.76 165.3201 563.76 163.111 c +563.76 134.822 l +563.76 132.6129 561.9691 130.822 559.76 130.822 c +52.24 130.822 l +50.0309 130.822 48.24 132.6129 48.24 134.822 c +48.24 163.111 l +48.24 165.3201 50.0309 167.111 52.24 167.111 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 167.111 m +559.76 167.111 l +561.9691 167.111 563.76 165.3201 563.76 163.111 c +563.76 134.822 l +563.76 132.6129 561.9691 130.822 559.76 130.822 c +52.24 130.822 l +50.0309 130.822 48.24 132.6129 48.24 134.822 c +48.24 163.111 l +48.24 165.3201 50.0309 167.111 52.24 167.111 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 145.947 Td +/F4.0 11 Tf +<22737472696e6722> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 107.002 Td +/F2.1 9 Tf +<2f3020> Tj +/F2.0 9 Tf +<626f6479> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp2 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +49.24 11.04 Td +/F1.0 9 Tf +<32> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +30 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 612.0 792.0] +/CropBox [0 0 612.0 792.0] +/BleedBox [0 0 612.0 792.0] +/TrimBox [0 0 612.0 792.0] +/ArtBox [0 0 612.0 792.0] +/Contents 29 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F2.1 17 0 R +/F2.0 16 0 R +/F3.1 19 0 R +/F1.0 9 0 R +/F4.0 23 0 R +/F1.1 8 0 R +>> +/XObject << /Stamp2 218 0 R +>> +>> +/Annots [32 0 R 34 0 R 35 0 R] +>> +endobj +31 0 obj +[30 0 R /XYZ 0 792.0 null] +endobj +32 0 obj +<< /Border [0 0 0] +/Dest (_1f9e34870cf47ca885a7be278b128f43) +/Subtype /Link +/Rect [334.776 632.02 418.4715 642.52] +/Type /Annot +>> +endobj +33 0 obj +[30 0 R /XYZ 0 609.9 null] +endobj +34 0 obj +<< /Border [0 0 0] +/Dest (_baseresponse) +/Subtype /Link +/Rect [463.656 537.67 534.51 548.17] +/Type /Annot +>> +endobj +35 0 obj +<< /Border [0 0 0] +/Dest (_baseresponse) +/Subtype /Link +/Rect [463.656 518.17 534.51 528.67] +/Type /Annot +>> +endobj +36 0 obj +[30 0 R /XYZ 0 403.8 null] +endobj +37 0 obj +[30 0 R /XYZ 0 349.2 null] +endobj +38 0 obj +[30 0 R /XYZ 0 294.6 null] +endobj +39 0 obj +[30 0 R /XYZ 0 267.0 null] +endobj +40 0 obj +[30 0 R /XYZ 0 192.911 null] +endobj +41 0 obj +[30 0 R /XYZ 0 118.822 null] +endobj +42 0 obj +<< /Length 16710 +>> +stream +q +q +/DeviceRGB cs +0.9608 0.9608 0.9608 scn +52.24 756.0 m +559.76 756.0 l +561.9691 756.0 563.76 754.2091 563.76 752.0 c +563.76 679.414 l +563.76 677.2049 561.9691 675.414 559.76 675.414 c +52.24 675.414 l +50.0309 675.414 48.24 677.2049 48.24 679.414 c +48.24 752.0 l +48.24 754.2091 50.0309 756.0 52.24 756.0 c +h +f +/DeviceRGB CS +0.8 0.8 0.8 SCN +0.75 w +52.24 756.0 m +559.76 756.0 l +561.9691 756.0 563.76 754.2091 563.76 752.0 c +563.76 679.414 l +563.76 677.2049 561.9691 675.414 559.76 675.414 c +52.24 675.414 l +50.0309 675.414 48.24 677.2049 48.24 679.414 c +48.24 752.0 l +48.24 754.2091 50.0309 756.0 52.24 756.0 c +h +S +Q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +BT +59.24 733.406 Td +/F4.0 11 Tf +<7b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 719.117 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 704.828 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +164.84 704.828 Td +/F1.1 11 Tf +<7273747576777831797a7b7c7d7e7f6880> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +351.84 704.828 Td +/F4.0 11 Tf +<22> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 690.539 Td +/F4.0 11 Tf +<7d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 650.124 Td +/F2.0 10.5 Tf +<48545450> Tj +/F2.1 10.5 Tf +<42434647> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 623.994 Td +/F2.1 9 Tf +<424320> Tj +/F2.0 9 Tf +<323030> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 610.014 m +559.76 610.014 l +561.9691 610.014 563.76 608.2231 563.76 606.014 c +563.76 519.139 l +563.76 516.9299 561.9691 515.139 559.76 515.139 c +52.24 515.139 l +50.0309 515.139 48.24 516.9299 48.24 519.139 c +48.24 606.014 l +48.24 608.2231 50.0309 610.014 52.24 610.014 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 610.014 m +559.76 610.014 l +561.9691 610.014 563.76 608.2231 563.76 606.014 c +563.76 519.139 l +563.76 516.9299 561.9691 515.139 559.76 515.139 c +52.24 515.139 l +50.0309 515.139 48.24 516.9299 48.24 519.139 c +48.24 606.014 l +48.24 608.2231 50.0309 610.014 52.24 610.014 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 587.42 Td +/F4.0 11 Tf +<7b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 573.131 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 558.842 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +131.84 558.842 Td +/F1.1 11 Tf +<474a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +153.84 558.842 Td +/F4.0 11 Tf +<222c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 544.553 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 530.264 Td +/F4.0 11 Tf +<7d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 491.319 Td +/F2.1 9 Tf +<424320> Tj +/F2.0 9 Tf +<323031> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 477.339 m +559.76 477.339 l +561.9691 477.339 563.76 475.5481 563.76 473.339 c +563.76 386.464 l +563.76 384.2549 561.9691 382.464 559.76 382.464 c +52.24 382.464 l +50.0309 382.464 48.24 384.2549 48.24 386.464 c +48.24 473.339 l +48.24 475.5481 50.0309 477.339 52.24 477.339 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 477.339 m +559.76 477.339 l +561.9691 477.339 563.76 475.5481 563.76 473.339 c +563.76 386.464 l +563.76 384.2549 561.9691 382.464 559.76 382.464 c +52.24 382.464 l +50.0309 382.464 48.24 384.2549 48.24 386.464 c +48.24 473.339 l +48.24 475.5481 50.0309 477.339 52.24 477.339 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 454.745 Td +/F4.0 11 Tf +<7b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 440.456 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 426.167 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +131.84 426.167 Td +/F1.1 11 Tf +<474a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +153.84 426.167 Td +/F4.0 11 Tf +<222c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 411.878 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 397.589 Td +/F4.0 11 Tf +<7d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 354.724 Td +/F2.0 13 Tf +<322e312e322e20> Tj +/F2.1 13 Tf +<2f3048333536> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 339.864 m +559.76 339.864 l +561.9691 339.864 563.76 338.0731 563.76 335.864 c +563.76 307.575 l +563.76 305.3659 561.9691 303.575 559.76 303.575 c +52.24 303.575 l +50.0309 303.575 48.24 305.3659 48.24 307.575 c +48.24 335.864 l +48.24 338.0731 50.0309 339.864 52.24 339.864 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 339.864 m +559.76 339.864 l +561.9691 339.864 563.76 338.0731 563.76 335.864 c +563.76 307.575 l +563.76 305.3659 561.9691 303.575 559.76 303.575 c +52.24 303.575 l +50.0309 303.575 48.24 305.3659 48.24 307.575 c +48.24 335.864 l +48.24 338.0731 50.0309 339.864 52.24 339.864 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 318.7 Td +/F4.0 11 Tf +<504f5354202f6170692f76312f6a6f696e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 278.285 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 252.485 Td +/F1.1 10.5 Tf +<31818283> Tj +/F1.0 10.5 Tf +<504f53> Tj +/F1.1 10.5 Tf +<848586872d2e884154898a8b8c8d8e8841428f90> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 223.685 Td +/F2.1 10.5 Tf +<393a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 189.875 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 189.875 77.328 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +177.12 189.875 154.656 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +331.776 189.875 103.104 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +434.88 189.875 128.88 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 159.875 51.552 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 159.875 77.328 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +177.12 159.875 154.656 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +331.776 159.875 103.104 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +434.88 159.875 128.88 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 129.875 51.552 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +99.792 129.875 77.328 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +177.12 129.875 154.656 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +331.776 129.875 103.104 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +434.88 129.875 128.88 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 99.875 51.552 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 99.875 77.328 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +177.12 99.875 154.656 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +331.776 99.875 103.104 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +434.88 99.875 128.88 30.0 re +f +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 209.375 m +99.792 209.375 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 189.875 m +99.792 189.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 209.625 m +48.24 189.25 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 209.625 m +99.792 189.25 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 196.005 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 209.375 m +177.12 209.375 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +99.792 189.875 m +177.12 189.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 209.625 m +99.792 189.25 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 209.625 m +177.12 189.25 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 196.005 Td +/F2.1 10.5 Tf +<3d3e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 209.375 m +331.776 209.375 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +177.12 189.875 m +331.776 189.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 209.625 m +177.12 189.25 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 209.625 m +331.776 189.25 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +180.12 196.005 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 209.375 m +434.88 209.375 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +331.776 189.875 m +434.88 189.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 209.625 m +331.776 189.25 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 209.625 m +434.88 189.25 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +334.776 196.005 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 209.375 m +563.76 209.375 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +434.88 189.875 m +563.76 189.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 209.625 m +434.88 189.25 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 209.625 m +563.76 189.25 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +437.88 196.005 Td +/F2.1 10.5 Tf +<3f4041> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 189.875 m +99.792 189.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 159.875 m +99.792 159.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 190.5 m +48.24 159.625 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 190.5 m +99.792 159.625 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 171.255 Td +/F2.0 10.5 Tf +[<4865> 14.0 <61646572>] TJ +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +99.792 189.875 m +177.12 189.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 159.875 m +177.12 159.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 190.5 m +99.792 159.625 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 190.5 m +177.12 159.625 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 176.505 Td +/F2.0 10.5 Tf +[<41> 3.0 <7574686f72697a> 19.0 <61> 19.0 <74696f6e>] TJ +ET + + +BT +102.792 166.005 Td +ET + + +BT +102.792 166.005 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +177.12 189.875 m +331.776 189.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 159.875 m +331.776 159.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 190.5 m +177.12 159.625 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 190.5 m +331.776 159.625 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +180.12 171.255 Td +/F1.0 10.5 Tf +[<41> 7.0 <7574686f72697a> 26.0 <61> 15.0 <74696f6e>] TJ +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +331.776 189.875 m +434.88 189.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 159.875 m +434.88 159.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 190.5 m +331.776 159.625 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 190.5 m +434.88 159.625 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +334.776 171.255 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +434.88 189.875 m +563.76 189.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 159.875 m +563.76 159.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 190.5 m +434.88 159.625 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 190.5 m +563.76 159.625 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +437.88 171.9375 Td +/F4.0 10.5 Tf +<22746f6b656e22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 159.875 m +99.792 159.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 129.875 m +99.792 129.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 160.125 m +48.24 129.625 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 160.125 m +99.792 129.625 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 141.255 Td +/F2.0 10.5 Tf +[<4865> 14.0 <61646572>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 159.875 m +177.12 159.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 129.875 m +177.12 129.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 160.125 m +99.792 129.625 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 160.125 m +177.12 129.625 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 146.505 Td +/F2.0 10.5 Tf +[<436f6e74> 19.0 <656e74> 38.0 <2d> 61.0 <54> 30.0 <797065>] TJ +ET + + +BT +102.792 136.005 Td +ET + + +BT +102.792 136.005 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 159.875 m +331.776 159.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 129.875 m +331.776 129.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 160.125 m +177.12 129.625 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 160.125 m +331.776 129.625 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +180.12 141.255 Td +/F1.0 10.5 Tf +[<436f6e74> 15.0 <656e74> 29.0 <2d> 53.0 <54> 37.0 <797065>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 159.875 m +434.88 159.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 129.875 m +434.88 129.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 160.125 m +331.776 129.625 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 160.125 m +434.88 129.625 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +334.776 141.255 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 159.875 m +563.76 159.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 129.875 m +563.76 129.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 160.125 m +434.88 129.625 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 160.125 m +563.76 129.625 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +437.88 141.9375 Td +/F4.0 10.5 Tf +<226170706c69636174696f6e2f6a736f6e22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 129.875 m +99.792 129.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 99.875 m +99.792 99.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 130.125 m +48.24 99.625 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 130.125 m +99.792 99.625 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 111.255 Td +/F2.0 10.5 Tf +<426f6479> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 129.875 m +177.12 129.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 99.875 m +177.12 99.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 130.125 m +99.792 99.625 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 130.125 m +177.12 99.625 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 116.505 Td +/F2.0 10.5 Tf +[<706f> 5.0 <7350> 41.0 <6172> 31.0 <616d>] TJ +ET + + +BT +102.792 106.005 Td +ET + + +BT +102.792 106.005 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 129.875 m +331.776 129.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 99.875 m +331.776 99.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 130.125 m +177.12 99.625 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 130.125 m +331.776 99.625 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +180.12 111.255 Td +/F1.0 10.5 Tf +[<706f7350> 48.0 <6172> 27.0 <616d>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 129.875 m +434.88 129.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 99.875 m +434.88 99.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 130.125 m +331.776 99.625 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 130.125 m +434.88 99.625 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +334.776 111.255 Td +/F1.0 10.5 Tf +<504f53> Tj +/F1.1 10.5 Tf +<88414344> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 129.875 m +563.76 129.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 99.875 m +563.76 99.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 130.125 m +434.88 99.625 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 130.125 m +563.76 99.625 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp1 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +557.765 11.04 Td +/F1.0 9 Tf +<33> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +43 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 612.0 792.0] +/CropBox [0 0 612.0 792.0] +/BleedBox [0 0 612.0 792.0] +/TrimBox [0 0 612.0 792.0] +/ArtBox [0 0 612.0 792.0] +/Contents 42 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F4.0 23 0 R +/F1.1 8 0 R +/F2.0 16 0 R +/F2.1 17 0 R +/F1.0 9 0 R +/F3.1 19 0 R +>> +/XObject << /Stamp1 217 0 R +>> +>> +/Annots [52 0 R] +>> +endobj +44 0 obj +[43 0 R /XYZ 0 663.414 null] +endobj +45 0 obj +[43 0 R /XYZ 0 635.814 null] +endobj +46 0 obj +<< /Limits [(0x5f68747470e5938de5ba94e7a4bae4be8b) (0x5f68747470e8afb7e6b182e7a4bae4be8b5f34)] +/Names [(0x5f68747470e5938de5ba94e7a4bae4be8b) 44 0 R (0x5f68747470e5938de5ba94e7a4bae4be8b5f32) 66 0 R (0x5f68747470e5938de5ba94e7a4bae4be8b5f33) 85 0 R (0x5f68747470e5938de5ba94e7a4bae4be8b5f34) 105 0 R (0x5f68747470e5938de5ba94e7a4bae4be8b5f35) 125 0 R (0x5f68747470e5938de5ba94e7a4bae4be8b5f36) 150 0 R (0x5f68747470e5938de5ba94e7a4bae4be8b5f37) 172 0 R (0x5f68747470e5938de5ba94e7a4bae4be8b5f38) 193 0 R (0x5f68747470e8afb7e6b182e7a4bae4be8b) 38 0 R (0x5f68747470e8afb7e6b182e7a4bae4be8b5f32) 60 0 R (0x5f68747470e8afb7e6b182e7a4bae4be8b5f33) 80 0 R (0x5f68747470e8afb7e6b182e7a4bae4be8b5f34) 101 0 R] +>> +endobj +47 0 obj +<< /Limits [(0x5fe7949fe688905f32) (0x5fe8afb4e6988e5f33)] +/Names [(0x5fe7949fe688905f32) 37 0 R (0x5fe7949fe688905f33) 59 0 R (0x5fe7949fe688905f34) 79 0 R (0x5fe7949fe688905f35) 100 0 R (0x5fe7949fe688905f36) 118 0 R (0x5fe7949fe688905f37) 143 0 R (0x5fe7949fe688905f38) 166 0 R (0x5fe7949fe688905f39) 188 0 R (0x5fe8afb4e6988e) 28 0 R (0x5fe8afb4e6988e5f32) 50 0 R (0x5fe8afb4e6988e5f33) 70 0 R] +>> +endobj +48 0 obj +[43 0 R /XYZ 0 503.139 null] +endobj +49 0 obj +[43 0 R /XYZ 0 370.464 null] +endobj +50 0 obj +[43 0 R /XYZ 0 291.575 null] +endobj +51 0 obj +[43 0 R /XYZ 0 236.975 null] +endobj +52 0 obj +<< /Border [0 0 0] +/Dest (_f8c8293eed548988f35ab4180d87ae66) +/Subtype /Link +/Rect [334.776 109.995 397.4715 120.495] +/Type /Annot +>> +endobj +53 0 obj +<< /Length 17663 +>> +stream +q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +BT +48.24 745.71 Td +/F2.1 10.5 Tf +<4243> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 701.4 51.552 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 701.4 360.864 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 701.4 103.104 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 681.9 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 681.9 360.864 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 681.9 103.104 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 662.4 51.552 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +99.792 662.4 360.864 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +460.656 662.4 103.104 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 642.9 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 642.9 360.864 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 642.9 103.104 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 623.4 51.552 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +99.792 623.4 360.864 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +460.656 623.4 103.104 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 603.9 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 603.9 360.864 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 603.9 103.104 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 584.4 51.552 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +99.792 584.4 360.864 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +460.656 584.4 103.104 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 564.9 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 564.9 360.864 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 564.9 103.104 19.5 re +f +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 731.4 m +99.792 731.4 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 701.4 m +99.792 701.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 731.65 m +48.24 700.775 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 731.65 m +99.792 700.775 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 718.03 Td +/F2.0 10.5 Tf +<48545450> Tj +/F2.1 10.5 Tf +<44> Tj +ET + + +BT +51.24 707.53 Td +/F2.1 10.5 Tf +<45> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 731.4 m +460.656 731.4 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +99.792 701.4 m +460.656 701.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 731.65 m +99.792 700.775 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 731.65 m +460.656 700.775 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 712.78 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 731.4 m +563.76 731.4 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +460.656 701.4 m +563.76 701.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 731.65 m +460.656 700.775 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 731.65 m +563.76 700.775 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 712.78 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 701.4 m +99.792 701.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 681.9 m +99.792 681.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 702.025 m +48.24 681.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 702.025 m +99.792 681.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 688.03 Td +/F2.0 10.5 Tf +<323030> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +99.792 701.4 m +460.656 701.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 681.9 m +460.656 681.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 702.025 m +99.792 681.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 702.025 m +460.656 681.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 688.03 Td +/F1.1 10.5 Tf +<2d2e454647> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +460.656 701.4 m +563.76 701.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 681.9 m +563.76 681.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 702.025 m +460.656 681.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 702.025 m +563.76 681.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +463.656 688.03 Td +/F1.0 10.5 Tf +[<4261736552> 11.0 <6573706f6e7365>] TJ +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 681.9 m +99.792 681.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 662.4 m +99.792 662.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 682.15 m +48.24 662.15 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 682.15 m +99.792 662.15 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 668.53 Td +/F2.0 10.5 Tf +<323031> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 681.9 m +460.656 681.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 662.4 m +460.656 662.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 682.15 m +99.792 662.15 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 682.15 m +460.656 662.15 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 668.53 Td +/F1.1 10.5 Tf +<4849474a4b4c4d> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 681.9 m +563.76 681.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 662.4 m +563.76 662.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 682.15 m +460.656 662.15 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 682.15 m +563.76 662.15 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +463.656 668.53 Td +/F1.0 10.5 Tf +[<4261736552> 11.0 <6573706f6e7365>] TJ +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 662.4 m +99.792 662.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 642.9 m +99.792 642.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 662.65 m +48.24 642.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 662.65 m +99.792 642.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 649.03 Td +/F2.0 10.5 Tf +<343030> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 662.4 m +460.656 662.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 642.9 m +460.656 642.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 662.65 m +99.792 642.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 662.65 m +460.656 642.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 649.03 Td +/F1.1 10.5 Tf +<2d2e4e4f505152535455565758592d2e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 662.4 m +563.76 662.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 642.9 m +563.76 642.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 662.65 m +460.656 642.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 662.65 m +563.76 642.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 649.03 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 642.9 m +99.792 642.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 623.4 m +99.792 623.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 643.15 m +48.24 623.15 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 643.15 m +99.792 623.15 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 629.53 Td +/F2.0 10.5 Tf +<343031> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 642.9 m +460.656 642.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 623.4 m +460.656 623.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 643.15 m +99.792 623.15 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 643.15 m +460.656 623.15 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 629.53 Td +/F1.1 10.5 Tf +<5d5e5f372c3b60524461> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 642.9 m +563.76 642.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 623.4 m +563.76 623.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 643.15 m +460.656 623.15 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 643.15 m +563.76 623.15 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 629.53 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 623.4 m +99.792 623.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 603.9 m +99.792 603.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 623.65 m +48.24 603.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 623.65 m +99.792 603.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 610.03 Td +/F2.0 10.5 Tf +<343033> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 623.4 m +460.656 623.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 603.9 m +460.656 603.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 623.65 m +99.792 603.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 623.65 m +460.656 603.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 610.03 Td +/F1.1 10.5 Tf +<23243325622d2e54636465666768> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 623.4 m +563.76 623.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 603.9 m +563.76 603.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 623.65 m +460.656 603.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 623.65 m +563.76 603.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 610.03 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 603.9 m +99.792 603.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 584.4 m +99.792 584.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 604.15 m +48.24 584.15 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 604.15 m +99.792 584.15 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 590.53 Td +/F2.0 10.5 Tf +<343034> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 603.9 m +460.656 603.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 584.4 m +460.656 584.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 604.15 m +99.792 584.15 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 604.15 m +460.656 584.15 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 590.53 Td +/F1.1 10.5 Tf +<23243369566a343f4048496b2728566c6d> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 603.9 m +563.76 603.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 584.4 m +563.76 584.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 604.15 m +460.656 584.15 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 604.15 m +563.76 584.15 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 590.53 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 584.4 m +99.792 584.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 564.9 m +99.792 564.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 584.65 m +48.24 564.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 584.65 m +99.792 564.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 571.03 Td +/F2.0 10.5 Tf +<353030> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 584.4 m +460.656 584.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 564.9 m +460.656 564.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 584.65 m +99.792 564.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 584.65 m +460.656 564.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 571.03 Td +/F1.1 10.5 Tf +<2324336e6f7071> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 584.4 m +563.76 584.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 564.9 m +563.76 564.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 584.65 m +460.656 564.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 584.65 m +563.76 564.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 571.03 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 539.61 Td +/F2.1 10.5 Tf +<292a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +55.511 513.81 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +70.74 515.175 Td +/F4.0 10.5 Tf +<6170706c69636174696f6e2f6a736f6e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 485.01 Td +/F2.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +55.511 459.21 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +70.74 460.575 Td +/F4.0 10.5 Tf +<6170706c69636174696f6e2f6a736f6e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 430.41 Td +/F2.0 10.5 Tf +<48545450> Tj +/F2.1 10.5 Tf +<2f304647> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 404.28 Td +/F2.1 9 Tf +<2f3020> Tj +/F2.0 9 Tf +[<70> 14.0 <61> 19.0 <7468>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 390.3 m +559.76 390.3 l +561.9691 390.3 563.76 388.5091 563.76 386.3 c +563.76 358.011 l +563.76 355.8019 561.9691 354.011 559.76 354.011 c +52.24 354.011 l +50.0309 354.011 48.24 355.8019 48.24 358.011 c +48.24 386.3 l +48.24 388.5091 50.0309 390.3 52.24 390.3 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 390.3 m +559.76 390.3 l +561.9691 390.3 563.76 388.5091 563.76 386.3 c +563.76 358.011 l +563.76 355.8019 561.9691 354.011 559.76 354.011 c +52.24 354.011 l +50.0309 354.011 48.24 355.8019 48.24 358.011 c +48.24 386.3 l +48.24 388.5091 50.0309 390.3 52.24 390.3 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 369.136 Td +/F4.0 11 Tf +<2f6170692f76312f6a6f696e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 330.191 Td +/F2.1 9 Tf +<2f3020> Tj +/F2.0 9 Tf +[<6865> 14.0 <61646572>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 316.211 m +559.76 316.211 l +561.9691 316.211 563.76 314.4201 563.76 312.211 c +563.76 283.922 l +563.76 281.7129 561.9691 279.922 559.76 279.922 c +52.24 279.922 l +50.0309 279.922 48.24 281.7129 48.24 283.922 c +48.24 312.211 l +48.24 314.4201 50.0309 316.211 52.24 316.211 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 316.211 m +559.76 316.211 l +561.9691 316.211 563.76 314.4201 563.76 312.211 c +563.76 283.922 l +563.76 281.7129 561.9691 279.922 559.76 279.922 c +52.24 279.922 l +50.0309 279.922 48.24 281.7129 48.24 283.922 c +48.24 312.211 l +48.24 314.4201 50.0309 316.211 52.24 316.211 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 295.047 Td +/F4.0 11 Tf +<22737472696e6722> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 256.102 Td +/F2.1 9 Tf +<2f3020> Tj +/F2.0 9 Tf +<626f6479> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 242.122 m +559.76 242.122 l +561.9691 242.122 563.76 240.3311 563.76 238.122 c +563.76 65.513 l +563.76 63.3039 561.9691 61.513 559.76 61.513 c +52.24 61.513 l +50.0309 61.513 48.24 63.3039 48.24 65.513 c +48.24 238.122 l +48.24 240.3311 50.0309 242.122 52.24 242.122 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 242.122 m +559.76 242.122 l +561.9691 242.122 563.76 240.3311 563.76 238.122 c +563.76 65.513 l +563.76 63.3039 561.9691 61.513 559.76 61.513 c +52.24 61.513 l +50.0309 61.513 48.24 63.3039 48.24 65.513 c +48.24 238.122 l +48.24 240.3311 50.0309 242.122 52.24 242.122 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 219.528 Td +/F4.0 11 Tf +<7b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 205.239 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 190.95 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 176.661 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 162.372 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +164.84 162.372 Td +/F1.1 11 Tf +<7273747576777831797a7b7c7d7e7f6880> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +351.84 162.372 Td +/F4.0 11 Tf +<222c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 148.083 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +145.04 148.083 Td +/F1.1 11 Tf +<9192939472739594> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +233.04 148.083 Td +/F4.0 11 Tf +<222c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 133.794 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 119.505 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 105.216 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +138.44 105.216 Td +/F1.1 11 Tf +<96979873> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +182.44 105.216 Td +/F4.0 11 Tf +<222c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 90.927 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 76.638 Td +/F4.0 11 Tf +<7d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp2 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +49.24 11.04 Td +/F1.0 9 Tf +<34> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +54 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 612.0 792.0] +/CropBox [0 0 612.0 792.0] +/BleedBox [0 0 612.0 792.0] +/TrimBox [0 0 612.0 792.0] +/ArtBox [0 0 612.0 792.0] +/Contents 53 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F2.1 17 0 R +/F2.0 16 0 R +/F1.1 8 0 R +/F1.0 9 0 R +/F4.0 23 0 R +>> +/XObject << /Stamp2 218 0 R +>> +>> +/Annots [56 0 R 57 0 R] +>> +endobj +55 0 obj +[54 0 R /XYZ 0 792.0 null] +endobj +56 0 obj +<< /Border [0 0 0] +/Dest (_baseresponse) +/Subtype /Link +/Rect [463.656 686.77 534.51 697.27] +/Type /Annot +>> +endobj +57 0 obj +<< /Border [0 0 0] +/Dest (_baseresponse) +/Subtype /Link +/Rect [463.656 667.27 534.51 677.77] +/Type /Annot +>> +endobj +58 0 obj +[54 0 R /XYZ 0 552.9 null] +endobj +59 0 obj +[54 0 R /XYZ 0 498.3 null] +endobj +60 0 obj +[54 0 R /XYZ 0 443.7 null] +endobj +61 0 obj +[54 0 R /XYZ 0 416.1 null] +endobj +62 0 obj +[54 0 R /XYZ 0 342.011 null] +endobj +63 0 obj +[54 0 R /XYZ 0 267.922 null] +endobj +64 0 obj +<< /Length 21899 +>> +stream +q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +BT +48.24 745.71 Td +/F2.0 10.5 Tf +<48545450> Tj +/F2.1 10.5 Tf +<42434647> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 719.58 Td +/F2.1 9 Tf +<424320> Tj +/F2.0 9 Tf +<323030> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 705.6 m +559.76 705.6 l +561.9691 705.6 563.76 703.8091 563.76 701.6 c +563.76 614.725 l +563.76 612.5159 561.9691 610.725 559.76 610.725 c +52.24 610.725 l +50.0309 610.725 48.24 612.5159 48.24 614.725 c +48.24 701.6 l +48.24 703.8091 50.0309 705.6 52.24 705.6 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 705.6 m +559.76 705.6 l +561.9691 705.6 563.76 703.8091 563.76 701.6 c +563.76 614.725 l +563.76 612.5159 561.9691 610.725 559.76 610.725 c +52.24 610.725 l +50.0309 610.725 48.24 612.5159 48.24 614.725 c +48.24 701.6 l +48.24 703.8091 50.0309 705.6 52.24 705.6 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 683.006 Td +/F4.0 11 Tf +<7b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 668.717 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 654.428 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +131.84 654.428 Td +/F1.1 11 Tf +<474a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +153.84 654.428 Td +/F4.0 11 Tf +<222c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 640.139 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 625.85 Td +/F4.0 11 Tf +<7d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 586.905 Td +/F2.1 9 Tf +<424320> Tj +/F2.0 9 Tf +<323031> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 572.925 m +559.76 572.925 l +561.9691 572.925 563.76 571.1341 563.76 568.925 c +563.76 482.05 l +563.76 479.8409 561.9691 478.05 559.76 478.05 c +52.24 478.05 l +50.0309 478.05 48.24 479.8409 48.24 482.05 c +48.24 568.925 l +48.24 571.1341 50.0309 572.925 52.24 572.925 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 572.925 m +559.76 572.925 l +561.9691 572.925 563.76 571.1341 563.76 568.925 c +563.76 482.05 l +563.76 479.8409 561.9691 478.05 559.76 478.05 c +52.24 478.05 l +50.0309 478.05 48.24 479.8409 48.24 482.05 c +48.24 568.925 l +48.24 571.1341 50.0309 572.925 52.24 572.925 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 550.331 Td +/F4.0 11 Tf +<7b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 536.042 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 521.753 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +131.84 521.753 Td +/F1.1 11 Tf +<474a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +153.84 521.753 Td +/F4.0 11 Tf +<222c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 507.464 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 493.175 Td +/F4.0 11 Tf +<7d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 450.31 Td +/F2.0 13 Tf +<322e312e332e20> Tj +/F2.1 13 Tf +<48333132494a3536> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 435.45 m +559.76 435.45 l +561.9691 435.45 563.76 433.6591 563.76 431.45 c +563.76 403.161 l +563.76 400.9519 561.9691 399.161 559.76 399.161 c +52.24 399.161 l +50.0309 399.161 48.24 400.9519 48.24 403.161 c +48.24 431.45 l +48.24 433.6591 50.0309 435.45 52.24 435.45 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 435.45 m +559.76 435.45 l +561.9691 435.45 563.76 433.6591 563.76 431.45 c +563.76 403.161 l +563.76 400.9519 561.9691 399.161 559.76 399.161 c +52.24 399.161 l +50.0309 399.161 48.24 400.9519 48.24 403.161 c +48.24 431.45 l +48.24 433.6591 50.0309 435.45 52.24 435.45 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 414.286 Td +/F4.0 11 Tf +<474554202f6170692f76312f6a6f696e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 373.871 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 348.071 Td +/F1.1 10.5 Tf +<9961> Tj +/F1.0 10.5 Tf +<494d4549> Tj +/F1.1 10.5 Tf +<9a9b9c9d9e> Tj +/F1.0 10.5 Tf +<504f53> Tj +/F1.1 10.5 Tf +<3b649f8841a03e3fa14142> Tj +/F1.0 10.5 Tf +[<3c6272> 38.0 <2f3e>] TJ +/F1.1 10.5 Tf + Tj +/F1.0 10.5 Tf +<415050> Tj +/F1.1 10.5 Tf +<40a6a7a8a9aa2babac25269bad94ae9c> Tj +/F1.0 10.5 Tf +[<3c6272> 38.0 <2f3e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 333.071 Td +/F1.1 10.5 Tf + Tj +/F1.0 10.5 Tf +<415050> Tj +/F1.1 10.5 Tf +<549fb38c8daa2b8841553e3f41422526474ab4b257b5b6b7b8b9> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 304.271 Td +/F2.1 10.5 Tf +<393a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 270.461 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 270.461 77.328 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +177.12 270.461 154.656 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +331.776 270.461 103.104 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +434.88 270.461 128.88 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 240.461 51.552 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 240.461 77.328 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +177.12 240.461 154.656 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +331.776 240.461 103.104 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +434.88 240.461 128.88 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 210.461 51.552 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +99.792 210.461 77.328 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +177.12 210.461 154.656 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +331.776 210.461 103.104 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +434.88 210.461 128.88 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 180.461 51.552 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 180.461 77.328 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +177.12 180.461 154.656 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +331.776 180.461 103.104 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +434.88 180.461 128.88 30.0 re +f +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 289.961 m +99.792 289.961 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 270.461 m +99.792 270.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 290.211 m +48.24 269.836 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 290.211 m +99.792 269.836 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 276.591 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 289.961 m +177.12 289.961 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +99.792 270.461 m +177.12 270.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 290.211 m +99.792 269.836 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 290.211 m +177.12 269.836 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 276.591 Td +/F2.1 10.5 Tf +<3d3e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 289.961 m +331.776 289.961 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +177.12 270.461 m +331.776 270.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 290.211 m +177.12 269.836 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 290.211 m +331.776 269.836 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +180.12 276.591 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 289.961 m +434.88 289.961 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +331.776 270.461 m +434.88 270.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 290.211 m +331.776 269.836 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 290.211 m +434.88 269.836 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +334.776 276.591 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 289.961 m +563.76 289.961 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +434.88 270.461 m +563.76 270.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 290.211 m +434.88 269.836 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 290.211 m +563.76 269.836 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +437.88 276.591 Td +/F2.1 10.5 Tf +<3f4041> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 270.461 m +99.792 270.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 240.461 m +99.792 240.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 271.086 m +48.24 240.211 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 271.086 m +99.792 240.211 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 251.841 Td +/F2.0 10.5 Tf +[<4865> 14.0 <61646572>] TJ +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +99.792 270.461 m +177.12 270.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 240.461 m +177.12 240.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 271.086 m +99.792 240.211 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 271.086 m +177.12 240.211 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 257.091 Td +/F2.0 10.5 Tf +[<4163> 30.0 <63> 30.0 <6570> 28.0 <74>] TJ +ET + + +BT +102.792 246.591 Td +ET + + +BT +102.792 246.591 Td +/F3.1 10.5 Tf +<2d2e> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +177.12 270.461 m +331.776 270.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 240.461 m +331.776 240.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 271.086 m +177.12 240.211 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 271.086 m +331.776 240.211 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +180.12 251.841 Td +/F1.0 10.5 Tf +[<4163> 24.0 <63> 24.0 <6570> 19.0 <74>] TJ +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +331.776 270.461 m +434.88 270.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 240.461 m +434.88 240.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 271.086 m +331.776 240.211 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 271.086 m +434.88 240.211 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +334.776 251.841 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +434.88 270.461 m +563.76 270.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 240.461 m +563.76 240.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 271.086 m +434.88 240.211 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 271.086 m +563.76 240.211 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +437.88 252.5235 Td +/F4.0 10.5 Tf +<226170706c69636174696f6e2f6a736f6e22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 240.461 m +99.792 240.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 210.461 m +99.792 210.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 240.711 m +48.24 210.211 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 240.711 m +99.792 210.211 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 221.841 Td +/F2.0 10.5 Tf +[<4865> 14.0 <61646572>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 240.461 m +177.12 240.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 210.461 m +177.12 210.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 240.711 m +99.792 210.211 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 240.711 m +177.12 210.211 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 227.091 Td +/F2.0 10.5 Tf +[<41> 3.0 <7574686f72697a> 19.0 <61> 19.0 <74696f6e>] TJ +ET + + +BT +102.792 216.591 Td +ET + + +BT +102.792 216.591 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 240.461 m +331.776 240.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 210.461 m +331.776 210.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 240.711 m +177.12 210.211 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 240.711 m +331.776 210.211 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +180.12 221.841 Td +/F1.0 10.5 Tf +[<41> 7.0 <7574686f72697a> 26.0 <61> 15.0 <74696f6e>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 240.461 m +434.88 240.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 210.461 m +434.88 210.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 240.711 m +331.776 210.211 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 240.711 m +434.88 210.211 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +334.776 221.841 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 240.461 m +563.76 240.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 210.461 m +563.76 210.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 240.711 m +434.88 210.211 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 240.711 m +563.76 210.211 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +437.88 222.5235 Td +/F4.0 10.5 Tf +<22746f6b656e22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 210.461 m +99.792 210.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 180.461 m +99.792 180.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 210.711 m +48.24 180.211 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 210.711 m +99.792 180.211 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 191.841 Td +/F2.0 10.5 Tf +[<51756572> -14.0 <79>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 210.461 m +177.12 210.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 180.461 m +177.12 180.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 210.711 m +99.792 180.211 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 210.711 m +177.12 180.211 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 197.091 Td +/F2.0 10.5 Tf +<696d6569> Tj +ET + + +BT +102.792 186.591 Td +ET + + +BT +102.792 186.591 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 210.461 m +331.776 210.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 180.461 m +331.776 180.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 210.711 m +177.12 180.211 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 210.711 m +331.776 180.211 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +180.12 191.841 Td +/F1.0 10.5 Tf +<494d4549> Tj +/F1.1 10.5 Tf +<9a> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 210.461 m +434.88 210.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 180.461 m +434.88 180.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 210.711 m +331.776 180.211 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 210.711 m +434.88 180.211 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +334.776 191.841 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 210.461 m +563.76 210.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 180.461 m +563.76 180.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 210.711 m +434.88 180.211 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 210.711 m +563.76 180.211 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +437.88 192.5235 Td +/F4.0 10.5 Tf +<223132333435353553484122> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 155.171 Td +/F2.1 10.5 Tf +<4243> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 110.861 51.552 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 110.861 360.864 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 110.861 103.104 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 91.361 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 91.361 360.864 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 91.361 103.104 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 71.861 51.552 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +99.792 71.861 360.864 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +460.656 71.861 103.104 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 52.361 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 52.361 360.864 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 52.361 103.104 19.5 re +f +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 140.861 m +99.792 140.861 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 110.861 m +99.792 110.861 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 141.111 m +48.24 110.236 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 141.111 m +99.792 110.236 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 127.491 Td +/F2.0 10.5 Tf +<48545450> Tj +/F2.1 10.5 Tf +<44> Tj +ET + + +BT +51.24 116.991 Td +/F2.1 10.5 Tf +<45> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 140.861 m +460.656 140.861 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +99.792 110.861 m +460.656 110.861 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 141.111 m +99.792 110.236 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 141.111 m +460.656 110.236 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 122.241 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 140.861 m +563.76 140.861 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +460.656 110.861 m +563.76 110.861 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 141.111 m +460.656 110.236 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 141.111 m +563.76 110.236 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 122.241 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 110.861 m +99.792 110.861 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 91.361 m +99.792 91.361 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 111.486 m +48.24 91.111 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 111.486 m +99.792 91.111 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 97.491 Td +/F2.0 10.5 Tf +<323030> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +99.792 110.861 m +460.656 110.861 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 91.361 m +460.656 91.361 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 111.486 m +99.792 91.111 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 111.486 m +460.656 91.111 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 97.491 Td +/F1.1 10.5 Tf +<2d2e454647> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +460.656 110.861 m +563.76 110.861 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 91.361 m +563.76 91.361 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 111.486 m +460.656 91.111 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 111.486 m +563.76 91.111 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +463.656 97.491 Td +/F1.1 10.5 Tf +<88413e3fbabb8687> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 91.361 m +99.792 91.361 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 71.861 m +99.792 71.861 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 91.611 m +48.24 71.611 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 91.611 m +99.792 71.611 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 77.991 Td +/F2.0 10.5 Tf +<323031> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 91.361 m +460.656 91.361 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 71.861 m +460.656 71.861 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 91.611 m +99.792 71.611 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 91.611 m +460.656 71.611 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 77.991 Td +/F1.1 10.5 Tf +<4849474a4b4c4d> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 91.361 m +563.76 91.361 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 71.861 m +563.76 71.861 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 91.611 m +460.656 71.611 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 91.611 m +563.76 71.611 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +463.656 77.991 Td +/F1.1 10.5 Tf +<88413e3fbabb8687> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 71.861 m +99.792 71.861 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 52.361 m +99.792 52.361 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 72.111 m +48.24 52.111 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 72.111 m +99.792 52.111 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 58.491 Td +/F2.0 10.5 Tf +<343030> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 71.861 m +460.656 71.861 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 52.361 m +460.656 52.361 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 72.111 m +99.792 52.111 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 72.111 m +460.656 52.111 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 58.491 Td +/F1.1 10.5 Tf +<2d2e4e4f505152535455565758592d2e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 71.861 m +563.76 71.861 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 52.361 m +563.76 52.361 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 72.111 m +460.656 52.111 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 72.111 m +563.76 52.111 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 58.491 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp1 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +557.765 11.04 Td +/F1.0 9 Tf +<35> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +65 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 612.0 792.0] +/CropBox [0 0 612.0 792.0] +/BleedBox [0 0 612.0 792.0] +/TrimBox [0 0 612.0 792.0] +/ArtBox [0 0 612.0 792.0] +/Contents 64 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F2.0 16 0 R +/F2.1 17 0 R +/F4.0 23 0 R +/F1.1 8 0 R +/F1.0 9 0 R +/F3.1 19 0 R +>> +/XObject << /Stamp1 217 0 R +>> +>> +/Annots [73 0 R 74 0 R] +>> +endobj +66 0 obj +[65 0 R /XYZ 0 792.0 null] +endobj +67 0 obj +[65 0 R /XYZ 0 731.4 null] +endobj +68 0 obj +[65 0 R /XYZ 0 598.725 null] +endobj +69 0 obj +[65 0 R /XYZ 0 466.05 null] +endobj +70 0 obj +[65 0 R /XYZ 0 387.161 null] +endobj +71 0 obj +[65 0 R /XYZ 0 317.561 null] +endobj +72 0 obj +[65 0 R /XYZ 0 168.461 null] +endobj +73 0 obj +<< /Border [0 0 0] +/Dest (_38a29557fd886180f3eb6d6d45561da2) +/Subtype /Link +/Rect [463.656 96.231 547.656 106.731] +/Type /Annot +>> +endobj +74 0 obj +<< /Border [0 0 0] +/Dest (_38a29557fd886180f3eb6d6d45561da2) +/Subtype /Link +/Rect [463.656 76.731 547.656 87.231] +/Type /Annot +>> +endobj +75 0 obj +<< /Length 12929 +>> +stream +q +/DeviceRGB cs +1.0 1.0 1.0 scn +48.24 726.0 51.552 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 726.0 360.864 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 726.0 103.104 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 706.5 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 706.5 360.864 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 706.5 103.104 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 687.0 51.552 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +99.792 687.0 360.864 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +460.656 687.0 103.104 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 667.5 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 667.5 360.864 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 667.5 103.104 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 648.0 51.552 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +99.792 648.0 360.864 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +460.656 648.0 103.104 19.5 re +f +0.0 0.0 0.0 scn +0.5 w +/DeviceRGB CS +0.8667 0.8667 0.8667 SCN +48.24 756.0 m +99.792 756.0 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 726.0 m +99.792 726.0 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 756.25 m +48.24 725.375 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 756.25 m +99.792 725.375 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 742.63 Td +/F2.0 10.5 Tf +<48545450> Tj +/F2.1 10.5 Tf +<44> Tj +ET + + +BT +51.24 732.13 Td +/F2.1 10.5 Tf +<45> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 756.0 m +460.656 756.0 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +99.792 726.0 m +460.656 726.0 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 756.25 m +99.792 725.375 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 756.25 m +460.656 725.375 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 737.38 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 756.0 m +563.76 756.0 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +460.656 726.0 m +563.76 726.0 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 756.25 m +460.656 725.375 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 756.25 m +563.76 725.375 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 737.38 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 726.0 m +99.792 726.0 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 706.5 m +99.792 706.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 726.25 m +48.24 706.25 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 726.25 m +99.792 706.25 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 712.63 Td +/F2.0 10.5 Tf +<343031> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 726.0 m +460.656 726.0 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 706.5 m +460.656 706.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 726.25 m +99.792 706.25 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 726.25 m +460.656 706.25 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 712.63 Td +/F1.1 10.5 Tf +<5d5e5f372c3b60524461> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 726.0 m +563.76 726.0 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 706.5 m +563.76 706.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 726.25 m +460.656 706.25 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 726.25 m +563.76 706.25 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 712.63 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 706.5 m +99.792 706.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 687.0 m +99.792 687.0 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 706.75 m +48.24 686.75 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 706.75 m +99.792 686.75 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 693.13 Td +/F2.0 10.5 Tf +<343033> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 706.5 m +460.656 706.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 687.0 m +460.656 687.0 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 706.75 m +99.792 686.75 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 706.75 m +460.656 686.75 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 693.13 Td +/F1.1 10.5 Tf +<23243325622d2e54636465666768> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 706.5 m +563.76 706.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 687.0 m +563.76 687.0 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 706.75 m +460.656 686.75 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 706.75 m +563.76 686.75 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 693.13 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 687.0 m +99.792 687.0 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 667.5 m +99.792 667.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 687.25 m +48.24 667.25 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 687.25 m +99.792 667.25 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 673.63 Td +/F2.0 10.5 Tf +<343034> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 687.0 m +460.656 687.0 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 667.5 m +460.656 667.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 687.25 m +99.792 667.25 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 687.25 m +460.656 667.25 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 673.63 Td +/F1.1 10.5 Tf +<23243369566a343f4048496b2728566c6d> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 687.0 m +563.76 687.0 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 667.5 m +563.76 667.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 687.25 m +460.656 667.25 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 687.25 m +563.76 667.25 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 673.63 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 667.5 m +99.792 667.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 648.0 m +99.792 648.0 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 667.75 m +48.24 647.75 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 667.75 m +99.792 647.75 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 654.13 Td +/F2.0 10.5 Tf +<353030> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 667.5 m +460.656 667.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 648.0 m +460.656 648.0 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 667.75 m +99.792 647.75 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 667.75 m +460.656 647.75 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 654.13 Td +/F1.1 10.5 Tf +<2324336e6f7071> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 667.5 m +563.76 667.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 648.0 m +563.76 648.0 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 667.75 m +460.656 647.75 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 667.75 m +563.76 647.75 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 654.13 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 622.71 Td +/F2.1 10.5 Tf +<292a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +55.511 596.91 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +70.74 598.275 Td +/F4.0 10.5 Tf +<6170706c69636174696f6e2f6a736f6e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 568.11 Td +/F2.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +55.511 542.31 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +70.74 543.675 Td +/F4.0 10.5 Tf +<6170706c69636174696f6e2f6a736f6e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 513.51 Td +/F2.0 10.5 Tf +<48545450> Tj +/F2.1 10.5 Tf +<2f304647> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 487.38 Td +/F2.1 9 Tf +<2f3020> Tj +/F2.0 9 Tf +[<70> 14.0 <61> 19.0 <7468>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 473.4 m +559.76 473.4 l +561.9691 473.4 563.76 471.6091 563.76 469.4 c +563.76 441.111 l +563.76 438.9019 561.9691 437.111 559.76 437.111 c +52.24 437.111 l +50.0309 437.111 48.24 438.9019 48.24 441.111 c +48.24 469.4 l +48.24 471.6091 50.0309 473.4 52.24 473.4 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 473.4 m +559.76 473.4 l +561.9691 473.4 563.76 471.6091 563.76 469.4 c +563.76 441.111 l +563.76 438.9019 561.9691 437.111 559.76 437.111 c +52.24 437.111 l +50.0309 437.111 48.24 438.9019 48.24 441.111 c +48.24 469.4 l +48.24 471.6091 50.0309 473.4 52.24 473.4 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 452.236 Td +/F4.0 11 Tf +<2f6170692f76312f6a6f696e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 413.291 Td +/F2.1 9 Tf +<2f3020> Tj +/F2.0 9 Tf +[<6865> 14.0 <61646572>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 399.311 m +559.76 399.311 l +561.9691 399.311 563.76 397.5201 563.76 395.311 c +563.76 367.022 l +563.76 364.8129 561.9691 363.022 559.76 363.022 c +52.24 363.022 l +50.0309 363.022 48.24 364.8129 48.24 367.022 c +48.24 395.311 l +48.24 397.5201 50.0309 399.311 52.24 399.311 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 399.311 m +559.76 399.311 l +561.9691 399.311 563.76 397.5201 563.76 395.311 c +563.76 367.022 l +563.76 364.8129 561.9691 363.022 559.76 363.022 c +52.24 363.022 l +50.0309 363.022 48.24 364.8129 48.24 367.022 c +48.24 395.311 l +48.24 397.5201 50.0309 399.311 52.24 399.311 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 378.147 Td +/F4.0 11 Tf +<22737472696e6722> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 339.202 Td +/F2.1 9 Tf +<2f3020> Tj +/F2.0 9 Tf +[<71756572> -14.0 <79>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 325.222 m +559.76 325.222 l +561.9691 325.222 563.76 323.4311 563.76 321.222 c +563.76 262.925 l +563.76 260.7159 561.9691 258.925 559.76 258.925 c +52.24 258.925 l +50.0309 258.925 48.24 260.7159 48.24 262.925 c +48.24 321.222 l +48.24 323.4311 50.0309 325.222 52.24 325.222 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 325.222 m +559.76 325.222 l +561.9691 325.222 563.76 323.4311 563.76 321.222 c +563.76 262.925 l +563.76 260.7159 561.9691 258.925 559.76 258.925 c +52.24 258.925 l +50.0309 258.925 48.24 260.7159 48.24 262.925 c +48.24 321.222 l +48.24 323.4311 50.0309 325.222 52.24 325.222 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 302.628 Td +/F4.0 11 Tf +<7b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 288.339 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 274.05 Td +/F4.0 11 Tf +<7d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 233.635 Td +/F2.0 10.5 Tf +<48545450> Tj +/F2.1 10.5 Tf +<42434647> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 207.505 Td +/F2.1 9 Tf +<424320> Tj +/F2.0 9 Tf +<323030> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 193.525 m +559.76 193.525 l +561.9691 193.525 563.76 191.7341 563.76 189.525 c +563.76 88.361 l +563.76 86.1519 561.9691 84.361 559.76 84.361 c +52.24 84.361 l +50.0309 84.361 48.24 86.1519 48.24 88.361 c +48.24 189.525 l +48.24 191.7341 50.0309 193.525 52.24 193.525 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 193.525 m +559.76 193.525 l +561.9691 193.525 563.76 191.7341 563.76 189.525 c +563.76 88.361 l +563.76 86.1519 561.9691 84.361 559.76 84.361 c +52.24 84.361 l +50.0309 84.361 48.24 86.1519 48.24 88.361 c +48.24 189.525 l +48.24 191.7341 50.0309 193.525 52.24 193.525 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 170.931 Td +/F4.0 11 Tf +<7b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 156.642 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 142.353 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 128.064 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +131.84 128.064 Td +/F1.1 11 Tf +<474a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +153.84 128.064 Td +/F4.0 11 Tf +<222c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 113.775 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 99.486 Td +/F4.0 11 Tf +<7d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp2 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +49.24 11.04 Td +/F1.0 9 Tf +<36> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +76 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 612.0 792.0] +/CropBox [0 0 612.0 792.0] +/BleedBox [0 0 612.0 792.0] +/TrimBox [0 0 612.0 792.0] +/ArtBox [0 0 612.0 792.0] +/Contents 75 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F2.0 16 0 R +/F2.1 17 0 R +/F1.1 8 0 R +/F1.0 9 0 R +/F4.0 23 0 R +>> +/XObject << /Stamp2 218 0 R +>> +>> +>> +endobj +77 0 obj +[76 0 R /XYZ 0 636.0 null] +endobj +78 0 obj +<< /Limits [(0x5fe5938de5ba945f3230305f32) (0x5fe5938de5ba945f33)] +/Names [(0x5fe5938de5ba945f3230305f32) 67 0 R (0x5fe5938de5ba945f3230305f33) 86 0 R (0x5fe5938de5ba945f3230305f34) 106 0 R (0x5fe5938de5ba945f3230305f35) 126 0 R (0x5fe5938de5ba945f3230305f36) 152 0 R (0x5fe5938de5ba945f3230305f37) 175 0 R (0x5fe5938de5ba945f3230305f38) 194 0 R (0x5fe5938de5ba945f323031) 48 0 R (0x5fe5938de5ba945f3230315f32) 68 0 R (0x5fe5938de5ba945f3230315f33) 89 0 R (0x5fe5938de5ba945f3230315f34) 107 0 R (0x5fe5938de5ba945f3230315f35) 127 0 R (0x5fe5938de5ba945f3230315f36) 153 0 R (0x5fe5938de5ba945f3230315f37) 176 0 R (0x5fe5938de5ba945f3230315f38) 197 0 R (0x5fe5938de5ba945f33) 72 0 R] +>> +endobj +79 0 obj +[76 0 R /XYZ 0 581.4 null] +endobj +80 0 obj +[76 0 R /XYZ 0 526.8 null] +endobj +81 0 obj +[76 0 R /XYZ 0 499.2 null] +endobj +82 0 obj +<< /Limits [(0x5fe8afb7e6b1825f6865616465725f33) (0x5fe8afb7e6b1825f706174685f34)] +/Names [(0x5fe8afb7e6b1825f6865616465725f33) 83 0 R (0x5fe8afb7e6b1825f6865616465725f34) 103 0 R (0x5fe8afb7e6b1825f6865616465725f35) 121 0 R (0x5fe8afb7e6b1825f6865616465725f36) 146 0 R (0x5fe8afb7e6b1825f6865616465725f37) 170 0 R (0x5fe8afb7e6b1825f6865616465725f38) 191 0 R (0x5fe8afb7e6b1825f70617468) 39 0 R (0x5fe8afb7e6b1825f706174685f32) 61 0 R (0x5fe8afb7e6b1825f706174685f33) 81 0 R (0x5fe8afb7e6b1825f706174685f34) 102 0 R] +>> +endobj +83 0 obj +[76 0 R /XYZ 0 425.111 null] +endobj +84 0 obj +[76 0 R /XYZ 0 351.022 null] +endobj +85 0 obj +[76 0 R /XYZ 0 246.925 null] +endobj +86 0 obj +[76 0 R /XYZ 0 219.325 null] +endobj +87 0 obj +<< /Length 25975 +>> +stream +q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +BT +48.24 747.18 Td +/F2.1 9 Tf +<424320> Tj +/F2.0 9 Tf +<323031> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 733.2 m +559.76 733.2 l +561.9691 733.2 563.76 731.4091 563.76 729.2 c +563.76 628.036 l +563.76 625.8269 561.9691 624.036 559.76 624.036 c +52.24 624.036 l +50.0309 624.036 48.24 625.8269 48.24 628.036 c +48.24 729.2 l +48.24 731.4091 50.0309 733.2 52.24 733.2 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 733.2 m +559.76 733.2 l +561.9691 733.2 563.76 731.4091 563.76 729.2 c +563.76 628.036 l +563.76 625.8269 561.9691 624.036 559.76 624.036 c +52.24 624.036 l +50.0309 624.036 48.24 625.8269 48.24 628.036 c +48.24 729.2 l +48.24 731.4091 50.0309 733.2 52.24 733.2 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 710.606 Td +/F4.0 11 Tf +<7b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 696.317 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 682.028 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 667.739 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +131.84 667.739 Td +/F1.1 11 Tf +<474a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +153.84 667.739 Td +/F4.0 11 Tf +<222c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 653.45 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 639.161 Td +/F4.0 11 Tf +<7d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 596.296 Td +/F2.0 13 Tf +<322e312e342e20> Tj +/F2.1 13 Tf +<4b4c4d4e3536> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 581.436 m +559.76 581.436 l +561.9691 581.436 563.76 579.6451 563.76 577.436 c +563.76 549.147 l +563.76 546.9379 561.9691 545.147 559.76 545.147 c +52.24 545.147 l +50.0309 545.147 48.24 546.9379 48.24 549.147 c +48.24 577.436 l +48.24 579.6451 50.0309 581.436 52.24 581.436 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 581.436 m +559.76 581.436 l +561.9691 581.436 563.76 579.6451 563.76 577.436 c +563.76 549.147 l +563.76 546.9379 561.9691 545.147 559.76 545.147 c +52.24 545.147 l +50.0309 545.147 48.24 546.9379 48.24 549.147 c +48.24 577.436 l +48.24 579.6451 50.0309 581.436 52.24 581.436 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 560.272 Td +/F4.0 11 Tf +<504f5354202f6170692f76312f7265706f7274> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 519.857 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 494.057 Td +/F1.1 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 465.257 Td +/F2.1 10.5 Tf +<393a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 431.447 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 431.447 77.328 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +177.12 431.447 154.656 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +331.776 431.447 103.104 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +434.88 431.447 128.88 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 401.447 51.552 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 401.447 77.328 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +177.12 401.447 154.656 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +331.776 401.447 103.104 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +434.88 401.447 128.88 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 371.447 51.552 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +99.792 371.447 77.328 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +177.12 371.447 154.656 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +331.776 371.447 103.104 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +434.88 371.447 128.88 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 341.447 51.552 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 341.447 77.328 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +177.12 341.447 154.656 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +331.776 341.447 103.104 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +434.88 341.447 128.88 30.0 re +f +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 450.947 m +99.792 450.947 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 431.447 m +99.792 431.447 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 451.197 m +48.24 430.822 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 451.197 m +99.792 430.822 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 437.577 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 450.947 m +177.12 450.947 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +99.792 431.447 m +177.12 431.447 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 451.197 m +99.792 430.822 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 451.197 m +177.12 430.822 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 437.577 Td +/F2.1 10.5 Tf +<3d3e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 450.947 m +331.776 450.947 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +177.12 431.447 m +331.776 431.447 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 451.197 m +177.12 430.822 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 451.197 m +331.776 430.822 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +180.12 437.577 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 450.947 m +434.88 450.947 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +331.776 431.447 m +434.88 431.447 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 451.197 m +331.776 430.822 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 451.197 m +434.88 430.822 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +334.776 437.577 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 450.947 m +563.76 450.947 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +434.88 431.447 m +563.76 431.447 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 451.197 m +434.88 430.822 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 451.197 m +563.76 430.822 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +437.88 437.577 Td +/F2.1 10.5 Tf +<3f4041> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 431.447 m +99.792 431.447 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 401.447 m +99.792 401.447 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 432.072 m +48.24 401.197 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 432.072 m +99.792 401.197 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 412.827 Td +/F2.0 10.5 Tf +[<4865> 14.0 <61646572>] TJ +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +99.792 431.447 m +177.12 431.447 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 401.447 m +177.12 401.447 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 432.072 m +99.792 401.197 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 432.072 m +177.12 401.197 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 418.077 Td +/F2.0 10.5 Tf +[<41> 3.0 <7574686f72697a> 19.0 <61> 19.0 <74696f6e>] TJ +ET + + +BT +102.792 407.577 Td +ET + + +BT +102.792 407.577 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +177.12 431.447 m +331.776 431.447 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 401.447 m +331.776 401.447 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 432.072 m +177.12 401.197 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 432.072 m +331.776 401.197 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +180.12 412.827 Td +/F1.0 10.5 Tf +[<41> 7.0 <7574686f72697a> 26.0 <61> 15.0 <74696f6e>] TJ +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +331.776 431.447 m +434.88 431.447 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 401.447 m +434.88 401.447 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 432.072 m +331.776 401.197 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 432.072 m +434.88 401.197 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +334.776 412.827 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +434.88 431.447 m +563.76 431.447 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 401.447 m +563.76 401.447 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 432.072 m +434.88 401.197 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 432.072 m +563.76 401.197 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +437.88 413.5095 Td +/F4.0 10.5 Tf +<22746f6b656e22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 401.447 m +99.792 401.447 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 371.447 m +99.792 371.447 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 401.697 m +48.24 371.197 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 401.697 m +99.792 371.197 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 382.827 Td +/F2.0 10.5 Tf +[<4865> 14.0 <61646572>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 401.447 m +177.12 401.447 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 371.447 m +177.12 371.447 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 401.697 m +99.792 371.197 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 401.697 m +177.12 371.197 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 388.077 Td +/F2.0 10.5 Tf +[<436f6e74> 19.0 <656e74> 38.0 <2d> 61.0 <54> 30.0 <797065>] TJ +ET + + +BT +102.792 377.577 Td +ET + + +BT +102.792 377.577 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 401.447 m +331.776 401.447 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 371.447 m +331.776 371.447 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 401.697 m +177.12 371.197 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 401.697 m +331.776 371.197 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +180.12 382.827 Td +/F1.0 10.5 Tf +[<436f6e74> 15.0 <656e74> 29.0 <2d> 53.0 <54> 37.0 <797065>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 401.447 m +434.88 401.447 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 371.447 m +434.88 371.447 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 401.697 m +331.776 371.197 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 401.697 m +434.88 371.197 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +334.776 382.827 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 401.447 m +563.76 401.447 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 371.447 m +563.76 371.447 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 401.697 m +434.88 371.197 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 401.697 m +563.76 371.197 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +437.88 383.5095 Td +/F4.0 10.5 Tf +<226170706c69636174696f6e2f6a736f6e22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 371.447 m +99.792 371.447 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 341.447 m +99.792 341.447 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 371.697 m +48.24 341.197 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 371.697 m +99.792 341.197 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 352.827 Td +/F2.0 10.5 Tf +<426f6479> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 371.447 m +177.12 371.447 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 341.447 m +177.12 341.447 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 371.697 m +99.792 341.197 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 371.697 m +177.12 341.197 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 358.077 Td +/F2.0 10.5 Tf +[<70> 14.0 <6172> 31.0 <616d>] TJ +ET + + +BT +102.792 347.577 Td +ET + + +BT +102.792 347.577 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 371.447 m +331.776 371.447 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 341.447 m +331.776 341.447 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 371.697 m +177.12 341.197 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 371.697 m +331.776 341.197 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +180.12 352.827 Td +/F1.0 10.5 Tf +[<70> 16.0 <6172> 27.0 <616d>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 371.447 m +434.88 371.447 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 341.447 m +434.88 341.447 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 371.697 m +331.776 341.197 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 371.697 m +434.88 341.197 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +334.776 352.827 Td +/F1.1 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 371.447 m +563.76 371.447 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 341.447 m +563.76 341.447 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 371.697 m +434.88 341.197 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 371.697 m +563.76 341.197 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 316.157 Td +/F2.1 10.5 Tf +<4243> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 271.847 51.552 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 271.847 360.864 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 271.847 103.104 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 252.347 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 252.347 360.864 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 252.347 103.104 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 232.847 51.552 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +99.792 232.847 360.864 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +460.656 232.847 103.104 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 213.347 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 213.347 360.864 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 213.347 103.104 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 193.847 51.552 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +99.792 193.847 360.864 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +460.656 193.847 103.104 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 174.347 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 174.347 360.864 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 174.347 103.104 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 154.847 51.552 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +99.792 154.847 360.864 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +460.656 154.847 103.104 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 135.347 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 135.347 360.864 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 135.347 103.104 19.5 re +f +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 301.847 m +99.792 301.847 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 271.847 m +99.792 271.847 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 302.097 m +48.24 271.222 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 302.097 m +99.792 271.222 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 288.477 Td +/F2.0 10.5 Tf +<48545450> Tj +/F2.1 10.5 Tf +<44> Tj +ET + + +BT +51.24 277.977 Td +/F2.1 10.5 Tf +<45> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 301.847 m +460.656 301.847 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +99.792 271.847 m +460.656 271.847 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 302.097 m +99.792 271.222 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 302.097 m +460.656 271.222 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 283.227 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 301.847 m +563.76 301.847 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +460.656 271.847 m +563.76 271.847 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 302.097 m +460.656 271.222 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 302.097 m +563.76 271.222 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 283.227 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 271.847 m +99.792 271.847 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 252.347 m +99.792 252.347 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 272.472 m +48.24 252.097 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 272.472 m +99.792 252.097 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 258.477 Td +/F2.0 10.5 Tf +<323030> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +99.792 271.847 m +460.656 271.847 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 252.347 m +460.656 252.347 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 272.472 m +99.792 252.097 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 272.472 m +460.656 252.097 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 258.477 Td +/F1.1 10.5 Tf +<2d2e454647> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +460.656 271.847 m +563.76 271.847 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 252.347 m +563.76 252.347 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 272.472 m +460.656 252.097 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 272.472 m +563.76 252.097 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +463.656 258.477 Td +/F1.0 10.5 Tf +[<4261736552> 11.0 <6573706f6e7365>] TJ +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 252.347 m +99.792 252.347 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 232.847 m +99.792 232.847 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 252.597 m +48.24 232.597 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 252.597 m +99.792 232.597 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 238.977 Td +/F2.0 10.5 Tf +<323031> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 252.347 m +460.656 252.347 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 232.847 m +460.656 232.847 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 252.597 m +99.792 232.597 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 252.597 m +460.656 232.597 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 238.977 Td +/F1.1 10.5 Tf +<4849474a4b4c4d> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 252.347 m +563.76 252.347 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 232.847 m +563.76 232.847 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 252.597 m +460.656 232.597 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 252.597 m +563.76 232.597 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +463.656 238.977 Td +/F1.0 10.5 Tf +[<4261736552> 11.0 <6573706f6e7365>] TJ +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 232.847 m +99.792 232.847 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 213.347 m +99.792 213.347 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 233.097 m +48.24 213.097 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 233.097 m +99.792 213.097 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 219.477 Td +/F2.0 10.5 Tf +<343030> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 232.847 m +460.656 232.847 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 213.347 m +460.656 213.347 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 233.097 m +99.792 213.097 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 233.097 m +460.656 213.097 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 219.477 Td +/F1.1 10.5 Tf +<2d2e4e4f505152535455565758592d2e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 232.847 m +563.76 232.847 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 213.347 m +563.76 213.347 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 233.097 m +460.656 213.097 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 233.097 m +563.76 213.097 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 219.477 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 213.347 m +99.792 213.347 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 193.847 m +99.792 193.847 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 213.597 m +48.24 193.597 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 213.597 m +99.792 193.597 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 199.977 Td +/F2.0 10.5 Tf +<343031> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 213.347 m +460.656 213.347 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 193.847 m +460.656 193.847 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 213.597 m +99.792 193.597 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 213.597 m +460.656 193.597 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 199.977 Td +/F1.1 10.5 Tf +<5d5e5f372c3b60524461> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 213.347 m +563.76 213.347 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 193.847 m +563.76 193.847 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 213.597 m +460.656 193.597 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 213.597 m +563.76 193.597 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 199.977 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 193.847 m +99.792 193.847 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 174.347 m +99.792 174.347 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 194.097 m +48.24 174.097 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 194.097 m +99.792 174.097 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 180.477 Td +/F2.0 10.5 Tf +<343033> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 193.847 m +460.656 193.847 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 174.347 m +460.656 174.347 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 194.097 m +99.792 174.097 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 194.097 m +460.656 174.097 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 180.477 Td +/F1.1 10.5 Tf +<23243325622d2e54636465666768> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 193.847 m +563.76 193.847 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 174.347 m +563.76 174.347 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 194.097 m +460.656 174.097 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 194.097 m +563.76 174.097 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 180.477 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 174.347 m +99.792 174.347 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 154.847 m +99.792 154.847 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 174.597 m +48.24 154.597 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 174.597 m +99.792 154.597 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 160.977 Td +/F2.0 10.5 Tf +<343034> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 174.347 m +460.656 174.347 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 154.847 m +460.656 154.847 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 174.597 m +99.792 154.597 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 174.597 m +460.656 154.597 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 160.977 Td +/F1.1 10.5 Tf +<23243369566a343f4048496b2728566c6d> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 174.347 m +563.76 174.347 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 154.847 m +563.76 154.847 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 174.597 m +460.656 154.597 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 174.597 m +563.76 154.597 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 160.977 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 154.847 m +99.792 154.847 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 135.347 m +99.792 135.347 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 155.097 m +48.24 135.097 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 155.097 m +99.792 135.097 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 141.477 Td +/F2.0 10.5 Tf +<353030> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 154.847 m +460.656 154.847 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 135.347 m +460.656 135.347 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 155.097 m +99.792 135.097 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 155.097 m +460.656 135.097 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 141.477 Td +/F1.1 10.5 Tf +<2324336e6f7071> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 154.847 m +563.76 154.847 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 135.347 m +563.76 135.347 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 155.097 m +460.656 135.097 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 155.097 m +563.76 135.097 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 141.477 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 110.057 Td +/F2.1 10.5 Tf +<292a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +55.511 84.257 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +70.74 85.622 Td +/F4.0 10.5 Tf +<6170706c69636174696f6e2f6a736f6e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp1 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +557.765 11.04 Td +/F1.0 9 Tf +<37> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +88 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 612.0 792.0] +/CropBox [0 0 612.0 792.0] +/BleedBox [0 0 612.0 792.0] +/TrimBox [0 0 612.0 792.0] +/ArtBox [0 0 612.0 792.0] +/Contents 87 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F2.1 17 0 R +/F2.0 16 0 R +/F4.0 23 0 R +/F1.1 8 0 R +/F3.1 19 0 R +/F1.0 9 0 R +>> +/XObject << /Stamp1 217 0 R +>> +>> +/Annots [93 0 R 95 0 R 96 0 R] +>> +endobj +89 0 obj +[88 0 R /XYZ 0 792.0 null] +endobj +90 0 obj +[88 0 R /XYZ 0 612.036 null] +endobj +91 0 obj +[88 0 R /XYZ 0 533.147 null] +endobj +92 0 obj +[88 0 R /XYZ 0 478.547 null] +endobj +93 0 obj +<< /Border [0 0 0] +/Dest (_f236cea25620e9b591ca247c6b9fc143) +/Subtype /Link +/Rect [334.776 351.567 376.776 362.067] +/Type /Annot +>> +endobj +94 0 obj +[88 0 R /XYZ 0 329.447 null] +endobj +95 0 obj +<< /Border [0 0 0] +/Dest (_baseresponse) +/Subtype /Link +/Rect [463.656 257.217 534.51 267.717] +/Type /Annot +>> +endobj +96 0 obj +<< /Border [0 0 0] +/Dest (_baseresponse) +/Subtype /Link +/Rect [463.656 237.717 534.51 248.217] +/Type /Annot +>> +endobj +97 0 obj +[88 0 R /XYZ 0 123.347 null] +endobj +98 0 obj +<< /Length 8540 +>> +stream +q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +BT +48.24 745.71 Td +/F2.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +55.511 719.91 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +70.74 721.275 Td +/F4.0 10.5 Tf +<6170706c69636174696f6e2f6a736f6e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 691.11 Td +/F2.0 10.5 Tf +<48545450> Tj +/F2.1 10.5 Tf +<2f304647> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 664.98 Td +/F2.1 9 Tf +<2f3020> Tj +/F2.0 9 Tf +[<70> 14.0 <61> 19.0 <7468>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 651.0 m +559.76 651.0 l +561.9691 651.0 563.76 649.2091 563.76 647.0 c +563.76 618.711 l +563.76 616.5019 561.9691 614.711 559.76 614.711 c +52.24 614.711 l +50.0309 614.711 48.24 616.5019 48.24 618.711 c +48.24 647.0 l +48.24 649.2091 50.0309 651.0 52.24 651.0 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 651.0 m +559.76 651.0 l +561.9691 651.0 563.76 649.2091 563.76 647.0 c +563.76 618.711 l +563.76 616.5019 561.9691 614.711 559.76 614.711 c +52.24 614.711 l +50.0309 614.711 48.24 616.5019 48.24 618.711 c +48.24 647.0 l +48.24 649.2091 50.0309 651.0 52.24 651.0 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 629.836 Td +/F4.0 11 Tf +<2f6170692f76312f7265706f7274> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 590.891 Td +/F2.1 9 Tf +<2f3020> Tj +/F2.0 9 Tf +[<6865> 14.0 <61646572>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 576.911 m +559.76 576.911 l +561.9691 576.911 563.76 575.1201 563.76 572.911 c +563.76 544.622 l +563.76 542.4129 561.9691 540.622 559.76 540.622 c +52.24 540.622 l +50.0309 540.622 48.24 542.4129 48.24 544.622 c +48.24 572.911 l +48.24 575.1201 50.0309 576.911 52.24 576.911 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 576.911 m +559.76 576.911 l +561.9691 576.911 563.76 575.1201 563.76 572.911 c +563.76 544.622 l +563.76 542.4129 561.9691 540.622 559.76 540.622 c +52.24 540.622 l +50.0309 540.622 48.24 542.4129 48.24 544.622 c +48.24 572.911 l +48.24 575.1201 50.0309 576.911 52.24 576.911 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 555.747 Td +/F4.0 11 Tf +<22737472696e6722> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 516.802 Td +/F2.1 9 Tf +<2f3020> Tj +/F2.0 9 Tf +<626f6479> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 502.822 m +559.76 502.822 l +561.9691 502.822 563.76 501.0311 563.76 498.822 c +563.76 426.236 l +563.76 424.0269 561.9691 422.236 559.76 422.236 c +52.24 422.236 l +50.0309 422.236 48.24 424.0269 48.24 426.236 c +48.24 498.822 l +48.24 501.0311 50.0309 502.822 52.24 502.822 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 502.822 m +559.76 502.822 l +561.9691 502.822 563.76 501.0311 563.76 498.822 c +563.76 426.236 l +563.76 424.0269 561.9691 422.236 559.76 422.236 c +52.24 422.236 l +50.0309 422.236 48.24 424.0269 48.24 426.236 c +48.24 498.822 l +48.24 501.0311 50.0309 502.822 52.24 502.822 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 480.228 Td +/F4.0 11 Tf +<7b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 465.939 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 451.65 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +164.84 451.65 Td +/F1.1 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +296.84 451.65 Td +/F4.0 11 Tf +<333231> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +316.64 451.65 Td +/F1.1 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +327.64 451.65 Td +/F4.0 11 Tf +<22> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 437.361 Td +/F4.0 11 Tf +<7d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 396.946 Td +/F2.0 10.5 Tf +<48545450> Tj +/F2.1 10.5 Tf +<42434647> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 370.816 Td +/F2.1 9 Tf +<424320> Tj +/F2.0 9 Tf +<323030> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 356.836 m +559.76 356.836 l +561.9691 356.836 563.76 355.0451 563.76 352.836 c +563.76 265.961 l +563.76 263.7519 561.9691 261.961 559.76 261.961 c +52.24 261.961 l +50.0309 261.961 48.24 263.7519 48.24 265.961 c +48.24 352.836 l +48.24 355.0451 50.0309 356.836 52.24 356.836 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 356.836 m +559.76 356.836 l +561.9691 356.836 563.76 355.0451 563.76 352.836 c +563.76 265.961 l +563.76 263.7519 561.9691 261.961 559.76 261.961 c +52.24 261.961 l +50.0309 261.961 48.24 263.7519 48.24 265.961 c +48.24 352.836 l +48.24 355.0451 50.0309 356.836 52.24 356.836 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 334.242 Td +/F4.0 11 Tf +<7b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 319.953 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 305.664 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +131.84 305.664 Td +/F1.1 11 Tf +<474a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +153.84 305.664 Td +/F4.0 11 Tf +<222c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 291.375 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 277.086 Td +/F4.0 11 Tf +<7d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 238.141 Td +/F2.1 9 Tf +<424320> Tj +/F2.0 9 Tf +<323031> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 224.161 m +559.76 224.161 l +561.9691 224.161 563.76 222.3701 563.76 220.161 c +563.76 133.286 l +563.76 131.0769 561.9691 129.286 559.76 129.286 c +52.24 129.286 l +50.0309 129.286 48.24 131.0769 48.24 133.286 c +48.24 220.161 l +48.24 222.3701 50.0309 224.161 52.24 224.161 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 224.161 m +559.76 224.161 l +561.9691 224.161 563.76 222.3701 563.76 220.161 c +563.76 133.286 l +563.76 131.0769 561.9691 129.286 559.76 129.286 c +52.24 129.286 l +50.0309 129.286 48.24 131.0769 48.24 133.286 c +48.24 220.161 l +48.24 222.3701 50.0309 224.161 52.24 224.161 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 201.567 Td +/F4.0 11 Tf +<7b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 187.278 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 172.989 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +131.84 172.989 Td +/F1.1 11 Tf +<474a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +153.84 172.989 Td +/F4.0 11 Tf +<222c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 158.7 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 144.411 Td +/F4.0 11 Tf +<7d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 101.546 Td +/F2.0 13 Tf +<322e312e352e20415050> Tj +/F2.1 13 Tf +<23244f505149> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 86.686 m +559.76 86.686 l +561.9691 86.686 563.76 84.8951 563.76 82.686 c +563.76 54.397 l +563.76 52.1879 561.9691 50.397 559.76 50.397 c +52.24 50.397 l +50.0309 50.397 48.24 52.1879 48.24 54.397 c +48.24 82.686 l +48.24 84.8951 50.0309 86.686 52.24 86.686 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 86.686 m +559.76 86.686 l +561.9691 86.686 563.76 84.8951 563.76 82.686 c +563.76 54.397 l +563.76 52.1879 561.9691 50.397 559.76 50.397 c +52.24 50.397 l +50.0309 50.397 48.24 52.1879 48.24 54.397 c +48.24 82.686 l +48.24 84.8951 50.0309 86.686 52.24 86.686 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 65.522 Td +/F4.0 11 Tf +<504f5354202f6170692f76312f76657273696f6e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp2 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +49.24 11.04 Td +/F1.0 9 Tf +<38> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +99 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 612.0 792.0] +/CropBox [0 0 612.0 792.0] +/BleedBox [0 0 612.0 792.0] +/TrimBox [0 0 612.0 792.0] +/ArtBox [0 0 612.0 792.0] +/Contents 98 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F2.1 17 0 R +/F1.0 9 0 R +/F4.0 23 0 R +/F2.0 16 0 R +/F1.1 8 0 R +>> +/XObject << /Stamp2 218 0 R +>> +>> +>> +endobj +100 0 obj +[99 0 R /XYZ 0 792.0 null] +endobj +101 0 obj +[99 0 R /XYZ 0 704.4 null] +endobj +102 0 obj +[99 0 R /XYZ 0 676.8 null] +endobj +103 0 obj +[99 0 R /XYZ 0 602.711 null] +endobj +104 0 obj +[99 0 R /XYZ 0 528.622 null] +endobj +105 0 obj +[99 0 R /XYZ 0 410.236 null] +endobj +106 0 obj +[99 0 R /XYZ 0 382.636 null] +endobj +107 0 obj +[99 0 R /XYZ 0 249.961 null] +endobj +108 0 obj +[99 0 R /XYZ 0 117.286 null] +endobj +109 0 obj +<< /Length 25059 +>> +stream +q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +BT +48.24 745.71 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 719.91 Td +/F1.0 10.5 Tf +<415050> Tj +/F1.1 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 691.11 Td +/F2.1 10.5 Tf +<393a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 657.3 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 657.3 77.328 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +177.12 657.3 154.656 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +331.776 657.3 103.104 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +434.88 657.3 128.88 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 627.3 51.552 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 627.3 77.328 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +177.12 627.3 154.656 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +331.776 627.3 103.104 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +434.88 627.3 128.88 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 597.3 51.552 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +99.792 597.3 77.328 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +177.12 597.3 154.656 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +331.776 597.3 103.104 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +434.88 597.3 128.88 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 567.3 51.552 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 567.3 77.328 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +177.12 567.3 154.656 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +331.776 567.3 103.104 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +434.88 567.3 128.88 30.0 re +f +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 676.8 m +99.792 676.8 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 657.3 m +99.792 657.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 677.05 m +48.24 656.675 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 677.05 m +99.792 656.675 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 663.43 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 676.8 m +177.12 676.8 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +99.792 657.3 m +177.12 657.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 677.05 m +99.792 656.675 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 677.05 m +177.12 656.675 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 663.43 Td +/F2.1 10.5 Tf +<3d3e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 676.8 m +331.776 676.8 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +177.12 657.3 m +331.776 657.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 677.05 m +177.12 656.675 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 677.05 m +331.776 656.675 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +180.12 663.43 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 676.8 m +434.88 676.8 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +331.776 657.3 m +434.88 657.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 677.05 m +331.776 656.675 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 677.05 m +434.88 656.675 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +334.776 663.43 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 676.8 m +563.76 676.8 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +434.88 657.3 m +563.76 657.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 677.05 m +434.88 656.675 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 677.05 m +563.76 656.675 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +437.88 663.43 Td +/F2.1 10.5 Tf +<3f4041> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 657.3 m +99.792 657.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 627.3 m +99.792 627.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 657.925 m +48.24 627.05 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 657.925 m +99.792 627.05 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 638.68 Td +/F2.0 10.5 Tf +[<4865> 14.0 <61646572>] TJ +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +99.792 657.3 m +177.12 657.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 627.3 m +177.12 627.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 657.925 m +99.792 627.05 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 657.925 m +177.12 627.05 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 643.93 Td +/F2.0 10.5 Tf +[<41> 3.0 <7574686f72697a> 19.0 <61> 19.0 <74696f6e>] TJ +ET + + +BT +102.792 633.43 Td +ET + + +BT +102.792 633.43 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +177.12 657.3 m +331.776 657.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 627.3 m +331.776 627.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 657.925 m +177.12 627.05 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 657.925 m +331.776 627.05 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +180.12 638.68 Td +/F1.0 10.5 Tf +[<41> 7.0 <7574686f72697a> 26.0 <61> 15.0 <74696f6e>] TJ +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +331.776 657.3 m +434.88 657.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 627.3 m +434.88 627.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 657.925 m +331.776 627.05 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 657.925 m +434.88 627.05 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +334.776 638.68 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +434.88 657.3 m +563.76 657.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 627.3 m +563.76 627.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 657.925 m +434.88 627.05 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 657.925 m +563.76 627.05 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +437.88 639.3625 Td +/F4.0 10.5 Tf +<22746f6b656e22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 627.3 m +99.792 627.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 597.3 m +99.792 597.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 627.55 m +48.24 597.05 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 627.55 m +99.792 597.05 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 608.68 Td +/F2.0 10.5 Tf +[<4865> 14.0 <61646572>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 627.3 m +177.12 627.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 597.3 m +177.12 597.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 627.55 m +99.792 597.05 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 627.55 m +177.12 597.05 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 613.93 Td +/F2.0 10.5 Tf +[<436f6e74> 19.0 <656e74> 38.0 <2d> 61.0 <54> 30.0 <797065>] TJ +ET + + +BT +102.792 603.43 Td +ET + + +BT +102.792 603.43 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 627.3 m +331.776 627.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 597.3 m +331.776 597.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 627.55 m +177.12 597.05 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 627.55 m +331.776 597.05 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +180.12 608.68 Td +/F1.0 10.5 Tf +[<436f6e74> 15.0 <656e74> 29.0 <2d> 53.0 <54> 37.0 <797065>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 627.3 m +434.88 627.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 597.3 m +434.88 597.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 627.55 m +331.776 597.05 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 627.55 m +434.88 597.05 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +334.776 608.68 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 627.3 m +563.76 627.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 597.3 m +563.76 597.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 627.55 m +434.88 597.05 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 627.55 m +563.76 597.05 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +437.88 609.3625 Td +/F4.0 10.5 Tf +<226170706c69636174696f6e2f6a736f6e22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 597.3 m +99.792 597.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 567.3 m +99.792 567.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 597.55 m +48.24 567.05 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 597.55 m +99.792 567.05 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 578.68 Td +/F2.0 10.5 Tf +<426f6479> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 597.3 m +177.12 597.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 567.3 m +177.12 567.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 597.55 m +99.792 567.05 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 597.55 m +177.12 567.05 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 583.93 Td +/F2.0 10.5 Tf +[<70> 14.0 <6172> 31.0 <616d>] TJ +ET + + +BT +102.792 573.43 Td +ET + + +BT +102.792 573.43 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 597.3 m +331.776 597.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 567.3 m +331.776 567.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 597.55 m +177.12 567.05 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 597.55 m +331.776 567.05 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +180.12 578.68 Td +/F1.0 10.5 Tf +[<70> 16.0 <6172> 27.0 <616d>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 597.3 m +434.88 597.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 567.3 m +434.88 567.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 597.55 m +331.776 567.05 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 597.55 m +434.88 567.05 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +334.776 578.68 Td +/F1.0 10.5 Tf +<415050> Tj +/F1.1 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 597.3 m +563.76 597.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 567.3 m +563.76 567.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 597.55 m +434.88 567.05 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 597.55 m +563.76 567.05 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 542.01 Td +/F2.1 10.5 Tf +<4243> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 497.7 51.552 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 497.7 360.864 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 497.7 103.104 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 478.2 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 478.2 360.864 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 478.2 103.104 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 458.7 51.552 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +99.792 458.7 360.864 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +460.656 458.7 103.104 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 439.2 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 439.2 360.864 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 439.2 103.104 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 419.7 51.552 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +99.792 419.7 360.864 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +460.656 419.7 103.104 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 400.2 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 400.2 360.864 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 400.2 103.104 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 380.7 51.552 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +99.792 380.7 360.864 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +460.656 380.7 103.104 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 361.2 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 361.2 360.864 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 361.2 103.104 19.5 re +f +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 527.7 m +99.792 527.7 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 497.7 m +99.792 497.7 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 527.95 m +48.24 497.075 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 527.95 m +99.792 497.075 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 514.33 Td +/F2.0 10.5 Tf +<48545450> Tj +/F2.1 10.5 Tf +<44> Tj +ET + + +BT +51.24 503.83 Td +/F2.1 10.5 Tf +<45> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 527.7 m +460.656 527.7 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +99.792 497.7 m +460.656 497.7 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 527.95 m +99.792 497.075 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 527.95 m +460.656 497.075 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 509.08 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 527.7 m +563.76 527.7 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +460.656 497.7 m +563.76 497.7 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 527.95 m +460.656 497.075 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 527.95 m +563.76 497.075 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 509.08 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 497.7 m +99.792 497.7 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 478.2 m +99.792 478.2 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 498.325 m +48.24 477.95 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 498.325 m +99.792 477.95 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 484.33 Td +/F2.0 10.5 Tf +<323030> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +99.792 497.7 m +460.656 497.7 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 478.2 m +460.656 478.2 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 498.325 m +99.792 477.95 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 498.325 m +460.656 477.95 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 484.33 Td +/F1.1 10.5 Tf +<2d2e454647> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +460.656 497.7 m +563.76 497.7 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 478.2 m +563.76 478.2 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 498.325 m +460.656 477.95 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 498.325 m +563.76 477.95 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +463.656 484.33 Td +/F1.0 10.5 Tf +<415050> Tj +/F1.1 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 478.2 m +99.792 478.2 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 458.7 m +99.792 458.7 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 478.45 m +48.24 458.45 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 478.45 m +99.792 458.45 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 464.83 Td +/F2.0 10.5 Tf +<323031> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 478.2 m +460.656 478.2 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 458.7 m +460.656 458.7 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 478.45 m +99.792 458.45 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 478.45 m +460.656 458.45 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 464.83 Td +/F1.1 10.5 Tf +<4849474a4b4c4d> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 478.2 m +563.76 478.2 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 458.7 m +563.76 458.7 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 478.45 m +460.656 458.45 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 478.45 m +563.76 458.45 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +463.656 464.83 Td +/F1.0 10.5 Tf +<415050> Tj +/F1.1 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 458.7 m +99.792 458.7 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 439.2 m +99.792 439.2 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 458.95 m +48.24 438.95 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 458.95 m +99.792 438.95 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 445.33 Td +/F2.0 10.5 Tf +<343030> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 458.7 m +460.656 458.7 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 439.2 m +460.656 439.2 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 458.95 m +99.792 438.95 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 458.95 m +460.656 438.95 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 445.33 Td +/F1.1 10.5 Tf +<2d2e4e4f505152535455565758592d2e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 458.7 m +563.76 458.7 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 439.2 m +563.76 439.2 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 458.95 m +460.656 438.95 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 458.95 m +563.76 438.95 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 445.33 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 439.2 m +99.792 439.2 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 419.7 m +99.792 419.7 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 439.45 m +48.24 419.45 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 439.45 m +99.792 419.45 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 425.83 Td +/F2.0 10.5 Tf +<343031> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 439.2 m +460.656 439.2 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 419.7 m +460.656 419.7 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 439.45 m +99.792 419.45 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 439.45 m +460.656 419.45 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 425.83 Td +/F1.1 10.5 Tf +<5d5e5f372c3b60524461> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 439.2 m +563.76 439.2 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 419.7 m +563.76 419.7 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 439.45 m +460.656 419.45 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 439.45 m +563.76 419.45 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 425.83 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 419.7 m +99.792 419.7 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 400.2 m +99.792 400.2 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 419.95 m +48.24 399.95 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 419.95 m +99.792 399.95 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 406.33 Td +/F2.0 10.5 Tf +<343033> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 419.7 m +460.656 419.7 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 400.2 m +460.656 400.2 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 419.95 m +99.792 399.95 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 419.95 m +460.656 399.95 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 406.33 Td +/F1.1 10.5 Tf +<23243325622d2e54636465666768> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 419.7 m +563.76 419.7 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 400.2 m +563.76 400.2 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 419.95 m +460.656 399.95 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 419.95 m +563.76 399.95 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 406.33 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 400.2 m +99.792 400.2 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 380.7 m +99.792 380.7 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 400.45 m +48.24 380.45 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 400.45 m +99.792 380.45 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 386.83 Td +/F2.0 10.5 Tf +<343034> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 400.2 m +460.656 400.2 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 380.7 m +460.656 380.7 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 400.45 m +99.792 380.45 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 400.45 m +460.656 380.45 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 386.83 Td +/F1.1 10.5 Tf +<23243369566a343f4048496b2728566c6d> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 400.2 m +563.76 400.2 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 380.7 m +563.76 380.7 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 400.45 m +460.656 380.45 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 400.45 m +563.76 380.45 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 386.83 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 380.7 m +99.792 380.7 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 361.2 m +99.792 361.2 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 380.95 m +48.24 360.95 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 380.95 m +99.792 360.95 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 367.33 Td +/F2.0 10.5 Tf +<353030> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 380.7 m +460.656 380.7 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 361.2 m +460.656 361.2 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 380.95 m +99.792 360.95 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 380.95 m +460.656 360.95 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 367.33 Td +/F1.1 10.5 Tf +<2324336e6f7071> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 380.7 m +563.76 380.7 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 361.2 m +563.76 361.2 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 380.95 m +460.656 360.95 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 380.95 m +563.76 360.95 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 367.33 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 335.91 Td +/F2.1 10.5 Tf +<292a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +55.511 310.11 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +70.74 311.475 Td +/F4.0 10.5 Tf +<6170706c69636174696f6e2f6a736f6e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 281.31 Td +/F2.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +55.511 255.51 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +70.74 256.875 Td +/F4.0 10.5 Tf +<6170706c69636174696f6e2f6a736f6e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 226.71 Td +/F2.0 10.5 Tf +<48545450> Tj +/F2.1 10.5 Tf +<2f304647> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 200.58 Td +/F2.1 9 Tf +<2f3020> Tj +/F2.0 9 Tf +[<70> 14.0 <61> 19.0 <7468>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 186.6 m +559.76 186.6 l +561.9691 186.6 563.76 184.8091 563.76 182.6 c +563.76 154.311 l +563.76 152.1019 561.9691 150.311 559.76 150.311 c +52.24 150.311 l +50.0309 150.311 48.24 152.1019 48.24 154.311 c +48.24 182.6 l +48.24 184.8091 50.0309 186.6 52.24 186.6 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 186.6 m +559.76 186.6 l +561.9691 186.6 563.76 184.8091 563.76 182.6 c +563.76 154.311 l +563.76 152.1019 561.9691 150.311 559.76 150.311 c +52.24 150.311 l +50.0309 150.311 48.24 152.1019 48.24 154.311 c +48.24 182.6 l +48.24 184.8091 50.0309 186.6 52.24 186.6 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 165.436 Td +/F4.0 11 Tf +<2f6170692f76312f76657273696f6e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 126.491 Td +/F2.1 9 Tf +<2f3020> Tj +/F2.0 9 Tf +[<6865> 14.0 <61646572>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 112.511 m +559.76 112.511 l +561.9691 112.511 563.76 110.7201 563.76 108.511 c +563.76 80.222 l +563.76 78.0129 561.9691 76.222 559.76 76.222 c +52.24 76.222 l +50.0309 76.222 48.24 78.0129 48.24 80.222 c +48.24 108.511 l +48.24 110.7201 50.0309 112.511 52.24 112.511 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 112.511 m +559.76 112.511 l +561.9691 112.511 563.76 110.7201 563.76 108.511 c +563.76 80.222 l +563.76 78.0129 561.9691 76.222 559.76 76.222 c +52.24 76.222 l +50.0309 76.222 48.24 78.0129 48.24 80.222 c +48.24 108.511 l +48.24 110.7201 50.0309 112.511 52.24 112.511 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 91.347 Td +/F4.0 11 Tf +<22737472696e6722> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp1 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +557.765 11.04 Td +/F1.0 9 Tf +<39> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +110 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 612.0 792.0] +/CropBox [0 0 612.0 792.0] +/BleedBox [0 0 612.0 792.0] +/TrimBox [0 0 612.0 792.0] +/ArtBox [0 0 612.0 792.0] +/Contents 109 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F2.1 17 0 R +/F1.0 9 0 R +/F1.1 8 0 R +/F2.0 16 0 R +/F3.1 19 0 R +/F4.0 23 0 R +>> +/XObject << /Stamp1 217 0 R +>> +>> +/Annots [113 0 R 115 0 R 116 0 R] +>> +endobj +111 0 obj +[110 0 R /XYZ 0 792.0 null] +endobj +112 0 obj +[110 0 R /XYZ 0 704.4 null] +endobj +113 0 obj +<< /Border [0 0 0] +/Dest (_f429f46ebd0652c50376d217cc9b7836) +/Subtype /Link +/Rect [334.776 577.42 417.4215 587.92] +/Type /Annot +>> +endobj +114 0 obj +[110 0 R /XYZ 0 555.3 null] +endobj +115 0 obj +<< /Border [0 0 0] +/Dest (_210de75caca43066a260d60083630867) +/Subtype /Link +/Rect [463.656 483.07 546.3015 493.57] +/Type /Annot +>> +endobj +116 0 obj +<< /Border [0 0 0] +/Dest (_210de75caca43066a260d60083630867) +/Subtype /Link +/Rect [463.656 463.57 546.3015 474.07] +/Type /Annot +>> +endobj +117 0 obj +[110 0 R /XYZ 0 349.2 null] +endobj +118 0 obj +[110 0 R /XYZ 0 294.6 null] +endobj +119 0 obj +[110 0 R /XYZ 0 240.0 null] +endobj +120 0 obj +[110 0 R /XYZ 0 212.4 null] +endobj +121 0 obj +[110 0 R /XYZ 0 138.311 null] +endobj +122 0 obj +<< /Length 9181 +>> +stream +q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +BT +48.24 747.18 Td +/F2.1 9 Tf +<2f3020> Tj +/F2.0 9 Tf +<626f6479> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 733.2 m +559.76 733.2 l +561.9691 733.2 563.76 731.4091 563.76 729.2 c +563.76 642.325 l +563.76 640.1159 561.9691 638.325 559.76 638.325 c +52.24 638.325 l +50.0309 638.325 48.24 640.1159 48.24 642.325 c +48.24 729.2 l +48.24 731.4091 50.0309 733.2 52.24 733.2 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 733.2 m +559.76 733.2 l +561.9691 733.2 563.76 731.4091 563.76 729.2 c +563.76 642.325 l +563.76 640.1159 561.9691 638.325 559.76 638.325 c +52.24 638.325 l +50.0309 638.325 48.24 640.1159 48.24 642.325 c +48.24 729.2 l +48.24 731.4091 50.0309 733.2 52.24 733.2 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 710.606 Td +/F4.0 11 Tf +<7b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 696.317 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 682.028 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 667.739 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 653.45 Td +/F4.0 11 Tf +<7d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 613.035 Td +/F2.0 10.5 Tf +<48545450> Tj +/F2.1 10.5 Tf +<42434647> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 586.905 Td +/F2.1 9 Tf +<424320> Tj +/F2.0 9 Tf +<323030> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 572.925 m +559.76 572.925 l +561.9691 572.925 563.76 571.1341 563.76 568.925 c +563.76 439.183 l +563.76 436.9739 561.9691 435.183 559.76 435.183 c +52.24 435.183 l +50.0309 435.183 48.24 436.9739 48.24 439.183 c +48.24 568.925 l +48.24 571.1341 50.0309 572.925 52.24 572.925 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 572.925 m +559.76 572.925 l +561.9691 572.925 563.76 571.1341 563.76 568.925 c +563.76 439.183 l +563.76 436.9739 561.9691 435.183 559.76 435.183 c +52.24 435.183 l +50.0309 435.183 48.24 436.9739 48.24 439.183 c +48.24 568.925 l +48.24 571.1341 50.0309 572.925 52.24 572.925 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 550.331 Td +/F4.0 11 Tf +<7b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 536.042 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +158.24 536.042 Td +/F1.1 11 Tf +<94d182d2> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +202.24 536.042 Td +/F4.0 11 Tf +<222c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 521.753 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +349.64 521.753 Td +/F1.1 11 Tf +<94d182d2> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +393.64 521.753 Td +/F4.0 11 Tf +<5f312e332e302e61706b222c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 507.464 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 493.175 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 478.886 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +138.44 478.886 Td +/F1.1 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +226.44 478.886 Td +/F4.0 11 Tf +<222c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 464.597 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 450.308 Td +/F4.0 11 Tf +<7d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 411.363 Td +/F2.1 9 Tf +<424320> Tj +/F2.0 9 Tf +<323031> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 397.383 m +559.76 397.383 l +561.9691 397.383 563.76 395.5921 563.76 393.383 c +563.76 263.641 l +563.76 261.4319 561.9691 259.641 559.76 259.641 c +52.24 259.641 l +50.0309 259.641 48.24 261.4319 48.24 263.641 c +48.24 393.383 l +48.24 395.5921 50.0309 397.383 52.24 397.383 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 397.383 m +559.76 397.383 l +561.9691 397.383 563.76 395.5921 563.76 393.383 c +563.76 263.641 l +563.76 261.4319 561.9691 259.641 559.76 259.641 c +52.24 259.641 l +50.0309 259.641 48.24 261.4319 48.24 263.641 c +48.24 393.383 l +48.24 395.5921 50.0309 397.383 52.24 397.383 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 374.789 Td +/F4.0 11 Tf +<7b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 360.5 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +158.24 360.5 Td +/F1.1 11 Tf +<94d182d2> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +202.24 360.5 Td +/F4.0 11 Tf +<222c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 346.211 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +349.64 346.211 Td +/F1.1 11 Tf +<94d182d2> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +393.64 346.211 Td +/F4.0 11 Tf +<5f312e332e302e61706b222c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 331.922 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 317.633 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 303.344 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +138.44 303.344 Td +/F1.1 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +226.44 303.344 Td +/F4.0 11 Tf +<222c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 289.055 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 274.766 Td +/F4.0 11 Tf +<7d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 227.001 Td +/F2.0 18 Tf +<322e322e20> Tj +/F2.1 18 Tf +<5253> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 199.551 Td +/F1.1 10.5 Tf +<2b2c2d2e292a2f30> Tj +/F1.0 10.5 Tf +[<54> 74.0 <6f6b> 20.0 <656e>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 168.301 Td +/F2.0 13 Tf +<322e322e312e20> Tj +/F2.1 13 Tf +<525340543536> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 153.441 m +559.76 153.441 l +561.9691 153.441 563.76 151.6501 563.76 149.441 c +563.76 121.152 l +563.76 118.9429 561.9691 117.152 559.76 117.152 c +52.24 117.152 l +50.0309 117.152 48.24 118.9429 48.24 121.152 c +48.24 149.441 l +48.24 151.6501 50.0309 153.441 52.24 153.441 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 153.441 m +559.76 153.441 l +561.9691 153.441 563.76 151.6501 563.76 149.441 c +563.76 121.152 l +563.76 118.9429 561.9691 117.152 559.76 117.152 c +52.24 117.152 l +50.0309 117.152 48.24 118.9429 48.24 121.152 c +48.24 149.441 l +48.24 151.6501 50.0309 153.441 52.24 153.441 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 132.277 Td +/F4.0 11 Tf +<504f5354202f6c6f67696e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 91.862 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 66.062 Td +/F1.1 10.5 Tf +<567f6425268b64> Tj +/F1.0 10.5 Tf +[<576562536f636b> 20.0 <65> 11.0 <74>] TJ +/F1.1 10.5 Tf + Tj +/F1.0 10.5 Tf +[<54> 74.0 <6f6b> 20.0 <656e>] TJ +/F1.1 10.5 Tf +<54deb4df3181> Tj +/F1.0 10.5 Tf +[<54> 74.0 <6f6b> 20.0 <656e>] TJ +/F1.1 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 51.062 Td +/F1.1 10.5 Tf +<2b> Tj +/F1.0 10.5 Tf +[<48545450> 11.0 <53>] TJ +/F1.1 10.5 Tf + Tj +/F1.0 10.5 Tf +[<524553> 22.0 <54> 20.0 <66756c20415049>] TJ +/F1.1 10.5 Tf + Tj +/F1.0 10.5 Tf +[<576562536f636b> 20.0 <65> 11.0 <74>] TJ +/F1.1 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp2 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +49.24 11.04 Td +/F1.0 9 Tf +<3130> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +123 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 612.0 792.0] +/CropBox [0 0 612.0 792.0] +/BleedBox [0 0 612.0 792.0] +/TrimBox [0 0 612.0 792.0] +/ArtBox [0 0 612.0 792.0] +/Contents 122 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F2.1 17 0 R +/F2.0 16 0 R +/F4.0 23 0 R +/F1.1 8 0 R +/F1.0 9 0 R +>> +/XObject << /Stamp2 218 0 R +>> +>> +>> +endobj +124 0 obj +[123 0 R /XYZ 0 792.0 null] +endobj +125 0 obj +[123 0 R /XYZ 0 626.325 null] +endobj +126 0 obj +[123 0 R /XYZ 0 598.725 null] +endobj +127 0 obj +[123 0 R /XYZ 0 423.183 null] +endobj +128 0 obj +<< /Limits [(0x5fe5938de5ba945f34) (0x5fe7949fe68890)] +/Names [(0x5fe5938de5ba945f34) 94 0 R (0x5fe5938de5ba945f35) 114 0 R (0x5fe5938de5ba945f36) 137 0 R (0x5fe5938de5ba945f37) 160 0 R (0x5fe5938de5ba945f38) 182 0 R (0x5fe6a087e7adbe) 21 0 R (0x5fe6b688e88097) 22 0 R (0x5fe6b688e880975f32) 36 0 R (0x5fe6b688e880975f33) 58 0 R (0x5fe6b688e880975f34) 77 0 R (0x5fe6b688e880975f35) 97 0 R (0x5fe6b688e880975f36) 117 0 R (0x5fe6b688e880975f37) 142 0 R (0x5fe6b688e880975f38) 165 0 R (0x5fe6b688e880975f39) 187 0 R (0x5fe78988e69cace4bfa1e681af) 18 0 R (0x5fe7949fe68890) 24 0 R] +>> +endobj +129 0 obj +[123 0 R /XYZ 0 247.641 null] +endobj +130 0 obj +[123 0 R /XYZ 0 184.041 null] +endobj +131 0 obj +<< /Limits [(_94219155df37a25d46029b8853a60c8a) (_versionusingpost)] +/Names [(_94219155df37a25d46029b8853a60c8a) 177 0 R (__anchor-top) 12 0 R (_baseresponse) 201 0 R (_baseresponseofstring) 205 0 R (_definitions) 198 0 R (_dobindusingpost) 27 0 R (_dojoinusingpost) 49 0 R (_f236cea25620e9b591ca247c6b9fc143) 211 0 R (_f429f46ebd0652c50376d217cc9b7836) 199 0 R (_f8c8293eed548988f35ab4180d87ae66) 206 0 R (_joinusingget) 69 0 R (_loginusingpost) 130 0 R (_notifyloginusingpost) 154 0 R (_overview) 15 0 R (_paths) 25 0 R (_public-controller_resource) 26 0 R (_reportusingpost) 90 0 R (_unbindusingpost) 178 0 R (_uri_scheme) 20 0 R (_versionusingpost) 108 0 R] +>> +endobj +132 0 obj +[123 0 R /XYZ 0 105.152 null] +endobj +133 0 obj +<< /Length 22756 +>> +stream +q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +BT +48.24 745.71 Td +/F2.1 10.5 Tf +<393a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 711.9 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 711.9 77.328 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +177.12 711.9 154.656 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +331.776 711.9 103.104 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +434.88 711.9 128.88 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 681.9 51.552 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 681.9 77.328 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +177.12 681.9 154.656 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +331.776 681.9 103.104 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +434.88 681.9 128.88 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 651.9 51.552 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +99.792 651.9 77.328 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +177.12 651.9 154.656 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +331.776 651.9 103.104 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +434.88 651.9 128.88 30.0 re +f +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 731.4 m +99.792 731.4 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 711.9 m +99.792 711.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 731.65 m +48.24 711.275 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 731.65 m +99.792 711.275 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 718.03 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 731.4 m +177.12 731.4 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +99.792 711.9 m +177.12 711.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 731.65 m +99.792 711.275 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 731.65 m +177.12 711.275 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 718.03 Td +/F2.1 10.5 Tf +<3d3e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 731.4 m +331.776 731.4 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +177.12 711.9 m +331.776 711.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 731.65 m +177.12 711.275 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 731.65 m +331.776 711.275 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +180.12 718.03 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 731.4 m +434.88 731.4 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +331.776 711.9 m +434.88 711.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 731.65 m +331.776 711.275 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 731.65 m +434.88 711.275 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +334.776 718.03 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 731.4 m +563.76 731.4 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +434.88 711.9 m +563.76 711.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 731.65 m +434.88 711.275 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 731.65 m +563.76 711.275 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +437.88 718.03 Td +/F2.1 10.5 Tf +<3f4041> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 711.9 m +99.792 711.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 681.9 m +99.792 681.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 712.525 m +48.24 681.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 712.525 m +99.792 681.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 693.28 Td +/F2.0 10.5 Tf +[<4865> 14.0 <61646572>] TJ +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +99.792 711.9 m +177.12 711.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 681.9 m +177.12 681.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 712.525 m +99.792 681.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 712.525 m +177.12 681.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 698.53 Td +/F2.0 10.5 Tf +[<436f6e74> 19.0 <656e74> 38.0 <2d> 61.0 <54> 30.0 <797065>] TJ +ET + + +BT +102.792 688.03 Td +ET + + +BT +102.792 688.03 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +177.12 711.9 m +331.776 711.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 681.9 m +331.776 681.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 712.525 m +177.12 681.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 712.525 m +331.776 681.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +180.12 693.28 Td +/F1.0 10.5 Tf +[<436f6e74> 15.0 <656e74> 29.0 <2d> 53.0 <54> 37.0 <797065>] TJ +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +331.776 711.9 m +434.88 711.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 681.9 m +434.88 681.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 712.525 m +331.776 681.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 712.525 m +434.88 681.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +334.776 693.28 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +434.88 711.9 m +563.76 711.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 681.9 m +563.76 681.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 712.525 m +434.88 681.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 712.525 m +563.76 681.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +437.88 693.9625 Td +/F4.0 10.5 Tf +<226170706c69636174696f6e2f6a736f6e22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 681.9 m +99.792 681.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 651.9 m +99.792 651.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 682.15 m +48.24 651.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 682.15 m +99.792 651.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 663.28 Td +/F2.0 10.5 Tf +<426f6479> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 681.9 m +177.12 681.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 651.9 m +177.12 651.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 682.15 m +99.792 651.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 682.15 m +177.12 651.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 668.53 Td +/F2.0 10.5 Tf +[<6c6f67696e50> 41.0 <6172> 31.0 <616d>] TJ +ET + + +BT +102.792 658.03 Td +ET + + +BT +102.792 658.03 Td +/F3.1 10.5 Tf +<2d2e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 681.9 m +331.776 681.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 651.9 m +331.776 651.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 682.15 m +177.12 651.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 682.15 m +331.776 651.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +180.12 663.28 Td +/F1.1 10.5 Tf +<292a4344> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 681.9 m +434.88 681.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 651.9 m +434.88 651.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 682.15 m +331.776 651.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 682.15 m +434.88 651.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +334.776 663.28 Td +/F1.1 10.5 Tf +<292aebec25264344> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 681.9 m +563.76 681.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 651.9 m +563.76 651.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 682.15 m +434.88 651.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 682.15 m +563.76 651.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 626.61 Td +/F2.1 10.5 Tf +<4243> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 582.3 51.552 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 582.3 360.864 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 582.3 103.104 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 552.3 51.552 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 552.3 360.864 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 552.3 103.104 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 522.3 51.552 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +99.792 522.3 360.864 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +460.656 522.3 103.104 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 502.8 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 502.8 360.864 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 502.8 103.104 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 483.3 51.552 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +99.792 483.3 360.864 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +460.656 483.3 103.104 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 463.8 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 463.8 360.864 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 463.8 103.104 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 444.3 51.552 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +99.792 444.3 360.864 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +460.656 444.3 103.104 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 424.8 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 424.8 360.864 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 424.8 103.104 19.5 re +f +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 612.3 m +99.792 612.3 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 582.3 m +99.792 582.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 612.55 m +48.24 581.675 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 612.55 m +99.792 581.675 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 598.93 Td +/F2.0 10.5 Tf +<48545450> Tj +/F2.1 10.5 Tf +<44> Tj +ET + + +BT +51.24 588.43 Td +/F2.1 10.5 Tf +<45> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 612.3 m +460.656 612.3 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +99.792 582.3 m +460.656 582.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 612.55 m +99.792 581.675 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 612.55 m +460.656 581.675 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 593.68 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 612.3 m +563.76 612.3 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +460.656 582.3 m +563.76 582.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 612.55 m +460.656 581.675 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 612.55 m +563.76 581.675 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 593.68 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 582.3 m +99.792 582.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 552.3 m +99.792 552.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 582.925 m +48.24 552.05 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 582.925 m +99.792 552.05 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 563.68 Td +/F2.0 10.5 Tf +<323030> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +99.792 582.3 m +460.656 582.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 552.3 m +460.656 552.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 582.925 m +99.792 552.05 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 582.925 m +460.656 552.05 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 563.68 Td +/F1.1 10.5 Tf +<2d2e454647> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +460.656 582.3 m +563.76 582.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 552.3 m +563.76 552.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 582.925 m +460.656 552.05 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 582.925 m +563.76 552.05 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +463.656 568.93 Td +/F1.0 10.5 Tf +[<4261736552> 11.0 <6573706f6e73654f66> 4.0 <73> 22.0 <747269>] TJ +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +463.656 558.43 Td +/F1.0 10.5 Tf +<6e67> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 552.3 m +99.792 552.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 522.3 m +99.792 522.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 552.55 m +48.24 522.05 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 552.55 m +99.792 522.05 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 533.68 Td +/F2.0 10.5 Tf +<323031> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 552.3 m +460.656 552.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 522.3 m +460.656 522.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 552.55 m +99.792 522.05 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 552.55 m +460.656 522.05 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 533.68 Td +/F1.1 10.5 Tf +<4849474a4b4c4d> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 552.3 m +563.76 552.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 522.3 m +563.76 522.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 552.55 m +460.656 522.05 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 552.55 m +563.76 522.05 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +463.656 538.93 Td +/F1.0 10.5 Tf +[<4261736552> 11.0 <6573706f6e73654f66> 4.0 <73> 22.0 <747269>] TJ +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +463.656 528.43 Td +/F1.0 10.5 Tf +<6e67> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 522.3 m +99.792 522.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 502.8 m +99.792 502.8 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 522.55 m +48.24 502.55 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 522.55 m +99.792 502.55 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 508.93 Td +/F2.0 10.5 Tf +<343030> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 522.3 m +460.656 522.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 502.8 m +460.656 502.8 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 522.55 m +99.792 502.55 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 522.55 m +460.656 502.55 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 508.93 Td +/F1.1 10.5 Tf +<2d2e4e4f505152535455565758592d2e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 522.3 m +563.76 522.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 502.8 m +563.76 502.8 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 522.55 m +460.656 502.55 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 522.55 m +563.76 502.55 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 508.93 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 502.8 m +99.792 502.8 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 483.3 m +99.792 483.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 503.05 m +48.24 483.05 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 503.05 m +99.792 483.05 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 489.43 Td +/F2.0 10.5 Tf +<343031> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 502.8 m +460.656 502.8 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 483.3 m +460.656 483.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 503.05 m +99.792 483.05 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 503.05 m +460.656 483.05 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 489.43 Td +/F1.1 10.5 Tf +<5d5e5f372c3b60524461> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 502.8 m +563.76 502.8 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 483.3 m +563.76 483.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 503.05 m +460.656 483.05 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 503.05 m +563.76 483.05 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 489.43 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 483.3 m +99.792 483.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 463.8 m +99.792 463.8 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 483.55 m +48.24 463.55 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 483.55 m +99.792 463.55 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 469.93 Td +/F2.0 10.5 Tf +<343033> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 483.3 m +460.656 483.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 463.8 m +460.656 463.8 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 483.55 m +99.792 463.55 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 483.55 m +460.656 463.55 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 469.93 Td +/F1.1 10.5 Tf +<23243325622d2e54636465666768> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 483.3 m +563.76 483.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 463.8 m +563.76 463.8 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 483.55 m +460.656 463.55 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 483.55 m +563.76 463.55 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 469.93 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 463.8 m +99.792 463.8 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 444.3 m +99.792 444.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 464.05 m +48.24 444.05 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 464.05 m +99.792 444.05 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 450.43 Td +/F2.0 10.5 Tf +<343034> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 463.8 m +460.656 463.8 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 444.3 m +460.656 444.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 464.05 m +99.792 444.05 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 464.05 m +460.656 444.05 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 450.43 Td +/F1.1 10.5 Tf +<23243369566a343f4048496b2728566c6d> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 463.8 m +563.76 463.8 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 444.3 m +563.76 444.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 464.05 m +460.656 444.05 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 464.05 m +563.76 444.05 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 450.43 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 444.3 m +99.792 444.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 424.8 m +99.792 424.8 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 444.55 m +48.24 424.55 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 444.55 m +99.792 424.55 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 430.93 Td +/F2.0 10.5 Tf +<353030> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 444.3 m +460.656 444.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 424.8 m +460.656 424.8 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 444.55 m +99.792 424.55 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 444.55 m +460.656 424.55 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 430.93 Td +/F1.1 10.5 Tf +<2324336e6f7071> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 444.3 m +563.76 444.3 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 424.8 m +563.76 424.8 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 444.55 m +460.656 424.55 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 444.55 m +563.76 424.55 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 430.93 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 399.51 Td +/F2.1 10.5 Tf +<292a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +55.511 373.71 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +70.74 375.075 Td +/F4.0 10.5 Tf +<6170706c69636174696f6e2f6a736f6e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 344.91 Td +/F2.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +55.511 319.11 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +70.74 320.475 Td +/F4.0 10.5 Tf +<6170706c69636174696f6e2f6a736f6e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 290.31 Td +/F2.0 10.5 Tf +<48545450> Tj +/F2.1 10.5 Tf +<2f304647> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 264.18 Td +/F2.1 9 Tf +<2f3020> Tj +/F2.0 9 Tf +[<70> 14.0 <61> 19.0 <7468>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 250.2 m +559.76 250.2 l +561.9691 250.2 563.76 248.4091 563.76 246.2 c +563.76 217.911 l +563.76 215.7019 561.9691 213.911 559.76 213.911 c +52.24 213.911 l +50.0309 213.911 48.24 215.7019 48.24 217.911 c +48.24 246.2 l +48.24 248.4091 50.0309 250.2 52.24 250.2 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 250.2 m +559.76 250.2 l +561.9691 250.2 563.76 248.4091 563.76 246.2 c +563.76 217.911 l +563.76 215.7019 561.9691 213.911 559.76 213.911 c +52.24 213.911 l +50.0309 213.911 48.24 215.7019 48.24 217.911 c +48.24 246.2 l +48.24 248.4091 50.0309 250.2 52.24 250.2 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 229.036 Td +/F4.0 11 Tf +<2f6c6f67696e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 190.091 Td +/F2.1 9 Tf +<2f3020> Tj +/F2.0 9 Tf +[<6865> 14.0 <61646572>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 176.111 m +559.76 176.111 l +561.9691 176.111 563.76 174.3201 563.76 172.111 c +563.76 143.822 l +563.76 141.6129 561.9691 139.822 559.76 139.822 c +52.24 139.822 l +50.0309 139.822 48.24 141.6129 48.24 143.822 c +48.24 172.111 l +48.24 174.3201 50.0309 176.111 52.24 176.111 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 176.111 m +559.76 176.111 l +561.9691 176.111 563.76 174.3201 563.76 172.111 c +563.76 143.822 l +563.76 141.6129 561.9691 139.822 559.76 139.822 c +52.24 139.822 l +50.0309 139.822 48.24 141.6129 48.24 143.822 c +48.24 172.111 l +48.24 174.3201 50.0309 176.111 52.24 176.111 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 154.947 Td +/F4.0 11 Tf +<22737472696e6722> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 116.002 Td +/F2.1 9 Tf +<2f3020> Tj +/F2.0 9 Tf +<626f6479> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp1 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +552.77 11.04 Td +/F1.0 9 Tf +<3131> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +134 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 612.0 792.0] +/CropBox [0 0 612.0 792.0] +/BleedBox [0 0 612.0 792.0] +/TrimBox [0 0 612.0 792.0] +/ArtBox [0 0 612.0 792.0] +/Contents 133 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F2.1 17 0 R +/F2.0 16 0 R +/F3.1 19 0 R +/F1.0 9 0 R +/F4.0 23 0 R +/F1.1 8 0 R +>> +/XObject << /Stamp1 217 0 R +>> +>> +/Annots [136 0 R 138 0 R 139 0 R 140 0 R 141 0 R] +>> +endobj +135 0 obj +[134 0 R /XYZ 0 792.0 null] +endobj +136 0 obj +<< /Border [0 0 0] +/Dest (_889c1af8350fc1eef060154a9d96bf40) +/Subtype /Link +/Rect [334.776 662.02 418.776 672.52] +/Type /Annot +>> +endobj +137 0 obj +[134 0 R /XYZ 0 639.9 null] +endobj +138 0 obj +<< /Border [0 0 0] +/Dest (_baseresponseofstring) +/Subtype /Link +/Rect [463.656 567.67 561.2745 578.17] +/Type /Annot +>> +endobj +139 0 obj +<< /Border [0 0 0] +/Dest (_baseresponseofstring) +/Subtype /Link +/Rect [463.656 557.17 475.983 567.67] +/Type /Annot +>> +endobj +140 0 obj +<< /Border [0 0 0] +/Dest (_baseresponseofstring) +/Subtype /Link +/Rect [463.656 537.67 561.2745 548.17] +/Type /Annot +>> +endobj +141 0 obj +<< /Border [0 0 0] +/Dest (_baseresponseofstring) +/Subtype /Link +/Rect [463.656 527.17 475.983 537.67] +/Type /Annot +>> +endobj +142 0 obj +[134 0 R /XYZ 0 412.8 null] +endobj +143 0 obj +[134 0 R /XYZ 0 358.2 null] +endobj +144 0 obj +[134 0 R /XYZ 0 303.6 null] +endobj +145 0 obj +[134 0 R /XYZ 0 276.0 null] +endobj +146 0 obj +[134 0 R /XYZ 0 201.911 null] +endobj +147 0 obj +[134 0 R /XYZ 0 127.822 null] +endobj +148 0 obj +<< /Length 14050 +>> +stream +q +q +/DeviceRGB cs +0.9608 0.9608 0.9608 scn +52.24 756.0 m +559.76 756.0 l +561.9691 756.0 563.76 754.2091 563.76 752.0 c +563.76 650.836 l +563.76 648.6269 561.9691 646.836 559.76 646.836 c +52.24 646.836 l +50.0309 646.836 48.24 648.6269 48.24 650.836 c +48.24 752.0 l +48.24 754.2091 50.0309 756.0 52.24 756.0 c +h +f +/DeviceRGB CS +0.8 0.8 0.8 SCN +0.75 w +52.24 756.0 m +559.76 756.0 l +561.9691 756.0 563.76 754.2091 563.76 752.0 c +563.76 650.836 l +563.76 648.6269 561.9691 646.836 559.76 646.836 c +52.24 646.836 l +50.0309 646.836 48.24 648.6269 48.24 650.836 c +48.24 752.0 l +48.24 754.2091 50.0309 756.0 52.24 756.0 c +h +S +Q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +BT +59.24 733.406 Td +/F4.0 11 Tf +<7b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 719.117 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 704.828 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 690.539 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 676.25 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 661.961 Td +/F4.0 11 Tf +<7d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 621.546 Td +/F2.0 10.5 Tf +<48545450> Tj +/F2.1 10.5 Tf +<42434647> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 595.416 Td +/F2.1 9 Tf +<424320> Tj +/F2.0 9 Tf +<323030> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 581.436 m +559.76 581.436 l +561.9691 581.436 563.76 579.6451 563.76 577.436 c +563.76 490.561 l +563.76 488.3519 561.9691 486.561 559.76 486.561 c +52.24 486.561 l +50.0309 486.561 48.24 488.3519 48.24 490.561 c +48.24 577.436 l +48.24 579.6451 50.0309 581.436 52.24 581.436 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 581.436 m +559.76 581.436 l +561.9691 581.436 563.76 579.6451 563.76 577.436 c +563.76 490.561 l +563.76 488.3519 561.9691 486.561 559.76 486.561 c +52.24 486.561 l +50.0309 486.561 48.24 488.3519 48.24 490.561 c +48.24 577.436 l +48.24 579.6451 50.0309 581.436 52.24 581.436 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 558.842 Td +/F4.0 11 Tf +<7b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 544.553 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 530.264 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +131.84 530.264 Td +/F1.1 11 Tf +<474a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +153.84 530.264 Td +/F4.0 11 Tf +<222c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 515.975 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 501.686 Td +/F4.0 11 Tf +<7d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 462.741 Td +/F2.1 9 Tf +<424320> Tj +/F2.0 9 Tf +<323031> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 448.761 m +559.76 448.761 l +561.9691 448.761 563.76 446.9701 563.76 444.761 c +563.76 357.886 l +563.76 355.6769 561.9691 353.886 559.76 353.886 c +52.24 353.886 l +50.0309 353.886 48.24 355.6769 48.24 357.886 c +48.24 444.761 l +48.24 446.9701 50.0309 448.761 52.24 448.761 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 448.761 m +559.76 448.761 l +561.9691 448.761 563.76 446.9701 563.76 444.761 c +563.76 357.886 l +563.76 355.6769 561.9691 353.886 559.76 353.886 c +52.24 353.886 l +50.0309 353.886 48.24 355.6769 48.24 357.886 c +48.24 444.761 l +48.24 446.9701 50.0309 448.761 52.24 448.761 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 426.167 Td +/F4.0 11 Tf +<7b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 411.878 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 397.589 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +131.84 397.589 Td +/F1.1 11 Tf +<474a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +153.84 397.589 Td +/F4.0 11 Tf +<222c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 383.3 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 369.011 Td +/F4.0 11 Tf +<7d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 326.146 Td +/F2.0 13 Tf +<322e322e322e20> Tj +/F2.1 13 Tf +<55562926525340543536> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 311.286 m +559.76 311.286 l +561.9691 311.286 563.76 309.4951 563.76 307.286 c +563.76 278.997 l +563.76 276.7879 561.9691 274.997 559.76 274.997 c +52.24 274.997 l +50.0309 274.997 48.24 276.7879 48.24 278.997 c +48.24 307.286 l +48.24 309.4951 50.0309 311.286 52.24 311.286 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 311.286 m +559.76 311.286 l +561.9691 311.286 563.76 309.4951 563.76 307.286 c +563.76 278.997 l +563.76 276.7879 561.9691 274.997 559.76 274.997 c +52.24 274.997 l +50.0309 274.997 48.24 276.7879 48.24 278.997 c +48.24 307.286 l +48.24 309.4951 50.0309 311.286 52.24 311.286 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 290.122 Td +/F4.0 11 Tf +<504f5354202f6e6f746966794c6f67696e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 249.707 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 223.907 Td +/F1.1 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 195.107 Td +/F2.1 10.5 Tf +<393a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 161.297 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 161.297 77.328 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +177.12 161.297 154.656 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +331.776 161.297 103.104 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +434.88 161.297 128.88 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 131.297 51.552 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 131.297 77.328 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +177.12 131.297 154.656 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +331.776 131.297 103.104 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +434.88 131.297 128.88 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 101.297 51.552 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +99.792 101.297 77.328 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +177.12 101.297 154.656 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +331.776 101.297 103.104 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +434.88 101.297 128.88 30.0 re +f +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 180.797 m +99.792 180.797 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 161.297 m +99.792 161.297 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 181.047 m +48.24 160.672 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 181.047 m +99.792 160.672 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 167.427 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 180.797 m +177.12 180.797 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +99.792 161.297 m +177.12 161.297 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 181.047 m +99.792 160.672 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 181.047 m +177.12 160.672 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 167.427 Td +/F2.1 10.5 Tf +<3d3e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 180.797 m +331.776 180.797 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +177.12 161.297 m +331.776 161.297 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 181.047 m +177.12 160.672 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 181.047 m +331.776 160.672 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +180.12 167.427 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 180.797 m +434.88 180.797 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +331.776 161.297 m +434.88 161.297 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 181.047 m +331.776 160.672 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 181.047 m +434.88 160.672 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +334.776 167.427 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 180.797 m +563.76 180.797 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +434.88 161.297 m +563.76 161.297 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 181.047 m +434.88 160.672 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 181.047 m +563.76 160.672 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +437.88 167.427 Td +/F2.1 10.5 Tf +<3f4041> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 161.297 m +99.792 161.297 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 131.297 m +99.792 131.297 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 161.922 m +48.24 131.047 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 161.922 m +99.792 131.047 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 142.677 Td +/F2.0 10.5 Tf +[<4865> 14.0 <61646572>] TJ +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +99.792 161.297 m +177.12 161.297 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 131.297 m +177.12 131.297 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 161.922 m +99.792 131.047 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 161.922 m +177.12 131.047 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 147.927 Td +/F2.0 10.5 Tf +[<436f6e74> 19.0 <656e74> 38.0 <2d> 61.0 <54> 30.0 <797065>] TJ +ET + + +BT +102.792 137.427 Td +ET + + +BT +102.792 137.427 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +177.12 161.297 m +331.776 161.297 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 131.297 m +331.776 131.297 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 161.922 m +177.12 131.047 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 161.922 m +331.776 131.047 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +180.12 142.677 Td +/F1.0 10.5 Tf +[<436f6e74> 15.0 <656e74> 29.0 <2d> 53.0 <54> 37.0 <797065>] TJ +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +331.776 161.297 m +434.88 161.297 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 131.297 m +434.88 131.297 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 161.922 m +331.776 131.047 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 161.922 m +434.88 131.047 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +334.776 142.677 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +434.88 161.297 m +563.76 161.297 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 131.297 m +563.76 131.297 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 161.922 m +434.88 131.047 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 161.922 m +563.76 131.047 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +437.88 143.3595 Td +/F4.0 10.5 Tf +<226170706c69636174696f6e2f6a736f6e22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 131.297 m +99.792 131.297 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 101.297 m +99.792 101.297 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 131.547 m +48.24 101.047 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 131.547 m +99.792 101.047 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 112.677 Td +/F2.0 10.5 Tf +<426f6479> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 131.297 m +177.12 131.297 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 101.297 m +177.12 101.297 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 131.547 m +99.792 101.047 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 131.547 m +177.12 101.047 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 117.927 Td +/F2.0 10.5 Tf +[<6c6f67696e50> 41.0 <6172> 31.0 <616d>] TJ +ET + + +BT +102.792 107.427 Td +ET + + +BT +102.792 107.427 Td +/F3.1 10.5 Tf +<2d2e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 131.297 m +331.776 131.297 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 101.297 m +331.776 101.297 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 131.547 m +177.12 101.047 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 131.547 m +331.776 101.047 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +180.12 112.677 Td +/F1.1 10.5 Tf +<292a4344> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 131.297 m +434.88 131.297 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 101.297 m +434.88 101.297 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 131.547 m +331.776 101.047 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 131.547 m +434.88 101.047 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +334.776 112.677 Td +/F1.1 10.5 Tf +<292aebec25264344> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 131.297 m +563.76 131.297 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 101.297 m +563.76 101.297 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 131.547 m +434.88 101.047 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 131.547 m +563.76 101.047 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp2 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +49.24 11.04 Td +/F1.0 9 Tf +<3132> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +149 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 612.0 792.0] +/CropBox [0 0 612.0 792.0] +/BleedBox [0 0 612.0 792.0] +/TrimBox [0 0 612.0 792.0] +/ArtBox [0 0 612.0 792.0] +/Contents 148 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F4.0 23 0 R +/F2.0 16 0 R +/F2.1 17 0 R +/F1.1 8 0 R +/F3.1 19 0 R +/F1.0 9 0 R +>> +/XObject << /Stamp2 218 0 R +>> +>> +/Annots [157 0 R] +>> +endobj +150 0 obj +[149 0 R /XYZ 0 634.836 null] +endobj +151 0 obj +<< /Limits [(0x5f68747470e8afb7e6b182e7a4bae4be8b5f35) (0x5fe5938de5ba945f323030)] +/Names [(0x5f68747470e8afb7e6b182e7a4bae4be8b5f35) 119 0 R (0x5f68747470e8afb7e6b182e7a4bae4be8b5f36) 144 0 R (0x5f68747470e8afb7e6b182e7a4bae4be8b5f37) 168 0 R (0x5f68747470e8afb7e6b182e7a4bae4be8b5f38) 189 0 R (0x5fe58f82e695b0) 31 0 R (0x5fe58f82e695b05f32) 51 0 R (0x5fe58f82e695b05f33) 71 0 R (0x5fe58f82e695b05f34) 92 0 R (0x5fe58f82e695b05f35) 112 0 R (0x5fe58f82e695b05f36) 135 0 R (0x5fe58f82e695b05f37) 156 0 R (0x5fe58f82e695b05f38) 180 0 R (0x5fe5938de5ba94) 33 0 R (0x5fe5938de5ba945f32) 55 0 R (0x5fe5938de5ba945f323030) 45 0 R] +>> +endobj +152 0 obj +[149 0 R /XYZ 0 607.236 null] +endobj +153 0 obj +[149 0 R /XYZ 0 474.561 null] +endobj +154 0 obj +[149 0 R /XYZ 0 341.886 null] +endobj +155 0 obj +[149 0 R /XYZ 0 262.997 null] +endobj +156 0 obj +[149 0 R /XYZ 0 208.397 null] +endobj +157 0 obj +<< /Border [0 0 0] +/Dest (_889c1af8350fc1eef060154a9d96bf40) +/Subtype /Link +/Rect [334.776 111.417 418.776 121.917] +/Type /Annot +>> +endobj +158 0 obj +<< /Length 16811 +>> +stream +q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +BT +48.24 745.71 Td +/F2.1 10.5 Tf +<4243> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 701.4 51.552 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 701.4 360.864 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 701.4 103.104 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 671.4 51.552 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 671.4 360.864 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 671.4 103.104 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 641.4 51.552 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +99.792 641.4 360.864 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +460.656 641.4 103.104 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 621.9 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 621.9 360.864 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 621.9 103.104 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 602.4 51.552 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +99.792 602.4 360.864 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +460.656 602.4 103.104 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 582.9 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 582.9 360.864 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 582.9 103.104 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 563.4 51.552 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +99.792 563.4 360.864 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +460.656 563.4 103.104 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 543.9 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 543.9 360.864 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 543.9 103.104 19.5 re +f +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 731.4 m +99.792 731.4 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 701.4 m +99.792 701.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 731.65 m +48.24 700.775 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 731.65 m +99.792 700.775 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 718.03 Td +/F2.0 10.5 Tf +<48545450> Tj +/F2.1 10.5 Tf +<44> Tj +ET + + +BT +51.24 707.53 Td +/F2.1 10.5 Tf +<45> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 731.4 m +460.656 731.4 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +99.792 701.4 m +460.656 701.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 731.65 m +99.792 700.775 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 731.65 m +460.656 700.775 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 712.78 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 731.4 m +563.76 731.4 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +460.656 701.4 m +563.76 701.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 731.65 m +460.656 700.775 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 731.65 m +563.76 700.775 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 712.78 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 701.4 m +99.792 701.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 671.4 m +99.792 671.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 702.025 m +48.24 671.15 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 702.025 m +99.792 671.15 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 682.78 Td +/F2.0 10.5 Tf +<323030> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +99.792 701.4 m +460.656 701.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 671.4 m +460.656 671.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 702.025 m +99.792 671.15 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 702.025 m +460.656 671.15 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 682.78 Td +/F1.1 10.5 Tf +<2d2e454647> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +460.656 701.4 m +563.76 701.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 671.4 m +563.76 671.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 702.025 m +460.656 671.15 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 702.025 m +563.76 671.15 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +463.656 688.03 Td +/F1.0 10.5 Tf +[<4261736552> 11.0 <6573706f6e73654f66> 4.0 <73> 22.0 <747269>] TJ +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +463.656 677.53 Td +/F1.0 10.5 Tf +<6e67> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 671.4 m +99.792 671.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 641.4 m +99.792 641.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 671.65 m +48.24 641.15 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 671.65 m +99.792 641.15 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 652.78 Td +/F2.0 10.5 Tf +<323031> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 671.4 m +460.656 671.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 641.4 m +460.656 641.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 671.65 m +99.792 641.15 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 671.65 m +460.656 641.15 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 652.78 Td +/F1.1 10.5 Tf +<4849474a4b4c4d> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 671.4 m +563.76 671.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 641.4 m +563.76 641.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 671.65 m +460.656 641.15 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 671.65 m +563.76 641.15 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +463.656 658.03 Td +/F1.0 10.5 Tf +[<4261736552> 11.0 <6573706f6e73654f66> 4.0 <73> 22.0 <747269>] TJ +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +463.656 647.53 Td +/F1.0 10.5 Tf +<6e67> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 641.4 m +99.792 641.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 621.9 m +99.792 621.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 641.65 m +48.24 621.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 641.65 m +99.792 621.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 628.03 Td +/F2.0 10.5 Tf +<343030> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 641.4 m +460.656 641.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 621.9 m +460.656 621.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 641.65 m +99.792 621.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 641.65 m +460.656 621.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 628.03 Td +/F1.1 10.5 Tf +<2d2e4e4f505152535455565758592d2e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 641.4 m +563.76 641.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 621.9 m +563.76 621.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 641.65 m +460.656 621.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 641.65 m +563.76 621.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 628.03 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 621.9 m +99.792 621.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 602.4 m +99.792 602.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 622.15 m +48.24 602.15 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 622.15 m +99.792 602.15 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 608.53 Td +/F2.0 10.5 Tf +<343031> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 621.9 m +460.656 621.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 602.4 m +460.656 602.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 622.15 m +99.792 602.15 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 622.15 m +460.656 602.15 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 608.53 Td +/F1.1 10.5 Tf +<5d5e5f372c3b60524461> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 621.9 m +563.76 621.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 602.4 m +563.76 602.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 622.15 m +460.656 602.15 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 622.15 m +563.76 602.15 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 608.53 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 602.4 m +99.792 602.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 582.9 m +99.792 582.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 602.65 m +48.24 582.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 602.65 m +99.792 582.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 589.03 Td +/F2.0 10.5 Tf +<343033> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 602.4 m +460.656 602.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 582.9 m +460.656 582.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 602.65 m +99.792 582.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 602.65 m +460.656 582.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 589.03 Td +/F1.1 10.5 Tf +<23243325622d2e54636465666768> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 602.4 m +563.76 602.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 582.9 m +563.76 582.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 602.65 m +460.656 582.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 602.65 m +563.76 582.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 589.03 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 582.9 m +99.792 582.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 563.4 m +99.792 563.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 583.15 m +48.24 563.15 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 583.15 m +99.792 563.15 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 569.53 Td +/F2.0 10.5 Tf +<343034> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 582.9 m +460.656 582.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 563.4 m +460.656 563.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 583.15 m +99.792 563.15 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 583.15 m +460.656 563.15 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 569.53 Td +/F1.1 10.5 Tf +<23243369566a343f4048496b2728566c6d> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 582.9 m +563.76 582.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 563.4 m +563.76 563.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 583.15 m +460.656 563.15 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 583.15 m +563.76 563.15 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 569.53 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 563.4 m +99.792 563.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 543.9 m +99.792 543.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 563.65 m +48.24 543.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 563.65 m +99.792 543.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 550.03 Td +/F2.0 10.5 Tf +<353030> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 563.4 m +460.656 563.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 543.9 m +460.656 543.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 563.65 m +99.792 543.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 563.65 m +460.656 543.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 550.03 Td +/F1.1 10.5 Tf +<2324336e6f7071> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 563.4 m +563.76 563.4 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 543.9 m +563.76 543.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 563.65 m +460.656 543.65 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 563.65 m +563.76 543.65 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 550.03 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 518.61 Td +/F2.1 10.5 Tf +<292a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +55.511 492.81 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +70.74 494.175 Td +/F4.0 10.5 Tf +<6170706c69636174696f6e2f6a736f6e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 464.01 Td +/F2.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +55.511 438.21 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +70.74 439.575 Td +/F4.0 10.5 Tf +<6170706c69636174696f6e2f6a736f6e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 409.41 Td +/F2.0 10.5 Tf +<48545450> Tj +/F2.1 10.5 Tf +<2f304647> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 383.28 Td +/F2.1 9 Tf +<2f3020> Tj +/F2.0 9 Tf +[<70> 14.0 <61> 19.0 <7468>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 369.3 m +559.76 369.3 l +561.9691 369.3 563.76 367.5091 563.76 365.3 c +563.76 337.011 l +563.76 334.8019 561.9691 333.011 559.76 333.011 c +52.24 333.011 l +50.0309 333.011 48.24 334.8019 48.24 337.011 c +48.24 365.3 l +48.24 367.5091 50.0309 369.3 52.24 369.3 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 369.3 m +559.76 369.3 l +561.9691 369.3 563.76 367.5091 563.76 365.3 c +563.76 337.011 l +563.76 334.8019 561.9691 333.011 559.76 333.011 c +52.24 333.011 l +50.0309 333.011 48.24 334.8019 48.24 337.011 c +48.24 365.3 l +48.24 367.5091 50.0309 369.3 52.24 369.3 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 348.136 Td +/F4.0 11 Tf +<2f6e6f746966794c6f67696e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 309.191 Td +/F2.1 9 Tf +<2f3020> Tj +/F2.0 9 Tf +[<6865> 14.0 <61646572>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 295.211 m +559.76 295.211 l +561.9691 295.211 563.76 293.4201 563.76 291.211 c +563.76 262.922 l +563.76 260.7129 561.9691 258.922 559.76 258.922 c +52.24 258.922 l +50.0309 258.922 48.24 260.7129 48.24 262.922 c +48.24 291.211 l +48.24 293.4201 50.0309 295.211 52.24 295.211 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 295.211 m +559.76 295.211 l +561.9691 295.211 563.76 293.4201 563.76 291.211 c +563.76 262.922 l +563.76 260.7129 561.9691 258.922 559.76 258.922 c +52.24 258.922 l +50.0309 258.922 48.24 260.7129 48.24 262.922 c +48.24 291.211 l +48.24 293.4201 50.0309 295.211 52.24 295.211 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 274.047 Td +/F4.0 11 Tf +<22737472696e6722> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 235.102 Td +/F2.1 9 Tf +<2f3020> Tj +/F2.0 9 Tf +<626f6479> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 221.122 m +559.76 221.122 l +561.9691 221.122 563.76 219.3311 563.76 217.122 c +563.76 115.958 l +563.76 113.7489 561.9691 111.958 559.76 111.958 c +52.24 111.958 l +50.0309 111.958 48.24 113.7489 48.24 115.958 c +48.24 217.122 l +48.24 219.3311 50.0309 221.122 52.24 221.122 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 221.122 m +559.76 221.122 l +561.9691 221.122 563.76 219.3311 563.76 217.122 c +563.76 115.958 l +563.76 113.7489 561.9691 111.958 559.76 111.958 c +52.24 111.958 l +50.0309 111.958 48.24 113.7489 48.24 115.958 c +48.24 217.122 l +48.24 219.3311 50.0309 221.122 52.24 221.122 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 198.528 Td +/F4.0 11 Tf +<7b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 184.239 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 169.95 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 155.661 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 141.372 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 127.083 Td +/F4.0 11 Tf +<7d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 86.668 Td +/F2.0 10.5 Tf +<48545450> Tj +/F2.1 10.5 Tf +<42434647> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp1 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +552.77 11.04 Td +/F1.0 9 Tf +<3133> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +159 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 612.0 792.0] +/CropBox [0 0 612.0 792.0] +/BleedBox [0 0 612.0 792.0] +/TrimBox [0 0 612.0 792.0] +/ArtBox [0 0 612.0 792.0] +/Contents 158 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F2.1 17 0 R +/F2.0 16 0 R +/F1.1 8 0 R +/F1.0 9 0 R +/F4.0 23 0 R +>> +/XObject << /Stamp1 217 0 R +>> +>> +/Annots [161 0 R 162 0 R 163 0 R 164 0 R] +>> +endobj +160 0 obj +[159 0 R /XYZ 0 792.0 null] +endobj +161 0 obj +<< /Border [0 0 0] +/Dest (_baseresponseofstring) +/Subtype /Link +/Rect [463.656 686.77 561.2745 697.27] +/Type /Annot +>> +endobj +162 0 obj +<< /Border [0 0 0] +/Dest (_baseresponseofstring) +/Subtype /Link +/Rect [463.656 676.27 475.983 686.77] +/Type /Annot +>> +endobj +163 0 obj +<< /Border [0 0 0] +/Dest (_baseresponseofstring) +/Subtype /Link +/Rect [463.656 656.77 561.2745 667.27] +/Type /Annot +>> +endobj +164 0 obj +<< /Border [0 0 0] +/Dest (_baseresponseofstring) +/Subtype /Link +/Rect [463.656 646.27 475.983 656.77] +/Type /Annot +>> +endobj +165 0 obj +[159 0 R /XYZ 0 531.9 null] +endobj +166 0 obj +[159 0 R /XYZ 0 477.3 null] +endobj +167 0 obj +<< /Limits [(0x5fe8afb4e6988e5f34) (0x5fe8afb7e6b1825f6865616465725f32)] +/Names [(0x5fe8afb4e6988e5f34) 91 0 R (0x5fe8afb4e6988e5f35) 111 0 R (0x5fe8afb4e6988e5f36) 132 0 R (0x5fe8afb4e6988e5f37) 155 0 R (0x5fe8afb4e6988e5f38) 179 0 R (0x5fe8afb7e6b1825f626f6479) 41 0 R (0x5fe8afb7e6b1825f626f64795f32) 63 0 R (0x5fe8afb7e6b1825f626f64795f33) 104 0 R (0x5fe8afb7e6b1825f626f64795f34) 124 0 R (0x5fe8afb7e6b1825f626f64795f35) 147 0 R (0x5fe8afb7e6b1825f626f64795f36) 171 0 R (0x5fe8afb7e6b1825f626f64795f37) 192 0 R (0x5fe8afb7e6b1825f686561646572) 40 0 R (0x5fe8afb7e6b1825f6865616465725f32) 62 0 R] +>> +endobj +168 0 obj +[159 0 R /XYZ 0 422.7 null] +endobj +169 0 obj +[159 0 R /XYZ 0 395.1 null] +endobj +170 0 obj +[159 0 R /XYZ 0 321.011 null] +endobj +171 0 obj +[159 0 R /XYZ 0 246.922 null] +endobj +172 0 obj +[159 0 R /XYZ 0 99.958 null] +endobj +173 0 obj +<< /Length 20171 +>> +stream +q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +BT +48.24 747.18 Td +/F2.1 9 Tf +<424320> Tj +/F2.0 9 Tf +<323030> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 733.2 m +559.76 733.2 l +561.9691 733.2 563.76 731.4091 563.76 729.2 c +563.76 642.325 l +563.76 640.1159 561.9691 638.325 559.76 638.325 c +52.24 638.325 l +50.0309 638.325 48.24 640.1159 48.24 642.325 c +48.24 729.2 l +48.24 731.4091 50.0309 733.2 52.24 733.2 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 733.2 m +559.76 733.2 l +561.9691 733.2 563.76 731.4091 563.76 729.2 c +563.76 642.325 l +563.76 640.1159 561.9691 638.325 559.76 638.325 c +52.24 638.325 l +50.0309 638.325 48.24 640.1159 48.24 642.325 c +48.24 729.2 l +48.24 731.4091 50.0309 733.2 52.24 733.2 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 710.606 Td +/F4.0 11 Tf +<7b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 696.317 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 682.028 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +131.84 682.028 Td +/F1.1 11 Tf +<474a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +153.84 682.028 Td +/F4.0 11 Tf +<222c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 667.739 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 653.45 Td +/F4.0 11 Tf +<7d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 614.505 Td +/F2.1 9 Tf +<424320> Tj +/F2.0 9 Tf +<323031> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 600.525 m +559.76 600.525 l +561.9691 600.525 563.76 598.7341 563.76 596.525 c +563.76 509.65 l +563.76 507.4409 561.9691 505.65 559.76 505.65 c +52.24 505.65 l +50.0309 505.65 48.24 507.4409 48.24 509.65 c +48.24 596.525 l +48.24 598.7341 50.0309 600.525 52.24 600.525 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 600.525 m +559.76 600.525 l +561.9691 600.525 563.76 598.7341 563.76 596.525 c +563.76 509.65 l +563.76 507.4409 561.9691 505.65 559.76 505.65 c +52.24 505.65 l +50.0309 505.65 48.24 507.4409 48.24 509.65 c +48.24 596.525 l +48.24 598.7341 50.0309 600.525 52.24 600.525 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 577.931 Td +/F4.0 11 Tf +<7b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 563.642 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 549.353 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +131.84 549.353 Td +/F1.1 11 Tf +<474a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +153.84 549.353 Td +/F4.0 11 Tf +<222c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 535.064 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 520.775 Td +/F4.0 11 Tf +<7d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 473.01 Td +/F2.0 18 Tf +<322e332e20> Tj +/F2.1 18 Tf +<5758> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 445.56 Td +/F1.1 10.5 Tf +<232433343536372c38393a3132> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 414.31 Td +/F2.0 13 Tf +<322e332e312e20> Tj +/F2.1 13 Tf +<593157583536> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 399.45 m +559.76 399.45 l +561.9691 399.45 563.76 397.6591 563.76 395.45 c +563.76 367.161 l +563.76 364.9519 561.9691 363.161 559.76 363.161 c +52.24 363.161 l +50.0309 363.161 48.24 364.9519 48.24 367.161 c +48.24 395.45 l +48.24 397.6591 50.0309 399.45 52.24 399.45 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 399.45 m +559.76 399.45 l +561.9691 399.45 563.76 397.6591 563.76 395.45 c +563.76 367.161 l +563.76 364.9519 561.9691 363.161 559.76 363.161 c +52.24 363.161 l +50.0309 363.161 48.24 364.9519 48.24 367.161 c +48.24 395.45 l +48.24 397.6591 50.0309 399.45 52.24 399.45 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 378.286 Td +/F4.0 11 Tf +<504f5354202f6e6f746966792f756e62696e64> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 337.871 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 312.071 Td +/F1.1 10.5 Tf + Tj +/F1.0 10.5 Tf +<504f53> Tj +/F1.1 10.5 Tf +<3b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 283.271 Td +/F2.1 10.5 Tf +<393a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 249.461 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 249.461 77.328 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +177.12 249.461 154.656 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +331.776 249.461 103.104 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +434.88 249.461 128.88 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 219.461 51.552 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 219.461 77.328 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +177.12 219.461 154.656 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +331.776 219.461 103.104 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +434.88 219.461 128.88 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 189.461 51.552 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +99.792 189.461 77.328 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +177.12 189.461 154.656 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +331.776 189.461 103.104 30.0 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +434.88 189.461 128.88 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 159.461 51.552 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 159.461 77.328 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +177.12 159.461 154.656 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +331.776 159.461 103.104 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +434.88 159.461 128.88 30.0 re +f +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 268.961 m +99.792 268.961 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 249.461 m +99.792 249.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 269.211 m +48.24 248.836 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 269.211 m +99.792 248.836 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 255.591 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 268.961 m +177.12 268.961 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +99.792 249.461 m +177.12 249.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 269.211 m +99.792 248.836 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 269.211 m +177.12 248.836 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 255.591 Td +/F2.1 10.5 Tf +<3d3e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 268.961 m +331.776 268.961 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +177.12 249.461 m +331.776 249.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 269.211 m +177.12 248.836 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 269.211 m +331.776 248.836 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +180.12 255.591 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 268.961 m +434.88 268.961 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +331.776 249.461 m +434.88 249.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 269.211 m +331.776 248.836 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 269.211 m +434.88 248.836 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +334.776 255.591 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 268.961 m +563.76 268.961 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +434.88 249.461 m +563.76 249.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 269.211 m +434.88 248.836 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 269.211 m +563.76 248.836 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +437.88 255.591 Td +/F2.1 10.5 Tf +<3f4041> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 249.461 m +99.792 249.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 219.461 m +99.792 219.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 250.086 m +48.24 219.211 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 250.086 m +99.792 219.211 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 230.841 Td +/F2.0 10.5 Tf +[<4865> 14.0 <61646572>] TJ +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +99.792 249.461 m +177.12 249.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 219.461 m +177.12 219.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 250.086 m +99.792 219.211 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 250.086 m +177.12 219.211 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 236.091 Td +/F2.0 10.5 Tf +[<41> 3.0 <7574686f72697a> 19.0 <61> 19.0 <74696f6e>] TJ +ET + + +BT +102.792 225.591 Td +ET + + +BT +102.792 225.591 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +177.12 249.461 m +331.776 249.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 219.461 m +331.776 219.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 250.086 m +177.12 219.211 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 250.086 m +331.776 219.211 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +180.12 230.841 Td +/F1.0 10.5 Tf +[<41> 7.0 <7574686f72697a> 26.0 <61> 15.0 <74696f6e>] TJ +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +331.776 249.461 m +434.88 249.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 219.461 m +434.88 219.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 250.086 m +331.776 219.211 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 250.086 m +434.88 219.211 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +334.776 230.841 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +434.88 249.461 m +563.76 249.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 219.461 m +563.76 219.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 250.086 m +434.88 219.211 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 250.086 m +563.76 219.211 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +437.88 231.5235 Td +/F4.0 10.5 Tf +<22746f6b656e22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 219.461 m +99.792 219.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 189.461 m +99.792 189.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 219.711 m +48.24 189.211 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 219.711 m +99.792 189.211 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 200.841 Td +/F2.0 10.5 Tf +[<4865> 14.0 <61646572>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 219.461 m +177.12 219.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 189.461 m +177.12 189.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 219.711 m +99.792 189.211 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 219.711 m +177.12 189.211 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 206.091 Td +/F2.0 10.5 Tf +[<436f6e74> 19.0 <656e74> 38.0 <2d> 61.0 <54> 30.0 <797065>] TJ +ET + + +BT +102.792 195.591 Td +ET + + +BT +102.792 195.591 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 219.461 m +331.776 219.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 189.461 m +331.776 189.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 219.711 m +177.12 189.211 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 219.711 m +331.776 189.211 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +180.12 200.841 Td +/F1.0 10.5 Tf +[<436f6e74> 15.0 <656e74> 29.0 <2d> 53.0 <54> 37.0 <797065>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 219.461 m +434.88 219.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 189.461 m +434.88 189.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 219.711 m +331.776 189.211 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 219.711 m +434.88 189.211 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +334.776 200.841 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 219.461 m +563.76 219.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 189.461 m +563.76 189.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 219.711 m +434.88 189.211 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 219.711 m +563.76 189.211 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +437.88 201.5235 Td +/F4.0 10.5 Tf +<226170706c69636174696f6e2f6a736f6e22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 189.461 m +99.792 189.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 159.461 m +99.792 159.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 189.711 m +48.24 159.211 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 189.711 m +99.792 159.211 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 170.841 Td +/F2.0 10.5 Tf +<426f6479> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 189.461 m +177.12 189.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 159.461 m +177.12 159.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 189.711 m +99.792 159.211 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 189.711 m +177.12 159.211 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 176.091 Td +/F2.0 10.5 Tf +[<756e62696e6450> 41.0 <6172> 31.0 <616d>] TJ +ET + + +BT +102.792 165.591 Td +ET + + +BT +102.792 165.591 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 189.461 m +331.776 189.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 159.461 m +331.776 159.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +177.12 189.711 m +177.12 159.211 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 189.711 m +331.776 159.211 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +180.12 170.841 Td +/F1.0 10.5 Tf +[<756e62696e6450> 48.0 <6172> 27.0 <616d>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 189.461 m +434.88 189.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 159.461 m +434.88 159.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +331.776 189.711 m +331.776 159.211 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 189.711 m +434.88 159.211 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +334.776 170.841 Td +/F1.1 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 189.461 m +563.76 189.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 159.461 m +563.76 159.461 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +434.88 189.711 m +434.88 159.211 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 189.711 m +563.76 159.211 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 134.171 Td +/F2.1 10.5 Tf +<4243> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 89.861 51.552 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 89.861 360.864 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 89.861 103.104 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 70.361 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 70.361 360.864 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 70.361 103.104 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 50.861 51.552 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +99.792 50.861 360.864 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +460.656 50.861 103.104 19.5 re +f +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 119.861 m +99.792 119.861 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 89.861 m +99.792 89.861 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 120.111 m +48.24 89.236 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 120.111 m +99.792 89.236 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 106.491 Td +/F2.0 10.5 Tf +<48545450> Tj +/F2.1 10.5 Tf +<44> Tj +ET + + +BT +51.24 95.991 Td +/F2.1 10.5 Tf +<45> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 119.861 m +460.656 119.861 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +99.792 89.861 m +460.656 89.861 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 120.111 m +99.792 89.236 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 120.111 m +460.656 89.236 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 101.241 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 119.861 m +563.76 119.861 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +460.656 89.861 m +563.76 89.861 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 120.111 m +460.656 89.236 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 120.111 m +563.76 89.236 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 101.241 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 89.861 m +99.792 89.861 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 70.361 m +99.792 70.361 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 90.486 m +48.24 70.111 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 90.486 m +99.792 70.111 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 76.491 Td +/F2.0 10.5 Tf +<323030> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +99.792 89.861 m +460.656 89.861 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 70.361 m +460.656 70.361 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 90.486 m +99.792 70.111 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 90.486 m +460.656 70.111 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 76.491 Td +/F1.1 10.5 Tf +<2d2e454647> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +460.656 89.861 m +563.76 89.861 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 70.361 m +563.76 70.361 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 90.486 m +460.656 70.111 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 90.486 m +563.76 70.111 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +463.656 76.491 Td +/F1.0 10.5 Tf +[<4261736552> 11.0 <6573706f6e7365>] TJ +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 70.361 m +99.792 70.361 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 50.861 m +99.792 50.861 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 70.611 m +48.24 50.611 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 70.611 m +99.792 50.611 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 56.991 Td +/F2.0 10.5 Tf +<323031> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 70.361 m +460.656 70.361 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 50.861 m +460.656 50.861 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 70.611 m +99.792 50.611 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 70.611 m +460.656 50.611 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 56.991 Td +/F1.1 10.5 Tf +<4849474a4b4c4d> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 70.361 m +563.76 70.361 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 50.861 m +563.76 50.861 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 70.611 m +460.656 50.611 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 70.611 m +563.76 50.611 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.2588 0.5451 0.7922 scn +0.2588 0.5451 0.7922 SCN + +BT +463.656 56.991 Td +/F1.0 10.5 Tf +[<4261736552> 11.0 <6573706f6e7365>] TJ +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp2 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +49.24 11.04 Td +/F1.0 9 Tf +<3134> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +174 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 612.0 792.0] +/CropBox [0 0 612.0 792.0] +/BleedBox [0 0 612.0 792.0] +/TrimBox [0 0 612.0 792.0] +/ArtBox [0 0 612.0 792.0] +/Contents 173 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F2.1 17 0 R +/F2.0 16 0 R +/F4.0 23 0 R +/F1.1 8 0 R +/F1.0 9 0 R +/F3.1 19 0 R +>> +/XObject << /Stamp2 218 0 R +>> +>> +/Annots [181 0 R 183 0 R 184 0 R] +>> +endobj +175 0 obj +[174 0 R /XYZ 0 792.0 null] +endobj +176 0 obj +[174 0 R /XYZ 0 626.325 null] +endobj +177 0 obj +[174 0 R /XYZ 0 493.65 null] +endobj +178 0 obj +[174 0 R /XYZ 0 430.05 null] +endobj +179 0 obj +[174 0 R /XYZ 0 351.161 null] +endobj +180 0 obj +[174 0 R /XYZ 0 296.561 null] +endobj +181 0 obj +<< /Border [0 0 0] +/Dest (_53dbe61dd9fa5051b44e3907574b9f39) +/Subtype /Link +/Rect [334.776 169.581 397.776 180.081] +/Type /Annot +>> +endobj +182 0 obj +[174 0 R /XYZ 0 147.461 null] +endobj +183 0 obj +<< /Border [0 0 0] +/Dest (_baseresponse) +/Subtype /Link +/Rect [463.656 75.231 534.51 85.731] +/Type /Annot +>> +endobj +184 0 obj +<< /Border [0 0 0] +/Dest (_baseresponse) +/Subtype /Link +/Rect [463.656 55.731 534.51 66.231] +/Type /Annot +>> +endobj +185 0 obj +<< /Length 14784 +>> +stream +q +/DeviceRGB cs +1.0 1.0 1.0 scn +48.24 726.0 51.552 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 726.0 360.864 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 726.0 103.104 30.0 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 706.5 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 706.5 360.864 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 706.5 103.104 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 687.0 51.552 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +99.792 687.0 360.864 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +460.656 687.0 103.104 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 667.5 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 667.5 360.864 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 667.5 103.104 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 648.0 51.552 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +99.792 648.0 360.864 19.5 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +460.656 648.0 103.104 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 628.5 51.552 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +99.792 628.5 360.864 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +460.656 628.5 103.104 19.5 re +f +0.0 0.0 0.0 scn +0.5 w +/DeviceRGB CS +0.8667 0.8667 0.8667 SCN +48.24 756.0 m +99.792 756.0 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 726.0 m +99.792 726.0 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 756.25 m +48.24 725.375 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 756.25 m +99.792 725.375 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 742.63 Td +/F2.0 10.5 Tf +<48545450> Tj +/F2.1 10.5 Tf +<44> Tj +ET + + +BT +51.24 732.13 Td +/F2.1 10.5 Tf +<45> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 756.0 m +460.656 756.0 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +99.792 726.0 m +460.656 726.0 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 756.25 m +99.792 725.375 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 756.25 m +460.656 725.375 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 737.38 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 756.0 m +563.76 756.0 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +460.656 726.0 m +563.76 726.0 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 756.25 m +460.656 725.375 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 756.25 m +563.76 725.375 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 737.38 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 726.0 m +99.792 726.0 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 706.5 m +99.792 706.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 726.25 m +48.24 706.25 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 726.25 m +99.792 706.25 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 712.63 Td +/F2.0 10.5 Tf +<343030> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 726.0 m +460.656 726.0 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 706.5 m +460.656 706.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 726.25 m +99.792 706.25 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 726.25 m +460.656 706.25 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 712.63 Td +/F1.1 10.5 Tf +<2d2e4e4f505152535455565758592d2e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 726.0 m +563.76 726.0 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 706.5 m +563.76 706.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 726.25 m +460.656 706.25 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 726.25 m +563.76 706.25 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 712.63 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 706.5 m +99.792 706.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 687.0 m +99.792 687.0 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 706.75 m +48.24 686.75 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 706.75 m +99.792 686.75 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 693.13 Td +/F2.0 10.5 Tf +<343031> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 706.5 m +460.656 706.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 687.0 m +460.656 687.0 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 706.75 m +99.792 686.75 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 706.75 m +460.656 686.75 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 693.13 Td +/F1.1 10.5 Tf +<5d5e5f372c3b60524461> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 706.5 m +563.76 706.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 687.0 m +563.76 687.0 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 706.75 m +460.656 686.75 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 706.75 m +563.76 686.75 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 693.13 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 687.0 m +99.792 687.0 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 667.5 m +99.792 667.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 687.25 m +48.24 667.25 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 687.25 m +99.792 667.25 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 673.63 Td +/F2.0 10.5 Tf +<343033> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 687.0 m +460.656 687.0 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 667.5 m +460.656 667.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 687.25 m +99.792 667.25 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 687.25 m +460.656 667.25 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 673.63 Td +/F1.1 10.5 Tf +<23243325622d2e54636465666768> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 687.0 m +563.76 687.0 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 667.5 m +563.76 667.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 687.25 m +460.656 667.25 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 687.25 m +563.76 667.25 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 673.63 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 667.5 m +99.792 667.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 648.0 m +99.792 648.0 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 667.75 m +48.24 647.75 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 667.75 m +99.792 647.75 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 654.13 Td +/F2.0 10.5 Tf +<343034> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 667.5 m +460.656 667.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 648.0 m +460.656 648.0 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 667.75 m +99.792 647.75 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 667.75 m +460.656 647.75 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 654.13 Td +/F1.1 10.5 Tf +<23243369566a343f4048496b2728566c6d> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 667.5 m +563.76 667.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 648.0 m +563.76 648.0 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 667.75 m +460.656 647.75 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 667.75 m +563.76 647.75 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 654.13 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 648.0 m +99.792 648.0 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 628.5 m +99.792 628.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 648.25 m +48.24 628.25 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 648.25 m +99.792 628.25 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 634.63 Td +/F2.0 10.5 Tf +<353030> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 648.0 m +460.656 648.0 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 628.5 m +460.656 628.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +99.792 648.25 m +99.792 628.25 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 648.25 m +460.656 628.25 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +102.792 634.63 Td +/F1.1 10.5 Tf +<2324336e6f7071> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 648.0 m +563.76 648.0 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 628.5 m +563.76 628.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +460.656 648.25 m +460.656 628.25 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 648.25 m +563.76 628.25 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +463.656 634.63 Td +/F1.1 10.5 Tf +<5a5b5c> Tj +ET + +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 603.21 Td +/F2.1 10.5 Tf +<292a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +55.511 577.41 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +70.74 578.775 Td +/F4.0 10.5 Tf +<6170706c69636174696f6e2f6a736f6e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 548.61 Td +/F2.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +-0.5 Tc +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +55.511 522.81 Td +/F1.0 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn + +0.0 Tc +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +70.74 524.175 Td +/F4.0 10.5 Tf +<6170706c69636174696f6e2f6a736f6e> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 494.01 Td +/F2.0 10.5 Tf +<48545450> Tj +/F2.1 10.5 Tf +<2f304647> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 467.88 Td +/F2.1 9 Tf +<2f3020> Tj +/F2.0 9 Tf +[<70> 14.0 <61> 19.0 <7468>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 453.9 m +559.76 453.9 l +561.9691 453.9 563.76 452.1091 563.76 449.9 c +563.76 421.611 l +563.76 419.4019 561.9691 417.611 559.76 417.611 c +52.24 417.611 l +50.0309 417.611 48.24 419.4019 48.24 421.611 c +48.24 449.9 l +48.24 452.1091 50.0309 453.9 52.24 453.9 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 453.9 m +559.76 453.9 l +561.9691 453.9 563.76 452.1091 563.76 449.9 c +563.76 421.611 l +563.76 419.4019 561.9691 417.611 559.76 417.611 c +52.24 417.611 l +50.0309 417.611 48.24 419.4019 48.24 421.611 c +48.24 449.9 l +48.24 452.1091 50.0309 453.9 52.24 453.9 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 432.736 Td +/F4.0 11 Tf +<2f6e6f746966792f756e62696e64> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 393.791 Td +/F2.1 9 Tf +<2f3020> Tj +/F2.0 9 Tf +[<6865> 14.0 <61646572>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 379.811 m +559.76 379.811 l +561.9691 379.811 563.76 378.0201 563.76 375.811 c +563.76 347.522 l +563.76 345.3129 561.9691 343.522 559.76 343.522 c +52.24 343.522 l +50.0309 343.522 48.24 345.3129 48.24 347.522 c +48.24 375.811 l +48.24 378.0201 50.0309 379.811 52.24 379.811 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 379.811 m +559.76 379.811 l +561.9691 379.811 563.76 378.0201 563.76 375.811 c +563.76 347.522 l +563.76 345.3129 561.9691 343.522 559.76 343.522 c +52.24 343.522 l +50.0309 343.522 48.24 345.3129 48.24 347.522 c +48.24 375.811 l +48.24 378.0201 50.0309 379.811 52.24 379.811 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 358.647 Td +/F4.0 11 Tf +<22737472696e6722> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 319.702 Td +/F2.1 9 Tf +<2f3020> Tj +/F2.0 9 Tf +<626f6479> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 305.722 m +559.76 305.722 l +561.9691 305.722 563.76 303.9311 563.76 301.722 c +563.76 229.136 l +563.76 226.9269 561.9691 225.136 559.76 225.136 c +52.24 225.136 l +50.0309 225.136 48.24 226.9269 48.24 229.136 c +48.24 301.722 l +48.24 303.9311 50.0309 305.722 52.24 305.722 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 305.722 m +559.76 305.722 l +561.9691 305.722 563.76 303.9311 563.76 301.722 c +563.76 229.136 l +563.76 226.9269 561.9691 225.136 559.76 225.136 c +52.24 225.136 l +50.0309 225.136 48.24 226.9269 48.24 229.136 c +48.24 301.722 l +48.24 303.9311 50.0309 305.722 52.24 305.722 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 283.128 Td +/F4.0 11 Tf +<7b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 268.839 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 254.55 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +164.84 254.55 Td +/F1.1 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +252.84 254.55 Td +/F4.0 11 Tf +<37> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +259.44 254.55 Td +/F1.1 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +270.44 254.55 Td +/F4.0 11 Tf +<22> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 240.261 Td +/F4.0 11 Tf +<7d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 199.846 Td +/F2.0 10.5 Tf +<48545450> Tj +/F2.1 10.5 Tf +<42434647> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 173.716 Td +/F2.1 9 Tf +<424320> Tj +/F2.0 9 Tf +<323030> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 159.736 m +559.76 159.736 l +561.9691 159.736 563.76 157.9451 563.76 155.736 c +563.76 68.861 l +563.76 66.6519 561.9691 64.861 559.76 64.861 c +52.24 64.861 l +50.0309 64.861 48.24 66.6519 48.24 68.861 c +48.24 155.736 l +48.24 157.9451 50.0309 159.736 52.24 159.736 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 159.736 m +559.76 159.736 l +561.9691 159.736 563.76 157.9451 563.76 155.736 c +563.76 68.861 l +563.76 66.6519 561.9691 64.861 559.76 64.861 c +52.24 64.861 l +50.0309 64.861 48.24 66.6519 48.24 68.861 c +48.24 155.736 l +48.24 157.9451 50.0309 159.736 52.24 159.736 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 137.142 Td +/F4.0 11 Tf +<7b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 122.853 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 108.564 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +131.84 108.564 Td +/F1.1 11 Tf +<474a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +153.84 108.564 Td +/F4.0 11 Tf +<222c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 94.275 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 79.986 Td +/F4.0 11 Tf +<7d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp1 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +552.77 11.04 Td +/F1.0 9 Tf +<3135> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +186 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 612.0 792.0] +/CropBox [0 0 612.0 792.0] +/BleedBox [0 0 612.0 792.0] +/TrimBox [0 0 612.0 792.0] +/ArtBox [0 0 612.0 792.0] +/Contents 185 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F2.0 16 0 R +/F2.1 17 0 R +/F1.1 8 0 R +/F1.0 9 0 R +/F4.0 23 0 R +>> +/XObject << /Stamp1 217 0 R +>> +>> +>> +endobj +187 0 obj +[186 0 R /XYZ 0 616.5 null] +endobj +188 0 obj +[186 0 R /XYZ 0 561.9 null] +endobj +189 0 obj +[186 0 R /XYZ 0 507.3 null] +endobj +190 0 obj +[186 0 R /XYZ 0 479.7 null] +endobj +191 0 obj +[186 0 R /XYZ 0 405.611 null] +endobj +192 0 obj +[186 0 R /XYZ 0 331.522 null] +endobj +193 0 obj +[186 0 R /XYZ 0 213.136 null] +endobj +194 0 obj +[186 0 R /XYZ 0 185.536 null] +endobj +195 0 obj +<< /Length 24986 +>> +stream +q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +BT +48.24 747.18 Td +/F2.1 9 Tf +<424320> Tj +/F2.0 9 Tf +<323031> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.9608 0.9608 0.9608 scn +52.24 733.2 m +559.76 733.2 l +561.9691 733.2 563.76 731.4091 563.76 729.2 c +563.76 642.325 l +563.76 640.1159 561.9691 638.325 559.76 638.325 c +52.24 638.325 l +50.0309 638.325 48.24 640.1159 48.24 642.325 c +48.24 729.2 l +48.24 731.4091 50.0309 733.2 52.24 733.2 c +h +f +0.8 0.8 0.8 SCN +0.75 w +52.24 733.2 m +559.76 733.2 l +561.9691 733.2 563.76 731.4091 563.76 729.2 c +563.76 642.325 l +563.76 640.1159 561.9691 638.325 559.76 638.325 c +52.24 638.325 l +50.0309 638.325 48.24 640.1159 48.24 642.325 c +48.24 729.2 l +48.24 731.4091 50.0309 733.2 52.24 733.2 c +h +S +Q +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 710.606 Td +/F4.0 11 Tf +<7b> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 696.317 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 682.028 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +131.84 682.028 Td +/F1.1 11 Tf +<474a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +153.84 682.028 Td +/F4.0 11 Tf +<222c> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 667.739 Td +/F4.0 11 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +59.24 653.45 Td +/F4.0 11 Tf +<7d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 601.765 Td +/F2.0 22 Tf +<332e20> Tj +/F2.1 22 Tf +<325a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 564.285 Td +/F2.0 18 Tf +<332e312e20415050> Tj +/F2.1 18 Tf +<23245149393a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 536.835 Td +/F1.0 10.5 Tf +<415050> Tj +/F1.1 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 501.825 85.9197 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +134.1597 501.825 315.0399 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +449.1996 501.825 114.5604 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 470.796 85.9197 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +134.1597 470.796 315.0399 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +449.1996 470.796 114.5604 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 439.767 85.9197 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +134.1597 439.767 315.0399 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +449.1996 439.767 114.5604 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 408.738 85.9197 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +134.1597 408.738 315.0399 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +449.1996 408.738 114.5604 31.029 re +f +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 521.325 m +134.1597 521.325 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 501.825 m +134.1597 501.825 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 521.575 m +48.24 501.2 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 521.575 m +134.1597 501.2 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 507.955 Td +/F2.1 10.5 Tf +<3d3e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 521.325 m +449.1996 521.325 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +134.1597 501.825 m +449.1996 501.825 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 521.575 m +134.1597 501.2 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 521.575 m +449.1996 501.2 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 507.955 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 521.325 m +563.76 521.325 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +449.1996 501.825 m +563.76 501.825 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 521.575 m +449.1996 501.2 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 521.575 m +563.76 501.2 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 507.955 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 501.825 m +134.1597 501.825 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 470.796 m +134.1597 470.796 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 502.45 m +48.24 470.546 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 502.45 m +134.1597 470.546 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 487.9405 Td +/F2.0 10.5 Tf +[<6170706c6963> 12.0 <61> 19.0 <74696f6e4964>] TJ +ET + + +BT +51.24 477.4405 Td +ET + + +BT +51.24 477.4405 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +134.1597 501.825 m +449.1996 501.825 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 470.796 m +449.1996 470.796 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 502.45 m +134.1597 470.546 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 502.45 m +449.1996 470.546 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 488.1978 Td +/F1.0 10.5 Tf +<415050> Tj +/F1.1 10.5 Tf +<362b> Tj +/F1.0 10.5 Tf +<4944> Tj +/F1.1 10.5 Tf +<54a2ac> Tj +/F1.0 10.5 Tf +<415050> Tj +/F1.1 10.5 Tf + Tj +/F1.0 10.5 Tf +[<4170706c6963> 11.0 <61> 15.0 <74696f6e204964>] TJ +ET + + +BT +137.1597 477.1833 Td +ET + + +BT +137.1597 477.1833 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 477.1833 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 477.1833 Td +/F4.0 10.5 Tf +<22636f6d2e656e7a6869636f2e787a70617922> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +449.1996 501.825 m +563.76 501.825 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 470.796 m +563.76 470.796 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 502.45 m +449.1996 470.546 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 502.45 m +563.76 470.546 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 482.6905 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 470.796 m +134.1597 470.796 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 439.767 m +134.1597 439.767 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 471.046 m +48.24 439.517 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 471.046 m +134.1597 439.517 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 456.9115 Td +/F2.0 10.5 Tf +<696d6569> Tj +ET + + +BT +51.24 446.4115 Td +ET + + +BT +51.24 446.4115 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 470.796 m +449.1996 470.796 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 439.767 m +449.1996 439.767 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 471.046 m +134.1597 439.517 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 471.046 m +449.1996 439.517 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 457.1688 Td +/F1.0 10.5 Tf +<494d4549> Tj +/F1.1 10.5 Tf +<9a> Tj +ET + + +BT +137.1597 446.1543 Td +ET + + +BT +137.1597 446.1543 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 446.1543 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 446.1543 Td +/F4.0 10.5 Tf +<22323332344445454641585831323222> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 470.796 m +563.76 470.796 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 439.767 m +563.76 439.767 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 471.046 m +449.1996 439.517 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 471.046 m +563.76 439.517 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 451.6615 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 439.767 m +134.1597 439.767 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 408.738 m +134.1597 408.738 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 440.017 m +48.24 408.488 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 440.017 m +134.1597 408.488 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 425.8825 Td +/F2.0 10.5 Tf +[<76> 8.0 <6572> 8.0 <73696f6e>] TJ +ET + + +BT +51.24 415.3825 Td +ET + + +BT +51.24 415.3825 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 439.767 m +449.1996 439.767 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 408.738 m +449.1996 408.738 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 440.017 m +134.1597 408.488 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 440.017 m +449.1996 408.488 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 426.1398 Td +/F1.0 10.5 Tf +<415050> Tj +/F1.1 10.5 Tf +<40f4f5cdcecc> Tj +ET + + +BT +137.1597 415.1253 Td +ET + + +BT +137.1597 415.1253 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 415.1253 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 415.1253 Td +/F4.0 10.5 Tf +<22312e322e3022> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 439.767 m +563.76 439.767 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 408.738 m +563.76 408.738 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 440.017 m +449.1996 408.488 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 440.017 m +563.76 408.488 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 420.6325 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 376.098 Td +/F2.0 18 Tf +<332e322e20415050> Tj +/F2.1 18 Tf +<232451495c5d> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 348.648 Td +/F1.0 10.5 Tf +<415050> Tj +/F1.1 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 313.638 85.9197 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +134.1597 313.638 315.0399 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +449.1996 313.638 114.5604 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 282.609 85.9197 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +134.1597 282.609 315.0399 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +449.1996 282.609 114.5604 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 251.58 85.9197 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +134.1597 251.58 315.0399 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +449.1996 251.58 114.5604 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 220.551 85.9197 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +134.1597 220.551 315.0399 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +449.1996 220.551 114.5604 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 189.522 85.9197 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +134.1597 189.522 315.0399 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +449.1996 189.522 114.5604 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 158.493 85.9197 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +134.1597 158.493 315.0399 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +449.1996 158.493 114.5604 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 127.464 85.9197 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +134.1597 127.464 315.0399 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +449.1996 127.464 114.5604 31.029 re +f +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 333.138 m +134.1597 333.138 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 313.638 m +134.1597 313.638 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 333.388 m +48.24 313.013 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 333.388 m +134.1597 313.013 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 319.768 Td +/F2.1 10.5 Tf +<3d3e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 333.138 m +449.1996 333.138 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +134.1597 313.638 m +449.1996 313.638 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 333.388 m +134.1597 313.013 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 333.388 m +449.1996 313.013 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 319.768 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 333.138 m +563.76 333.138 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +449.1996 313.638 m +563.76 313.638 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 333.388 m +449.1996 313.013 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 333.388 m +563.76 313.013 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 319.768 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 313.638 m +134.1597 313.638 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 282.609 m +134.1597 282.609 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 314.263 m +48.24 282.359 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 314.263 m +134.1597 282.359 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 299.7535 Td +/F2.0 10.5 Tf +<6170704e616d65> Tj +ET + + +BT +51.24 289.2535 Td +ET + + +BT +51.24 289.2535 Td +/F3.1 10.5 Tf +<2d2e> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +134.1597 313.638 m +449.1996 313.638 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 282.609 m +449.1996 282.609 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 314.263 m +134.1597 282.359 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 314.263 m +449.1996 282.359 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 300.0108 Td +/F1.0 10.5 Tf +<415050> Tj +/F1.1 10.5 Tf +<8f90> Tj +ET + + +BT +137.1597 288.9963 Td +ET + + +BT +137.1597 288.9963 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 288.9963 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 288.9963 Td +/F4.0 10.5 Tf +<22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +172.0827 288.9963 Td +/F1.1 10.5 Tf +<94d182d2> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +214.0827 288.9963 Td +/F4.0 10.5 Tf +<22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +449.1996 313.638 m +563.76 313.638 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 282.609 m +563.76 282.609 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 314.263 m +449.1996 282.359 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 314.263 m +563.76 282.359 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 294.5035 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 282.609 m +134.1597 282.609 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 251.58 m +134.1597 251.58 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 282.859 m +48.24 251.33 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 282.859 m +134.1597 251.33 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 268.7245 Td +/F2.0 10.5 Tf +[<646f> 8.0 <776e6c6f> 14.0 <616455726c>] TJ +ET + + +BT +51.24 258.2245 Td +ET + + +BT +51.24 258.2245 Td +/F3.1 10.5 Tf +<2d2e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 282.609 m +449.1996 282.609 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 251.58 m +449.1996 251.58 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 282.859 m +134.1597 251.33 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 282.859 m +449.1996 251.33 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 268.9818 Td +/F1.1 10.5 Tf +<3dcdceb7f6f7f8> Tj +ET + + +BT +137.1597 257.9673 Td +ET + + +BT +137.1597 257.9673 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 257.9673 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 257.9673 Td +/F4.0 10.5 Tf +<22687474703a2f2f656e7a6869636f2e6e65742f66696c65732f> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +329.5827 257.9673 Td +/F1.1 10.5 Tf +<94d182d2> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +371.5827 257.9673 Td +/F4.0 10.5 Tf +<5f312e332e302e61706b22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 282.609 m +563.76 282.609 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 251.58 m +563.76 251.58 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 282.859 m +449.1996 251.33 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 282.859 m +563.76 251.33 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 263.4745 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 251.58 m +134.1597 251.58 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 220.551 m +134.1597 220.551 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 251.83 m +48.24 220.301 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 251.83 m +134.1597 220.301 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 237.6955 Td +/F2.0 10.5 Tf +[<66696e644e65> 4.0 <77>] TJ +ET + + +BT +51.24 227.1955 Td +ET + + +BT +51.24 227.1955 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 251.58 m +449.1996 251.58 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 220.551 m +449.1996 220.551 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 251.83 m +134.1597 220.301 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 251.83 m +449.1996 220.301 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 237.9528 Td +/F1.1 10.5 Tf +<649ff96f3dcdce> Tj +/F1.0 10.5 Tf +<28747275653a> Tj +/F1.1 10.5 Tf + Tj +/F1.0 10.5 Tf +[<66> 22.0 <616c73653a>] TJ +/F1.1 10.5 Tf + Tj +/F1.0 10.5 Tf +<29> Tj +ET + + +BT +137.1597 226.9383 Td +ET + + +BT +137.1597 226.9383 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 226.9383 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 226.9383 Td +/F4.0 10.5 Tf +<74727565> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 251.58 m +563.76 251.58 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 220.551 m +563.76 220.551 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 251.83 m +449.1996 220.301 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 251.83 m +563.76 220.301 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 232.4455 Td +/F1.0 10.5 Tf +[<626f6f6c65> 16.0 <616e>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 220.551 m +134.1597 220.551 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 189.522 m +134.1597 189.522 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 220.801 m +48.24 189.272 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 220.801 m +134.1597 189.272 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 206.6665 Td +/F2.0 10.5 Tf +<7075626c69736874696d65> Tj +ET + + +BT +51.24 196.1665 Td +ET + + +BT +51.24 196.1665 Td +/F3.1 10.5 Tf +<2d2e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 220.551 m +449.1996 220.551 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 189.522 m +449.1996 189.522 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 220.801 m +134.1597 189.272 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 220.801 m +449.1996 189.272 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 206.9238 Td +/F1.1 10.5 Tf +<3dcdcef9fba6fc> Tj +ET + + +BT +137.1597 195.9093 Td +ET + + +BT +137.1597 195.9093 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 195.9093 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 195.9093 Td +/F4.0 10.5 Tf +<22323031372d31322d32342031323a33323a313922> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 220.551 m +563.76 220.551 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 189.522 m +563.76 189.522 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 220.801 m +449.1996 189.272 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 220.801 m +563.76 189.272 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 201.4165 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e6720286461> 15.0 <74> 15.0 <65> -11.0 <2d> 29.0 <74696d6529>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 189.522 m +134.1597 189.522 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 158.493 m +134.1597 158.493 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 189.772 m +48.24 158.243 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 189.772 m +134.1597 158.243 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 175.6375 Td +/F2.0 10.5 Tf +[<746970> 5.0 <73>] TJ +ET + + +BT +51.24 165.1375 Td +ET + + +BT +51.24 165.1375 Td +/F3.1 10.5 Tf +<2d2e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 189.522 m +449.1996 189.522 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 158.493 m +449.1996 158.493 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 189.772 m +134.1597 158.243 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 189.772 m +449.1996 158.243 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 175.8948 Td +/F1.1 10.5 Tf +<3dcdce9873> Tj +ET + + +BT +137.1597 164.8803 Td +ET + + +BT +137.1597 164.8803 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 164.8803 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 164.8803 Td +/F4.0 10.5 Tf +<22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +172.0827 164.8803 Td +/F1.1 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +256.0827 164.8803 Td +/F4.0 10.5 Tf +<22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 189.522 m +563.76 189.522 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 158.493 m +563.76 158.493 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 189.772 m +449.1996 158.243 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 189.772 m +563.76 158.243 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 170.3875 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 158.493 m +134.1597 158.493 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 127.464 m +134.1597 127.464 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 158.743 m +48.24 127.214 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 158.743 m +134.1597 127.214 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 144.6085 Td +/F2.0 10.5 Tf +[<76> 8.0 <6572> 8.0 <73696f6e>] TJ +ET + + +BT +51.24 134.1085 Td +ET + + +BT +51.24 134.1085 Td +/F3.1 10.5 Tf +<2d2e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 158.493 m +449.1996 158.493 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 127.464 m +449.1996 127.464 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 158.743 m +134.1597 127.214 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 158.743 m +449.1996 127.214 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 144.8658 Td +/F1.1 10.5 Tf +<3dcdcecc> Tj +ET + + +BT +137.1597 133.8513 Td +ET + + +BT +137.1597 133.8513 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 133.8513 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 133.8513 Td +/F4.0 10.5 Tf +<2276312e332e3822> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 158.493 m +563.76 158.493 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 127.464 m +563.76 127.464 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 158.743 m +449.1996 127.214 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 158.743 m +563.76 127.214 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 139.3585 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 94.824 Td +/F2.0 18 Tf +[<332e332e204261736552> 12.0 <6573706f6e7365>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 67.374 Td +/F1.0 10.5 Tf +<415049> Tj +/F1.1 10.5 Tf +<252640babbfdfe> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp2 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +49.24 11.04 Td +/F1.0 9 Tf +<3136> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +196 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 612.0 792.0] +/CropBox [0 0 612.0 792.0] +/BleedBox [0 0 612.0 792.0] +/TrimBox [0 0 612.0 792.0] +/ArtBox [0 0 612.0 792.0] +/Contents 195 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F2.1 17 0 R +/F2.0 16 0 R +/F4.0 23 0 R +/F1.1 8 0 R +/F1.0 9 0 R +/F3.1 19 0 R +>> +/XObject << /Stamp2 218 0 R +>> +>> +>> +endobj +197 0 obj +[196 0 R /XYZ 0 792.0 null] +endobj +198 0 obj +[196 0 R /XYZ 0 626.325 null] +endobj +199 0 obj +[196 0 R /XYZ 0 584.925 null] +endobj +200 0 obj +[196 0 R /XYZ 0 396.738 null] +endobj +201 0 obj +[196 0 R /XYZ 0 115.464 null] +endobj +202 0 obj +<< /Length 37895 +>> +stream +q +/DeviceRGB cs +1.0 1.0 1.0 scn +48.24 736.5 85.9197 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +134.1597 736.5 315.0399 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +449.1996 736.5 114.5604 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 705.471 85.9197 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +134.1597 705.471 315.0399 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +449.1996 705.471 114.5604 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 674.442 85.9197 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +134.1597 674.442 315.0399 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +449.1996 674.442 114.5604 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 643.413 85.9197 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +134.1597 643.413 315.0399 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +449.1996 643.413 114.5604 31.029 re +f +0.0 0.0 0.0 scn +0.5 w +/DeviceRGB CS +0.8667 0.8667 0.8667 SCN +48.24 756.0 m +134.1597 756.0 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 736.5 m +134.1597 736.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 756.25 m +48.24 735.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 756.25 m +134.1597 735.875 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 742.63 Td +/F2.1 10.5 Tf +<3d3e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 756.0 m +449.1996 756.0 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +134.1597 736.5 m +449.1996 736.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 756.25 m +134.1597 735.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 756.25 m +449.1996 735.875 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 742.63 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 756.0 m +563.76 756.0 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +449.1996 736.5 m +563.76 736.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 756.25 m +449.1996 735.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 756.25 m +563.76 735.875 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 742.63 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 736.5 m +134.1597 736.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 705.471 m +134.1597 705.471 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 737.125 m +48.24 705.221 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 737.125 m +134.1597 705.221 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 722.6155 Td +/F2.0 10.5 Tf +[<6461> 19.0 <74> 23.0 <61>] TJ +ET + + +BT +51.24 712.1155 Td +ET + + +BT +51.24 712.1155 Td +/F3.1 10.5 Tf +<2d2e> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +134.1597 736.5 m +449.1996 736.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 705.471 m +449.1996 705.471 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 737.125 m +134.1597 705.221 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 737.125 m +449.1996 705.221 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 722.8728 Td +/F1.1 10.5 Tf + Tj +ET + + +BT +137.1597 711.8583 Td +ET + + +BT +137.1597 711.8583 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 711.8583 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 711.8583 Td +/F4.0 10.5 Tf +<226f626a65637422> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +449.1996 736.5 m +563.76 736.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 705.471 m +563.76 705.471 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 737.125 m +449.1996 705.221 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 737.125 m +563.76 705.221 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 717.3655 Td +/F1.0 10.5 Tf +[<6f626a6563> 11.0 <74>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 705.471 m +134.1597 705.471 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 674.442 m +134.1597 674.442 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 705.721 m +48.24 674.192 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 705.721 m +134.1597 674.192 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 691.5865 Td +/F2.0 10.5 Tf +<6d7367> Tj +ET + + +BT +51.24 681.0865 Td +ET + + +BT +51.24 681.0865 Td +/F3.1 10.5 Tf +<2d2e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 705.471 m +449.1996 705.471 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 674.442 m +449.1996 674.442 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 705.721 m +134.1597 674.192 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 705.721 m +449.1996 674.192 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 691.8438 Td +/F1.1 10.5 Tf + Tj +/F1.2 10.5 Tf +<21> Tj +/F1.1 10.5 Tf +<9873> Tj +ET + + +BT +137.1597 680.8293 Td +ET + + +BT +137.1597 680.8293 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 680.8293 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 680.8293 Td +/F4.0 10.5 Tf +<22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +172.0827 680.8293 Td +/F1.1 10.5 Tf +<474a> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +193.0827 680.8293 Td +/F4.0 10.5 Tf +<22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 705.471 m +563.76 705.471 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 674.442 m +563.76 674.442 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 705.721 m +449.1996 674.192 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 705.721 m +563.76 674.192 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 686.3365 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 674.442 m +134.1597 674.442 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 643.413 m +134.1597 643.413 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 674.692 m +48.24 643.163 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 674.692 m +134.1597 643.163 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 660.5575 Td +/F2.0 10.5 Tf +[<737563> 30.0 <63> 30.0 <657373>] TJ +ET + + +BT +51.24 650.0575 Td +ET + + +BT +51.24 650.0575 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 674.442 m +449.1996 674.442 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 643.413 m +449.1996 643.413 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 674.692 m +134.1597 643.163 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 674.692 m +449.1996 643.163 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 660.8148 Td +/F1.1 10.5 Tf +<649f474a> Tj +ET + + +BT +137.1597 649.8003 Td +ET + + +BT +137.1597 649.8003 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 649.8003 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 649.8003 Td +/F4.0 10.5 Tf +<74727565> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 674.442 m +563.76 674.442 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 643.413 m +563.76 643.413 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 674.692 m +449.1996 643.163 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 674.692 m +563.76 643.163 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 655.3075 Td +/F1.0 10.5 Tf +[<626f6f6c65> 16.0 <616e>] TJ +ET + +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 610.773 Td +/F2.0 18 Tf +[<332e342e204261736552> 12.0 <6573706f6e73654f66> 8.0 <73> 23.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 583.323 Td +/F1.0 10.5 Tf +<415049> Tj +/F1.1 10.5 Tf +<252640babbfdfe> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 548.313 85.9197 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +134.1597 548.313 315.0399 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +449.1996 548.313 114.5604 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 517.284 85.9197 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +134.1597 517.284 315.0399 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +449.1996 517.284 114.5604 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 486.255 85.9197 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +134.1597 486.255 315.0399 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +449.1996 486.255 114.5604 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 455.226 85.9197 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +134.1597 455.226 315.0399 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +449.1996 455.226 114.5604 31.029 re +f +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 567.813 m +134.1597 567.813 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 548.313 m +134.1597 548.313 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 568.063 m +48.24 547.688 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 568.063 m +134.1597 547.688 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 554.443 Td +/F2.1 10.5 Tf +<3d3e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 567.813 m +449.1996 567.813 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +134.1597 548.313 m +449.1996 548.313 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 568.063 m +134.1597 547.688 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 568.063 m +449.1996 547.688 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 554.443 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 567.813 m +563.76 567.813 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +449.1996 548.313 m +563.76 548.313 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 568.063 m +449.1996 547.688 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 568.063 m +563.76 547.688 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 554.443 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 548.313 m +134.1597 548.313 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 517.284 m +134.1597 517.284 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 548.938 m +48.24 517.034 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 548.938 m +134.1597 517.034 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 534.4285 Td +/F2.0 10.5 Tf +[<6461> 19.0 <74> 23.0 <61>] TJ +ET + + +BT +51.24 523.9285 Td +ET + + +BT +51.24 523.9285 Td +/F3.1 10.5 Tf +<2d2e> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +134.1597 548.313 m +449.1996 548.313 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 517.284 m +449.1996 517.284 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 548.938 m +134.1597 517.034 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 548.938 m +449.1996 517.034 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 534.6858 Td +/F1.1 10.5 Tf + Tj +ET + + +BT +137.1597 523.6713 Td +ET + + +BT +137.1597 523.6713 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 523.6713 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 523.6713 Td +/F4.0 10.5 Tf +<22737472696e6722> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +449.1996 548.313 m +563.76 548.313 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 517.284 m +563.76 517.284 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 548.938 m +449.1996 517.034 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 548.938 m +563.76 517.034 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 529.1785 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 517.284 m +134.1597 517.284 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 486.255 m +134.1597 486.255 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 517.534 m +48.24 486.005 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 517.534 m +134.1597 486.005 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 503.3995 Td +/F2.0 10.5 Tf +<6d7367> Tj +ET + + +BT +51.24 492.8995 Td +ET + + +BT +51.24 492.8995 Td +/F3.1 10.5 Tf +<2d2e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 517.284 m +449.1996 517.284 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 486.255 m +449.1996 486.255 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 517.534 m +134.1597 486.005 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 517.534 m +449.1996 486.005 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 503.6568 Td +/F1.1 10.5 Tf + Tj +/F1.2 10.5 Tf +<21> Tj +/F1.1 10.5 Tf +<9873> Tj +ET + + +BT +137.1597 492.6423 Td +ET + + +BT +137.1597 492.6423 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 492.6423 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 492.6423 Td +/F4.0 10.5 Tf +<22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +172.0827 492.6423 Td +/F1.1 10.5 Tf +<474a> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +193.0827 492.6423 Td +/F4.0 10.5 Tf +<22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 517.284 m +563.76 517.284 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 486.255 m +563.76 486.255 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 517.534 m +449.1996 486.005 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 517.534 m +563.76 486.005 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 498.1495 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 486.255 m +134.1597 486.255 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 455.226 m +134.1597 455.226 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 486.505 m +48.24 454.976 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 486.505 m +134.1597 454.976 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 472.3705 Td +/F2.0 10.5 Tf +[<737563> 30.0 <63> 30.0 <657373>] TJ +ET + + +BT +51.24 461.8705 Td +ET + + +BT +51.24 461.8705 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 486.255 m +449.1996 486.255 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 455.226 m +449.1996 455.226 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 486.505 m +134.1597 454.976 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 486.505 m +449.1996 454.976 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 472.6278 Td +/F1.1 10.5 Tf +<649f474a> Tj +ET + + +BT +137.1597 461.6133 Td +ET + + +BT +137.1597 461.6133 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 461.6133 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 461.6133 Td +/F4.0 10.5 Tf +<74727565> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 486.255 m +563.76 486.255 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 455.226 m +563.76 455.226 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 486.505 m +449.1996 454.976 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 486.505 m +563.76 454.976 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 467.1205 Td +/F1.0 10.5 Tf +[<626f6f6c65> 16.0 <616e>] TJ +ET + +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 422.586 Td +/F2.0 18 Tf +<332e352e20504f53> Tj +/F2.1 18 Tf +<4833393a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 395.136 Td +/F1.0 10.5 Tf +<504f53> Tj +/F1.1 10.5 Tf +<88412d2ea6a7a8a98e88404344> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 360.126 85.9197 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +134.1597 360.126 315.0399 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +449.1996 360.126 114.5604 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 329.097 85.9197 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +134.1597 329.097 315.0399 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +449.1996 329.097 114.5604 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 287.568 85.9197 41.529 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +134.1597 287.568 315.0399 41.529 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +449.1996 287.568 114.5604 41.529 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 256.539 85.9197 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +134.1597 256.539 315.0399 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +449.1996 256.539 114.5604 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 225.51 85.9197 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +134.1597 225.51 315.0399 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +449.1996 225.51 114.5604 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 194.481 85.9197 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +134.1597 194.481 315.0399 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +449.1996 194.481 114.5604 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 163.452 85.9197 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +134.1597 163.452 315.0399 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +449.1996 163.452 114.5604 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 132.423 85.9197 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +134.1597 132.423 315.0399 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +449.1996 132.423 114.5604 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 101.394 85.9197 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +134.1597 101.394 315.0399 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +449.1996 101.394 114.5604 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 70.365 85.9197 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +134.1597 70.365 315.0399 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +449.1996 70.365 114.5604 31.029 re +f +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 379.626 m +134.1597 379.626 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 360.126 m +134.1597 360.126 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 379.876 m +48.24 359.501 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 379.876 m +134.1597 359.501 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 366.256 Td +/F2.1 10.5 Tf +<3d3e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 379.626 m +449.1996 379.626 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +134.1597 360.126 m +449.1996 360.126 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 379.876 m +134.1597 359.501 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 379.876 m +449.1996 359.501 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 366.256 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 379.626 m +563.76 379.626 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +449.1996 360.126 m +563.76 360.126 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 379.876 m +449.1996 359.501 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 379.876 m +563.76 359.501 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 366.256 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 360.126 m +134.1597 360.126 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 329.097 m +134.1597 329.097 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 360.751 m +48.24 328.847 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 360.751 m +134.1597 328.847 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 346.2415 Td +/F2.0 10.5 Tf +[<616e6472> 12.0 <6f696456> 20.0 <6572> 8.0 <73696f6e>] TJ +ET + + +BT +51.24 335.7415 Td +ET + + +BT +51.24 335.7415 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +134.1597 360.126 m +449.1996 360.126 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 329.097 m +449.1996 329.097 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 360.751 m +134.1597 328.847 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 360.751 m +449.1996 328.847 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 346.4988 Td +/F1.0 10.5 Tf +[<416e6472> 11.0 <6f6964>] TJ +/F1.1 10.5 Tf + Tj +/F1.2 10.5 Tf +<222324> Tj +/F1.0 10.5 Tf +<312d3332> Tj +/F1.1 10.5 Tf + Tj +/F1.2 10.5 Tf +<25> Tj +ET + + +BT +137.1597 335.4843 Td +ET + + +BT +137.1597 335.4843 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 335.4843 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 335.4843 Td +/F4.0 10.5 Tf +<22362e322e3022> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +449.1996 360.126 m +563.76 360.126 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 329.097 m +563.76 329.097 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 360.751 m +449.1996 328.847 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 360.751 m +563.76 328.847 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 340.9915 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 329.097 m +134.1597 329.097 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 287.568 m +134.1597 287.568 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 329.347 m +48.24 287.318 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 329.347 m +134.1597 287.318 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 309.9625 Td +/F2.0 10.5 Tf +[<6170706c6963> 12.0 <61> 19.0 <74696f6e4964>] TJ +ET + + +BT +51.24 299.4625 Td +ET + + +BT +51.24 299.4625 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 329.097 m +449.1996 329.097 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 287.568 m +449.1996 287.568 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 329.347 m +134.1597 287.318 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 329.347 m +449.1996 287.318 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 315.4698 Td +/F1.0 10.5 Tf +<415050> Tj +/F1.1 10.5 Tf +<362b> Tj +/F1.0 10.5 Tf +<4944> Tj +/F1.2 10.5 Tf +<222324> Tj +/F1.0 10.5 Tf +<312d3634> Tj +/F1.1 10.5 Tf + Tj +/F1.2 10.5 Tf +<25> Tj +/F1.1 10.5 Tf +<54a2ac> Tj +/F1.0 10.5 Tf +<415050> Tj +/F1.1 10.5 Tf + Tj +/F1.0 10.5 Tf +[<4170706c6963> 11.0 <61> 15.0 <74696f6e>] TJ +ET + + +BT +137.1597 304.9698 Td +/F1.0 10.5 Tf +<4964> Tj +/F1.1 10.5 Tf +<54a0b1abac362b> Tj +/F1.0 10.5 Tf +<4944> Tj +/F1.1 10.5 Tf +<8c8d45> Tj +/F1.2 10.5 Tf +<26> Tj +/F1.1 10.5 Tf +<6c6d> Tj +/F1.2 10.5 Tf +<27> Tj +/F1.1 10.5 Tf +<2122> Tj +/F1.2 10.5 Tf +<28> Tj +/F1.1 10.5 Tf +<4e> Tj +ET + + +BT +137.1597 293.9553 Td +ET + + +BT +137.1597 293.9553 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 293.9553 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 293.9553 Td +/F4.0 10.5 Tf +<22636f6d2e656e7a6869636f2e787a70617922> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 329.097 m +563.76 329.097 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 287.568 m +563.76 287.568 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 329.347 m +449.1996 287.318 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 329.347 m +563.76 287.318 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 304.7125 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 287.568 m +134.1597 287.568 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 256.539 m +134.1597 256.539 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 287.818 m +48.24 256.289 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 287.818 m +134.1597 256.289 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 273.6835 Td +/F2.0 10.5 Tf +<696d6569> Tj +ET + + +BT +51.24 263.1835 Td +ET + + +BT +51.24 263.1835 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 287.568 m +449.1996 287.568 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 256.539 m +449.1996 256.539 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 287.818 m +134.1597 256.289 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 287.818 m +449.1996 256.289 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 273.9408 Td +/F1.0 10.5 Tf +<494d4549> Tj +/F1.1 10.5 Tf +<9a> Tj +/F1.2 10.5 Tf +<222324> Tj +/F1.0 10.5 Tf +<312d3332> Tj +/F1.1 10.5 Tf + Tj +/F1.2 10.5 Tf +<25> Tj +ET + + +BT +137.1597 262.9263 Td +ET + + +BT +137.1597 262.9263 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 262.9263 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 262.9263 Td +/F4.0 10.5 Tf +<22323332344445454641585831323222> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 287.568 m +563.76 287.568 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 256.539 m +563.76 256.539 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 287.818 m +449.1996 256.289 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 287.818 m +563.76 256.289 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 268.4335 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 256.539 m +134.1597 256.539 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 225.51 m +134.1597 225.51 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 256.789 m +48.24 225.26 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 256.789 m +134.1597 225.26 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 242.6545 Td +/F2.0 10.5 Tf +[<6c6f63> 12.0 <61> 19.0 <74696f6e>] TJ +ET + + +BT +51.24 232.1545 Td +ET + + +BT +51.24 232.1545 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 256.539 m +449.1996 256.539 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 225.51 m +449.1996 225.51 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 256.789 m +134.1597 225.26 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 256.789 m +449.1996 225.26 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 242.9118 Td +/F1.2 10.5 Tf +<292a> Tj +/F1.1 10.5 Tf +<4142> Tj +/F1.2 10.5 Tf +<222324> Tj +/F1.0 10.5 Tf +<312d3634> Tj +/F1.1 10.5 Tf + Tj +/F1.2 10.5 Tf +<25> Tj +ET + + +BT +137.1597 231.8973 Td +ET + + +BT +137.1597 231.8973 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 231.8973 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 231.8973 Td +/F4.0 10.5 Tf +<22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +172.0827 231.8973 Td +/F1.1 10.5 Tf +<7273747576777831797a7b7c7d7e7f6880> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +350.5827 231.8973 Td +/F4.0 10.5 Tf +<22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 256.539 m +563.76 256.539 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 225.51 m +563.76 225.51 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 256.789 m +449.1996 225.26 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 256.789 m +563.76 225.26 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 237.4045 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 225.51 m +134.1597 225.51 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 194.481 m +134.1597 194.481 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 225.76 m +48.24 194.231 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 225.76 m +134.1597 194.231 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 211.6255 Td +/F2.0 10.5 Tf +[<6f> 8.0 <776e6572>] TJ +ET + + +BT +51.24 201.1255 Td +ET + + +BT +51.24 201.1255 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 225.51 m +449.1996 225.51 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 194.481 m +449.1996 194.481 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 225.76 m +134.1597 194.231 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 225.76 m +449.1996 194.231 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 211.8828 Td +/F1.1 10.5 Tf +<3b> Tj +/F1.2 10.5 Tf +<2b2c> Tj +/F1.1 10.5 Tf +<5fe6> Tj +/F1.2 10.5 Tf +<222324> Tj +/F1.0 10.5 Tf +<312d3634> Tj +/F1.1 10.5 Tf + Tj +/F1.2 10.5 Tf +<25> Tj +ET + + +BT +137.1597 200.8683 Td +ET + + +BT +137.1597 200.8683 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 200.8683 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 200.8683 Td +/F4.0 10.5 Tf +<22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +172.0827 200.8683 Td +/F1.1 10.5 Tf +<9192939472739594> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +256.0827 200.8683 Td +/F4.0 10.5 Tf +<22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 225.51 m +563.76 225.51 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 194.481 m +563.76 194.481 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 225.76 m +449.1996 194.231 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 225.76 m +563.76 194.231 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 206.3755 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 194.481 m +134.1597 194.481 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 163.452 m +134.1597 163.452 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 194.731 m +48.24 163.202 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 194.731 m +134.1597 163.202 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 180.5965 Td +/F2.0 10.5 Tf +<736572696573> Tj +ET + + +BT +51.24 170.0965 Td +ET + + +BT +51.24 170.0965 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 194.481 m +449.1996 194.481 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 163.452 m +449.1996 163.452 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 194.731 m +134.1597 163.202 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 194.731 m +449.1996 163.202 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 180.8538 Td +/F1.1 10.5 Tf +<3b> Tj +/F1.2 10.5 Tf +<2b2d> Tj +/F1.1 10.5 Tf + Tj +/F1.2 10.5 Tf +<222324> Tj +/F1.0 10.5 Tf +<312d3332> Tj +/F1.1 10.5 Tf + Tj +/F1.2 10.5 Tf +<25> Tj +ET + + +BT +137.1597 169.8393 Td +ET + + +BT +137.1597 169.8393 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 169.8393 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 169.8393 Td +/F4.0 10.5 Tf +<2241504f5320413822> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 194.481 m +563.76 194.481 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 163.452 m +563.76 163.452 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 194.731 m +449.1996 163.202 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 194.731 m +563.76 163.202 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 175.3465 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 163.452 m +134.1597 163.452 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 132.423 m +134.1597 132.423 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 163.702 m +48.24 132.173 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 163.702 m +134.1597 132.173 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 149.5675 Td +/F2.0 10.5 Tf +<736e> Tj +ET + + +BT +51.24 139.0675 Td +ET + + +BT +51.24 139.0675 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 163.452 m +449.1996 163.452 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 132.423 m +449.1996 132.423 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 163.702 m +134.1597 132.173 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 163.702 m +449.1996 132.173 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 149.8248 Td +/F1.2 10.5 Tf +<2e2f> Tj +/F1.1 10.5 Tf + Tj +/F1.0 10.5 Tf +<534e> Tj +/F1.2 10.5 Tf +<222324> Tj +/F1.0 10.5 Tf +<312d3634> Tj +/F1.1 10.5 Tf + Tj +/F1.2 10.5 Tf +<25> Tj +ET + + +BT +137.1597 138.8103 Td +ET + + +BT +137.1597 138.8103 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 138.8103 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 138.8103 Td +/F4.0 10.5 Tf +<227373737373736e6e6e6e22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 163.452 m +563.76 163.452 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 132.423 m +563.76 132.423 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 163.702 m +449.1996 132.173 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 163.702 m +563.76 132.173 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 144.3175 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 132.423 m +134.1597 132.423 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 101.394 m +134.1597 101.394 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 132.673 m +48.24 101.144 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 132.673 m +134.1597 101.144 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 118.5385 Td +/F2.0 10.5 Tf +[<746970> 5.0 <73>] TJ +ET + + +BT +51.24 108.0385 Td +ET + + +BT +51.24 108.0385 Td +/F3.1 10.5 Tf +<2d2e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 132.423 m +449.1996 132.423 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 101.394 m +449.1996 101.394 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 132.673 m +134.1597 101.144 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 132.673 m +449.1996 101.144 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 118.7958 Td +/F1.1 10.5 Tf +<96979873> Tj +/F1.2 10.5 Tf +<222324> Tj +/F1.0 10.5 Tf +<302d323535> Tj +/F1.1 10.5 Tf + Tj +/F1.2 10.5 Tf +<25> Tj +ET + + +BT +137.1597 107.7813 Td +ET + + +BT +137.1597 107.7813 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 107.7813 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 107.7813 Td +/F4.0 10.5 Tf +<22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +172.0827 107.7813 Td +/F1.1 10.5 Tf +<96979873> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +214.0827 107.7813 Td +/F4.0 10.5 Tf +<22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 132.423 m +563.76 132.423 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 101.394 m +563.76 101.394 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 132.673 m +449.1996 101.144 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 132.673 m +563.76 101.144 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 113.2885 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 101.394 m +134.1597 101.394 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 70.365 m +134.1597 70.365 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 101.644 m +48.24 70.115 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 101.644 m +134.1597 70.115 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 87.5095 Td +/F2.0 10.5 Tf +[<76> 8.0 <6572> 8.0 <73696f6e>] TJ +ET + + +BT +51.24 77.0095 Td +ET + + +BT +51.24 77.0095 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 101.394 m +449.1996 101.394 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 70.365 m +449.1996 70.365 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 101.644 m +134.1597 70.115 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 101.644 m +449.1996 70.115 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 87.7668 Td +/F1.1 10.5 Tf + Tj +/F1.2 10.5 Tf +<222324> Tj +/F1.0 10.5 Tf +<312d3332> Tj +/F1.1 10.5 Tf + Tj +/F1.2 10.5 Tf +<25> Tj +ET + + +BT +137.1597 76.7523 Td +ET + + +BT +137.1597 76.7523 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 76.7523 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 76.7523 Td +/F4.0 10.5 Tf +<2242303138325f4332424f4d5f56312e312e345f32303137313231332f342e302e323822> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 101.394 m +563.76 101.394 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 70.365 m +563.76 70.365 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 101.644 m +449.1996 70.115 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 101.644 m +563.76 70.115 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 82.2595 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp1 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +552.77 11.04 Td +/F1.0 9 Tf +<3137> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +203 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 612.0 792.0] +/CropBox [0 0 612.0 792.0] +/BleedBox [0 0 612.0 792.0] +/TrimBox [0 0 612.0 792.0] +/ArtBox [0 0 612.0 792.0] +/Contents 202 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F2.1 17 0 R +/F2.0 16 0 R +/F3.1 19 0 R +/F1.1 8 0 R +/F1.0 9 0 R +/F4.0 23 0 R +/F1.2 204 0 R +>> +/XObject << /Stamp1 217 0 R +>> +>> +>> +endobj +204 0 obj +<< /Type /Font +/BaseFont /1de688+KaiGenGothicCN +/Subtype /TrueType +/FontDescriptor 276 0 R +/FirstChar 32 +/LastChar 255 +/Widths 278 0 R +/ToUnicode 277 0 R +>> +endobj +205 0 obj +[203 0 R /XYZ 0 631.413 null] +endobj +206 0 obj +[203 0 R /XYZ 0 443.226 null] +endobj +207 0 obj +<< /Length 30794 +>> +stream +q +/DeviceRGB cs +0.2 0.2 0.2 scn +/DeviceRGB CS +0.2 0.2 0.2 SCN + +BT +48.24 738.36 Td +/F2.0 18 Tf +<332e362e20504f53> Tj +/F2.1 18 Tf +<31323334393a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 710.91 Td +/F1.0 10.5 Tf +<504f53504f53> Tj +/F1.1 10.5 Tf +<3e3f41422d2ea6a7a8a98e88404344> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 675.9 85.9197 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +134.1597 675.9 315.0399 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +449.1996 675.9 114.5604 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 644.871 85.9197 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +134.1597 644.871 315.0399 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +449.1996 644.871 114.5604 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 613.842 85.9197 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +134.1597 613.842 315.0399 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +449.1996 613.842 114.5604 31.029 re +f +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 695.4 m +134.1597 695.4 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 675.9 m +134.1597 675.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 695.65 m +48.24 675.275 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 695.65 m +134.1597 675.275 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 682.03 Td +/F2.1 10.5 Tf +<3d3e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 695.4 m +449.1996 695.4 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +134.1597 675.9 m +449.1996 675.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 695.65 m +134.1597 675.275 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 695.65 m +449.1996 675.275 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 682.03 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 695.4 m +563.76 695.4 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +449.1996 675.9 m +563.76 675.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 695.65 m +449.1996 675.275 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 695.65 m +563.76 675.275 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 682.03 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 675.9 m +134.1597 675.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 644.871 m +134.1597 644.871 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 676.525 m +48.24 644.621 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 676.525 m +134.1597 644.621 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 662.0155 Td +/F2.0 10.5 Tf +<696d6569> Tj +ET + + +BT +51.24 651.5155 Td +ET + + +BT +51.24 651.5155 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +134.1597 675.9 m +449.1996 675.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 644.871 m +449.1996 644.871 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 676.525 m +134.1597 644.621 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 676.525 m +449.1996 644.621 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 662.2728 Td +/F1.0 10.5 Tf +<494d4549> Tj +/F1.1 10.5 Tf +<9a> Tj +/F1.2 10.5 Tf +<222324> Tj +/F1.0 10.5 Tf +<312d3332> Tj +/F1.1 10.5 Tf + Tj +/F1.2 10.5 Tf +<25> Tj +ET + + +BT +137.1597 651.2583 Td +ET + + +BT +137.1597 651.2583 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 651.2583 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 651.2583 Td +/F4.0 10.5 Tf +<22323332344445454641585831323222> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +449.1996 675.9 m +563.76 675.9 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 644.871 m +563.76 644.871 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 676.525 m +449.1996 644.621 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 676.525 m +563.76 644.621 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 656.7655 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 644.871 m +134.1597 644.871 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 613.842 m +134.1597 613.842 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 645.121 m +48.24 613.592 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 645.121 m +134.1597 613.592 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 630.9865 Td +/F2.0 10.5 Tf +[<6c6f63> 12.0 <61> 19.0 <74696f6e>] TJ +ET + + +BT +51.24 620.4865 Td +ET + + +BT +51.24 620.4865 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 644.871 m +449.1996 644.871 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 613.842 m +449.1996 613.842 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 645.121 m +134.1597 613.592 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 645.121 m +449.1996 613.592 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 631.2438 Td +/F1.2 10.5 Tf +<292a> Tj +/F1.1 10.5 Tf +<4142> Tj +/F1.2 10.5 Tf +<222324> Tj +/F1.0 10.5 Tf +<312d3634> Tj +/F1.1 10.5 Tf + Tj +/F1.2 10.5 Tf +<25> Tj +ET + + +BT +137.1597 620.2293 Td +ET + + +BT +137.1597 620.2293 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 620.2293 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 620.2293 Td +/F4.0 10.5 Tf +<22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +172.0827 620.2293 Td +/F1.1 10.5 Tf +<7273747576777831797a7b7c7d7e7f6880> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +350.5827 620.2293 Td +/F4.0 10.5 Tf +<22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 644.871 m +563.76 644.871 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 613.842 m +563.76 613.842 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 645.121 m +449.1996 613.592 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 645.121 m +563.76 613.592 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 625.7365 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 581.202 Td +/F2.0 18 Tf +<332e372e20> Tj +/F2.1 18 Tf +<483331325e5f2526> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 553.752 Td +/F1.1 10.5 Tf +<88413e3f40babbfdfe> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 518.742 85.9197 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +134.1597 518.742 315.0399 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +449.1996 518.742 114.5604 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 487.713 85.9197 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +134.1597 487.713 315.0399 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +449.1996 487.713 114.5604 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 456.684 85.9197 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +134.1597 456.684 315.0399 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +449.1996 456.684 114.5604 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 425.655 85.9197 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +134.1597 425.655 315.0399 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +449.1996 425.655 114.5604 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 394.626 85.9197 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +134.1597 394.626 315.0399 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +449.1996 394.626 114.5604 31.029 re +f +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 538.242 m +134.1597 538.242 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 518.742 m +134.1597 518.742 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 538.492 m +48.24 518.117 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 538.492 m +134.1597 518.117 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 524.872 Td +/F2.1 10.5 Tf +<3d3e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 538.242 m +449.1996 538.242 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +134.1597 518.742 m +449.1996 518.742 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 538.492 m +134.1597 518.117 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 538.492 m +449.1996 518.117 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 524.872 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 538.242 m +563.76 538.242 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +449.1996 518.742 m +563.76 518.742 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 538.492 m +449.1996 518.117 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 538.492 m +563.76 518.117 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 524.872 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 518.742 m +134.1597 518.742 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 487.713 m +134.1597 487.713 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 519.367 m +48.24 487.463 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 519.367 m +134.1597 487.463 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 504.8575 Td +/F2.0 10.5 Tf +[<63> 30.0 <6f6465>] TJ +ET + + +BT +51.24 494.3575 Td +ET + + +BT +51.24 494.3575 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +134.1597 518.742 m +449.1996 518.742 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 487.713 m +449.1996 487.713 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 519.367 m +134.1597 487.463 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 519.367 m +449.1996 487.463 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 505.1148 Td +/F1.1 10.5 Tf + Tj +/F1.0 10.5 Tf +<313a> Tj +/F1.1 10.5 Tf +<458841a03e3fa1414220> Tj +/F1.0 10.5 Tf +<323a> Tj +/F1.1 10.5 Tf +<45884163> Tj +/F1.2 10.5 Tf +<30> Tj +/F1.1 10.5 Tf +<5d3e3f414220> Tj +/F1.0 10.5 Tf +<333a> Tj +/F1.1 10.5 Tf +<5d8841> Tj +ET + + +BT +137.1597 494.1003 Td +ET + + +BT +137.1597 494.1003 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 494.1003 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 494.1003 Td +/F4.0 10.5 Tf +<31> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +449.1996 518.742 m +563.76 518.742 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 487.713 m +563.76 487.713 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 519.367 m +449.1996 487.463 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 519.367 m +563.76 487.463 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 499.6075 Td +/F1.0 10.5 Tf +[<696e74> 15.0 <65> 11.0 <67> 15.0 <65722028696e74333229>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 487.713 m +134.1597 487.713 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 456.684 m +134.1597 456.684 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 487.963 m +48.24 456.434 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 487.963 m +134.1597 456.434 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 473.8285 Td +/F2.0 10.5 Tf +[<6461> 19.0 <74> 23.0 <61>] TJ +ET + + +BT +51.24 463.3285 Td +ET + + +BT +51.24 463.3285 Td +/F3.1 10.5 Tf +<2d2e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 487.713 m +449.1996 487.713 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 456.684 m +449.1996 456.684 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 487.963 m +134.1597 456.434 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 487.963 m +449.1996 456.434 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 474.0858 Td +/F1.1 10.5 Tf + Tj +ET + + +BT +137.1597 463.0713 Td +ET + + +BT +137.1597 463.0713 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 463.0713 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 463.0713 Td +/F4.0 10.5 Tf +<226f626a65637422> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 487.713 m +563.76 487.713 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 456.684 m +563.76 456.684 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 487.963 m +449.1996 456.434 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 487.963 m +563.76 456.434 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 468.5785 Td +/F1.0 10.5 Tf +[<6f626a6563> 11.0 <74>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 456.684 m +134.1597 456.684 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 425.655 m +134.1597 425.655 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 456.934 m +48.24 425.405 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 456.934 m +134.1597 425.405 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 442.7995 Td +/F2.0 10.5 Tf +<6d7367> Tj +ET + + +BT +51.24 432.2995 Td +ET + + +BT +51.24 432.2995 Td +/F3.1 10.5 Tf +<2d2e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 456.684 m +449.1996 456.684 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 425.655 m +449.1996 425.655 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 456.934 m +134.1597 425.405 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 456.934 m +449.1996 425.405 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 443.0568 Td +/F1.1 10.5 Tf + Tj +/F1.2 10.5 Tf +<21> Tj +/F1.1 10.5 Tf +<9873> Tj +ET + + +BT +137.1597 432.0423 Td +ET + + +BT +137.1597 432.0423 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 432.0423 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 432.0423 Td +/F4.0 10.5 Tf +<22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +172.0827 432.0423 Td +/F1.1 10.5 Tf +<474a> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +193.0827 432.0423 Td +/F4.0 10.5 Tf +<22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 456.684 m +563.76 456.684 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 425.655 m +563.76 425.655 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 456.934 m +449.1996 425.405 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 456.934 m +563.76 425.405 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 437.5495 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 425.655 m +134.1597 425.655 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 394.626 m +134.1597 394.626 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 425.905 m +48.24 394.376 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 425.905 m +134.1597 394.376 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 411.7705 Td +/F2.0 10.5 Tf +[<737563> 30.0 <63> 30.0 <657373>] TJ +ET + + +BT +51.24 401.2705 Td +ET + + +BT +51.24 401.2705 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 425.655 m +449.1996 425.655 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 394.626 m +449.1996 394.626 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 425.905 m +134.1597 394.376 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 425.905 m +449.1996 394.376 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 412.0278 Td +/F1.1 10.5 Tf +<649f474a> Tj +ET + + +BT +137.1597 401.0133 Td +ET + + +BT +137.1597 401.0133 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 401.0133 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 401.0133 Td +/F4.0 10.5 Tf +<74727565> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 425.655 m +563.76 425.655 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 394.626 m +563.76 394.626 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 425.905 m +449.1996 394.376 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 425.905 m +563.76 394.376 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 406.5205 Td +/F1.0 10.5 Tf +[<626f6f6c65> 16.0 <616e>] TJ +ET + +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 361.986 Td +/F2.0 18 Tf +<332e382e20> Tj +/F2.1 18 Tf +<4b4c393a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 334.536 Td +/F1.1 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 299.526 85.9197 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +134.1597 299.526 315.0399 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +449.1996 299.526 114.5604 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 268.497 85.9197 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +134.1597 268.497 315.0399 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +449.1996 268.497 114.5604 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 237.468 85.9197 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +134.1597 237.468 315.0399 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +449.1996 237.468 114.5604 31.029 re +f +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 319.026 m +134.1597 319.026 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 299.526 m +134.1597 299.526 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 319.276 m +48.24 298.901 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 319.276 m +134.1597 298.901 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 305.656 Td +/F2.1 10.5 Tf +<3d3e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 319.026 m +449.1996 319.026 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +134.1597 299.526 m +449.1996 299.526 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 319.276 m +134.1597 298.901 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 319.276 m +449.1996 298.901 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 305.656 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 319.026 m +563.76 319.026 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +449.1996 299.526 m +563.76 299.526 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 319.276 m +449.1996 298.901 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 319.276 m +563.76 298.901 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 305.656 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 299.526 m +134.1597 299.526 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 268.497 m +134.1597 268.497 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 300.151 m +48.24 268.247 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 300.151 m +134.1597 268.247 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 285.6415 Td +/F2.0 10.5 Tf +<696d6569> Tj +ET + + +BT +51.24 275.1415 Td +ET + + +BT +51.24 275.1415 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +134.1597 299.526 m +449.1996 299.526 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 268.497 m +449.1996 268.497 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 300.151 m +134.1597 268.247 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 300.151 m +449.1996 268.247 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 285.8988 Td +/F1.0 10.5 Tf +<494d4549> Tj +/F1.1 10.5 Tf +<9a> Tj +/F1.2 10.5 Tf +<222324> Tj +/F1.0 10.5 Tf +<312d3332> Tj +/F1.1 10.5 Tf + Tj +/F1.2 10.5 Tf +<25> Tj +ET + + +BT +137.1597 274.8843 Td +ET + + +BT +137.1597 274.8843 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 274.8843 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 274.8843 Td +/F4.0 10.5 Tf +<22323332344445454641585831323222> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +449.1996 299.526 m +563.76 299.526 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 268.497 m +563.76 268.497 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 300.151 m +449.1996 268.247 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 300.151 m +563.76 268.247 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 280.3915 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 268.497 m +134.1597 268.497 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 237.468 m +134.1597 237.468 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 268.747 m +48.24 237.218 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 268.747 m +134.1597 237.218 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 254.6125 Td +/F2.0 10.5 Tf +[<6c6f63> 12.0 <61> 19.0 <74696f6e>] TJ +ET + + +BT +51.24 244.1125 Td +ET + + +BT +51.24 244.1125 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 268.497 m +449.1996 268.497 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 237.468 m +449.1996 237.468 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 268.747 m +134.1597 237.218 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 268.747 m +449.1996 237.218 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 254.8698 Td +/F1.1 10.5 Tf + Tj +/F1.2 10.5 Tf +<222324> Tj +/F1.0 10.5 Tf +<312d323535> Tj +/F1.1 10.5 Tf + Tj +/F1.2 10.5 Tf +<25> Tj +ET + + +BT +137.1597 243.8553 Td +ET + + +BT +137.1597 243.8553 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 243.8553 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 243.8553 Td +/F4.0 10.5 Tf +<22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +172.0827 243.8553 Td +/F1.1 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +298.0827 243.8553 Td +/F4.0 10.5 Tf +<333231> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +316.9827 243.8553 Td +/F1.1 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +327.4827 243.8553 Td +/F4.0 10.5 Tf +<22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 268.497 m +563.76 268.497 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 237.468 m +563.76 237.468 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 268.747 m +449.1996 237.218 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 268.747 m +563.76 237.218 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 249.3625 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 204.828 Td +/F2.0 18 Tf +<332e392e20> Tj +/F2.1 18 Tf +<525340543536393a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 177.378 Td +/F1.1 10.5 Tf +<292aebec25264344> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 142.368 85.9197 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +134.1597 142.368 315.0399 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +449.1996 142.368 114.5604 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 111.339 85.9197 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +134.1597 111.339 315.0399 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +449.1996 111.339 114.5604 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 80.31 85.9197 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +134.1597 80.31 315.0399 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +449.1996 80.31 114.5604 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 49.281 85.9197 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +134.1597 49.281 315.0399 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +449.1996 49.281 114.5604 31.029 re +f +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 161.868 m +134.1597 161.868 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 142.368 m +134.1597 142.368 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 162.118 m +48.24 141.743 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 162.118 m +134.1597 141.743 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 148.498 Td +/F2.1 10.5 Tf +<3d3e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 161.868 m +449.1996 161.868 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +134.1597 142.368 m +449.1996 142.368 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 162.118 m +134.1597 141.743 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 162.118 m +449.1996 141.743 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 148.498 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 161.868 m +563.76 161.868 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +449.1996 142.368 m +563.76 142.368 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 162.118 m +449.1996 141.743 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 162.118 m +563.76 141.743 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 148.498 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 142.368 m +134.1597 142.368 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 111.339 m +134.1597 111.339 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 142.993 m +48.24 111.089 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 142.993 m +134.1597 111.089 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 128.4835 Td +/F2.0 10.5 Tf +<6170706964> Tj +ET + + +BT +51.24 117.9835 Td +ET + + +BT +51.24 117.9835 Td +/F3.1 10.5 Tf +<2d2e> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +134.1597 142.368 m +449.1996 142.368 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 111.339 m +449.1996 111.339 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 142.993 m +134.1597 111.089 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 142.993 m +449.1996 111.089 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 128.7408 Td +/F1.0 10.5 Tf +[<4170706c6963> 11.0 <61> 15.0 <74696f6e204944>] TJ +ET + + +BT +137.1597 117.7263 Td +ET + + +BT +137.1597 117.7263 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 117.7263 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 117.7263 Td +/F4.0 10.5 Tf +<22636f6d2e656e7a6869636f2e787a70617922> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +449.1996 142.368 m +563.76 142.368 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 111.339 m +563.76 111.339 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 142.993 m +449.1996 111.089 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 142.993 m +563.76 111.089 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 123.2335 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 111.339 m +134.1597 111.339 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 80.31 m +134.1597 80.31 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 111.589 m +48.24 80.06 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 111.589 m +134.1597 80.06 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 97.4545 Td +/F2.0 10.5 Tf +<696d6569> Tj +ET + + +BT +51.24 86.9545 Td +ET + + +BT +51.24 86.9545 Td +/F3.1 10.5 Tf +<2d2e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 111.339 m +449.1996 111.339 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 80.31 m +449.1996 80.31 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 111.589 m +134.1597 80.06 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 111.589 m +449.1996 80.06 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 97.7118 Td +/F1.0 10.5 Tf +<494d4549> Tj +/F1.1 10.5 Tf +<9a> Tj +ET + + +BT +137.1597 86.6973 Td +ET + + +BT +137.1597 86.6973 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 86.6973 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 86.6973 Td +/F4.0 10.5 Tf +<2254555949554f49553233343233345955494922> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 111.339 m +563.76 111.339 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 80.31 m +563.76 80.31 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 111.589 m +449.1996 80.06 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 111.589 m +563.76 80.06 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 92.2045 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 80.31 m +134.1597 80.31 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 49.281 m +134.1597 49.281 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 80.56 m +48.24 49.031 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 80.56 m +134.1597 49.031 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 66.4255 Td +/F2.0 10.5 Tf +[<70> 14.0 <61737377> 8.0 <6f72> 12.0 <64>] TJ +ET + + +BT +51.24 55.9255 Td +ET + + +BT +51.24 55.9255 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 80.31 m +449.1996 80.31 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 49.281 m +449.1996 49.281 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 80.56 m +134.1597 49.031 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 80.56 m +449.1996 49.031 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 66.6828 Td +/F1.1 10.5 Tf + Tj +ET + + +BT +137.1597 55.6683 Td +ET + + +BT +137.1597 55.6683 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 55.6683 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 55.6683 Td +/F4.0 10.5 Tf +<2231323334353622> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 80.31 m +563.76 80.31 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 49.281 m +563.76 49.281 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 80.56 m +449.1996 49.031 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 80.56 m +563.76 49.031 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 61.1755 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp2 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +49.24 11.04 Td +/F1.0 9 Tf +<3138> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +208 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 612.0 792.0] +/CropBox [0 0 612.0 792.0] +/BleedBox [0 0 612.0 792.0] +/TrimBox [0 0 612.0 792.0] +/ArtBox [0 0 612.0 792.0] +/Contents 207 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F2.0 16 0 R +/F2.1 17 0 R +/F1.0 9 0 R +/F1.1 8 0 R +/F3.1 19 0 R +/F1.2 204 0 R +/F4.0 23 0 R +>> +/XObject << /Stamp2 218 0 R +>> +>> +>> +endobj +209 0 obj +[208 0 R /XYZ 0 792.0 null] +endobj +210 0 obj +[208 0 R /XYZ 0 601.842 null] +endobj +211 0 obj +[208 0 R /XYZ 0 382.626 null] +endobj +212 0 obj +[208 0 R /XYZ 0 225.468 null] +endobj +213 0 obj +<< /Length 10008 +>> +stream +q +/DeviceRGB cs +1.0 1.0 1.0 scn +48.24 736.5 85.9197 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +134.1597 736.5 315.0399 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +449.1996 736.5 114.5604 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 705.471 85.9197 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +134.1597 705.471 315.0399 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +449.1996 705.471 114.5604 31.029 re +f +0.0 0.0 0.0 scn +0.5 w +/DeviceRGB CS +0.8667 0.8667 0.8667 SCN +48.24 756.0 m +134.1597 756.0 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 736.5 m +134.1597 736.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 756.25 m +48.24 735.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 756.25 m +134.1597 735.875 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 742.63 Td +/F2.1 10.5 Tf +<3d3e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 756.0 m +449.1996 756.0 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +134.1597 736.5 m +449.1996 736.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 756.25 m +134.1597 735.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 756.25 m +449.1996 735.875 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 742.63 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 756.0 m +563.76 756.0 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +449.1996 736.5 m +563.76 736.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 756.25 m +449.1996 735.875 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 756.25 m +563.76 735.875 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 742.63 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 736.5 m +134.1597 736.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 705.471 m +134.1597 705.471 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 736.75 m +48.24 705.221 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 736.75 m +134.1597 705.221 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 722.6155 Td +/F2.0 10.5 Tf +<757365726e616d65> Tj +ET + + +BT +51.24 712.1155 Td +ET + + +BT +51.24 712.1155 Td +/F3.1 10.5 Tf +<2b2c> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 736.5 m +449.1996 736.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 705.471 m +449.1996 705.471 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 736.75 m +134.1597 705.221 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 736.75 m +449.1996 705.221 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 722.8728 Td +/F1.1 10.5 Tf +<2b2c8f> Tj +ET + + +BT +137.1597 711.8583 Td +ET + + +BT +137.1597 711.8583 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 711.8583 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 711.8583 Td +/F4.0 10.5 Tf +<2261646d696e22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 736.5 m +563.76 736.5 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 705.471 m +563.76 705.471 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 736.75 m +449.1996 705.221 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 736.75 m +563.76 705.221 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 717.3655 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 672.831 Td +/F2.0 18 Tf +<332e31302e20> Tj +/F2.1 18 Tf +<59315758393a> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +48.24 645.381 Td +/F1.1 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 610.371 85.9197 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +134.1597 610.371 315.0399 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +449.1996 610.371 114.5604 19.5 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +48.24 579.342 85.9197 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +134.1597 579.342 315.0399 31.029 re +f +0.0 0.0 0.0 scn +1.0 1.0 1.0 scn +449.1996 579.342 114.5604 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +48.24 548.313 85.9197 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +134.1597 548.313 315.0399 31.029 re +f +0.0 0.0 0.0 scn +0.9333 0.9333 0.9333 scn +449.1996 548.313 114.5604 31.029 re +f +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 629.871 m +134.1597 629.871 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 610.371 m +134.1597 610.371 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 630.121 m +48.24 609.746 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 630.121 m +134.1597 609.746 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 616.501 Td +/F2.1 10.5 Tf +<3d3e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 629.871 m +449.1996 629.871 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +134.1597 610.371 m +449.1996 610.371 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 630.121 m +134.1597 609.746 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 630.121 m +449.1996 609.746 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 616.501 Td +/F2.1 10.5 Tf +<3738> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 629.871 m +563.76 629.871 l +S +[] 0 d +1.25 w +0.8667 0.8667 0.8667 SCN +449.1996 610.371 m +563.76 610.371 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 630.121 m +449.1996 609.746 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 630.121 m +563.76 609.746 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 616.501 Td +/F2.1 10.5 Tf +<3b3c> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +48.24 610.371 m +134.1597 610.371 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 579.342 m +134.1597 579.342 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 610.996 m +48.24 579.092 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 610.996 m +134.1597 579.092 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 596.4865 Td +/F2.0 10.5 Tf +<696d6569> Tj +ET + + +BT +51.24 585.9865 Td +ET + + +BT +51.24 585.9865 Td +/F3.1 10.5 Tf +<2d2e> Tj +ET + +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +134.1597 610.371 m +449.1996 610.371 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 579.342 m +449.1996 579.342 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 610.996 m +134.1597 579.092 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 610.996 m +449.1996 579.092 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 596.7438 Td +/F1.0 10.5 Tf +<494d4549> Tj +/F1.1 10.5 Tf +<9a> Tj +ET + + +BT +137.1597 585.7293 Td +ET + + +BT +137.1597 585.7293 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 585.7293 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 585.7293 Td +/F4.0 10.5 Tf +<2254555949554f49553233343233345955494922> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +1.25 w +0.8667 0.8667 0.8667 SCN +449.1996 610.371 m +563.76 610.371 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 579.342 m +563.76 579.342 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 610.996 m +449.1996 579.092 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 610.996 m +563.76 579.092 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 591.2365 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 579.342 m +134.1597 579.342 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 548.313 m +134.1597 548.313 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +48.24 579.592 m +48.24 548.063 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 579.592 m +134.1597 548.063 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +51.24 565.4575 Td +/F2.0 10.5 Tf +[<6c6f63> 12.0 <61> 19.0 <74696f6e>] TJ +ET + + +BT +51.24 554.9575 Td +ET + + +BT +51.24 554.9575 Td +/F3.1 10.5 Tf +<2d2e> Tj +ET + +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 579.342 m +449.1996 579.342 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 548.313 m +449.1996 548.313 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +134.1597 579.592 m +134.1597 548.063 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 579.592 m +449.1996 548.063 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +137.1597 565.7148 Td +/F1.1 10.5 Tf +<4142> Tj +ET + + +BT +137.1597 554.7003 Td +ET + + +BT +137.1597 554.7003 Td +/F2.1 10.5 Tf +<5b47> Tj +ET + + +BT +158.1597 554.7003 Td +/F1.0 10.5 Tf +<203a20> Tj +ET + +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +165.7827 554.7003 Td +/F4.0 10.5 Tf +<22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +172.0827 554.7003 Td +/F1.1 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +256.0827 554.7003 Td +/F4.0 10.5 Tf +<37> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +262.3827 554.7003 Td +/F1.1 10.5 Tf + Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.6941 0.1294 0.2745 scn +0.6941 0.1294 0.2745 SCN + +BT +272.8827 554.7003 Td +/F4.0 10.5 Tf +<22> Tj +ET + +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn +0.0 0.0 0.0 scn +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 579.342 m +563.76 579.342 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 548.313 m +563.76 548.313 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +449.1996 579.592 m +449.1996 548.063 l +S +[] 0 d +0.5 w +0.8667 0.8667 0.8667 SCN +563.76 579.592 m +563.76 548.063 l +S +[] 0 d +1 w +0.0 0.0 0.0 SCN +0.2 0.2 0.2 scn + +BT +452.1996 560.2075 Td +/F1.0 10.5 Tf +[<73> 22.0 <7472696e67>] TJ +ET + +0.0 0.0 0.0 scn +q +0.0 0.0 0.0 scn +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +/Stamp1 Do +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +0.2 0.2 0.2 scn +0.2 0.2 0.2 SCN + +BT +552.77 11.04 Td +/F1.0 9 Tf +<3139> Tj +ET + +0.0 0.0 0.0 SCN +0.0 0.0 0.0 scn +Q +Q + +endstream +endobj +214 0 obj +<< /Type /Page +/Parent 3 0 R +/MediaBox [0 0 612.0 792.0] +/CropBox [0 0 612.0 792.0] +/BleedBox [0 0 612.0 792.0] +/TrimBox [0 0 612.0 792.0] +/ArtBox [0 0 612.0 792.0] +/Contents 213 0 R +/Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI] +/Font << /F2.1 17 0 R +/F2.0 16 0 R +/F3.1 19 0 R +/F1.1 8 0 R +/F1.0 9 0 R +/F4.0 23 0 R +>> +/XObject << /Stamp1 217 0 R +>> +>> +>> +endobj +215 0 obj +[214 0 R /XYZ 0 693.471 null] +endobj +216 0 obj +<< /Limits [(0x5fe8afb7e6b1825f706174685f35) (_90ef77e6e0dfbd1d16077412c56dd1b0)] +/Names [(0x5fe8afb7e6b1825f706174685f35) 120 0 R (0x5fe8afb7e6b1825f706174685f36) 145 0 R (0x5fe8afb7e6b1825f706174685f37) 169 0 R (0x5fe8afb7e6b1825f706174685f38) 190 0 R (0x5fe8afb7e6b1825f7175657279) 84 0 R (_1f9e34870cf47ca885a7be278b128f43) 209 0 R (_210de75caca43066a260d60083630867) 200 0 R (_38a29557fd886180f3eb6d6d45561da2) 210 0 R (_53dbe61dd9fa5051b44e3907574b9f39) 215 0 R (_889c1af8350fc1eef060154a9d96bf40) 212 0 R (_90ef77e6e0dfbd1d16077412c56dd1b0) 129 0 R] +>> +endobj +217 0 obj +<< /Type /XObject +/Subtype /Form +/BBox [0 0 612.0 792.0] +/Length 162 +>> +stream +q +/DeviceRGB cs +0.0 0.0 0.0 scn +/DeviceRGB CS +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +q +0.25 w +/DeviceRGB CS +0.8667 0.8667 0.8667 SCN +48.24 37.5 m +563.76 37.5 l +S +Q +Q + +endstream +endobj +218 0 obj +<< /Type /XObject +/Subtype /Form +/BBox [0 0 612.0 792.0] +/Length 162 +>> +stream +q +/DeviceRGB cs +0.0 0.0 0.0 scn +/DeviceRGB CS +0.0 0.0 0.0 SCN +1 w +0 J +0 j +[] 0 d +q +0.25 w +/DeviceRGB CS +0.8667 0.8667 0.8667 SCN +48.24 37.5 m +563.76 37.5 l +S +Q +Q + +endstream +endobj +219 0 obj +<< /Type /Outlines +/Count 30 +/First 220 0 R +/Last 239 0 R +>> +endobj +220 0 obj +<< /Title +/Parent 219 0 R +/Count 0 +/Next 221 0 R +/Dest [7 0 R /XYZ 0 792.0 null] +>> +endobj +221 0 obj +<< /Title +/Parent 219 0 R +/Count 5 +/First 222 0 R +/Last 226 0 R +/Next 227 0 R +/Prev 220 0 R +/Dest [11 0 R /XYZ 0 792.0 null] +>> +endobj +222 0 obj +<< /Title +/Parent 221 0 R +/Count 0 +/Next 223 0 R +/Dest [11 0 R /XYZ 0 690.6 null] +>> +endobj +223 0 obj +<< /Title +/Parent 221 0 R +/Count 0 +/Next 224 0 R +/Prev 222 0 R +/Dest [11 0 R /XYZ 0 627.0 null] +>> +endobj +224 0 obj +<< /Title +/Parent 221 0 R +/Count 0 +/Next 225 0 R +/Prev 223 0 R +/Dest [11 0 R /XYZ 0 533.4 null] +>> +endobj +225 0 obj +<< /Title +/Parent 221 0 R +/Count 0 +/Next 226 0 R +/Prev 224 0 R +/Dest [11 0 R /XYZ 0 424.8 null] +>> +endobj +226 0 obj +<< /Title +/Parent 221 0 R +/Count 0 +/Prev 225 0 R +/Dest [11 0 R /XYZ 0 361.2 null] +>> +endobj +227 0 obj +<< /Title +/Parent 219 0 R +/Count 11 +/First 228 0 R +/Last 237 0 R +/Next 239 0 R +/Prev 221 0 R +/Dest [11 0 R /XYZ 0 297.6 null] +>> +endobj +228 0 obj +<< /Title +/Parent 227 0 R +/Count 5 +/First 229 0 R +/Last 233 0 R +/Next 234 0 R +/Dest [11 0 R /XYZ 0 256.2 null] +>> +endobj +229 0 obj +<< /Title +/Parent 228 0 R +/Count 0 +/Next 230 0 R +/Dest [11 0 R /XYZ 0 192.6 null] +>> +endobj +230 0 obj +<< /Title +/Parent 228 0 R +/Count 0 +/Next 231 0 R +/Prev 229 0 R +/Dest [43 0 R /XYZ 0 370.464 null] +>> +endobj +231 0 obj +<< /Title +/Parent 228 0 R +/Count 0 +/Next 232 0 R +/Prev 230 0 R +/Dest [65 0 R /XYZ 0 466.05 null] +>> +endobj +232 0 obj +<< /Title +/Parent 228 0 R +/Count 0 +/Next 233 0 R +/Prev 231 0 R +/Dest [88 0 R /XYZ 0 612.036 null] +>> +endobj +233 0 obj +<< /Title +/Parent 228 0 R +/Count 0 +/Prev 232 0 R +/Dest [99 0 R /XYZ 0 117.286 null] +>> +endobj +234 0 obj +<< /Title +/Parent 227 0 R +/Count 2 +/First 235 0 R +/Last 236 0 R +/Next 237 0 R +/Prev 228 0 R +/Dest [123 0 R /XYZ 0 247.641 null] +>> +endobj +235 0 obj +<< /Title +/Parent 234 0 R +/Count 0 +/Next 236 0 R +/Dest [123 0 R /XYZ 0 184.041 null] +>> +endobj +236 0 obj +<< /Title +/Parent 234 0 R +/Count 0 +/Prev 235 0 R +/Dest [149 0 R /XYZ 0 341.886 null] +>> +endobj +237 0 obj +<< /Title +/Parent 227 0 R +/Count 1 +/First 238 0 R +/Last 238 0 R +/Prev 234 0 R +/Dest [174 0 R /XYZ 0 493.65 null] +>> +endobj +238 0 obj +<< /Title +/Parent 237 0 R +/Count 0 +/Dest [174 0 R /XYZ 0 430.05 null] +>> +endobj +239 0 obj +<< /Title +/Parent 219 0 R +/Count 10 +/First 240 0 R +/Last 249 0 R +/Prev 227 0 R +/Dest [196 0 R /XYZ 0 626.325 null] +>> +endobj +240 0 obj +<< /Title +/Parent 239 0 R +/Count 0 +/Next 241 0 R +/Dest [196 0 R /XYZ 0 584.925 null] +>> +endobj +241 0 obj +<< /Title +/Parent 239 0 R +/Count 0 +/Next 242 0 R +/Prev 240 0 R +/Dest [196 0 R /XYZ 0 396.738 null] +>> +endobj +242 0 obj +<< /Title +/Parent 239 0 R +/Count 0 +/Next 243 0 R +/Prev 241 0 R +/Dest [196 0 R /XYZ 0 115.464 null] +>> +endobj +243 0 obj +<< /Title +/Parent 239 0 R +/Count 0 +/Next 244 0 R +/Prev 242 0 R +/Dest [203 0 R /XYZ 0 631.413 null] +>> +endobj +244 0 obj +<< /Title +/Parent 239 0 R +/Count 0 +/Next 245 0 R +/Prev 243 0 R +/Dest [203 0 R /XYZ 0 443.226 null] +>> +endobj +245 0 obj +<< /Title +/Parent 239 0 R +/Count 0 +/Next 246 0 R +/Prev 244 0 R +/Dest [208 0 R /XYZ 0 792.0 null] +>> +endobj +246 0 obj +<< /Title +/Parent 239 0 R +/Count 0 +/Next 247 0 R +/Prev 245 0 R +/Dest [208 0 R /XYZ 0 601.842 null] +>> +endobj +247 0 obj +<< /Title +/Parent 239 0 R +/Count 0 +/Next 248 0 R +/Prev 246 0 R +/Dest [208 0 R /XYZ 0 382.626 null] +>> +endobj +248 0 obj +<< /Title +/Parent 239 0 R +/Count 0 +/Next 249 0 R +/Prev 247 0 R +/Dest [208 0 R /XYZ 0 225.468 null] +>> +endobj +249 0 obj +<< /Title +/Parent 239 0 R +/Count 0 +/Prev 248 0 R +/Dest [214 0 R /XYZ 0 693.471 null] +>> +endobj +250 0 obj +<< /Nums [0 << /P (i) +>> 1 << /P (1) +>> 2 << /P (2) +>> 3 << /P (3) +>> 4 << /P (4) +>> 5 << /P (5) +>> 6 << /P (6) +>> 7 << /P (7) +>> 8 << /P (8) +>> 9 << /P (9) +>> 10 << /P (10) +>> 11 << /P (11) +>> 12 << /P (12) +>> 13 << /P (13) +>> 14 << /P (14) +>> 15 << /P (15) +>> 16 << /P (16) +>> 17 << /P (17) +>> 18 << /P (18) +>> 19 << /P (19) +>>] +>> +endobj +251 0 obj +<< /Length1 47512 +/Length 33192 +/Filter [/FlateDecode] +>> +stream +x|@SwsN$B @vDDAĉ{UGպh:ڪmhjݶ{ޚ='xN&xC4IIƷNغ sFYc.\I;vvOz5L{sԙ>Ihѭ?hywƷΜ@z݉^kYݫVI{ӲO'}(F7kO +F{@#KxyGg$$2Xl'BX"JZ F9%5͒ieesμ|WAaQqPnP}!C5oihe84i6qs"h57?^,Š*x׀bxtS&`;Hvp~}kC&s0&ȞQo:<xF<Bhq"1zAA׈&ziI +xKm+]49Qf-k[ +r{!'eyM%u.m2$WdM* NYJ63SRǰ5ZH'` +l&)TvN)r\kF4r݌ MEsJiQH^L)صBm<;g,8̹%{#N"r1,@g69xv@,=r8IK秶>ckuWWjl\<^ȑfJV B.hЗv1w^˧2Lօ|MF;9gwS ])p]T&ITscK̛Wmi`xV0ѵU5 v>ۮծe/+%2^F4 -@ydXڨ#^DZOICKP8*l(nn|n'[Uf`OUE,wg鐡fDcJ%6.ˣ?;;+ ;KeP8ر/--*Jy"cNv+Ci +w .:f:Aęuy>¹4;-ڋTCrSuĦej|#;Q\^@6E')aX vܕp!o/iVIk*HS_&$7q@ *i|xܪSeJ +([n}A$ʼndFr$<DLFfϮs3He ۄػrWXw^JlL\%x _6I #It}k>i?V_E4KnX<]/m v}ݲ0PȦ.id4&i4oѽB +mЁD7xhHNRj)wK`lR [j!A^@H xq~zoMငRQS]`\^rɘ܈`J~?$*$׏(H1Ǝ3>-등u7sn˵V:1>]) + 3r*> mD>ə7# 5aO2 d?cH1 gǷ<[h-ɶgjp=@1<] &pQ7;EDGH*yi9b#O6Ka\&n_GO0ܮK9qlFx|cFD~IYEt-j? ifo4 @ Pꑽ.XB]َ[^HIץB ~{(o["V@b)]R8py+lg/ <Wrd@y\ҿ'-L.FGmFqtc^(:X9&_~k|2c_8?솜E;MN8 ׈>DaFU;wDfaR,rX+Il +@$- iHMƬg\"yf,1^߰/.QRl F t$7-riWYVF+O<A2/5Q*$vT.;H ,ķBou`k ۊxTݔof\Lr4JZKLg4 1ӿE>|>Nr߬h&|<͒!fYO| ^V&zGO- 3f1Q؆LnFoL9Ea?e\ 8iRD,'Ng~ѫE+E%'?,ȍs.>h9d}xwI-'5kER/{]8W +-7jxOH]@3 I i޿_󎡗WXWn+8^9`՜ +Ͻ恋Ca/bGH꼑oc=FɐrT>ܨԵ#yl%%)di`8}OϓGIr"1bA.}]`2 '{\+m,8b)A4YZb= d??,Lmـֺc0Ծݓbvlp! %xʆK3"}(Hha?E#<;: ˟~)|w\| Xd~N_O~ lcA>@QQ1|^hpLJu Ee_y;&R֕DR5c. eq(%Vva)[l0X  Q3Jg:/`]2^xŧFrNnBpkTRwAS]HDIjeP穀``Xr=Ә[2֭V]  ՇFm| o)Kآ4iD~R2,1r+ZIJ\X~?gjB1J1sI1Sx2Mh|PgJx +$Y:fZ:8 R;,949=DkehcjN޼Fիw{@esGk8tש0+f8kgr2٢fQBP:HIK y0 0tk6A—[sZep'gw_ײ^ɘb\WNwl+t< QD e"K'FMFB8WOO8NR1Bž:.NX:Hɲa- `05]vm02{ȃz:=>U,բyUePSTS3l[}*] +~B3/)TTV9sChT`JydŮ^e+Ǥ{{E-Ͻ0 iRlO>Y^>O,RU?T:QK-%%f)KeyCBhѬ߬T,,V*rkY#-Ȣӌ.6RN4V>42m(ǘߤZQ7G.#[~C07apHnC)H~dtE4Bb<&-~LW$&tPT+?ry%)d3ox=1A ~iz޿Ń fN'ybIP(9ɝ ?Gjԍ#Y@2:9,S?fhzZ*Lk ʍL)O ˗AZ/CJTc&f*t}qXeL][IsAfQ(8y?5Zf5=2ۦj vNn -d㥔4;UG#eoӄ^<1%ܸ2̻X# v@"-7d;~H\Q-ÊzI,z4K}zK` pf*M4b\9V2O!:J(\[Z,ٶtS!+<X}CDQhn[a>>7p$48Az 7udr^XpiCpdpAfJ>}_{XMEaޖks H"Ɛ_[wF(u`_ cg!x4eFȊ 1Y/` dZ#2 ([$Q6U='Nƒ36{e^o֐RY3(@:P #<[tx_i iPEC_H=>,xg$=$rũ~VA< fw9VL[,V|5ؕ{k ]0r{x4W_eWܻ-hWX@Fyh 6(-PD2(\7L aV 4b=R/ v)xn\p1%a_OZTD֧"X/z2@c0yTB$֐v.3lUxyoKs4h@_B7?<5.mZ,v5Uw3ӾA!B9\{PX1BMܬ6't:@Q4^/2{I#q "]- +tx}/H餂)AaD1]YӞ%B%U ^؁[Sf(fOcb${bAbhNkX_du?᥯ f^KE&a;%ۀ">uRn#v ԥA6A U - +ndo`Y4HI㖊% +˻vl_" .oyQ$& 3"QtFHd 7|uP41NN+JR+r04"-~8(Vd|ԃE">7Z`a~pÿihdǹ^¬4Q)Ub]>$ኰ%AN$,ջrS F,8a*N֩Z<;:lX2: '~x#y+ +:A'kΘEUW|mfã:$:^ȟWJE13\|KA^$Oa'5殨nuX0q} +2|,O3EJ,h6t9XdHg6yO3OWRB $S2KVr.`wB3<6l[ /jx Kx.RTZ4L6e7C6=-1JEEDsIL<=A" u8< %LR!HeNH<޿8E8d9m!xX@ګ1/E> aB d4C5rHG8lcQPIdItAMNp\'Zw7N+^$VÔl4^A$̻SCD#gpBdc9>1jJ}(X8sdt&pTBo9, +9a秝l;$kd`pr"7)2|$I|BLh#}l]4P'ļ[T]MpLUJxl-N.\_Nt:ڷ(?AkuN8 #Wв{VZ#&TZQN)@hٲ`K0cֺgo}|I3zp.yx U?xß +OG$7M\7J/˦j>]zˣ"Vc[UMГ2>]I\y?Ege4b|W|%QK7`%6o=Z3*cZTAyNz89CA Y%:Gg~ RDGڼhu4$^q Jn.1V$uHq=a}@}S5s-vtʹs}'w2A9<|WJ=#6NXg><.uHyZoE2,΁hxst;摋1ͅXnrX؏DkIPNUP> +Y\BaءHe?֔3 +̢"bO7?qKJb~o=cEw_<‘Nl,`:j궥'+|Ymnm>=hZSKOH!miu1 gbY{O') +ːPaJu 2 /6*|I5IWO57D~z0 #ISeCŅ 8ǟ"9'T>Zi$:-;jH#HCFbdJIR` )Yh)_Nb6< {*EW*;^) +'ٙip.m^z5(A&NOe{Mƃk>)Y=8I$8ǍWf#rt 􄖙'3e"LF%9;cƙ5O؝ɪ*=RLb'! M + Yf%lml^QdԚ#N}wOi^ݔ{+>e^~"y/\8U[&~SQ0p3N$F6FT[] "/\8e\3z9 Lގn#s7ŝ"H_.,?h!NC@3ͻO֏ᗩxg +Y9j7(Q+,"|z!Hlv#Üy[:eٜL$|]:5!,coglg,_%X81q,~0Q61IޡkflH80Gr✞/rܻ/j7M=9e/kģ.F'Utk~`@He0,: ~~B%?9 ijےD.Hۍ/fE#‘j?2,F,j04ZAR8"&624W3!{G\āU4/ +8 /jH,;ųB P +"-ѼXP'~ }`#[ H/jP+zpo@ WiD[ Vã`+V7$ast@X[j6},sA~N:K75!yx'Huunmk1$D'_GO?+ eyuxjQO~00u(Ԁ0@E5᪢0y7sH)7S'_sk"V~^M |A=lcg ?ND!()#kG\,d,N7ir;ӎ1OV+= Q$ӗNi'x^ȈS+#_*E !ø+96:h\i1|kΫݢ9:3]}c7QΞQ@c}-WPyRN4e@&b +zAI᤹intǫS? 3<ͽO'O Ddyz\~/w)=$?a?lb'-/H34VSΝ^a6HdHFaPzcgFanw(2(WWT_)6cddg 0W0C8Srí7哻 +;wRxx +vDd  +/ቑwT򨌸pF _~̒ ˤj +_NJc_pY1+y 82%u„v^,*C()pJ'I $6=s2O'9JJR5Dť?1ҳ}>? !fZAj&I ZQ0E_v$G2*rÇ#n>[o@)*n$ m"]=W FBUDub"M3J_A-8źVxr+Dp-8"5ɪ%gSGg!O,D$Fj#-m8HX#I|eܩ5K6+\DŽ qSJV .J1$[?~|X1ҋ)>ۢ!=~z&hqG$=F2ZCa0A,Ћ-YCM//~u=~bD:%5T+x9w;./*렩+ƉZ}jS | +瓱u87/HCPoP+`?s`&[x&QfV=FIJNdK`¿[9(ItE=ެgAvqL75#Ɲ«n"y͈څD0n%sV5{o{6]vF-t{ʝ]ɉ? #\6GaSBU`>ة ;=Oo3(O-^fPLi"X8ʑ3i&䋟AIc\bUцFf]&9d4 S1(0,ҭ,zMP)h+ɢhFR\%DQiyɾf'$'Ν5!DӧLrOdf +$y*I`l] \f4M ̽ X{Aze2nw-i+Rt a3 *\pd:˂nYSTq2, v}Y6SiD[ 2ҒkkV%s' Q:dDFM-@?X6.g?i_>8C_u"׆W@j ۷خM͵[(!֌6sD͕)LSffz]xWLONJKk + +@Kռm"/uW*M6SGΉ}TTՃ'6[?ƫLCmvX"VI *LuWpq +mU[z'Ƒ== +8 iwM-S>L̛6ܩչg5?D^fbN+FNQvVk],Ztc&D&) abgMv9/iUJQP AXZØ2W&pd\LMBݯT R=`";$8װ<EðK`MsEܙWJ+g4)$ڥyBc܊.zN[kѦvnj5>m0 KسY4)lEVI |o%LK{Te TVIZE^ !pWFEl0Qt``axj[f0(_3dۖ9:\!xBqdΐUW#4/O.qFtϫajF"q|FXLg)^Vl4rVWV!x*B/v@w8r3.qcc8S!ROU`09Ez(|v9plYZQ̟Q.1wi%Sch|_ӒVt/nojJ.Q}_D:XyPL,.K#|H@"!pd{]Ųk=23C?!Wf7 Jԛ\l;o/ EEOp)yҨX)CQ6hjxJ.])D[|PFj@֭{kfe''gKrSyIe%Jd߿vke3UˠϷ&Ok^W06MITdfٛǐ.$Q5'e@k{@}#`t0 (wiR?X׿hagpA0,~S!A| =l}ƏǨ#)c3x>1F*ɺ)l]-{v9+]3Q0R6Gudv^' FE̠[d )Z_RƔ<~0'{.jZV-/yhN @ +^ 1gH +Mp3\ťH,5D +O1;lײ,34W*)A E /Q8 Z@^7GSh`o]XС i oT`(n߄2k9[C*}h6ΤXʭ nm)v} _1^edv(0K9D +%Kͅ/[O&/#*>^{8 +!OxxAUcN]vū Qed}oh@r_#{^hpJ)#3CE;**GykOMgY-: =~&{unLh/X'KN?FD_5Z4W0~4^0H+[,34A3/ Ϗh뚜C >X>TZk(4En:*-oI(|$ᳲZɱ99VCb=zEE3hih}SVYk&ٙ>_`INkSj)Du+~̲2=Xesc%_u+gΠ%N\%WfW:RwX O*ILt"73b*d/ln#mW=dt#0/ fQe|)0dLrd}J!chNCdԐroyJVl פN,k5p̀/V˛ax\q+ldTteow[FrGP :q!K/剄Y~`nnZN\>z1^|2a,,,ȔA6ݛcvUfӣ՘}8.US~dd-!@8b ̒]z(\׍Y! GG +SaL/I^?QfY>I1>7tk_t"Jd8*㘲F$Rv=`R5deQ5dڄQQ"b>dS9"wߕᒥi=fR1S'^TTH?|nx!?O{WŁN= x]*lNpj4~ E}`*v뉠 d'˨+y@FfU']D +dDz3͒Ԡ#iɲl#.m~a뮡@[)53xy_oii~RxB?d7˱UU[~oi^ RR'zVX-Pd`@tC +\`{r C|bE0<5S*8ҵ=yC$Ϡu T_Ā\TL4yg!)16])ԙQsSzH0|6u:vWE͆'lEΜ wg^7?؋.YAFթbtraQUE[|ڑ5\^ ?  :%E'ĜTQR╹t*Yt:k.z$Ujvc= d`yjPtUalhblt>?#QLhj'mC^O"ZwMqg9|?[֑as`!/ΰnxLzSH)Eblvd􂯞n3? [枚9Lc}8җpUZN:-, +A{ +ʑh2*VQ^} pީ]ăi~ /Xu݀)T͐8^V* / I9)Iv{} &Z0֪-Y-7G R,30|&u޸s'8d[]->m nDC"UxH83 vG%Y={ߠb}Y]' drA*cx=Qy,_DŦ]_Eg*ur=%S/XY\6~kDkskj[myS^[(0batse5ox_B";-N,'g~v\ºKY "J 7{eRdK1NO󲰌f\4MAY 3{SݸTBrQ`'3nυ1c%iZDc,+8]_uԑ5yOzʓ,].,w[{ȶl W\SZ B:I ! %!eM!M!fE?@9tFo޼;{g;A3]T߰ ^8!"T6-% >k3<pa7IS F`p&@2h*@6)U'W.Lk/k4җ%׿TY_ ]bxlͦ9sEe>[iMYp,15f@{~FGQ;0r(}ҎɒU@YDzL-Tc5XЄ=|{X[jGD'aC`;qZy!,yql*G4t ; %X#ED/P,9p턳_Rte1B7ta ;o ܆IS-]4:2[ZA=+ 3mĄV^0{qkf狃NDY'G2'{l #@YdtS؛0 ~z|믿 ,)gr VMehW}͞3՝]i/Z0)SQU<•ԼG+l Pz1 2 3ܹPOo, +̴Bqǹ4(^NV ۿr><7/iJ16cvk_K^oud&W(Mj^N]2t6‹=vRw9%6T_>eF/SQ2C {޼ ڝ;Ax G_-*IC"t7-V)!LgnccngnE9O(VoĀ{w*6z}u2j4iķ]G|0VL 3h{5ese@aŞF\2E'g`Y}jY {H2Lp;5ÃH u6HY+r +d,cY}$0161O4xioեpyhM -o/_쟛Y1wJL˜;O0V7!A)YU ;SVHSاQ]VKZ+ "FuXro,3([^)_SZTaPg/unT,ß`W%a<'J'9)S2+ Tp꣏>„o\ub6Çfx]]:;SZF{ln]?G1y/CRr-SH?x2ߊOZ2 |?_*N~sF/K|GIq85 K+`Dĉw؁D Wz#m=Ë/}CK+bfk4ժI9Bf_&C2K_<6-em8w j6$gqtcwc9l‡.!$PXC > uϯ(ФLx!uD%:9y Ҏ$G +V[ˮaj~t3"ɾ[>h.@]^B˼%^Xt@ixI&PrSV:0bZ<+x8&FbzʚW.7&gٻurR`ZfM **)bƃFUгf@?xq*ij<'PiwyCͬYԮRdQhƞ?!ɥ7;LKM*,y!Gb2ҕ's)ds)ʾa D*itXh^?'xYaO} 0[%9%fc7ǧf-I +9%=KWŒN1(NVrr^S5\DRG4]r `Vvfx,,r;jӧwVp0 //~g_7#Y ,2gjJ|{~OGYPS|oGUP5ժ)bN=%9.x?\-2f\iٔ< 9+e3 x 6+ +sTt7|,䥥uY, + kYk)|2`NJ'W>uv ~דO +`̆_@} +J zGT_ -mjݨL٣L7;ŸyQITCtm$qLu3Ig`Οë1qx6v&<)H;A(vGx]99xi +g܃RjX,osLjtpH>"! D}M93Қ/cX)fxpHf$%Dn?7K $z=w,XS%Vkf:};g|Ⱆf.omޫ,9&yl;ϻ}H,Ě5䙂(v1 +f 6oD$Q"wL"AIN[FgvJ y)_̗{$ 7T̳cl<ϙ8B9&6II䃠6ln>8!IƊ4pxɽާOw?( QiZ[K$ަ-[hZBMBrUcy@h Vdfbbg)'A,2/<eO*^nڒҜ77'ZJM0FqcDD +qZ^>?'wYKiD(^(|>-qwv;J3KEU/Np9XskS\sLغu+ŋ%#}9IWq:~5m5x x9e6黦|jtlGx]da-/|<=@;(YO|A,lHVn >g/!Uq-cT)6jX) r{~>mum`QqÎhا\[a0nmm |(8% \$d.9 ,H"`7cAf +5lRR7+HٟOJPϬVKJ38ʑϊ7)?R*_`M9Ѓ;ʜ9,U? D"PD25tm}M ?vAW$Q"" " +SEDH*@.F +a| +K3;3SK|ՅқJ\7b֧nm~kŕPlGZ'Z4;cGigrXDe҂M)ƃA.Hd|tPyx^P~!(MM n[xJ{ f_7;nRogQv/j}ЈOU35|,y$%u $EpKM V[ ъ,.>sYRr|uIkg`L3blhi?4S{k A*[#\Y&T%UcּtpC[?s1V.%1n +m$_Ձ!G鏒؍ dZpEXS+V\YSx"oXnFe֑+mN~WC'4TRS 灧 ~GUϋx\u!6/F۰.?]Ȏxjρ<4cK:|qeQ D@- c7X +c0l2zeO(h8),TE1L ^poۮiLIV+= +G%;҂]˔R[ upZR -.DuJ;^|i,*ڭ*׹ZүHyqTEq#fA<"7L ar +Cha%[wE/B3x*h%ຜ|g'[VcVBs,>{gDf"4E$Q;h\/wK J}~ߩyk;%y5 F87ǀ +Z^r2.]s&UMMq@1h&Ewb4auQ}"FQC_abJ}w\չsʵ.U`?[^',]2+?} sO@ȒB !vzhlET8.a~-ȿpWgRp=8<)x 7ȑ$%oؓ$3{]Qt٤6d5*-ٵ`ycYY#\blx񳐊KNBSѓSipOi#bXSyASֵd}!H8w7{>x*^ʏӠ 4)vͺ=bs\yT[i+Zs2^nߵ2Q0چE+LZ${K=#P6nT=b[)44o]X9q7x3]V.T\5+OAsETxgйƆ-ʐ0,< 2,{7~o,PsTLIs팞ahX['kx\Y IiY|k' ۃGhx\DGm޷b%tI;;E ."MlUU+m==v!fKJN8MaZ硇ῃ"KBekg Q溿 44QQxp}z:(Kguʱcj]BF|c^+<%NQs,1;;Z&p3S^rwJb-WX)]KNjWZdEl'')3eg`raزgrSb-,Wmq2  Z + xVaq|?D79A}6C#ؾoߋV@-9Qa2&*@;jK +}}#oly{Ek蝅N算XCx2G8JJzE0{ZP@Za9R pIR37oz]i-Ь4iE`unԌDoRg3I勴fVh}?]R"Kdل`EEulaN,Z1avvl;ȑQbo>]Ha>md 'Z ܝmL :|cW V+h]r{RC}O:&B,17V`\$x+pr 3Hj{x)lo*X޵4rHeS)MTc3lgϞg|=[Dm]#x])m$Gu'EgwB: ̰>L:|"gOVoy貀^aIǢE_w[|˲"^p؜b<F]4fYJZ]7V +jૉ1d1>,ނ*g.|FL>h;Äqʼn Ma;k:{fHn#&6V `q4 `WFTl\0}׭X xM[ 4Da; + +I +yQd큲;ʏ$}*^dqlS$(7$vє b4Dq2+ ܋T.) xٕSp]yP4s9M~@!_)"v;cdko'Dz?{ +wU;[v59aSՐhy9 {neHMLdg'SL9fJk&r Q-W#?6hu5k~}E/]oo Z)ܐBUENɑ s,8~yḻSfV,|G;9b,Z.c_.Y1t5;J&Kwxµ#Y?o>5=lQ$J8̡z]'Iak{f& ^@d|)iMtͩ] =Jy1tI!ha߹6VFEI(PW\ _(rW)XVǻf(((ڷ/OnKvIfqB{JQWm2;ꮑ-Y!y_(l^)c}> + ì+R7>Yq3(p7AR`AH gCEF%ޡ7t^CNUPt>5HAOى%ެBhZȿbm[*o&V/SZs`,"Ƽd?@_u ]Z T)-5)fy}"xzz\m[+se4KDĒ#U5]sF{{ ^֡Oibo*! 1.~&ߊ]~o?{l}XA"֟%D裏/\t焬s ybuBCz&p&E/7ksrR-I3 ?i3Zm֋)QvoܔZ7`E͊6Iq؄\ `v\BeBɲr»%( E}&_|d226 QPH('RRKUhIZt%VRBTդ$kdYG1כd~8Ҧ+b )rxK޷2^WJ4<Ӽ6܁r*z͎L$&ڨhz|YV=+W'uufiyWDi04]|QS13gg fӏǞY\)RHx5+/8VBGRInxKOk=+2ҏ;ky<b8#%q3(>Y;vWlzb "l<>\_a6xy`_ٰ^/%"i K;Ci*f)SǎMKKejWh>̎PMmݪxßcR(=uM]^vx/yil/W%)Ϩ/dd XLr|:Ǥ xND\6~>MDmaڭ6.F} &0eH"y䚒 |J.|ջ$OkgU]gMZ0x&%9{B}3sUE\i; 6?bMB\,N9Kݭ +ICj~g(!u^`3*-al\΁,Jۣ*V X0)wJ5Jsh. mL? +tB+/1<+Co +)DJ- +NdscD(h& +k3sXš ڝr vzO,$#|bi@;D팂_V} 5O*~۝Wƫҫkg/..o~zH{;Ea뎧ק(9? .4R So|Jr ]2wnjiAiXں$e5x5' Ǘ搵+1t7W-׬w8Q]%Xi=/ԧV(%qa|wպ xGdg- +MTގi78re2 Tox-G8۬`('N819sJSxW3YrDKX mMKJͯa;;N<3in\IF-Ǯ2f,w~>Nh¬s%_sՁB\j:k_(;;0s~4fXִx';|J~p.9Ok']cN20p-3Y!Jd%,,"H*c巎p/ )jǯ6XSoGs^JVSm 7^ZcBV#qMV՚vu_x~FS3.9."G#O+A-^,Ǭ*܎މ nܻ$nx.|*տw̥t,#z+U^'&,Ds[l r 9\rG` ГK׾K? 3]J%iPVRzw4 L\jZ{%x뎔JL~lFL5=lO.pd(q03h7xn(M-GJMdYjvVe*/~UJxɌn ]uypbl,*[q%NfA V^ +۶ngʫ1gxb|g6{Y +?A/C}*јg]尢(mO]qa6LZS*[fa}~g0`TkV=S޹lFaR8'&&eY4 B9xbֹٙE- Z ʤUza0 <, 'oYYlǙ3tO2!I@N +@rDY xD %z)W2;[,|_%-ᤥEͳػ{s; .U'|pɊ|Œ!{XFq"|*y[ }}uu}{+zcbsCY-K>NP)^'W{6[ +-)l }T~Z*?/W u5YDDrl&>O(GTϛ'P$iS~7MrBs**|-z]e`!\5ƫ\\ ,>L$Q޲bXМ'@|`ODXH,45Iejv+4#-Eyq4pbًWF;:"jf,-ܧw7 lYyc~(C7#-ǦyUeYh\r|*/3|Q[%\WelM5kbe;vfklE TMn_n&9a&30%#]FJ^+hEW,{RcUfeH1'wI8^΢^[:TGT?˫  P\(])6thĄۢUJFNAl2[^!ǢmBh_~tr r-\tX{2cyGBEƮ=?9(5WZF?|`k}3m% (2+vH>8oݛܭ]Y4n Am`wwrގȊ8q829r0iӎD%Gz;1lLr򘳱ɱ7yC{F7<ỢQ~1[')tK16_e2YD&yerDyTSݬ*-եM6J[ݠ}Yu#z<}ۆNÙxEHTmLfcτ{MH|9)#鶤O&R`*/%T֛v sKetmzuOf2e̒d-z*ZX?nƳm-m |jooے`+ϓ8ż XAg-  /*[UxMk%Wp_9[GeCe\,˵umvtz>|o?|Vm+>̯|Jcu"qUqȭB.9 r$9#rfҐ \ +s72.9=rI?xLzLDƵ"7 Ka\24l=IW``3sE32N&3SFrY˙x]$0;Ɣ,o/S6<3BIǎFT&n&L|ɓ)qd_ÄqLI5S8Z<#Du/H$4 ,!BD +tC=@HwhO #(EH"Л!}`d(XAkbuY#,a V&+Qq D?IcXDO +%X} ]`T V1`>t'X~vv5|!ɯi|V:-~1ه%Q_\r2bzv!&5XRr3EP9G\B<A;=(l.]dnxM)4hH(4O~C۩Sy QЖ@ȋ:P;QVz`ho`GzW?Ī@IX^L!,.^sY[o;]pLi_ҧ?b~sph84OdZ22,˰edDPq2Qf_ e??(N[^ 3.]8g@Qo[*f" + v'^e!|H?= QP;"Z}j/Jm`posj@1K Q"26(☉r2$^VЉtQ%`p*A}zIkr GG?*z@BZ ++P5Nj'P&ke0M-z&;;rQǴAGK ƩPBi>c MUzя^tzөK .܊RtzY"v.*6*T}L PiCQ_3}ԧO{ſ^y!uczpI{dpK_ e PDA&3L} zɴQhޣv Y +C#D`Twld1 CԣPv2up`$ |ƚz?Aȼڭ'Sj!y+&QTA z-C]50*  +PEw]=&Sxē^ʃ:oQ8J T;=F& #xPgh.{F{Fx!1!"z}!_?;OeL", e0L݃ጶPBC .hm qa';0hGl zĝ$~wcgz\`s;EQ|Dp#(x$T7 &N}(nw&p/Gp`U|(b+Gx'dkh "j{ܿkb0t+j"NӋJy;`oh^z\!}2|!؋y׭ގjH~(b]Ȗ@dqSCtEOB?JM߈&M5읇Pf=\yk?Dl ȭ> +endobj +253 0 obj +<< /Length 1341 +/Filter [/FlateDecode] +>> +stream +xen$7D}UE/(ncVKhi{=ABJfFxx=|x}|mXǧau޾i9׷tp~\_}\/~xr8}L+4w?؞2~Gu|ӲOsuYn[lYo )Y O|i| +n_ n{ 0jȉ0[VIuw˝A۪KY۴ONVwVЭGB[u'o o0ajxBN}0V4rwZ,LUxA֙B6M\8 $x.d[K7U׭J0{(Z_WޜwXUag)d~ꌁ`jH:[;#d!"u%`x21>Wv&@7Y[NÖXx=V&" JI ro:7@FPH/.+Ë(d~Tm@l Q oڤ~BrɁLҦn6naPnzU75xqBA'WܷyY!x.z^^-JB ްClQnU2N؀NmE)S({@fT`Cb-e"e=;eM]e2ʞMc&jYu$$^ oy)Q6P, JGc&s9*8ͧnpe(Ԫ:(e$+hv vR-vbcS@;JYV[J)Y on*UnG]Jg;7ђ [2ST +U]:lXyřǀԪ(1DVl[dG-pUQq,UV鱪3r:MS0PCI֤@Mz5h +zjmIiwsgωـz2=5-G0+&udRY}W. ̕[{u{OB֛@ppf7o)gېtn+IrNcw`$zedS;p jV8Fk˾2Ne ,֙P~V׫}Q+V|D>^ݗv71 +endstream +endobj +254 0 obj +[224 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000] +endobj +255 0 obj +<< /Length1 11368 +/Length 6536 +/Filter [/FlateDecode] +>> +stream +xX xՕwFm=HlY,?dY8۲e;~FƲbYR$94!Bh-t[ʲ +B mo]`wxϽs8!J=s93#QC!+ś#FkTB)n׾WU =}s }7]&~4,7CB`yض롙6 +`$2O ׂڟ@)`IXzAD5paDEh4S=9!ER%5HtPzFz6d(;gc.20l*,*.\j,3WTV!sƊPmݧ/>;o!0Bt~=*rwH|nbUejLFxNcKҟwthE ZUz@헾)x+YCzO4sh?RUi/*T[kUi* Pu{n=R:#p=7ap};KZK2؀+-ՈC+ᏸ߁n2ʈ-K* !_6CCcc7phf&f}3m\!DzΡ$f|¬1G~p|Kq) 6a9, !Xd.*4䫊긦델O_aDglu;5’j}Q]U/xxm"f5j-RU[{[06l~y}~@{t`pIL4 mxEvhE +us Cp$ا +  52 ÖRppHOJхuo Ϝi?j@VfY Ć Un6JJ*3(N[]o$MNg48_X7t@mUH*ì W, +5kn5m66:v~ǕJ?ak͵6C٘]mVT} $T}fP`nbZ;Ro +?`9%믹#<׉f~SV(5WS Lw?Ս bdK.tiiڜNMKegA'_K_^.MZХ榧NV.E:˦8ץ/iX=kpMM⃀{]P'2CL&92dUYgwrlSSz?C_5 ܲ=@d8Q  vKo)Nϫt?~gg={jk=K{$sar<Ǎ6j fmM}[6nM9${7;Ouq4i%W7h<|sǎ<~@6IMO=GOX(Exdq'q9[# o5SnLҷ&s ؼlcҽ ~I=f_+ UZY7fǍe}zwSۧ?ؙ\s<:֎ץMN{牍{is"AHW]>&n>>ΏvԔ55&98q5~U0o5K{Wov{yV_I9|{ۖJ[T]]͖6- o*"_/cz\X--.GOxW׻}e[kTTԙ@϶'V+]ȝ)Wkϓ>#&hEa=kUH**{:G&m(-O=uOVֈwg,wR_(Ki Fl&.RMJܞHd뮊R]R)~-nA-V&ա΋b8r,Wu%Kq>+ ӰjKpaA:\ZhD +}^_Y%+G͛>*,jVll3*vXS7[̺\CΚZf3^` BYKBq1+Sjrf㥓J<01Ώw<8E&v2(H#6fy:vV6[~;lߠPZyy%$JEHM`,dZ.뽔ynrjuTG.cƬ3t^n~+>1>gMV=& 42gMg%$& Kܩ"=^4Ch)/ULep懆C[֮q.wrnnUyL1O*MkuOG)}|RXZZANC{uuSS6MYGr\欰K93݀.%"dfd&LM-\^a?p@Gpjdb{ idw8adwKJ\ AL;t˄eНo>klj^Im bLnض!s"'dK-׭[|(֝ e+ 2Ǐeh NRZӨ`3G2k4iX_5P/QAG~zJLS8m4%OϚUޱwqy_,A+h+WҰ-[A=\`aJɵㅖkI',pش/3~%RB6?I^OCyO +~z'b-_/r(w=ww{b?W$* +z)Ug\A3@鸗5eHC3UjU*IuFN|b?_\8Y82#(+EpU Fʁ͕e;< 5xᾈlts7B%ނ}aT΍<>6p0 XFfΏ,fdmHϙQ:ԍu+/sވ&k'a^Fyx e~K@¯"6>M>#%=r>cŞZӑz2ߌ 8\ϑ}O*89N5}o`2al++ +!|//_' /Qܵ*G+'Г1ZVzx%`TAxsy;sH{ ϡ~I󨜿ax4?h"Q aBag|(Wq(Cq;!;l\*SGQl<e)Sx`+qL^XOnlg.}b8 JSEE +KEe; V +1W>aC*j)w oSOV"Rp>(8택&A(w\BAo }Ej:ABBGX7"Wlrv`( # -ŀ Ɖ ̓D+!}q=A8Zidd <TFzC>SHU'K7B /ǀcHہiA;(HV dK@s_4=uc8OR !;.1"wV=Ϭfw"Evco?{\dpiN"HzYz ~>fl-x!=|h3ѽ0 @"01eAC y)!…Qi.@Y$4(AQu #MM!{۠; :[C^'څ&l5 +q_(,F"$B=PŊ'*DB7 )O _lf/J[D @.@t rXc[5)XP ҳOT%hB a$5f^08;.@\r #><5R2E຃4 B[@ʹOzFb'H= Oog(-q{zaRi[kډvl#uuߚ*}2>`OU"׫@#ZD(PFPe[ T1\d/н\~b!%ރGdj&jb Bш)aoyo㒰h1Q$<uMmi55hU.#]tuvEs EW!"@| S b`A K~prcue@@򵬶 EЧH3D(TI~apq&E ڶC B̹.7I+$N@!&}B.7еEIYȌH0 UI=LдBЋ E(⠔b)]\U5)ƥ#"#Nc&B;I f]k$\? ~r\AcfgY& lb)/ +ROॉH.jhBG4TYg|g]ťϾ0Tay mqm[f:=7J&߽j=gJMBs/vӊ +endstream +endobj +256 0 obj +<< /Type /FontDescriptor +/FontName /2e7566+KaiGenGothicCN +/FontFile2 255 0 R +/FontBBox [-1002 -1048 2928 1808] +/Flags 4 +/StemV 0 +/ItalicAngle 0.0 +/Ascent 880 +/Descent -120 +/CapHeight 880 +/XHeight 0 +>> +endobj +257 0 obj +<< /Length 1286 +/Filter [/FlateDecode] +>> +stream +xenFὮBtHs&@nu{stԒ + }i /y_!ut~]snVyg쾝+|<.÷}v)[eO/_q9_ɯ}ഏOmt_LLv͵LJ1w9)e6=nPҪtN*eP)DT.ʕrU)BYTVʪQ6[ky ^#k5x5F^ky ^#k5x5F^kZy-^+kxZV^kZy-^+kxZV^:y^'uxu:N^:y^'uxu:N^zy=^/xz^^zy=^/xz^ހ7y o xo7 Aހ7y o xo7 Aވ7Fy#(oĻnuW.I$$*I$ITH$$QI"IDD%$JI$$*I$ITH$$III$$%I$I|›Mx o7M&Iބ7ɛ&y$o›Mx o7M.xyUo ުMMol x; +JÂ31x; +JJ특xxx+!ÊwBxbx+ށr;2kΜJYeY7+|x oS7+[ƛețךyޢoV浖 -㭌"RW*4XqC^J[(^1»y]k}YM-x Vz[YEVY_}/7*Y%eӫq+:.7JE/3Y(Y*AW RVJS:(u@cD]a*f)9J)o,#\Z>MU\jPS {HSMj{fkyGm[z*Esa>&ӫj%u; 2^W[®v[2쯲u[P:V̡Յ> MBi2 .Ħԇ!dk`=o qWޕwdJF(L164U)x0E~Z?=/ί~:o?$O +endstream +endobj +258 0 obj +[224 1000 1000 1000 1000 1000 1000 1000 338 338 1000 1000 278 347 1000 392 555 555 555 555 555 555 555 555 555 555 278 1000 555 1000 555 1000 1000 607 657 638 687 588 1000 1000 728 293 1000 1000 1000 812 722 742 632 1000 635 597 599 1000 1000 878 1000 1000 1000 1000 1000 1000 1000 1000 1000 564 618 509 620 554 325 563 607 275 275 552 285 926 611 606 620 1000 388 468 377 607 521 1000 1000 521 474 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000] +endobj +259 0 obj +<< /Length1 10932 +/Length 6172 +/Filter [/FlateDecode] +>> +stream +xZ t[Wi*K}yvY,}%۲Nҳ,[[vHC[%iJ) Kg(Sha:Lra) BKcy{ߕ)-tt]v>#JBF$CAܓ1!.>#v7tv=0ssҡ/%0~znNp$t0s,>g`U5SN` YE0!~Ox_\ø`J~d$~'AR\i*P6#SASPXT̗j LW^QMPeD5#C%IH(,KpI"V'Jt%/{f:܂cpQB[b$K9GbXΘ߉$F|cbߣ:KҕkL5YL\{$>rҖ+ +* K~~us>?pmSjYIgs#/4T +QbZyi5ZsxH.-, +7ŞN`9w5~=x Y +yķ ':Ǜ[KKM;:2JvgKϫ[[[Z|ZӸ+ 2-`DT +0Y ucWA۔p΄ GCsWLwhGֶsWuow]{\Qj{8z\蒄)\+G3/-W&osz+~TsCh+2ţμ9ҙIt@:2=slfWLsW^Awwnњ uOԙk˝œmu\mlVrm&f[mԤ0vIh<а]>b횟־=ܴ3n=ȓ ͸K\6KDj0!U#QUh3LZ|&+53W!-f]|r[KÏs/>>ip +!/x"\܀%۰=)[F,co'ܟ{J%+uɌz,v:G쑻93(!Vɖk8=pSsXuVC_n.uu!+DO!ä.QCV;u第^<ͽ)֮yG^B;]qXSlSY@|,ę OC{=O1iK{N~;mGv#9ٳnkg=stw/.vvtt..vw\Ad ҳmX%ѕKc/Q6ʽr[sm|ב(g=nd!` O#LDrN,:K۷?VkS.f +m)L_Nr]h׈.XY9>>9uqNE]{T vs +;hq*Noq ޲o^]XX⸽rT̫ۚlivj4[9;OLc*7Js4ʀ_49rd r{dB T%O/x +31O fO%>SFVvV>$ILO)AO [KxnZ'[}AB31aET^bdɸ]_YU;YS0;Ǝp]%E%-A"a+M HRç$N/ }͒elhYo`'#7@?XLJ'mkՕt;畃7`lٿhYUb %5wlZC<~s]B M5|iDixݨm~Ի ꫆iA^ *\0i3-䊧,fEojm7h֡Yz'tpM;Z\ i=9,&Zpѩ7ג2z$YvC wʄ1ďd|]ulu_V pWP׈|D0Řo2wN˟:yD3U9:ܢs*t: ֏-.+ٹc~jC[R;e2fNC\/0 66]ZPϖ @}ZNOL|y%#g]cmо&kdY=k;ujKnnn )㌫[೥4;qZEn[۩t^w|uIRE%Gdl+.7=lKIұ݁mXw)8gf*v3}evV{Wځi7o##@222oUگ6hzRah`4 UtZ7Ne,<^- T!ws)lzylhp{<1s\e]L86viJxENV9,w_zdfcWnHذ[ +Ʒ}S%cgQ}?t5EJK-llUۯMm+i1\ImXƮ=ƺ EnAAc-K{$ќkͻ )!ְxtGnْ[^÷|3g"oM,hb3cS5˂}=;+KRK3xYgn|x4}Hyzd,d8c,Ջ/|1EH2BG&w4_)OHJs:NHRˤI 7lYq?Z2?kbG2[LEXz#{ȶV IF͒`2}%A;V $*"U)<]]u㞟'TpeKwyXzYJx&v -Uw$mþ-oz6qat=^oťsu{{N"Kf%7J.H"M6I礧祯Ȕ6òdo3C{o)u +:H^D.K*q~# '%l>)*|2*Hj`x iͧrgaJ4y%Uؼ +2U(Y0*+fR8ëT4èQ8MǴi5)IK} 44H +MAZ (1mђђbedCCieNp(#+ #}/0e=02HQ +3eT #E- #C) #CFaHb9*Vy.rB0ez*JU0Z*`߷mRu6͌6՝6mJW0Z uBt1 d$P0IHO008Ð3L2T0)%IA +IA) y!r!}#(000ibҟ`?0*waH?0*횎@p9qEcuf~wo {?orǂ',V +osf޾0wB.|. 6UU-..fp|Uz~G:?[>ѐSx{¼.-?1r*❁?a@D(<ȍPٍBݎ0Q/ +C_,tGȁg-B]2@N۠~ p(€<^x+&TE5"@)}VAw\I"@ţX /1n݀SGeс4:_6?"~*_hY"-g}=)*JOiHIeS<mpxz { {o@ϗ/8;΅+!Gw^0"_nqD<~=@v@z=NހOY{L fdw^#E'C l_~JSD&sOGz+D"{ /{ z-$>пI؅Ĥﱩ!Vʼn˨‰U`0fXqBG452_jAc==>!!И)E, ^#%M 7'cHۃp=wR3N/h,J'OQWN& =r|g^8n[TB(o,ݿ 9Ob&{:R`Gx _KOJr#@+ТB;@; \K㹢3d5$w |y0rivFۻBw 8$r!!䀈 +WI&!aGı{FGm#}<7z S'f%˻AЊR }ԖqlD.>LO<ً 2}ƈ(x|X*;C`$l{@]e\  y O։O,WH7]Fzs rrPL[pDpx93Y_=€Ss$d:?a _>!|WoDG2!.~@XA] O?f<~Ȗ1yy{t&Dhs#!? +;!L}!x [ܣsF%MAEwEy".g8a(z9EÇ0.}aG ? \FMM+-ΏV.Aϧɵn= $u'!(x= #\?/y5dyR?mxc~geVxP y_4R!Gޗ.@CInotgPn!q/x.Þi;Dɒ߰7o +%K3Gbk1 +endstream +endobj +260 0 obj +<< /Type /FontDescriptor +/FontName /535de2+KaiGenGothicCN +/FontFile2 259 0 R +/FontBBox [-1013 -1046 2926 1806] +/Flags 4 +/StemV 0 +/ItalicAngle 0.0 +/Ascent 880 +/Descent -120 +/CapHeight 880 +/XHeight 0 +>> +endobj +261 0 obj +<< /Length 1286 +/Filter [/FlateDecode] +>> +stream +xenFὮBtHs&@nu{stԒ + }i /y_!ut~]snVyg쾝+|<.÷}v)[eO/_q9_ɯ}ഏOmt_LLv͵LJ1w9)e6=nPҪtN*eP)DT.ʕrU)BYTVʪQ6[ky ^#k5x5F^ky ^#k5x5F^kZy-^+kxZV^kZy-^+kxZV^:y^'uxu:N^:y^'uxu:N^zy=^/xz^^zy=^/xz^ހ7y o xo7 Aހ7y o xo7 Aވ7Fy#(oĻnuW.I$$*I$ITH$$QI"IDD%$JI$$*I$ITH$$III$$%I$I|›Mx o7M&Iބ7ɛ&y$o›Mx o7M.xyUo ުMMol x; +JÂ31x; +JJ특xxx+!ÊwBxbx+ށr;2kΜJYeY7+|x oS7+[ƛețךyޢoV浖 -㭌"RW*4XqC^J[(^1»y]k}YM-x Vz[YEVY_}/7*Y%eӫq+:.7JE/3Y(Y*AW RVJS:(u@cD]a*f)9J)o,#\Z>MU\jPS {HSMj{fkyGm[z*Esa>&ӫj%u; 2^W[®v[2쯲u[P:V̡Յ> MBi2 .Ħԇ!dk`=o qWޕwdJF(L164U)x0E~Z?=/ί~:o?$O +endstream +endobj +262 0 obj +[227 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 370 325 1000 589 589 589 589 589 589 589 589 589 589 1000 1000 1000 1000 1000 1000 1000 641 681 657 1000 1000 1000 1000 757 330 1000 1000 1000 1000 749 770 667 770 682 624 625 748 618 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 591 644 527 644 581 372 597 640 304 1000 1000 315 964 641 626 644 644 436 495 420 637 576 863 1000 574 511 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000] +endobj +263 0 obj +<< /Length1 19020 +/Length 12611 +/Filter [/FlateDecode] +>> +stream +x{xǵ.@ B$ @`iEII$H$HIQْؖeE].ȲqIlǾNqʼn|e7{}f1;{f)93"AdĂ{&C܅ c¿8]EИ{kΥO!'fd &ށ uuW.նdA_W,< P~yR ŔvK/a3ݲ)joj(sr? + xI1*_C*Lk!YԨSSLꬰL,AE*\uGL39i*UnΪK/%iȲn Kw`S8 Ԇ蹀wjV'Y94Kf`=A|5k+kg3߬ed@33ZCzppo'\̙bDnpZbGP6E|˖6-)MYTɦEK3#bST'*@ 86!;3gʛm+}Ubة?:|CxGF "a]gD9 mM_(4\6}A(c ҬšTxna@"gH\Z=*Vwj%E)DDt'0!Z$BJ"pf4(MPov(A\AI {p?eŊ="f6xD1ePqrusmx[#gXӱC^ ,U-g}hn&ܽb d<^D'"h/yh>;yF/1sɲU!tEPAaUnUҴwt+m\vg&$tj_kkWH:= %$A٠s$ +ښx*=5{~9/`0?+$).j')|dKgWSqXa-`'Xhr76 dU=H^27l"lG5=y 4+-,0;B%P*= +ݖ ` +y1ʉ- CYoml[FXĻL/eXiIV[`4I⹴ +%k%{ +ww̕c7|5OV'ъBVjٻG5j[6pT 7R.@r5R gG)g,4dFN1eNΓ5GA'Z,,b.~x?g`<{MY;߾K'u4J[rP#LmH,_'HB*,]7@V-;|+v\^ߣr%.n}s:]u]VuBdv~9[(fv k "Cpi,+fL 'Ăg9PH%1J*24`a\HY;Yɳڪ-jfwU]y|_d(W\$>}5Sl u೪#Jo s:6R S y/MsrQg@(MAB>צg,j?E"m$IݚABú5ߞ>hki}1a)ɿQ^jP{uNl;mt(/|S_KWWק2B}݆+6w +f)]Qny\+!Xu3{l3;W&;~v÷^a-P^5FM@RSğFhU9u(8_uV0:?J_9,|>uQK ҁ@n3qOY6+LU`|҆ +ًd%M9R^NRvA%N]2qpU}{M/}GEPN5$ r%u4 \rAԗ%d)EYe ߔ؃ԶLiҶxk״%y{6l}QSlEPFfICUL* D$:&p t2":OOρOACb׃hQ;u l=y \úQ>YpأҬԏ/6A I)lpx~!Nc$ʨ;Nr(.-CHOA_BɬHrHx)Z +3湪TYk+x <(d5ɽg]϶\BQW:WaR:hOcm \I k 8҉_E%ouΛl/M_?T6k$ōubamx7IY[/,fZ?a)hGqqX_RHaYQ:E'Z<'UƮW:oMn\($LL.-7.݌݈u`5WfU9(|=OI{o( vp|Q$͙fNfpˉFn;Lo[XS= Rh/bC4爆Q;uW%FdPoJƻr۟qW$n27OcjjE–5FAVF!uRVugj +kR|ˢ]4mshT{r<\XmrSZXʩ))*he}yr~uT~Bm L(#U%FriK8//\ +!֕ܦOHUڮH5Wy*TUL~Y֏\& Uum[I>v권**DsjC{k4JINNޟXv Uik%nm닚Te;y=Jk\(eKuYEJd +ҤdZ|uܻ}˵p}vyj>iB_V.I̕KI-VąGDM[ZV(zpjɍOM6puC VV a"8@<7NQJdmI`}嚼Z{ℴCYXo.#,4n;d/-xBz=7DbfY~IEx0 + %Ȇ-쪕FbZI]j1[ٓ^M`.Pٮzg;Sׯ +=p}PPXA>_w`ѫ >wOaX/J4l2ϋ؊s{}}qByPuk[;G7j?_@mթSךL!*[2m2kVB7 asꡯ ?س!Qٷ"ܺ9B-ک[WAY?$7 Ulg;l쵷^;qapt]ytNjC"A -6 &xExUbSgAl_wAY81kb,ʼ;_IaԵZ; +[ , (\Z扙 C b]{c^Q !eoj((?<*]:g"wk Hyllir*u,2;'apǣ{eIjѬ2uk-vܕ7wmPjMr 9Vvc,%E|J3CO +gdcӧs]OkPcJCe ƶ?16aLHvƢbPg)%pͱУۉQ;Z1u(Rbe*] :"@")t$4tYRt.r1ov'P8(ԚT"p'GE[J\r,pp@qRv`~X?+6w^!Lqw,!0 z 8\:5UJxIPg:<#cz.2pI/4>}$ओ]$o ^4|Phk!NVn^G{L͘I?5y-u1-)qtʕL#\twUoԉfH>ZbtLYyn^4qSB!۟/sXuπauaI~"_`Pz)+ R3;+zԹ55Gv<[aΉ UsUzkxBT+q4߁k4 /<"%o[;ʯ;hn[Gom^aC-7]h_WqB٠+Jo_9hDɃ'/s6F +IwPkTH夊\l+W=L ֎*_*ҭJjJ;r˫Z&o@٩m5)U]}yiP]gVnku5FmcދmU ^a)R)kdJ''O¼X='p.e5[>7q % PԬ4 t5&tnvoIm7~>'UG^x%^sTXJWtR62`=2r#LjjkXu?rJEC({/ mL|}#-ĿP7݄GD{!VW +0q|($PO(~K|v +mEC1iЉت=x@Ν*Gb3i&BHvuI(M<# +&IH3K S}2 @dC~s,>zmb#el~+[Pv1(2T)oGޟ̼h+s"b|"Ivwm.V~#dk{뫷~Ǿb)ĕL6,F Oo5n>pr5T>k ςT#\ ;uG$9䜧#M%y)Xª6w/٥ݘˇr]NI W+#WVqq& ]}S 3o)MgjlobD0ߤϔSN9hYT TbY46qƕmrw /'UQǦˇ#D<$:41{*#yy˅n<8{zaH.kbgtՖ@OVU" zBH/ PAW7ƱP;| 󎰗s͏b?K'@ cVÐ/*5:j#bX)~⹣w?2au ?o6ߧ[ӛX{6wuw zCmUېvG6ywiIcqͱ8*ޗjkafFz_J@8K?~|1 ݆vg 6O8?$i#i=;ϸ"I^ /;dtg &egޛyVx-Itqx BɄlHaQ02XH`{Ӧ^l\qEK#3^,JX4 -,ya%TQ20(cɺ`h0d v=΂X cq`˪bوa#&V\ us= ye)E=)biOBIaړɄddG L{2HN™$=9iOAdL{hMekRn`iiOG;vK̝_<(3w~#>/:Su^Dk,xq+I2}ӗI1}-L_^E1:E{ qdh0$Wpyba!I<5C3:^>C0аa6&D3sI@ļ}\H HWL_ar`L_ӗ/SH:_MD|;7똾H雈dGЂQ/6_$#a&24)4CC_ehRL M*|Y&I04HjF&C$f Y34dФz1CC֫pa!k>{'ehxŰob2[-E&j}|A\9՞ШYD gB׃'љ$3Nވ7<B(xq]Oh.<ՙq"oC I/w=Q=0OXh. 3Rd #>dDpcE,H!Rsxk"i&$^x#mT+72 aE`\2CL^ ~p5aD "cib[1)cT|f޸9^8 F` #h 2HGP 7! qLw BhɒܒoYєۃOC(^o>5Bnk;^;GZ>Qs#3CvP?!~3}(H}/Y G| ^hXfң,vK h) ,cqCP~dRFmv4v gbh:w445V~tZ&Ɉr:3Q_Є7iHY Åtޠ?;XP 4z:B~?^ +悾18E [/|J2N{ހ7p7I#~{ -yMB\3BBl[3xdiJεH R@8-O4u9F%AR&}p /e3ZQҥ)gS1ՐFƽ{ny ++$b0Vĩ9ʮn({?g^D>␴ oEo[<[) >sLhrS« +*|"ɖ(eeaɱ#pT7gC]،i\3Дw,cЛǢ&|¿83GQA'-Ga7(37F6B3kwGQonƩ+zٞ PaJQ |Bz73md't)KR#S&;J !**F+~wlV{;PuSfS& ?|"mc?ocFCL=6G +}'D?'4]p) F  S܆w@Rm4 ?; +"GHD {xMuOs om;z{n5xksG 80F"8 4q^=Ȍw7#Ō7EȉP?R'H ,H0E0U3T$Υh=vSS4 +0$nFʣMm@v!<7F!WHG馮Jh=T,u2x臵^hޝ{jhgT_I넭uTfN?ku2@s3EcLݷ"z x SV?g=L*f?+N!JD>cjIWZ3Jqh?qH 2 A0e#4Ot6oh@Ad,웉F +Ot6}"p.g(1S\79 I3C>W{gh86x9нh.?F 74MBM@К 67~>A§7 m ?ۼtev"޼&vZg"ԷRB=B ZFa{F#Q_t촲)> +endobj +265 0 obj +<< /Length 563 +/Filter [/FlateDecode] +>> +stream +x]ˎ0 E +/AdK,0PL7Y[2p<}yƕ!%^_˼ׇ5x˼o׷-q=y^e\8/ǥ\뾯?osN:|2or~d}z[?|eM5 u"AݞY,>,~W[]7t|[۸RߑwqV,f}Zv軘:H;u*6Aл ] dٙى2n4(qMPnI Fd Yv9nݩ +OVxg0X)-!ۑ ,[Ƞq +6 i +`):KdH FΨ /97'Q ױ9 )HkbX%;1݄jiNxT +>K .xo!%l /*&F)@6HLxHx\Z&SҋU"zFەK>>am2=::6yᏡ^+- +endstream +endobj +266 0 obj +[227 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000] +endobj +267 0 obj +<< /Length1 7932 +/Length 4729 +/Filter [/FlateDecode] +>> +stream +xX tŕѯmْlŖ;Ȳ-;vdْ-'lْXv^NoY^H2C +(4!&<e m ipJ9I+]eNx$sj;wܹoBiȌd( yy ,@y!Nf8 t&yzPbc05[xoڧi{ʐ¸8EK"zjִ XVD#ڇo1w8 ǯjFH! F&Ru`D +G%T&W)3To_'xv+w"Q*Xszϗ`-{#?=4ӟF8-rg\ /4q5 rrgg.UrNC|+,Ak+Juآh-EuuX6k+$_M'WcWJ6͎1UDP[DKkJ>.Yh_;2/\Q=Sj'Ԝt]8>ݟt@U0>>/{Ƿ8[l8CIJ~DgUxջp^ml*ͺOpdq ׊Tag0( 6͢5HdVo` +ɾægkTg3VtW{PsB8iL|یo͔ n/܆ۄmÇJ}EyBɓkBԅP\¾dRFrKUn( ˔YF :6xq7 94CcvI :Im~zAaAAՠrmLƄN8=;,: jk5e mtEx v]5?}G8IƉ?ߖl3uOqV[WUf.oO#$Ap=\`'2 Z&u6}rK +Vt5յbӞ|j}yw1Gux8A|[ooZ`^Y55YY"i̾̽>P#-B#hWPg_$'-*, + ^QpoދnI{FؽTC1 Nl=suo{U{s\9x"3gjZhhqM7g76]ٌ6_p,9oi z9U8=íij |Wln<4þ#Y͞".c B߀cֆkz]W5?ސv]DcUJ  ; V1J! >%$}}wkCRQQS]!,F r!A +Y3!\ 1@5/\{j=?0%g"#Gn… SHiUʳBPRyź[۱iߡ+8 *:۪٣GntYwSmfXUUOTJU“bܝ?KqPAYx>O<I[9 3/]87~Y6 +:=7#?徔̻U7mveY\+q@5ʴza;ܪ75xFgR.YK̻٦RCq?v\F<ƑȺza r⫳87P.Q@1s @aIVGL>??FKL?P"|:$|)wy7SһvyRP*M)# +e _[;`mB쿁>]!FP;T0,b3#Aɬ,'S,4\.٩[rxC;~ĥi>rxpJuxC..k5scJQP+.ˡOzHدƻ.-S-֐S^efN]Y\ќ]4_YUhZ_YMe-;OcYfSs3bg}uwK ge'eU_"~ :$Su9P@xV C#UR+tlRϻsPwr祤U{=iuC7|\噏Ӻԭ5ݵaUxM\PnȠL[?jAsmT9lA~3Ӹ +nz&Z=@_Fs’,R2Mfxѫ%kQkŭX^pW%ㇰE-ԩ&OxI-آ^٩^=3K;iMVKUGwF ^QC-꒖6j:^j6nZXZ+[H CC,T4ZcGisg@cE- +Oh +_/Vjw|L&7;«}96lfK28\ N޽NA5,.On3\H&))$)FG9y(5G25wnIZJqnjt-,t~kRNۗBW嵩32ju W,* =Cahy9U&CnkYо^*Uh]UQDTjJuN1W[+黖t&]0)NbT)0O<WE#!ecDtiUԔKLHLc󱫀 'H|'2FIvH N$!olDFvlb'y@ᑪHD`&F|p"&@E(ȏP(3FV/sZuGx>#_l֖!/~ |`hxA*AX^%;`6"<]ЗB}sLleَSIVqxb*Q8LbA. |B@ O6Bh4w.iY-]79@b5cnm퀅8zɠ7:ANnI϶r '{DA^o +odҳsBBr,]HT /sX@akf@;=3{r}=GkuIm=i7ߣgtd"Bz\ךN;!eްǼѱxyNItIY7WO +H0J>dMd GPd4SpG$$H(TBU,)%nJa3)d>ȇp"^I|"t0r4k\pxw]׭Z:28y)yM!6L) jeɲC,H}\B)2xR.B ,,00^m;"#?ݽIf&z#$dVBdڰ;zίщıULCiQt'?,ɋ!9p,+/oj8ۑR e1@*;R,} ytkD:d2<“h,2A48 #hb"Dc^@Q"&^aw&Q2/cpdA0A01{Yapi*1FDau-#gg2]3tˁN+vމ)1Uݟډވ ?K'2X†$㐁+c,%{\]7 +e]IJrvTȥ␰'iFNo=)"t t~{πCz5큑{VNWOk%1>'Ph0Ŕ/+$O( G^?"B8=6pP [)/g + b + +endstream +endobj +268 0 obj +<< /Type /FontDescriptor +/FontName /f54632+KaiGenGothicCN +/FontFile2 267 0 R +/FontBBox [-1012 -1048 2933 1808] +/Flags 4 +/StemV 0 +/ItalicAngle 0.0 +/Ascent 880 +/Descent -120 +/CapHeight 880 +/XHeight 0 +>> +endobj +269 0 obj +<< /Length 306 +/Filter [/FlateDecode] +>> +stream +x]n <]]5!$R@$ ߾3&=@~7 ٹ{_x&6<]>zܢm7,Cq ]pe'; Ȳd!p_.R܂F/:xż_j*>|L $.J:/Wbp['& w\ɺ(BS]£UmaX +KXѩӄ'5֡V,pMIbjh 5b_1P bs-qJB+n{OZ} .NT~b +endstream +endobj +270 0 obj +[224 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000] +endobj +271 0 obj +<< /Length1 14476 +/Length 9401 +/Filter [/FlateDecode] +>> +stream +xz tSG`[$y,Kؒ%/ZȒI~66 hH1IX!+! YL:$'N>?Nz {N]zUuF%"ĢIL6 f~N=B;61e}.9<>cWse?>>K@IJ2k:~_cɫ?u0YNn]B]0iLq_A ܡ{ Bv= #BЕZ +bbER&xR]\i9Qn^~h2XJ6d/+r8yT)Gٓ2S2և?9{|r'GB/?}OC/%rcP#@D7ZNZuZ:H&1?T/B} 3o`K3\0DCWFN!Z+vR3pH)UZb-cXǿ78檦m U`pfY%`>Ji\om/hxFɾ{wW<@ۦ__mNTǻ2D b)+,V*0@p*-1ssRQIYKIGjIͤpSI`_Nfs#Cvʆi{mZmm5uC]wsOV[)ے<0Z2zf6|+G[;RWpi @@{(Є jf1ZT`A%[GeqrT6(ZV;^tDr bWMԟ]#ggʶ_=#Vwqf0Jho~w7 ?:¾;[jw$V]:v*TcHMev, +*MҒuyZ)1%H*XhBriOҵLFmGѢ-UO||zZ+Ѳ:Nf׻'v:i_^1oןYɴSϞF~2`LYZ? .6!@,̀1Gb$|ǔwKSsEQ!+_FS XD,#5^57N[ [c@jGik_G1c;e5\Ӿ|C5fˊmp=< N;Fu5m6q5^ucMS:bњ G-vۖLJkָ6FO-O5:99:5X^ks5`1_gAb;F1hH41801ౖ& M2O->62(Hht +qu:xLb؇h"g%*2sҸ5R+ȵ4&6"\  Nqr xqC ns>w4x]xg!6V~Ž1[iӉM-ejL[0u>X9>w8ΪP` i 4cA6B DePn{cčۂ,TSP4&dqf0LxLhҖϭ1Vϝ蟼%~)ؼ5TYSp&d$8^f?Fo[4)EϽA/6QDoйbD1$rR Ր vImU/WgQ'[ɦ@ +ӻ6:@e='F/Ze5ZI򜲎q~}{m8=LgNU?7Z`ja{>?3jX&_$<e3Q8T Dd "^na/_x +Y"Y$@Hy"C+|_gBc7+ m٬O!":ÒB aϻ!3psΰG8#,TإW- "j;,ŋ~zs|9-=u9MR5X !IQiסJ t *>)"wgD5ESO< 1 t5 vP)F('mhH*+*[ ET]PRˍ%p DtEHI  +t 30$ -bI-HA>6( n܄06v#&sd#\ʸ&eKYSEbuNKw|pnswpwI> 8u}$d{0J bd @?\ b}-i1֬U)c%,2`4\PvK MhDԞ&| 7yfÞ8{fu 67fe5Д*=~2QSǖc}.}B}AÑ:**kE>I)a Qa\tQO6LV-LD{7nFD{+S|@w\Dry]ql?.(=2&UB5 !lrN'HHkDRDC8T3KG[ǟjSKT]%| Ẏh|ReX+BݮRR4@ ӑxAI8@"| H/:N 7"N0/SG]y4%G3gGO[c^p~a`bzLnlnֹNW-iE))EV3؝6lw ~U +Cu:<;I4Q?謉aZA.O [b8/7S0ð7ʆMb}1o 5SfՒfwN^fK8c/n=2d]ڿ{ܴD?ֻ?=^k\3y'C^'/+/ "5/Q+U.RRؿτa^vbyYkl"+&B{`4đ0sXX,;p!{7a AYk֟ i*|=A^j-N, 2cc*5~v\(XoiM&4iUBaս+4ZQ<)G̢|SÛx_MF̃Dt_5>Zx8c@+v" +yR`ѿz$ZS*H7g{ VgA +K@(K#,7 +TȠ#)a12,VoqrS0NW-EjY,S|/ #GP&֡.]V 0LCi +ԴUG0= |`8۳>5^jvl]+G;aHEHmٰbu5??J"d%vs^m;Zmsmmmz*w'?WͿǧx~xTMqqAT!12WhMok$ bb ߜ@wKVG\$yiTCR78m[:c{lDL긦v]m3\8㫂e?n&tkjH3; *'eh0Èæu<U"a^>BI 2,dԮR4!=Qf1$ +1%J^۹5T\^"~nX]?WZ +MWem~&2 hcUΙ'8rJoe@|S^b8Kk5knCI]0VdiJ4IJ{ۨqgW]y{QW,yY9oKLKdOHn#a1`4 eɕ}=-XtGN 'CÚLag ײ|蛣+ũ8`2I}pj= +cthLC(4Z̳D3WE&Ʊh'.I"~Vk˺ۏd_}T:ώ{@##' D4RzZWp=Ro7C ?±n7]tp$*'覐I>`/RG~XFdW|oLboCǡB}τ&??OTJqT6 ע^DlAUcM 3kDNNH-EU_?WT4%h4kc2k2H\ls |Aq-`Sf%i]PL=H g6PCc`d(rZ-z#jJ sR+y7PP =sa:ā +ki99e)J !/NYQ/OCVY ”R)HU4_lq+{&딍xurlcm5G񁽎wRh~=ZEmOb0CwiB%PՄ>-ۑ\H!'J뤁R]w1XT%S_*JB_1nR U{x\ʮ{/@W~#6|,Qt Lr-ފJS_ @dϳl}V'H%%OvdF٘eŴ>{5.#nsC&%&016/$uҡN^\|G+[og~6$6<$-C;zm hB3*].@ hB{ p"vZ#Ih"}@ߣp} Ch&D;h<+ЀGTm +Z-7+I'B>uV*M?nqƍ{RƣNCwNac<Βe(uAd![C3g>N tTCO2PV4|yœF%d$H@C`7YyRCZrj &<݀s1*!2r vRP#jBͨ6Ԏ:.ԍ֣^Fo\@ׅ&*@˦HBhGO#3:3#D,x{=HP:ΈKQ3D1(P*?ҏGzTO"DCeA,ڂ8Pk0?F`^ +5f&ڽԜ8 OAM2 " ~]Fwjs.,õz2* p#7Q0xR!q;48&I(ZQV ,Vy WK%FUpEn8G+QK8* /3 V9$(ai̚ ʦa"x ce*_QF"6,9jp߸1q (#wy^4F23.eM9sە|$= smWCGbзIz!+_pW|Y G;dςA`#H|w܍@DapU JqZh4\YhJa "Q1k`o$G&5%:5}ÊG43vD(pGU#Yi4f"zU^VLwo-LQ(3(`ab,@0`PEKS7BЀb/#RAYo7BcFz¿ + 2윰*B)bw7Aũ + +f`K ZUS[YTNFbB tی!@:t:8 qAzC:=tz L t6#0!0%0nl$0O`Hg &C:  :Ctt 1ޘث޸hO0a(T@o%z#bN)2A{tQpΒ:'G@/0T4yrو@t)۞Y49k !l(/_Zh5 +00ž+nfl0_ Z +endstream +endobj +272 0 obj +<< /Type /FontDescriptor +/FontName /771c19+RobotoMono-Regular +/FontFile2 271 0 R +/FontBBox [-497 -270 949 1056] +/Flags 4 +/StemV 0 +/ItalicAngle 0.0 +/Ascent 750 +/Descent -250 +/CapHeight 1456 +/XHeight 1082 +>> +endobj +273 0 obj +<< /Length 1286 +/Filter [/FlateDecode] +>> +stream +xenFὮBtHs&@nu{stԒ + }i /y_!ut~]snVyg쾝+|<.÷}v)[eO/_q9_ɯ}ഏOmt_LLv͵LJ1w9)e6=nPҪtN*eP)DT.ʕrU)BYTVʪQ6[ky ^#k5x5F^ky ^#k5x5F^kZy-^+kxZV^kZy-^+kxZV^:y^'uxu:N^:y^'uxu:N^zy=^/xz^^zy=^/xz^ހ7y o xo7 Aހ7y o xo7 Aވ7Fy#(oĻnuW.I$$*I$ITH$$QI"IDD%$JI$$*I$ITH$$III$$%I$I|›Mx o7M&Iބ7ɛ&y$o›Mx o7M.xyUo ުMMol x; +JÂ31x; +JJ특xxx+!ÊwBxbx+ށr;2kΜJYeY7+|x oS7+[ƛețךyޢoV浖 -㭌"RW*4XqC^J[(^1»y]k}YM-x Vz[YEVY_}/7*Y%eӫq+:.7JE/3Y(Y*AW RVJS:(u@cD]a*f)9J)o,#\Z>MU\jPS {HSMj{fkyGm[z*Esa>&ӫj%u; 2^W[®v[2쯲u[P:V̡Յ> MBi2 .Ħԇ!dk`=o qWޕwdJF(L164U)x0E~Z?=/ί~:o?$O +endstream +endobj +274 0 obj +[600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600 600] +endobj +275 0 obj +<< /Length1 9144 +/Length 5056 +/Filter [/FlateDecode] +>> +stream +xX tՙwF?-þ$ؑ؉Rr4XK($'MR } g e(dmaP`[nRpv<\; RzNϞJB!" )UYo}X|f⋯M}5q5"pѳ'N $';^YRR9[K ;` ЗwW>bW,+_7Ӫ<6 htȭzP'Gqp{mHI풒:WB,vOJT.9Ze[]x]^9`ҁf\>it{O>׳r>0D2џwBwީM6o87|k?tpwXO>RbąeE5(wwlOݟiTh}{:OU}Զ|wՆNfsY~z&T5u/rU;@ܰ {Qfq ~ x,ěv{u%e*N|Ca{eVgYŹWXyI9Y܇q`8PYD<%ȊuvojoI^ϴ۽=ho{Ϸnrk}}mP)XuX-w+d .5nZGq|-V 9mul(4K10Sb2` &ŷڷ,nr7m^]86=v[?eX5eu';1o#JheU~K=Wak ўkn;fj: +]"=>\* +a~w}}nEo;BYW?,`*Bnrjv-l\ŋN݀bie*i=0:@|Ŕ~=&[xu^/^x/}#X/~`o|!N~'E߃Ϭ+B +,ݶƢR`k#oiq-U΂{:Z?;(ZP!؋] `l6\L|_Q~/|]uwmۮo<'X^ֻMnA,}'f#AњóҪPˌ7tƶr<;#˷SM# 5 G[\Î%K|ΙW, 87LVV"`⅀6PaO0HY}?>Gxi7c.ʊ]fvt/g>K.gw?mدTTb>›_mUf邿W^ Iz@tנּ^-apU#9L6CΩedc{S %R9{jo 4w;ޞDϜ#_*뿠oP޴I`#&ecSʺҕ]|y%7!\ +_kq#Z3 Alf>bzf0^YU=wo`eNP腺sIk[CMr;ֵm-sh25 E:]b=́ˡϥp XU JsJ^'muݎ wk=8:ABq#xƲZ>G-F|Bo %ٹ *鿂(.t +w~[.^K^4j[(~Þ[l.?\UpkA|przfSp{>3")r'<> +C—>`sy?I`y|Jp/èXp F尧 b)x,S0NjA +LjhxMT1bS ǘP)1r ǛWcF9߂\5+:abRŜY+9?9y8/w#[hY4⁼q~pc)η% @In^"_qf3p+33hn^{;E3eK,F,o䲔bcRC\V@E'<8F@r1"r;8FD%1&dw9Ƅr8ƌ +{9 8ǘAJ z + 8Pϸ9VpZQ3ZӹZQs%e.lΝ\6ٝ\6dl*t^es`opYw,da4 8Y/pLr99&1@Y8&-_1c +PAQ?0PzP:168P2}c(}-PkuoJc#jj&&3qzzJ2*)r *IR+M)i)3];/3$@&C0CRڨ( |\[-=<MR-,2I60y!C5tS? ) JtAƲq)}>z?~,σϧV`Znqj^gܷORm5IVt5WV5![2~!\}gw<qE׆@{jB@Rʭ '~ +yܐʾࣴלg~rp~챯o߽^׳}9߷SVZ`0! +endstream +endobj +276 0 obj +<< /Type /FontDescriptor +/FontName /1de688+KaiGenGothicCN +/FontFile2 275 0 R +/FontBBox [-1002 -1048 2928 1808] +/Flags 4 +/StemV 0 +/ItalicAngle 0.0 +/Ascent 880 +/Descent -120 +/CapHeight 880 +/XHeight 0 +>> +endobj +277 0 obj +<< /Length 311 +/Filter [/FlateDecode] +>> +stream +x]Mo +ݡGJi.9C6Bٴ@:]Ώq6=$Fo#,5GϪѤ{o3 +4`꼛7vBoO=5'^2^ux"۶-z_k^縺-,AڟɲT9J3QYx#VJ +0šeKSGWM ٖB=@#\SjDdX AhH3Z|m}ub]`WRJMP5F\^VjgTz +endstream +endobj +278 0 obj +[224 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000 1000] +endobj +xref +0 279 +0000000000 65535 f +0000000015 00000 n +0000000282 00000 n +0000000485 00000 n +0000000687 00000 n +0000000738 00000 n +0000001000 00000 n +0000001242 00000 n +0000001540 00000 n +0000001712 00000 n +0000001884 00000 n +0000007552 00000 n +0000007935 00000 n +0000007978 00000 n +0000008027 00000 n +0000008125 00000 n +0000008168 00000 n +0000008341 00000 n +0000008514 00000 n +0000008557 00000 n +0000008730 00000 n +0000008773 00000 n +0000008816 00000 n +0000008859 00000 n +0000009036 00000 n +0000009079 00000 n +0000009122 00000 n +0000009165 00000 n +0000009208 00000 n +0000009253 00000 n +0000034262 00000 n +0000034676 00000 n +0000034719 00000 n +0000034866 00000 n +0000034909 00000 n +0000035034 00000 n +0000035159 00000 n +0000035202 00000 n +0000035245 00000 n +0000035288 00000 n +0000035331 00000 n +0000035376 00000 n +0000035421 00000 n +0000052185 00000 n +0000052585 00000 n +0000052630 00000 n +0000052675 00000 n +0000053396 00000 n +0000053814 00000 n +0000053859 00000 n +0000053904 00000 n +0000053949 00000 n +0000053994 00000 n +0000054143 00000 n +0000071860 00000 n +0000072254 00000 n +0000072297 00000 n +0000072422 00000 n +0000072547 00000 n +0000072590 00000 n +0000072633 00000 n +0000072676 00000 n +0000072719 00000 n +0000072764 00000 n +0000072809 00000 n +0000094762 00000 n +0000095169 00000 n +0000095212 00000 n +0000095255 00000 n +0000095300 00000 n +0000095344 00000 n +0000095389 00000 n +0000095434 00000 n +0000095479 00000 n +0000095626 00000 n +0000095772 00000 n +0000108755 00000 n +0000109125 00000 n +0000109168 00000 n +0000109869 00000 n +0000109912 00000 n +0000109955 00000 n +0000109998 00000 n +0000110535 00000 n +0000110580 00000 n +0000110625 00000 n +0000110670 00000 n +0000110715 00000 n +0000136744 00000 n +0000137158 00000 n +0000137201 00000 n +0000137246 00000 n +0000137291 00000 n +0000137336 00000 n +0000137484 00000 n +0000137529 00000 n +0000137656 00000 n +0000137783 00000 n +0000137828 00000 n +0000146421 00000 n +0000146791 00000 n +0000146835 00000 n +0000146879 00000 n +0000146923 00000 n +0000146969 00000 n +0000147015 00000 n +0000147061 00000 n +0000147107 00000 n +0000147153 00000 n +0000147199 00000 n +0000172313 00000 n +0000172732 00000 n +0000172777 00000 n +0000172822 00000 n +0000172970 00000 n +0000173015 00000 n +0000173163 00000 n +0000173311 00000 n +0000173356 00000 n +0000173401 00000 n +0000173446 00000 n +0000173491 00000 n +0000173538 00000 n +0000182773 00000 n +0000183145 00000 n +0000183190 00000 n +0000183237 00000 n +0000183284 00000 n +0000183331 00000 n +0000183929 00000 n +0000183976 00000 n +0000184023 00000 n +0000184705 00000 n +0000184752 00000 n +0000207563 00000 n +0000207998 00000 n +0000208043 00000 n +0000208190 00000 n +0000208235 00000 n +0000208371 00000 n +0000208506 00000 n +0000208642 00000 n +0000208777 00000 n +0000208822 00000 n +0000208867 00000 n +0000208912 00000 n +0000208957 00000 n +0000209004 00000 n +0000209051 00000 n +0000223156 00000 n +0000223559 00000 n +0000223606 00000 n +0000224252 00000 n +0000224299 00000 n +0000224346 00000 n +0000224393 00000 n +0000224440 00000 n +0000224487 00000 n +0000224636 00000 n +0000241502 00000 n +0000241916 00000 n +0000241961 00000 n +0000242097 00000 n +0000242232 00000 n +0000242368 00000 n +0000242503 00000 n +0000242548 00000 n +0000242593 00000 n +0000243214 00000 n +0000243259 00000 n +0000243304 00000 n +0000243351 00000 n +0000243398 00000 n +0000243444 00000 n +0000263670 00000 n +0000264089 00000 n +0000264134 00000 n +0000264181 00000 n +0000264227 00000 n +0000264273 00000 n +0000264320 00000 n +0000264367 00000 n +0000264516 00000 n +0000264563 00000 n +0000264689 00000 n +0000264815 00000 n +0000279654 00000 n +0000280026 00000 n +0000280071 00000 n +0000280116 00000 n +0000280161 00000 n +0000280206 00000 n +0000280253 00000 n +0000280300 00000 n +0000280347 00000 n +0000280394 00000 n +0000305435 00000 n +0000305820 00000 n +0000305865 00000 n +0000305912 00000 n +0000305959 00000 n +0000306006 00000 n +0000306053 00000 n +0000344003 00000 n +0000344402 00000 n +0000344576 00000 n +0000344623 00000 n +0000344670 00000 n +0000375519 00000 n +0000375918 00000 n +0000375963 00000 n +0000376010 00000 n +0000376057 00000 n +0000376104 00000 n +0000386167 00000 n +0000386552 00000 n +0000386599 00000 n +0000387176 00000 n +0000387445 00000 n +0000387714 00000 n +0000387792 00000 n +0000387928 00000 n +0000388100 00000 n +0000388245 00000 n +0000388428 00000 n +0000388579 00000 n +0000388730 00000 n +0000388867 00000 n +0000389040 00000 n +0000389266 00000 n +0000389435 00000 n +0000389612 00000 n +0000389796 00000 n +0000389973 00000 n +0000390148 00000 n +0000390331 00000 n +0000390495 00000 n +0000390675 00000 n +0000390843 00000 n +0000390992 00000 n +0000391154 00000 n +0000391322 00000 n +0000391504 00000 n +0000391698 00000 n +0000391924 00000 n +0000392098 00000 n +0000392278 00000 n +0000392456 00000 n +0000392618 00000 n +0000392796 00000 n +0000392956 00000 n +0000393307 00000 n +0000426592 00000 n +0000426810 00000 n +0000428228 00000 n +0000429366 00000 n +0000435994 00000 n +0000436212 00000 n +0000437575 00000 n +0000438657 00000 n +0000444921 00000 n +0000445139 00000 n +0000446502 00000 n +0000447591 00000 n +0000460295 00000 n +0000460513 00000 n +0000461152 00000 n +0000462290 00000 n +0000467110 00000 n +0000467328 00000 n +0000467710 00000 n +0000468848 00000 n +0000478341 00000 n +0000478564 00000 n +0000479927 00000 n +0000480842 00000 n +0000485989 00000 n +0000486207 00000 n +0000486594 00000 n +trailer +<< /Size 279 +/Root 2 0 R +/Info 1 0 R +>> +startxref +487732 +%%EOF diff --git a/app-manage-api/src/test/java/com/enzhico/jwt/ApplicationTests.java b/app-manage-api/src/test/java/com/enzhico/jwt/ApplicationTests.java new file mode 100644 index 0000000..4dd4241 --- /dev/null +++ b/app-manage-api/src/test/java/com/enzhico/jwt/ApplicationTests.java @@ -0,0 +1,15 @@ +package com.enzhico.jwt; + +import org.junit.runner.RunWith; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +/** + * 测试密码加密 + */ + +@RunWith(SpringRunner.class) +@SpringBootTest +public class ApplicationTests { + +} diff --git a/app-manage-api/src/test/java/com/enzhico/jwt/FTPClientTest.java b/app-manage-api/src/test/java/com/enzhico/jwt/FTPClientTest.java new file mode 100644 index 0000000..faa3673 --- /dev/null +++ b/app-manage-api/src/test/java/com/enzhico/jwt/FTPClientTest.java @@ -0,0 +1,74 @@ +package com.enzhico.jwt; + +import org.apache.commons.net.ftp.FTPClient; +import org.apache.commons.net.ftp.FTPFile; +import org.apache.commons.net.ftp.FTPListParseEngine; +import org.apache.commons.net.ftp.FTPReply; +import org.junit.Test; + +import java.io.File; +import java.io.FileInputStream; +import java.io.InputStream; + +/** + * FTPClientTest + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/24 + */ +public class FTPClientTest { + @Test + public void connect() throws Exception { + FTPClient f = new FTPClient(); + String server = "119.29.12.177"; + f.setControlEncoding("UTF-8"); + f.connect(server); + boolean login = f.login("ftpuser1", "123456"); + System.out.println("login = " + login); + f.setDefaultPort(11024); + System.out.println("reply = " + f.getReplyString()); + int replyCode = f.getReplyCode(); + System.out.println("replyCode = " + replyCode); + if (!FTPReply.isPositiveCompletion(replyCode)) { + f.disconnect(); + System.err.println("FTP server refused connection."); + } + f.enterLocalPassiveMode(); + //f.enterLocalActiveMode(); + FTPListParseEngine engine = f.initiateListParsing(""); + while (engine.hasNext()) { + FTPFile[] files = engine.getNext(25); // "page size" you want + System.out.println("当前目录的文件数量 = " + files.length); + for (FTPFile ftpFile : files) { + System.out.println("文件名:" + ftpFile.getName()); + } + //do whatever you want with these files, display them, etc. + //expensive FTPFile objects not created until needed. + } + + f.disconnect(); + } + + @Test + public void upload() throws Exception { + FTPClient ftpClient = new FTPClient(); + String server = "119.29.12.177"; + ftpClient.connect(server); + ftpClient.login("ftpuser1", "123456"); + InputStream sourceStream = null; + try { + sourceStream = new FileInputStream(new File("")); + //设置上传目录 + ftpClient.changeWorkingDirectory(""); + ftpClient.setBufferSize(1024); + ftpClient.setControlEncoding("UTF-8"); + //设置文件类型(二进制) + ftpClient.setFileType(FTPClient.BINARY_FILE_TYPE); + ftpClient.storeFile("hero.txt", sourceStream); + } finally { + sourceStream.close(); + ftpClient.disconnect(); + } + } +} diff --git a/app-manage-api/src/test/java/com/enzhico/jwt/SimpleTest.java b/app-manage-api/src/test/java/com/enzhico/jwt/SimpleTest.java new file mode 100644 index 0000000..333e9d1 --- /dev/null +++ b/app-manage-api/src/test/java/com/enzhico/jwt/SimpleTest.java @@ -0,0 +1,47 @@ +package com.enzhico.jwt; + +import com.enzhico.jwt.api.model.VersionParam; +import com.enzhico.jwt.shiro.ShiroKit; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import io.github.swagger2markup.markup.builder.MarkupLanguage; +import io.github.swagger2markup.GroupBy; +import io.github.swagger2markup.Language; +import io.github.swagger2markup.Swagger2MarkupConfig; +import io.github.swagger2markup.Swagger2MarkupConverter; +import io.github.swagger2markup.builder.Swagger2MarkupConfigBuilder; +import io.github.swagger2markup.markup.builder.MarkupLanguage; +import org.junit.Test; + +import java.nio.file.Path; +import java.nio.file.Paths; + +/** + * SimpleTest + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/4 + */ +public class SimpleTest { + @Test + public void testMd5() { + //盐(用户名+随机数) + String username = "admin"; + String salt = ShiroKit.getRandomSalt(16); + //原密码 + String password = "12345678"; + String encodedPassword = ShiroKit.md5(password, username + salt); + System.out.println("这个是保存进数据库的密码:" + encodedPassword); + System.out.println("这个是保存进数据库的盐:" + salt); + } + + @Test + public void testJackson() throws JsonProcessingException { + VersionParam req = new VersionParam(); + + String reqBody = new ObjectMapper().writeValueAsString(req); + + System.out.println(reqBody); + } +} diff --git a/app-manage-api/src/test/java/com/enzhico/jwt/Swagger2MarkupTest.java b/app-manage-api/src/test/java/com/enzhico/jwt/Swagger2MarkupTest.java new file mode 100644 index 0000000..2d17ed1 --- /dev/null +++ b/app-manage-api/src/test/java/com/enzhico/jwt/Swagger2MarkupTest.java @@ -0,0 +1,112 @@ +package com.enzhico.jwt; + +import io.github.swagger2markup.GroupBy; +import io.github.swagger2markup.Language; +import io.github.swagger2markup.Swagger2MarkupConfig; +import io.github.swagger2markup.Swagger2MarkupConverter; +import io.github.swagger2markup.builder.Swagger2MarkupConfigBuilder; +import io.github.swagger2markup.markup.builder.MarkupLanguage; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.http.MediaType; +import org.springframework.mock.web.MockHttpServletResponse; +import org.springframework.test.context.junit4.SpringRunner; +import org.springframework.test.web.servlet.MockMvc; +import org.springframework.test.web.servlet.MvcResult; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; + +import java.io.BufferedWriter; +import java.net.URI; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +/** + * Swagger2MarkupTest + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/26 + */ +@AutoConfigureMockMvc +@RunWith(SpringRunner.class) +@SpringBootTest(classes = Application.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) +public class Swagger2MarkupTest { + @Autowired + private MockMvc mockMvc; + + private static final Logger LOG = LoggerFactory.getLogger(Swagger2MarkupTest.class); + + /** + * 自动生成adoc文件 + * @throws Exception e + * + * 执行完成后生成PDF文件方法: + * + * 首先在`build/swagger.adoc`的顶部加入: + ``` + :toclevels: 3 + :numbered: + ``` + 注意有个空行分割,目的是左边导航菜单是3级,并且自动加序号。 + 为了美化显示,还要将`swagger.adoc`中全局替换一下,将 + ``` + cols=".^2,.^3,.^9,.^4,.^2" + ``` + 替换成: + ``` + cols=".^2,.^3,.^6,.^4,.^5" + ``` + 然后在/resources目录下面执行: + ``` + asciidoctor-pdf -r asciidoctor-pdf-cjk-kai_gen_gothic -a pdf-style=KaiGenGothicCN swagger/swagger.adoc + ``` + 会在`swagger.adoc`的同级目录生成`swagger.pdf`文件。 + */ + @Test + public void createSpringFoxSwaggerJson() throws Exception { +// String outputDir = System.getProperty("swaggerOutputDir"); // mvn test + MvcResult mvcResult = this.mockMvc.perform(get("/v2/api-docs") + .accept(MediaType.APPLICATION_JSON)) + .andExpect(status().isOk()) + .andReturn(); + MockHttpServletResponse response = mvcResult.getResponse(); + String swaggerJson = response.getContentAsString(); +// Files.createDirectories(Paths.get(outputDir)); +// try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(outputDir, "swagger.json"), StandardCharsets.UTF_8)){ +// writer.write(swaggerJson); +// } + LOG.info("--------------------swaggerJson create --------------------"); + convertAsciidoc(swaggerJson); + LOG.info("--------------------swagon.json to asciiDoc finished --------------------"); + } + + /** + * 将swagger.yaml或swagger.json转换成漂亮的 AsciiDoc + * 访问:http://localhost:9095/v2/api-docs + * 将页面结果保存为src/main/resources/swagger.json + */ + private void convertAsciidoc(String swaggerStr) { +// Path localSwaggerFile = Paths.get(System.getProperty("swaggerOutputDir"), "swagger.json"); + Path outputFile = Paths.get(System.getProperty("asciiDocOutputDir")); + Swagger2MarkupConfig config = new Swagger2MarkupConfigBuilder() + .withMarkupLanguage(MarkupLanguage.ASCIIDOC) + .withOutputLanguage(Language.ZH) + .withPathsGroupedBy(GroupBy.TAGS) + .withGeneratedExamples() + .withoutInlineSchema() + .build(); + Swagger2MarkupConverter converter = Swagger2MarkupConverter.from(swaggerStr) + .withConfig(config) + .build(); + converter.toFile(outputFile); + } +} diff --git a/app-manage-api/src/test/java/com/enzhico/jwt/common/util/CommonUtilTest.java b/app-manage-api/src/test/java/com/enzhico/jwt/common/util/CommonUtilTest.java new file mode 100644 index 0000000..faaa1ec --- /dev/null +++ b/app-manage-api/src/test/java/com/enzhico/jwt/common/util/CommonUtilTest.java @@ -0,0 +1,24 @@ +package com.enzhico.jwt.common.util; + +import org.junit.Test; + +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.*; + +public class CommonUtilTest { + + @Test + public void isNewer() { + assertThat(CommonUtil.isNewer("1.2.1", "1.2.0"), is(true)); + assertThat(CommonUtil.isNewer("1.2", "1.2.0"), is(false)); + assertThat(CommonUtil.isNewer("2.1.9", "1.2.0"), is(true)); + assertThat(CommonUtil.isNewer("adfa.1.3", "1.2.0"), is(false)); + } + + @Test + public void testTimestamp() { + // 1516072088813 + // 1441594722 + System.out.println(System.currentTimeMillis()); + } +} \ No newline at end of file diff --git a/app-manage-api/src/test/java/com/enzhico/jwt/socket/client/SocketClient.java b/app-manage-api/src/test/java/com/enzhico/jwt/socket/client/SocketClient.java new file mode 100644 index 0000000..da25c7a --- /dev/null +++ b/app-manage-api/src/test/java/com/enzhico/jwt/socket/client/SocketClient.java @@ -0,0 +1,87 @@ +package com.enzhico.jwt.socket.client; + +import com.enzhico.jwt.common.util.JsonConverter; +import com.enzhico.jwt.socket.model.LoginRequest; +import io.socket.client.Ack; +import io.socket.client.IO; +import io.socket.client.Socket; +import io.socket.emitter.Emitter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.net.URISyntaxException; +import java.util.Arrays; +import java.util.stream.Collectors; + +/** + * SocketClient + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/18 + */ +public class SocketClient { + private static Socket socket; + private static final Logger logger = LoggerFactory.getLogger(SocketClient.class); + + public static void main(String[] args) throws URISyntaxException { + IO.Options options = new IO.Options(); + options.transports = new String[]{"websocket"}; + options.reconnectionAttempts = 2; + options.reconnectionDelay = 1000; // 失败重连的时间间隔(ms) + options.timeout = 20000; // 连接超时时间(ms) + options.forceNew = true; + options.query = "username=test1&password=test1&appid=com.enzhico.apay2"; + socket = IO.socket("http://localhost:9099/", options); +// socket = IO.socket("http://123.207.66.156:9099/", options); + socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() { + @Override + public void call(Object... args) { + // 客户端一旦连接成功,开始发起登录请求 + LoginRequest message = new LoginRequest(12, "这是客户端消息体"); + socket.emit("login", JsonConverter.objectToJSONObject(message), (Ack) args1 -> { + logger.info("回执消息=" + Arrays.stream(args1).map(Object::toString).collect(Collectors.joining(","))); + }); + } + }).on("login", new Emitter.Listener() { + @Override + public void call(Object... args) { + logger.info("接受到服务器房间广播的登录消息:" + Arrays.toString(args)); + } + }).on(Socket.EVENT_CONNECT_ERROR, new Emitter.Listener() { + @Override + public void call(Object... args) { + logger.info("Socket.EVENT_CONNECT_ERROR"); + socket.disconnect(); + } + }).on(Socket.EVENT_CONNECT_TIMEOUT, new Emitter.Listener() { + @Override + public void call(Object... args) { + logger.info("Socket.EVENT_CONNECT_TIMEOUT"); + socket.disconnect(); + } + }).on(Socket.EVENT_PING, new Emitter.Listener() { + @Override + public void call(Object... args) { + logger.info("Socket.EVENT_PING"); + } + }).on(Socket.EVENT_PONG, new Emitter.Listener() { + @Override + public void call(Object... args) { + logger.info("Socket.EVENT_PONG"); + } + }).on(Socket.EVENT_MESSAGE, new Emitter.Listener() { + @Override + public void call(Object... args) { + logger.info("-----------接受到消息啦--------" + Arrays.toString(args)); + } + }).on(Socket.EVENT_DISCONNECT, new Emitter.Listener() { + @Override + public void call(Object... args) { + logger.info("客户端断开连接啦。。。"); +// socket.disconnect(); + } + }); + socket.connect(); + } +} diff --git a/app-manage-api/src/test/java/com/enzhico/jwt/socket/client/SocketClient2.java b/app-manage-api/src/test/java/com/enzhico/jwt/socket/client/SocketClient2.java new file mode 100644 index 0000000..2da3715 --- /dev/null +++ b/app-manage-api/src/test/java/com/enzhico/jwt/socket/client/SocketClient2.java @@ -0,0 +1,85 @@ +package com.enzhico.jwt.socket.client; + +import com.enzhico.jwt.api.model.BaseResponse; +import com.enzhico.jwt.api.model.JoinBindResponse; +import com.enzhico.jwt.api.model.PosParam; +import com.enzhico.jwt.common.util.JsonConverter; +import io.socket.client.Ack; +import io.socket.client.IO; +import io.socket.client.Socket; +import io.socket.emitter.Emitter; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.net.URISyntaxException; + +/** + * 这个客户端和SpringBoot服务器连接测试 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/18 + */ +public class SocketClient2 { + private static Socket socket; + private static final Logger logger = LoggerFactory.getLogger(SocketClient2.class); + + public static void main(String[] args) throws URISyntaxException { + IO.Options options = new IO.Options(); + options.transports = new String[]{"websocket"}; + options.reconnectionAttempts = 2; + options.reconnectionDelay = 1000; // 失败重连的时间间隔(ms) + options.timeout = 6000; // 连接超时时间(ms) + options.forceNew = true; + options.query = "token=eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJhcHBpZCI6ImNvbS5lbnpoaWNvLmFkbWlucGF5IiwiaW1laSI6Ijg2NjAzMzAzMDkwNjAwMCIsImV4cCI6MTUxNjc5OTM5MCwidXNlcm5hbWUiOiJhZG1pbiJ9.tmw6Ac46Wjad9hR-xT6RWHHwfviEqML5_2iK9zI1HeY"; + socket = IO.socket("https://test.enzhico.net/", options); + socket.on(Socket.EVENT_CONNECT, new Emitter.Listener() { + @Override + public void call(Object... args) { + logger.info("我连接成功啦啦啦,开始进行入网查询...."); + // 客户端一旦连接成功,开始发起查询入网请求 + String imei = "313123123123123"; + socket.emit("askJoin", imei, (Ack) args1 -> { + JoinBindResponse r = JsonConverter.jsonObjectToObject(args1[0], JoinBindResponse.class); + logger.info("入网查询结果=" + r.getCode()); + }); + // 然后测试一下入网请求接口 + PosParam posParam = new PosParam(); + posParam.setImei("2222222222222222"); + socket.emit("doJoin", JsonConverter.objectToJSONObject(posParam), (Ack) args1 -> { + BaseResponse r = JsonConverter.jsonObjectToObject(args1[0], JoinBindResponse.class); + logger.info("执行POS机入网结果=" + r.isSuccess() + ",msg=" + r.getMsg()); + }); + } + }).on(Socket.EVENT_CONNECT_ERROR, new Emitter.Listener() { + @Override + public void call(Object... args) { + logger.info("Socket.EVENT_CONNECT_ERROR"); + socket.disconnect(); + } + }).on(Socket.EVENT_CONNECT_TIMEOUT, new Emitter.Listener() { + @Override + public void call(Object... args) { + logger.info("Socket.EVENT_CONNECT_TIMEOUT"); + socket.disconnect(); + } + }).on(Socket.EVENT_PING, new Emitter.Listener() { + @Override + public void call(Object... args) { + //logger.info(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + ": Socket.EVENT_PING"); + } + }).on(Socket.EVENT_PONG, new Emitter.Listener() { + @Override + public void call(Object... args) { + //logger.info(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()) + ": Socket.EVENT_PONG"); + } + }).on(Socket.EVENT_DISCONNECT, new Emitter.Listener() { + @Override + public void call(Object... args) { + logger.info("客户端断开连接啦。。。"); + socket.disconnect(); + } + }); + socket.connect(); + } +} diff --git a/app-manage-api/src/test/java/com/enzhico/jwt/socket/client/html/ack-index.html b/app-manage-api/src/test/java/com/enzhico/jwt/socket/client/html/ack-index.html new file mode 100644 index 0000000..4d1ca71 --- /dev/null +++ b/app-manage-api/src/test/java/com/enzhico/jwt/socket/client/html/ack-index.html @@ -0,0 +1,130 @@ + + + + + + + Demo Chat + + + + + + + + + + + + + + + +

Netty-socketio Demo Chat

+ +
+ +
+
+ +
+ + + +
+ + + + + diff --git a/app-manage-api/src/test/java/com/enzhico/jwt/socket/client/html/binary-event-index.html b/app-manage-api/src/test/java/com/enzhico/jwt/socket/client/html/binary-event-index.html new file mode 100644 index 0000000..7383002 --- /dev/null +++ b/app-manage-api/src/test/java/com/enzhico/jwt/socket/client/html/binary-event-index.html @@ -0,0 +1,105 @@ + + + + + + + Demo Chat + + + + + + + + + + + + + + + + Please upload any image file. +
+
+ +
+ +
+ +
+
    +
    + + + + diff --git a/app-manage-api/src/test/java/com/enzhico/jwt/socket/client/html/bootstrap.css b/app-manage-api/src/test/java/com/enzhico/jwt/socket/client/html/bootstrap.css new file mode 100644 index 0000000..bb40c85 --- /dev/null +++ b/app-manage-api/src/test/java/com/enzhico/jwt/socket/client/html/bootstrap.css @@ -0,0 +1,4983 @@ +/*! + * Bootstrap v2.0.4 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section { + display: block; +} + +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} + +audio:not([controls]) { + display: none; +} + +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +a:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +a:hover, +a:active { + outline: 0; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + max-width: 100%; + vertical-align: middle; + border: 0; + -ms-interpolation-mode: bicubic; +} + +#map_canvas img { + max-width: none; +} + +button, +input, +select, +textarea { + margin: 0; + font-size: 100%; + vertical-align: middle; +} + +button, +input { + *overflow: visible; + line-height: normal; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} + +button, +input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + -webkit-appearance: button; +} + +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} + +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +textarea { + overflow: auto; + vertical-align: top; +} + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 28px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; +} + +body { + margin: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + line-height: 18px; + color: #333333; + background-color: #ffffff; +} + +a { + color: #0088cc; + text-decoration: none; +} + +a:hover { + color: #005580; + text-decoration: underline; +} + +.row { + margin-left: -20px; + *zoom: 1; +} + +.row:before, +.row:after { + display: table; + content: ""; +} + +.row:after { + clear: both; +} + +[class*="span"] { + float: left; + margin-left: 20px; +} + +.container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.span12 { + width: 940px; +} + +.span11 { + width: 860px; +} + +.span10 { + width: 780px; +} + +.span9 { + width: 700px; +} + +.span8 { + width: 620px; +} + +.span7 { + width: 540px; +} + +.span6 { + width: 460px; +} + +.span5 { + width: 380px; +} + +.span4 { + width: 300px; +} + +.span3 { + width: 220px; +} + +.span2 { + width: 140px; +} + +.span1 { + width: 60px; +} + +.offset12 { + margin-left: 980px; +} + +.offset11 { + margin-left: 900px; +} + +.offset10 { + margin-left: 820px; +} + +.offset9 { + margin-left: 740px; +} + +.offset8 { + margin-left: 660px; +} + +.offset7 { + margin-left: 580px; +} + +.offset6 { + margin-left: 500px; +} + +.offset5 { + margin-left: 420px; +} + +.offset4 { + margin-left: 340px; +} + +.offset3 { + margin-left: 260px; +} + +.offset2 { + margin-left: 180px; +} + +.offset1 { + margin-left: 100px; +} + +.row-fluid { + width: 100%; + *zoom: 1; +} + +.row-fluid:before, +.row-fluid:after { + display: table; + content: ""; +} + +.row-fluid:after { + clear: both; +} + +.row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 28px; + margin-left: 2.127659574%; + *margin-left: 2.0744680846382977%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; +} + +.row-fluid [class*="span"]:first-child { + margin-left: 0; +} + +.row-fluid .span12 { + width: 99.99999998999999%; + *width: 99.94680850063828%; +} + +.row-fluid .span11 { + width: 91.489361693%; + *width: 91.4361702036383%; +} + +.row-fluid .span10 { + width: 82.97872339599999%; + *width: 82.92553190663828%; +} + +.row-fluid .span9 { + width: 74.468085099%; + *width: 74.4148936096383%; +} + +.row-fluid .span8 { + width: 65.95744680199999%; + *width: 65.90425531263828%; +} + +.row-fluid .span7 { + width: 57.446808505%; + *width: 57.3936170156383%; +} + +.row-fluid .span6 { + width: 48.93617020799999%; + *width: 48.88297871863829%; +} + +.row-fluid .span5 { + width: 40.425531911%; + *width: 40.3723404216383%; +} + +.row-fluid .span4 { + width: 31.914893614%; + *width: 31.8617021246383%; +} + +.row-fluid .span3 { + width: 23.404255317%; + *width: 23.3510638276383%; +} + +.row-fluid .span2 { + width: 14.89361702%; + *width: 14.8404255306383%; +} + +.row-fluid .span1 { + width: 6.382978723%; + *width: 6.329787233638298%; +} + +.container { + margin-right: auto; + margin-left: auto; + *zoom: 1; +} + +.container:before, +.container:after { + display: table; + content: ""; +} + +.container:after { + clear: both; +} + +.container-fluid { + padding-right: 20px; + padding-left: 20px; + *zoom: 1; +} + +.container-fluid:before, +.container-fluid:after { + display: table; + content: ""; +} + +.container-fluid:after { + clear: both; +} + +p { + margin: 0 0 9px; +} + +p small { + font-size: 11px; + color: #999999; +} + +.lead { + margin-bottom: 18px; + font-size: 20px; + font-weight: 200; + line-height: 27px; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 0; + font-family: inherit; + font-weight: bold; + color: inherit; + text-rendering: optimizelegibility; +} + +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small { + font-weight: normal; + color: #999999; +} + +h1 { + font-size: 30px; + line-height: 36px; +} + +h1 small { + font-size: 18px; +} + +h2 { + font-size: 24px; + line-height: 36px; +} + +h2 small { + font-size: 18px; +} + +h3 { + font-size: 18px; + line-height: 27px; +} + +h3 small { + font-size: 14px; +} + +h4, +h5, +h6 { + line-height: 18px; +} + +h4 { + font-size: 14px; +} + +h4 small { + font-size: 12px; +} + +h5 { + font-size: 12px; +} + +h6 { + font-size: 11px; + color: #999999; + text-transform: uppercase; +} + +.page-header { + padding-bottom: 17px; + margin: 18px 0; + border-bottom: 1px solid #eeeeee; +} + +.page-header h1 { + line-height: 1; +} + +ul, +ol { + padding: 0; + margin: 0 0 9px 25px; +} + +ul ul, +ul ol, +ol ol, +ol ul { + margin-bottom: 0; +} + +ul { + list-style: disc; +} + +ol { + list-style: decimal; +} + +li { + line-height: 18px; +} + +ul.unstyled, +ol.unstyled { + margin-left: 0; + list-style: none; +} + +dl { + margin-bottom: 18px; +} + +dt, +dd { + line-height: 18px; +} + +dt { + font-weight: bold; + line-height: 17px; +} + +dd { + margin-left: 9px; +} + +.dl-horizontal dt { + float: left; + width: 120px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; +} + +.dl-horizontal dd { + margin-left: 130px; +} + +hr { + margin: 18px 0; + border: 0; + border-top: 1px solid #eeeeee; + border-bottom: 1px solid #ffffff; +} + +strong { + font-weight: bold; +} + +em { + font-style: italic; +} + +.muted { + color: #999999; +} + +abbr[title] { + cursor: help; + border-bottom: 1px dotted #999999; +} + +abbr.initialism { + font-size: 90%; + text-transform: uppercase; +} + +blockquote { + padding: 0 0 0 15px; + margin: 0 0 18px; + border-left: 5px solid #eeeeee; +} + +blockquote p { + margin-bottom: 0; + font-size: 16px; + font-weight: 300; + line-height: 22.5px; +} + +blockquote small { + display: block; + line-height: 18px; + color: #999999; +} + +blockquote small:before { + content: '\2014 \00A0'; +} + +blockquote.pull-right { + float: right; + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; +} + +blockquote.pull-right p, +blockquote.pull-right small { + text-align: right; +} + +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} + +address { + display: block; + margin-bottom: 18px; + font-style: normal; + line-height: 18px; +} + +small { + font-size: 100%; +} + +cite { + font-style: normal; +} + +code, +pre { + padding: 0 3px 2px; + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + font-size: 12px; + color: #333333; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +code { + padding: 2px 4px; + color: #d14; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; +} + +pre { + display: block; + padding: 8.5px; + margin: 0 0 9px; + font-size: 12.025px; + line-height: 18px; + word-break: break-all; + word-wrap: break-word; + white-space: pre; + white-space: pre-wrap; + background-color: #f5f5f5; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +pre.prettyprint { + margin-bottom: 18px; +} + +pre code { + padding: 0; + color: inherit; + background-color: transparent; + border: 0; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +form { + margin: 0 0 18px; +} + +fieldset { + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 27px; + font-size: 19.5px; + line-height: 36px; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} + +legend small { + font-size: 13.5px; + color: #999999; +} + +label, +input, +button, +select, +textarea { + font-size: 13px; + font-weight: normal; + line-height: 18px; +} + +input, +button, +select, +textarea { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +label { + display: block; + margin-bottom: 5px; +} + +select, +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + display: inline-block; + height: 18px; + padding: 4px; + margin-bottom: 9px; + font-size: 13px; + line-height: 18px; + color: #555555; +} + +input, +textarea { + width: 210px; +} + +textarea { + height: auto; +} + +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + background-color: #ffffff; + border: 1px solid #cccccc; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; + -moz-transition: border linear 0.2s, box-shadow linear 0.2s; + -ms-transition: border linear 0.2s, box-shadow linear 0.2s; + -o-transition: border linear 0.2s, box-shadow linear 0.2s; + transition: border linear 0.2s, box-shadow linear 0.2s; +} + +textarea:focus, +input[type="text"]:focus, +input[type="password"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="date"]:focus, +input[type="month"]:focus, +input[type="time"]:focus, +input[type="week"]:focus, +input[type="number"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="search"]:focus, +input[type="tel"]:focus, +input[type="color"]:focus, +.uneditable-input:focus { + border-color: rgba(82, 168, 236, 0.8); + outline: 0; + outline: thin dotted \9; + /* IE6-9 */ + + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); +} + +input[type="radio"], +input[type="checkbox"] { + margin: 3px 0; + *margin-top: 0; + /* IE7 */ + + line-height: normal; + cursor: pointer; +} + +input[type="submit"], +input[type="reset"], +input[type="button"], +input[type="radio"], +input[type="checkbox"] { + width: auto; +} + +.uneditable-textarea { + width: auto; + height: auto; +} + +select, +input[type="file"] { + height: 28px; + /* In IE7, the height of the select element cannot be changed by height, only font-size */ + + *margin-top: 4px; + /* For IE7, add top margin to align select with labels */ + + line-height: 28px; +} + +select { + width: 220px; + border: 1px solid #bbb; +} + +select[multiple], +select[size] { + height: auto; +} + +select:focus, +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.radio, +.checkbox { + min-height: 18px; + padding-left: 18px; +} + +.radio input[type="radio"], +.checkbox input[type="checkbox"] { + float: left; + margin-left: -18px; +} + +.controls > .radio:first-child, +.controls > .checkbox:first-child { + padding-top: 5px; +} + +.radio.inline, +.checkbox.inline { + display: inline-block; + padding-top: 5px; + margin-bottom: 0; + vertical-align: middle; +} + +.radio.inline + .radio.inline, +.checkbox.inline + .checkbox.inline { + margin-left: 10px; +} + +.input-mini { + width: 60px; +} + +.input-small { + width: 90px; +} + +.input-medium { + width: 150px; +} + +.input-large { + width: 210px; +} + +.input-xlarge { + width: 270px; +} + +.input-xxlarge { + width: 530px; +} + +input[class*="span"], +select[class*="span"], +textarea[class*="span"], +.uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"] { + float: none; + margin-left: 0; +} + +.input-append input[class*="span"], +.input-append .uneditable-input[class*="span"], +.input-prepend input[class*="span"], +.input-prepend .uneditable-input[class*="span"], +.row-fluid .input-prepend [class*="span"], +.row-fluid .input-append [class*="span"] { + display: inline-block; +} + +input, +textarea, +.uneditable-input { + margin-left: 0; +} + +input.span12, +textarea.span12, +.uneditable-input.span12 { + width: 930px; +} + +input.span11, +textarea.span11, +.uneditable-input.span11 { + width: 850px; +} + +input.span10, +textarea.span10, +.uneditable-input.span10 { + width: 770px; +} + +input.span9, +textarea.span9, +.uneditable-input.span9 { + width: 690px; +} + +input.span8, +textarea.span8, +.uneditable-input.span8 { + width: 610px; +} + +input.span7, +textarea.span7, +.uneditable-input.span7 { + width: 530px; +} + +input.span6, +textarea.span6, +.uneditable-input.span6 { + width: 450px; +} + +input.span5, +textarea.span5, +.uneditable-input.span5 { + width: 370px; +} + +input.span4, +textarea.span4, +.uneditable-input.span4 { + width: 290px; +} + +input.span3, +textarea.span3, +.uneditable-input.span3 { + width: 210px; +} + +input.span2, +textarea.span2, +.uneditable-input.span2 { + width: 130px; +} + +input.span1, +textarea.span1, +.uneditable-input.span1 { + width: 50px; +} + +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + cursor: not-allowed; + background-color: #eeeeee; + border-color: #ddd; +} + +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"][readonly], +input[type="checkbox"][readonly] { + background-color: transparent; +} + +.control-group.warning > label, +.control-group.warning .help-block, +.control-group.warning .help-inline { + color: #c09853; +} + +.control-group.warning .checkbox, +.control-group.warning .radio, +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + color: #c09853; + border-color: #c09853; +} + +.control-group.warning .checkbox:focus, +.control-group.warning .radio:focus, +.control-group.warning input:focus, +.control-group.warning select:focus, +.control-group.warning textarea:focus { + border-color: #a47e3c; + -webkit-box-shadow: 0 0 6px #dbc59e; + -moz-box-shadow: 0 0 6px #dbc59e; + box-shadow: 0 0 6px #dbc59e; +} + +.control-group.warning .input-prepend .add-on, +.control-group.warning .input-append .add-on { + color: #c09853; + background-color: #fcf8e3; + border-color: #c09853; +} + +.control-group.error > label, +.control-group.error .help-block, +.control-group.error .help-inline { + color: #b94a48; +} + +.control-group.error .checkbox, +.control-group.error .radio, +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + color: #b94a48; + border-color: #b94a48; +} + +.control-group.error .checkbox:focus, +.control-group.error .radio:focus, +.control-group.error input:focus, +.control-group.error select:focus, +.control-group.error textarea:focus { + border-color: #953b39; + -webkit-box-shadow: 0 0 6px #d59392; + -moz-box-shadow: 0 0 6px #d59392; + box-shadow: 0 0 6px #d59392; +} + +.control-group.error .input-prepend .add-on, +.control-group.error .input-append .add-on { + color: #b94a48; + background-color: #f2dede; + border-color: #b94a48; +} + +.control-group.success > label, +.control-group.success .help-block, +.control-group.success .help-inline { + color: #468847; +} + +.control-group.success .checkbox, +.control-group.success .radio, +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + color: #468847; + border-color: #468847; +} + +.control-group.success .checkbox:focus, +.control-group.success .radio:focus, +.control-group.success input:focus, +.control-group.success select:focus, +.control-group.success textarea:focus { + border-color: #356635; + -webkit-box-shadow: 0 0 6px #7aba7b; + -moz-box-shadow: 0 0 6px #7aba7b; + box-shadow: 0 0 6px #7aba7b; +} + +.control-group.success .input-prepend .add-on, +.control-group.success .input-append .add-on { + color: #468847; + background-color: #dff0d8; + border-color: #468847; +} + +input:focus:required:invalid, +textarea:focus:required:invalid, +select:focus:required:invalid { + color: #b94a48; + border-color: #ee5f5b; +} + +input:focus:required:invalid:focus, +textarea:focus:required:invalid:focus, +select:focus:required:invalid:focus { + border-color: #e9322d; + -webkit-box-shadow: 0 0 6px #f8b9b7; + -moz-box-shadow: 0 0 6px #f8b9b7; + box-shadow: 0 0 6px #f8b9b7; +} + +.form-actions { + padding: 17px 20px 18px; + margin-top: 18px; + margin-bottom: 18px; + background-color: #f5f5f5; + border-top: 1px solid #e5e5e5; + *zoom: 1; +} + +.form-actions:before, +.form-actions:after { + display: table; + content: ""; +} + +.form-actions:after { + clear: both; +} + +.uneditable-input { + overflow: hidden; + white-space: nowrap; + cursor: not-allowed; + background-color: #ffffff; + border-color: #eee; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); +} + +:-moz-placeholder { + color: #999999; +} + +:-ms-input-placeholder { + color: #999999; +} + +::-webkit-input-placeholder { + color: #999999; +} + +.help-block, +.help-inline { + color: #555555; +} + +.help-block { + display: block; + margin-bottom: 9px; +} + +.help-inline { + display: inline-block; + *display: inline; + padding-left: 5px; + vertical-align: middle; + *zoom: 1; +} + +.input-prepend, +.input-append { + margin-bottom: 5px; +} + +.input-prepend input, +.input-append input, +.input-prepend select, +.input-append select, +.input-prepend .uneditable-input, +.input-append .uneditable-input { + position: relative; + margin-bottom: 0; + *margin-left: 0; + vertical-align: middle; + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} + +.input-prepend input:focus, +.input-append input:focus, +.input-prepend select:focus, +.input-append select:focus, +.input-prepend .uneditable-input:focus, +.input-append .uneditable-input:focus { + z-index: 2; +} + +.input-prepend .uneditable-input, +.input-append .uneditable-input { + border-left-color: #ccc; +} + +.input-prepend .add-on, +.input-append .add-on { + display: inline-block; + width: auto; + height: 18px; + min-width: 16px; + padding: 4px 5px; + font-weight: normal; + line-height: 18px; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + vertical-align: middle; + background-color: #eeeeee; + border: 1px solid #ccc; +} + +.input-prepend .add-on, +.input-append .add-on, +.input-prepend .btn, +.input-append .btn { + margin-left: -1px; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-prepend .active, +.input-append .active { + background-color: #a9dba9; + border-color: #46a546; +} + +.input-prepend .add-on, +.input-prepend .btn { + margin-right: -1px; +} + +.input-prepend .add-on:first-child, +.input-prepend .btn:first-child { + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} + +.input-append input, +.input-append select, +.input-append .uneditable-input { + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} + +.input-append .uneditable-input { + border-right-color: #ccc; + border-left-color: #eee; +} + +.input-append .add-on:last-child, +.input-append .btn:last-child { + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} + +.input-prepend.input-append input, +.input-prepend.input-append select, +.input-prepend.input-append .uneditable-input { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-prepend.input-append .add-on:first-child, +.input-prepend.input-append .btn:first-child { + margin-right: -1px; + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} + +.input-prepend.input-append .add-on:last-child, +.input-prepend.input-append .btn:last-child { + margin-left: -1px; + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} + +.search-query { + padding-right: 14px; + padding-right: 4px \9; + padding-left: 14px; + padding-left: 4px \9; + /* IE7-8 doesn't have border-radius, so don't indent the padding */ + + margin-bottom: 0; + -webkit-border-radius: 14px; + -moz-border-radius: 14px; + border-radius: 14px; +} + +.form-search input, +.form-inline input, +.form-horizontal input, +.form-search textarea, +.form-inline textarea, +.form-horizontal textarea, +.form-search select, +.form-inline select, +.form-horizontal select, +.form-search .help-inline, +.form-inline .help-inline, +.form-horizontal .help-inline, +.form-search .uneditable-input, +.form-inline .uneditable-input, +.form-horizontal .uneditable-input, +.form-search .input-prepend, +.form-inline .input-prepend, +.form-horizontal .input-prepend, +.form-search .input-append, +.form-inline .input-append, +.form-horizontal .input-append { + display: inline-block; + *display: inline; + margin-bottom: 0; + *zoom: 1; +} + +.form-search .hide, +.form-inline .hide, +.form-horizontal .hide { + display: none; +} + +.form-search label, +.form-inline label { + display: inline-block; +} + +.form-search .input-append, +.form-inline .input-append, +.form-search .input-prepend, +.form-inline .input-prepend { + margin-bottom: 0; +} + +.form-search .radio, +.form-search .checkbox, +.form-inline .radio, +.form-inline .checkbox { + padding-left: 0; + margin-bottom: 0; + vertical-align: middle; +} + +.form-search .radio input[type="radio"], +.form-search .checkbox input[type="checkbox"], +.form-inline .radio input[type="radio"], +.form-inline .checkbox input[type="checkbox"] { + float: left; + margin-right: 3px; + margin-left: 0; +} + +.control-group { + margin-bottom: 9px; +} + +legend + .control-group { + margin-top: 18px; + -webkit-margin-top-collapse: separate; +} + +.form-horizontal .control-group { + margin-bottom: 18px; + *zoom: 1; +} + +.form-horizontal .control-group:before, +.form-horizontal .control-group:after { + display: table; + content: ""; +} + +.form-horizontal .control-group:after { + clear: both; +} + +.form-horizontal .control-label { + float: left; + width: 140px; + padding-top: 5px; + text-align: right; +} + +.form-horizontal .controls { + *display: inline-block; + *padding-left: 20px; + margin-left: 160px; + *margin-left: 0; +} + +.form-horizontal .controls:first-child { + *padding-left: 160px; +} + +.form-horizontal .help-block { + margin-top: 9px; + margin-bottom: 0; +} + +.form-horizontal .form-actions { + padding-left: 160px; +} + +table { + max-width: 100%; + background-color: transparent; + border-collapse: collapse; + border-spacing: 0; +} + +.table { + width: 100%; + margin-bottom: 18px; +} + +.table th, +.table td { + padding: 8px; + line-height: 18px; + text-align: left; + vertical-align: top; + border-top: 1px solid #dddddd; +} + +.table th { + font-weight: bold; +} + +.table thead th { + vertical-align: bottom; +} + +.table caption + thead tr:first-child th, +.table caption + thead tr:first-child td, +.table colgroup + thead tr:first-child th, +.table colgroup + thead tr:first-child td, +.table thead:first-child tr:first-child th, +.table thead:first-child tr:first-child td { + border-top: 0; +} + +.table tbody + tbody { + border-top: 2px solid #dddddd; +} + +.table-condensed th, +.table-condensed td { + padding: 4px 5px; +} + +.table-bordered { + border: 1px solid #dddddd; + border-collapse: separate; + *border-collapse: collapsed; + border-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.table-bordered th, +.table-bordered td { + border-left: 1px solid #dddddd; +} + +.table-bordered caption + thead tr:first-child th, +.table-bordered caption + tbody tr:first-child th, +.table-bordered caption + tbody tr:first-child td, +.table-bordered colgroup + thead tr:first-child th, +.table-bordered colgroup + tbody tr:first-child th, +.table-bordered colgroup + tbody tr:first-child td, +.table-bordered thead:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child td { + border-top: 0; +} + +.table-bordered thead:first-child tr:first-child th:first-child, +.table-bordered tbody:first-child tr:first-child td:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered thead:first-child tr:first-child th:last-child, +.table-bordered tbody:first-child tr:first-child td:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +.table-bordered thead:last-child tr:last-child th:first-child, +.table-bordered tbody:last-child tr:last-child td:first-child { + -webkit-border-radius: 0 0 0 4px; + -moz-border-radius: 0 0 0 4px; + border-radius: 0 0 0 4px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.table-bordered thead:last-child tr:last-child th:last-child, +.table-bordered tbody:last-child tr:last-child td:last-child { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; +} + +.table-striped tbody tr:nth-child(odd) td, +.table-striped tbody tr:nth-child(odd) th { + background-color: #f9f9f9; +} + +.table tbody tr:hover td, +.table tbody tr:hover th { + background-color: #f5f5f5; +} + +table .span1 { + float: none; + width: 44px; + margin-left: 0; +} + +table .span2 { + float: none; + width: 124px; + margin-left: 0; +} + +table .span3 { + float: none; + width: 204px; + margin-left: 0; +} + +table .span4 { + float: none; + width: 284px; + margin-left: 0; +} + +table .span5 { + float: none; + width: 364px; + margin-left: 0; +} + +table .span6 { + float: none; + width: 444px; + margin-left: 0; +} + +table .span7 { + float: none; + width: 524px; + margin-left: 0; +} + +table .span8 { + float: none; + width: 604px; + margin-left: 0; +} + +table .span9 { + float: none; + width: 684px; + margin-left: 0; +} + +table .span10 { + float: none; + width: 764px; + margin-left: 0; +} + +table .span11 { + float: none; + width: 844px; + margin-left: 0; +} + +table .span12 { + float: none; + width: 924px; + margin-left: 0; +} + +table .span13 { + float: none; + width: 1004px; + margin-left: 0; +} + +table .span14 { + float: none; + width: 1084px; + margin-left: 0; +} + +table .span15 { + float: none; + width: 1164px; + margin-left: 0; +} + +table .span16 { + float: none; + width: 1244px; + margin-left: 0; +} + +table .span17 { + float: none; + width: 1324px; + margin-left: 0; +} + +table .span18 { + float: none; + width: 1404px; + margin-left: 0; +} + +table .span19 { + float: none; + width: 1484px; + margin-left: 0; +} + +table .span20 { + float: none; + width: 1564px; + margin-left: 0; +} + +table .span21 { + float: none; + width: 1644px; + margin-left: 0; +} + +table .span22 { + float: none; + width: 1724px; + margin-left: 0; +} + +table .span23 { + float: none; + width: 1804px; + margin-left: 0; +} + +table .span24 { + float: none; + width: 1884px; + margin-left: 0; +} + +[class^="icon-"], +[class*=" icon-"] { + display: inline-block; + width: 14px; + height: 14px; + *margin-right: .3em; + line-height: 14px; + vertical-align: text-top; + background-image: url("../img/glyphicons-halflings.png"); + background-position: 14px 14px; + background-repeat: no-repeat; +} + +[class^="icon-"]:last-child, +[class*=" icon-"]:last-child { + *margin-left: 0; +} + +.icon-white { + background-image: url("../img/glyphicons-halflings-white.png"); +} + +.icon-glass { + background-position: 0 0; +} + +.icon-music { + background-position: -24px 0; +} + +.icon-search { + background-position: -48px 0; +} + +.icon-envelope { + background-position: -72px 0; +} + +.icon-heart { + background-position: -96px 0; +} + +.icon-star { + background-position: -120px 0; +} + +.icon-star-empty { + background-position: -144px 0; +} + +.icon-user { + background-position: -168px 0; +} + +.icon-film { + background-position: -192px 0; +} + +.icon-th-large { + background-position: -216px 0; +} + +.icon-th { + background-position: -240px 0; +} + +.icon-th-list { + background-position: -264px 0; +} + +.icon-ok { + background-position: -288px 0; +} + +.icon-remove { + background-position: -312px 0; +} + +.icon-zoom-in { + background-position: -336px 0; +} + +.icon-zoom-out { + background-position: -360px 0; +} + +.icon-off { + background-position: -384px 0; +} + +.icon-signal { + background-position: -408px 0; +} + +.icon-cog { + background-position: -432px 0; +} + +.icon-trash { + background-position: -456px 0; +} + +.icon-home { + background-position: 0 -24px; +} + +.icon-file { + background-position: -24px -24px; +} + +.icon-time { + background-position: -48px -24px; +} + +.icon-road { + background-position: -72px -24px; +} + +.icon-download-alt { + background-position: -96px -24px; +} + +.icon-download { + background-position: -120px -24px; +} + +.icon-upload { + background-position: -144px -24px; +} + +.icon-inbox { + background-position: -168px -24px; +} + +.icon-play-circle { + background-position: -192px -24px; +} + +.icon-repeat { + background-position: -216px -24px; +} + +.icon-refresh { + background-position: -240px -24px; +} + +.icon-list-alt { + background-position: -264px -24px; +} + +.icon-lock { + background-position: -287px -24px; +} + +.icon-flag { + background-position: -312px -24px; +} + +.icon-headphones { + background-position: -336px -24px; +} + +.icon-volume-off { + background-position: -360px -24px; +} + +.icon-volume-down { + background-position: -384px -24px; +} + +.icon-volume-up { + background-position: -408px -24px; +} + +.icon-qrcode { + background-position: -432px -24px; +} + +.icon-barcode { + background-position: -456px -24px; +} + +.icon-tag { + background-position: 0 -48px; +} + +.icon-tags { + background-position: -25px -48px; +} + +.icon-book { + background-position: -48px -48px; +} + +.icon-bookmark { + background-position: -72px -48px; +} + +.icon-print { + background-position: -96px -48px; +} + +.icon-camera { + background-position: -120px -48px; +} + +.icon-font { + background-position: -144px -48px; +} + +.icon-bold { + background-position: -167px -48px; +} + +.icon-italic { + background-position: -192px -48px; +} + +.icon-text-height { + background-position: -216px -48px; +} + +.icon-text-width { + background-position: -240px -48px; +} + +.icon-align-left { + background-position: -264px -48px; +} + +.icon-align-center { + background-position: -288px -48px; +} + +.icon-align-right { + background-position: -312px -48px; +} + +.icon-align-justify { + background-position: -336px -48px; +} + +.icon-list { + background-position: -360px -48px; +} + +.icon-indent-left { + background-position: -384px -48px; +} + +.icon-indent-right { + background-position: -408px -48px; +} + +.icon-facetime-video { + background-position: -432px -48px; +} + +.icon-picture { + background-position: -456px -48px; +} + +.icon-pencil { + background-position: 0 -72px; +} + +.icon-map-marker { + background-position: -24px -72px; +} + +.icon-adjust { + background-position: -48px -72px; +} + +.icon-tint { + background-position: -72px -72px; +} + +.icon-edit { + background-position: -96px -72px; +} + +.icon-share { + background-position: -120px -72px; +} + +.icon-check { + background-position: -144px -72px; +} + +.icon-move { + background-position: -168px -72px; +} + +.icon-step-backward { + background-position: -192px -72px; +} + +.icon-fast-backward { + background-position: -216px -72px; +} + +.icon-backward { + background-position: -240px -72px; +} + +.icon-play { + background-position: -264px -72px; +} + +.icon-pause { + background-position: -288px -72px; +} + +.icon-stop { + background-position: -312px -72px; +} + +.icon-forward { + background-position: -336px -72px; +} + +.icon-fast-forward { + background-position: -360px -72px; +} + +.icon-step-forward { + background-position: -384px -72px; +} + +.icon-eject { + background-position: -408px -72px; +} + +.icon-chevron-left { + background-position: -432px -72px; +} + +.icon-chevron-right { + background-position: -456px -72px; +} + +.icon-plus-sign { + background-position: 0 -96px; +} + +.icon-minus-sign { + background-position: -24px -96px; +} + +.icon-remove-sign { + background-position: -48px -96px; +} + +.icon-ok-sign { + background-position: -72px -96px; +} + +.icon-question-sign { + background-position: -96px -96px; +} + +.icon-info-sign { + background-position: -120px -96px; +} + +.icon-screenshot { + background-position: -144px -96px; +} + +.icon-remove-circle { + background-position: -168px -96px; +} + +.icon-ok-circle { + background-position: -192px -96px; +} + +.icon-ban-circle { + background-position: -216px -96px; +} + +.icon-arrow-left { + background-position: -240px -96px; +} + +.icon-arrow-right { + background-position: -264px -96px; +} + +.icon-arrow-up { + background-position: -289px -96px; +} + +.icon-arrow-down { + background-position: -312px -96px; +} + +.icon-share-alt { + background-position: -336px -96px; +} + +.icon-resize-full { + background-position: -360px -96px; +} + +.icon-resize-small { + background-position: -384px -96px; +} + +.icon-plus { + background-position: -408px -96px; +} + +.icon-minus { + background-position: -433px -96px; +} + +.icon-asterisk { + background-position: -456px -96px; +} + +.icon-exclamation-sign { + background-position: 0 -120px; +} + +.icon-gift { + background-position: -24px -120px; +} + +.icon-leaf { + background-position: -48px -120px; +} + +.icon-fire { + background-position: -72px -120px; +} + +.icon-eye-open { + background-position: -96px -120px; +} + +.icon-eye-close { + background-position: -120px -120px; +} + +.icon-warning-sign { + background-position: -144px -120px; +} + +.icon-plane { + background-position: -168px -120px; +} + +.icon-calendar { + background-position: -192px -120px; +} + +.icon-random { + background-position: -216px -120px; +} + +.icon-comment { + background-position: -240px -120px; +} + +.icon-magnet { + background-position: -264px -120px; +} + +.icon-chevron-up { + background-position: -288px -120px; +} + +.icon-chevron-down { + background-position: -313px -119px; +} + +.icon-retweet { + background-position: -336px -120px; +} + +.icon-shopping-cart { + background-position: -360px -120px; +} + +.icon-folder-close { + background-position: -384px -120px; +} + +.icon-folder-open { + background-position: -408px -120px; +} + +.icon-resize-vertical { + background-position: -432px -119px; +} + +.icon-resize-horizontal { + background-position: -456px -118px; +} + +.icon-hdd { + background-position: 0 -144px; +} + +.icon-bullhorn { + background-position: -24px -144px; +} + +.icon-bell { + background-position: -48px -144px; +} + +.icon-certificate { + background-position: -72px -144px; +} + +.icon-thumbs-up { + background-position: -96px -144px; +} + +.icon-thumbs-down { + background-position: -120px -144px; +} + +.icon-hand-right { + background-position: -144px -144px; +} + +.icon-hand-left { + background-position: -168px -144px; +} + +.icon-hand-up { + background-position: -192px -144px; +} + +.icon-hand-down { + background-position: -216px -144px; +} + +.icon-circle-arrow-right { + background-position: -240px -144px; +} + +.icon-circle-arrow-left { + background-position: -264px -144px; +} + +.icon-circle-arrow-up { + background-position: -288px -144px; +} + +.icon-circle-arrow-down { + background-position: -312px -144px; +} + +.icon-globe { + background-position: -336px -144px; +} + +.icon-wrench { + background-position: -360px -144px; +} + +.icon-tasks { + background-position: -384px -144px; +} + +.icon-filter { + background-position: -408px -144px; +} + +.icon-briefcase { + background-position: -432px -144px; +} + +.icon-fullscreen { + background-position: -456px -144px; +} + +.dropup, +.dropdown { + position: relative; +} + +.dropdown-toggle { + *margin-bottom: -3px; +} + +.dropdown-toggle:active, +.open .dropdown-toggle { + outline: 0; +} + +.caret { + display: inline-block; + width: 0; + height: 0; + vertical-align: top; + border-top: 4px solid #000000; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + content: ""; + opacity: 0.3; + filter: alpha(opacity=30); +} + +.dropdown .caret { + margin-top: 8px; + margin-left: 2px; +} + +.dropdown:hover .caret, +.open .caret { + opacity: 1; + filter: alpha(opacity=100); +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 4px 0; + margin: 1px 0 0; + list-style: none; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.dropdown-menu .divider { + *width: 100%; + height: 1px; + margin: 8px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.dropdown-menu a { + display: block; + padding: 3px 15px; + clear: both; + font-weight: normal; + line-height: 18px; + color: #333333; + white-space: nowrap; +} + +.dropdown-menu li > a:hover, +.dropdown-menu .active > a, +.dropdown-menu .active > a:hover { + color: #ffffff; + text-decoration: none; + background-color: #0088cc; +} + +.open { + *z-index: 1000; +} + +.open > .dropdown-menu { + display: block; +} + +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid #000000; + content: "\2191"; +} + +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} + +.typeahead { + margin-top: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #eee; + border: 1px solid rgba(0, 0, 0, 0.05); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} + +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} + +.well-large { + padding: 24px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.well-small { + padding: 9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -moz-transition: opacity 0.15s linear; + -ms-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} + +.fade.in { + opacity: 1; +} + +.collapse { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + -moz-transition: height 0.35s ease; + -ms-transition: height 0.35s ease; + -o-transition: height 0.35s ease; + transition: height 0.35s ease; +} + +.collapse.in { + height: auto; +} + +.close { + float: right; + font-size: 20px; + font-weight: bold; + line-height: 18px; + color: #000000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} + +.close:hover { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.4; + filter: alpha(opacity=40); +} + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} + +.btn { + display: inline-block; + *display: inline; + padding: 4px 10px 4px; + margin-bottom: 0; + *margin-left: .3em; + font-size: 13px; + line-height: 18px; + *line-height: 20px; + color: #333333; + text-align: center; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + vertical-align: middle; + cursor: pointer; + background-color: #f5f5f5; + *background-color: #e6e6e6; + background-image: -ms-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(top, #ffffff, #e6e6e6); + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-repeat: repeat-x; + border: 1px solid #cccccc; + *border: 0; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-bottom-color: #b3b3b3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn:hover, +.btn:active, +.btn.active, +.btn.disabled, +.btn[disabled] { + background-color: #e6e6e6; + *background-color: #d9d9d9; +} + +.btn:active, +.btn.active { + background-color: #cccccc \9; +} + +.btn:first-child { + *margin-left: 0; +} + +.btn:hover { + color: #333333; + text-decoration: none; + background-color: #e6e6e6; + *background-color: #d9d9d9; + /* Buttons in IE7 don't get borders, so darken on hover */ + + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -ms-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; +} + +.btn:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.btn.active, +.btn:active { + background-color: #e6e6e6; + background-color: #d9d9d9 \9; + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn.disabled, +.btn[disabled] { + cursor: default; + background-color: #e6e6e6; + background-image: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-large { + padding: 9px 14px; + font-size: 15px; + line-height: normal; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.btn-large [class^="icon-"] { + margin-top: 1px; +} + +.btn-small { + padding: 5px 9px; + font-size: 11px; + line-height: 16px; +} + +.btn-small [class^="icon-"] { + margin-top: -1px; +} + +.btn-mini { + padding: 2px 6px; + font-size: 11px; + line-height: 14px; +} + +.btn-primary, +.btn-primary:hover, +.btn-warning, +.btn-warning:hover, +.btn-danger, +.btn-danger:hover, +.btn-success, +.btn-success:hover, +.btn-info, +.btn-info:hover, +.btn-inverse, +.btn-inverse:hover { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} + +.btn-primary.active, +.btn-warning.active, +.btn-danger.active, +.btn-success.active, +.btn-info.active, +.btn-inverse.active { + color: rgba(255, 255, 255, 0.75); +} + +.btn { + border-color: #ccc; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); +} + +.btn-primary { + background-color: #0074cc; + *background-color: #0055cc; + background-image: -ms-linear-gradient(top, #0088cc, #0055cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0055cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0055cc); + background-image: -o-linear-gradient(top, #0088cc, #0055cc); + background-image: -moz-linear-gradient(top, #0088cc, #0055cc); + background-image: linear-gradient(top, #0088cc, #0055cc); + background-repeat: repeat-x; + border-color: #0055cc #0055cc #003580; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#0088cc', endColorstr='#0055cc', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-primary:hover, +.btn-primary:active, +.btn-primary.active, +.btn-primary.disabled, +.btn-primary[disabled] { + background-color: #0055cc; + *background-color: #004ab3; +} + +.btn-primary:active, +.btn-primary.active { + background-color: #004099 \9; +} + +.btn-warning { + background-color: #faa732; + *background-color: #f89406; + background-image: -ms-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(top, #fbb450, #f89406); + background-repeat: repeat-x; + border-color: #f89406 #f89406 #ad6704; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-warning:hover, +.btn-warning:active, +.btn-warning.active, +.btn-warning.disabled, +.btn-warning[disabled] { + background-color: #f89406; + *background-color: #df8505; +} + +.btn-warning:active, +.btn-warning.active { + background-color: #c67605 \9; +} + +.btn-danger { + background-color: #da4f49; + *background-color: #bd362f; + background-image: -ms-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); + background-image: linear-gradient(top, #ee5f5b, #bd362f); + background-repeat: repeat-x; + border-color: #bd362f #bd362f #802420; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-danger:hover, +.btn-danger:active, +.btn-danger.active, +.btn-danger.disabled, +.btn-danger[disabled] { + background-color: #bd362f; + *background-color: #a9302a; +} + +.btn-danger:active, +.btn-danger.active { + background-color: #942a25 \9; +} + +.btn-success { + background-color: #5bb75b; + *background-color: #51a351; + background-image: -ms-linear-gradient(top, #62c462, #51a351); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); + background-image: -webkit-linear-gradient(top, #62c462, #51a351); + background-image: -o-linear-gradient(top, #62c462, #51a351); + background-image: -moz-linear-gradient(top, #62c462, #51a351); + background-image: linear-gradient(top, #62c462, #51a351); + background-repeat: repeat-x; + border-color: #51a351 #51a351 #387038; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-success:hover, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + background-color: #51a351; + *background-color: #499249; +} + +.btn-success:active, +.btn-success.active { + background-color: #408140 \9; +} + +.btn-info { + background-color: #49afcd; + *background-color: #2f96b4; + background-image: -ms-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); + background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); + background-image: linear-gradient(top, #5bc0de, #2f96b4); + background-repeat: repeat-x; + border-color: #2f96b4 #2f96b4 #1f6377; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-info:hover, +.btn-info:active, +.btn-info.active, +.btn-info.disabled, +.btn-info[disabled] { + background-color: #2f96b4; + *background-color: #2a85a0; +} + +.btn-info:active, +.btn-info.active { + background-color: #24748c \9; +} + +.btn-inverse { + background-color: #414141; + *background-color: #222222; + background-image: -ms-linear-gradient(top, #555555, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#555555), to(#222222)); + background-image: -webkit-linear-gradient(top, #555555, #222222); + background-image: -o-linear-gradient(top, #555555, #222222); + background-image: -moz-linear-gradient(top, #555555, #222222); + background-image: linear-gradient(top, #555555, #222222); + background-repeat: repeat-x; + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#555555', endColorstr='#222222', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-inverse:hover, +.btn-inverse:active, +.btn-inverse.active, +.btn-inverse.disabled, +.btn-inverse[disabled] { + background-color: #222222; + *background-color: #151515; +} + +.btn-inverse:active, +.btn-inverse.active { + background-color: #080808 \9; +} + +button.btn, +input[type="submit"].btn { + *padding-top: 2px; + *padding-bottom: 2px; +} + +button.btn::-moz-focus-inner, +input[type="submit"].btn::-moz-focus-inner { + padding: 0; + border: 0; +} + +button.btn.btn-large, +input[type="submit"].btn.btn-large { + *padding-top: 7px; + *padding-bottom: 7px; +} + +button.btn.btn-small, +input[type="submit"].btn.btn-small { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn.btn-mini, +input[type="submit"].btn.btn-mini { + *padding-top: 1px; + *padding-bottom: 1px; +} + +.btn-group { + position: relative; + *margin-left: .3em; + *zoom: 1; +} + +.btn-group:before, +.btn-group:after { + display: table; + content: ""; +} + +.btn-group:after { + clear: both; +} + +.btn-group:first-child { + *margin-left: 0; +} + +.btn-group + .btn-group { + margin-left: 5px; +} + +.btn-toolbar { + margin-top: 9px; + margin-bottom: 9px; +} + +.btn-toolbar .btn-group { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; +} + +.btn-group > .btn { + position: relative; + float: left; + margin-left: -1px; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group > .btn:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.btn-group > .btn:last-child, +.btn-group > .dropdown-toggle { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.btn-group > .btn.large:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.btn-group > .btn.large:last-child, +.btn-group > .large.dropdown-toggle { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active { + z-index: 2; +} + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + +.btn-group > .dropdown-toggle { + *padding-top: 4px; + padding-right: 8px; + *padding-bottom: 4px; + padding-left: 8px; + -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group > .btn-mini.dropdown-toggle { + padding-right: 5px; + padding-left: 5px; +} + +.btn-group > .btn-small.dropdown-toggle { + *padding-top: 4px; + *padding-bottom: 4px; +} + +.btn-group > .btn-large.dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} + +.btn-group.open .dropdown-toggle { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group.open .btn.dropdown-toggle { + background-color: #e6e6e6; +} + +.btn-group.open .btn-primary.dropdown-toggle { + background-color: #0055cc; +} + +.btn-group.open .btn-warning.dropdown-toggle { + background-color: #f89406; +} + +.btn-group.open .btn-danger.dropdown-toggle { + background-color: #bd362f; +} + +.btn-group.open .btn-success.dropdown-toggle { + background-color: #51a351; +} + +.btn-group.open .btn-info.dropdown-toggle { + background-color: #2f96b4; +} + +.btn-group.open .btn-inverse.dropdown-toggle { + background-color: #222222; +} + +.btn .caret { + margin-top: 7px; + margin-left: 0; +} + +.btn:hover .caret, +.open.btn-group .caret { + opacity: 1; + filter: alpha(opacity=100); +} + +.btn-mini .caret { + margin-top: 5px; +} + +.btn-small .caret { + margin-top: 6px; +} + +.btn-large .caret { + margin-top: 6px; + border-top-width: 5px; + border-right-width: 5px; + border-left-width: 5px; +} + +.dropup .btn-large .caret { + border-top: 0; + border-bottom: 5px solid #000000; +} + +.btn-primary .caret, +.btn-warning .caret, +.btn-danger .caret, +.btn-info .caret, +.btn-success .caret, +.btn-inverse .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; + opacity: 0.75; + filter: alpha(opacity=75); +} + +.alert { + padding: 8px 35px 8px 14px; + margin-bottom: 18px; + color: #c09853; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + background-color: #fcf8e3; + border: 1px solid #fbeed5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.alert-heading { + color: inherit; +} + +.alert .close { + position: relative; + top: -2px; + right: -21px; + line-height: 18px; +} + +.alert-success { + color: #468847; + background-color: #dff0d8; + border-color: #d6e9c6; +} + +.alert-danger, +.alert-error { + color: #b94a48; + background-color: #f2dede; + border-color: #eed3d7; +} + +.alert-info { + color: #3a87ad; + background-color: #d9edf7; + border-color: #bce8f1; +} + +.alert-block { + padding-top: 14px; + padding-bottom: 14px; +} + +.alert-block > p, +.alert-block > ul { + margin-bottom: 0; +} + +.alert-block p + p { + margin-top: 5px; +} + +.nav { + margin-bottom: 18px; + margin-left: 0; + list-style: none; +} + +.nav > li > a { + display: block; +} + +.nav > li > a:hover { + text-decoration: none; + background-color: #eeeeee; +} + +.nav > .pull-right { + float: right; +} + +.nav .nav-header { + display: block; + padding: 3px 15px; + font-size: 11px; + font-weight: bold; + line-height: 18px; + color: #999999; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + text-transform: uppercase; +} + +.nav li + .nav-header { + margin-top: 9px; +} + +.nav-list { + padding-right: 15px; + padding-left: 15px; + margin-bottom: 0; +} + +.nav-list > li > a, +.nav-list .nav-header { + margin-right: -15px; + margin-left: -15px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} + +.nav-list > li > a { + padding: 3px 15px; +} + +.nav-list > .active > a, +.nav-list > .active > a:hover { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + background-color: #0088cc; +} + +.nav-list [class^="icon-"] { + margin-right: 2px; +} + +.nav-list .divider { + *width: 100%; + height: 1px; + margin: 8px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.nav-tabs, +.nav-pills { + *zoom: 1; +} + +.nav-tabs:before, +.nav-pills:before, +.nav-tabs:after, +.nav-pills:after { + display: table; + content: ""; +} + +.nav-tabs:after, +.nav-pills:after { + clear: both; +} + +.nav-tabs > li, +.nav-pills > li { + float: left; +} + +.nav-tabs > li > a, +.nav-pills > li > a { + padding-right: 12px; + padding-left: 12px; + margin-right: 2px; + line-height: 14px; +} + +.nav-tabs { + border-bottom: 1px solid #ddd; +} + +.nav-tabs > li { + margin-bottom: -1px; +} + +.nav-tabs > li > a { + padding-top: 8px; + padding-bottom: 8px; + line-height: 18px; + border: 1px solid transparent; + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #dddddd; +} + +.nav-tabs > .active > a, +.nav-tabs > .active > a:hover { + color: #555555; + cursor: default; + background-color: #ffffff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} + +.nav-pills > li > a { + padding-top: 8px; + padding-bottom: 8px; + margin-top: 2px; + margin-bottom: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.nav-pills > .active > a, +.nav-pills > .active > a:hover { + color: #ffffff; + background-color: #0088cc; +} + +.nav-stacked > li { + float: none; +} + +.nav-stacked > li > a { + margin-right: 0; +} + +.nav-tabs.nav-stacked { + border-bottom: 0; +} + +.nav-tabs.nav-stacked > li > a { + border: 1px solid #ddd; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.nav-tabs.nav-stacked > li:first-child > a { + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.nav-tabs.nav-stacked > li:last-child > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.nav-tabs.nav-stacked > li > a:hover { + z-index: 2; + border-color: #ddd; +} + +.nav-pills.nav-stacked > li > a { + margin-bottom: 3px; +} + +.nav-pills.nav-stacked > li:last-child > a { + margin-bottom: 1px; +} + +.nav-tabs .dropdown-menu { + -webkit-border-radius: 0 0 5px 5px; + -moz-border-radius: 0 0 5px 5px; + border-radius: 0 0 5px 5px; +} + +.nav-pills .dropdown-menu { + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.nav-tabs .dropdown-toggle .caret, +.nav-pills .dropdown-toggle .caret { + margin-top: 6px; + border-top-color: #0088cc; + border-bottom-color: #0088cc; +} + +.nav-tabs .dropdown-toggle:hover .caret, +.nav-pills .dropdown-toggle:hover .caret { + border-top-color: #005580; + border-bottom-color: #005580; +} + +.nav-tabs .active .dropdown-toggle .caret, +.nav-pills .active .dropdown-toggle .caret { + border-top-color: #333333; + border-bottom-color: #333333; +} + +.nav > .dropdown.active > a:hover { + color: #000000; + cursor: pointer; +} + +.nav-tabs .open .dropdown-toggle, +.nav-pills .open .dropdown-toggle, +.nav > li.dropdown.open.active > a:hover { + color: #ffffff; + background-color: #999999; + border-color: #999999; +} + +.nav li.dropdown.open .caret, +.nav li.dropdown.open.active .caret, +.nav li.dropdown.open a:hover .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; + opacity: 1; + filter: alpha(opacity=100); +} + +.tabs-stacked .open > a:hover { + border-color: #999999; +} + +.tabbable { + *zoom: 1; +} + +.tabbable:before, +.tabbable:after { + display: table; + content: ""; +} + +.tabbable:after { + clear: both; +} + +.tab-content { + overflow: auto; +} + +.tabs-below > .nav-tabs, +.tabs-right > .nav-tabs, +.tabs-left > .nav-tabs { + border-bottom: 0; +} + +.tab-content > .tab-pane, +.pill-content > .pill-pane { + display: none; +} + +.tab-content > .active, +.pill-content > .active { + display: block; +} + +.tabs-below > .nav-tabs { + border-top: 1px solid #ddd; +} + +.tabs-below > .nav-tabs > li { + margin-top: -1px; + margin-bottom: 0; +} + +.tabs-below > .nav-tabs > li > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.tabs-below > .nav-tabs > li > a:hover { + border-top-color: #ddd; + border-bottom-color: transparent; +} + +.tabs-below > .nav-tabs > .active > a, +.tabs-below > .nav-tabs > .active > a:hover { + border-color: transparent #ddd #ddd #ddd; +} + +.tabs-left > .nav-tabs > li, +.tabs-right > .nav-tabs > li { + float: none; +} + +.tabs-left > .nav-tabs > li > a, +.tabs-right > .nav-tabs > li > a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px; +} + +.tabs-left > .nav-tabs { + float: left; + margin-right: 19px; + border-right: 1px solid #ddd; +} + +.tabs-left > .nav-tabs > li > a { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.tabs-left > .nav-tabs > li > a:hover { + border-color: #eeeeee #dddddd #eeeeee #eeeeee; +} + +.tabs-left > .nav-tabs .active > a, +.tabs-left > .nav-tabs .active > a:hover { + border-color: #ddd transparent #ddd #ddd; + *border-right-color: #ffffff; +} + +.tabs-right > .nav-tabs { + float: right; + margin-left: 19px; + border-left: 1px solid #ddd; +} + +.tabs-right > .nav-tabs > li > a { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.tabs-right > .nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #eeeeee #dddddd; +} + +.tabs-right > .nav-tabs .active > a, +.tabs-right > .nav-tabs .active > a:hover { + border-color: #ddd #ddd #ddd transparent; + *border-left-color: #ffffff; +} + +.navbar { + *position: relative; + *z-index: 2; + margin-bottom: 18px; + overflow: visible; +} + +.navbar-inner { + min-height: 40px; + padding-right: 20px; + padding-left: 20px; + background-color: #2c2c2c; + background-image: -moz-linear-gradient(top, #333333, #222222); + background-image: -ms-linear-gradient(top, #333333, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); + background-image: -webkit-linear-gradient(top, #333333, #222222); + background-image: -o-linear-gradient(top, #333333, #222222); + background-image: linear-gradient(top, #333333, #222222); + background-repeat: repeat-x; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); +} + +.navbar .container { + width: auto; +} + +.nav-collapse.collapse { + height: auto; +} + +.navbar { + color: #999999; +} + +.navbar .brand:hover { + text-decoration: none; +} + +.navbar .brand { + display: block; + float: left; + padding: 8px 20px 12px; + margin-left: -20px; + font-size: 20px; + font-weight: 200; + line-height: 1; + color: #999999; +} + +.navbar .navbar-text { + margin-bottom: 0; + line-height: 40px; +} + +.navbar .navbar-link { + color: #999999; +} + +.navbar .navbar-link:hover { + color: #ffffff; +} + +.navbar .btn, +.navbar .btn-group { + margin-top: 5px; +} + +.navbar .btn-group .btn { + margin: 0; +} + +.navbar-form { + margin-bottom: 0; + *zoom: 1; +} + +.navbar-form:before, +.navbar-form:after { + display: table; + content: ""; +} + +.navbar-form:after { + clear: both; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .radio, +.navbar-form .checkbox { + margin-top: 5px; +} + +.navbar-form input, +.navbar-form select { + display: inline-block; + margin-bottom: 0; +} + +.navbar-form input[type="image"], +.navbar-form input[type="checkbox"], +.navbar-form input[type="radio"] { + margin-top: 3px; +} + +.navbar-form .input-append, +.navbar-form .input-prepend { + margin-top: 6px; + white-space: nowrap; +} + +.navbar-form .input-append input, +.navbar-form .input-prepend input { + margin-top: 0; +} + +.navbar-search { + position: relative; + float: left; + margin-top: 6px; + margin-bottom: 0; +} + +.navbar-search .search-query { + padding: 4px 9px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 1; + color: #ffffff; + background-color: #626262; + border: 1px solid #151515; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -webkit-transition: none; + -moz-transition: none; + -ms-transition: none; + -o-transition: none; + transition: none; +} + +.navbar-search .search-query:-moz-placeholder { + color: #cccccc; +} + +.navbar-search .search-query:-ms-input-placeholder { + color: #cccccc; +} + +.navbar-search .search-query::-webkit-input-placeholder { + color: #cccccc; +} + +.navbar-search .search-query:focus, +.navbar-search .search-query.focused { + padding: 5px 10px; + color: #333333; + text-shadow: 0 1px 0 #ffffff; + background-color: #ffffff; + border: 0; + outline: 0; + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); +} + +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; + margin-bottom: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-fixed-bottom .navbar-inner { + padding-right: 0; + padding-left: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.navbar-fixed-top { + top: 0; +} + +.navbar-fixed-bottom { + bottom: 0; +} + +.navbar .nav { + position: relative; + left: 0; + display: block; + float: left; + margin: 0 10px 0 0; +} + +.navbar .nav.pull-right { + float: right; +} + +.navbar .nav > li { + display: block; + float: left; +} + +.navbar .nav > li > a { + float: none; + padding: 9px 10px 11px; + line-height: 19px; + color: #999999; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} + +.navbar .btn { + display: inline-block; + padding: 4px 10px 4px; + margin: 5px 5px 6px; + line-height: 18px; +} + +.navbar .btn-group { + padding: 5px 5px 6px; + margin: 0; +} + +.navbar .nav > li > a:hover { + color: #ffffff; + text-decoration: none; + background-color: transparent; +} + +.navbar .nav .active > a, +.navbar .nav .active > a:hover { + color: #ffffff; + text-decoration: none; + background-color: #222222; +} + +.navbar .divider-vertical { + width: 1px; + height: 40px; + margin: 0 9px; + overflow: hidden; + background-color: #222222; + border-right: 1px solid #333333; +} + +.navbar .nav.pull-right { + margin-right: 0; + margin-left: 10px; +} + +.navbar .btn-navbar { + display: none; + float: right; + padding: 7px 10px; + margin-right: 5px; + margin-left: 5px; + background-color: #2c2c2c; + *background-color: #222222; + background-image: -ms-linear-gradient(top, #333333, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); + background-image: -webkit-linear-gradient(top, #333333, #222222); + background-image: -o-linear-gradient(top, #333333, #222222); + background-image: linear-gradient(top, #333333, #222222); + background-image: -moz-linear-gradient(top, #333333, #222222); + background-repeat: repeat-x; + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); +} + +.navbar .btn-navbar:hover, +.navbar .btn-navbar:active, +.navbar .btn-navbar.active, +.navbar .btn-navbar.disabled, +.navbar .btn-navbar[disabled] { + background-color: #222222; + *background-color: #151515; +} + +.navbar .btn-navbar:active, +.navbar .btn-navbar.active { + background-color: #080808 \9; +} + +.navbar .btn-navbar .icon-bar { + display: block; + width: 18px; + height: 2px; + background-color: #f5f5f5; + -webkit-border-radius: 1px; + -moz-border-radius: 1px; + border-radius: 1px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); +} + +.btn-navbar .icon-bar + .icon-bar { + margin-top: 3px; +} + +.navbar .dropdown-menu:before { + position: absolute; + top: -7px; + left: 9px; + display: inline-block; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; +} + +.navbar .dropdown-menu:after { + position: absolute; + top: -6px; + left: 10px; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + border-left: 6px solid transparent; + content: ''; +} + +.navbar-fixed-bottom .dropdown-menu:before { + top: auto; + bottom: -7px; + border-top: 7px solid #ccc; + border-bottom: 0; + border-top-color: rgba(0, 0, 0, 0.2); +} + +.navbar-fixed-bottom .dropdown-menu:after { + top: auto; + bottom: -6px; + border-top: 6px solid #ffffff; + border-bottom: 0; +} + +.navbar .nav li.dropdown .dropdown-toggle .caret, +.navbar .nav li.dropdown.open .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar .nav li.dropdown.active .caret { + opacity: 1; + filter: alpha(opacity=100); +} + +.navbar .nav li.dropdown.open > .dropdown-toggle, +.navbar .nav li.dropdown.active > .dropdown-toggle, +.navbar .nav li.dropdown.open.active > .dropdown-toggle { + background-color: transparent; +} + +.navbar .nav li.dropdown.active > .dropdown-toggle:hover { + color: #ffffff; +} + +.navbar .pull-right .dropdown-menu, +.navbar .dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.navbar .pull-right .dropdown-menu:before, +.navbar .dropdown-menu.pull-right:before { + right: 12px; + left: auto; +} + +.navbar .pull-right .dropdown-menu:after, +.navbar .dropdown-menu.pull-right:after { + right: 13px; + left: auto; +} + +.breadcrumb { + padding: 7px 14px; + margin: 0 0 18px; + list-style: none; + background-color: #fbfbfb; + background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5); + background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5)); + background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5); + background-image: -o-linear-gradient(top, #ffffff, #f5f5f5); + background-image: linear-gradient(top, #ffffff, #f5f5f5); + background-repeat: repeat-x; + border: 1px solid #ddd; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0); + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; +} + +.breadcrumb li { + display: inline-block; + *display: inline; + text-shadow: 0 1px 0 #ffffff; + *zoom: 1; +} + +.breadcrumb .divider { + padding: 0 5px; + color: #999999; +} + +.breadcrumb .active a { + color: #333333; +} + +.pagination { + height: 36px; + margin: 18px 0; +} + +.pagination ul { + display: inline-block; + *display: inline; + margin-bottom: 0; + margin-left: 0; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + *zoom: 1; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.pagination li { + display: inline; +} + +.pagination a { + float: left; + padding: 0 14px; + line-height: 34px; + text-decoration: none; + border: 1px solid #ddd; + border-left-width: 0; +} + +.pagination a:hover, +.pagination .active a { + background-color: #f5f5f5; +} + +.pagination .active a { + color: #999999; + cursor: default; +} + +.pagination .disabled span, +.pagination .disabled a, +.pagination .disabled a:hover { + color: #999999; + cursor: default; + background-color: transparent; +} + +.pagination li:first-child a { + border-left-width: 1px; + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} + +.pagination li:last-child a { + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} + +.pagination-centered { + text-align: center; +} + +.pagination-right { + text-align: right; +} + +.pager { + margin-bottom: 18px; + margin-left: 0; + text-align: center; + list-style: none; + *zoom: 1; +} + +.pager:before, +.pager:after { + display: table; + content: ""; +} + +.pager:after { + clear: both; +} + +.pager li { + display: inline; +} + +.pager a { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.pager a:hover { + text-decoration: none; + background-color: #f5f5f5; +} + +.pager .next a { + float: right; +} + +.pager .previous a { + float: left; +} + +.pager .disabled a, +.pager .disabled a:hover { + color: #999999; + cursor: default; + background-color: #fff; +} + +.modal-open .dropdown-menu { + z-index: 2050; +} + +.modal-open .dropdown.open { + *z-index: 2050; +} + +.modal-open .popover { + z-index: 2060; +} + +.modal-open .tooltip { + z-index: 2070; +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} + +.modal-backdrop.fade { + opacity: 0; +} + +.modal-backdrop, +.modal-backdrop.fade.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.modal { + position: fixed; + top: 50%; + left: 50%; + z-index: 1050; + width: 560px; + margin: -250px 0 0 -280px; + overflow: auto; + background-color: #ffffff; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.3); + *border: 1px solid #999; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; +} + +.modal.fade { + top: -25%; + -webkit-transition: opacity 0.3s linear, top 0.3s ease-out; + -moz-transition: opacity 0.3s linear, top 0.3s ease-out; + -ms-transition: opacity 0.3s linear, top 0.3s ease-out; + -o-transition: opacity 0.3s linear, top 0.3s ease-out; + transition: opacity 0.3s linear, top 0.3s ease-out; +} + +.modal.fade.in { + top: 50%; +} + +.modal-header { + padding: 9px 15px; + border-bottom: 1px solid #eee; +} + +.modal-header .close { + margin-top: 2px; +} + +.modal-body { + max-height: 400px; + padding: 15px; + overflow-y: auto; +} + +.modal-form { + margin-bottom: 0; +} + +.modal-footer { + padding: 14px 15px 15px; + margin-bottom: 0; + text-align: right; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; +} + +.modal-footer:before, +.modal-footer:after { + display: table; + content: ""; +} + +.modal-footer:after { + clear: both; +} + +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} + +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} + +.tooltip { + position: absolute; + z-index: 1020; + display: block; + padding: 5px; + font-size: 11px; + opacity: 0; + filter: alpha(opacity=0); + visibility: visible; +} + +.tooltip.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.tooltip.top { + margin-top: -2px; +} + +.tooltip.right { + margin-left: 2px; +} + +.tooltip.bottom { + margin-top: 2px; +} + +.tooltip.left { + margin-left: -2px; +} + +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-top: 5px solid #000000; + border-right: 5px solid transparent; + border-left: 5px solid transparent; +} + +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + border-left: 5px solid #000000; +} + +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-right: 5px solid transparent; + border-bottom: 5px solid #000000; + border-left: 5px solid transparent; +} + +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-top: 5px solid transparent; + border-right: 5px solid #000000; + border-bottom: 5px solid transparent; +} + +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + padding: 5px; +} + +.popover.top { + margin-top: -5px; +} + +.popover.right { + margin-left: 5px; +} + +.popover.bottom { + margin-top: 5px; +} + +.popover.left { + margin-left: -5px; +} + +.popover.top .arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-top: 5px solid #000000; + border-right: 5px solid transparent; + border-left: 5px solid transparent; +} + +.popover.right .arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-top: 5px solid transparent; + border-right: 5px solid #000000; + border-bottom: 5px solid transparent; +} + +.popover.bottom .arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-right: 5px solid transparent; + border-bottom: 5px solid #000000; + border-left: 5px solid transparent; +} + +.popover.left .arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + border-left: 5px solid #000000; +} + +.popover .arrow { + position: absolute; + width: 0; + height: 0; +} + +.popover-inner { + width: 280px; + padding: 3px; + overflow: hidden; + background: #000000; + background: rgba(0, 0, 0, 0.8); + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); +} + +.popover-title { + padding: 9px 15px; + line-height: 1; + background-color: #f5f5f5; + border-bottom: 1px solid #eee; + -webkit-border-radius: 3px 3px 0 0; + -moz-border-radius: 3px 3px 0 0; + border-radius: 3px 3px 0 0; +} + +.popover-content { + padding: 14px; + background-color: #ffffff; + -webkit-border-radius: 0 0 3px 3px; + -moz-border-radius: 0 0 3px 3px; + border-radius: 0 0 3px 3px; + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; +} + +.popover-content p, +.popover-content ul, +.popover-content ol { + margin-bottom: 0; +} + +.thumbnails { + margin-left: -20px; + list-style: none; + *zoom: 1; +} + +.thumbnails:before, +.thumbnails:after { + display: table; + content: ""; +} + +.thumbnails:after { + clear: both; +} + +.row-fluid .thumbnails { + margin-left: 0; +} + +.thumbnails > li { + float: left; + margin-bottom: 18px; + margin-left: 20px; +} + +.thumbnail { + display: block; + padding: 4px; + line-height: 1; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); +} + +a.thumbnail:hover { + border-color: #0088cc; + -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); +} + +.thumbnail > img { + display: block; + max-width: 100%; + margin-right: auto; + margin-left: auto; +} + +.thumbnail .caption { + padding: 9px; +} + +.label, +.badge { + font-size: 10.998px; + font-weight: bold; + line-height: 14px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + white-space: nowrap; + vertical-align: baseline; + background-color: #999999; +} + +.label { + padding: 1px 4px 2px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.badge { + padding: 1px 9px 2px; + -webkit-border-radius: 9px; + -moz-border-radius: 9px; + border-radius: 9px; +} + +a.label:hover, +a.badge:hover { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} + +.label-important, +.badge-important { + background-color: #b94a48; +} + +.label-important[href], +.badge-important[href] { + background-color: #953b39; +} + +.label-warning, +.badge-warning { + background-color: #f89406; +} + +.label-warning[href], +.badge-warning[href] { + background-color: #c67605; +} + +.label-success, +.badge-success { + background-color: #468847; +} + +.label-success[href], +.badge-success[href] { + background-color: #356635; +} + +.label-info, +.badge-info { + background-color: #3a87ad; +} + +.label-info[href], +.badge-info[href] { + background-color: #2d6987; +} + +.label-inverse, +.badge-inverse { + background-color: #333333; +} + +.label-inverse[href], +.badge-inverse[href] { + background-color: #1a1a1a; +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-moz-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-ms-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-o-keyframes progress-bar-stripes { + from { + background-position: 0 0; + } + to { + background-position: 40px 0; + } +} + +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +.progress { + height: 18px; + margin-bottom: 18px; + overflow: hidden; + background-color: #f7f7f7; + background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -ms-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); + background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: linear-gradient(top, #f5f5f5, #f9f9f9); + background-repeat: repeat-x; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0); + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.progress .bar { + width: 0; + height: 18px; + font-size: 12px; + color: #ffffff; + text-align: center; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e90d2; + background-image: -moz-linear-gradient(top, #149bdf, #0480be); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); + background-image: -webkit-linear-gradient(top, #149bdf, #0480be); + background-image: -o-linear-gradient(top, #149bdf, #0480be); + background-image: linear-gradient(top, #149bdf, #0480be); + background-image: -ms-linear-gradient(top, #149bdf, #0480be); + background-repeat: repeat-x; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0); + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: width 0.6s ease; + -moz-transition: width 0.6s ease; + -ms-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} + +.progress-striped .bar { + background-color: #149bdf; + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + -moz-background-size: 40px 40px; + -o-background-size: 40px 40px; + background-size: 40px 40px; +} + +.progress.active .bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -moz-animation: progress-bar-stripes 2s linear infinite; + -ms-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} + +.progress-danger .bar { + background-color: #dd514c; + background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); + background-image: linear-gradient(top, #ee5f5b, #c43c35); + background-repeat: repeat-x; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0); +} + +.progress-danger.progress-striped .bar { + background-color: #ee5f5b; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-success .bar { + background-color: #5eb95e; + background-image: -moz-linear-gradient(top, #62c462, #57a957); + background-image: -ms-linear-gradient(top, #62c462, #57a957); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); + background-image: -webkit-linear-gradient(top, #62c462, #57a957); + background-image: -o-linear-gradient(top, #62c462, #57a957); + background-image: linear-gradient(top, #62c462, #57a957); + background-repeat: repeat-x; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0); +} + +.progress-success.progress-striped .bar { + background-color: #62c462; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-info .bar { + background-color: #4bb1cf; + background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); + background-image: -ms-linear-gradient(top, #5bc0de, #339bb9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); + background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); + background-image: -o-linear-gradient(top, #5bc0de, #339bb9); + background-image: linear-gradient(top, #5bc0de, #339bb9); + background-repeat: repeat-x; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0); +} + +.progress-info.progress-striped .bar { + background-color: #5bc0de; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-warning .bar { + background-color: #faa732; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -ms-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(top, #fbb450, #f89406); + background-repeat: repeat-x; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0); +} + +.progress-warning.progress-striped .bar { + background-color: #fbb450; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.accordion { + margin-bottom: 18px; +} + +.accordion-group { + margin-bottom: 2px; + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.accordion-heading { + border-bottom: 0; +} + +.accordion-heading .accordion-toggle { + display: block; + padding: 8px 15px; +} + +.accordion-toggle { + cursor: pointer; +} + +.accordion-inner { + padding: 9px 15px; + border-top: 1px solid #e5e5e5; +} + +.carousel { + position: relative; + margin-bottom: 18px; + line-height: 1; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} + +.carousel .item { + position: relative; + display: none; + -webkit-transition: 0.6s ease-in-out left; + -moz-transition: 0.6s ease-in-out left; + -ms-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} + +.carousel .item > img { + display: block; + line-height: 1; +} + +.carousel .active, +.carousel .next, +.carousel .prev { + display: block; +} + +.carousel .active { + left: 0; +} + +.carousel .next, +.carousel .prev { + position: absolute; + top: 0; + width: 100%; +} + +.carousel .next { + left: 100%; +} + +.carousel .prev { + left: -100%; +} + +.carousel .next.left, +.carousel .prev.right { + left: 0; +} + +.carousel .active.left { + left: -100%; +} + +.carousel .active.right { + left: 100%; +} + +.carousel-control { + position: absolute; + top: 40%; + left: 15px; + width: 40px; + height: 40px; + margin-top: -20px; + font-size: 60px; + font-weight: 100; + line-height: 30px; + color: #ffffff; + text-align: center; + background: #222222; + border: 3px solid #ffffff; + -webkit-border-radius: 23px; + -moz-border-radius: 23px; + border-radius: 23px; + opacity: 0.5; + filter: alpha(opacity=50); +} + +.carousel-control.right { + right: 15px; + left: auto; +} + +.carousel-control:hover { + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} + +.carousel-caption { + position: absolute; + right: 0; + bottom: 0; + left: 0; + padding: 10px 15px 5px; + background: #333333; + background: rgba(0, 0, 0, 0.75); +} + +.carousel-caption h4, +.carousel-caption p { + color: #ffffff; +} + +.hero-unit { + padding: 60px; + margin-bottom: 30px; + background-color: #eeeeee; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.hero-unit h1 { + margin-bottom: 0; + font-size: 60px; + line-height: 1; + letter-spacing: -1px; + color: inherit; +} + +.hero-unit p { + font-size: 18px; + font-weight: 200; + line-height: 27px; + color: inherit; +} + +.pull-right { + float: right; +} + +.pull-left { + float: left; +} + +.hide { + display: none; +} + +.show { + display: block; +} + +.invisible { + visibility: hidden; +} diff --git a/app-manage-api/src/test/java/com/enzhico/jwt/socket/client/html/event-index.html b/app-manage-api/src/test/java/com/enzhico/jwt/socket/client/html/event-index.html new file mode 100644 index 0000000..dde6865 --- /dev/null +++ b/app-manage-api/src/test/java/com/enzhico/jwt/socket/client/html/event-index.html @@ -0,0 +1,91 @@ + + + + + + + Demo Chat + + + + + + + + + + + + + + + +

    Netty-socketio Demo Chat

    + +
    + +
    +
    + +
    + + + +
    + + + + + + diff --git a/app-manage-api/src/test/java/com/enzhico/jwt/socket/client/html/index.html b/app-manage-api/src/test/java/com/enzhico/jwt/socket/client/html/index.html new file mode 100644 index 0000000..749e2a9 --- /dev/null +++ b/app-manage-api/src/test/java/com/enzhico/jwt/socket/client/html/index.html @@ -0,0 +1,104 @@ + + + + + + + Demo Chat + + + + + + + + + + + + + + + +

    Netty-socketio Demo Chat

    + +
    + +
    +
    + +
    + + + +
    + + + + + + diff --git a/app-manage-api/src/test/java/com/enzhico/jwt/socket/client/html/js/jquery-1.7.2.min.js b/app-manage-api/src/test/java/com/enzhico/jwt/socket/client/html/js/jquery-1.7.2.min.js new file mode 100644 index 0000000..16ad06c --- /dev/null +++ b/app-manage-api/src/test/java/com/enzhico/jwt/socket/client/html/js/jquery-1.7.2.min.js @@ -0,0 +1,4 @@ +/*! jQuery v1.7.2 jquery.com | jquery.org/license */ +(function(a,b){function cy(a){return f.isWindow(a)?a:a.nodeType===9?a.defaultView||a.parentWindow:!1}function cu(a){if(!cj[a]){var b=c.body,d=f("<"+a+">").appendTo(b),e=d.css("display");d.remove();if(e==="none"||e===""){ck||(ck=c.createElement("iframe"),ck.frameBorder=ck.width=ck.height=0),b.appendChild(ck);if(!cl||!ck.createElement)cl=(ck.contentWindow||ck.contentDocument).document,cl.write((f.support.boxModel?"":"")+""),cl.close();d=cl.createElement(a),cl.body.appendChild(d),e=f.css(d,"display"),b.removeChild(ck)}cj[a]=e}return cj[a]}function ct(a,b){var c={};f.each(cp.concat.apply([],cp.slice(0,b)),function(){c[this]=a});return c}function cs(){cq=b}function cr(){setTimeout(cs,0);return cq=f.now()}function ci(){try{return new a.ActiveXObject("Microsoft.XMLHTTP")}catch(b){}}function ch(){try{return new a.XMLHttpRequest}catch(b){}}function cb(a,c){a.dataFilter&&(c=a.dataFilter(c,a.dataType));var d=a.dataTypes,e={},g,h,i=d.length,j,k=d[0],l,m,n,o,p;for(g=1;g0){if(c!=="border")for(;e=0===c})}function S(a){return!a||!a.parentNode||a.parentNode.nodeType===11}function K(){return!0}function J(){return!1}function n(a,b,c){var d=b+"defer",e=b+"queue",g=b+"mark",h=f._data(a,d);h&&(c==="queue"||!f._data(a,e))&&(c==="mark"||!f._data(a,g))&&setTimeout(function(){!f._data(a,e)&&!f._data(a,g)&&(f.removeData(a,d,!0),h.fire())},0)}function m(a){for(var b in a){if(b==="data"&&f.isEmptyObject(a[b]))continue;if(b!=="toJSON")return!1}return!0}function l(a,c,d){if(d===b&&a.nodeType===1){var e="data-"+c.replace(k,"-$1").toLowerCase();d=a.getAttribute(e);if(typeof d=="string"){try{d=d==="true"?!0:d==="false"?!1:d==="null"?null:f.isNumeric(d)?+d:j.test(d)?f.parseJSON(d):d}catch(g){}f.data(a,c,d)}else d=b}return d}function h(a){var b=g[a]={},c,d;a=a.split(/\s+/);for(c=0,d=a.length;c)[^>]*$|#([\w\-]*)$)/,j=/\S/,k=/^\s+/,l=/\s+$/,m=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,n=/^[\],:{}\s]*$/,o=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,p=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,q=/(?:^|:|,)(?:\s*\[)+/g,r=/(webkit)[ \/]([\w.]+)/,s=/(opera)(?:.*version)?[ \/]([\w.]+)/,t=/(msie) ([\w.]+)/,u=/(mozilla)(?:.*? rv:([\w.]+))?/,v=/-([a-z]|[0-9])/ig,w=/^-ms-/,x=function(a,b){return(b+"").toUpperCase()},y=d.userAgent,z,A,B,C=Object.prototype.toString,D=Object.prototype.hasOwnProperty,E=Array.prototype.push,F=Array.prototype.slice,G=String.prototype.trim,H=Array.prototype.indexOf,I={};e.fn=e.prototype={constructor:e,init:function(a,d,f){var g,h,j,k;if(!a)return this;if(a.nodeType){this.context=this[0]=a,this.length=1;return this}if(a==="body"&&!d&&c.body){this.context=c,this[0]=c.body,this.selector=a,this.length=1;return this}if(typeof a=="string"){a.charAt(0)!=="<"||a.charAt(a.length-1)!==">"||a.length<3?g=i.exec(a):g=[null,a,null];if(g&&(g[1]||!d)){if(g[1]){d=d instanceof e?d[0]:d,k=d?d.ownerDocument||d:c,j=m.exec(a),j?e.isPlainObject(d)?(a=[c.createElement(j[1])],e.fn.attr.call(a,d,!0)):a=[k.createElement(j[1])]:(j=e.buildFragment([g[1]],[k]),a=(j.cacheable?e.clone(j.fragment):j.fragment).childNodes);return e.merge(this,a)}h=c.getElementById(g[2]);if(h&&h.parentNode){if(h.id!==g[2])return f.find(a);this.length=1,this[0]=h}this.context=c,this.selector=a;return this}return!d||d.jquery?(d||f).find(a):this.constructor(d).find(a)}if(e.isFunction(a))return f.ready(a);a.selector!==b&&(this.selector=a.selector,this.context=a.context);return e.makeArray(a,this)},selector:"",jquery:"1.7.2",length:0,size:function(){return this.length},toArray:function(){return F.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this[this.length+a]:this[a]},pushStack:function(a,b,c){var d=this.constructor();e.isArray(a)?E.apply(d,a):e.merge(d,a),d.prevObject=this,d.context=this.context,b==="find"?d.selector=this.selector+(this.selector?" ":"")+c:b&&(d.selector=this.selector+"."+b+"("+c+")");return d},each:function(a,b){return e.each(this,a,b)},ready:function(a){e.bindReady(),A.add(a);return this},eq:function(a){a=+a;return a===-1?this.slice(a):this.slice(a,a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(F.apply(this,arguments),"slice",F.call(arguments).join(","))},map:function(a){return this.pushStack(e.map(this,function(b,c){return a.call(b,c,b)}))},end:function(){return this.prevObject||this.constructor(null)},push:E,sort:[].sort,splice:[].splice},e.fn.init.prototype=e.fn,e.extend=e.fn.extend=function(){var a,c,d,f,g,h,i=arguments[0]||{},j=1,k=arguments.length,l=!1;typeof i=="boolean"&&(l=i,i=arguments[1]||{},j=2),typeof i!="object"&&!e.isFunction(i)&&(i={}),k===j&&(i=this,--j);for(;j0)return;A.fireWith(c,[e]),e.fn.trigger&&e(c).trigger("ready").off("ready")}},bindReady:function(){if(!A){A=e.Callbacks("once memory");if(c.readyState==="complete")return setTimeout(e.ready,1);if(c.addEventListener)c.addEventListener("DOMContentLoaded",B,!1),a.addEventListener("load",e.ready,!1);else if(c.attachEvent){c.attachEvent("onreadystatechange",B),a.attachEvent("onload",e.ready);var b=!1;try{b=a.frameElement==null}catch(d){}c.documentElement.doScroll&&b&&J()}}},isFunction:function(a){return e.type(a)==="function"},isArray:Array.isArray||function(a){return e.type(a)==="array"},isWindow:function(a){return a!=null&&a==a.window},isNumeric:function(a){return!isNaN(parseFloat(a))&&isFinite(a)},type:function(a){return a==null?String(a):I[C.call(a)]||"object"},isPlainObject:function(a){if(!a||e.type(a)!=="object"||a.nodeType||e.isWindow(a))return!1;try{if(a.constructor&&!D.call(a,"constructor")&&!D.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}var d;for(d in a);return d===b||D.call(a,d)},isEmptyObject:function(a){for(var b in a)return!1;return!0},error:function(a){throw new Error(a)},parseJSON:function(b){if(typeof b!="string"||!b)return null;b=e.trim(b);if(a.JSON&&a.JSON.parse)return a.JSON.parse(b);if(n.test(b.replace(o,"@").replace(p,"]").replace(q,"")))return(new Function("return "+b))();e.error("Invalid JSON: "+b)},parseXML:function(c){if(typeof c!="string"||!c)return null;var d,f;try{a.DOMParser?(f=new DOMParser,d=f.parseFromString(c,"text/xml")):(d=new ActiveXObject("Microsoft.XMLDOM"),d.async="false",d.loadXML(c))}catch(g){d=b}(!d||!d.documentElement||d.getElementsByTagName("parsererror").length)&&e.error("Invalid XML: "+c);return d},noop:function(){},globalEval:function(b){b&&j.test(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(w,"ms-").replace(v,x)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toUpperCase()===b.toUpperCase()},each:function(a,c,d){var f,g=0,h=a.length,i=h===b||e.isFunction(a);if(d){if(i){for(f in a)if(c.apply(a[f],d)===!1)break}else for(;g0&&a[0]&&a[j-1]||j===0||e.isArray(a));if(k)for(;i1?i.call(arguments,0):b,j.notifyWith(k,e)}}function l(a){return function(c){b[a]=arguments.length>1?i.call(arguments,0):c,--g||j.resolveWith(j,b)}}var b=i.call(arguments,0),c=0,d=b.length,e=Array(d),g=d,h=d,j=d<=1&&a&&f.isFunction(a.promise)?a:f.Deferred(),k=j.promise();if(d>1){for(;c
    a",d=p.getElementsByTagName("*"),e=p.getElementsByTagName("a")[0];if(!d||!d.length||!e)return{};g=c.createElement("select"),h=g.appendChild(c.createElement("option")),i=p.getElementsByTagName("input")[0],b={leadingWhitespace:p.firstChild.nodeType===3,tbody:!p.getElementsByTagName("tbody").length,htmlSerialize:!!p.getElementsByTagName("link").length,style:/top/.test(e.getAttribute("style")),hrefNormalized:e.getAttribute("href")==="/a",opacity:/^0.55/.test(e.style.opacity),cssFloat:!!e.style.cssFloat,checkOn:i.value==="on",optSelected:h.selected,getSetAttribute:p.className!=="t",enctype:!!c.createElement("form").enctype,html5Clone:c.createElement("nav").cloneNode(!0).outerHTML!=="<:nav>",submitBubbles:!0,changeBubbles:!0,focusinBubbles:!1,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,pixelMargin:!0},f.boxModel=b.boxModel=c.compatMode==="CSS1Compat",i.checked=!0,b.noCloneChecked=i.cloneNode(!0).checked,g.disabled=!0,b.optDisabled=!h.disabled;try{delete p.test}catch(r){b.deleteExpando=!1}!p.addEventListener&&p.attachEvent&&p.fireEvent&&(p.attachEvent("onclick",function(){b.noCloneEvent=!1}),p.cloneNode(!0).fireEvent("onclick")),i=c.createElement("input"),i.value="t",i.setAttribute("type","radio"),b.radioValue=i.value==="t",i.setAttribute("checked","checked"),i.setAttribute("name","t"),p.appendChild(i),j=c.createDocumentFragment(),j.appendChild(p.lastChild),b.checkClone=j.cloneNode(!0).cloneNode(!0).lastChild.checked,b.appendChecked=i.checked,j.removeChild(i),j.appendChild(p);if(p.attachEvent)for(n in{submit:1,change:1,focusin:1})m="on"+n,o=m in p,o||(p.setAttribute(m,"return;"),o=typeof p[m]=="function"),b[n+"Bubbles"]=o;j.removeChild(p),j=g=h=p=i=null,f(function(){var d,e,g,h,i,j,l,m,n,q,r,s,t,u=c.getElementsByTagName("body")[0];!u||(m=1,t="padding:0;margin:0;border:",r="position:absolute;top:0;left:0;width:1px;height:1px;",s=t+"0;visibility:hidden;",n="style='"+r+t+"5px solid #000;",q="
    "+""+"
    ",d=c.createElement("div"),d.style.cssText=s+"width:0;height:0;position:static;top:0;margin-top:"+m+"px",u.insertBefore(d,u.firstChild),p=c.createElement("div"),d.appendChild(p),p.innerHTML="
    t
    ",k=p.getElementsByTagName("td"),o=k[0].offsetHeight===0,k[0].style.display="",k[1].style.display="none",b.reliableHiddenOffsets=o&&k[0].offsetHeight===0,a.getComputedStyle&&(p.innerHTML="",l=c.createElement("div"),l.style.width="0",l.style.marginRight="0",p.style.width="2px",p.appendChild(l),b.reliableMarginRight=(parseInt((a.getComputedStyle(l,null)||{marginRight:0}).marginRight,10)||0)===0),typeof p.style.zoom!="undefined"&&(p.innerHTML="",p.style.width=p.style.padding="1px",p.style.border=0,p.style.overflow="hidden",p.style.display="inline",p.style.zoom=1,b.inlineBlockNeedsLayout=p.offsetWidth===3,p.style.display="block",p.style.overflow="visible",p.innerHTML="
    ",b.shrinkWrapBlocks=p.offsetWidth!==3),p.style.cssText=r+s,p.innerHTML=q,e=p.firstChild,g=e.firstChild,i=e.nextSibling.firstChild.firstChild,j={doesNotAddBorder:g.offsetTop!==5,doesAddBorderForTableAndCells:i.offsetTop===5},g.style.position="fixed",g.style.top="20px",j.fixedPosition=g.offsetTop===20||g.offsetTop===15,g.style.position=g.style.top="",e.style.overflow="hidden",e.style.position="relative",j.subtractsBorderForOverflowNotVisible=g.offsetTop===-5,j.doesNotIncludeMarginInBodyOffset=u.offsetTop!==m,a.getComputedStyle&&(p.style.marginTop="1%",b.pixelMargin=(a.getComputedStyle(p,null)||{marginTop:0}).marginTop!=="1%"),typeof d.style.zoom!="undefined"&&(d.style.zoom=1),u.removeChild(d),l=p=d=null,f.extend(b,j))});return b}();var j=/^(?:\{.*\}|\[.*\])$/,k=/([A-Z])/g;f.extend({cache:{},uuid:0,expando:"jQuery"+(f.fn.jquery+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(a){a=a.nodeType?f.cache[a[f.expando]]:a[f.expando];return!!a&&!m(a)},data:function(a,c,d,e){if(!!f.acceptData(a)){var g,h,i,j=f.expando,k=typeof c=="string",l=a.nodeType,m=l?f.cache:a,n=l?a[j]:a[j]&&j,o=c==="events";if((!n||!m[n]||!o&&!e&&!m[n].data)&&k&&d===b)return;n||(l?a[j]=n=++f.uuid:n=j),m[n]||(m[n]={},l||(m[n].toJSON=f.noop));if(typeof c=="object"||typeof c=="function")e?m[n]=f.extend(m[n],c):m[n].data=f.extend(m[n].data,c);g=h=m[n],e||(h.data||(h.data={}),h=h.data),d!==b&&(h[f.camelCase(c)]=d);if(o&&!h[c])return g.events;k?(i=h[c],i==null&&(i=h[f.camelCase(c)])):i=h;return i}},removeData:function(a,b,c){if(!!f.acceptData(a)){var d,e,g,h=f.expando,i=a.nodeType,j=i?f.cache:a,k=i?a[h]:h;if(!j[k])return;if(b){d=c?j[k]:j[k].data;if(d){f.isArray(b)||(b in d?b=[b]:(b=f.camelCase(b),b in d?b=[b]:b=b.split(" ")));for(e=0,g=b.length;e1,null,!1)},removeData:function(a){return this.each(function(){f.removeData(this,a)})}}),f.extend({_mark:function(a,b){a&&(b=(b||"fx")+"mark",f._data(a,b,(f._data(a,b)||0)+1))},_unmark:function(a,b,c){a!==!0&&(c=b,b=a,a=!1);if(b){c=c||"fx";var d=c+"mark",e=a?0:(f._data(b,d)||1)-1;e?f._data(b,d,e):(f.removeData(b,d,!0),n(b,c,"mark"))}},queue:function(a,b,c){var d;if(a){b=(b||"fx")+"queue",d=f._data(a,b),c&&(!d||f.isArray(c)?d=f._data(a,b,f.makeArray(c)):d.push(c));return d||[]}},dequeue:function(a,b){b=b||"fx";var c=f.queue(a,b),d=c.shift(),e={};d==="inprogress"&&(d=c.shift()),d&&(b==="fx"&&c.unshift("inprogress"),f._data(a,b+".run",e),d.call(a,function(){f.dequeue(a,b)},e)),c.length||(f.removeData(a,b+"queue "+b+".run",!0),n(a,b,"queue"))}}),f.fn.extend({queue:function(a,c){var d=2;typeof a!="string"&&(c=a,a="fx",d--);if(arguments.length1)},removeAttr:function(a){return this.each(function(){f.removeAttr(this,a)})},prop:function(a,b){return f.access(this,f.prop,a,b,arguments.length>1)},removeProp:function(a){a=f.propFix[a]||a;return this.each(function(){try{this[a]=b,delete this[a]}catch(c){}})},addClass:function(a){var b,c,d,e,g,h,i;if(f.isFunction(a))return this.each(function(b){f(this).addClass(a.call(this,b,this.className))});if(a&&typeof a=="string"){b=a.split(p);for(c=0,d=this.length;c-1)return!0;return!1},val:function(a){var c,d,e,g=this[0];{if(!!arguments.length){e=f.isFunction(a);return this.each(function(d){var g=f(this),h;if(this.nodeType===1){e?h=a.call(this,d,g.val()):h=a,h==null?h="":typeof h=="number"?h+="":f.isArray(h)&&(h=f.map(h,function(a){return a==null?"":a+""})),c=f.valHooks[this.type]||f.valHooks[this.nodeName.toLowerCase()];if(!c||!("set"in c)||c.set(this,h,"value")===b)this.value=h}})}if(g){c=f.valHooks[g.type]||f.valHooks[g.nodeName.toLowerCase()];if(c&&"get"in c&&(d=c.get(g,"value"))!==b)return d;d=g.value;return typeof d=="string"?d.replace(q,""):d==null?"":d}}}}),f.extend({valHooks:{option:{get:function(a){var b=a.attributes.value;return!b||b.specified?a.value:a.text}},select:{get:function(a){var b,c,d,e,g=a.selectedIndex,h=[],i=a.options,j=a.type==="select-one";if(g<0)return null;c=j?g:0,d=j?g+1:i.length;for(;c=0}),c.length||(a.selectedIndex=-1);return c}}},attrFn:{val:!0,css:!0,html:!0,text:!0,data:!0,width:!0,height:!0,offset:!0},attr:function(a,c,d,e){var g,h,i,j=a.nodeType;if(!!a&&j!==3&&j!==8&&j!==2){if(e&&c in f.attrFn)return f(a)[c](d);if(typeof a.getAttribute=="undefined")return f.prop(a,c,d);i=j!==1||!f.isXMLDoc(a),i&&(c=c.toLowerCase(),h=f.attrHooks[c]||(u.test(c)?x:w));if(d!==b){if(d===null){f.removeAttr(a,c);return}if(h&&"set"in h&&i&&(g=h.set(a,d,c))!==b)return g;a.setAttribute(c,""+d);return d}if(h&&"get"in h&&i&&(g=h.get(a,c))!==null)return g;g=a.getAttribute(c);return g===null?b:g}},removeAttr:function(a,b){var c,d,e,g,h,i=0;if(b&&a.nodeType===1){d=b.toLowerCase().split(p),g=d.length;for(;i=0}})});var z=/^(?:textarea|input|select)$/i,A=/^([^\.]*)?(?:\.(.+))?$/,B=/(?:^|\s)hover(\.\S+)?\b/,C=/^key/,D=/^(?:mouse|contextmenu)|click/,E=/^(?:focusinfocus|focusoutblur)$/,F=/^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,G=function( +a){var b=F.exec(a);b&&(b[1]=(b[1]||"").toLowerCase(),b[3]=b[3]&&new RegExp("(?:^|\\s)"+b[3]+"(?:\\s|$)"));return b},H=function(a,b){var c=a.attributes||{};return(!b[1]||a.nodeName.toLowerCase()===b[1])&&(!b[2]||(c.id||{}).value===b[2])&&(!b[3]||b[3].test((c["class"]||{}).value))},I=function(a){return f.event.special.hover?a:a.replace(B,"mouseenter$1 mouseleave$1")};f.event={add:function(a,c,d,e,g){var h,i,j,k,l,m,n,o,p,q,r,s;if(!(a.nodeType===3||a.nodeType===8||!c||!d||!(h=f._data(a)))){d.handler&&(p=d,d=p.handler,g=p.selector),d.guid||(d.guid=f.guid++),j=h.events,j||(h.events=j={}),i=h.handle,i||(h.handle=i=function(a){return typeof f!="undefined"&&(!a||f.event.triggered!==a.type)?f.event.dispatch.apply(i.elem,arguments):b},i.elem=a),c=f.trim(I(c)).split(" ");for(k=0;k=0&&(h=h.slice(0,-1),k=!0),h.indexOf(".")>=0&&(i=h.split("."),h=i.shift(),i.sort());if((!e||f.event.customEvent[h])&&!f.event.global[h])return;c=typeof c=="object"?c[f.expando]?c:new f.Event(h,c):new f.Event(h),c.type=h,c.isTrigger=!0,c.exclusive=k,c.namespace=i.join("."),c.namespace_re=c.namespace?new RegExp("(^|\\.)"+i.join("\\.(?:.*\\.)?")+"(\\.|$)"):null,o=h.indexOf(":")<0?"on"+h:"";if(!e){j=f.cache;for(l in j)j[l].events&&j[l].events[h]&&f.event.trigger(c,d,j[l].handle.elem,!0);return}c.result=b,c.target||(c.target=e),d=d!=null?f.makeArray(d):[],d.unshift(c),p=f.event.special[h]||{};if(p.trigger&&p.trigger.apply(e,d)===!1)return;r=[[e,p.bindType||h]];if(!g&&!p.noBubble&&!f.isWindow(e)){s=p.delegateType||h,m=E.test(s+h)?e:e.parentNode,n=null;for(;m;m=m.parentNode)r.push([m,s]),n=m;n&&n===e.ownerDocument&&r.push([n.defaultView||n.parentWindow||a,s])}for(l=0;le&&j.push({elem:this,matches:d.slice(e)});for(k=0;k0?this.on(b,null,a,c):this.trigger(b)},f.attrFn&&(f.attrFn[b]=!0),C.test(b)&&(f.event.fixHooks[b]=f.event.keyHooks),D.test(b)&&(f.event.fixHooks[b]=f.event.mouseHooks)}),function(){function x(a,b,c,e,f,g){for(var h=0,i=e.length;h0){k=j;break}}j=j[a]}e[h]=k}}}function w(a,b,c,e,f,g){for(var h=0,i=e.length;h+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,d="sizcache"+(Math.random()+"").replace(".",""),e=0,g=Object.prototype.toString,h=!1,i=!0,j=/\\/g,k=/\r\n/g,l=/\W/;[0,0].sort(function(){i=!1;return 0});var m=function(b,d,e,f){e=e||[],d=d||c;var h=d;if(d.nodeType!==1&&d.nodeType!==9)return[];if(!b||typeof b!="string")return e;var i,j,k,l,n,q,r,t,u=!0,v=m.isXML(d),w=[],x=b;do{a.exec(""),i=a.exec(x);if(i){x=i[3],w.push(i[1]);if(i[2]){l=i[3];break}}}while(i);if(w.length>1&&p.exec(b))if(w.length===2&&o.relative[w[0]])j=y(w[0]+w[1],d,f);else{j=o.relative[w[0]]?[d]:m(w.shift(),d);while(w.length)b=w.shift(),o.relative[b]&&(b+=w.shift()),j=y(b,j,f)}else{!f&&w.length>1&&d.nodeType===9&&!v&&o.match.ID.test(w[0])&&!o.match.ID.test(w[w.length-1])&&(n=m.find(w.shift(),d,v),d=n.expr?m.filter(n.expr,n.set)[0]:n.set[0]);if(d){n=f?{expr:w.pop(),set:s(f)}:m.find(w.pop(),w.length===1&&(w[0]==="~"||w[0]==="+")&&d.parentNode?d.parentNode:d,v),j=n.expr?m.filter(n.expr,n.set):n.set,w.length>0?k=s(j):u=!1;while(w.length)q=w.pop(),r=q,o.relative[q]?r=w.pop():q="",r==null&&(r=d),o.relative[q](k,r,v)}else k=w=[]}k||(k=j),k||m.error(q||b);if(g.call(k)==="[object Array]")if(!u)e.push.apply(e,k);else if(d&&d.nodeType===1)for(t=0;k[t]!=null;t++)k[t]&&(k[t]===!0||k[t].nodeType===1&&m.contains(d,k[t]))&&e.push(j[t]);else for(t=0;k[t]!=null;t++)k[t]&&k[t].nodeType===1&&e.push(j[t]);else s(k,e);l&&(m(l,h,e,f),m.uniqueSort(e));return e};m.uniqueSort=function(a){if(u){h=i,a.sort(u);if(h)for(var b=1;b0},m.find=function(a,b,c){var d,e,f,g,h,i;if(!a)return[];for(e=0,f=o.order.length;e":function(a,b){var c,d=typeof b=="string",e=0,f=a.length;if(d&&!l.test(b)){b=b.toLowerCase();for(;e=0)?c||d.push(h):c&&(b[g]=!1));return!1},ID:function(a){return a[1].replace(j,"")},TAG:function(a,b){return a[1].replace(j,"").toLowerCase()},CHILD:function(a){if(a[1]==="nth"){a[2]||m.error(a[0]),a[2]=a[2].replace(/^\+|\s*/g,"");var b=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(a[2]==="even"&&"2n"||a[2]==="odd"&&"2n+1"||!/\D/.test(a[2])&&"0n+"+a[2]||a[2]);a[2]=b[1]+(b[2]||1)-0,a[3]=b[3]-0}else a[2]&&m.error(a[0]);a[0]=e++;return a},ATTR:function(a,b,c,d,e,f){var g=a[1]=a[1].replace(j,"");!f&&o.attrMap[g]&&(a[1]=o.attrMap[g]),a[4]=(a[4]||a[5]||"").replace(j,""),a[2]==="~="&&(a[4]=" "+a[4]+" ");return a},PSEUDO:function(b,c,d,e,f){if(b[1]==="not")if((a.exec(b[3])||"").length>1||/^\w/.test(b[3]))b[3]=m(b[3],null,null,c);else{var g=m.filter(b[3],c,d,!0^f);d||e.push.apply(e,g);return!1}else if(o.match.POS.test(b[0])||o.match.CHILD.test(b[0]))return!0;return b},POS:function(a){a.unshift(!0);return a}},filters:{enabled:function(a){return a.disabled===!1&&a.type!=="hidden"},disabled:function(a){return a.disabled===!0},checked:function(a){return a.checked===!0},selected:function(a){a.parentNode&&a.parentNode.selectedIndex;return a.selected===!0},parent:function(a){return!!a.firstChild},empty:function(a){return!a.firstChild},has:function(a,b,c){return!!m(c[3],a).length},header:function(a){return/h\d/i.test(a.nodeName)},text:function(a){var b=a.getAttribute("type"),c=a.type;return a.nodeName.toLowerCase()==="input"&&"text"===c&&(b===c||b===null)},radio:function(a){return a.nodeName.toLowerCase()==="input"&&"radio"===a.type},checkbox:function(a){return a.nodeName.toLowerCase()==="input"&&"checkbox"===a.type},file:function(a){return a.nodeName.toLowerCase()==="input"&&"file"===a.type},password:function(a){return a.nodeName.toLowerCase()==="input"&&"password"===a.type},submit:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"submit"===a.type},image:function(a){return a.nodeName.toLowerCase()==="input"&&"image"===a.type},reset:function(a){var b=a.nodeName.toLowerCase();return(b==="input"||b==="button")&&"reset"===a.type},button:function(a){var b=a.nodeName.toLowerCase();return b==="input"&&"button"===a.type||b==="button"},input:function(a){return/input|select|textarea|button/i.test(a.nodeName)},focus:function(a){return a===a.ownerDocument.activeElement}},setFilters:{first:function(a,b){return b===0},last:function(a,b,c,d){return b===d.length-1},even:function(a,b){return b%2===0},odd:function(a,b){return b%2===1},lt:function(a,b,c){return bc[3]-0},nth:function(a,b,c){return c[3]-0===b},eq:function(a,b,c){return c[3]-0===b}},filter:{PSEUDO:function(a,b,c,d){var e=b[1],f=o.filters[e];if(f)return f(a,c,b,d);if(e==="contains")return(a.textContent||a.innerText||n([a])||"").indexOf(b[3])>=0;if(e==="not"){var g=b[3];for(var h=0,i=g.length;h=0}},ID:function(a,b){return a.nodeType===1&&a.getAttribute("id")===b},TAG:function(a,b){return b==="*"&&a.nodeType===1||!!a.nodeName&&a.nodeName.toLowerCase()===b},CLASS:function(a,b){return(" "+(a.className||a.getAttribute("class"))+" ").indexOf(b)>-1},ATTR:function(a,b){var c=b[1],d=m.attr?m.attr(a,c):o.attrHandle[c]?o.attrHandle[c](a):a[c]!=null?a[c]:a.getAttribute(c),e=d+"",f=b[2],g=b[4];return d==null?f==="!=":!f&&m.attr?d!=null:f==="="?e===g:f==="*="?e.indexOf(g)>=0:f==="~="?(" "+e+" ").indexOf(g)>=0:g?f==="!="?e!==g:f==="^="?e.indexOf(g)===0:f==="$="?e.substr(e.length-g.length)===g:f==="|="?e===g||e.substr(0,g.length+1)===g+"-":!1:e&&d!==!1},POS:function(a,b,c,d){var e=b[2],f=o.setFilters[e];if(f)return f(a,c,b,d)}}},p=o.match.POS,q=function(a,b){return"\\"+(b-0+1)};for(var r in o.match)o.match[r]=new RegExp(o.match[r].source+/(?![^\[]*\])(?![^\(]*\))/.source),o.leftMatch[r]=new RegExp(/(^(?:.|\r|\n)*?)/.source+o.match[r].source.replace(/\\(\d+)/g,q));o.match.globalPOS=p;var s=function(a,b){a=Array.prototype.slice.call(a,0);if(b){b.push.apply(b,a);return b}return a};try{Array.prototype.slice.call(c.documentElement.childNodes,0)[0].nodeType}catch(t){s=function(a,b){var c=0,d=b||[];if(g.call(a)==="[object Array]")Array.prototype.push.apply(d,a);else if(typeof a.length=="number")for(var e=a.length;c",e.insertBefore(a,e.firstChild),c.getElementById(d)&&(o.find.ID=function(a,c,d){if(typeof c.getElementById!="undefined"&&!d){var e=c.getElementById(a[1]);return e?e.id===a[1]||typeof e.getAttributeNode!="undefined"&&e.getAttributeNode("id").nodeValue===a[1]?[e]:b:[]}},o.filter.ID=function(a,b){var c=typeof a.getAttributeNode!="undefined"&&a.getAttributeNode("id");return a.nodeType===1&&c&&c.nodeValue===b}),e.removeChild(a),e=a=null}(),function(){var a=c.createElement("div");a.appendChild(c.createComment("")),a.getElementsByTagName("*").length>0&&(o.find.TAG=function(a,b){var c=b.getElementsByTagName(a[1]);if(a[1]==="*"){var d=[];for(var e=0;c[e];e++)c[e].nodeType===1&&d.push(c[e]);c=d}return c}),a.innerHTML="",a.firstChild&&typeof a.firstChild.getAttribute!="undefined"&&a.firstChild.getAttribute("href")!=="#"&&(o.attrHandle.href=function(a){return a.getAttribute("href",2)}),a=null}(),c.querySelectorAll&&function(){var a=m,b=c.createElement("div"),d="__sizzle__";b.innerHTML="

    ";if(!b.querySelectorAll||b.querySelectorAll(".TEST").length!==0){m=function(b,e,f,g){e=e||c;if(!g&&!m.isXML(e)){var h=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(b);if(h&&(e.nodeType===1||e.nodeType===9)){if(h[1])return s(e.getElementsByTagName(b),f);if(h[2]&&o.find.CLASS&&e.getElementsByClassName)return s(e.getElementsByClassName(h[2]),f)}if(e.nodeType===9){if(b==="body"&&e.body)return s([e.body],f);if(h&&h[3]){var i=e.getElementById(h[3]);if(!i||!i.parentNode)return s([],f);if(i.id===h[3])return s([i],f)}try{return s(e.querySelectorAll(b),f)}catch(j){}}else if(e.nodeType===1&&e.nodeName.toLowerCase()!=="object"){var k=e,l=e.getAttribute("id"),n=l||d,p=e.parentNode,q=/^\s*[+~]/.test(b);l?n=n.replace(/'/g,"\\$&"):e.setAttribute("id",n),q&&p&&(e=e.parentNode);try{if(!q||p)return s(e.querySelectorAll("[id='"+n+"'] "+b),f)}catch(r){}finally{l||k.removeAttribute("id")}}}return a(b,e,f,g)};for(var e in a)m[e]=a[e];b=null}}(),function(){var a=c.documentElement,b=a.matchesSelector||a.mozMatchesSelector||a.webkitMatchesSelector||a.msMatchesSelector;if(b){var d=!b.call(c.createElement("div"),"div"),e=!1;try{b.call(c.documentElement,"[test!='']:sizzle")}catch(f){e=!0}m.matchesSelector=function(a,c){c=c.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!m.isXML(a))try{if(e||!o.match.PSEUDO.test(c)&&!/!=/.test(c)){var f=b.call(a,c);if(f||!d||a.document&&a.document.nodeType!==11)return f}}catch(g){}return m(c,null,null,[a]).length>0}}}(),function(){var a=c.createElement("div");a.innerHTML="
    ";if(!!a.getElementsByClassName&&a.getElementsByClassName("e").length!==0){a.lastChild.className="e";if(a.getElementsByClassName("e").length===1)return;o.order.splice(1,0,"CLASS"),o.find.CLASS=function(a,b,c){if(typeof b.getElementsByClassName!="undefined"&&!c)return b.getElementsByClassName(a[1])},a=null}}(),c.documentElement.contains?m.contains=function(a,b){return a!==b&&(a.contains?a.contains(b):!0)}:c.documentElement.compareDocumentPosition?m.contains=function(a,b){return!!(a.compareDocumentPosition(b)&16)}:m.contains=function(){return!1},m.isXML=function(a){var b=(a?a.ownerDocument||a:0).documentElement;return b?b.nodeName!=="HTML":!1};var y=function(a,b,c){var d,e=[],f="",g=b.nodeType?[b]:b;while(d=o.match.PSEUDO.exec(a))f+=d[0],a=a.replace(o.match.PSEUDO,"");a=o.relative[a]?a+"*":a;for(var h=0,i=g.length;h0)for(h=g;h=0:f.filter(a,this).length>0:this.filter(a).length>0)},closest:function(a,b){var c=[],d,e,g=this[0];if(f.isArray(a)){var h=1;while(g&&g.ownerDocument&&g!==b){for(d=0;d-1:f.find.matchesSelector(g,a)){c.push(g);break}g=g.parentNode;if(!g||!g.ownerDocument||g===b||g.nodeType===11)break}}c=c.length>1?f.unique(c):c;return this.pushStack(c,"closest",a)},index:function(a){if(!a)return this[0]&&this[0].parentNode?this.prevAll().length:-1;if(typeof a=="string")return f.inArray(this[0],f(a));return f.inArray(a.jquery?a[0]:a,this)},add:function(a,b){var c=typeof a=="string"?f(a,b):f.makeArray(a&&a.nodeType?[a]:a),d=f.merge(this.get(),c);return this.pushStack(S(c[0])||S(d[0])?d:f.unique(d))},andSelf:function(){return this.add(this.prevObject)}}),f.each({parent:function(a){var b=a.parentNode;return b&&b.nodeType!==11?b:null},parents:function(a){return f.dir(a,"parentNode")},parentsUntil:function(a,b,c){return f.dir(a,"parentNode",c)},next:function(a){return f.nth(a,2,"nextSibling")},prev:function(a){return f.nth(a,2,"previousSibling")},nextAll:function(a){return f.dir(a,"nextSibling")},prevAll:function(a){return f.dir(a,"previousSibling")},nextUntil:function(a,b,c){return f.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return f.dir(a,"previousSibling",c)},siblings:function(a){return f.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return f.sibling(a.firstChild)},contents:function(a){return f.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:f.makeArray(a.childNodes)}},function(a,b){f.fn[a]=function(c,d){var e=f.map(this,b,c);L.test(a)||(d=c),d&&typeof d=="string"&&(e=f.filter(d,e)),e=this.length>1&&!R[a]?f.unique(e):e,(this.length>1||N.test(d))&&M.test(a)&&(e=e.reverse());return this.pushStack(e,a,P.call(arguments).join(","))}}),f.extend({filter:function(a,b,c){c&&(a=":not("+a+")");return b.length===1?f.find.matchesSelector(b[0],a)?[b[0]]:[]:f.find.matches(a,b)},dir:function(a,c,d){var e=[],g=a[c];while(g&&g.nodeType!==9&&(d===b||g.nodeType!==1||!f(g).is(d)))g.nodeType===1&&e.push(g),g=g[c];return e},nth:function(a,b,c,d){b=b||1;var e=0;for(;a;a=a[c])if(a.nodeType===1&&++e===b)break;return a},sibling:function(a,b){var c=[];for(;a;a=a.nextSibling)a.nodeType===1&&a!==b&&c.push(a);return c}});var V="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",W=/ jQuery\d+="(?:\d+|null)"/g,X=/^\s+/,Y=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,Z=/<([\w:]+)/,$=/]","i"),bd=/checked\s*(?:[^=]|=\s*.checked.)/i,be=/\/(java|ecma)script/i,bf=/^\s*",""],legend:[1,"
    ","
    "],thead:[1,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],col:[2,"","
    "],area:[1,"",""],_default:[0,"",""]},bh=U(c);bg.optgroup=bg.option,bg.tbody=bg.tfoot=bg.colgroup=bg.caption=bg.thead,bg.th=bg.td,f.support.htmlSerialize||(bg._default=[1,"div
    ","
    "]),f.fn.extend({text:function(a){return f.access(this,function(a){return a===b?f.text(this):this.empty().append((this[0]&&this[0].ownerDocument||c).createTextNode(a))},null,a,arguments.length)},wrapAll:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapAll(a.call(this,b))});if(this[0]){var b=f(a,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstChild&&a.firstChild.nodeType===1)a=a.firstChild;return a}).append(this)}return this},wrapInner:function(a){if(f.isFunction(a))return this.each(function(b){f(this).wrapInner(a.call(this,b))});return this.each(function(){var b=f(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=f.isFunction(a);return this.each(function(c){f(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(){return this.parent().each(function(){f.nodeName(this,"body")||f(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,!0,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this)});if(arguments.length){var a=f +.clean(arguments);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,!1,function(a){this.parentNode.insertBefore(a,this.nextSibling)});if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,f.clean(arguments));return a}},remove:function(a,b){for(var c=0,d;(d=this[c])!=null;c++)if(!a||f.filter(a,[d]).length)!b&&d.nodeType===1&&(f.cleanData(d.getElementsByTagName("*")),f.cleanData([d])),d.parentNode&&d.parentNode.removeChild(d);return this},empty:function(){for(var a=0,b;(b=this[a])!=null;a++){b.nodeType===1&&f.cleanData(b.getElementsByTagName("*"));while(b.firstChild)b.removeChild(b.firstChild)}return this},clone:function(a,b){a=a==null?!1:a,b=b==null?a:b;return this.map(function(){return f.clone(this,a,b)})},html:function(a){return f.access(this,function(a){var c=this[0]||{},d=0,e=this.length;if(a===b)return c.nodeType===1?c.innerHTML.replace(W,""):null;if(typeof a=="string"&&!ba.test(a)&&(f.support.leadingWhitespace||!X.test(a))&&!bg[(Z.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(Y,"<$1>");try{for(;d1&&l0?this.clone(!0):this).get();f(e[h])[b](j),d=d.concat(j)}return this.pushStack(d,a,e.selector)}}),f.extend({clone:function(a,b,c){var d,e,g,h=f.support.html5Clone||f.isXMLDoc(a)||!bc.test("<"+a.nodeName+">")?a.cloneNode(!0):bo(a);if((!f.support.noCloneEvent||!f.support.noCloneChecked)&&(a.nodeType===1||a.nodeType===11)&&!f.isXMLDoc(a)){bk(a,h),d=bl(a),e=bl(h);for(g=0;d[g];++g)e[g]&&bk(d[g],e[g])}if(b){bj(a,h);if(c){d=bl(a),e=bl(h);for(g=0;d[g];++g)bj(d[g],e[g])}}d=e=null;return h},clean:function(a,b,d,e){var g,h,i,j=[];b=b||c,typeof b.createElement=="undefined"&&(b=b.ownerDocument||b[0]&&b[0].ownerDocument||c);for(var k=0,l;(l=a[k])!=null;k++){typeof l=="number"&&(l+="");if(!l)continue;if(typeof l=="string")if(!_.test(l))l=b.createTextNode(l);else{l=l.replace(Y,"<$1>");var m=(Z.exec(l)||["",""])[1].toLowerCase(),n=bg[m]||bg._default,o=n[0],p=b.createElement("div"),q=bh.childNodes,r;b===c?bh.appendChild(p):U(b).appendChild(p),p.innerHTML=n[1]+l+n[2];while(o--)p=p.lastChild;if(!f.support.tbody){var s=$.test(l),t=m==="table"&&!s?p.firstChild&&p.firstChild.childNodes:n[1]===""&&!s?p.childNodes:[];for(i=t.length-1;i>=0;--i)f.nodeName(t[i],"tbody")&&!t[i].childNodes.length&&t[i].parentNode.removeChild(t[i])}!f.support.leadingWhitespace&&X.test(l)&&p.insertBefore(b.createTextNode(X.exec(l)[0]),p.firstChild),l=p.childNodes,p&&(p.parentNode.removeChild(p),q.length>0&&(r=q[q.length-1],r&&r.parentNode&&r.parentNode.removeChild(r)))}var u;if(!f.support.appendChecked)if(l[0]&&typeof (u=l.length)=="number")for(i=0;i1)},f.extend({cssHooks:{opacity:{get:function(a,b){if(b){var c=by(a,"opacity");return c===""?"1":c}return a.style.opacity}}},cssNumber:{fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":f.support.cssFloat?"cssFloat":"styleFloat"},style:function(a,c,d,e){if(!!a&&a.nodeType!==3&&a.nodeType!==8&&!!a.style){var g,h,i=f.camelCase(c),j=a.style,k=f.cssHooks[i];c=f.cssProps[i]||i;if(d===b){if(k&&"get"in k&&(g=k.get(a,!1,e))!==b)return g;return j[c]}h=typeof d,h==="string"&&(g=bu.exec(d))&&(d=+(g[1]+1)*+g[2]+parseFloat(f.css(a,c)),h="number");if(d==null||h==="number"&&isNaN(d))return;h==="number"&&!f.cssNumber[i]&&(d+="px");if(!k||!("set"in k)||(d=k.set(a,d))!==b)try{j[c]=d}catch(l){}}},css:function(a,c,d){var e,g;c=f.camelCase(c),g=f.cssHooks[c],c=f.cssProps[c]||c,c==="cssFloat"&&(c="float");if(g&&"get"in g&&(e=g.get(a,!0,d))!==b)return e;if(by)return by(a,c)},swap:function(a,b,c){var d={},e,f;for(f in b)d[f]=a.style[f],a.style[f]=b[f];e=c.call(a);for(f in b)a.style[f]=d[f];return e}}),f.curCSS=f.css,c.defaultView&&c.defaultView.getComputedStyle&&(bz=function(a,b){var c,d,e,g,h=a.style;b=b.replace(br,"-$1").toLowerCase(),(d=a.ownerDocument.defaultView)&&(e=d.getComputedStyle(a,null))&&(c=e.getPropertyValue(b),c===""&&!f.contains(a.ownerDocument.documentElement,a)&&(c=f.style(a,b))),!f.support.pixelMargin&&e&&bv.test(b)&&bt.test(c)&&(g=h.width,h.width=c,c=e.width,h.width=g);return c}),c.documentElement.currentStyle&&(bA=function(a,b){var c,d,e,f=a.currentStyle&&a.currentStyle[b],g=a.style;f==null&&g&&(e=g[b])&&(f=e),bt.test(f)&&(c=g.left,d=a.runtimeStyle&&a.runtimeStyle.left,d&&(a.runtimeStyle.left=a.currentStyle.left),g.left=b==="fontSize"?"1em":f,f=g.pixelLeft+"px",g.left=c,d&&(a.runtimeStyle.left=d));return f===""?"auto":f}),by=bz||bA,f.each(["height","width"],function(a,b){f.cssHooks[b]={get:function(a,c,d){if(c)return a.offsetWidth!==0?bB(a,b,d):f.swap(a,bw,function(){return bB(a,b,d)})},set:function(a,b){return bs.test(b)?b+"px":b}}}),f.support.opacity||(f.cssHooks.opacity={get:function(a,b){return bq.test((b&&a.currentStyle?a.currentStyle.filter:a.style.filter)||"")?parseFloat(RegExp.$1)/100+"":b?"1":""},set:function(a,b){var c=a.style,d=a.currentStyle,e=f.isNumeric(b)?"alpha(opacity="+b*100+")":"",g=d&&d.filter||c.filter||"";c.zoom=1;if(b>=1&&f.trim(g.replace(bp,""))===""){c.removeAttribute("filter");if(d&&!d.filter)return}c.filter=bp.test(g)?g.replace(bp,e):g+" "+e}}),f(function(){f.support.reliableMarginRight||(f.cssHooks.marginRight={get:function(a,b){return f.swap(a,{display:"inline-block"},function(){return b?by(a,"margin-right"):a.style.marginRight})}})}),f.expr&&f.expr.filters&&(f.expr.filters.hidden=function(a){var b=a.offsetWidth,c=a.offsetHeight;return b===0&&c===0||!f.support.reliableHiddenOffsets&&(a.style&&a.style.display||f.css(a,"display"))==="none"},f.expr.filters.visible=function(a){return!f.expr.filters.hidden(a)}),f.each({margin:"",padding:"",border:"Width"},function(a,b){f.cssHooks[a+b]={expand:function(c){var d,e=typeof c=="string"?c.split(" "):[c],f={};for(d=0;d<4;d++)f[a+bx[d]+b]=e[d]||e[d-2]||e[0];return f}}});var bC=/%20/g,bD=/\[\]$/,bE=/\r?\n/g,bF=/#.*$/,bG=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,bH=/^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,bI=/^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,bJ=/^(?:GET|HEAD)$/,bK=/^\/\//,bL=/\?/,bM=/)<[^<]*)*<\/script>/gi,bN=/^(?:select|textarea)/i,bO=/\s+/,bP=/([?&])_=[^&]*/,bQ=/^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,bR=f.fn.load,bS={},bT={},bU,bV,bW=["*/"]+["*"];try{bU=e.href}catch(bX){bU=c.createElement("a"),bU.href="",bU=bU.href}bV=bQ.exec(bU.toLowerCase())||[],f.fn.extend({load:function(a,c,d){if(typeof a!="string"&&bR)return bR.apply(this,arguments);if(!this.length)return this;var e=a.indexOf(" ");if(e>=0){var g=a.slice(e,a.length);a=a.slice(0,e)}var h="GET";c&&(f.isFunction(c)?(d=c,c=b):typeof c=="object"&&(c=f.param(c,f.ajaxSettings.traditional),h="POST"));var i=this;f.ajax({url:a,type:h,dataType:"html",data:c,complete:function(a,b,c){c=a.responseText,a.isResolved()&&(a.done(function(a){c=a}),i.html(g?f("
    ").append(c.replace(bM,"")).find(g):c)),d&&i.each(d,[c,b,a])}});return this},serialize:function(){return f.param(this.serializeArray())},serializeArray:function(){return this.map(function(){return this.elements?f.makeArray(this.elements):this}).filter(function(){return this.name&&!this.disabled&&(this.checked||bN.test(this.nodeName)||bH.test(this.type))}).map(function(a,b){var c=f(this).val();return c==null?null:f.isArray(c)?f.map(c,function(a,c){return{name:b.name,value:a.replace(bE,"\r\n")}}):{name:b.name,value:c.replace(bE,"\r\n")}}).get()}}),f.each("ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split(" "),function(a,b){f.fn[b]=function(a){return this.on(b,a)}}),f.each(["get","post"],function(a,c){f[c]=function(a,d,e,g){f.isFunction(d)&&(g=g||e,e=d,d=b);return f.ajax({type:c,url:a,data:d,success:e,dataType:g})}}),f.extend({getScript:function(a,c){return f.get(a,b,c,"script")},getJSON:function(a,b,c){return f.get(a,b,c,"json")},ajaxSetup:function(a,b){b?b$(a,f.ajaxSettings):(b=a,a=f.ajaxSettings),b$(a,b);return a},ajaxSettings:{url:bU,isLocal:bI.test(bV[1]),global:!0,type:"GET",contentType:"application/x-www-form-urlencoded; charset=UTF-8",processData:!0,async:!0,accepts:{xml:"application/xml, text/xml",html:"text/html",text:"text/plain",json:"application/json, text/javascript","*":bW},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText"},converters:{"* text":a.String,"text html":!0,"text json":f.parseJSON,"text xml":f.parseXML},flatOptions:{context:!0,url:!0}},ajaxPrefilter:bY(bS),ajaxTransport:bY(bT),ajax:function(a,c){function w(a,c,l,m){if(s!==2){s=2,q&&clearTimeout(q),p=b,n=m||"",v.readyState=a>0?4:0;var o,r,u,w=c,x=l?ca(d,v,l):b,y,z;if(a>=200&&a<300||a===304){if(d.ifModified){if(y=v.getResponseHeader("Last-Modified"))f.lastModified[k]=y;if(z=v.getResponseHeader("Etag"))f.etag[k]=z}if(a===304)w="notmodified",o=!0;else try{r=cb(d,x),w="success",o=!0}catch(A){w="parsererror",u=A}}else{u=w;if(!w||a)w="error",a<0&&(a=0)}v.status=a,v.statusText=""+(c||w),o?h.resolveWith(e,[r,w,v]):h.rejectWith(e,[v,w,u]),v.statusCode(j),j=b,t&&g.trigger("ajax"+(o?"Success":"Error"),[v,d,o?r:u]),i.fireWith(e,[v,w]),t&&(g.trigger("ajaxComplete",[v,d]),--f.active||f.event.trigger("ajaxStop"))}}typeof a=="object"&&(c=a,a=b),c=c||{};var d=f.ajaxSetup({},c),e=d.context||d,g=e!==d&&(e.nodeType||e instanceof f)?f(e):f.event,h=f.Deferred(),i=f.Callbacks("once memory"),j=d.statusCode||{},k,l={},m={},n,o,p,q,r,s=0,t,u,v={readyState:0,setRequestHeader:function(a,b){if(!s){var c=a.toLowerCase();a=m[c]=m[c]||a,l[a]=b}return this},getAllResponseHeaders:function(){return s===2?n:null},getResponseHeader:function(a){var c;if(s===2){if(!o){o={};while(c=bG.exec(n))o[c[1].toLowerCase()]=c[2]}c=o[a.toLowerCase()]}return c===b?null:c},overrideMimeType:function(a){s||(d.mimeType=a);return this},abort:function(a){a=a||"abort",p&&p.abort(a),w(0,a);return this}};h.promise(v),v.success=v.done,v.error=v.fail,v.complete=i.add,v.statusCode=function(a){if(a){var b;if(s<2)for(b in a)j[b]=[j[b],a[b]];else b=a[v.status],v.then(b,b)}return this},d.url=((a||d.url)+"").replace(bF,"").replace(bK,bV[1]+"//"),d.dataTypes=f.trim(d.dataType||"*").toLowerCase().split(bO),d.crossDomain==null&&(r=bQ.exec(d.url.toLowerCase()),d.crossDomain=!(!r||r[1]==bV[1]&&r[2]==bV[2]&&(r[3]||(r[1]==="http:"?80:443))==(bV[3]||(bV[1]==="http:"?80:443)))),d.data&&d.processData&&typeof d.data!="string"&&(d.data=f.param(d.data,d.traditional)),bZ(bS,d,c,v);if(s===2)return!1;t=d.global,d.type=d.type.toUpperCase(),d.hasContent=!bJ.test(d.type),t&&f.active++===0&&f.event.trigger("ajaxStart");if(!d.hasContent){d.data&&(d.url+=(bL.test(d.url)?"&":"?")+d.data,delete d.data),k=d.url;if(d.cache===!1){var x=f.now(),y=d.url.replace(bP,"$1_="+x);d.url=y+(y===d.url?(bL.test(d.url)?"&":"?")+"_="+x:"")}}(d.data&&d.hasContent&&d.contentType!==!1||c.contentType)&&v.setRequestHeader("Content-Type",d.contentType),d.ifModified&&(k=k||d.url,f.lastModified[k]&&v.setRequestHeader("If-Modified-Since",f.lastModified[k]),f.etag[k]&&v.setRequestHeader("If-None-Match",f.etag[k])),v.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+(d.dataTypes[0]!=="*"?", "+bW+"; q=0.01":""):d.accepts["*"]);for(u in d.headers)v.setRequestHeader(u,d.headers[u]);if(d.beforeSend&&(d.beforeSend.call(e,v,d)===!1||s===2)){v.abort();return!1}for(u in{success:1,error:1,complete:1})v[u](d[u]);p=bZ(bT,d,c,v);if(!p)w(-1,"No Transport");else{v.readyState=1,t&&g.trigger("ajaxSend",[v,d]),d.async&&d.timeout>0&&(q=setTimeout(function(){v.abort("timeout")},d.timeout));try{s=1,p.send(l,w)}catch(z){if(s<2)w(-1,z);else throw z}}return v},param:function(a,c){var d=[],e=function(a,b){b=f.isFunction(b)?b():b,d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(b)};c===b&&(c=f.ajaxSettings.traditional);if(f.isArray(a)||a.jquery&&!f.isPlainObject(a))f.each(a,function(){e(this.name,this.value)});else for(var g in a)b_(g,a[g],c,e);return d.join("&").replace(bC,"+")}}),f.extend({active:0,lastModified:{},etag:{}});var cc=f.now(),cd=/(\=)\?(&|$)|\?\?/i;f.ajaxSetup({jsonp:"callback",jsonpCallback:function(){return f.expando+"_"+cc++}}),f.ajaxPrefilter("json jsonp",function(b,c,d){var e=typeof b.data=="string"&&/^application\/x\-www\-form\-urlencoded/.test(b.contentType);if(b.dataTypes[0]==="jsonp"||b.jsonp!==!1&&(cd.test(b.url)||e&&cd.test(b.data))){var g,h=b.jsonpCallback=f.isFunction(b.jsonpCallback)?b.jsonpCallback():b.jsonpCallback,i=a[h],j=b.url,k=b.data,l="$1"+h+"$2";b.jsonp!==!1&&(j=j.replace(cd,l),b.url===j&&(e&&(k=k.replace(cd,l)),b.data===k&&(j+=(/\?/.test(j)?"&":"?")+b.jsonp+"="+h))),b.url=j,b.data=k,a[h]=function(a){g=[a]},d.always(function(){a[h]=i,g&&f.isFunction(i)&&a[h](g[0])}),b.converters["script json"]=function(){g||f.error(h+" was not called");return g[0]},b.dataTypes[0]="json";return"script"}}),f.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/javascript|ecmascript/},converters:{"text script":function(a){f.globalEval(a);return a}}}),f.ajaxPrefilter("script",function(a){a.cache===b&&(a.cache=!1),a.crossDomain&&(a.type="GET",a.global=!1)}),f.ajaxTransport("script",function(a){if(a.crossDomain){var d,e=c.head||c.getElementsByTagName("head")[0]||c.documentElement;return{send:function(f,g){d=c.createElement("script"),d.async="async",a.scriptCharset&&(d.charset=a.scriptCharset),d.src=a.url,d.onload=d.onreadystatechange=function(a,c){if(c||!d.readyState||/loaded|complete/.test(d.readyState))d.onload=d.onreadystatechange=null,e&&d.parentNode&&e.removeChild(d),d=b,c||g(200,"success")},e.insertBefore(d,e.firstChild)},abort:function(){d&&d.onload(0,1)}}}});var ce=a.ActiveXObject?function(){for(var a in cg)cg[a](0,1)}:!1,cf=0,cg;f.ajaxSettings.xhr=a.ActiveXObject?function(){return!this.isLocal&&ch()||ci()}:ch,function(a){f.extend(f.support,{ajax:!!a,cors:!!a&&"withCredentials"in a})}(f.ajaxSettings.xhr()),f.support.ajax&&f.ajaxTransport(function(c){if(!c.crossDomain||f.support.cors){var d;return{send:function(e,g){var h=c.xhr(),i,j;c.username?h.open(c.type,c.url,c.async,c.username,c.password):h.open(c.type,c.url,c.async);if(c.xhrFields)for(j in c.xhrFields)h[j]=c.xhrFields[j];c.mimeType&&h.overrideMimeType&&h.overrideMimeType(c.mimeType),!c.crossDomain&&!e["X-Requested-With"]&&(e["X-Requested-With"]="XMLHttpRequest");try{for(j in e)h.setRequestHeader(j,e[j])}catch(k){}h.send(c.hasContent&&c.data||null),d=function(a,e){var j,k,l,m,n;try{if(d&&(e||h.readyState===4)){d=b,i&&(h.onreadystatechange=f.noop,ce&&delete cg[i]);if(e)h.readyState!==4&&h.abort();else{j=h.status,l=h.getAllResponseHeaders(),m={},n=h.responseXML,n&&n.documentElement&&(m.xml=n);try{m.text=h.responseText}catch(a){}try{k=h.statusText}catch(o){k=""}!j&&c.isLocal&&!c.crossDomain?j=m.text?200:404:j===1223&&(j=204)}}}catch(p){e||g(-1,p)}m&&g(j,k,m,l)},!c.async||h.readyState===4?d():(i=++cf,ce&&(cg||(cg={},f(a).unload(ce)),cg[i]=d),h.onreadystatechange=d)},abort:function(){d&&d(0,1)}}}});var cj={},ck,cl,cm=/^(?:toggle|show|hide)$/,cn=/^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,co,cp=[["height","marginTop","marginBottom","paddingTop","paddingBottom"],["width","marginLeft","marginRight","paddingLeft","paddingRight"],["opacity"]],cq;f.fn.extend({show:function(a,b,c){var d,e;if(a||a===0)return this.animate(ct("show",3),a,b,c);for(var g=0,h=this.length;g=i.duration+this.startTime){this.now=this.end,this.pos=this.state=1,this.update(),i.animatedProperties[this.prop]=!0;for(b in i.animatedProperties)i.animatedProperties[b]!==!0&&(g=!1);if(g){i.overflow!=null&&!f.support.shrinkWrapBlocks&&f.each(["","X","Y"],function(a,b){h.style["overflow"+b]=i.overflow[a]}),i.hide&&f(h).hide();if(i.hide||i.show)for(b in i.animatedProperties)f.style(h,b,i.orig[b]),f.removeData(h,"fxshow"+b,!0),f.removeData(h,"toggle"+b,!0);d=i.complete,d&&(i.complete=!1,d.call(h))}return!1}i.duration==Infinity?this.now=e:(c=e-this.startTime,this.state=c/i.duration,this.pos=f.easing[i.animatedProperties[this.prop]](this.state,c,0,1,i.duration),this.now=this.start+(this.end-this.start)*this.pos),this.update();return!0}},f.extend(f.fx,{tick:function(){var a,b=f.timers,c=0;for(;c-1,k={},l={},m,n;j?(l=e.position(),m=l.top,n=l.left):(m=parseFloat(h)||0,n=parseFloat(i)||0),f.isFunction(b)&&(b=b.call(a,c,g)),b.top!=null&&(k.top=b.top-g.top+m),b.left!=null&&(k.left=b.left-g.left+n),"using"in b?b.using.call(a,k):e.css(k)}},f.fn.extend({position:function(){if(!this[0])return null;var a=this[0],b=this.offsetParent(),c=this.offset(),d=cx.test(b[0].nodeName)?{top:0,left:0}:b.offset();c.top-=parseFloat(f.css(a,"marginTop"))||0,c.left-=parseFloat(f.css(a,"marginLeft"))||0,d.top+=parseFloat(f.css(b[0],"borderTopWidth"))||0,d.left+=parseFloat(f.css(b[0],"borderLeftWidth"))||0;return{top:c.top-d.top,left:c.left-d.left}},offsetParent:function(){return this.map(function(){var a=this.offsetParent||c.body;while(a&&!cx.test(a.nodeName)&&f.css(a,"position")==="static")a=a.offsetParent;return a})}}),f.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(a,c){var d=/Y/.test(c);f.fn[a]=function(e){return f.access(this,function(a,e,g){var h=cy(a);if(g===b)return h?c in h?h[c]:f.support.boxModel&&h.document.documentElement[e]||h.document.body[e]:a[e];h?h.scrollTo(d?f(h).scrollLeft():g,d?g:f(h).scrollTop()):a[e]=g},a,e,arguments.length,null)}}),f.each({Height:"height",Width:"width"},function(a,c){var d="client"+a,e="scroll"+a,g="offset"+a;f.fn["inner"+a]=function(){var a=this[0];return a?a.style?parseFloat(f.css(a,c,"padding")):this[c]():null},f.fn["outer"+a]=function(a){var b=this[0];return b?b.style?parseFloat(f.css(b,c,a?"margin":"border")):this[c]():null},f.fn[c]=function(a){return f.access(this,function(a,c,h){var i,j,k,l;if(f.isWindow(a)){i=a.document,j=i.documentElement[d];return f.support.boxModel&&j||i.body&&i.body[d]||j}if(a.nodeType===9){i=a.documentElement;if(i[d]>=i[e])return i[d];return Math.max(a.body[e],i[e],a.body[g],i[g])}if(h===b){k=f.css(a,c),l=parseFloat(k);return f.isNumeric(l)?l:k}f(a).css(c,h)},c,a,arguments.length,null)}}),a.jQuery=a.$=f,typeof define=="function"&&define.amd&&define.amd.jQuery&&define("jquery",[],function(){return f})})(window); \ No newline at end of file diff --git a/app-manage-api/src/test/java/com/enzhico/jwt/socket/client/html/js/moment.min.js b/app-manage-api/src/test/java/com/enzhico/jwt/socket/client/html/js/moment.min.js new file mode 100644 index 0000000..c1b132a --- /dev/null +++ b/app-manage-api/src/test/java/com/enzhico/jwt/socket/client/html/js/moment.min.js @@ -0,0 +1,6 @@ +// moment.js +// version : 1.6.2 +// author : Tim Wood +// license : MIT +// momentjs.com +(function(a,b){function A(a,b){this._d=a,this._isUTC=!!b}function B(a){return a<0?Math.ceil(a):Math.floor(a)}function C(a){var b=this._data={},c=a.years||a.y||0,d=a.months||a.M||0,e=a.weeks||a.w||0,f=a.days||a.d||0,g=a.hours||a.h||0,h=a.minutes||a.m||0,i=a.seconds||a.s||0,j=a.milliseconds||a.ms||0;this._milliseconds=j+i*1e3+h*6e4+g*36e5,this._days=f+e*7,this._months=d+c*12,b.milliseconds=j%1e3,i+=B(j/1e3),b.seconds=i%60,h+=B(i/60),b.minutes=h%60,g+=B(h/60),b.hours=g%24,f+=B(g/24),f+=e*7,b.days=f%30,d+=B(f/30),b.months=d%12,c+=B(d/12),b.years=c}function D(a,b){var c=a+"";while(c.length11?"pm":"am";case"A":return p?p(i,j,!0):i>11?"PM":"AM";case"H":return i;case"HH":return D(i,2);case"h":return i%12||12;case"hh":return D(i%12||12,2);case"m":return j;case"mm":return D(j,2);case"s":return k;case"ss":return D(k,2);case"S":return~~(m/100);case"SS":return D(~~(m/10),2);case"SSS":return D(m,3);case"Z":return(n<0?"-":"+")+D(~~(Math.abs(n)/60),2)+":"+D(~~(Math.abs(n)%60),2);case"ZZ":return(n<0?"-":"+")+D(~~(10*Math.abs(n)/6),4);case"L":case"LL":case"LLL":case"LLLL":case"LT":return H(b,c.longDateFormat[d]);default:return d.replace(/(^\[)|(\\)|\]$/g,"")}}var e=b.month(),f=b.date(),g=b.year(),h=b.day(),i=b.hours(),j=b.minutes(),k=b.seconds(),m=b.milliseconds(),n=-b.zone(),o=c.ordinal,p=c.meridiem;return d.replace(l,q)}function I(a){switch(a){case"DDDD":return p;case"YYYY":return q;case"S":case"SS":case"SSS":case"DDD":return o;case"MMM":case"MMMM":case"ddd":case"dddd":case"a":case"A":return r;case"Z":case"ZZ":return s;case"T":return t;case"MM":case"DD":case"dd":case"YY":case"HH":case"hh":case"mm":case"ss":case"M":case"D":case"d":case"H":case"h":case"m":case"s":return n;default:return new RegExp(a.replace("\\",""))}}function J(a,b,d,e){var f;switch(a){case"M":case"MM":d[1]=b==null?0:~~b-1;break;case"MMM":case"MMMM":for(f=0;f<12;f++)if(c.monthsParse[f].test(b)){d[1]=f;break}break;case"D":case"DD":case"DDD":case"DDDD":d[2]=~~b;break;case"YY":b=~~b,d[0]=b+(b>70?1900:2e3);break;case"YYYY":d[0]=~~Math.abs(b);break;case"a":case"A":e.isPm=(b+"").toLowerCase()==="pm";break;case"H":case"HH":case"h":case"hh":d[3]=~~b;break;case"m":case"mm":d[4]=~~b;break;case"s":case"ss":d[5]=~~b;break;case"S":case"SS":case"SSS":d[6]=~~(("0."+b)*1e3);break;case"Z":case"ZZ":e.isUTC=!0,f=(b+"").match(x),f&&f[1]&&(e.tzh=~~f[1]),f&&f[2]&&(e.tzm=~~f[2]),f&&f[0]==="+"&&(e.tzh=-e.tzh,e.tzm=-e.tzm)}}function K(b,c){var d=[0,0,1,0,0,0,0],e={tzh:0,tzm:0},f=c.match(l),g,h;for(g=0;g0,O.apply({},i)}function Q(a,b){c.fn[a]=function(a){var c=this._isUTC?"UTC":"";return a!=null?(this._d["set"+c+b](a),this):this._d["get"+c+b]()}}function R(a){c.duration.fn[a]=function(){return this._data[a]}}function S(a,b){c.duration.fn["as"+a]=function(){return+this/b}}var c,d="1.6.2",e=Math.round,f,g={},h="en",i=typeof module!="undefined",j="months|monthsShort|monthsParse|weekdays|weekdaysShort|longDateFormat|calendar|relativeTime|ordinal|meridiem".split("|"),k=/^\/?Date\((\-?\d+)/i,l=/(\[[^\[]*\])|(\\)?(Mo|MM?M?M?|Do|DDDo|DD?D?D?|dddd?|do?|w[o|w]?|YYYY|YY|a|A|hh?|HH?|mm?|ss?|SS?S?|zz?|ZZ?|LT|LL?L?L?)/g,m=/([0-9a-zA-Z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+)/gi,n=/\d\d?/,o=/\d{1,3}/,p=/\d{3}/,q=/\d{4}/,r=/[0-9a-z\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+/i,s=/Z|[\+\-]\d\d:?\d\d/i,t=/T/i,u=/^\s*\d{4}-\d\d-\d\d(T(\d\d(:\d\d(:\d\d(\.\d\d?\d?)?)?)?)?([\+\-]\d\d:?\d\d)?)?/,v="YYYY-MM-DDTHH:mm:ssZ",w=[["HH:mm:ss.S",/T\d\d:\d\d:\d\d\.\d{1,3}/],["HH:mm:ss",/T\d\d:\d\d:\d\d/],["HH:mm",/T\d\d:\d\d/],["HH",/T\d\d/]],x=/([\+\-]|\d\d)/gi,y="Month|Date|Hours|Minutes|Seconds|Milliseconds".split("|"),z={Milliseconds:1,Seconds:1e3,Minutes:6e4,Hours:36e5,Days:864e5,Months:2592e6,Years:31536e6};c=function(d,e){if(d===null||d==="")return null;var f,g,h;return c.isMoment(d)?(f=new a(+d._d),h=d._isUTC):e?F(e)?f=M(d,e):f=K(d,e):(g=k.exec(d),f=d===b?new a:g?new a(+g[1]):d instanceof a?d:F(d)?G(d):typeof d=="string"?N(d):new a(d)),new A(f,h)},c.utc=function(b,d){return F(b)?new A(new a(a.UTC.apply({},b)),!0):d&&b?c(b+" +0000",d+" Z").utc():c(b&&!s.exec(b)?b+"+0000":b).utc()},c.unix=function(a){return c(a*1e3)},c.duration=function(a,b){var d=c.isDuration(a),e=typeof a=="number",f=d?a._data:e?{}:a;return e&&(b?f[b]=a:f.milliseconds=a),new C(f)},c.humanizeDuration=function(a,b,d){return c.duration(a,b===!0?null:b).humanize(b===!0?!0:d)},c.version=d,c.defaultFormat=v,c.lang=function(a,b){var d,e,f=[];if(!a)return h;if(b){for(d=0;d<12;d++)f[d]=new RegExp("^"+b.months[d]+"|^"+b.monthsShort[d].replace(".",""),"i");b.monthsParse=b.monthsParse||f,g[a]=b}if(g[a]){for(d=0;d0&&!this.encoding){var pack=this.packetBuffer.shift();this.packet(pack)}};Manager.prototype.cleanup=function(){var sub;while(sub=this.subs.shift())sub.destroy();this.packetBuffer=[];this.encoding=false;this.decoder.destroy()};Manager.prototype.close=Manager.prototype.disconnect=function(){this.skipReconnect=true;this.backoff.reset();this.readyState="closed";this.engine&&this.engine.close()};Manager.prototype.onclose=function(reason){debug("close");this.cleanup();this.backoff.reset();this.readyState="closed";this.emit("close",reason);if(this._reconnection&&!this.skipReconnect){this.reconnect()}};Manager.prototype.reconnect=function(){if(this.reconnecting||this.skipReconnect)return this;var self=this;if(this.backoff.attempts>=this._reconnectionAttempts){debug("reconnect failed");this.backoff.reset();this.emitAll("reconnect_failed");this.reconnecting=false}else{var delay=this.backoff.duration();debug("will wait %dms before reconnect attempt",delay);this.reconnecting=true;var timer=setTimeout(function(){if(self.skipReconnect)return;debug("attempting reconnect");self.emitAll("reconnect_attempt",self.backoff.attempts);self.emitAll("reconnecting",self.backoff.attempts);if(self.skipReconnect)return;self.open(function(err){if(err){debug("reconnect attempt error");self.reconnecting=false;self.reconnect();self.emitAll("reconnect_error",err.data)}else{debug("reconnect success");self.onreconnect()}})},delay);this.subs.push({destroy:function(){clearTimeout(timer)}})}};Manager.prototype.onreconnect=function(){var attempt=this.backoff.attempts;this.reconnecting=false;this.backoff.reset();this.updateSocketIds();this.emitAll("reconnect",attempt)}},{"./on":4,"./socket":5,"./url":6,backo2:7,"component-bind":8,"component-emitter":9,debug:10,"engine.io-client":11,indexof:42,"object-component":43,"socket.io-parser":46}],4:[function(_dereq_,module,exports){module.exports=on;function on(obj,ev,fn){obj.on(ev,fn);return{destroy:function(){obj.removeListener(ev,fn)}}}},{}],5:[function(_dereq_,module,exports){var parser=_dereq_("socket.io-parser");var Emitter=_dereq_("component-emitter");var toArray=_dereq_("to-array");var on=_dereq_("./on");var bind=_dereq_("component-bind");var debug=_dereq_("debug")("socket.io-client:socket");var hasBin=_dereq_("has-binary");module.exports=exports=Socket;var events={connect:1,connect_error:1,connect_timeout:1,disconnect:1,error:1,reconnect:1,reconnect_attempt:1,reconnect_failed:1,reconnect_error:1,reconnecting:1};var emit=Emitter.prototype.emit;function Socket(io,nsp){this.io=io;this.nsp=nsp;this.json=this;this.ids=0;this.acks={};if(this.io.autoConnect)this.open();this.receiveBuffer=[];this.sendBuffer=[];this.connected=false;this.disconnected=true}Emitter(Socket.prototype);Socket.prototype.subEvents=function(){if(this.subs)return;var io=this.io;this.subs=[on(io,"open",bind(this,"onopen")),on(io,"packet",bind(this,"onpacket")),on(io,"close",bind(this,"onclose"))]};Socket.prototype.open=Socket.prototype.connect=function(){if(this.connected)return this;this.subEvents();this.io.open();if("open"==this.io.readyState)this.onopen();return this};Socket.prototype.send=function(){var args=toArray(arguments);args.unshift("message");this.emit.apply(this,args);return this};Socket.prototype.emit=function(ev){if(events.hasOwnProperty(ev)){emit.apply(this,arguments);return this}var args=toArray(arguments);var parserType=parser.EVENT;if(hasBin(args)){parserType=parser.BINARY_EVENT}var packet={type:parserType,data:args};if("function"==typeof args[args.length-1]){debug("emitting packet with ack id %d",this.ids);this.acks[this.ids]=args.pop();packet.id=this.ids++}if(this.connected){this.packet(packet)}else{this.sendBuffer.push(packet)}return this};Socket.prototype.packet=function(packet){packet.nsp=this.nsp;this.io.packet(packet)};Socket.prototype.onopen=function(){debug("transport is open - connecting");if("/"!=this.nsp){this.packet({type:parser.CONNECT})}};Socket.prototype.onclose=function(reason){debug("close (%s)",reason);this.connected=false;this.disconnected=true;delete this.id;this.emit("disconnect",reason)};Socket.prototype.onpacket=function(packet){if(packet.nsp!=this.nsp)return;switch(packet.type){case parser.CONNECT:this.onconnect();break;case parser.EVENT:this.onevent(packet);break;case parser.BINARY_EVENT:this.onevent(packet);break;case parser.ACK:this.onack(packet);break;case parser.BINARY_ACK:this.onack(packet);break;case parser.DISCONNECT:this.ondisconnect();break;case parser.ERROR:this.emit("error",packet.data);break}};Socket.prototype.onevent=function(packet){var args=packet.data||[];debug("emitting event %j",args);if(null!=packet.id){debug("attaching ack callback to event");args.push(this.ack(packet.id))}if(this.connected){emit.apply(this,args)}else{this.receiveBuffer.push(args)}};Socket.prototype.ack=function(id){var self=this;var sent=false;return function(){if(sent)return;sent=true;var args=toArray(arguments);debug("sending ack %j",args);var type=hasBin(args)?parser.BINARY_ACK:parser.ACK;self.packet({type:type,id:id,data:args})}};Socket.prototype.onack=function(packet){debug("calling ack %s with %j",packet.id,packet.data);var fn=this.acks[packet.id];fn.apply(this,packet.data);delete this.acks[packet.id]};Socket.prototype.onconnect=function(){this.connected=true;this.disconnected=false;this.emit("connect");this.emitBuffered()};Socket.prototype.emitBuffered=function(){var i;for(i=0;i0&&opts.jitter<=1?opts.jitter:0;this.attempts=0}Backoff.prototype.duration=function(){var ms=this.ms*Math.pow(this.factor,this.attempts++);if(this.jitter){var rand=Math.random();var deviation=Math.floor(rand*this.jitter*ms);ms=(Math.floor(rand*10)&1)==0?ms-deviation:ms+deviation}return Math.min(ms,this.max)|0};Backoff.prototype.reset=function(){this.attempts=0};Backoff.prototype.setMin=function(min){this.ms=min};Backoff.prototype.setMax=function(max){this.max=max};Backoff.prototype.setJitter=function(jitter){this.jitter=jitter}},{}],8:[function(_dereq_,module,exports){var slice=[].slice;module.exports=function(obj,fn){if("string"==typeof fn)fn=obj[fn];if("function"!=typeof fn)throw new Error("bind() requires a function");var args=slice.call(arguments,2);return function(){return fn.apply(obj,args.concat(slice.call(arguments)))}}},{}],9:[function(_dereq_,module,exports){module.exports=Emitter;function Emitter(obj){if(obj)return mixin(obj)}function mixin(obj){for(var key in Emitter.prototype){obj[key]=Emitter.prototype[key]}return obj}Emitter.prototype.on=Emitter.prototype.addEventListener=function(event,fn){this._callbacks=this._callbacks||{};(this._callbacks[event]=this._callbacks[event]||[]).push(fn);return this};Emitter.prototype.once=function(event,fn){var self=this;this._callbacks=this._callbacks||{};function on(){self.off(event,on);fn.apply(this,arguments)}on.fn=fn;this.on(event,on);return this};Emitter.prototype.off=Emitter.prototype.removeListener=Emitter.prototype.removeAllListeners=Emitter.prototype.removeEventListener=function(event,fn){this._callbacks=this._callbacks||{};if(0==arguments.length){this._callbacks={};return this}var callbacks=this._callbacks[event];if(!callbacks)return this;if(1==arguments.length){delete this._callbacks[event];return this}var cb;for(var i=0;i=hour)return(ms/hour).toFixed(1)+"h";if(ms>=min)return(ms/min).toFixed(1)+"m";if(ms>=sec)return(ms/sec|0)+"s";return ms+"ms"};debug.enabled=function(name){for(var i=0,len=debug.skips.length;i';iframe=document.createElement(html)}catch(e){iframe=document.createElement("iframe");iframe.name=self.iframeId;iframe.src="javascript:0"}iframe.id=self.iframeId;self.form.appendChild(iframe);self.iframe=iframe}initIframe();data=data.replace(rEscapedNewline,"\\\n");this.area.value=data.replace(rNewline,"\\n");try{this.form.submit()}catch(e){}if(this.iframe.attachEvent){this.iframe.onreadystatechange=function(){if(self.iframe.readyState=="complete"){complete()}}}else{this.iframe.onload=complete}}}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{"./polling":18,"component-inherit":21}],17:[function(_dereq_,module,exports){(function(global){var XMLHttpRequest=_dereq_("xmlhttprequest");var Polling=_dereq_("./polling");var Emitter=_dereq_("component-emitter");var inherit=_dereq_("component-inherit");var debug=_dereq_("debug")("engine.io-client:polling-xhr");module.exports=XHR;module.exports.Request=Request;function empty(){}function XHR(opts){Polling.call(this,opts);if(global.location){var isSSL="https:"==location.protocol;var port=location.port;if(!port){port=isSSL?443:80}this.xd=opts.hostname!=global.location.hostname||port!=opts.port;this.xs=opts.secure!=isSSL}}inherit(XHR,Polling);XHR.prototype.supportsBinary=true;XHR.prototype.request=function(opts){opts=opts||{};opts.uri=this.uri();opts.xd=this.xd;opts.xs=this.xs;opts.agent=this.agent||false;opts.supportsBinary=this.supportsBinary;opts.enablesXDR=this.enablesXDR;opts.pfx=this.pfx;opts.key=this.key;opts.passphrase=this.passphrase;opts.cert=this.cert;opts.ca=this.ca;opts.ciphers=this.ciphers;opts.rejectUnauthorized=this.rejectUnauthorized;return new Request(opts)};XHR.prototype.doWrite=function(data,fn){var isBinary=typeof data!=="string"&&data!==undefined;var req=this.request({method:"POST",data:data,isBinary:isBinary});var self=this;req.on("success",fn);req.on("error",function(err){self.onError("xhr post error",err)});this.sendXhr=req};XHR.prototype.doPoll=function(){debug("xhr poll");var req=this.request();var self=this;req.on("data",function(data){self.onData(data)});req.on("error",function(err){self.onError("xhr poll error",err)});this.pollXhr=req};function Request(opts){this.method=opts.method||"GET";this.uri=opts.uri;this.xd=!!opts.xd;this.xs=!!opts.xs;this.async=false!==opts.async;this.data=undefined!=opts.data?opts.data:null;this.agent=opts.agent;this.isBinary=opts.isBinary;this.supportsBinary=opts.supportsBinary;this.enablesXDR=opts.enablesXDR;this.pfx=opts.pfx;this.key=opts.key;this.passphrase=opts.passphrase;this.cert=opts.cert;this.ca=opts.ca;this.ciphers=opts.ciphers;this.rejectUnauthorized=opts.rejectUnauthorized;this.create()}Emitter(Request.prototype);Request.prototype.create=function(){var opts={agent:this.agent,xdomain:this.xd,xscheme:this.xs,enablesXDR:this.enablesXDR};opts.pfx=this.pfx;opts.key=this.key;opts.passphrase=this.passphrase;opts.cert=this.cert;opts.ca=this.ca;opts.ciphers=this.ciphers;opts.rejectUnauthorized=this.rejectUnauthorized;var xhr=this.xhr=new XMLHttpRequest(opts);var self=this;try{debug("xhr open %s: %s",this.method,this.uri);xhr.open(this.method,this.uri,this.async);if(this.supportsBinary){xhr.responseType="arraybuffer"}if("POST"==this.method){try{if(this.isBinary){xhr.setRequestHeader("Content-type","application/octet-stream")}else{xhr.setRequestHeader("Content-type","text/plain;charset=UTF-8")}}catch(e){}}if("withCredentials"in xhr){xhr.withCredentials=true}if(this.hasXDR()){xhr.onload=function(){self.onLoad()};xhr.onerror=function(){self.onError(xhr.responseText)}}else{xhr.onreadystatechange=function(){if(4!=xhr.readyState)return;if(200==xhr.status||1223==xhr.status){self.onLoad()}else{setTimeout(function(){self.onError(xhr.status)},0)}}}debug("xhr data %s",this.data);xhr.send(this.data)}catch(e){setTimeout(function(){self.onError(e)},0);return}if(global.document){this.index=Request.requestsCount++;Request.requests[this.index]=this}};Request.prototype.onSuccess=function(){this.emit("success");this.cleanup()};Request.prototype.onData=function(data){this.emit("data",data);this.onSuccess()};Request.prototype.onError=function(err){this.emit("error",err);this.cleanup(true)};Request.prototype.cleanup=function(fromError){if("undefined"==typeof this.xhr||null===this.xhr){return}if(this.hasXDR()){this.xhr.onload=this.xhr.onerror=empty}else{this.xhr.onreadystatechange=empty}if(fromError){try{this.xhr.abort()}catch(e){}}if(global.document){delete Request.requests[this.index]}this.xhr=null};Request.prototype.onLoad=function(){var data;try{var contentType;try{contentType=this.xhr.getResponseHeader("Content-Type").split(";")[0]}catch(e){}if(contentType==="application/octet-stream"){data=this.xhr.response}else{if(!this.supportsBinary){data=this.xhr.responseText}else{data="ok"}}}catch(e){this.onError(e)}if(null!=data){this.onData(data)}};Request.prototype.hasXDR=function(){return"undefined"!==typeof global.XDomainRequest&&!this.xs&&this.enablesXDR};Request.prototype.abort=function(){this.cleanup()};if(global.document){Request.requestsCount=0;Request.requests={};if(global.attachEvent){global.attachEvent("onunload",unloadHandler)}else if(global.addEventListener){global.addEventListener("beforeunload",unloadHandler,false)}}function unloadHandler(){for(var i in Request.requests){if(Request.requests.hasOwnProperty(i)){Request.requests[i].abort()}}}}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{"./polling":18,"component-emitter":9,"component-inherit":21,debug:22,xmlhttprequest:20}],18:[function(_dereq_,module,exports){var Transport=_dereq_("../transport");var parseqs=_dereq_("parseqs");var parser=_dereq_("engine.io-parser");var inherit=_dereq_("component-inherit");var debug=_dereq_("debug")("engine.io-client:polling");module.exports=Polling;var hasXHR2=function(){var XMLHttpRequest=_dereq_("xmlhttprequest");var xhr=new XMLHttpRequest({xdomain:false});return null!=xhr.responseType}();function Polling(opts){var forceBase64=opts&&opts.forceBase64;if(!hasXHR2||forceBase64){this.supportsBinary=false}Transport.call(this,opts)}inherit(Polling,Transport);Polling.prototype.name="polling";Polling.prototype.doOpen=function(){this.poll()};Polling.prototype.pause=function(onPause){var pending=0;var self=this;this.readyState="pausing";function pause(){debug("paused");self.readyState="paused";onPause()}if(this.polling||!this.writable){var total=0;if(this.polling){debug("we are currently polling - waiting to pause");total++;this.once("pollComplete",function(){debug("pre-pause polling complete");--total||pause()})}if(!this.writable){debug("we are currently writing - waiting to pause");total++;this.once("drain",function(){debug("pre-pause writing complete");--total||pause()})}}else{pause()}};Polling.prototype.poll=function(){debug("polling");this.polling=true;this.doPoll();this.emit("poll")};Polling.prototype.onData=function(data){var self=this;debug("polling got data %s",data);var callback=function(packet,index,total){if("opening"==self.readyState){self.onOpen()}if("close"==packet.type){self.onClose();return false}self.onPacket(packet)};parser.decodePayload(data,this.socket.binaryType,callback);if("closed"!=this.readyState){this.polling=false;this.emit("pollComplete");if("open"==this.readyState){this.poll()}else{debug('ignoring poll - transport state "%s"',this.readyState)}}};Polling.prototype.doClose=function(){var self=this;function close(){debug("writing close packet");self.write([{type:"close"}])}if("open"==this.readyState){debug("transport open - closing");close()}else{debug("transport not open - deferring close");this.once("open",close)}};Polling.prototype.write=function(packets){var self=this;this.writable=false;var callbackfn=function(){self.writable=true;self.emit("drain")};var self=this;parser.encodePayload(packets,this.supportsBinary,function(data){self.doWrite(data,callbackfn)})};Polling.prototype.uri=function(){var query=this.query||{};var schema=this.secure?"https":"http";var port="";if(false!==this.timestampRequests){query[this.timestampParam]=+new Date+"-"+Transport.timestamps++}if(!this.supportsBinary&&!query.sid){query.b64=1}query=parseqs.encode(query);if(this.port&&("https"==schema&&this.port!=443||"http"==schema&&this.port!=80)){port=":"+this.port}if(query.length){query="?"+query}return schema+"://"+this.hostname+port+this.path+query}},{"../transport":14,"component-inherit":21,debug:22,"engine.io-parser":25,parseqs:35,xmlhttprequest:20}],19:[function(_dereq_,module,exports){var Transport=_dereq_("../transport");var parser=_dereq_("engine.io-parser");var parseqs=_dereq_("parseqs");var inherit=_dereq_("component-inherit");var debug=_dereq_("debug")("engine.io-client:websocket");var WebSocket=_dereq_("ws");module.exports=WS;function WS(opts){var forceBase64=opts&&opts.forceBase64;if(forceBase64){this.supportsBinary=false}this.perMessageDeflate=opts.perMessageDeflate;Transport.call(this,opts)}inherit(WS,Transport);WS.prototype.name="websocket";WS.prototype.supportsBinary=true;WS.prototype.doOpen=function(){if(!this.check()){return}var self=this;var uri=this.uri();var protocols=void 0;var opts={agent:this.agent,perMessageDeflate:this.perMessageDeflate};opts.pfx=this.pfx;opts.key=this.key;opts.passphrase=this.passphrase;opts.cert=this.cert;opts.ca=this.ca;opts.ciphers=this.ciphers;opts.rejectUnauthorized=this.rejectUnauthorized;this.ws=new WebSocket(uri,protocols,opts);if(this.ws.binaryType===undefined){this.supportsBinary=false}this.ws.binaryType="arraybuffer";this.addEventListeners()};WS.prototype.addEventListeners=function(){var self=this;this.ws.onopen=function(){self.onOpen()};this.ws.onclose=function(){self.onClose()};this.ws.onmessage=function(ev){self.onData(ev.data)};this.ws.onerror=function(e){self.onError("websocket error",e)}};if("undefined"!=typeof navigator&&/iPad|iPhone|iPod/i.test(navigator.userAgent)){WS.prototype.onData=function(data){var self=this;setTimeout(function(){Transport.prototype.onData.call(self,data)},0)}}WS.prototype.write=function(packets){var self=this;this.writable=false;for(var i=0,l=packets.length;i=31}exports.formatters.j=function(v){return JSON.stringify(v)};function formatArgs(){var args=arguments;var useColors=this.useColors;args[0]=(useColors?"%c":"")+this.namespace+(useColors?" %c":" ")+args[0]+(useColors?"%c ":" ")+"+"+exports.humanize(this.diff);if(!useColors)return args;var c="color: "+this.color;args=[args[0],c,"color: inherit"].concat(Array.prototype.slice.call(args,1));var index=0;var lastC=0;args[0].replace(/%[a-z%]/g,function(match){if("%"===match)return;index++;if("%c"===match){lastC=index}});args.splice(lastC,0,c);return args}function log(){return"object"==typeof console&&"function"==typeof console.log&&Function.prototype.apply.call(console.log,console,arguments)}function save(namespaces){try{if(null==namespaces){localStorage.removeItem("debug")}else{localStorage.debug=namespaces}}catch(e){}}function load(){var r;try{r=localStorage.debug}catch(e){}return r}exports.enable(load())},{"./debug":23}],23:[function(_dereq_,module,exports){exports=module.exports=debug;exports.coerce=coerce;exports.disable=disable;exports.enable=enable;exports.enabled=enabled;exports.humanize=_dereq_("ms");exports.names=[];exports.skips=[];exports.formatters={};var prevColor=0;var prevTime;function selectColor(){return exports.colors[prevColor++%exports.colors.length]}function debug(namespace){function disabled(){}disabled.enabled=false;function enabled(){var self=enabled;var curr=+new Date;var ms=curr-(prevTime||curr);self.diff=ms;self.prev=prevTime;self.curr=curr;prevTime=curr;if(null==self.useColors)self.useColors=exports.useColors();if(null==self.color&&self.useColors)self.color=selectColor();var args=Array.prototype.slice.call(arguments);args[0]=exports.coerce(args[0]);if("string"!==typeof args[0]){args=["%o"].concat(args)}var index=0;args[0]=args[0].replace(/%([a-z%])/g,function(match,format){if(match==="%")return match;index++;var formatter=exports.formatters[format];if("function"===typeof formatter){var val=args[index];match=formatter.call(self,val);args.splice(index,1);index--}return match});if("function"===typeof exports.formatArgs){args=exports.formatArgs.apply(self,args)}var logFn=enabled.log||exports.log||console.log.bind(console);logFn.apply(self,args)}enabled.enabled=true;var fn=exports.enabled(namespace)?enabled:disabled;fn.namespace=namespace;return fn}function enable(namespaces){exports.save(namespaces);var split=(namespaces||"").split(/[\s,]+/);var len=split.length;for(var i=0;i=d)return Math.round(ms/d)+"d";if(ms>=h)return Math.round(ms/h)+"h";if(ms>=m)return Math.round(ms/m)+"m";if(ms>=s)return Math.round(ms/s)+"s";return ms+"ms"}function long(ms){return plural(ms,d,"day")||plural(ms,h,"hour")||plural(ms,m,"minute")||plural(ms,s,"second")||ms+" ms"}function plural(ms,n,name){if(ms1){return{type:packetslist[type],data:data.substring(1)}}else{return{type:packetslist[type]}}}var asArray=new Uint8Array(data);var type=asArray[0];var rest=sliceBuffer(data,1);if(Blob&&binaryType==="blob"){rest=new Blob([rest])}return{type:packetslist[type],data:rest}};exports.decodeBase64Packet=function(msg,binaryType){var type=packetslist[msg.charAt(0)];if(!global.ArrayBuffer){return{type:type,data:{base64:true,data:msg.substr(1)}}}var data=base64encoder.decode(msg.substr(1));if(binaryType==="blob"&&Blob){data=new Blob([data])}return{type:type,data:data}};exports.encodePayload=function(packets,supportsBinary,callback){if(typeof supportsBinary=="function"){callback=supportsBinary;supportsBinary=null}var isBinary=hasBinary(packets);if(supportsBinary&&isBinary){if(Blob&&!dontSendBlobs){return exports.encodePayloadAsBlob(packets,callback)}return exports.encodePayloadAsArrayBuffer(packets,callback)}if(!packets.length){return callback("0:")}function setLengthHeader(message){return message.length+":"+message}function encodeOne(packet,doneCallback){exports.encodePacket(packet,!isBinary?false:supportsBinary,true,function(message){doneCallback(null,setLengthHeader(message))})}map(packets,encodeOne,function(err,results){return callback(results.join(""))})};function map(ary,each,done){var result=new Array(ary.length);var next=after(ary.length,done);var eachWithIndex=function(i,el,cb){each(el,function(error,msg){result[i]=msg;cb(error,result)})};for(var i=0;i0){var tailArray=new Uint8Array(bufferTail);var isString=tailArray[0]===0;var msgLength="";for(var i=1;;i++){if(tailArray[i]==255)break;if(msgLength.length>310){numberTooLong=true;break}msgLength+=tailArray[i]}if(numberTooLong)return callback(err,0,1);bufferTail=sliceBuffer(bufferTail,2+msgLength.length);msgLength=parseInt(msgLength);var msg=sliceBuffer(bufferTail,0,msgLength);if(isString){try{msg=String.fromCharCode.apply(null,new Uint8Array(msg))}catch(e){var typed=new Uint8Array(msg);msg="";for(var i=0;ibytes){end=bytes}if(start>=bytes||start>=end||bytes===0){return new ArrayBuffer(0)}var abv=new Uint8Array(arraybuffer);var result=new Uint8Array(end-start);for(var i=start,ii=0;i>2];base64+=chars[(bytes[i]&3)<<4|bytes[i+1]>>4];base64+=chars[(bytes[i+1]&15)<<2|bytes[i+2]>>6];base64+=chars[bytes[i+2]&63]}if(len%3===2){base64=base64.substring(0,base64.length-1)+"="}else if(len%3===1){base64=base64.substring(0,base64.length-2)+"=="}return base64};exports.decode=function(base64){var bufferLength=base64.length*.75,len=base64.length,i,p=0,encoded1,encoded2,encoded3,encoded4;if(base64[base64.length-1]==="="){bufferLength--;if(base64[base64.length-2]==="="){bufferLength--}}var arraybuffer=new ArrayBuffer(bufferLength),bytes=new Uint8Array(arraybuffer);for(i=0;i>4;bytes[p++]=(encoded2&15)<<4|encoded3>>2;bytes[p++]=(encoded3&3)<<6|encoded4&63}return arraybuffer}})("ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/")},{}],30:[function(_dereq_,module,exports){(function(global){var BlobBuilder=global.BlobBuilder||global.WebKitBlobBuilder||global.MSBlobBuilder||global.MozBlobBuilder;var blobSupported=function(){try{var b=new Blob(["hi"]);return b.size==2}catch(e){return false}}();var blobBuilderSupported=BlobBuilder&&BlobBuilder.prototype.append&&BlobBuilder.prototype.getBlob;function BlobBuilderConstructor(ary,options){options=options||{};var bb=new BlobBuilder;for(var i=0;i=55296&&value<=56319&&counter65535){value-=65536;output+=stringFromCharCode(value>>>10&1023|55296);value=56320|value&1023}output+=stringFromCharCode(value)}return output}function createByte(codePoint,shift){return stringFromCharCode(codePoint>>shift&63|128)}function encodeCodePoint(codePoint){if((codePoint&4294967168)==0){return stringFromCharCode(codePoint)}var symbol="";if((codePoint&4294965248)==0){symbol=stringFromCharCode(codePoint>>6&31|192)}else if((codePoint&4294901760)==0){symbol=stringFromCharCode(codePoint>>12&15|224);symbol+=createByte(codePoint,6)}else if((codePoint&4292870144)==0){symbol=stringFromCharCode(codePoint>>18&7|240);symbol+=createByte(codePoint,12);symbol+=createByte(codePoint,6)}symbol+=stringFromCharCode(codePoint&63|128);return symbol}function utf8encode(string){var codePoints=ucs2decode(string);var length=codePoints.length;var index=-1;var codePoint;var byteString="";while(++index=byteCount){throw Error("Invalid byte index")}var continuationByte=byteArray[byteIndex]&255;byteIndex++;if((continuationByte&192)==128){return continuationByte&63}throw Error("Invalid continuation byte")}function decodeSymbol(){var byte1;var byte2;var byte3;var byte4;var codePoint;if(byteIndex>byteCount){throw Error("Invalid byte index")}if(byteIndex==byteCount){return false}byte1=byteArray[byteIndex]&255;byteIndex++;if((byte1&128)==0){return byte1}if((byte1&224)==192){var byte2=readContinuationByte();codePoint=(byte1&31)<<6|byte2;if(codePoint>=128){return codePoint}else{throw Error("Invalid continuation byte")}}if((byte1&240)==224){byte2=readContinuationByte();byte3=readContinuationByte();codePoint=(byte1&15)<<12|byte2<<6|byte3;if(codePoint>=2048){return codePoint}else{throw Error("Invalid continuation byte")}}if((byte1&248)==240){byte2=readContinuationByte();byte3=readContinuationByte();byte4=readContinuationByte();codePoint=(byte1&15)<<18|byte2<<12|byte3<<6|byte4;if(codePoint>=65536&&codePoint<=1114111){return codePoint}}throw Error("Invalid UTF-8 detected")}var byteArray;var byteCount;var byteIndex;function utf8decode(byteString){byteArray=ucs2decode(byteString);byteCount=byteArray.length;byteIndex=0;var codePoints=[];var tmp;while((tmp=decodeSymbol())!==false){codePoints.push(tmp)}return ucs2encode(codePoints)}var utf8={version:"2.0.0",encode:utf8encode,decode:utf8decode};if(typeof define=="function"&&typeof define.amd=="object"&&define.amd){define(function(){return utf8})}else if(freeExports&&!freeExports.nodeType){if(freeModule){freeModule.exports=utf8}else{var object={};var hasOwnProperty=object.hasOwnProperty;for(var key in utf8){hasOwnProperty.call(utf8,key)&&(freeExports[key]=utf8[key])}}}else{root.utf8=utf8}})(this)}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{}],34:[function(_dereq_,module,exports){(function(global){var rvalidchars=/^[\],:{}\s]*$/;var rvalidescape=/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;var rvalidtokens=/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;var rvalidbraces=/(?:^|:|,)(?:\s*\[)+/g;var rtrimLeft=/^\s+/;var rtrimRight=/\s+$/;module.exports=function parsejson(data){if("string"!=typeof data||!data){return null}data=data.replace(rtrimLeft,"").replace(rtrimRight,"");if(global.JSON&&JSON.parse){return JSON.parse(data)}if(rvalidchars.test(data.replace(rvalidescape,"@").replace(rvalidtokens,"]").replace(rvalidbraces,""))){return new Function("return "+data)()}}}).call(this,typeof self!=="undefined"?self:typeof window!=="undefined"?window:{})},{}],35:[function(_dereq_,module,exports){exports.encode=function(obj){var str="";for(var i in obj){if(obj.hasOwnProperty(i)){if(str.length)str+="&";str+=encodeURIComponent(i)+"="+encodeURIComponent(obj[i])}}return str};exports.decode=function(qs){var qry={};var pairs=qs.split("&");for(var i=0,l=pairs.length;i1)))/4)-floor((year-1901+month)/100)+floor((year-1601+month)/400)}}if(!(isProperty={}.hasOwnProperty)){isProperty=function(property){var members={},constructor;if((members.__proto__=null,members.__proto__={toString:1},members).toString!=getClass){isProperty=function(property){var original=this.__proto__,result=property in(this.__proto__=null,this);this.__proto__=original;return result}}else{constructor=members.constructor;isProperty=function(property){var parent=(this.constructor||constructor).prototype;return property in this&&!(property in parent&&this[property]===parent[property])}}members=null;return isProperty.call(this,property)}}var PrimitiveTypes={"boolean":1,number:1,string:1,undefined:1};var isHostType=function(object,property){var type=typeof object[property];return type=="object"?!!object[property]:!PrimitiveTypes[type]};forEach=function(object,callback){var size=0,Properties,members,property;(Properties=function(){this.valueOf=0}).prototype.valueOf=0;members=new Properties;for(property in members){if(isProperty.call(members,property)){size++}}Properties=members=null;if(!size){members=["valueOf","toString","toLocaleString","propertyIsEnumerable","isPrototypeOf","hasOwnProperty","constructor"];forEach=function(object,callback){var isFunction=getClass.call(object)==functionClass,property,length;var hasProperty=!isFunction&&typeof object.constructor!="function"&&isHostType(object,"hasOwnProperty")?object.hasOwnProperty:isProperty;for(property in object){if(!(isFunction&&property=="prototype")&&hasProperty.call(object,property)){callback(property)}}for(length=members.length;property=members[--length];hasProperty.call(object,property)&&callback(property));}}else if(size==2){forEach=function(object,callback){var members={},isFunction=getClass.call(object)==functionClass,property;for(property in object){if(!(isFunction&&property=="prototype")&&!isProperty.call(members,property)&&(members[property]=1)&&isProperty.call(object,property)){callback(property)}}}}else{forEach=function(object,callback){var isFunction=getClass.call(object)==functionClass,property,isConstructor;for(property in object){if(!(isFunction&&property=="prototype")&&isProperty.call(object,property)&&!(isConstructor=property==="constructor")){callback(property)}}if(isConstructor||isProperty.call(object,property="constructor")){callback(property)}}}return forEach(object,callback)};if(!has("json-stringify")){var Escapes={92:"\\\\",34:'\\"',8:"\\b",12:"\\f",10:"\\n",13:"\\r",9:"\\t"};var leadingZeroes="000000";var toPaddedString=function(width,value){return(leadingZeroes+(value||0)).slice(-width)};var unicodePrefix="\\u00";var quote=function(value){var result='"',index=0,length=value.length,isLarge=length>10&&charIndexBuggy,symbols;if(isLarge){symbols=value.split("")}for(;index-1/0&&value<1/0){if(getDay){date=floor(value/864e5);for(year=floor(date/365.2425)+1970-1;getDay(year+1,0)<=date;year++);for(month=floor((date-getDay(year,0))/30.42);getDay(year,month+1)<=date;month++);date=1+date-getDay(year,month);time=(value%864e5+864e5)%864e5;hours=floor(time/36e5)%24;minutes=floor(time/6e4)%60;seconds=floor(time/1e3)%60;milliseconds=time%1e3}else{year=value.getUTCFullYear();month=value.getUTCMonth();date=value.getUTCDate();hours=value.getUTCHours();minutes=value.getUTCMinutes();seconds=value.getUTCSeconds();milliseconds=value.getUTCMilliseconds()}value=(year<=0||year>=1e4?(year<0?"-":"+")+toPaddedString(6,year<0?-year:year):toPaddedString(4,year))+"-"+toPaddedString(2,month+1)+"-"+toPaddedString(2,date)+"T"+toPaddedString(2,hours)+":"+toPaddedString(2,minutes)+":"+toPaddedString(2,seconds)+"."+toPaddedString(3,milliseconds)+"Z"}else{value=null}}else if(typeof value.toJSON=="function"&&(className!=numberClass&&className!=stringClass&&className!=arrayClass||isProperty.call(value,"toJSON"))){value=value.toJSON(property)}}if(callback){value=callback.call(object,property,value)}if(value===null){return"null"}className=getClass.call(value);if(className==booleanClass){return""+value}else if(className==numberClass){return value>-1/0&&value<1/0?""+value:"null"}else if(className==stringClass){return quote(""+value)}if(typeof value=="object"){for(length=stack.length;length--;){if(stack[length]===value){throw TypeError()}}stack.push(value);results=[];prefix=indentation;indentation+=whitespace;if(className==arrayClass){for(index=0,length=value.length;index0){for(whitespace="",width>10&&(width=10);whitespace.length=48&&charCode<=57||charCode>=97&&charCode<=102||charCode>=65&&charCode<=70)){abort()}}value+=fromCharCode("0x"+source.slice(begin,Index));break;default:abort()}}else{if(charCode==34){break}charCode=source.charCodeAt(Index);begin=Index;while(charCode>=32&&charCode!=92&&charCode!=34){charCode=source.charCodeAt(++Index)}value+=source.slice(begin,Index)}}if(source.charCodeAt(Index)==34){Index++;return value}abort();default:begin=Index;if(charCode==45){isSigned=true;charCode=source.charCodeAt(++Index)}if(charCode>=48&&charCode<=57){if(charCode==48&&(charCode=source.charCodeAt(Index+1),charCode>=48&&charCode<=57)){abort()}isSigned=false;for(;Index=48&&charCode<=57);Index++);if(source.charCodeAt(Index)==46){position=++Index;for(;position=48&&charCode<=57);position++);if(position==Index){abort()}Index=position}charCode=source.charCodeAt(Index);if(charCode==101||charCode==69){charCode=source.charCodeAt(++Index);if(charCode==43||charCode==45){Index++}for(position=Index;position=48&&charCode<=57);position++);if(position==Index){abort()}Index=position}return+source.slice(begin,Index)}if(isSigned){abort()}if(source.slice(Index,Index+4)=="true"){Index+=4;return true}else if(source.slice(Index,Index+5)=="false"){Index+=5;return false}else if(source.slice(Index,Index+4)=="null"){Index+=4;return null}abort()}}return"$"};var get=function(value){var results,hasMembers;if(value=="$"){abort()}if(typeof value=="string"){if((charIndexBuggy?value.charAt(0):value[0])=="@"){return value.slice(1)}if(value=="["){results=[];for(;;hasMembers||(hasMembers=true)){value=lex();if(value=="]"){break}if(hasMembers){if(value==","){value=lex();if(value=="]"){abort()}}else{abort()}}if(value==","){abort()}results.push(get(value))}return results}else if(value=="{"){results={};for(;;hasMembers||(hasMembers=true)){value=lex();if(value=="}"){break}if(hasMembers){if(value==","){value=lex();if(value=="}"){abort()}}else{abort()}}if(value==","||typeof value!="string"||(charIndexBuggy?value.charAt(0):value[0])!="@"||lex()!=":"){abort()}results[value.slice(1)]=get(lex())}return results}abort()}return value};var update=function(source,property,callback){var element=walk(source,property,callback);if(element===undef){delete source[property]}else{source[property]=element}};var walk=function(source,property,callback){var value=source[property],length;if(typeof value=="object"&&value){if(getClass.call(value)==arrayClass){for(length=value.length;length--;){update(value,length,callback)}}else{forEach(value,function(property){update(value,property,callback)})}}return callback.call(source,property,value)};JSON3.parse=function(source,callback){var result,value;Index=0;Source=""+source;result=get(lex());if(lex()!="$"){abort()}Index=Source=null;return callback&&getClass.call(callback)==functionClass?walk((value={},value[""]=result,value),"",callback):result}}}if(isLoader){define(function(){return JSON3})}})(this)},{}],50:[function(_dereq_,module,exports){module.exports=toArray;function toArray(list,index){var array=[];index=index||0;for(var i=index||0;i + + + + Demo Chat + + + + + + + + + + + + + + + +

    Namespaces demo chat

    + +
    + +
    +

    chat1

    +
    +
    + +
    + + + + +
    + +
    +

    chat2

    +
    +
    + +
    + + + + +
    + + + + + + diff --git a/app-manage-api/src/test/java/com/enzhico/jwt/socket/client/html/ssl-event-index.html b/app-manage-api/src/test/java/com/enzhico/jwt/socket/client/html/ssl-event-index.html new file mode 100644 index 0000000..0ffe6a8 --- /dev/null +++ b/app-manage-api/src/test/java/com/enzhico/jwt/socket/client/html/ssl-event-index.html @@ -0,0 +1,90 @@ + + + + + Demo Chat + + + + + + + + + + + + + + + +

    Netty-socketio Demo Chat

    + +
    + +
    +
    + +
    + + + + + + + + + + diff --git a/app-manage-api/src/test/java/com/enzhico/jwt/socket/model/ChatMessage.java b/app-manage-api/src/test/java/com/enzhico/jwt/socket/model/ChatMessage.java new file mode 100644 index 0000000..9e89959 --- /dev/null +++ b/app-manage-api/src/test/java/com/enzhico/jwt/socket/model/ChatMessage.java @@ -0,0 +1,29 @@ +package com.enzhico.jwt.socket.model; + +/** + * ChatMessage + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/30 + */ +public class ChatMessage { + private String userName; + private String message; + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } +} diff --git a/app-manage-api/src/test/java/com/enzhico/jwt/socket/model/LoginRequest.java b/app-manage-api/src/test/java/com/enzhico/jwt/socket/model/LoginRequest.java new file mode 100644 index 0000000..575a45a --- /dev/null +++ b/app-manage-api/src/test/java/com/enzhico/jwt/socket/model/LoginRequest.java @@ -0,0 +1,40 @@ +package com.enzhico.jwt.socket.model; + +import java.io.Serializable; + +/** + * LoginRequest + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/18 + */ +public class LoginRequest implements Serializable { + private int code; + private String body; + + public LoginRequest() { + } + + public LoginRequest(int code, String body) { + super(); + this.code = code; + this.body = body; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getBody() { + return body; + } + + public void setBody(String body) { + this.body = body; + } +} diff --git a/app-manage-api/src/test/java/com/enzhico/jwt/socket/server/AckChatLauncher.java b/app-manage-api/src/test/java/com/enzhico/jwt/socket/server/AckChatLauncher.java new file mode 100644 index 0000000..28f25d1 --- /dev/null +++ b/app-manage-api/src/test/java/com/enzhico/jwt/socket/server/AckChatLauncher.java @@ -0,0 +1,58 @@ +package com.enzhico.jwt.socket.server; + +import com.corundumstudio.socketio.AckCallback; +import com.corundumstudio.socketio.AckRequest; +import com.corundumstudio.socketio.Configuration; +import com.corundumstudio.socketio.SocketIOClient; +import com.corundumstudio.socketio.SocketIOServer; +import com.corundumstudio.socketio.VoidAckCallback; +import com.corundumstudio.socketio.listener.DataListener; + +public class AckChatLauncher { + + public static void main(String[] args) throws InterruptedException { + + Configuration config = new Configuration(); + config.setHostname("localhost"); + config.setPort(9092); + + final SocketIOServer server = new SocketIOServer(config); + server.addEventListener("ackevent1", ChatObject.class, new DataListener() { + @Override + public void onData(final SocketIOClient client, ChatObject data, final AckRequest ackRequest) { + + // check is ack requested by client, + // but it's not required check + if (ackRequest.isAckRequested()) { + // send ack response with data to client + ackRequest.sendAckData("client message was delivered to server!", "yeah!"); + } + + // send message back to client with ack callback WITH data + ChatObject ackChatObjectData = new ChatObject(data.getUserName(), "message with ack data"); + client.sendEvent("ackevent2", new AckCallback(String.class) { + @Override + public void onSuccess(String result) { + System.out.println("ack from client: " + client.getSessionId() + " data: " + result); + } + }, ackChatObjectData); + + ChatObject ackChatObjectData1 = new ChatObject(data.getUserName(), "message with void ack"); + client.sendEvent("ackevent3", new VoidAckCallback() { + + protected void onSuccess() { + System.out.println("void ack from: " + client.getSessionId()); + } + + }, ackChatObjectData1); + } + }); + + server.start(); + + Thread.sleep(Integer.MAX_VALUE); + + server.stop(); + } + +} diff --git a/app-manage-api/src/test/java/com/enzhico/jwt/socket/server/BinaryEventLauncher.java b/app-manage-api/src/test/java/com/enzhico/jwt/socket/server/BinaryEventLauncher.java new file mode 100644 index 0000000..c4e149f --- /dev/null +++ b/app-manage-api/src/test/java/com/enzhico/jwt/socket/server/BinaryEventLauncher.java @@ -0,0 +1,38 @@ +package com.enzhico.jwt.socket.server; + +import java.io.UnsupportedEncodingException; + +import com.corundumstudio.socketio.AckRequest; +import com.corundumstudio.socketio.Configuration; +import com.corundumstudio.socketio.SocketIOClient; +import com.corundumstudio.socketio.SocketIOServer; +import com.corundumstudio.socketio.Transport; +import com.corundumstudio.socketio.listener.DataListener; + +public class BinaryEventLauncher { + + public static void main(String[] args) throws InterruptedException, UnsupportedEncodingException { + + Configuration config = new Configuration(); + config.setHostname("localhost"); + config.setPort(9092); + config.setMaxFramePayloadLength(1024 * 1024); + config.setMaxHttpContentLength(1024 * 1024); + + final SocketIOServer server = new SocketIOServer(config); + + server.addEventListener("msg", byte[].class, new DataListener() { + @Override + public void onData(SocketIOClient client, byte[] data, AckRequest ackRequest) { + client.sendEvent("msg", data); + } + }); + + server.start(); + + Thread.sleep(Integer.MAX_VALUE); + + server.stop(); + } + +} diff --git a/app-manage-api/src/test/java/com/enzhico/jwt/socket/server/ChatLauncher.java b/app-manage-api/src/test/java/com/enzhico/jwt/socket/server/ChatLauncher.java new file mode 100644 index 0000000..a89afab --- /dev/null +++ b/app-manage-api/src/test/java/com/enzhico/jwt/socket/server/ChatLauncher.java @@ -0,0 +1,30 @@ +package com.enzhico.jwt.socket.server; + +import com.corundumstudio.socketio.listener.*; +import com.corundumstudio.socketio.*; + +public class ChatLauncher { + + public static void main(String[] args) throws InterruptedException { + + Configuration config = new Configuration(); + config.setHostname("localhost"); + config.setPort(9092); + + final SocketIOServer server = new SocketIOServer(config); + server.addEventListener("chatevent", ChatObject.class, new DataListener() { + @Override + public void onData(SocketIOClient client, ChatObject data, AckRequest ackRequest) { + // broadcast messages to all clients + server.getBroadcastOperations().sendEvent("chatevent", data); + } + }); + + server.start(); + + Thread.sleep(Integer.MAX_VALUE); + + server.stop(); + } + +} diff --git a/app-manage-api/src/test/java/com/enzhico/jwt/socket/server/ChatObject.java b/app-manage-api/src/test/java/com/enzhico/jwt/socket/server/ChatObject.java new file mode 100644 index 0000000..8c168eb --- /dev/null +++ b/app-manage-api/src/test/java/com/enzhico/jwt/socket/server/ChatObject.java @@ -0,0 +1,31 @@ +package com.enzhico.jwt.socket.server; + +public class ChatObject { + + private String userName; + private String message; + + public ChatObject() { + } + + public ChatObject(String userName, String message) { + super(); + this.userName = userName; + this.message = message; + } + + public String getUserName() { + return userName; + } + public void setUserName(String userName) { + this.userName = userName; + } + + public String getMessage() { + return message; + } + public void setMessage(String message) { + this.message = message; + } + +} diff --git a/app-manage-api/src/test/java/com/enzhico/jwt/socket/server/EventChatLauncher.java b/app-manage-api/src/test/java/com/enzhico/jwt/socket/server/EventChatLauncher.java new file mode 100644 index 0000000..065e87b --- /dev/null +++ b/app-manage-api/src/test/java/com/enzhico/jwt/socket/server/EventChatLauncher.java @@ -0,0 +1,32 @@ +package com.enzhico.jwt.socket.server; + +import com.corundumstudio.socketio.AckRequest; +import com.corundumstudio.socketio.Configuration; +import com.corundumstudio.socketio.SocketIOClient; +import com.corundumstudio.socketio.SocketIOServer; +import com.corundumstudio.socketio.listener.DataListener; + +public class EventChatLauncher { + + public static void main(String[] args) throws InterruptedException { + + Configuration config = new Configuration(); + config.setHostname("localhost"); + config.setPort(9092); + + final SocketIOServer server = new SocketIOServer(config); + server.addEventListener("chatevent", ChatObject.class, new DataListener() { + @Override + public void onData(SocketIOClient client, ChatObject data, AckRequest ackRequest) { + server.getBroadcastOperations().sendEvent("chatevent", data); + } + }); + + server.start(); + + Thread.sleep(Integer.MAX_VALUE); + + server.stop(); + } + +} diff --git a/app-manage-api/src/test/java/com/enzhico/jwt/socket/server/NamespaceChatLauncher.java b/app-manage-api/src/test/java/com/enzhico/jwt/socket/server/NamespaceChatLauncher.java new file mode 100644 index 0000000..908da73 --- /dev/null +++ b/app-manage-api/src/test/java/com/enzhico/jwt/socket/server/NamespaceChatLauncher.java @@ -0,0 +1,40 @@ +package com.enzhico.jwt.socket.server; + +import com.corundumstudio.socketio.listener.*; +import com.corundumstudio.socketio.*; + +public class NamespaceChatLauncher { + + public static void main(String[] args) throws InterruptedException { + + Configuration config = new Configuration(); + config.setHostname("localhost"); + config.setPort(9092); + + final SocketIOServer server = new SocketIOServer(config); + final SocketIONamespace chat1namespace = server.addNamespace("/chat1"); + chat1namespace.addEventListener("message", ChatObject.class, new DataListener() { + @Override + public void onData(SocketIOClient client, ChatObject data, AckRequest ackRequest) { + // broadcast messages to all clients + chat1namespace.getBroadcastOperations().sendEvent("message", data); + } + }); + + final SocketIONamespace chat2namespace = server.addNamespace("/chat2"); + chat2namespace.addEventListener("message", ChatObject.class, new DataListener() { + @Override + public void onData(SocketIOClient client, ChatObject data, AckRequest ackRequest) { + // broadcast messages to all clients + chat2namespace.getBroadcastOperations().sendEvent("message", data); + } + }); + + server.start(); + + Thread.sleep(Integer.MAX_VALUE); + + server.stop(); + } + +} diff --git a/app-manage-api/src/test/java/com/enzhico/jwt/socket/server/NamespaceSocketServer.java b/app-manage-api/src/test/java/com/enzhico/jwt/socket/server/NamespaceSocketServer.java new file mode 100644 index 0000000..f0291a4 --- /dev/null +++ b/app-manage-api/src/test/java/com/enzhico/jwt/socket/server/NamespaceSocketServer.java @@ -0,0 +1,131 @@ +package com.enzhico.jwt.socket.server; + + +import com.corundumstudio.socketio.*; +import com.corundumstudio.socketio.listener.ConnectListener; +import com.corundumstudio.socketio.listener.DataListener; +import com.enzhico.jwt.socket.model.LoginRequest; +import io.socket.engineio.client.Socket; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.List; + +public class NamespaceSocketServer { + private static final Logger logger = LoggerFactory.getLogger(NamespaceSocketServer.class); + + public static void main(String[] args) { + /* + * 创建Socket,并设置监听端口 + */ + Configuration config = new Configuration(); + //设置主机名 + config.setHostname("localhost"); + //设置监听端口 + config.setPort(9092); + // 协议升级超时时间(毫秒),默认10秒。HTTP握手升级为ws协议超时时间 + config.setUpgradeTimeout(10000); + // Ping消息超时时间(毫秒),默认60秒,这个时间间隔内没有接收到心跳消息就会发送超时事件 + config.setPingTimeout(180000); + // Ping消息间隔(毫秒),默认25秒。客户端向服务器发送一条心跳消息间隔 + config.setPingInterval(60000); + // 连接认证,这里使用token更合适 + config.setAuthorizationListener(new AuthorizationListener() { + @Override + public boolean isAuthorized(HandshakeData data) { + // 客户端使用 options.query = "username=test&password=test"; + // 可以使用如下代码获取用户密码信息,本文不做身份验证 + String username = data.getSingleUrlParam("username"); + String password = data.getSingleUrlParam("password"); + logger.info("认证信息:username=" + username + ",password=" + password); + // 如果认证不通过会返回一个Socket.EVENT_CONNECT_ERROR事件 + return true; + } + }); + + final SocketIOServer server = new SocketIOServer(config); + + /* + * 添加连接监听事件,监听是否与客户端连接到服务器 + */ + server.addConnectListener(new ConnectListener() { + @Override + public void onConnect(SocketIOClient client) { + // 判断是否有客户端连接 + if (client != null) { + logger.info("连接成功。clientId=" + client.getSessionId().toString()); + client.joinRoom(client.getHandshakeData().getSingleUrlParam("appid")); + } else { + logger.error("并没有人连接上。。。"); + } + } + }); + + /* + * 添加监听事件,监听客户端的事件 + * 1.第一个参数eventName需要与客户端的事件要一致 + * 2.第二个参数eventClase是传输的数据类型 + * 3.第三个参数listener是用于接收客户端传的数据,数据类型需要与eventClass一致 + */ + server.addEventListener("login", LoginRequest.class, new DataListener() { + @Override + public void onData(SocketIOClient client, LoginRequest data, AckRequest ackRequest) { + logger.info("接收到客户端login消息:code = " + data.getCode() + ",body = " + data.getBody()); + // check is ack requested by client, + // but it's not required check + if (ackRequest.isAckRequested()) { + // send ack response with data to client + ackRequest.sendAckData("已成功收到客户端登录请求", "yeah"); + } + // 向客户端发送消息 + List list = new ArrayList<>(); + list.add("登录成功,sessionId=" + client.getSessionId()); + // 第一个参数必须与eventName一致,第二个参数data必须与eventClass一致 + String room = client.getHandshakeData().getSingleUrlParam("appid"); + server.getRoomOperations(room).sendEvent("login", list.toString()); +// client.disconnect(); + } + }); + + //启动服务 + server.start(); + } + + private static void addNamespace(SocketIOServer server, String namespace) { + final SocketIONamespace chat1namespace = server.addNamespace(namespace); + chat1namespace.addEventListener(Socket.EVENT_MESSAGE, ChatObject.class, new DataListener() { + @Override + public void onData(SocketIOClient client, ChatObject data, AckRequest ackRequest) { + // broadcast messages to all clients + chat1namespace.getBroadcastOperations().sendEvent(Socket.EVENT_MESSAGE, data); + } + }); + /* + * 添加监听事件,监听客户端的事件 + * 1.第一个参数eventName需要与客户端的事件要一致 + * 2.第二个参数eventClase是传输的数据类型 + * 3.第三个参数listener是用于接收客户端传的数据,数据类型需要与eventClass一致 + */ + chat1namespace.addEventListener("login", LoginRequest.class, new DataListener() { + @Override + public void onData(SocketIOClient client, LoginRequest data, AckRequest ackRequest) { + logger.info("接收到客户端login消息:code = " + data.getCode() + ",body = " + data.getBody()); + // check is ack requested by client, + // but it's not required check + if (ackRequest.isAckRequested()) { + // send ack response with data to client + ackRequest.sendAckData("命名空间" + namespace + "已成功收到客户端登录请求", "yeah"); + } + // 向客户端发送消息 + List list = new ArrayList<>(); + list.add("登录成功"); + // 第一个参数必须与eventName一致,第二个参数data必须与eventClass一致 + chat1namespace.getBroadcastOperations().sendEvent("loginReply", list.toString()); +// client.disconnect(); + } + }); + + } + +} diff --git a/app-manage-api/src/test/java/com/enzhico/jwt/socket/server/SocketExceptionListener.java b/app-manage-api/src/test/java/com/enzhico/jwt/socket/server/SocketExceptionListener.java new file mode 100644 index 0000000..ef40453 --- /dev/null +++ b/app-manage-api/src/test/java/com/enzhico/jwt/socket/server/SocketExceptionListener.java @@ -0,0 +1,20 @@ +package com.enzhico.jwt.socket.server; + +import com.corundumstudio.socketio.listener.ExceptionListenerAdapter; +import io.netty.channel.ChannelHandlerContext; + +/** + * MyExceptionListener + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/30 + */ +public class SocketExceptionListener extends ExceptionListenerAdapter { + @Override + public boolean exceptionCaught(ChannelHandlerContext ctx, Throwable e) { + System.out.println(e.getMessage()); + ctx.close(); + return true; + } +} diff --git a/app-manage-api/src/test/java/com/enzhico/jwt/socket/server/SocketServer.java b/app-manage-api/src/test/java/com/enzhico/jwt/socket/server/SocketServer.java new file mode 100644 index 0000000..3bd3f7d --- /dev/null +++ b/app-manage-api/src/test/java/com/enzhico/jwt/socket/server/SocketServer.java @@ -0,0 +1,140 @@ +package com.enzhico.jwt.socket.server; + + +import com.corundumstudio.socketio.*; +import com.corundumstudio.socketio.listener.ConnectListener; +import com.corundumstudio.socketio.listener.DataListener; +import com.corundumstudio.socketio.listener.DisconnectListener; +import com.enzhico.jwt.socket.model.ChatMessage; +import com.enzhico.jwt.socket.model.LoginRequest; +import io.socket.engineio.client.Socket; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; +import java.util.List; + +public class SocketServer { + private static final Logger logger = LoggerFactory.getLogger(SocketServer.class); + + @Test + public void test() { + /* + * 创建Socket,并设置监听端口 + */ + Configuration config = new Configuration(); + //设置主机名 + config.setHostname("localhost"); + //设置监听端口 + config.setPort(9099); + // 协议升级超时时间(毫秒),默认10秒。HTTP握手升级为ws协议超时时间 + config.setUpgradeTimeout(10000); + // Ping消息超时时间(毫秒),默认60秒,这个时间间隔内没有接收到心跳消息就会发送超时事件 + config.setPingTimeout(15000); + // Ping消息间隔(毫秒),默认25秒。客户端向服务器发送一条心跳消息间隔 + config.setPingInterval(5000); + // 这个版本0.9.0不能处理好namespace和query参数的问题。所以为了做认证必须使用全局默认命名空间 + config.setAuthorizationListener(new AuthorizationListener() { + @Override + public boolean isAuthorized(HandshakeData data) { + // 客户端使用 options.query = "username=test&password=test"; + // 可以使用如下代码获取用户密码信息,本文不做身份验证 + String username = data.getSingleUrlParam("username"); + String password = data.getSingleUrlParam("password"); + logger.info("认证信息:username=" + username + ",password=" + password); + // 如果认证不通过会返回一个Socket.EVENT_CONNECT_ERROR事件 + return true; + } + }); + + config.setExceptionListener(new SocketExceptionListener()); + + final SocketIOServer server = new SocketIOServer(config); + + // 添加命名空间 + // addNamespace(server, "/ns"); + + /* + * 添加连接监听事件,监听是否与客户端连接到服务器 + */ + server.addConnectListener(new ConnectListener() { + @Override + public void onConnect(SocketIOClient client) { + // 判断是否有客户端连接 + if (client != null) { + logger.info("连接成功。clientId=" + client.getSessionId().toString()); + client.joinRoom("room1"); + } else { + logger.error("并没有人连接上。。。"); + } + } + }); + + server.addDisconnectListener(new DisconnectListener() { + @Override + public void onDisconnect(SocketIOClient client) { + System.out.println("服务器收到断线通知... sessionId=" + client.getSessionId()); + } + }); + + server.addEventListener(Socket.EVENT_MESSAGE, String.class, new DataListener() { + @Override + public void onData(SocketIOClient client, String data, AckRequest ackRequest) { + if (ackRequest.isAckRequested()) { + // send ack response with data to client + ackRequest.sendAckData("服务器回答Socket.EVENT_MESSAGE", "你狠"); + } + } + }); + + server.addEventListener("chatevent", ChatMessage.class, new DataListener() { + @Override + public void onData(SocketIOClient client, ChatMessage data, AckRequest ackRequest) { + System.out.println("服务器收到客户端的chatevent消息"); + System.out.println(data); + + client.sendEvent("chatevent", data); + } + }); + + /* + * 添加监听事件,监听客户端的事件 + * 1.第一个参数eventName需要与客户端的事件要一致 + * 2.第二个参数eventClase是传输的数据类型 + * 3.第三个参数listener是用于接收客户端传的数据,数据类型需要与eventClass一致 + */ + server.addEventListener("login", LoginRequest.class, new DataListener() { + @Override + public void onData(SocketIOClient client, LoginRequest data, AckRequest ackRequest) { + logger.info("接收到客户端login消息:code = " + data.getCode() + ",body = " + data.getBody()); + // check is ack requested by client, + // but it's not required check + if (ackRequest.isAckRequested()) { + // send ack response with data to client + ackRequest.sendAckData("服务器已成功收到客户端登录请求", "yeah"); + } + // 向客户端发送消息 + List list = new ArrayList<>(); + list.add("登录成功"); + // 第一个参数必须与eventName一致,第二个参数data必须与eventClass一致 + // 房间广播消息 + server.getRoomOperations("room1").sendEvent("loginReply", list.toString()); +// client.sendEvent("loginReply", list.toString()); +// client.disconnect(); + } + }); + + //启动服务 + server.start(); + + while (true) { + try { + Thread.sleep(200000000000L); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + } + +} diff --git a/app-manage-api/src/test/java/com/enzhico/jwt/socket/server/SslChatLauncher.java b/app-manage-api/src/test/java/com/enzhico/jwt/socket/server/SslChatLauncher.java new file mode 100644 index 0000000..9f474f8 --- /dev/null +++ b/app-manage-api/src/test/java/com/enzhico/jwt/socket/server/SslChatLauncher.java @@ -0,0 +1,38 @@ +package com.enzhico.jwt.socket.server; + +import java.io.InputStream; + +import com.corundumstudio.socketio.AckRequest; +import com.corundumstudio.socketio.Configuration; +import com.corundumstudio.socketio.SocketIOClient; +import com.corundumstudio.socketio.SocketIOServer; +import com.corundumstudio.socketio.listener.DataListener; + +public class SslChatLauncher { + + public static void main(String[] args) throws InterruptedException { + + Configuration config = new Configuration(); + config.setHostname("localhost"); + config.setPort(10443); + + config.setKeyStorePassword("test1234"); + InputStream stream = SslChatLauncher.class.getResourceAsStream("/keystore.jks"); + config.setKeyStore(stream); + + final SocketIOServer server = new SocketIOServer(config); + server.addEventListener("chatevent", ChatObject.class, new DataListener() { + @Override + public void onData(SocketIOClient client, ChatObject data, AckRequest ackRequest) { + server.getBroadcastOperations().sendEvent("chatevent", data); + } + }); + + server.start(); + + Thread.sleep(Integer.MAX_VALUE); + + server.stop(); + } + +} diff --git a/app-manage-api/src/test/resources/keystore.jks b/app-manage-api/src/test/resources/keystore.jks new file mode 100644 index 0000000..a714115 Binary files /dev/null and b/app-manage-api/src/test/resources/keystore.jks differ diff --git a/app-manage/.gitignore b/app-manage/.gitignore new file mode 100644 index 0000000..1e3c5bb --- /dev/null +++ b/app-manage/.gitignore @@ -0,0 +1,14 @@ +# 此为注释– 将被Git 忽略 +# /结尾表示是目录,忽略目录和目录下的所有件 +# /开头表示根目录,否则是.gitignore的相对目录 +# !开头表示反选 +.idea/ +target/ +*.iml +*.ipr +*.iws +*.log +.svn/ +.project +rebel.xml +.rebel-remote.xml.* diff --git a/app-manage/LICENSE b/app-manage/LICENSE new file mode 100644 index 0000000..83cd47d --- /dev/null +++ b/app-manage/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2018 Xiong Neng + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/app-manage/README.md b/app-manage/README.md new file mode 100644 index 0000000..9de2b73 --- /dev/null +++ b/app-manage/README.md @@ -0,0 +1,65 @@ +## POS机具管理 +对于行政收费、螺蛳湾收费项目、电力收费项目、烟草收费项目,以及将来任意一个收费项目, +统一对POS机机具进行管理。实现POS机收费APP的入网、自动更新、在线监控等。 + +* POS机具入网 +* 在线监控,故障报修 +* APP版本发布管理 +* 用户管理 + +## 技术选型 + +采用SpringBoot框架搭建,请参考 [官方文档指南](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/) + +* MVC - SpringMVC +* 页面模板 - 使用 Thymeleaf 3 +* 权限管理 - 使用Shiro做角色权限控制 +* DAO层 - 使用Mybatis-plus进行数据库访问 +* 缓存层 - 内存缓存使用Ehcache,分布式缓存使用Redis +* 监控 - 除了SpringBoot自带的监控外,还使用了Druid监控插件 + +## 上线发布流程 + +项目如果要发布到开发/测试/演示/生产环境,步骤如下: + +1. 修改对应环境配置文件`application.yml`后push到git服务器 +2. 运行脚本 `./run.sh start {profile}` + +## 高可用建议 + +建议三节点虚拟机部署或者docker容器集群,如果是自己内部使用可不需要高可用。 + +1. 反向代理高可用:2个nginx做标准的负载均衡策略 +1. web应用高可用:每个nginx => 2个应用实例 +1. 数据库高可用:keepalived+mysql双主高可用 + +## 代码生成 + +MyBatis DAO层相关代码生成方法: + +修改`src/main/resources/sql/generate_mapper.py`中的参数后运行即可 + +## 数据库初始化 + +执行SQL文件`src/main/resources/sql/schema.sql` + +## 加入依赖包 + +里面有个依赖是我本地依赖,需要你先手动安装,路径`src/main/resources/libs/AXMLPrinter-1.0.jar` + +本地安装maven包的命令: + +``` +mvn install:install-file -Dfile=AXMLPrinter-1.0.jar -DgroupId=com.enzhico -DartifactId=AXMLPrinter -Dversion=1.0 -Dpackaging=jar +``` + +## 测试账号 + +1. admin/123456 +2. test/12345678 + +## 许可证 + +Copyright (c) 2018 Xiong Neng + +基于 MIT 协议发布: diff --git a/app-manage/pom.xml b/app-manage/pom.xml new file mode 100644 index 0000000..3bac72b --- /dev/null +++ b/app-manage/pom.xml @@ -0,0 +1,196 @@ + + + 4.0.0 + + com.enzhico + app-manage + 1.0.0-SNAPSHOT + jar + + app-manage + POS机具管理 + + + org.springframework.boot + spring-boot-starter-parent + 1.5.9.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + 1.1.2 + 8.0.7-dmr + 2.1.8 + 1.0.5 + + 3.0.7.RELEASE + 2.2.2 + 4.1.19.Final + + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + org.springframework.boot + spring-boot-starter-jetty + + + org.apache.httpcomponents + httpclient + 4.3.6 + + + org.springframework.boot + spring-boot-starter-jdbc + + + mysql + mysql-connector-java + ${mysql-connector.version} + runtime + + + com.alibaba + druid + ${druid.version} + + + + com.baomidou + mybatis-plus + ${mybatis-plus.version} + + + com.baomidou + mybatisplus-spring-boot-starter + ${mybatisplus-spring-boot-starter.version} + + + + org.springframework.boot + spring-boot-starter-test + test + + + commons-io + commons-io + 2.5 + + + org.apache.commons + commons-lang3 + 3.7 + + + commons-codec + commons-codec + 1.11 + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.springframework.boot + spring-boot-starter-aop + + + + org.apache.shiro + shiro-spring + 1.4.0 + + + slf4j-api + org.slf4j + + + + + + org.apache.shiro + shiro-ehcache + 1.4.0 + + + slf4j-api + org.slf4j + + + + + + com.github.axet + kaptcha + 0.0.9 + + + + com.github.theborakompanioni + thymeleaf-extras-shiro + 2.0.0 + + + com.enzhico + AXMLPrinter + 1.0 + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.6.1 + + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.20 + + true + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + + + src/main/resources + + + src/main/java + + **/*.xml + + + + + + \ No newline at end of file diff --git a/app-manage/run.sh b/app-manage/run.sh new file mode 100644 index 0000000..955efb1 --- /dev/null +++ b/app-manage/run.sh @@ -0,0 +1,72 @@ +#!/bin/bash +# 项目自动更新脚本 +# 先clone相应的分支下来: +# git clone ssh://git@120.24.173.142:7999/xxx.git +# 远程调试启动: +# nohup java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -Xms512m -Xmx1024m -jar -Dspring.profiles.active=${profile} ${jarfile} >/dev/null 2>&1 & + +function start { + profile="$1" + echo "启动环境profile=${profile}" + jarfile=$(ls target/*.jar) + if [[ "$?" == "0" ]]; then + stop $profile $jarfile + fi + branch=$(git branch |awk '{print $2}') + git pull origin ${branch} + echo "更新完代码开始重新打包" + mvn clean && mvn clean && mvn package -DskipTests=true + if [[ "$?" != "0" ]]; then + echo "编译出错,退出!" + exit 1 + fi + echo "nohup java -Xms512m -Xmx1024m -jar -Dspring.profiles.active=${profile} ${jarfile} >/dev/null 2>&1 &" + nohup java -Xms512m -Xmx1024m -jar -Dspring.profiles.active=${profile} ${jarfile} >/dev/null 2>&1 & + echo "启动应用中,请查看日志文件..." +} + +function stop { + profile="$1" + jarfile="$2" + ps aux | grep "${jarfile}" | grep "spring.profiles.active=${profile}" | grep -v grep > /dev/null + if [[ "$?" == "0" ]]; then + echo "该应用还在跑,我先停了它" + pid=$(ps aux | grep "${jarfile}" | grep "spring.profiles.active=${profile}" | grep -v grep |awk '{print $2}') + if [[ "$pid" != "" ]]; then + kill -9 $pid + fi + echo "停止应用成功..." + fi +} + +if [[ "$1" == "start" ]]; then + if [[ "$#" < 2 ]]; then + echo "请输入正确参数:./epay.sh start {profile}" + exit 1 + fi + profile="$2" + if [[ "$profile" != "dev" && "$profile" != "test" && "$profile" != "show" && "$profile" != "production" ]]; then + echo "参数错误,请输入正确的profile参数,使用方法:" + echo "./epay.sh start {profile} ==> 启动应用,{profile}取值:dev|test|show|production" + exit 1 + fi + start "${profile}" +elif [[ "$1" == "stop" ]]; then + if [[ "$#" < 2 ]]; then + echo "请输入正确参数:./epay.sh stop {profile}" + exit 1 + fi + profile="$2" + if [[ "$profile" != "dev" && "$profile" != "test" && "$profile" != "show" && "$profile" != "production" ]]; then + echo "参数错误,请输入正确的profile参数,使用方法:" + echo "./epay.sh stop {profile} ==> 停止应用,{profile}取值:dev|test|show|production" + exit 1 + fi + jarfile=$(ls target/*.jar) + stop $profile $jarfile +else + echo "参数错误,使用方法:{}参数是必填的,[]参数可选" + echo "./epay.sh start {profile} ==> 启动应用,{profile}取值:dev|test|show|production" + echo "./epay.sh stop {profile} ==> 停止应用,{profile}取值:dev|test|show|production" + exit 1 +fi diff --git a/app-manage/src/main/java/com/enzhico/pos/Application.java b/app-manage/src/main/java/com/enzhico/pos/Application.java new file mode 100644 index 0000000..bb8c49d --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/Application.java @@ -0,0 +1,12 @@ +package com.enzhico.pos; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/async/AsyncException.java b/app-manage/src/main/java/com/enzhico/pos/async/AsyncException.java new file mode 100644 index 0000000..efd8d81 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/async/AsyncException.java @@ -0,0 +1,37 @@ +package com.enzhico.pos.async; + +/** + * 异步方法异常 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/25 + */ +public class AsyncException extends RuntimeException { + public AsyncException() { + super(); + } + + public AsyncException(String msg) { + super(msg); + } + + public AsyncException(int code, String msg) { + super(msg); + this.code = code; + } + + /** + * 错误代码 + */ + private int code; + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/async/AsyncExceptionHandler.java b/app-manage/src/main/java/com/enzhico/pos/async/AsyncExceptionHandler.java new file mode 100644 index 0000000..4a529a6 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/async/AsyncExceptionHandler.java @@ -0,0 +1,30 @@ +package com.enzhico.pos.async; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; + +import java.lang.reflect.Method; +import java.util.Arrays; + +/** + * AsyncExceptionHandler + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/25 + */ +public class AsyncExceptionHandler implements AsyncUncaughtExceptionHandler { + private static final Logger log = LoggerFactory.getLogger(AsyncExceptionHandler.class); + @Override + public void handleUncaughtException(Throwable ex, Method method, Object... params) { + log.error("Async method has uncaught exception, params:{}" + Arrays.toString(params)); + + if (ex instanceof AsyncException) { + AsyncException asyncException = (AsyncException) ex; + log.error("asyncException:" + asyncException.getMessage()); + } + + log.error("Exception :", ex); + } +} diff --git a/app-manage/src/main/java/com/enzhico/pos/async/AsyncTask.java b/app-manage/src/main/java/com/enzhico/pos/async/AsyncTask.java new file mode 100644 index 0000000..fb3fe47 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/async/AsyncTask.java @@ -0,0 +1,106 @@ +package com.enzhico.pos.async; + +import com.enzhico.pos.common.dao.entity.Pos; +import com.enzhico.pos.config.properties.MyProperties; +import com.enzhico.pos.dao.entity.ManagerInfo; +import com.enzhico.pos.http.HttpBaseResponse; +import com.enzhico.pos.http.LoginParam; +import com.enzhico.pos.http.UnbindParam; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.MediaType; +import org.springframework.http.RequestEntity; +import org.springframework.http.ResponseEntity; +import org.springframework.scheduling.annotation.Async; +import org.springframework.scheduling.annotation.AsyncResult; +import org.springframework.stereotype.Component; +import org.springframework.web.client.RestTemplate; + +import javax.annotation.Resource; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.concurrent.Future; + +/** + * AsyncDemo + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/25 + */ +@Component +public class AsyncTask { + private static final Logger logger = LoggerFactory.getLogger(AsyncTask.class); + + @Resource + private MyProperties p; + @Resource + private RestTemplate restTemplate; + + @Async + public void dealNoReturnTask() { + logger.info("返回值为void的异步调用开始" + Thread.currentThread().getName()); + try { + Thread.sleep(3000); + } catch (InterruptedException e) { + e.printStackTrace(); + } + logger.info("返回值为void的异步调用结束" + Thread.currentThread().getName()); + } + + @Async + public Future dealHaveReturnTask(int i) { + logger.info("asyncInvokeReturnFuture, parementer=" + i); + Future future; + try { + Thread.sleep(1000 * i); + future = new AsyncResult("success:" + i); + } catch (InterruptedException e) { + future = new AsyncResult("error"); + } + return future; + } + + /** + * 异步推送消息 + */ + @Async + public void pushUnbindMsg(ManagerInfo managerInfo, Pos pos, String location) { + logger.info("解绑成功后推送消息给对应的POS机"); + LoginParam loginParam = new LoginParam(); + loginParam.setUsername(managerInfo.getUsername()); + loginParam.setPassword(managerInfo.getPassword()); + HttpBaseResponse r = restTemplate.postForObject( + p.getPosapiUrlPrefix() + "/notifyLogin", loginParam, HttpBaseResponse.class); + if (r.isSuccess()) { + logger.info("推送消息登录认证成功"); + String token = (String) r.getData(); + UnbindParam unbindParam = new UnbindParam(); + unbindParam.setImei(pos.getImei()); + unbindParam.setLocation(location); + // 设置HTTP Header信息 + URI uri; + try { + uri = new URI(p.getPosapiUrlPrefix() + "/notify/unbind"); + } catch (URISyntaxException e) { + logger.error("URI构建失败", e); + throw new AsyncException("URI构建失败"); + } + RequestEntity requestEntity = RequestEntity + .post(uri) + .contentType(MediaType.APPLICATION_JSON) + .accept(MediaType.APPLICATION_JSON) + .header("Authorization", token) + .body(unbindParam); + ResponseEntity responseEntity = restTemplate.exchange(requestEntity, HttpBaseResponse.class); + HttpBaseResponse r2 = responseEntity.getBody(); + if (r2.isSuccess()) { + logger.info("推送消息解绑网点成功"); + } else { + logger.error("推送消息解绑网点失败,errmsg = " + r2.getMsg()); + } + } else { + logger.error("推送消息登录认证失败"); + } + } +} diff --git a/app-manage/src/main/java/com/enzhico/pos/common/constant/ConstantsList.java b/app-manage/src/main/java/com/enzhico/pos/common/constant/ConstantsList.java new file mode 100644 index 0000000..cb9d086 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/common/constant/ConstantsList.java @@ -0,0 +1,37 @@ +package com.enzhico.pos.common.constant; + +import java.util.ArrayList; +import java.util.List; + +/** + * 常量列表 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/01/07 + */ +public class ConstantsList { + // 应收款项列表 + public static final List INCOME_TYPE_LIST = new ArrayList(){{ + add("租金"); + add("市场管理费"); + add("物业管理费"); + add( "其他"); + }}; + + // 市场列表 + public static final List MARKET_LIST = new ArrayList(){{ + add("一期市场"); + add("二期市场"); + add("三期市场"); + }}; + + // 业态 + public static final List BUSINESS_LIST = new ArrayList() {{ + add("男装"); + add("女装"); + add("玩具"); + add("餐饮"); + add("家具"); + }}; +} diff --git a/app-manage/src/main/java/com/enzhico/pos/common/constant/DictMap.java b/app-manage/src/main/java/com/enzhico/pos/common/constant/DictMap.java new file mode 100644 index 0000000..a9d03f1 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/common/constant/DictMap.java @@ -0,0 +1,78 @@ +package com.enzhico.pos.common.constant; + +import java.util.HashMap; +import java.util.Map; +import java.util.TreeMap; + +/** + * 表常量字典 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/01/07 + */ +public class DictMap { + /** + * 后台管理用户表 - 状态(1:正常 2:禁用) + */ + public static final String KEY_USER_STATUS = "t_manager.status"; + /** + * POS机表 - 机具状态(1:正常 2:故障 3:维修中(返厂) 4:已禁用(丢失) 5:已停用(回收)) + */ + public static final String KEY_POS_POS_STATUS = "t_pos.pos_state"; + /** + * POS机监控表 - 在线状态(1:在线 2:离线) + */ + public static final String KEY_POS_MONITOR_STATUS = "t_pos_monitor.online_state"; + /** + * APP表 - 发布范围(1:全网发布 2:灰度发布) + */ + public static final String KEY_APP_PUBLISH_RANGE = "t_app.publish_range"; + + /** + * 内部用,ClassName + FieldName为key + */ + private static final Map> _imap = new HashMap<>(); + + static { + _imap.put(KEY_USER_STATUS, new TreeMap(){{ + put(1, "正常"); + put(2, "禁用"); + }}); + _imap.put(KEY_POS_POS_STATUS, new TreeMap(){{ + put(1, "正常"); + put(2, "故障"); + put(3, "维修中(返厂)"); + put(4, "已禁用(丢失)"); + put(5, "已停用(回收)"); + }}); + _imap.put(KEY_POS_MONITOR_STATUS, new TreeMap(){{ + put(1, "在线"); + put(2, "离线"); + }}); + _imap.put(KEY_APP_PUBLISH_RANGE, new TreeMap(){{ + put(1, "全网发布"); + put(2, "灰度发布"); + }}); + } + + /** + * 根据字典类型key获取某个字典Map + * @param type 常量类型 + * @return 字典Map + */ + public static TreeMap map(String type) { + return _imap.get(type); + } + + /** + * 根据字典类型和数字获取对应的字符串 + * @param type 字典类型 + * @param key 数字 + * @return 对应的字符串 + */ + public static String value(String type, Integer key) { + return key != null ? map(type).get(key) : null; + } + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/App.java b/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/App.java new file mode 100644 index 0000000..7872182 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/App.java @@ -0,0 +1,271 @@ +package com.enzhico.pos.common.dao.entity; + +import java.util.Date; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.activerecord.Model; +import java.io.Serializable; + +/** + * APP表 + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +@TableName(value = "t_app") +public class App extends Model { + +private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value="id", type= IdType.AUTO) + private Integer id; + /** + * 应用编号 + */ + private String applicationId; + /** + * 应用名称 + */ + private String name; + /** + * 版本号 + */ + private String version; + /** + * 版本说明 + */ + private String tips; + /** + * 归属项目ID + */ + private Integer projectId; + /** + * 发布时间 + */ + private Date publishtime; + /** + * 发布范围 1:全网发布 2:灰度发布 + */ + private Integer publishRange; + /** + * 操作者ID + */ + private Integer operatorId; + /** + * 创建时间 + */ + private Date createdTime; + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 获取 主键ID. + * + * @return 主键ID. + */ + public Integer getId() { + return id; + } + + /** + * 设置 主键ID. + * + * @param id 主键ID. + */ + public void setId(Integer id) { + this.id = id; + } + + /** + * 获取 应用编号. + * + * @return 应用编号. + */ + public String getApplicationId() { + return applicationId; + } + + /** + * 设置 应用编号. + * + * @param applicationId 应用编号. + */ + public void setApplicationId(String applicationId) { + this.applicationId = applicationId; + } + + /** + * 获取 应用名称. + * + * @return 应用名称. + */ + public String getName() { + return name; + } + + /** + * 设置 应用名称. + * + * @param name 应用名称. + */ + public void setName(String name) { + this.name = name; + } + + /** + * 获取 版本号. + * + * @return 版本号. + */ + public String getVersion() { + return version; + } + + /** + * 设置 版本号. + * + * @param version 版本号. + */ + public void setVersion(String version) { + this.version = version; + } + + /** + * 获取 版本说明. + * + * @return 版本说明. + */ + public String getTips() { + return tips; + } + + /** + * 设置 版本说明. + * + * @param tips 版本说明. + */ + public void setTips(String tips) { + this.tips = tips; + } + + /** + * 获取 归属项目ID. + * + * @return 归属项目ID. + */ + public Integer getProjectId() { + return projectId; + } + + /** + * 设置 归属项目ID. + * + * @param projectId 归属项目ID. + */ + public void setProjectId(Integer projectId) { + this.projectId = projectId; + } + + /** + * 获取 发布时间. + * + * @return 发布时间. + */ + public Date getPublishtime() { + return publishtime; + } + + /** + * 设置 发布时间. + * + * @param publishtime 发布时间. + */ + public void setPublishtime(Date publishtime) { + this.publishtime = publishtime; + } + + /** + * 获取 发布范围 1:全网发布 2:灰度发布. + * + * @return 发布范围 1:全网发布 2:灰度发布. + */ + public Integer getPublishRange() { + return publishRange; + } + + /** + * 设置 发布范围 1:全网发布 2:灰度发布. + * + * @param publishRange 发布范围 1:全网发布 2:灰度发布. + */ + public void setPublishRange(Integer publishRange) { + this.publishRange = publishRange; + } + + /** + * 获取 操作者ID. + * + * @return 操作者ID. + */ + public Integer getOperatorId() { + return operatorId; + } + + /** + * 设置 操作者ID. + * + * @param operatorId 操作者ID. + */ + public void setOperatorId(Integer operatorId) { + this.operatorId = operatorId; + } + + /** + * 获取 创建时间. + * + * @return 创建时间. + */ + public Date getCreatedTime() { + return createdTime; + } + + /** + * 设置 创建时间. + * + * @param createdTime 创建时间. + */ + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + /** + * 获取 更新时间. + * + * @return 更新时间. + */ + public Date getUpdatedTime() { + return updatedTime; + } + + /** + * 设置 更新时间. + * + * @param updatedTime 更新时间. + */ + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/AppPublish.java b/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/AppPublish.java new file mode 100644 index 0000000..ab7abf6 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/AppPublish.java @@ -0,0 +1,139 @@ +package com.enzhico.pos.common.dao.entity; + +import java.util.Date; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.activerecord.Model; +import java.io.Serializable; + +/** + * APP发布表 + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +@TableName(value = "t_app_publish") +public class AppPublish extends Model { + +private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value="id", type= IdType.AUTO) + private Integer id; + /** + * APP主键 + */ + private Integer appId; + /** + * POS主键 + */ + private Integer posId; + /** + * 创建时间 + */ + private Date createdTime; + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 获取 主键ID. + * + * @return 主键ID. + */ + public Integer getId() { + return id; + } + + /** + * 设置 主键ID. + * + * @param id 主键ID. + */ + public void setId(Integer id) { + this.id = id; + } + + /** + * 获取 APP主键. + * + * @return APP主键. + */ + public Integer getAppId() { + return appId; + } + + /** + * 设置 APP主键. + * + * @param appId APP主键. + */ + public void setAppId(Integer appId) { + this.appId = appId; + } + + /** + * 获取 POS主键. + * + * @return POS主键. + */ + public Integer getPosId() { + return posId; + } + + /** + * 设置 POS主键. + * + * @param posId POS主键. + */ + public void setPosId(Integer posId) { + this.posId = posId; + } + + /** + * 获取 创建时间. + * + * @return 创建时间. + */ + public Date getCreatedTime() { + return createdTime; + } + + /** + * 设置 创建时间. + * + * @param createdTime 创建时间. + */ + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + /** + * 获取 更新时间. + * + * @return 更新时间. + */ + public Date getUpdatedTime() { + return updatedTime; + } + + /** + * 设置 更新时间. + * + * @param updatedTime 更新时间. + */ + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/Manager.java b/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/Manager.java new file mode 100644 index 0000000..8fa939e --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/Manager.java @@ -0,0 +1,249 @@ +package com.enzhico.pos.common.dao.entity; + +import java.util.Date; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.activerecord.Model; +import java.io.Serializable; + +/** + * 后台管理用户表 + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +@TableName(value = "t_manager") +public class Manager extends Model { + +private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value="id", type= IdType.AUTO) + private Integer id; + /** + * 账号 + */ + private String username; + /** + * 名字 + */ + private String name; + /** + * 密码 + */ + private String password; + /** + * md5密码盐 + */ + private String salt; + /** + * 联系电话 + */ + private String phone; + /** + * 备注 + */ + private String tips; + /** + * 状态 1:正常 2:禁用 + */ + private Integer state; + /** + * 创建时间 + */ + private Date createdTime; + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 获取 主键ID. + * + * @return 主键ID. + */ + public Integer getId() { + return id; + } + + /** + * 设置 主键ID. + * + * @param id 主键ID. + */ + public void setId(Integer id) { + this.id = id; + } + + /** + * 获取 账号. + * + * @return 账号. + */ + public String getUsername() { + return username; + } + + /** + * 设置 账号. + * + * @param username 账号. + */ + public void setUsername(String username) { + this.username = username; + } + + /** + * 获取 名字. + * + * @return 名字. + */ + public String getName() { + return name; + } + + /** + * 设置 名字. + * + * @param name 名字. + */ + public void setName(String name) { + this.name = name; + } + + /** + * 获取 密码. + * + * @return 密码. + */ + public String getPassword() { + return password; + } + + /** + * 设置 密码. + * + * @param password 密码. + */ + public void setPassword(String password) { + this.password = password; + } + + /** + * 获取 md5密码盐. + * + * @return md5密码盐. + */ + public String getSalt() { + return salt; + } + + /** + * 设置 md5密码盐. + * + * @param salt md5密码盐. + */ + public void setSalt(String salt) { + this.salt = salt; + } + + /** + * 获取 联系电话. + * + * @return 联系电话. + */ + public String getPhone() { + return phone; + } + + /** + * 设置 联系电话. + * + * @param phone 联系电话. + */ + public void setPhone(String phone) { + this.phone = phone; + } + + /** + * 获取 备注. + * + * @return 备注. + */ + public String getTips() { + return tips; + } + + /** + * 设置 备注. + * + * @param tips 备注. + */ + public void setTips(String tips) { + this.tips = tips; + } + + /** + * 获取 状态 1:正常 2:禁用. + * + * @return 状态 1:正常 2:禁用. + */ + public Integer getState() { + return state; + } + + /** + * 设置 状态 1:正常 2:禁用. + * + * @param state 状态 1:正常 2:禁用. + */ + public void setState(Integer state) { + this.state = state; + } + + /** + * 获取 创建时间. + * + * @return 创建时间. + */ + public Date getCreatedTime() { + return createdTime; + } + + /** + * 设置 创建时间. + * + * @param createdTime 创建时间. + */ + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + /** + * 获取 更新时间. + * + * @return 更新时间. + */ + public Date getUpdatedTime() { + return updatedTime; + } + + /** + * 设置 更新时间. + * + * @param updatedTime 更新时间. + */ + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/ManagerRole.java b/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/ManagerRole.java new file mode 100644 index 0000000..05200ca --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/ManagerRole.java @@ -0,0 +1,139 @@ +package com.enzhico.pos.common.dao.entity; + +import java.util.Date; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.activerecord.Model; +import java.io.Serializable; + +/** + * 用户角色关联表 + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +@TableName(value = "t_manager_role") +public class ManagerRole extends Model { + +private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value="id", type= IdType.AUTO) + private Integer id; + /** + * 管理用户ID + */ + private Integer managerId; + /** + * 角色ID + */ + private Integer roleId; + /** + * 创建时间 + */ + private Date createdTime; + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 获取 主键ID. + * + * @return 主键ID. + */ + public Integer getId() { + return id; + } + + /** + * 设置 主键ID. + * + * @param id 主键ID. + */ + public void setId(Integer id) { + this.id = id; + } + + /** + * 获取 管理用户ID. + * + * @return 管理用户ID. + */ + public Integer getManagerId() { + return managerId; + } + + /** + * 设置 管理用户ID. + * + * @param managerId 管理用户ID. + */ + public void setManagerId(Integer managerId) { + this.managerId = managerId; + } + + /** + * 获取 角色ID. + * + * @return 角色ID. + */ + public Integer getRoleId() { + return roleId; + } + + /** + * 设置 角色ID. + * + * @param roleId 角色ID. + */ + public void setRoleId(Integer roleId) { + this.roleId = roleId; + } + + /** + * 获取 创建时间. + * + * @return 创建时间. + */ + public Date getCreatedTime() { + return createdTime; + } + + /** + * 设置 创建时间. + * + * @param createdTime 创建时间. + */ + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + /** + * 获取 更新时间. + * + * @return 更新时间. + */ + public Date getUpdatedTime() { + return updatedTime; + } + + /** + * 设置 更新时间. + * + * @param updatedTime 更新时间. + */ + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/OperationLog.java b/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/OperationLog.java new file mode 100644 index 0000000..935fdc8 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/OperationLog.java @@ -0,0 +1,205 @@ +package com.enzhico.pos.common.dao.entity; + +import java.util.Date; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.activerecord.Model; +import java.io.Serializable; + +/** + * 操作日志表 + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +@TableName(value = "t_operation_log") +public class OperationLog extends Model { + +private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value="id", type= IdType.AUTO) + private Integer id; + /** + * 操作者ID + */ + private Integer operatorId; + /** + * 操作对象ID + */ + private Integer targetId; + /** + * 操作对象名称 + */ + private String targetName; + /** + * 操作类型 + */ + private String operateType; + /** + * 备注 + */ + private String tips; + /** + * 创建时间 + */ + private Date createdTime; + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 获取 主键ID. + * + * @return 主键ID. + */ + public Integer getId() { + return id; + } + + /** + * 设置 主键ID. + * + * @param id 主键ID. + */ + public void setId(Integer id) { + this.id = id; + } + + /** + * 获取 操作者ID. + * + * @return 操作者ID. + */ + public Integer getOperatorId() { + return operatorId; + } + + /** + * 设置 操作者ID. + * + * @param operatorId 操作者ID. + */ + public void setOperatorId(Integer operatorId) { + this.operatorId = operatorId; + } + + /** + * 获取 操作对象ID. + * + * @return 操作对象ID. + */ + public Integer getTargetId() { + return targetId; + } + + /** + * 设置 操作对象ID. + * + * @param targetId 操作对象ID. + */ + public void setTargetId(Integer targetId) { + this.targetId = targetId; + } + + /** + * 获取 操作对象名称. + * + * @return 操作对象名称. + */ + public String getTargetName() { + return targetName; + } + + /** + * 设置 操作对象名称. + * + * @param targetName 操作对象名称. + */ + public void setTargetName(String targetName) { + this.targetName = targetName; + } + + /** + * 获取 操作类型. + * + * @return 操作类型. + */ + public String getOperateType() { + return operateType; + } + + /** + * 设置 操作类型. + * + * @param operateType 操作类型. + */ + public void setOperateType(String operateType) { + this.operateType = operateType; + } + + /** + * 获取 备注. + * + * @return 备注. + */ + public String getTips() { + return tips; + } + + /** + * 设置 备注. + * + * @param tips 备注. + */ + public void setTips(String tips) { + this.tips = tips; + } + + /** + * 获取 创建时间. + * + * @return 创建时间. + */ + public Date getCreatedTime() { + return createdTime; + } + + /** + * 设置 创建时间. + * + * @param createdTime 创建时间. + */ + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + /** + * 获取 更新时间. + * + * @return 更新时间. + */ + public Date getUpdatedTime() { + return updatedTime; + } + + /** + * 设置 更新时间. + * + * @param updatedTime 更新时间. + */ + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/Permission.java b/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/Permission.java new file mode 100644 index 0000000..fc1b979 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/Permission.java @@ -0,0 +1,139 @@ +package com.enzhico.pos.common.dao.entity; + +import java.util.Date; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.activerecord.Model; +import java.io.Serializable; + +/** + * 权限表 + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +@TableName(value = "t_permission") +public class Permission extends Model { + +private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value="id", type= IdType.AUTO) + private Integer id; + /** + * 权限名称 + */ + private String permission; + /** + * 权限说明 + */ + private String description; + /** + * 创建时间 + */ + private Date createdTime; + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 获取 主键ID. + * + * @return 主键ID. + */ + public Integer getId() { + return id; + } + + /** + * 设置 主键ID. + * + * @param id 主键ID. + */ + public void setId(Integer id) { + this.id = id; + } + + /** + * 获取 权限名称. + * + * @return 权限名称. + */ + public String getPermission() { + return permission; + } + + /** + * 设置 权限名称. + * + * @param permission 权限名称. + */ + public void setPermission(String permission) { + this.permission = permission; + } + + /** + * 获取 权限说明. + * + * @return 权限说明. + */ + public String getDescription() { + return description; + } + + /** + * 设置 权限说明. + * + * @param description 权限说明. + */ + public void setDescription(String description) { + this.description = description; + } + + /** + * 获取 创建时间. + * + * @return 创建时间. + */ + public Date getCreatedTime() { + return createdTime; + } + + /** + * 设置 创建时间. + * + * @param createdTime 创建时间. + */ + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + /** + * 获取 更新时间. + * + * @return 更新时间. + */ + public Date getUpdatedTime() { + return updatedTime; + } + + /** + * 设置 更新时间. + * + * @param updatedTime 更新时间. + */ + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/Pos.java b/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/Pos.java new file mode 100644 index 0000000..8812fb5 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/Pos.java @@ -0,0 +1,359 @@ +package com.enzhico.pos.common.dao.entity; + +import java.util.Date; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.activerecord.Model; +import java.io.Serializable; + +/** + * POS机表 + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +@TableName(value = "t_pos") +public class Pos extends Model { + +private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value="id", type= IdType.AUTO) + private Integer id; + /** + * 机具IMEI码 + */ + private String imei; + /** + * 序列号(SN) + */ + private String sn; + /** + * 机具型号 + */ + private String series; + /** + * Android版本 + */ + private String androidVersion; + /** + * 版本号 + */ + private String version; + /** + * 归属网点 + */ + private String location; + /** + * 归属项目ID + */ + private Integer projectId; + /** + * 入网时间 + */ + private Date jointime; + /** + * 绑定时间 + */ + private Date bindtime; + /** + * 产权方 + */ + private String owner; + /** + * 备注 + */ + private String tips; + /** + * 机具状态: 1:正常 2:故障 3:维修中(返厂) 4:已禁用(丢失) 5:已停用(回收) + */ + private Integer posState; + /** + * 创建时间 + */ + private Date createdTime; + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 获取 主键ID. + * + * @return 主键ID. + */ + public Integer getId() { + return id; + } + + /** + * 设置 主键ID. + * + * @param id 主键ID. + */ + public void setId(Integer id) { + this.id = id; + } + + /** + * 获取 机具IMEI码. + * + * @return 机具IMEI码. + */ + public String getImei() { + return imei; + } + + /** + * 设置 机具IMEI码. + * + * @param imei 机具IMEI码. + */ + public void setImei(String imei) { + this.imei = imei; + } + + /** + * 获取 序列号(SN). + * + * @return 序列号(SN). + */ + public String getSn() { + return sn; + } + + /** + * 设置 序列号(SN). + * + * @param sn 序列号(SN). + */ + public void setSn(String sn) { + this.sn = sn; + } + + /** + * 获取 机具型号. + * + * @return 机具型号. + */ + public String getSeries() { + return series; + } + + /** + * 设置 机具型号. + * + * @param series 机具型号. + */ + public void setSeries(String series) { + this.series = series; + } + + /** + * 获取 Android版本. + * + * @return Android版本. + */ + public String getAndroidVersion() { + return androidVersion; + } + + /** + * 设置 Android版本. + * + * @param androidVersion Android版本. + */ + public void setAndroidVersion(String androidVersion) { + this.androidVersion = androidVersion; + } + + /** + * 获取 版本号. + * + * @return 版本号. + */ + public String getVersion() { + return version; + } + + /** + * 设置 版本号. + * + * @param version 版本号. + */ + public void setVersion(String version) { + this.version = version; + } + + /** + * 获取 归属网点. + * + * @return 归属网点. + */ + public String getLocation() { + return location; + } + + /** + * 设置 归属网点. + * + * @param location 归属网点. + */ + public void setLocation(String location) { + this.location = location; + } + + /** + * 获取 归属项目ID. + * + * @return 归属项目ID. + */ + public Integer getProjectId() { + return projectId; + } + + /** + * 设置 归属项目ID. + * + * @param projectId 归属项目ID. + */ + public void setProjectId(Integer projectId) { + this.projectId = projectId; + } + + /** + * 获取 入网时间. + * + * @return 入网时间. + */ + public Date getJointime() { + return jointime; + } + + /** + * 设置 入网时间. + * + * @param jointime 入网时间. + */ + public void setJointime(Date jointime) { + this.jointime = jointime; + } + + /** + * 获取 绑定时间. + * + * @return 绑定时间. + */ + public Date getBindtime() { + return bindtime; + } + + /** + * 设置 绑定时间. + * + * @param bindtime 绑定时间. + */ + public void setBindtime(Date bindtime) { + this.bindtime = bindtime; + } + + /** + * 获取 产权方. + * + * @return 产权方. + */ + public String getOwner() { + return owner; + } + + /** + * 设置 产权方. + * + * @param owner 产权方. + */ + public void setOwner(String owner) { + this.owner = owner; + } + + /** + * 获取 备注. + * + * @return 备注. + */ + public String getTips() { + return tips; + } + + /** + * 设置 备注. + * + * @param tips 备注. + */ + public void setTips(String tips) { + this.tips = tips; + } + + /** + * 获取 机具状态: 1:正常 2:故障 3:维修中(返厂) 4:已禁用(丢失) 5:已停用(回收). + * + * @return 机具状态: 1:正常 2:故障 3:维修中(返厂) 4:已禁用(丢失) 5:已停用(回收). + */ + public Integer getPosState() { + return posState; + } + + /** + * 设置 机具状态: 1:正常 2:故障 3:维修中(返厂) 4:已禁用(丢失) 5:已停用(回收). + * + * @param posState 机具状态: 1:正常 2:故障 3:维修中(返厂) 4:已禁用(丢失) 5:已停用(回收). + */ + public void setPosState(Integer posState) { + this.posState = posState; + } + + /** + * 获取 创建时间. + * + * @return 创建时间. + */ + public Date getCreatedTime() { + return createdTime; + } + + /** + * 设置 创建时间. + * + * @param createdTime 创建时间. + */ + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + /** + * 获取 更新时间. + * + * @return 更新时间. + */ + public Date getUpdatedTime() { + return updatedTime; + } + + /** + * 设置 更新时间. + * + * @param updatedTime 更新时间. + */ + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/PosHistory.java b/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/PosHistory.java new file mode 100644 index 0000000..ec8c4d7 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/PosHistory.java @@ -0,0 +1,183 @@ +package com.enzhico.pos.common.dao.entity; + +import java.util.Date; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.activerecord.Model; +import java.io.Serializable; + +/** + * POS机历史归属表 + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +@TableName(value = "t_pos_history") +public class PosHistory extends Model { + +private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value="id", type= IdType.AUTO) + private Integer id; + /** + * POS机ID + */ + private Integer posId; + /** + * 归属网点 + */ + private String location; + /** + * 绑定时间 + */ + private Date bindtime; + /** + * 解绑时间 + */ + private Date unbindtime; + /** + * 创建时间 + */ + private Date createdTime; + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 获取 主键ID. + * + * @return 主键ID. + */ + public Integer getId() { + return id; + } + + /** + * 设置 主键ID. + * + * @param id 主键ID. + */ + public void setId(Integer id) { + this.id = id; + } + + /** + * 获取 POS机ID. + * + * @return POS机ID. + */ + public Integer getPosId() { + return posId; + } + + /** + * 设置 POS机ID. + * + * @param posId POS机ID. + */ + public void setPosId(Integer posId) { + this.posId = posId; + } + + /** + * 获取 归属网点. + * + * @return 归属网点. + */ + public String getLocation() { + return location; + } + + /** + * 设置 归属网点. + * + * @param location 归属网点. + */ + public void setLocation(String location) { + this.location = location; + } + + /** + * 获取 绑定时间. + * + * @return 绑定时间. + */ + public Date getBindtime() { + return bindtime; + } + + /** + * 设置 绑定时间. + * + * @param bindtime 绑定时间. + */ + public void setBindtime(Date bindtime) { + this.bindtime = bindtime; + } + + /** + * 获取 解绑时间. + * + * @return 解绑时间. + */ + public Date getUnbindtime() { + return unbindtime; + } + + /** + * 设置 解绑时间. + * + * @param unbindtime 解绑时间. + */ + public void setUnbindtime(Date unbindtime) { + this.unbindtime = unbindtime; + } + + /** + * 获取 创建时间. + * + * @return 创建时间. + */ + public Date getCreatedTime() { + return createdTime; + } + + /** + * 设置 创建时间. + * + * @param createdTime 创建时间. + */ + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + /** + * 获取 更新时间. + * + * @return 更新时间. + */ + public Date getUpdatedTime() { + return updatedTime; + } + + /** + * 设置 更新时间. + * + * @param updatedTime 更新时间. + */ + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/PosMonitor.java b/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/PosMonitor.java new file mode 100644 index 0000000..7fd9303 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/PosMonitor.java @@ -0,0 +1,205 @@ +package com.enzhico.pos.common.dao.entity; + +import java.util.Date; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.activerecord.Model; +import java.io.Serializable; + +/** + * POS机监控表 + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +@TableName(value = "t_pos_monitor") +public class PosMonitor extends Model { + +private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value="id", type= IdType.AUTO) + private Integer id; + /** + * POS机ID + */ + private Integer posId; + /** + * Socket会话ID + */ + private String sessionId; + /** + * 最近一次报告时间 + */ + private Date reportTime; + /** + * 最近一次报告地址 + */ + private String reportLocation; + /** + * 在线状态: 1:在线 2:离线 + */ + private Integer onlineState; + /** + * 创建时间 + */ + private Date createdTime; + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 获取 主键ID. + * + * @return 主键ID. + */ + public Integer getId() { + return id; + } + + /** + * 设置 主键ID. + * + * @param id 主键ID. + */ + public void setId(Integer id) { + this.id = id; + } + + /** + * 获取 POS机ID. + * + * @return POS机ID. + */ + public Integer getPosId() { + return posId; + } + + /** + * 设置 POS机ID. + * + * @param posId POS机ID. + */ + public void setPosId(Integer posId) { + this.posId = posId; + } + + /** + * 获取 Socket会话ID. + * + * @return Socket会话ID. + */ + public String getSessionId() { + return sessionId; + } + + /** + * 设置 Socket会话ID. + * + * @param sessionId Socket会话ID. + */ + public void setSessionId(String sessionId) { + this.sessionId = sessionId; + } + + /** + * 获取 最近一次报告时间. + * + * @return 最近一次报告时间. + */ + public Date getReportTime() { + return reportTime; + } + + /** + * 设置 最近一次报告时间. + * + * @param reportTime 最近一次报告时间. + */ + public void setReportTime(Date reportTime) { + this.reportTime = reportTime; + } + + /** + * 获取 最近一次报告地址. + * + * @return 最近一次报告地址. + */ + public String getReportLocation() { + return reportLocation; + } + + /** + * 设置 最近一次报告地址. + * + * @param reportLocation 最近一次报告地址. + */ + public void setReportLocation(String reportLocation) { + this.reportLocation = reportLocation; + } + + /** + * 获取 在线状态: 1:在线 2:离线. + * + * @return 在线状态: 1:在线 2:离线. + */ + public Integer getOnlineState() { + return onlineState; + } + + /** + * 设置 在线状态: 1:在线 2:离线. + * + * @param onlineState 在线状态: 1:在线 2:离线. + */ + public void setOnlineState(Integer onlineState) { + this.onlineState = onlineState; + } + + /** + * 获取 创建时间. + * + * @return 创建时间. + */ + public Date getCreatedTime() { + return createdTime; + } + + /** + * 设置 创建时间. + * + * @param createdTime 创建时间. + */ + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + /** + * 获取 更新时间. + * + * @return 更新时间. + */ + public Date getUpdatedTime() { + return updatedTime; + } + + /** + * 设置 更新时间. + * + * @param updatedTime 更新时间. + */ + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/Project.java b/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/Project.java new file mode 100644 index 0000000..838d764 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/Project.java @@ -0,0 +1,161 @@ +package com.enzhico.pos.common.dao.entity; + +import java.util.Date; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.activerecord.Model; +import java.io.Serializable; + +/** + * 项目表 + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +@TableName(value = "t_project") +public class Project extends Model { + +private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value="id", type= IdType.AUTO) + private Integer id; + /** + * 项目名称 + */ + private String name; + /** + * 应用编号 + */ + private String applicationId; + /** + * 项目图片 + */ + private String icon; + /** + * 创建时间 + */ + private Date createdTime; + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 获取 主键ID. + * + * @return 主键ID. + */ + public Integer getId() { + return id; + } + + /** + * 设置 主键ID. + * + * @param id 主键ID. + */ + public void setId(Integer id) { + this.id = id; + } + + /** + * 获取 项目名称. + * + * @return 项目名称. + */ + public String getName() { + return name; + } + + /** + * 设置 项目名称. + * + * @param name 项目名称. + */ + public void setName(String name) { + this.name = name; + } + + /** + * 获取 应用编号. + * + * @return 应用编号. + */ + public String getApplicationId() { + return applicationId; + } + + /** + * 设置 应用编号. + * + * @param applicationId 应用编号. + */ + public void setApplicationId(String applicationId) { + this.applicationId = applicationId; + } + + /** + * 获取 项目图片. + * + * @return 项目图片. + */ + public String getIcon() { + return icon; + } + + /** + * 设置 项目图片. + * + * @param icon 项目图片. + */ + public void setIcon(String icon) { + this.icon = icon; + } + + /** + * 获取 创建时间. + * + * @return 创建时间. + */ + public Date getCreatedTime() { + return createdTime; + } + + /** + * 设置 创建时间. + * + * @param createdTime 创建时间. + */ + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + /** + * 获取 更新时间. + * + * @return 更新时间. + */ + public Date getUpdatedTime() { + return updatedTime; + } + + /** + * 设置 更新时间. + * + * @param updatedTime 更新时间. + */ + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/ProjectUser.java b/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/ProjectUser.java new file mode 100644 index 0000000..5998cc8 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/ProjectUser.java @@ -0,0 +1,139 @@ +package com.enzhico.pos.common.dao.entity; + +import java.util.Date; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.activerecord.Model; +import java.io.Serializable; + +/** + * 项目用户关联表 + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +@TableName(value = "t_project_user") +public class ProjectUser extends Model { + +private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value="id", type= IdType.AUTO) + private Integer id; + /** + * 用户ID + */ + private Integer userId; + /** + * 项目ID + */ + private Integer projectId; + /** + * 创建时间 + */ + private Date createdTime; + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 获取 主键ID. + * + * @return 主键ID. + */ + public Integer getId() { + return id; + } + + /** + * 设置 主键ID. + * + * @param id 主键ID. + */ + public void setId(Integer id) { + this.id = id; + } + + /** + * 获取 用户ID. + * + * @return 用户ID. + */ + public Integer getUserId() { + return userId; + } + + /** + * 设置 用户ID. + * + * @param userId 用户ID. + */ + public void setUserId(Integer userId) { + this.userId = userId; + } + + /** + * 获取 项目ID. + * + * @return 项目ID. + */ + public Integer getProjectId() { + return projectId; + } + + /** + * 设置 项目ID. + * + * @param projectId 项目ID. + */ + public void setProjectId(Integer projectId) { + this.projectId = projectId; + } + + /** + * 获取 创建时间. + * + * @return 创建时间. + */ + public Date getCreatedTime() { + return createdTime; + } + + /** + * 设置 创建时间. + * + * @param createdTime 创建时间. + */ + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + /** + * 获取 更新时间. + * + * @return 更新时间. + */ + public Date getUpdatedTime() { + return updatedTime; + } + + /** + * 设置 更新时间. + * + * @param updatedTime 更新时间. + */ + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/Role.java b/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/Role.java new file mode 100644 index 0000000..3ed0470 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/Role.java @@ -0,0 +1,139 @@ +package com.enzhico.pos.common.dao.entity; + +import java.util.Date; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.activerecord.Model; +import java.io.Serializable; + +/** + * 角色表 + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +@TableName(value = "t_role") +public class Role extends Model { + +private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value="id", type= IdType.AUTO) + private Integer id; + /** + * 角色名称 + */ + private String role; + /** + * 角色说明 + */ + private String description; + /** + * 创建时间 + */ + private Date createdTime; + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 获取 主键ID. + * + * @return 主键ID. + */ + public Integer getId() { + return id; + } + + /** + * 设置 主键ID. + * + * @param id 主键ID. + */ + public void setId(Integer id) { + this.id = id; + } + + /** + * 获取 角色名称. + * + * @return 角色名称. + */ + public String getRole() { + return role; + } + + /** + * 设置 角色名称. + * + * @param role 角色名称. + */ + public void setRole(String role) { + this.role = role; + } + + /** + * 获取 角色说明. + * + * @return 角色说明. + */ + public String getDescription() { + return description; + } + + /** + * 设置 角色说明. + * + * @param description 角色说明. + */ + public void setDescription(String description) { + this.description = description; + } + + /** + * 获取 创建时间. + * + * @return 创建时间. + */ + public Date getCreatedTime() { + return createdTime; + } + + /** + * 设置 创建时间. + * + * @param createdTime 创建时间. + */ + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + /** + * 获取 更新时间. + * + * @return 更新时间. + */ + public Date getUpdatedTime() { + return updatedTime; + } + + /** + * 设置 更新时间. + * + * @param updatedTime 更新时间. + */ + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/RolePermission.java b/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/RolePermission.java new file mode 100644 index 0000000..4db99dd --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/common/dao/entity/RolePermission.java @@ -0,0 +1,139 @@ +package com.enzhico.pos.common.dao.entity; + +import java.util.Date; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.activerecord.Model; +import java.io.Serializable; + +/** + * 角色权限关联表 + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +@TableName(value = "t_role_permission") +public class RolePermission extends Model { + +private static final long serialVersionUID = 1L; + + /** + * 主键ID + */ + @TableId(value="id", type= IdType.AUTO) + private Integer id; + /** + * 角色ID + */ + private Integer roleId; + /** + * 权限ID + */ + private Integer permissionId; + /** + * 创建时间 + */ + private Date createdTime; + /** + * 更新时间 + */ + private Date updatedTime; + + /** + * 获取 主键ID. + * + * @return 主键ID. + */ + public Integer getId() { + return id; + } + + /** + * 设置 主键ID. + * + * @param id 主键ID. + */ + public void setId(Integer id) { + this.id = id; + } + + /** + * 获取 角色ID. + * + * @return 角色ID. + */ + public Integer getRoleId() { + return roleId; + } + + /** + * 设置 角色ID. + * + * @param roleId 角色ID. + */ + public void setRoleId(Integer roleId) { + this.roleId = roleId; + } + + /** + * 获取 权限ID. + * + * @return 权限ID. + */ + public Integer getPermissionId() { + return permissionId; + } + + /** + * 设置 权限ID. + * + * @param permissionId 权限ID. + */ + public void setPermissionId(Integer permissionId) { + this.permissionId = permissionId; + } + + /** + * 获取 创建时间. + * + * @return 创建时间. + */ + public Date getCreatedTime() { + return createdTime; + } + + /** + * 设置 创建时间. + * + * @param createdTime 创建时间. + */ + public void setCreatedTime(Date createdTime) { + this.createdTime = createdTime; + } + + /** + * 获取 更新时间. + * + * @return 更新时间. + */ + public Date getUpdatedTime() { + return updatedTime; + } + + /** + * 设置 更新时间. + * + * @param updatedTime 更新时间. + */ + public void setUpdatedTime(Date updatedTime) { + this.updatedTime = updatedTime; + } + + @Override + protected Serializable pkVal() { + return this.id; + } + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/AppMapper.java b/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/AppMapper.java new file mode 100644 index 0000000..f23f1ba --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/AppMapper.java @@ -0,0 +1,15 @@ +package com.enzhico.pos.common.dao.repository; + +import com.enzhico.pos.common.dao.entity.App; +import com.baomidou.mybatisplus.mapper.BaseMapper; + +/** + * APP表 Mapper + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +public interface AppMapper extends BaseMapper { + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/AppPublishMapper.java b/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/AppPublishMapper.java new file mode 100644 index 0000000..e927dd7 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/AppPublishMapper.java @@ -0,0 +1,15 @@ +package com.enzhico.pos.common.dao.repository; + +import com.enzhico.pos.common.dao.entity.AppPublish; +import com.baomidou.mybatisplus.mapper.BaseMapper; + +/** + * APP发布表 Mapper + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +public interface AppPublishMapper extends BaseMapper { + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/ManagerMapper.java b/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/ManagerMapper.java new file mode 100644 index 0000000..b9c0e16 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/ManagerMapper.java @@ -0,0 +1,15 @@ +package com.enzhico.pos.common.dao.repository; + +import com.enzhico.pos.common.dao.entity.Manager; +import com.baomidou.mybatisplus.mapper.BaseMapper; + +/** + * 后台管理用户表 Mapper + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +public interface ManagerMapper extends BaseMapper { + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/ManagerRoleMapper.java b/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/ManagerRoleMapper.java new file mode 100644 index 0000000..98e339e --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/ManagerRoleMapper.java @@ -0,0 +1,15 @@ +package com.enzhico.pos.common.dao.repository; + +import com.enzhico.pos.common.dao.entity.ManagerRole; +import com.baomidou.mybatisplus.mapper.BaseMapper; + +/** + * 用户角色关联表 Mapper + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +public interface ManagerRoleMapper extends BaseMapper { + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/OperationLogMapper.java b/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/OperationLogMapper.java new file mode 100644 index 0000000..fc02443 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/OperationLogMapper.java @@ -0,0 +1,15 @@ +package com.enzhico.pos.common.dao.repository; + +import com.enzhico.pos.common.dao.entity.OperationLog; +import com.baomidou.mybatisplus.mapper.BaseMapper; + +/** + * 操作日志表 Mapper + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +public interface OperationLogMapper extends BaseMapper { + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/PermissionMapper.java b/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/PermissionMapper.java new file mode 100644 index 0000000..ba81e31 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/PermissionMapper.java @@ -0,0 +1,15 @@ +package com.enzhico.pos.common.dao.repository; + +import com.enzhico.pos.common.dao.entity.Permission; +import com.baomidou.mybatisplus.mapper.BaseMapper; + +/** + * 权限表 Mapper + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +public interface PermissionMapper extends BaseMapper { + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/PosHistoryMapper.java b/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/PosHistoryMapper.java new file mode 100644 index 0000000..20994e8 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/PosHistoryMapper.java @@ -0,0 +1,15 @@ +package com.enzhico.pos.common.dao.repository; + +import com.enzhico.pos.common.dao.entity.PosHistory; +import com.baomidou.mybatisplus.mapper.BaseMapper; + +/** + * POS机历史归属表 Mapper + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +public interface PosHistoryMapper extends BaseMapper { + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/PosMapper.java b/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/PosMapper.java new file mode 100644 index 0000000..56f786a --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/PosMapper.java @@ -0,0 +1,15 @@ +package com.enzhico.pos.common.dao.repository; + +import com.enzhico.pos.common.dao.entity.Pos; +import com.baomidou.mybatisplus.mapper.BaseMapper; + +/** + * POS机表 Mapper + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +public interface PosMapper extends BaseMapper { + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/PosMonitorMapper.java b/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/PosMonitorMapper.java new file mode 100644 index 0000000..00429d8 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/PosMonitorMapper.java @@ -0,0 +1,15 @@ +package com.enzhico.pos.common.dao.repository; + +import com.enzhico.pos.common.dao.entity.PosMonitor; +import com.baomidou.mybatisplus.mapper.BaseMapper; + +/** + * POS机监控表 Mapper + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +public interface PosMonitorMapper extends BaseMapper { + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/ProjectMapper.java b/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/ProjectMapper.java new file mode 100644 index 0000000..fe7d157 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/ProjectMapper.java @@ -0,0 +1,15 @@ +package com.enzhico.pos.common.dao.repository; + +import com.enzhico.pos.common.dao.entity.Project; +import com.baomidou.mybatisplus.mapper.BaseMapper; + +/** + * 项目表 Mapper + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +public interface ProjectMapper extends BaseMapper { + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/ProjectUserMapper.java b/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/ProjectUserMapper.java new file mode 100644 index 0000000..e1e0578 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/ProjectUserMapper.java @@ -0,0 +1,15 @@ +package com.enzhico.pos.common.dao.repository; + +import com.enzhico.pos.common.dao.entity.ProjectUser; +import com.baomidou.mybatisplus.mapper.BaseMapper; + +/** + * 项目用户关联表 Mapper + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +public interface ProjectUserMapper extends BaseMapper { + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/RoleMapper.java b/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/RoleMapper.java new file mode 100644 index 0000000..9334e5f --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/RoleMapper.java @@ -0,0 +1,15 @@ +package com.enzhico.pos.common.dao.repository; + +import com.enzhico.pos.common.dao.entity.Role; +import com.baomidou.mybatisplus.mapper.BaseMapper; + +/** + * 角色表 Mapper + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +public interface RoleMapper extends BaseMapper { + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/RolePermissionMapper.java b/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/RolePermissionMapper.java new file mode 100644 index 0000000..6b25217 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/common/dao/repository/RolePermissionMapper.java @@ -0,0 +1,15 @@ +package com.enzhico.pos.common.dao.repository; + +import com.enzhico.pos.common.dao.entity.RolePermission; +import com.baomidou.mybatisplus.mapper.BaseMapper; + +/** + * 角色权限关联表 Mapper + * + * @author 熊能 + * @version 1.0 + * @since 2018/01/02 + */ +public interface RolePermissionMapper extends BaseMapper { + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/common/util/AnalysisApk.java b/app-manage/src/main/java/com/enzhico/pos/common/util/AnalysisApk.java new file mode 100644 index 0000000..8487def --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/common/util/AnalysisApk.java @@ -0,0 +1,146 @@ +package com.enzhico.pos.common.util; + +import android.content.res.AXmlResourceParser; +import android.util.TypedValue; +import org.xmlpull.v1.XmlPullParser; + +import java.io.File; +import java.io.IOException; +import java.io.InputStream; +import java.util.Enumeration; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; + + +public class AnalysisApk { + /** + * 解压 zip 文件(apk可以当成一个zip文件),注意不能解压 rar 文件哦,只能解压 zip 文件 解压 rar 文件 会出现 + * java.io.IOException: Negative seek offset 异常 create date:2009- 6- 9 + * author:Administrator + * + * @param apkUrl zip 文件,注意要是正宗的 zip 文件哦,不能是把 rar 的直接改为 zip 这样会出现 + * java.io.IOException: Negative seek offset 异常 + * @param logoUrl 图标生成的地址 + * @throws IOException + */ + public static String[] unZip(String apkUrl, String logoUrl) throws IOException { + // [0]:版本号;[1]包名 + String[] st = new String[3]; + byte b[] = new byte[1024]; + int length; + ZipFile zipFile; + zipFile = new ZipFile(new File(apkUrl)); + Enumeration enumeration = zipFile.entries(); + ZipEntry zipEntry = null; + while (enumeration.hasMoreElements()) { + zipEntry = (ZipEntry) enumeration.nextElement(); + if (zipEntry.isDirectory()) { + + } else { + if ("AndroidManifest.xml".equals(zipEntry.getName())) { + InputStream is = null; + AXmlResourceParser parser = null; + try { + parser = new AXmlResourceParser(); + is = zipFile.getInputStream(zipEntry); + parser.open(is); + while (true) { + int type = parser.next(); + if (type == XmlPullParser.END_DOCUMENT) { + break; + } + switch (type) { + case XmlPullParser.START_TAG: { + for (int i = 0; i != parser.getAttributeCount(); ++i) { + if ("versionName".equals(parser.getAttributeName(i))) { + st[0] = getAttributeValue(parser, i); + } else if ("versionCode".equals(parser.getAttributeName(i))) { + st[1] = getAttributeValue(parser, i); + } else if ("package".equals(parser.getAttributeName(i))) { + st[2] = getAttributeValue(parser, i); + } + } + } + } + } + + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (is != null) is.close(); + if (parser != null) parser.close(); + } + } + +// if ("res/drawable-ldpi/icon.png".equals(zipEntry.getName())) { +// OutputStream outputStream = new FileOutputStream(logoUrl); +// InputStream inputStream = zipFile.getInputStream(zipEntry); +// while ((length = inputStream.read(b)) > 0) +// outputStream.write(b, 0, length); +// } + } + } + + zipFile.close(); + return st; + } + + private static String getAttributeValue(AXmlResourceParser parser, int index) { + int type = parser.getAttributeValueType(index); + int data = parser.getAttributeValueData(index); + if (type == TypedValue.TYPE_STRING) { + return parser.getAttributeValue(index); + } + if (type == TypedValue.TYPE_ATTRIBUTE) { + return String.format("?%s%08X", getPackage(data), data); + } + if (type == TypedValue.TYPE_REFERENCE) { + return String.format("@%s%08X", getPackage(data), data); + } + if (type == TypedValue.TYPE_FLOAT) { + return String.valueOf(Float.intBitsToFloat(data)); + } + if (type == TypedValue.TYPE_INT_HEX) { + return String.format("0x%08X", data); + } + if (type == TypedValue.TYPE_INT_BOOLEAN) { + return data != 0 ? "true" : "false"; + } + if (type == TypedValue.TYPE_DIMENSION) { + return Float.toString(complexToFloat(data)) + DIMENSION_UNITS[data & TypedValue.COMPLEX_UNIT_MASK]; + } + if (type == TypedValue.TYPE_FRACTION) { + return Float.toString(complexToFloat(data)) + FRACTION_UNITS[data & TypedValue.COMPLEX_UNIT_MASK]; + } + if (type >= TypedValue.TYPE_FIRST_COLOR_INT && type <= TypedValue.TYPE_LAST_COLOR_INT) { + return String.format("#%08X", data); + } + if (type >= TypedValue.TYPE_FIRST_INT && type <= TypedValue.TYPE_LAST_INT) { + return String.valueOf(data); + } + return String.format("<0x%X, type 0x%02X>", data, type); + } + + private static String getPackage(int id) { + if (id >>> 24 == 1) { + return "android:"; + } + return ""; + } + + // ///////////////////////////////// ILLEGAL STUFF, DONT LOOK :) + public static float complexToFloat(int complex) { + return (float) (complex & 0xFFFFFF00) * RADIX_MULTS[(complex >> 4) & 3]; + } + + private static final float RADIX_MULTS[] = {0.00390625F, 3.051758E-005F, 1.192093E-007F, 4.656613E-010F}; + private static final String DIMENSION_UNITS[] = {"px", "dip", "sp", "pt", "in", "mm", "", ""}; + private static final String FRACTION_UNITS[] = {"%", "%p", "", "", "", "", "", ""}; + + + public static void main(String[] args) throws IOException { + String path = "C:/Users/alexshi/Downloads/tempDownload/app-release.apk"; + String[] messag = AnalysisApk.unZip(path, "C:/Users/alexshi/Downloads/uploadPrepared"); + System.out.println(messag[0] + "-------->" + messag[1]); + } +} diff --git a/app-manage/src/main/java/com/enzhico/pos/common/util/CommonUtil.java b/app-manage/src/main/java/com/enzhico/pos/common/util/CommonUtil.java new file mode 100644 index 0000000..68fe734 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/common/util/CommonUtil.java @@ -0,0 +1,40 @@ +package com.enzhico.pos.common.util; + +/** + * 常用工具类,字符串、数字相关 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/15 + */ +public class CommonUtil { + /** + * 检查某版本是否比现在版本更大些 + * @param version 某版本 + * @param nowVersion 现在使用的版本 + * @return 是否版本数更大 + */ + public static boolean isNewer(String version, String nowVersion) { + try { + String[] versions = version.split("\\."); + String[] nowVersions = nowVersion.split("\\."); + + if (versions.length != nowVersions.length) { + return false; + } + int sum = 0; + for (String v : versions) { + sum += sum * 10 + Integer.valueOf(v); + } + + int nowSum = 0; + for (String nv : nowVersions) { + nowSum += nowSum * 10 + Integer.valueOf(nv); + } + + return sum > nowSum; + } catch (NumberFormatException e) { + return false; + } + } +} diff --git a/app-manage/src/main/java/com/enzhico/pos/common/util/DateUtil.java b/app-manage/src/main/java/com/enzhico/pos/common/util/DateUtil.java new file mode 100644 index 0000000..6638886 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/common/util/DateUtil.java @@ -0,0 +1,294 @@ +/** + * Copyright (c) 2015-2016, Chill Zhuang 庄骞 (smallchill@163.com). + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * http://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.enzhico.pos.common.util; + +import java.sql.Timestamp; +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +public class DateUtil { + private final static SimpleDateFormat sdfYear = new SimpleDateFormat("yyyy"); + + private final static SimpleDateFormat sdfDay = new SimpleDateFormat("yyyy-MM-dd"); + + private final static SimpleDateFormat sdfDays = new SimpleDateFormat("yyyyMMdd"); + + private final static SimpleDateFormat sdfTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + private final static SimpleDateFormat sdfmsTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); + + private final static SimpleDateFormat allTime = new SimpleDateFormat("yyyyMMddHHmmss"); + + private final static SimpleDateFormat sdfDay_ = new SimpleDateFormat("yyyy/MM/dd"); + + + /** + * 获取YYYY格式 + * + * @return + */ + public static String getYear() { + return sdfYear.format(new Date()); + } + + /** + * 获取YYYY格式 + * + * @return + */ + public static String getYear(Date date) { + return sdfYear.format(date); + } + + /** + * 获取YYYY-MM-DD格式 + * + * @return + */ + public static String getDay() { + return sdfDay.format(new Date()); + } + + /** + * 获取YYYY-MM-DD格式 + * + * @return + */ + public static String getDay(Date date) { + return sdfDay.format(date); + } + + /** + * 获取YYYYMMDD格式 + * + * @return + */ + public static String getDays() { + return sdfDays.format(new Date()); + } + + /** + * 获取YYYYMMDD格式 + * + * @return + */ + public static String getDays(Date date) { + return sdfDays.format(date); + } + + /** + * 获取YYYY/MM/DD格式 + * + * @return + */ + public static String getDays_(Date date) { + return sdfDay_.format(date); + } + + /** + * 获取YYYY-MM-DD HH:mm:ss格式 + * + * @return + */ + public static String getTime() { + return sdfTime.format(new Date()); + } + + /** + * 获取YYYY-MM-DD HH:mm:ss.SSS格式 + * + * @return + */ + public static String getMsTime() { + return sdfmsTime.format(new Date()); + } + + /** + * 获取YYYYMMDDHHmmss格式 + * + * @return + */ + public static String getAllTime() { + return allTime.format(new Date()); + } + + /** + * 获取YYYY-MM-DD HH:mm:ss格式 + * + * @return + */ + public static String getTime(Date date) { + return sdfTime.format(date); + } + + /** + * @param s + * @param e + * @return boolean + * @throws + * @Title: compareDate + * @Description:(日期比较,如果s>=e 返回true 否则返回false) + * @author luguosui + */ + public static boolean compareDate(String s, String e) { + if (parseDate(s) == null || parseDate(e) == null) { + return false; + } + return parseDate(s).getTime() >= parseDate(e).getTime(); + } + + /** + * 格式化日期 + * + * @return + */ + public static Date parseDate(String date) { + try { + return sdfDay.parse(date); + } catch (ParseException e) { + e.printStackTrace(); + return null; + } + } + + /** + * 格式化日期 + * + * @return + */ + public static Date parseTime(String date) { + try { + return sdfTime.parse(date); + } catch (ParseException e) { + e.printStackTrace(); + return null; + } + } + + /** + * 格式化日期 + * + * @return + */ + public static Date parse(String date, String pattern) { + DateFormat fmt = new SimpleDateFormat(pattern); + try { + return fmt.parse(date); + } catch (ParseException e) { + e.printStackTrace(); + return null; + } + } + + /** + * 格式化日期 + * + * @return + */ + public static String format(Date date, String pattern) { + DateFormat fmt = new SimpleDateFormat(pattern); + return fmt.format(date); + } + + /** + * 把日期转换为Timestamp + * + * @param date + * @return + */ + public static Timestamp format(Date date) { + return new Timestamp(date.getTime()); + } + + /** + * 校验日期是否合法 + * + * @return + */ + public static boolean isValidDate(String s) { + try { + sdfTime.parse(s); + return true; + } catch (Exception e) { + // 如果throw java.text.ParseException或者NullPointerException,就说明格式不对 + return false; + } + } + + /** + * 校验日期是否合法 + * + * @return + */ + public static boolean isValidDate(String s, String pattern) { + DateFormat fmt = new SimpleDateFormat(pattern); + try { + fmt.parse(s); + return true; + } catch (Exception e) { + // 如果throw java.text.ParseException或者NullPointerException,就说明格式不对 + return false; + } + } + + /** + * 获取指定日期偏移指定时间后的时间 + * + * @param date 基准日期 + * @param calendarField 偏移的粒度大小(小时、天、月等)使用Calendar中的常数 + * @param offsite 偏移量,正数为向后偏移,负数为向前偏移 + * @return 偏移后的日期 + */ + public static Date offsiteDate(Date date, int calendarField, int offsite) { + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + cal.add(calendarField, offsite); + return cal.getTime(); + } + + /** + * 返回日期零时 + * @param date 目标日期 + * @return 目标日期零时 + */ + public static Date getDateStartTime(Date date) { + String str = format(date, "yyyyMMdd") + "000000"; + try { + return allTime.parse(str); + } catch (ParseException e) { + return null; + } + } + + + /** + * 返回日期最后时间End + * @param date 目标日期 + * @return 目标日日期最后时间 + */ + public static Date getDateEndTime(Date date) { + String str = format(date, "yyyyMMdd") + "235959"; + try { + return allTime.parse(str); + } catch (ParseException e) { + return null; + } + } + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/common/util/JsonConverter.java b/app-manage/src/main/java/com/enzhico/pos/common/util/JsonConverter.java new file mode 100644 index 0000000..1f86bed --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/common/util/JsonConverter.java @@ -0,0 +1,47 @@ +package com.enzhico.pos.common.util; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.json.JSONArray; +import org.json.JSONException; +import org.json.JSONObject; + +import java.io.IOException; + +/** + * 对象和Json转换器 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/18 + */ +public class JsonConverter { + public static JSONObject objectToJSONObject(Object object){ + try { + String jsonString = new ObjectMapper().writeValueAsString(object); + return new JSONObject(jsonString); + } catch (JSONException | JsonProcessingException e) { + e.printStackTrace(); + return null; + } + } + + public static JSONArray objectToJSONArray(Object object){ + try { + String jsonString = new ObjectMapper().writeValueAsString(object); + return new JSONArray(jsonString); + } catch (JSONException | JsonProcessingException e) { + e.printStackTrace(); + return null; + } + } + + public static T jsonObjectToObject(Object jsonObject, Class clazz) { + try { + // List listCar = objectMapper.readValue(jsonCarArray, new TypeReference>(){}); + return new ObjectMapper().readValue(jsonObject.toString(), clazz); + } catch (IOException e) { + return null; + } + } +} diff --git a/app-manage/src/main/java/com/enzhico/pos/config/AsyncConfig.java b/app-manage/src/main/java/com/enzhico/pos/config/AsyncConfig.java new file mode 100644 index 0000000..e5e7409 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/config/AsyncConfig.java @@ -0,0 +1,41 @@ +package com.enzhico.pos.config; + +import com.enzhico.pos.async.AsyncExceptionHandler; +import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; +import org.springframework.scheduling.annotation.AsyncConfigurer; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; + +import java.util.concurrent.Executor; + +/** + * AsyncConfig + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/25 + */ +@Configuration +@EnableAsync +public class AsyncConfig implements AsyncConfigurer { + + @Override + public Executor getAsyncExecutor() { + ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); + executor.setCorePoolSize(10); + executor.setMaxPoolSize(100); + executor.setQueueCapacity(100); + executor.setWaitForTasksToCompleteOnShutdown(true); + executor.setAwaitTerminationSeconds(60 * 10); + executor.setThreadNamePrefix("AsyncThread-"); + executor.initialize(); //如果不初始化,导致找到不到执行器 + return executor; + } + + @Override + public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { + return new AsyncExceptionHandler(); + } +} diff --git a/app-manage/src/main/java/com/enzhico/pos/config/MybatisPlusConfig.java b/app-manage/src/main/java/com/enzhico/pos/config/MybatisPlusConfig.java new file mode 100644 index 0000000..e7e3dad --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/config/MybatisPlusConfig.java @@ -0,0 +1,47 @@ +package com.enzhico.pos.config; + +import com.alibaba.druid.pool.DruidDataSource; +import com.baomidou.mybatisplus.plugins.PaginationInterceptor; +import com.enzhico.pos.config.properties.DruidProperties; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import javax.annotation.Resource; + +/** + * MybatisPlus配置 + * + * @author xiongneng + * @since 2017/5/20 21:58 + */ +@Configuration +@EnableTransactionManagement(order = 2) +@MapperScan(basePackages = { + "com.enzhico.pos.common.dao.repository", + "com.enzhico.pos.dao.repository"}) +public class MybatisPlusConfig { + + @Resource + private DruidProperties druidProperties; + + /** + * 单数据源连接池配置 + */ + @Bean + public DruidDataSource singleDatasource() { + DruidDataSource dataSource = new DruidDataSource(); + druidProperties.config(dataSource); + return dataSource; + } + + /** + * mybatis-plus分页插件 + */ + @Bean + public PaginationInterceptor paginationInterceptor() { + return new PaginationInterceptor(); + } +} diff --git a/app-manage/src/main/java/com/enzhico/pos/config/RestClientConfig.java b/app-manage/src/main/java/com/enzhico/pos/config/RestClientConfig.java new file mode 100644 index 0000000..6b11f8b --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/config/RestClientConfig.java @@ -0,0 +1,59 @@ +package com.enzhico.pos.config; + +import org.apache.http.client.HttpClient; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.config.Registry; +import org.apache.http.config.RegistryBuilder; +import org.apache.http.conn.socket.ConnectionSocketFactory; +import org.apache.http.conn.socket.PlainConnectionSocketFactory; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.impl.client.HttpClientBuilder; +import org.apache.http.impl.conn.PoolingHttpClientConnectionManager; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.ClientHttpRequestFactory; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; + +/** + * RestTemplate客户端连接池配置 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/24 + */ +@Configuration +public class RestClientConfig { + @Bean + public ClientHttpRequestFactory httpRequestFactory() { + return new HttpComponentsClientHttpRequestFactory(httpClient()); + } + + @Bean + public RestTemplate restTemplate(RestTemplateBuilder builder) { + return new RestTemplate(httpRequestFactory()); + } + + @Bean + public HttpClient httpClient() { + Registry registry = RegistryBuilder.create() + .register("http", PlainConnectionSocketFactory.getSocketFactory()) + .register("https", SSLConnectionSocketFactory.getSocketFactory()) + .build(); + PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager(registry); + connectionManager.setMaxTotal(5); + connectionManager.setDefaultMaxPerRoute(5); + + RequestConfig requestConfig = RequestConfig.custom() + .setSocketTimeout(8000) + .setConnectTimeout(8000) + .setConnectionRequestTimeout(8000) + .build(); + + return HttpClientBuilder.create() + .setDefaultRequestConfig(requestConfig) + .setConnectionManager(connectionManager) + .build(); + } +} diff --git a/app-manage/src/main/java/com/enzhico/pos/config/ScheduleConfig.java b/app-manage/src/main/java/com/enzhico/pos/config/ScheduleConfig.java new file mode 100644 index 0000000..163be3e --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/config/ScheduleConfig.java @@ -0,0 +1,31 @@ +package com.enzhico.pos.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.scheduling.annotation.SchedulingConfigurer; +import org.springframework.scheduling.config.ScheduledTaskRegistrar; + +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +/** + * ScheduleConfig + * + * @author XiongNeng + * @version 1.0 + * @since 2017/9/13 + */ +@Configuration +@EnableScheduling +public class ScheduleConfig implements SchedulingConfigurer { + @Override + public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { + taskRegistrar.setScheduler(taskExecutor()); + } + + @Bean(destroyMethod="shutdown") + public ExecutorService taskExecutor() { + return Executors.newScheduledThreadPool(5); + } +} diff --git a/app-manage/src/main/java/com/enzhico/pos/config/ShiroConfig.java b/app-manage/src/main/java/com/enzhico/pos/config/ShiroConfig.java new file mode 100644 index 0000000..3dda487 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/config/ShiroConfig.java @@ -0,0 +1,277 @@ +package com.enzhico.pos.config; + +import at.pollux.thymeleaf.shiro.dialect.ShiroDialect; +import com.google.code.kaptcha.Constants; +import com.google.code.kaptcha.servlet.KaptchaServlet; +import com.enzhico.pos.shiro.KaptchaFilter; +import com.enzhico.pos.shiro.MyExceptionResolver; +import com.enzhico.pos.shiro.MyShiroRealm; +import org.apache.shiro.authc.credential.HashedCredentialsMatcher; +import org.apache.shiro.cache.ehcache.EhCacheManager; +import org.apache.shiro.mgt.SecurityManager; +import org.apache.shiro.session.mgt.ExecutorServiceSessionValidationScheduler; +import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor; +import org.apache.shiro.spring.web.ShiroFilterFactoryBean; +import org.apache.shiro.web.mgt.CookieRememberMeManager; +import org.apache.shiro.web.mgt.DefaultWebSecurityManager; +import org.apache.shiro.web.servlet.SimpleCookie; +import org.apache.shiro.web.session.mgt.DefaultWebSessionManager; +import org.springframework.boot.web.servlet.ServletRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; + +import javax.servlet.Filter; +import java.util.LinkedHashMap; +import java.util.Map; + +/** + * Description : Apache Shiro 核心通过 Filter 来实现,就好像SpringMvc 通过DispachServlet 来主控制一样。 + * 既然是使用 Filter 一般也就能猜到,是通过URL规则来进行过滤和权限校验,所以我们需要定义一系列关于URL的规则和访问权限。 + */ + +@Configuration +@Order(1) +public class ShiroConfig { + + //配置kaptcha图片验证码框架提供的Servlet,,这是个坑,很多人忘记注册(注意) + @Bean + public ServletRegistrationBean kaptchaServlet() { + ServletRegistrationBean servlet = new ServletRegistrationBean(new KaptchaServlet(), "/kaptcha.jpg"); + servlet.addInitParameter(Constants.KAPTCHA_SESSION_CONFIG_KEY, Constants.KAPTCHA_SESSION_KEY);//session key + servlet.addInitParameter(Constants.KAPTCHA_TEXTPRODUCER_FONT_SIZE, "50");//字体大小 + servlet.addInitParameter(Constants.KAPTCHA_BORDER, "no"); + servlet.addInitParameter(Constants.KAPTCHA_BORDER_COLOR, "105,179,90"); + servlet.addInitParameter(Constants.KAPTCHA_TEXTPRODUCER_FONT_SIZE, "45"); + servlet.addInitParameter(Constants.KAPTCHA_TEXTPRODUCER_CHAR_LENGTH, "4"); + servlet.addInitParameter(Constants.KAPTCHA_TEXTPRODUCER_FONT_NAMES, "宋体,楷体,微软雅黑"); + servlet.addInitParameter(Constants.KAPTCHA_TEXTPRODUCER_FONT_COLOR, "blue"); + servlet.addInitParameter(Constants.KAPTCHA_IMAGE_WIDTH, "125"); + servlet.addInitParameter(Constants.KAPTCHA_IMAGE_HEIGHT, "60"); + //可以设置很多属性,具体看com.google.code.kaptcha.Constants +// kaptcha.border 是否有边框 默认为true 我们可以自己设置yes,no +// kaptcha.border.color 边框颜色 默认为Color.BLACK +// kaptcha.border.thickness 边框粗细度 默认为1 +// kaptcha.producer.impl 验证码生成器 默认为DefaultKaptcha +// kaptcha.textproducer.impl 验证码文本生成器 默认为DefaultTextCreator +// kaptcha.textproducer.char.string 验证码文本字符内容范围 默认为abcde2345678gfynmnpwx +// kaptcha.textproducer.char.length 验证码文本字符长度 默认为5 +// kaptcha.textproducer.font.names 验证码文本字体样式 默认为new Font("Arial", 1, fontSize), new Font("Courier", 1, fontSize) +// kaptcha.textproducer.font.size 验证码文本字符大小 默认为40 +// kaptcha.textproducer.font.color 验证码文本字符颜色 默认为Color.BLACK +// kaptcha.textproducer.char.space 验证码文本字符间距 默认为2 +// kaptcha.noise.impl 验证码噪点生成对象 默认为DefaultNoise +// kaptcha.noise.color 验证码噪点颜色 默认为Color.BLACK +// kaptcha.obscurificator.impl 验证码样式引擎 默认为WaterRipple +// kaptcha.word.impl 验证码文本字符渲染 默认为DefaultWordRenderer +// kaptcha.background.impl 验证码背景生成器 默认为DefaultBackground +// kaptcha.background.clear.from 验证码背景颜色渐进 默认为Color.LIGHT_GRAY +// kaptcha.background.clear.to 验证码背景颜色渐进 默认为Color.WHITE +// kaptcha.image.width 验证码图片宽度 默认为200 +// kaptcha.image.height 验证码图片高度 默认为50 + return servlet; + } + + //注入异常处理类 + @Bean + public MyExceptionResolver myExceptionResolver() { + return new MyExceptionResolver(); + } + + /** + * ShiroFilterFactoryBean 处理拦截资源文件问题。 + * 注意:单独一个ShiroFilterFactoryBean配置是或报错的,以为在 + * 初始化ShiroFilterFactoryBean的时候需要注入:SecurityManager Filter Chain定义说明 + * 1、一个URL可以配置多个Filter,使用逗号分隔 + * 2、当设置多个过滤器时,全部验证通过,才视为通过 + * 3、部分过滤器可指定参数,如perms,roles + */ + @Bean + public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) { + + ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean(); + // 必须设置 SecurityManager + shiroFilterFactoryBean.setSecurityManager(securityManager); + //验证码过滤器 + Map filtersMap = shiroFilterFactoryBean.getFilters(); + KaptchaFilter kaptchaFilter = new KaptchaFilter(); + filtersMap.put("kaptchaFilter", kaptchaFilter); + //实现自己规则roles,这是为了实现or的效果 + //RoleFilter roleFilter = new RoleFilter(); + //filtersMap.put("roles", roleFilter); + shiroFilterFactoryBean.setFilters(filtersMap); + // 拦截器 + //rest:比如/admins/user/**=rest[user],根据请求的方法,相当于/admins/user/**=perms[user:method] ,其中method为post,get,delete等。 + //port:比如/admins/user/**=port[8081],当请求的url的端口不是8081是跳转到schemal://serverName:8081?queryString,其中schmal是协议http或https等,serverName是你访问的host,8081是url配置里port的端口,queryString是你访问的url里的?后面的参数。 + //perms:比如/admins/user/**=perms[user:add:*],perms参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,比如/admins/user/**=perms["user:add:*,user:modify:*"],当有多个参数时必须每个参数都通过才通过,想当于isPermitedAll()方法。 + //roles:比如/admins/user/**=roles[admin],参数可以写多个,多个时必须加上引号,并且参数之间用逗号分割,当有多个参数时,比如/admins/user/**=roles["admin,guest"],每个参数通过才算通过,相当于hasAllRoles()方法。//要实现or的效果看http://zgzty.blog.163.com/blog/static/83831226201302983358670/ + //anon:比如/admins/**=anon 没有参数,表示可以匿名使用。 + //authc:比如/admins/user/**=authc表示需要认证才能使用,没有参数 + //authcBasic:比如/admins/user/**=authcBasic没有参数表示httpBasic认证 + //ssl:比如/admins/user/**=ssl没有参数,表示安全的url请求,协议为https + //user:比如/admins/user/**=user没有参数表示必须存在用户,当登入操作时不做检查 + Map filterChainDefinitionMap = new LinkedHashMap(); + // 配置退出过滤器,其中的具体的退出代码Shiro已经替我们实现了 + filterChainDefinitionMap.put("/logout", "logout"); + //配置记住我或认证通过可以访问的地址 + filterChainDefinitionMap.put("/index", "user"); + filterChainDefinitionMap.put("/", "user"); + filterChainDefinitionMap.put("/login", "kaptchaFilter"); + // :这是一个坑呢,一不小心代码就不好使了; + //这段是配合 actuator框架使用的,配置相应的角色才能访问 + // filterChainDefinitionMap.put("/health", "roles[aix]");//服务器健康状况页面 + // filterChainDefinitionMap.put("/info", "roles[aix]");//服务器信息页面 + // filterChainDefinitionMap.put("/env", "roles[aix]");//应用程序的环境变量 + // filterChainDefinitionMap.put("/metrics", "roles[aix]"); + // filterChainDefinitionMap.put("/configprops", "roles[aix]"); + //开放的静态资源 + filterChainDefinitionMap.put("/favicon.ico", "anon");//网站图标 + filterChainDefinitionMap.put("/static/**", "anon");//配置static文件下资源能被访问的,这是个例子 + filterChainDefinitionMap.put("/kaptcha.jpg", "anon");//图片验证码(kaptcha框架) + + filterChainDefinitionMap.put("/api/v1/**", "anon");//API接口 + + // swagger接口文档 + filterChainDefinitionMap.put("/v2/api-docs", "anon"); + filterChainDefinitionMap.put("/webjars/**", "anon"); + filterChainDefinitionMap.put("/swagger-resources/**", "anon"); + filterChainDefinitionMap.put("/swagger-ui.html", "anon"); + filterChainDefinitionMap.put("/doc.html", "anon"); + + // 其他的 + filterChainDefinitionMap.put("/**", "authc"); + + // 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面 + shiroFilterFactoryBean.setLoginUrl("/login"); + // 登录成功后要跳转的链接 + shiroFilterFactoryBean.setSuccessUrl("/index"); + // 未授权界面,不生效(详情原因看MyExceptionResolver) + shiroFilterFactoryBean.setUnauthorizedUrl("/errorView/403_error.html"); + shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); + return shiroFilterFactoryBean; + } + + @Bean + public SecurityManager securityManager() { + DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager(); + // 设置realm. + securityManager.setRealm(myShiroRealm()); + //注入缓存管理器 + securityManager.setCacheManager(ehCacheManager());//这个如果执行多次,也是同样的一个对象; + //注入记住我管理器; + securityManager.setRememberMeManager(rememberMeManager()); + return securityManager; + } + + /** + * 身份认证realm; (这个需要自己写,账号密码校验;权限等) + */ + @Bean + public MyShiroRealm myShiroRealm() { + MyShiroRealm myShiroRealm = new MyShiroRealm(); + myShiroRealm.setCredentialsMatcher(hashedCredentialsMatcher()); + return myShiroRealm; + } + + /** + * 凭证匹配器 (由于我们的密码校验交给Shiro的SimpleAuthenticationInfo进行处理了 + * 所以我们需要修改下doGetAuthenticationInfo中的代码; @return + */ + @Bean + public HashedCredentialsMatcher hashedCredentialsMatcher() { + HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher(); + hashedCredentialsMatcher.setHashAlgorithmName("md5");// 散列算法:这里使用MD5算法; + hashedCredentialsMatcher.setHashIterations(2);// 散列的次数,比如散列两次,相当于md5(md5("")); + hashedCredentialsMatcher.setStoredCredentialsHexEncoded(true);//表示是否存储散列后的密码为16进制,需要和生成密码时的一样,默认是base64; + return hashedCredentialsMatcher; + } + + /** + * 开启shiro aop注解支持. 使用代理方式; 所以需要开启代码支持; + * + * @param securityManager + * @return + */ + @Bean + public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) { + AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor(); + authorizationAttributeSourceAdvisor.setSecurityManager(securityManager); + return authorizationAttributeSourceAdvisor; + } + + /** + * shiro缓存管理器; + * 需要注入对应的其它的实体类中: + * 1、安全管理器:securityManager + * 可见securityManager是整个shiro的核心; + * + * @return + */ + @Bean + public EhCacheManager ehCacheManager() { + EhCacheManager cacheManager = new EhCacheManager(); + cacheManager.setCacheManagerConfigFile("classpath:ehcache.xml"); + return cacheManager; + } + + /** + * cookie对象; + * + * @return + */ + @Bean + public SimpleCookie rememberMeCookie() { + //System.out.println("ShiroConfiguration.rememberMeCookie()"); + //这个参数是cookie的名称,对应前端的checkbox的name = rememberMe + SimpleCookie simpleCookie = new SimpleCookie("rememberMe"); + // + simpleCookie.setMaxAge(259200); + return simpleCookie; + } + + /** + * cookie管理对象; + * + * @return + */ + @Bean + public CookieRememberMeManager rememberMeManager() { + //System.out.println("ShiroConfiguration.rememberMeManager()"); + CookieRememberMeManager cookieRememberMeManager = new CookieRememberMeManager(); + cookieRememberMeManager.setCookie(rememberMeCookie()); + return cookieRememberMeManager; + } + + @Bean(name = "sessionManager") + public DefaultWebSessionManager defaultWebSessionManager() { + DefaultWebSessionManager sessionManager = new DefaultWebSessionManager(); + sessionManager.setGlobalSessionTimeout(18000000); + // url中是否显示session Id + sessionManager.setSessionIdUrlRewritingEnabled(false); + // 删除失效的session + sessionManager.setDeleteInvalidSessions(true); + sessionManager.setSessionValidationSchedulerEnabled(true); + sessionManager.setSessionValidationInterval(18000000); + sessionManager.setSessionValidationScheduler(getExecutorServiceSessionValidationScheduler()); + //设置SessionIdCookie 导致认证不成功,不从新设置新的cookie,从sessionManager获取sessionIdCookie + //sessionManager.setSessionIdCookie(simpleIdCookie()); + sessionManager.getSessionIdCookie().setName("session-z-id"); + sessionManager.getSessionIdCookie().setPath("/"); + sessionManager.getSessionIdCookie().setMaxAge(60 * 60 * 24 * 7); + return sessionManager; + } + + @Bean(name = "sessionValidationScheduler") + public ExecutorServiceSessionValidationScheduler getExecutorServiceSessionValidationScheduler() { + ExecutorServiceSessionValidationScheduler scheduler = new ExecutorServiceSessionValidationScheduler(); + scheduler.setInterval(900000); + return scheduler; + } + + @Bean(name = "shiroDialect") + public ShiroDialect shiroDialect() { + return new ShiroDialect(); + } + + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/config/WebConfig.java b/app-manage/src/main/java/com/enzhico/pos/config/WebConfig.java new file mode 100644 index 0000000..dc1ccbd --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/config/WebConfig.java @@ -0,0 +1,102 @@ +package com.enzhico.pos.config; + +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.support.http.StatViewServlet; +import com.alibaba.druid.support.http.WebStatFilter; +import com.alibaba.druid.support.spring.stat.BeanTypeAutoProxyCreator; +import com.alibaba.druid.support.spring.stat.DruidStatInterceptor; +import org.springframework.aop.Advisor; +import org.springframework.aop.support.DefaultPointcutAdvisor; +import org.springframework.aop.support.JdkRegexpMethodPointcut; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.boot.web.servlet.ServletListenerRegistrationBean; +import org.springframework.boot.web.servlet.ServletRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.context.request.RequestContextListener; + +/** + * web 配置类 + * + * @author xiongneng + * @since 2016年11月12日 下午5:03:32 + */ +@Configuration +public class WebConfig { + + /** + * druidServlet注册 + */ + @Bean + public ServletRegistrationBean druidServletRegistration() { + ServletRegistrationBean registration = new ServletRegistrationBean(new StatViewServlet()); + registration.addUrlMappings("/druid/*"); + return registration; + } + + /** + * druid监控 配置URI拦截策略 + * + * @return + */ + @Bean + public FilterRegistrationBean druidStatFilter() { + FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter()); + //添加过滤规则. + filterRegistrationBean.addUrlPatterns("/*"); + //添加不需要忽略的格式信息. + filterRegistrationBean.addInitParameter( + "exclusions", "/static/*,*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid,/druid/*"); + //用于session监控页面的用户名显示 需要登录后主动将username注入到session里 + filterRegistrationBean.addInitParameter("principalSessionName", "username"); + return filterRegistrationBean; + } + + /** + * druid数据库连接池监控 + */ + @Bean + public DruidStatInterceptor druidStatInterceptor() { + return new DruidStatInterceptor(); + } + + + @Bean + public JdkRegexpMethodPointcut druidStatPointcut() { + JdkRegexpMethodPointcut druidStatPointcut = new JdkRegexpMethodPointcut(); + String patterns = "com.enzhico.pos.shiro.*.service.*"; + //可以set多个 + druidStatPointcut.setPatterns(patterns); + return druidStatPointcut; + } + + /** + * druid数据库连接池监控 + */ + @Bean + public BeanTypeAutoProxyCreator beanTypeAutoProxyCreator() { + BeanTypeAutoProxyCreator beanTypeAutoProxyCreator = new BeanTypeAutoProxyCreator(); + beanTypeAutoProxyCreator.setTargetBeanType(DruidDataSource.class); + beanTypeAutoProxyCreator.setInterceptorNames("druidStatInterceptor"); + return beanTypeAutoProxyCreator; + } + + /** + * druid 为druidStatPointcut添加拦截 + * + * @return + */ + @Bean + public Advisor druidStatAdvisor() { + return new DefaultPointcutAdvisor(druidStatPointcut(), druidStatInterceptor()); + } + + /** + * RequestContextListener注册 + */ + @Bean + public ServletListenerRegistrationBean requestContextListenerRegistration() { + return new ServletListenerRegistrationBean<>(new RequestContextListener()); + } + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/config/properties/DruidProperties.java b/app-manage/src/main/java/com/enzhico/pos/config/properties/DruidProperties.java new file mode 100644 index 0000000..fa5a34a --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/config/properties/DruidProperties.java @@ -0,0 +1,249 @@ +package com.enzhico.pos.config.properties; + +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.util.JdbcConstants; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.sql.SQLException; + +/** + *

    数据库数据源配置

    + *

    说明:这个类中包含了许多默认配置,若这些配置符合您的情况,您可以不用管,若不符合,建议不要修改本类,建议直接在"application.yml"中配置即可

    + * + * @author xiongneng + * @since 2017-05-21 11:18 + */ +@Component +@ConfigurationProperties(prefix = "spring.datasource") +public class DruidProperties { + + private String url; + + private String username; + + private String password; + + private String driverClassName = "com.mysql.cj.jdbc.Driver"; + + private Integer initialSize = 10; + + private Integer minIdle = 3; + + private Integer maxActive = 60; + + private Integer maxWait = 60000; + + private Boolean removeAbandoned = true; + + private Integer removeAbandonedTimeout = 180; + + private Integer timeBetweenEvictionRunsMillis = 60000; + + private Integer minEvictableIdleTimeMillis = 300000; + + private String validationQuery = "SELECT 'x'"; + + private Boolean testWhileIdle = true; + + private Boolean testOnBorrow = false; + + private Boolean testOnReturn = false; + + private Boolean poolPreparedStatements = true; + + private Integer maxPoolPreparedStatementPerConnectionSize = 50; + + private String filters = "stat"; + + public void config(DruidDataSource dataSource) { + dataSource.setDbType(JdbcConstants.MYSQL); + dataSource.setUrl(url); + dataSource.setUsername(username); + dataSource.setPassword(password); + dataSource.setDriverClassName(driverClassName); + dataSource.setInitialSize(initialSize); // 定义初始连接数 + dataSource.setMinIdle(minIdle); // 最小空闲 + dataSource.setMaxActive(maxActive); // 定义最大连接数 + dataSource.setMaxWait(maxWait); // 获取连接等待超时的时间 + dataSource.setRemoveAbandoned(removeAbandoned); // 超过时间限制是否回收 + dataSource.setRemoveAbandonedTimeout(removeAbandonedTimeout); // 超过时间限制多长 + + // 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + dataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); + // 配置一个连接在池中最小生存的时间,单位是毫秒 + dataSource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); + // 用来检测连接是否有效的sql,要求是一个查询语句 + dataSource.setValidationQuery(validationQuery); + // 申请连接的时候检测 + dataSource.setTestWhileIdle(testWhileIdle); + // 申请连接时执行validationQuery检测连接是否有效,配置为true会降低性能 + dataSource.setTestOnBorrow(testOnBorrow); + // 归还连接时执行validationQuery检测连接是否有效,配置为true会降低性能 + dataSource.setTestOnReturn(testOnReturn); + // 打开PSCache,并且指定每个连接上PSCache的大小 + dataSource.setPoolPreparedStatements(poolPreparedStatements); + dataSource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize); + // 属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有: + // 监控统计用的filter:stat + // 日志用的filter:log4j + // 防御SQL注入的filter:wall + try { + dataSource.setFilters(filters); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getDriverClassName() { + return driverClassName; + } + + public void setDriverClassName(String driverClassName) { + this.driverClassName = driverClassName; + } + + public Integer getInitialSize() { + return initialSize; + } + + public void setInitialSize(Integer initialSize) { + this.initialSize = initialSize; + } + + public Integer getMinIdle() { + return minIdle; + } + + public void setMinIdle(Integer minIdle) { + this.minIdle = minIdle; + } + + public Integer getMaxActive() { + return maxActive; + } + + public void setMaxActive(Integer maxActive) { + this.maxActive = maxActive; + } + + public Integer getMaxWait() { + return maxWait; + } + + public void setMaxWait(Integer maxWait) { + this.maxWait = maxWait; + } + + public Integer getTimeBetweenEvictionRunsMillis() { + return timeBetweenEvictionRunsMillis; + } + + public void setTimeBetweenEvictionRunsMillis(Integer timeBetweenEvictionRunsMillis) { + this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis; + } + + public Integer getMinEvictableIdleTimeMillis() { + return minEvictableIdleTimeMillis; + } + + public void setMinEvictableIdleTimeMillis(Integer minEvictableIdleTimeMillis) { + this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis; + } + + public String getValidationQuery() { + return validationQuery; + } + + public void setValidationQuery(String validationQuery) { + this.validationQuery = validationQuery; + } + + public Boolean getTestWhileIdle() { + return testWhileIdle; + } + + public void setTestWhileIdle(Boolean testWhileIdle) { + this.testWhileIdle = testWhileIdle; + } + + public Boolean getTestOnBorrow() { + return testOnBorrow; + } + + public void setTestOnBorrow(Boolean testOnBorrow) { + this.testOnBorrow = testOnBorrow; + } + + public Boolean getTestOnReturn() { + return testOnReturn; + } + + public void setTestOnReturn(Boolean testOnReturn) { + this.testOnReturn = testOnReturn; + } + + public Boolean getPoolPreparedStatements() { + return poolPreparedStatements; + } + + public void setPoolPreparedStatements(Boolean poolPreparedStatements) { + this.poolPreparedStatements = poolPreparedStatements; + } + + public Integer getMaxPoolPreparedStatementPerConnectionSize() { + return maxPoolPreparedStatementPerConnectionSize; + } + + public void setMaxPoolPreparedStatementPerConnectionSize(Integer maxPoolPreparedStatementPerConnectionSize) { + this.maxPoolPreparedStatementPerConnectionSize = maxPoolPreparedStatementPerConnectionSize; + } + + public String getFilters() { + return filters; + } + + public void setFilters(String filters) { + this.filters = filters; + } + + public Boolean getRemoveAbandoned() { + return removeAbandoned; + } + + public void setRemoveAbandoned(Boolean removeAbandoned) { + this.removeAbandoned = removeAbandoned; + } + + public Integer getRemoveAbandonedTimeout() { + return removeAbandonedTimeout; + } + + public void setRemoveAbandonedTimeout(Integer removeAbandonedTimeout) { + this.removeAbandonedTimeout = removeAbandonedTimeout; + } +} diff --git a/app-manage/src/main/java/com/enzhico/pos/config/properties/MyProperties.java b/app-manage/src/main/java/com/enzhico/pos/config/properties/MyProperties.java new file mode 100644 index 0000000..756dde6 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/config/properties/MyProperties.java @@ -0,0 +1,148 @@ +package com.enzhico.pos.config.properties; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + + +/** + * 本项目自定义配置 + * + * @author xiongneng + * @since 2018/01/06 21:09 + */ +@Component +@ConfigurationProperties(prefix = "enzhico") +public class MyProperties { + /** + * excel模板文件路径 + */ + private String excelPath = ""; + /** + * 文件保存路径 + */ + private String filesPath = ""; + /** + * 图片保存路径 + */ + private String picsPath = ""; + /** + * 图片访问URL前缀 + */ + private String picsUrlPrefix = ""; + /** + * 文件访问URL前缀 + */ + private String filesUrlPrefix = ""; + /** + * POS API接口前缀 + */ + private String posapiUrlPrefix = ""; + /** + * 是否验证码 + */ + private Boolean kaptchaOpen = false; + /** + * 是否开启Swaggr + */ + private Boolean swaggerOpen = false; + /** + * session 失效时间(默认为30分钟 单位:秒) + */ + private Integer sessionInvalidateTime = 30 * 60; + /** + * session 验证失效时间(默认为15分钟 单位:秒) + */ + private Integer sessionValidationInterval = 15 * 60; + /** + * 机具心跳报告超时时间 单位:分钟 + */ + private Integer heartbeatTimeout; + + public String getExcelPath() { + return excelPath; + } + + public void setExcelPath(String excelPath) { + this.excelPath = excelPath; + } + + public String getPicsUrlPrefix() { + return picsUrlPrefix; + } + + public void setPicsUrlPrefix(String picsUrlPrefix) { + this.picsUrlPrefix = picsUrlPrefix; + } + + public Boolean getKaptchaOpen() { + return kaptchaOpen; + } + + public void setKaptchaOpen(Boolean kaptchaOpen) { + this.kaptchaOpen = kaptchaOpen; + } + + public Boolean getSwaggerOpen() { + return swaggerOpen; + } + + public void setSwaggerOpen(Boolean swaggerOpen) { + this.swaggerOpen = swaggerOpen; + } + + public Integer getSessionInvalidateTime() { + return sessionInvalidateTime; + } + + public void setSessionInvalidateTime(Integer sessionInvalidateTime) { + this.sessionInvalidateTime = sessionInvalidateTime; + } + + public Integer getSessionValidationInterval() { + return sessionValidationInterval; + } + + public void setSessionValidationInterval(Integer sessionValidationInterval) { + this.sessionValidationInterval = sessionValidationInterval; + } + + public String getFilesUrlPrefix() { + return filesUrlPrefix; + } + + public void setFilesUrlPrefix(String filesUrlPrefix) { + this.filesUrlPrefix = filesUrlPrefix; + } + + public String getFilesPath() { + return filesPath; + } + + public void setFilesPath(String filesPath) { + this.filesPath = filesPath; + } + + public Integer getHeartbeatTimeout() { + return heartbeatTimeout; + } + + public void setHeartbeatTimeout(Integer heartbeatTimeout) { + this.heartbeatTimeout = heartbeatTimeout; + } + + public String getPicsPath() { + return picsPath; + } + + public void setPicsPath(String picsPath) { + this.picsPath = picsPath; + } + + public String getPosapiUrlPrefix() { + return posapiUrlPrefix; + } + + public void setPosapiUrlPrefix(String posapiUrlPrefix) { + this.posapiUrlPrefix = posapiUrlPrefix; + } +} diff --git a/app-manage/src/main/java/com/enzhico/pos/controller/AppController.java b/app-manage/src/main/java/com/enzhico/pos/controller/AppController.java new file mode 100644 index 0000000..adb54d2 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/controller/AppController.java @@ -0,0 +1,267 @@ +package com.enzhico.pos.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.enzhico.pos.common.dao.entity.Pos; +import com.enzhico.pos.common.util.AnalysisApk; +import com.enzhico.pos.common.util.DateUtil; +import com.enzhico.pos.config.properties.MyProperties; +import com.enzhico.pos.dao.entity.AppInfo; +import com.enzhico.pos.dao.entity.ManagerInfo; +import com.enzhico.pos.dao.entity.PublishParam; +import com.enzhico.pos.dao.entity.SearchApp; +import com.enzhico.pos.model.BaseResponse; +import com.enzhico.pos.service.AppService; +import com.enzhico.pos.shiro.ShiroKit; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.shiro.authz.annotation.RequiresUser; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardCopyOption; +import java.util.Arrays; +import java.util.List; + +/** + * Description: APP管理 + */ + +@Controller +@RequestMapping("/app") +public class AppController { + @Resource + private AppService appService; + @Resource + private MyProperties myProperties; + + private static final Logger _logger = LoggerFactory.getLogger(AppController.class); + + /** + * App管理首页 + * + * @param request + * @param model + * @return + */ + @RequestMapping(value = "/index") + @RequiresUser + public String index(HttpServletRequest request, Model model) throws JsonProcessingException { + ManagerInfo managerInfo = ShiroKit.getUser(); + // 应用名称和版本号对应关系 + String json = new ObjectMapper().writeValueAsString(appService.selectAppVersionList(managerInfo.getPidsList())); + model.addAttribute("appVersionMap", json); + // 应用名称列表 + model.addAttribute("appNames", appService.selectAllAppNames(managerInfo.getPidsList())); + // 版本号列表 + model.addAttribute("versions", appService.selectAllVersions(managerInfo.getPidsList())); + // 项目名称列表 + model.addAttribute("projects", appService.selectAllProjects(managerInfo.getPidsList())); + return "modules/app/appManagement"; + } + + /** + * 分页查询列表 + * + * @return + */ + @RequestMapping(value = "/list") + @ResponseBody + @RequiresUser() + public BaseResponse list(@ModelAttribute SearchApp searchApp) { + // 日期范围分解 + if (StringUtils.isNotEmpty(searchApp.getPublishtimeRange())) { + String[] ds = searchApp.getPublishtimeRange().split(" - "); + searchApp.setPublishTimeStart(DateUtil.getDateStartTime(DateUtil.parseDate(ds[0]))); + searchApp.setPublishTimeEnd(DateUtil.getDateEndTime(DateUtil.parseDate(ds[1]))); + } + // 设置项目ID + ManagerInfo managerInfo = ShiroKit.getUser(); + searchApp.setPidList(managerInfo.getPidsList()); + Page page = new Page(searchApp.getPageNumber(), searchApp.getPageSize()); + List list = appService.searchList(page, searchApp); + return new BaseResponse(true, "查询列表", page.getTotal(), list); + } + + /** + * 灰度发布列表 + * + * @return + */ + @RequestMapping(value = "/graylist") + @ResponseBody + @RequiresUser + public BaseResponse graylist(@RequestParam("id") Integer appId) { + List list = appService.grayList(appId); + return new BaseResponse(true, "灰度发布列表", 0, list); + } + + /** + * 全网发布 + * + * @return + */ + @RequestMapping(value = "/publishall/{appId}", method = RequestMethod.POST) + @ResponseBody + @RequiresUser + public BaseResponse publishAll(@PathVariable("appId") Integer appId) { + appService.publishAll(appId); + return new BaseResponse(true, "全网发布成功", 0, null); + } + + + /** + * 发布新版本页面 + * + * @param request + * @param model + * @return + */ + @RequestMapping(value = "/publish") + @RequiresUser + public String publish(HttpServletRequest request, Model model) { + // 项目名称列表 + ManagerInfo managerInfo = ShiroKit.getUser(); + // 应用名称列表 + model.addAttribute("appNames", appService.selectAllAppNames(managerInfo.getPidsList())); + return "modules/app/addVersion"; + } + + /** + * 发布新版本 + * + * @return + */ + @RequestMapping(value = "/publish", method = RequestMethod.POST) + @ResponseBody + @RequiresUser + public BaseResponse doPublish(@ModelAttribute PublishParam param) throws IOException { +// MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request; +// multipartRequest.getParameter("name"); + _logger.info("app name=" + param.getName()); + MultipartFile file = param.getFile(); + String tempFile = param.getName() + "_" + System.currentTimeMillis() + ".apk"; + if (!file.isEmpty()) { + File destFile = new File(myProperties.getFilesPath(), tempFile); + Path destFilePath = Paths.get(destFile.getAbsolutePath()); + saveFile(file, destFile); + // 解析APK文件,提取版本号和Application ID + String[] packageInfo; + try { + packageInfo = AnalysisApk.unZip( + new File(myProperties.getFilesPath(), tempFile).getAbsolutePath(), myProperties.getFilesPath()); + } catch (IOException e) { + return new BaseResponse(false, "文件类型错误,请上传应用文件。", 0, null); + } + String appVersion = packageInfo[0]; + if (appVersion == null) { + return new BaseResponse(false, "文件类型错误,请上传应用文件。", 0, null); + } +// String appVersionCode = packageInfo[1]; + String applicationId = packageInfo[2]; + + // 先获取登录用户 + ManagerInfo manager = ShiroKit.getUser(); + // 做用户发布权限的检查 + if (!appService.checkUserPublishPermission(manager.getId(), applicationId)) { + return new BaseResponse(false, "上传失败,你没有权限发布此应用", 0, null); + } + + // 接下来做APK文件和版本号的合法性检查 + boolean checkVersion; + try { + checkVersion = appService.checkAppVersion(applicationId, appVersion); + } catch (NullPointerException e) { + return new BaseResponse(false, "上传失败,请先配置好Application Id = " + applicationId + "的项目", 0, null); + } + if (!checkVersion) { + Files.delete(destFilePath); + return new BaseResponse(false, "版本号较低,请重新上传", 0, null); + } + // 重命名文件 + Files.move(destFilePath, destFilePath.resolveSibling(param.getName() + "_" + appVersion + ".apk"), StandardCopyOption.REPLACE_EXISTING); + // 更新参数 + param.setVersion(appVersion); + param.setApplicationId(applicationId); + + // 然后保存这条版本记录 + appService.addVersion(param, manager); + return new BaseResponse(true, "上传成功", 0, null); + } + return new BaseResponse(false, "请上传应用文件", 0, null); + } + + /** + * 灰度发布页面 + * + * @return + */ + @RequestMapping(value = "/gray") + @RequiresUser + public String gray(HttpServletRequest request, Model model) { + // 项目名称列表 + ManagerInfo managerInfo = ShiroKit.getUser(); + model.addAttribute("locations", appService.selectAllLocations(managerInfo.getPidsList())); + return "modules/app/grayPublish"; + } + + /** + * 按网点查询POS列表 + * + * @return + */ + @RequestMapping(value = "/listlo") + @ResponseBody + @RequiresUser + public BaseResponse listlo(@RequestParam("locations") String locations) { + if ("0".equals(locations)) { + return new BaseResponse(true, "网点查询POS列表", 0, null); + } + List locationList = null; + if (StringUtils.isNotEmpty(locations)) { + locationList = Arrays.asList(locations.split(",")); + } + List posList = appService.selectPosListByLocations(locationList); + return new BaseResponse(true, "网点查询POS列表", posList != null ? posList.size() : 0, posList); + } + + /** + * 按imei查询POS列表 + * + * @return POS列表 + */ + @RequestMapping(value = "/imei") + @ResponseBody + @RequiresUser + public BaseResponse imei(@RequestParam("imei") String imei) { + Pos pos = appService.selectByImei(imei); + return new BaseResponse(pos != null, "按imei查询POS列表", 0, pos); + } + + /** + * 保存文件 + * @param file 上传文件 + * @param destFile 目标文件 + */ + private void saveFile(MultipartFile file, File destFile) { + try { + FileUtils.copyInputStreamToFile(file.getInputStream(), destFile); + } catch (IOException ie) { + _logger.error("保存文件出错", ie); + } + } + + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/controller/DeviceController.java b/app-manage/src/main/java/com/enzhico/pos/controller/DeviceController.java new file mode 100644 index 0000000..8edabdc --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/controller/DeviceController.java @@ -0,0 +1,117 @@ +package com.enzhico.pos.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.enzhico.pos.common.dao.entity.PosHistory; +import com.enzhico.pos.dao.entity.ManagerInfo; +import com.enzhico.pos.dao.entity.PosInfo; +import com.enzhico.pos.dao.entity.SearchPos; +import com.enzhico.pos.model.BaseResponse; +import com.enzhico.pos.service.DeviceService; +import com.enzhico.pos.shiro.ShiroKit; +import org.apache.shiro.authz.annotation.RequiresUser; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.List; + +/** + * Description: 机具入网管理 + */ + +@Controller +@RequestMapping("/device") +public class DeviceController { + + @Resource + private DeviceService deviceService; + + /** + * 机具入网管理首页 + * + * @param request + * @param model + * @return + */ + @RequestMapping(value = "/index") + @RequiresUser() + public String index(HttpServletRequest request, Model model) { + // 查询所有项目列表 + ManagerInfo managerInfo = ShiroKit.getUser(); + model.addAttribute("projects", deviceService.allProjects(managerInfo.getPidsList())); + return "modules/device/deviceManagement"; + } + + /** + * 机具详情 + * + * @return + */ + @RequestMapping(value = "/detail") + @RequiresUser() + public String detail(Model model, @RequestParam("id") Integer id) { + PosInfo posInfo = deviceService.searchDetail(id); + model.addAttribute("pos", posInfo); + return "modules/device/deviceDetail"; + } + + /** + * 查询列表 + * + * @return + */ + @RequestMapping(value = "/list") + @ResponseBody + @RequiresUser() + public BaseResponse list(@ModelAttribute SearchPos searchPos) { + Page page = new Page(searchPos.getPageNumber(), searchPos.getPageSize()); + ManagerInfo managerInfo = ShiroKit.getUser(); + searchPos.setPidList(managerInfo.getPidsList()); + List list = deviceService.searchList(page, searchPos); + return new BaseResponse(true, "设备列表", page.getTotal(), list); + } + + /** + * 修改机具状态 + * + * @return + */ + @RequestMapping(value = "/state/{id}/{state}", method = RequestMethod.POST) + @ResponseBody + @RequiresUser() + public BaseResponse state(@PathVariable("id") Integer id, + @PathVariable("state") Integer state) { + deviceService.updateState(id, state); + return new BaseResponse(true, "修改状态成功", 0, null); + } + + /** + * 解除网点绑定 + * + * @return + */ + @RequestMapping(value = "/unbind/{id}", method = RequestMethod.POST) + @ResponseBody + @RequiresUser() + public BaseResponse unbind(@PathVariable("id") Integer id) { + ManagerInfo managerInfo = ShiroKit.getUser(); + deviceService.unbind(id, managerInfo); + return new BaseResponse(true, "解除网点绑定成功", 0, null); + } + + /** + * 查询绑定历史 + * + * @return + */ + @RequestMapping(value = "/history/{posId}", method = RequestMethod.GET) + @ResponseBody + @RequiresUser() + public BaseResponse bindHistory(@PathVariable("posId") Integer id) { + List historyList = deviceService.selectHisotryList(id); + return new BaseResponse(true, "查询绑定历史", 0, historyList); + } + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/controller/LoginController.java b/app-manage/src/main/java/com/enzhico/pos/controller/LoginController.java new file mode 100644 index 0000000..78e1d86 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/controller/LoginController.java @@ -0,0 +1,157 @@ +package com.enzhico.pos.controller; + +import com.enzhico.pos.config.properties.MyProperties; +import com.enzhico.pos.dao.entity.ManagerInfo; +import com.enzhico.pos.exception.ForbiddenUserException; +import com.enzhico.pos.service.ManagerInfoService; +import com.enzhico.pos.service.ProjectService; +import com.enzhico.pos.shiro.IncorrectCaptchaException; +import com.enzhico.pos.shiro.ShiroKit; +import org.apache.shiro.authc.IncorrectCredentialsException; +import org.apache.shiro.authc.UnknownAccountException; +import org.apache.shiro.authz.annotation.RequiresUser; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; +import java.util.HashMap; +import java.util.Map; + +/** + * Description: 登录验证 + */ + +// 只用同时具有permission:view和permission:aix权限才能访问 +//@RequiresPermissions(value={"permission:view","permission:aix"}, logical= Logical.AND) +//@RequiresPermissions(value={"permission:view","permission:aix"}, logical= Logical.OR)一个就行 + +@Controller +public class LoginController { + + @Resource + private ManagerInfoService managerInfoService; + @Resource + private ProjectService projectService; + @Resource + private MyProperties myProperties; + + private static final Logger _logger = LoggerFactory.getLogger(LoginController.class); + + //登录页(shiro配置需要两个/login 接口,一个是get用来获取登陆页面,一个用post用于登录) + @RequestMapping(value = "/login", method = RequestMethod.GET) + public String login() { + if (ShiroKit.isAuthenticated()) { + return "redirect:/"; + } + return "login"; + } + + // 登录提交地址和applicationontext-shiro.xml配置的loginurl一致。 (配置文件方式的说法) + @RequestMapping(value = "/login", method = RequestMethod.POST) + public String login(HttpServletRequest request, Map map) { + _logger.info("登录方法start........."); + // 登录失败从request中获取shiro处理的异常信息。shiroLoginFailure:就是shiro异常类的全类名. + Object exception = request.getAttribute("shiroLoginFailure"); + String msg; + if (exception != null) { + if (UnknownAccountException.class.isInstance(exception)) { + msg = "用户名不正确,请重新输入"; + } else if (IncorrectCredentialsException.class.isInstance(exception)) { + msg = "密码错误,请重新输入"; + } else if (IncorrectCaptchaException.class.isInstance(exception)) { + msg = "验证码错误"; + } else if (ForbiddenUserException.class.isInstance(exception)) { + msg = "该用户已被禁用,如有疑问请联系系统管理员。"; + } else { + msg = "发生未知错误,请联系管理员。"; + } + map.put("username", request.getParameter("username")); + map.put("password", request.getParameter("password")); + map.put("msg", msg); + return "login"; + } + //如果已经登录,直接跳转主页面 + return "index"; + } + + /** + * 主页 + * @param session + * @param model + * @return + */ + @RequestMapping({"/", "/index"}) + public String index(HttpSession session, Model model) { + // _logger.info("访问首页start..."); + // 做一些其他事情,比如把项目的数量放到session中 + if (ShiroKit.hasRole("admin") && session.getAttribute("projectNum") == null) { + int pnum = projectService.selectProjectNum(); + session.setAttribute("projectNum", pnum); + } + if (session.getAttribute("picsUrlPrefix") == null) { + // 图片访问URL前缀 + session.setAttribute("picsUrlPrefix", myProperties.getPicsUrlPrefix()); + } + return "index"; + } + + /** + * 欢迎页面 + * @param request + * @param model + * @return + */ + @RequestMapping("/welcome") + public String welcome(HttpServletRequest request, Model model) { + return "modules/common/welcome"; + } + + /** + * 修改密码 + * + * @param request + * @param model + * @return + */ + @RequestMapping("/password") + @RequiresUser + public String password(HttpServletRequest request, Model model) { + return "modules/common/modifyPassword"; + } + + /** + * 修改密码 + * + * @return + */ + @RequestMapping(value = "/password", method = RequestMethod.POST) + @RequiresUser + @ResponseBody + public Map changePassword(@RequestParam Map param) { + _logger.info("修改密码 post start...."); + Map result = new HashMap<>(); + String oldPassword = param.get("p1"); + String newPassword = param.get("p2"); + ManagerInfo managerInfo = ShiroKit.getUser(); + if (!ShiroKit.md5(oldPassword, managerInfo.getCredentialsSalt()).equals(managerInfo.getPassword())) { + result.put("success", false); + result.put("msg", "原密码不正确"); + return result; + } + String newPasswordEncpt = ShiroKit.md5(newPassword, managerInfo.getCredentialsSalt()); + managerInfoService.updatePassword(managerInfo.getUsername(), newPasswordEncpt); + managerInfo.setPassword(newPasswordEncpt); + result.put("success", true); + result.put("msg", "修改密码成功!"); + return result; + } + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/controller/MonitorController.java b/app-manage/src/main/java/com/enzhico/pos/controller/MonitorController.java new file mode 100644 index 0000000..93e9134 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/controller/MonitorController.java @@ -0,0 +1,115 @@ +package com.enzhico.pos.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.enzhico.pos.model.BaseResponse; +import com.enzhico.pos.common.dao.entity.Project; +import com.enzhico.pos.dao.entity.*; +import com.enzhico.pos.service.MonitorService; +import com.enzhico.pos.shiro.ShiroKit; +import org.apache.shiro.authz.annotation.RequiresUser; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Description: 监控管理 + */ + +@Controller +@RequestMapping("/monitor") +public class MonitorController { + + @Resource + private MonitorService monitorService; + + /** + * 监控管理首页 + * + * @param request + * @param model + * @return + */ + @RequestMapping(value = "/index") + @RequiresUser() + public String index(HttpServletRequest request, Model model) { + // 获取所有的项目 + ManagerInfo managerInfo = ShiroKit.getUser(); + List projects = monitorService.selectAllProjects(managerInfo.getPidsList()); + model.addAttribute("projects", projects); + // 入网机具总数 + model.addAttribute("posCount", monitorService.posCount(0, managerInfo.getPidsList())); + // 网点数量 + model.addAttribute("locationCount", monitorService.locationCount(0, managerInfo.getPidsList())); + return "modules/monitor/deviceStatus"; + } + + /** + * 切换项目重新加载 + * + * @return + */ + @RequestMapping(value = "/reload") + @ResponseBody + @RequiresUser() + public BaseResponse reload(@RequestParam("projectId") Integer projectId) { + Map map = new HashMap<>(); + ManagerInfo managerInfo = ShiroKit.getUser(); + map.put("posCount", monitorService.posCount(projectId, managerInfo.getPidsList())); + map.put("locationCount", monitorService.locationCount(projectId, managerInfo.getPidsList())); + return new BaseResponse(true,"重新加载", 0, map); + } + + /** + * 网点分组机具分页查询 + * + * @return + */ + @RequestMapping(value = "/list") + @ResponseBody + @RequiresUser() + public BaseResponse list(@ModelAttribute SearchPos searchPos) { + Page page = new Page(searchPos.getPageNumber(), searchPos.getPageSize()); + ManagerInfo managerInfo = ShiroKit.getUser(); + searchPos.setPidList(managerInfo.getPidsList()); + List list = monitorService.searchListGroupByLocation(page, searchPos); + return new BaseResponse(true, "网点分组机具分页查询", page.getTotal(), list); + } + + /** + * 网点机具详情页面 + * + * @return + */ + @RequestMapping(value = "/detail") + @RequiresUser() + public String detail(Model model, @RequestParam("location") String location) { + model.addAttribute("location", location); + return "modules/monitor/deviceStatusDetail"; + } + + /** + * 特定网点机具列表分页 + * + * @return + */ + @RequestMapping(value = "/detailList") + @ResponseBody + @RequiresUser() + public BaseResponse detailList(@ModelAttribute SearchMonitor searchMonitor) { + Page page = new Page(searchMonitor.getPageNumber(), searchMonitor.getPageSize()); + ManagerInfo managerInfo = ShiroKit.getUser(); + searchMonitor.setPidList(managerInfo.getPidsList()); + List list = monitorService.searchLocationMonitorList(page, searchMonitor); + return new BaseResponse(true, "特定网点机具列表分页", page.getTotal(), list); + } + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/controller/ProjectController.java b/app-manage/src/main/java/com/enzhico/pos/controller/ProjectController.java new file mode 100644 index 0000000..159b092 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/controller/ProjectController.java @@ -0,0 +1,147 @@ +package com.enzhico.pos.controller; + +import com.enzhico.pos.common.dao.entity.Project; +import com.enzhico.pos.config.properties.MyProperties; +import com.enzhico.pos.dao.entity.FileInfo; +import com.enzhico.pos.model.BaseResponse; +import com.enzhico.pos.service.ProjectService; +import org.apache.commons.io.FileUtils; +import org.apache.shiro.authz.annotation.RequiresRoles; +import org.apache.shiro.authz.annotation.RequiresUser; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; +import java.io.File; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.util.List; +import java.util.UUID; + +/** + * Description: 项目管理 + */ + +@Controller +@RequestMapping("/project") +public class ProjectController { + private static final Logger _logger = LoggerFactory.getLogger(ProjectController.class); + + @Resource + private ProjectService projectService; + @Resource + private MyProperties myProperties; + + /** + * 项目管理首页 + * + * @param request req + * @param model model + * @return 项目管理首页页面 + */ + @RequestMapping(value = "/index") + @RequiresRoles("admin") + public String index(HttpServletRequest request, Model model) { + _logger.info("进入项目管理首页..."); + // 获取所有的项目 + List projects = projectService.selectAll(); + model.addAttribute("projects", projects); + return "modules/project/projectManagement"; + } + + /** + * 添加一个项目 + * @param project 项目 + * @return 项目首页 + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @RequiresRoles("admin") + public String add(HttpSession session, @ModelAttribute Project project){ + _logger.info("添加项目..."); + //Thread.sleep(3000L); + projectService.add(project); + // 更新session中的项目数量 + int pnum = projectService.selectProjectNum(); + session.setAttribute("projectNum", pnum); + return "redirect:/project/index"; + } + + /** + * 删除一个项目 + * @param projectId 项目ID + * @return 项目首页 + */ + @RequestMapping(value = "/delete", method = RequestMethod.DELETE) + @ResponseBody + @RequiresRoles("admin") + public BaseResponse delete(HttpSession session, @RequestParam("id") Integer projectId) { + _logger.info("删除项目,id=" + projectId); + // 项目下存在用户不能删除,该项目下存在用户,无法删除 + int userCount = projectService.selectUsersByPrjectId(projectId); + if (userCount > 0) { + return new BaseResponse(false, "该项目下存在用户,无法删除", 0, null); + } + projectService.delete(projectId); + // 更新session中的项目数量 + int pnum = projectService.selectProjectNum(); + session.setAttribute("projectNum", pnum); + + return new BaseResponse(true, "删除项目成功", 0, null); + } + + /** + * 上传图片 + * + * @return + */ + @RequestMapping(value = "/upload") + @ResponseBody + @RequiresUser + public BaseResponse doPublish(@RequestParam("file") MultipartFile file) { + String fileName0 = toUTF8(file.getOriginalFilename()); + String fileName = uuidStr() + fileName0.substring(fileName0.lastIndexOf(".")); + _logger.info("Sava fileName=" + fileName); + if (!file.isEmpty()) { + savePic(file, fileName); + return new BaseResponse(true, "上传成功", 0, new FileInfo(fileName)); + } + return new BaseResponse(false, "上传失败,因为文件是空的", 0, null); + } + /** + * 获取随机值字符串 + * @return + */ + public static String uuidStr() { + return UUID.randomUUID().toString().replaceAll("-", ""); + } + + private String toUTF8(String str) { + try { + return new String(str.getBytes("ISO-8859-1"), "UTF-8"); + } catch (UnsupportedEncodingException e) { + _logger.info("文件名转码错误", e); + } + return null; + } + + /** + * 保存图片 + * @param picFile + * @param fileName + */ + private void savePic(MultipartFile picFile, String fileName) { + try { + FileUtils.copyInputStreamToFile(picFile.getInputStream(), + new File(myProperties.getPicsPath(), fileName)); + } catch (IOException ie) { + ie.printStackTrace(); + } + } + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/controller/UserController.java b/app-manage/src/main/java/com/enzhico/pos/controller/UserController.java new file mode 100644 index 0000000..5b8d539 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/controller/UserController.java @@ -0,0 +1,149 @@ +package com.enzhico.pos.controller; + +import com.baomidou.mybatisplus.plugins.Page; +import com.enzhico.pos.common.util.DateUtil; +import com.enzhico.pos.dao.entity.ManagerInfo; +import com.enzhico.pos.dao.entity.SearchUser; +import com.enzhico.pos.model.BaseResponse; +import com.enzhico.pos.service.ManagerInfoService; +import org.apache.commons.lang3.StringUtils; +import org.apache.shiro.authz.annotation.RequiresRoles; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.List; + +/** + * Description: 用户管理 + */ + +@Controller +@RequestMapping("/user") +public class UserController { + @Resource + private ManagerInfoService managerInfoService; + + /** + * 用户管理首页 + * + * @param request + * @param model + * @return + */ + @RequestMapping(value = "/index") + @RequiresRoles(value = {"admin"}) + public String index(HttpServletRequest request, Model model) { + // 查询所有项目列表 + model.addAttribute("projects", managerInfoService.allProjects()); + return "modules/user/userManagement"; + } + + /** + * 查询用户列表 + * + * @return + */ + @RequestMapping(value = "/list") + @ResponseBody + @RequiresRoles(value = {"admin"}) + public BaseResponse list(@ModelAttribute SearchUser searchUser) { + // 创建时间分解 + if (StringUtils.isNotEmpty(searchUser.getCreatedTime())) { + String[] ds = searchUser.getCreatedTime().split(" - "); + searchUser.setCreatedTimeStart(DateUtil.getDateStartTime(DateUtil.parseDate(ds[0]))); + searchUser.setCreatedTimeEnd(DateUtil.getDateEndTime(DateUtil.parseDate(ds[1]))); + } + Page page = new Page(searchUser.getPageNumber(), searchUser.getPageSize()); + List list = managerInfoService.searchUsers(page, searchUser); + return new BaseResponse(true, "查询用户列表", page.getTotal(), list); + } + + /** + * 用户名重复检查 + * + * @return + */ + @RequestMapping(value = "/usernamechk", method = RequestMethod.GET) + @ResponseBody + @RequiresRoles(value = {"admin"}) + public BaseResponse doAdd(@RequestParam("username") String username) { + // 用户名重复性检查 + int usercount = managerInfoService.checkUsername(username); + if (usercount > 0) { + return new BaseResponse(false, "此用户名已存在", 0, null); + } + return new BaseResponse(true, "此用户名不存在", 0, null); + } + + /** + * 执行添加用户 + * + * @return + */ + @RequestMapping(value = "/add", method = RequestMethod.POST) + @RequiresRoles(value = {"admin"}) + public String doAdd(@ModelAttribute ManagerInfo manager) { + managerInfoService.addUser(manager); + return "redirect:/user/index"; + } + + /** + * 编辑用户 + * + * @param request + * @param model + * @return + */ + @RequestMapping(value = "/edit") + @RequiresRoles(value = {"admin"}) + public String edit(HttpServletRequest request, Model model, @RequestParam("id") Integer id) { + // 查询所有项目列表 + model.addAttribute("projects", managerInfoService.allProjects()); + // 查询用户 + model.addAttribute("user", managerInfoService.selectUser(id)); + return "modules/user/userEdit :: content"; + } + + /** + * 执行编辑用户 + * + * @return + */ + @RequestMapping(value = "/edit", method = RequestMethod.POST) + @RequiresRoles(value = {"admin"}) + public String doEdit(@ModelAttribute ManagerInfo manager) { + managerInfoService.editUser(manager); + return "redirect:/user/index"; + } + + /** + * 执行重置密码 + * + * @return + */ + @RequestMapping(value = "/reset/{id}/{username}", method = RequestMethod.POST) + @RequiresRoles(value = {"admin"}) + @ResponseBody + public BaseResponse doReset(@PathVariable("id") Integer id, + @PathVariable("username") String username) { + managerInfoService.resetPassword(id, username); + return new BaseResponse(true, "重置密码成功", 0, null); + } + + /** + * 执行删除用户 + * + * @return + */ + @RequestMapping(value = "/delete/{id}", method = RequestMethod.DELETE) + @RequiresRoles(value = {"admin"}) + @ResponseBody + public BaseResponse doDelete(@PathVariable("id") Integer id) { + managerInfoService.deleteUer(id); + return new BaseResponse(true, "删除用户成功", 0, null); + } + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/dao/entity/AppInfo.java b/app-manage/src/main/java/com/enzhico/pos/dao/entity/AppInfo.java new file mode 100644 index 0000000..fed0f55 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/dao/entity/AppInfo.java @@ -0,0 +1,79 @@ +package com.enzhico.pos.dao.entity; + +import com.enzhico.pos.common.constant.DictMap; +import com.enzhico.pos.common.dao.entity.App; + +import java.io.Serializable; + +/** + * Description: App信息 + */ +public class AppInfo extends App implements Serializable { + + private static final long serialVersionUID = 1L; + /** + * 操作者用户名 + */ + private String operatorUsername; + /** + * 操作者姓名 + */ + private String operatorName; + /** + * 归属项目名称 + */ + private String projectName; + + /** + * 发布范围显示 + */ + private String publishRangeStr; + /** + * APK下载链接 + */ + private String downloadUrl; + + public String getProjectName() { + return projectName; + } + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + public String getOperatorUsername() { + return operatorUsername; + } + + public void setOperatorUsername(String operatorUsername) { + this.operatorUsername = operatorUsername; + } + + public String getOperatorName() { + return operatorName; + } + + public void setOperatorName(String operatorName) { + this.operatorName = operatorName; + } + + public String getPublishRangeStr() { + return publishRangeStr; + } + + public void setPublishRangeStr(String publishRangeStr) { + this.publishRangeStr = publishRangeStr; + } + + public String getDownloadUrl() { + return downloadUrl; + } + + public void setDownloadUrl(String downloadUrl) { + this.downloadUrl = downloadUrl; + } + + public void buildTable() { + publishRangeStr = DictMap.value(DictMap.KEY_APP_PUBLISH_RANGE, getPublishRange()); + } +} diff --git a/app-manage/src/main/java/com/enzhico/pos/dao/entity/AppVersionInfo.java b/app-manage/src/main/java/com/enzhico/pos/dao/entity/AppVersionInfo.java new file mode 100644 index 0000000..f11a984 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/dao/entity/AppVersionInfo.java @@ -0,0 +1,37 @@ +package com.enzhico.pos.dao.entity; + +import java.util.List; + +/** + * App名字和版本对应类 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/17 + */ +public class AppVersionInfo { + /** + * 应用名称 + */ + private String appName; + /** + * 版本号列表 + */ + private List versions; + + public String getAppName() { + return appName; + } + + public void setAppName(String appName) { + this.appName = appName; + } + + public List getVersions() { + return versions; + } + + public void setVersions(List versions) { + this.versions = versions; + } +} diff --git a/app-manage/src/main/java/com/enzhico/pos/dao/entity/FileInfo.java b/app-manage/src/main/java/com/enzhico/pos/dao/entity/FileInfo.java new file mode 100644 index 0000000..c33b3ec --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/dao/entity/FileInfo.java @@ -0,0 +1,27 @@ +package com.enzhico.pos.dao.entity; + +/** + * FileInfo + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/10 + */ +public class FileInfo { + private String filename; + + public FileInfo() { + } + + public FileInfo(String filename) { + this.filename = filename; + } + + public String getFilename() { + return filename; + } + + public void setFilename(String filename) { + this.filename = filename; + } +} diff --git a/app-manage/src/main/java/com/enzhico/pos/dao/entity/ManagerInfo.java b/app-manage/src/main/java/com/enzhico/pos/dao/entity/ManagerInfo.java new file mode 100644 index 0000000..903698a --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/dao/entity/ManagerInfo.java @@ -0,0 +1,97 @@ +package com.enzhico.pos.dao.entity; + +import com.enzhico.pos.common.constant.DictMap; +import com.enzhico.pos.common.dao.entity.Manager; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + * Description: 后台运维管理员信息 + */ +public class ManagerInfo extends Manager implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 状态 + */ + private String stateStr; + /** + * 所属项目id列表(逗号分隔) + */ + private String pids; + /** + * 所属项目名列表(逗号分隔) + */ + private String pnames; + /** + * 所属项目id列表 + */ + private List pidsList; + + /** + * 一个管理员具有多个角色 + */ + private List roles;// 一个用户具有多个角色 + + public ManagerInfo() { + } + + public List getRoles() { + return roles; + } + + public void setRoles(List roles) { + this.roles = roles; + } + + /** + * 密码盐 + */ + public String getCredentialsSalt() { + return getUsername() + getSalt(); + } + + @Override + public String toString() { + return "username:" + getUsername() + "|name=" + getName(); + } + + public String getStateStr() { + return stateStr; + } + + public void setStateStr(String stateStr) { + this.stateStr = stateStr; + } + + public String getPids() { + return pids; + } + + public void setPids(String pids) { + this.pids = pids; + } + + public List getPidsList() { + return pidsList; + } + + public void setPidsList(List pidsList) { + this.pidsList = pidsList; + } + + public String getPnames() { + return pnames; + } + + public void setPnames(String pnames) { + this.pnames = pnames; + } + + public void buildTable() { + stateStr = DictMap.value(DictMap.KEY_USER_STATUS, getState()); + } +} diff --git a/app-manage/src/main/java/com/enzhico/pos/dao/entity/MonitorInfo.java b/app-manage/src/main/java/com/enzhico/pos/dao/entity/MonitorInfo.java new file mode 100644 index 0000000..5bebe6a --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/dao/entity/MonitorInfo.java @@ -0,0 +1,58 @@ +package com.enzhico.pos.dao.entity; + +import com.enzhico.pos.common.constant.DictMap; +import com.enzhico.pos.common.dao.entity.Pos; +import com.enzhico.pos.common.dao.entity.PosMonitor; + +import java.io.Serializable; + +/** + * Description: 机具信息 + */ +public class MonitorInfo extends PosMonitor implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 机具状态 + */ + private String onlineStateStr; + + /** + * 机具IMEI码 + */ + private String imei; + + /** + * 机具型号 + */ + private String series; + + public String getOnlineStateStr() { + return onlineStateStr; + } + + public void setOnlineStateStr(String onlineStateStr) { + this.onlineStateStr = onlineStateStr; + } + + public String getImei() { + return imei; + } + + public void setImei(String imei) { + this.imei = imei; + } + + public String getSeries() { + return series; + } + + public void setSeries(String series) { + this.series = series; + } + + public void buildTable() { + onlineStateStr = DictMap.value(DictMap.KEY_POS_MONITOR_STATUS, getOnlineState()); + } +} diff --git a/app-manage/src/main/java/com/enzhico/pos/dao/entity/PosGroupInfo.java b/app-manage/src/main/java/com/enzhico/pos/dao/entity/PosGroupInfo.java new file mode 100644 index 0000000..7dae6c8 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/dao/entity/PosGroupInfo.java @@ -0,0 +1,40 @@ +package com.enzhico.pos.dao.entity; + +import com.enzhico.pos.common.constant.DictMap; +import com.enzhico.pos.common.dao.entity.Pos; + +import java.io.Serializable; + +/** + * Description: 以网点为分组的机具信息 + */ +public class PosGroupInfo extends Pos implements Serializable { + + private static final long serialVersionUID = 1L; + /** + * 归属项目名称 + */ + private String projectName; + + /** + * 机具数量(网点分组) + */ + private Integer posCount; + + public String getProjectName() { + return projectName; + } + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + public Integer getPosCount() { + return posCount; + } + + public void setPosCount(Integer posCount) { + this.posCount = posCount; + } + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/dao/entity/PosInfo.java b/app-manage/src/main/java/com/enzhico/pos/dao/entity/PosInfo.java new file mode 100644 index 0000000..abeb5c4 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/dao/entity/PosInfo.java @@ -0,0 +1,45 @@ +package com.enzhico.pos.dao.entity; + +import com.enzhico.pos.common.constant.DictMap; +import com.enzhico.pos.common.dao.entity.Manager; +import com.enzhico.pos.common.dao.entity.Pos; + +import java.io.Serializable; +import java.util.List; + +/** + * Description: 机具信息 + */ +public class PosInfo extends Pos implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 机具状态 + */ + private String posStateStr; + /** + * 归属项目名称 + */ + private String projectName; + + public String getPosStateStr() { + return posStateStr; + } + + public void setPosStateStr(String posStateStr) { + this.posStateStr = posStateStr; + } + + public String getProjectName() { + return projectName; + } + + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + public void buildTable() { + posStateStr = DictMap.value(DictMap.KEY_POS_POS_STATUS, getPosState()); + } +} diff --git a/app-manage/src/main/java/com/enzhico/pos/dao/entity/PublishParam.java b/app-manage/src/main/java/com/enzhico/pos/dao/entity/PublishParam.java new file mode 100644 index 0000000..f1dfb5e --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/dao/entity/PublishParam.java @@ -0,0 +1,76 @@ +package com.enzhico.pos.dao.entity; + +import org.springframework.web.multipart.MultipartFile; + +/** + * APP版本发布参数 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/10 + */ +public class PublishParam { + private String name; + private String version; + private String applicationId; + private String tips; + private Integer publishRange; + private String grayIds; + private MultipartFile file; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getTips() { + return tips; + } + + public void setTips(String tips) { + this.tips = tips; + } + + public Integer getPublishRange() { + return publishRange; + } + + public void setPublishRange(Integer publishRange) { + this.publishRange = publishRange; + } + + public String getGrayIds() { + return grayIds; + } + + public void setGrayIds(String grayIds) { + this.grayIds = grayIds; + } + + public MultipartFile getFile() { + return file; + } + + public void setFile(MultipartFile file) { + this.file = file; + } + + public String getApplicationId() { + return applicationId; + } + + public void setApplicationId(String applicationId) { + this.applicationId = applicationId; + } +} diff --git a/app-manage/src/main/java/com/enzhico/pos/dao/entity/SearchApp.java b/app-manage/src/main/java/com/enzhico/pos/dao/entity/SearchApp.java new file mode 100644 index 0000000..de4cdb2 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/dao/entity/SearchApp.java @@ -0,0 +1,106 @@ +package com.enzhico.pos.dao.entity; + +import java.util.Date; +import java.util.List; + +/** + * 查询APP列表参数 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/8 + */ +public class SearchApp { + private Integer pageNumber; + private Integer pageSize; + + private String appName; + private String appVersion; + private Integer projectId; + private Integer publishRange; + private String publishtimeRange; + private Date publishTimeStart; + private Date publishTimeEnd; + + private List pidList; + + public Integer getPageNumber() { + return pageNumber; + } + + public void setPageNumber(Integer pageNumber) { + this.pageNumber = pageNumber; + } + + public Integer getPageSize() { + return pageSize; + } + + public void setPageSize(Integer pageSize) { + this.pageSize = pageSize; + } + + public Integer getProjectId() { + return projectId; + } + + public void setProjectId(Integer projectId) { + this.projectId = projectId; + } + + public String getAppName() { + return appName; + } + + public void setAppName(String appName) { + this.appName = appName; + } + + public String getAppVersion() { + return appVersion; + } + + public void setAppVersion(String appVersion) { + this.appVersion = appVersion; + } + + public Integer getPublishRange() { + return publishRange; + } + + public void setPublishRange(Integer publishRange) { + this.publishRange = publishRange; + } + + public Date getPublishTimeStart() { + return publishTimeStart; + } + + public void setPublishTimeStart(Date publishTimeStart) { + this.publishTimeStart = publishTimeStart; + } + + public Date getPublishTimeEnd() { + return publishTimeEnd; + } + + public void setPublishTimeEnd(Date publishTimeEnd) { + this.publishTimeEnd = publishTimeEnd; + } + + public String getPublishtimeRange() { + return publishtimeRange; + } + + public void setPublishtimeRange(String publishtimeRange) { + this.publishtimeRange = publishtimeRange; + } + + public List getPidList() { + return pidList; + } + + public void setPidList(List pidList) { + this.pidList = pidList; + } +} diff --git a/app-manage/src/main/java/com/enzhico/pos/dao/entity/SearchMonitor.java b/app-manage/src/main/java/com/enzhico/pos/dao/entity/SearchMonitor.java new file mode 100644 index 0000000..8e46b65 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/dao/entity/SearchMonitor.java @@ -0,0 +1,77 @@ +package com.enzhico.pos.dao.entity; + +import java.util.List; + +/** + * SearchUser + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/8 + */ +public class SearchMonitor { + private Integer pageNumber; + private Integer pageSize; + private String imei; + private String location; + private Integer projectId; + private Integer onlineState; + + private List pidList; + + public Integer getPageNumber() { + return pageNumber; + } + + public void setPageNumber(Integer pageNumber) { + this.pageNumber = pageNumber; + } + + public Integer getPageSize() { + return pageSize; + } + + public void setPageSize(Integer pageSize) { + this.pageSize = pageSize; + } + + public String getImei() { + return imei; + } + + public void setImei(String imei) { + this.imei = imei; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + + public Integer getProjectId() { + return projectId; + } + + public void setProjectId(Integer projectId) { + this.projectId = projectId; + } + + public Integer getOnlineState() { + return onlineState; + } + + public void setOnlineState(Integer onlineState) { + this.onlineState = onlineState; + } + + public List getPidList() { + return pidList; + } + + public void setPidList(List pidList) { + this.pidList = pidList; + } +} diff --git a/app-manage/src/main/java/com/enzhico/pos/dao/entity/SearchPos.java b/app-manage/src/main/java/com/enzhico/pos/dao/entity/SearchPos.java new file mode 100644 index 0000000..9888bbd --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/dao/entity/SearchPos.java @@ -0,0 +1,69 @@ +package com.enzhico.pos.dao.entity; + +import java.util.Date; +import java.util.List; + +/** + * SearchUser + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/8 + */ +public class SearchPos { + private Integer pageNumber; + private Integer pageSize; + private String imei; + private String location; + private Integer projectId; + + private List pidList; + + public Integer getPageNumber() { + return pageNumber; + } + + public void setPageNumber(Integer pageNumber) { + this.pageNumber = pageNumber; + } + + public Integer getPageSize() { + return pageSize; + } + + public void setPageSize(Integer pageSize) { + this.pageSize = pageSize; + } + + public String getImei() { + return imei; + } + + public void setImei(String imei) { + this.imei = imei; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } + + public Integer getProjectId() { + return projectId; + } + + public void setProjectId(Integer projectId) { + this.projectId = projectId; + } + + public List getPidList() { + return pidList; + } + + public void setPidList(List pidList) { + this.pidList = pidList; + } +} diff --git a/app-manage/src/main/java/com/enzhico/pos/dao/entity/SearchUser.java b/app-manage/src/main/java/com/enzhico/pos/dao/entity/SearchUser.java new file mode 100644 index 0000000..50e50b4 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/dao/entity/SearchUser.java @@ -0,0 +1,85 @@ +package com.enzhico.pos.dao.entity; + +import java.util.Date; + +/** + * SearchUser + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/8 + */ +public class SearchUser { + private Integer pageNumber; + private Integer pageSize; + private String username; + private String phone; + private Integer state; + private String createdTime; + private Date createdTimeStart; + private Date createdTimeEnd; + + public Integer getPageNumber() { + return pageNumber; + } + + public void setPageNumber(Integer pageNumber) { + this.pageNumber = pageNumber; + } + + public Integer getPageSize() { + return pageSize; + } + + public void setPageSize(Integer pageSize) { + this.pageSize = pageSize; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPhone() { + return phone; + } + + public void setPhone(String phone) { + this.phone = phone; + } + + public Integer getState() { + return state; + } + + public void setState(Integer state) { + this.state = state; + } + + public String getCreatedTime() { + return createdTime; + } + + public void setCreatedTime(String createdTime) { + this.createdTime = createdTime; + } + + public Date getCreatedTimeStart() { + return createdTimeStart; + } + + public void setCreatedTimeStart(Date createdTimeStart) { + this.createdTimeStart = createdTimeStart; + } + + public Date getCreatedTimeEnd() { + return createdTimeEnd; + } + + public void setCreatedTimeEnd(Date createdTimeEnd) { + this.createdTimeEnd = createdTimeEnd; + } +} diff --git a/app-manage/src/main/java/com/enzhico/pos/dao/entity/SysRole.java b/app-manage/src/main/java/com/enzhico/pos/dao/entity/SysRole.java new file mode 100644 index 0000000..0428d28 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/dao/entity/SysRole.java @@ -0,0 +1,29 @@ +package com.enzhico.pos.dao.entity; + +import com.enzhico.pos.common.dao.entity.Permission; +import com.enzhico.pos.common.dao.entity.Role; + +import java.io.Serializable; +import java.util.List; + +/** + * Description : 角色信息 + */ +public class SysRole extends Role implements Serializable { + + private static final long serialVersionUID = 1L; + + // 拥有的权限列表 + private List permissions; + + public SysRole() { + } + + public List getPermissions() { + return permissions; + } + + public void setPermissions(List permissions) { + this.permissions = permissions; + } +} diff --git a/app-manage/src/main/java/com/enzhico/pos/dao/repository/AppInfoDao.java b/app-manage/src/main/java/com/enzhico/pos/dao/repository/AppInfoDao.java new file mode 100644 index 0000000..f5f0aff --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/dao/repository/AppInfoDao.java @@ -0,0 +1,47 @@ +package com.enzhico.pos.dao.repository; + +import com.baomidou.mybatisplus.plugins.pagination.Pagination; +import com.enzhico.pos.common.dao.entity.App; +import com.enzhico.pos.common.dao.entity.Pos; +import com.enzhico.pos.common.dao.repository.AppMapper; +import com.enzhico.pos.dao.entity.AppInfo; +import com.enzhico.pos.dao.entity.AppVersionInfo; +import com.enzhico.pos.dao.entity.SearchApp; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * Description: AppInfoDao + */ +public interface AppInfoDao extends AppMapper { + + List selectAllAppNames(List pidList); + + List selectAllVersions(List pidList); + + List selectAllLocations(List pidList); + + List selectPosListByLocations(@Param("locations") List locations); + + App selectNowVersionApp(@Param("applicationId") String applicationId); + + int countUserPermission(@Param("userId") Integer userId, @Param("applicationId") String applicatioinId); + + /** + * 分页查询 + * @param page + * @param param + * @return + */ + List searchList(Pagination page, SearchApp param); + + /** + * 灰度发布列表 + * @param appId + * @return + */ + List grayList(@Param("id") Integer appId); + + List selectAppVersionList(List pidList); +} diff --git a/app-manage/src/main/java/com/enzhico/pos/dao/repository/ManagerInfoDao.java b/app-manage/src/main/java/com/enzhico/pos/dao/repository/ManagerInfoDao.java new file mode 100644 index 0000000..50093ea --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/dao/repository/ManagerInfoDao.java @@ -0,0 +1,20 @@ +package com.enzhico.pos.dao.repository; + +import com.baomidou.mybatisplus.plugins.pagination.Pagination; +import com.enzhico.pos.common.dao.repository.ManagerMapper; +import com.enzhico.pos.dao.entity.ManagerInfo; +import com.enzhico.pos.dao.entity.SearchUser; + +import java.util.List; +import java.util.Map; + +/** + * Description : + */ +public interface ManagerInfoDao extends ManagerMapper { + ManagerInfo findByUsername(String username); + + List selectUsers(Pagination page, SearchUser param); + + ManagerInfo selectUser(Integer id); +} diff --git a/app-manage/src/main/java/com/enzhico/pos/dao/repository/PosInfoDao.java b/app-manage/src/main/java/com/enzhico/pos/dao/repository/PosInfoDao.java new file mode 100644 index 0000000..9c70afc --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/dao/repository/PosInfoDao.java @@ -0,0 +1,59 @@ +package com.enzhico.pos.dao.repository; + +import com.baomidou.mybatisplus.plugins.pagination.Pagination; +import com.enzhico.pos.common.dao.entity.PosHistory; +import com.enzhico.pos.common.dao.repository.PosMapper; +import com.enzhico.pos.dao.entity.*; +import org.apache.ibatis.annotations.Param; + +import java.util.Date; +import java.util.List; + +/** + * Description : + */ +public interface PosInfoDao extends PosMapper { + /** + * 分页查询 + * @param page + * @param param + * @return + */ + List searchList(Pagination page, SearchPos param); + + /** + * 以网点分组进行分页查询 + * @param page + * @param param + * @return + */ + List searchListGroupByLocation(Pagination page, SearchPos param); + + PosInfo searchDetail(Integer id); + + PosHistory selectLastHistory(@Param("posId") Integer posId, + @Param("location") String location); + + /** + * 布放网点数量 + * @param projectId + * @return + */ + int searchLocationCount(@Param("projectId") Integer projectId, + @Param("pidList") List pidList); + + /** + * 网点机具列表分页 + * @param searchMonitor + * @return + */ + List selectPosMonitorList(Pagination page, SearchMonitor searchMonitor); + + /** + * 更新POS监控在线状态 + * + * @param start + * @return + */ + int updateOnlineState(@Param("start") Date start); +} diff --git a/app-manage/src/main/java/com/enzhico/pos/dao/repository/SysRoleDao.java b/app-manage/src/main/java/com/enzhico/pos/dao/repository/SysRoleDao.java new file mode 100644 index 0000000..5eaf799 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/dao/repository/SysRoleDao.java @@ -0,0 +1,13 @@ +package com.enzhico.pos.dao.repository; + +import com.enzhico.pos.dao.entity.SysRole; +import org.springframework.stereotype.Repository; + +/** + * Description : + */ + +@Repository +public interface SysRoleDao { + SysRole findByRole(String role); +} diff --git a/app-manage/src/main/java/com/enzhico/pos/dao/repository/mapping/AppInfoDao.xml b/app-manage/src/main/java/com/enzhico/pos/dao/repository/mapping/AppInfoDao.xml new file mode 100644 index 0000000..af88d27 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/dao/repository/mapping/AppInfoDao.xml @@ -0,0 +1,135 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app-manage/src/main/java/com/enzhico/pos/dao/repository/mapping/ManagerInfoDao.xml b/app-manage/src/main/java/com/enzhico/pos/dao/repository/mapping/ManagerInfoDao.xml new file mode 100644 index 0000000..ec816ad --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/dao/repository/mapping/ManagerInfoDao.xml @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app-manage/src/main/java/com/enzhico/pos/dao/repository/mapping/PosInfoDao.xml b/app-manage/src/main/java/com/enzhico/pos/dao/repository/mapping/PosInfoDao.xml new file mode 100644 index 0000000..3cfbc97 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/dao/repository/mapping/PosInfoDao.xml @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + + + + + UPDATE t_pos_monitor SET online_state=2 WHERE report_time < #{start} + + + diff --git a/app-manage/src/main/java/com/enzhico/pos/dao/repository/mapping/SysRoleDao.xml b/app-manage/src/main/java/com/enzhico/pos/dao/repository/mapping/SysRoleDao.xml new file mode 100644 index 0000000..a00ec74 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/dao/repository/mapping/SysRoleDao.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/app-manage/src/main/java/com/enzhico/pos/exception/ForbiddenUserException.java b/app-manage/src/main/java/com/enzhico/pos/exception/ForbiddenUserException.java new file mode 100644 index 0000000..77a06c8 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/exception/ForbiddenUserException.java @@ -0,0 +1,14 @@ +package com.enzhico.pos.exception; + +import org.apache.shiro.authc.AuthenticationException; + +/** + * 禁用用户异常 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/12 + */ +public class ForbiddenUserException extends AuthenticationException { + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/http/CustomResponseErrorHandler.java b/app-manage/src/main/java/com/enzhico/pos/http/CustomResponseErrorHandler.java new file mode 100644 index 0000000..b644e95 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/http/CustomResponseErrorHandler.java @@ -0,0 +1,20 @@ +package com.enzhico.pos.http; + +import org.springframework.http.client.ClientHttpResponse; +import org.springframework.web.client.DefaultResponseErrorHandler; + +import java.io.IOException; + +/** + * RestTemplate自定义异常处理 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/24 + */ +public class CustomResponseErrorHandler extends DefaultResponseErrorHandler { + @Override + public void handleError(ClientHttpResponse response) throws IOException { + super.handleError(response); + } +} diff --git a/app-manage/src/main/java/com/enzhico/pos/http/HttpBaseResponse.java b/app-manage/src/main/java/com/enzhico/pos/http/HttpBaseResponse.java new file mode 100644 index 0000000..87e49f6 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/http/HttpBaseResponse.java @@ -0,0 +1,60 @@ +package com.enzhico.pos.http; + +/** + * API接口的基础返回类 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/7 + */ +public class HttpBaseResponse { + /** + * 是否成功 + */ + private boolean success; + + /** + * 说明 + */ + private String msg; + + /** + * 返回数据 + */ + private T data; + + public HttpBaseResponse() { + + } + + public HttpBaseResponse(boolean success, String msg, T data) { + this.success = success; + this.msg = msg; + this.data = data; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/http/LoginParam.java b/app-manage/src/main/java/com/enzhico/pos/http/LoginParam.java new file mode 100644 index 0000000..344f2d8 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/http/LoginParam.java @@ -0,0 +1,59 @@ +package com.enzhico.pos.http; + +/** + * 登录认证接口参数 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/9 + */ +public class LoginParam { + /** + * 用户名 + */ + private String username; + /** + * 密码 + */ + private String password; + /** + * Application ID + */ + private String appid; + /** + * IMEI码 + */ + private String imei; + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getAppid() { + return appid; + } + + public void setAppid(String appid) { + this.appid = appid; + } + + public String getImei() { + return imei; + } + + public void setImei(String imei) { + this.imei = imei; + } +} diff --git a/app-manage/src/main/java/com/enzhico/pos/http/TokenRequestInterceptor.java b/app-manage/src/main/java/com/enzhico/pos/http/TokenRequestInterceptor.java new file mode 100644 index 0000000..b681482 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/http/TokenRequestInterceptor.java @@ -0,0 +1,32 @@ +package com.enzhico.pos.http; + +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpRequest; +import org.springframework.http.client.ClientHttpRequestExecution; +import org.springframework.http.client.ClientHttpRequestInterceptor; +import org.springframework.http.client.ClientHttpResponse; + +import java.io.IOException; + +/** + * TokenRequestInterceptor + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/23 + */ +public class TokenRequestInterceptor implements ClientHttpRequestInterceptor { + private String token; + + public TokenRequestInterceptor(String token) { + this.token = token; + } + + @Override + public ClientHttpResponse intercept( + HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException { + HttpHeaders headers = request.getHeaders(); + headers.add("Authorization", token); + return execution.execute(request, body); + } +} diff --git a/app-manage/src/main/java/com/enzhico/pos/http/UnbindParam.java b/app-manage/src/main/java/com/enzhico/pos/http/UnbindParam.java new file mode 100644 index 0000000..3ef36cd --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/http/UnbindParam.java @@ -0,0 +1,35 @@ +package com.enzhico.pos.http; + +/** + * 解绑通知参数 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/9 + */ +public class UnbindParam { + /** + * IMEI码 + */ + private String imei; + /** + * 网点 + */ + private String location; + + public String getImei() { + return imei; + } + + public void setImei(String imei) { + this.imei = imei; + } + + public String getLocation() { + return location; + } + + public void setLocation(String location) { + this.location = location; + } +} diff --git a/app-manage/src/main/java/com/enzhico/pos/jobs/HeartbeatJob.java b/app-manage/src/main/java/com/enzhico/pos/jobs/HeartbeatJob.java new file mode 100644 index 0000000..0714234 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/jobs/HeartbeatJob.java @@ -0,0 +1,54 @@ +package com.enzhico.pos.jobs; + +import com.enzhico.pos.service.MonitorService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 银企直联查账的定时任务 + * + * 第一位,表示秒,取值0-59 + * 第二位,表示分,取值0-59 + * 第三位,表示小时,取值0-23 + * 第四位,日期天/日,取值1-31 + * 第五位,日期月份,取值1-12 + * 第六位,星期,取值1-7,1表示星期天,2表示星期一 + * 第七位,年份,可以留空,取值1970-2099 + * + * @author XiongNeng + * @version 1.0 + * @since 2017/9/27 + */ +@Component +public class HeartbeatJob { + private static final Logger logger = LoggerFactory.getLogger(HeartbeatJob.class); + + @Resource + private MonitorService monitorService; + +// /** +// * 中午12:30上传检查 +// */ +// @Scheduled(cron = "0 35 12 * * ?") +// public void checkState1() { +// logger.info(">>>>> cron中午12:30上传检查开始...."); +// monitorService.updateOnlineState(); +// logger.info(">>>>> cron中午12:30上传检查完成...."); +// } +// +// /** +// * 晚上18:00上传检查 +// */ +// @Scheduled(cron = "0 05 18 * * ?") +// public void checkState2() { +// logger.info(">>>>> cron晚上18:00上传检查开始...."); +// monitorService.updateOnlineState(); +// logger.info(">>>>> cron晚上18:00上传检查完成...."); +// } + + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/model/BaseResponse.java b/app-manage/src/main/java/com/enzhico/pos/model/BaseResponse.java new file mode 100644 index 0000000..f3335a7 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/model/BaseResponse.java @@ -0,0 +1,73 @@ +package com.enzhico.pos.model; + +/** + * Controller的基础返回类 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/7 + */ +public class BaseResponse { + /** + * 是否成功 + */ + private boolean success; + + /** + * 说明 + */ + private String msg; + + /** + * 返回数据 + */ + private T data; + + /** + * 分页时候的总数 + */ + private Integer total; + + public BaseResponse() { + + } + + public BaseResponse(boolean success, String msg, Integer total, T data) { + this.success = success; + this.msg = msg; + this.total = total; + this.data = data; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + + public Integer getTotal() { + return total; + } + + public void setTotal(Integer total) { + this.total = total; + } +} diff --git a/app-manage/src/main/java/com/enzhico/pos/service/AppService.java b/app-manage/src/main/java/com/enzhico/pos/service/AppService.java new file mode 100644 index 0000000..128d4c6 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/service/AppService.java @@ -0,0 +1,215 @@ +package com.enzhico.pos.service; + +import com.baomidou.mybatisplus.mapper.Condition; +import com.baomidou.mybatisplus.plugins.Page; +import com.enzhico.pos.common.dao.entity.*; +import com.enzhico.pos.common.dao.repository.AppPublishMapper; +import com.enzhico.pos.common.dao.repository.PosMapper; +import com.enzhico.pos.common.dao.repository.ProjectMapper; +import com.enzhico.pos.common.util.CommonUtil; +import com.enzhico.pos.config.properties.MyProperties; +import com.enzhico.pos.dao.entity.*; +import com.enzhico.pos.dao.repository.AppInfoDao; +import org.apache.commons.lang3.StringUtils; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * App管理Service + */ + +@Service +public class AppService { + + @Resource + private AppInfoDao appInfoDao; + @Resource + private PosMapper posMapper; + @Resource + private AppPublishMapper appPublishMapper; + @Resource + private ProjectMapper projectMapper; + @Resource + private MyProperties myProperties; + + /** + * 查询所有应用名称 + * @param pidList 用户所属项目ID + * @return 所有应用名称 + */ + public List selectAllAppNames(List pidList) { + return appInfoDao.selectAllAppNames(pidList); + } + + /** + * 应用名称与版本号的对应关系 + * @param pidList 用户所属项目ID + * @return 应用名称与版本号的对应关系 + */ + public Map> selectAppVersionList(List pidList) { + List list = appInfoDao.selectAppVersionList(pidList); + Map> map = new HashMap<>(); + if (list != null) { + for (AppVersionInfo appVersionInfo : list) { + map.put(appVersionInfo.getAppName(), appVersionInfo.getVersions()); + } + } + return map; + } + + /** + * 查询所有版本号 + * @param pidList 用户所属项目ID + * @return 所有版本号 + */ + public List selectAllVersions(List pidList) { + return appInfoDao.selectAllVersions(pidList); + } + + /** + * 查询所有项目 + * @param pidList 用户所属项目ID + * @return + */ + public List selectAllProjects(List pidList) { + return projectMapper.selectList(Condition.create().in("id", pidList)); + } + + /** + * 查询所有网点 + * @param pidList 用户所属项目ID + * @return + */ + public List selectAllLocations(List pidList) { + return appInfoDao.selectAllLocations(pidList); + } + + /** + * 根据网点列表查询Pos机 + * @param locations + * @return + */ + public List selectPosListByLocations(List locations) { + return appInfoDao.selectPosListByLocations(locations); + } + + /** + * 分页查询 + * @param page + * @param searchApp + * @return + */ + public List searchList(Page page, SearchApp searchApp) { + List list = appInfoDao.searchList(page, searchApp); + for (AppInfo appInfo : list) { + appInfo.buildTable(); + appInfo.setDownloadUrl(myProperties.getFilesUrlPrefix() + + appInfo.getName() + "_" + appInfo.getVersion() + ".apk"); + } + return list; + } + + /** + * 灰度发布查询 + * @return + */ + public List grayList(Integer appId) { + return appInfoDao.grayList(appId); + } + + /** + * 根据imei查询POS + * @param imei + * @return + */ + public Pos selectByImei(String imei) { + Pos p = new Pos(); + p.setImei(imei); + return posMapper.selectOne(p); + } + + /** + * 全网发布 + * @param appId + */ + public void publishAll(Integer appId) { + // 先删除灰度发布记录 + appPublishMapper.delete(Condition.create().eq("app_id", appId)); + // 然后更新App + App app = new App(); + app.setPublishRange(1); + app.setUpdatedTime(new Date()); + app.setId(appId); + appInfoDao.updateById(app); + } + + /** + * 用户发布权限检查 + * @param userId 登录用户ID + * @param applicationId 应用ID + * @return 是否有权限发布 + */ + public boolean checkUserPublishPermission(Integer userId, String applicationId) { + return appInfoDao.countUserPermission(userId, applicationId) > 0; + } + + /** + * 检查版本号的合法性,只能升版本发布 + * @param applicationId APP唯一标识 + * @param version 版本号 + * @return 版本号是否更高 + */ + public boolean checkAppVersion(String applicationId, String version) { + // 先检查是否存在至少一个APP记录 + int appCount = appInfoDao.selectCount(Condition.create().eq("application_id", applicationId)); + if (appCount == 0) { + return true; + } + App nowApp = appInfoDao.selectNowVersionApp(applicationId); + if (nowApp == null) { + throw new NullPointerException(); + } + return CommonUtil.isNewer(version, nowApp.getVersion()); + } + + + /** + * 添加新版本 + */ + public void addVersion(PublishParam param, ManagerInfo manager) { + // 通过application Id获取Project + Project p = new Project(); + p.setApplicationId(param.getApplicationId()); + Project project = projectMapper.selectOne(p); + // 新建APP + App app = new App(); + app.setName(param.getName()); + app.setVersion(param.getVersion()); + app.setApplicationId(param.getApplicationId()); + app.setProjectId(project.getId()); + app.setTips(param.getTips()); + Date now = new Date(); + app.setPublishtime(now); + app.setPublishRange(param.getPublishRange()); + app.setOperatorId(manager.getId()); + appInfoDao.insert(app); + + // 如果是灰度发布,则更新APP发布表 + if (param.getPublishRange() == 2 && StringUtils.isNotEmpty(param.getGrayIds())) { + String grayIds = param.getGrayIds(); + for (String posId : grayIds.split(",")) { + AppPublish appPublish = new AppPublish(); + appPublish.setAppId(app.getId()); + appPublish.setPosId(Integer.valueOf(posId)); + appPublishMapper.insert(appPublish); + } + } + } + + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/service/DeviceService.java b/app-manage/src/main/java/com/enzhico/pos/service/DeviceService.java new file mode 100644 index 0000000..3585069 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/service/DeviceService.java @@ -0,0 +1,149 @@ +package com.enzhico.pos.service; + +import com.baomidou.mybatisplus.mapper.Condition; +import com.baomidou.mybatisplus.plugins.Page; +import com.enzhico.pos.async.AsyncException; +import com.enzhico.pos.async.AsyncTask; +import com.enzhico.pos.common.dao.entity.Pos; +import com.enzhico.pos.common.dao.entity.PosHistory; +import com.enzhico.pos.common.dao.entity.Project; +import com.enzhico.pos.common.dao.repository.PosHistoryMapper; +import com.enzhico.pos.common.dao.repository.ProjectMapper; +import com.enzhico.pos.config.properties.MyProperties; +import com.enzhico.pos.dao.entity.ManagerInfo; +import com.enzhico.pos.dao.entity.PosInfo; +import com.enzhico.pos.dao.entity.SearchPos; +import com.enzhico.pos.dao.repository.PosInfoDao; +import com.enzhico.pos.http.HttpBaseResponse; +import com.enzhico.pos.http.LoginParam; +import com.enzhico.pos.http.TokenRequestInterceptor; +import com.enzhico.pos.http.UnbindParam; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.http.MediaType; +import org.springframework.http.RequestEntity; +import org.springframework.http.ResponseEntity; +import org.springframework.scheduling.annotation.Async; +import org.springframework.stereotype.Service; +import org.springframework.web.client.RestTemplate; + +import javax.annotation.Resource; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.Collections; +import java.util.Date; +import java.util.List; + +/** + * 机具管理Service + */ + +@Service +public class DeviceService { + + private static final Logger logger = LoggerFactory.getLogger(DeviceService.class); + + @Resource + private PosInfoDao posInfoDao; + @Resource + private ProjectMapper projectMapper; + @Resource + private PosHistoryMapper posHistoryMapper; + @Resource + private AsyncTask asyncTask; + + /** + * 所有项目列表 + * + * @return 查询到的所有项目列表 + */ + public List allProjects(List pidList) { + return projectMapper.selectList(Condition.create().in("id", pidList)); + } + + /** + * 分页查询 + * + * @param page 分页参数 + * @param searchPos 查询条件 + * @return 分页结果 + */ + public List searchList(Page page, SearchPos searchPos) { + List list = posInfoDao.searchList(page, searchPos); + for (PosInfo posInfo : list) { + posInfo.buildTable(); + } + return list; + } + + /** + * 查询机具详情 + * + * @param id 机具ID + * @return 查询的POS详情 + */ + public PosInfo searchDetail(Integer id) { + PosInfo posInfo = posInfoDao.searchDetail(id); + posInfo.buildTable(); + return posInfo; + } + + /** + * 更新机具状态 + * + * @param id 机具ID + * @param state 状态值 + * @return 更新结果 + */ + public int updateState(Integer id, Integer state) { + Pos pos = new Pos(); + pos.setId(id); + pos.setPosState(state); + pos.setUpdatedTime(new Date()); + return posInfoDao.updateById(pos); + } + + /** + * 解除绑定 + * + * @param id pos机的ID + * @return 解绑结果 + */ + public int unbind(Integer id, ManagerInfo managerInfo) { + Date now = new Date(); + Pos pos = posInfoDao.selectById(id); + // 先保存网点 + String location = pos.getLocation(); + pos.setLocation(""); + pos.setUpdatedTime(now); + posInfoDao.updateById(pos); + + // 解绑之后更新绑定历史 + PosHistory posHistory = posInfoDao.selectLastHistory(id, location); + if (posHistory != null) { + posHistory.setUnbindtime(now); + posHistory.setUpdatedTime(now); + posHistoryMapper.updateById(posHistory); + } + + // 开始异步推送消息 + asyncTask.pushUnbindMsg(managerInfo, pos, location); + + return 1; + } + + + + /** + * 查询pos绑定历史列表 + * + * @param posId 机具ID + * @return 绑定历史列表,按照绑定事件倒叙排列 + */ + public List selectHisotryList(Integer posId) { + return posHistoryMapper.selectList(Condition.create().eq("pos_id", posId).orderBy("bindtime", false)); + } + + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/service/ManagerInfoService.java b/app-manage/src/main/java/com/enzhico/pos/service/ManagerInfoService.java new file mode 100644 index 0000000..6238cdf --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/service/ManagerInfoService.java @@ -0,0 +1,193 @@ +package com.enzhico.pos.service; + +import com.baomidou.mybatisplus.mapper.Condition; +import com.baomidou.mybatisplus.plugins.Page; +import com.enzhico.pos.common.dao.entity.Manager; +import com.enzhico.pos.common.dao.entity.Project; +import com.enzhico.pos.common.dao.entity.ProjectUser; +import com.enzhico.pos.common.dao.repository.ProjectMapper; +import com.enzhico.pos.common.dao.repository.ProjectUserMapper; +import com.enzhico.pos.dao.entity.ManagerInfo; +import com.enzhico.pos.dao.entity.SearchUser; +import com.enzhico.pos.dao.repository.ManagerInfoDao; +import com.enzhico.pos.exception.ForbiddenUserException; +import com.enzhico.pos.shiro.ShiroKit; +import org.apache.commons.lang3.StringUtils; +import org.apache.shiro.authc.UnknownAccountException; +import org.apache.shiro.crypto.hash.SimpleHash; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.*; + +/** + * 后台用户管理 + */ + +@Service +public class ManagerInfoService { + + @Resource + private ManagerInfoDao managerInfoDao; + @Resource + private ProjectMapper projectMapper; + @Resource + private ProjectUserMapper projectUserMapper; + + /** + * 通过名称查找用户 + * @param username + * @return + */ + public ManagerInfo findByUsername(String username) { + ManagerInfo managerInfo = managerInfoDao.findByUsername(username); + if (managerInfo == null) { + throw new UnknownAccountException(); + } + if (managerInfo.getState() == 2) { + throw new ForbiddenUserException(); + } + if (managerInfo.getPidsList() == null) { + managerInfo.setPidsList(Collections.singletonList(0)); + } else if (managerInfo.getPidsList().size() == 0) { + managerInfo.getPidsList().add(0); + } + return managerInfo; + } + + /** + * 检查用户名重复 + * @param username + * @return + */ + public int checkUsername(String username) { + return managerInfoDao.selectCount(Condition.create().eq("username", username)); + } + + /** + * 通过ID查找用户 + * @param id + * @return + */ + public ManagerInfo selectUser(Integer id) { + ManagerInfo managerInfo = managerInfoDao.selectUser(id); + List li = new ArrayList<>(); + if (StringUtils.isNotEmpty(managerInfo.getPids())) { + for (String s : managerInfo.getPids().split(",")) { + li.add(Integer.parseInt(s)); + } + } + managerInfo.setPidsList(li); + return managerInfo; + } + + /** + * 所有项目列表 + * @return + */ + public List allProjects() { + return projectMapper.selectList(null); + } + + /** + * 执行添加用户 + * @param manager + * @return + */ + public int addUser(ManagerInfo manager) { + String salt = ShiroKit.getRandomSalt(16); + //进行散列 + SimpleHash hash = new SimpleHash("md5", "12345678", manager.getUsername() + salt, 2); + manager.setSalt(salt); + manager.setPassword(hash.toHex()); + managerInfoDao.insert(manager); + + // 更新项目用户关联表 + if (StringUtils.isNotEmpty(manager.getPids())) { + for (String pid : manager.getPids().split(",")) { + ProjectUser projectUser = new ProjectUser(); + projectUser.setUserId(manager.getId()); + projectUser.setProjectId(Integer.valueOf(pid)); + projectUserMapper.insert(projectUser); + } + } + return 1; + } + + /** + * 执行更新用户 + * @param manager + * @return + */ + public int editUser(ManagerInfo manager) { + managerInfoDao.updateById(manager); + // 更新项目用户关联表 + if (StringUtils.isNotEmpty(manager.getPids())) { + // 先把该用户的项目关联删了 + projectUserMapper.delete(Condition.create().eq("user_id", manager.getId())); + // 然后插入选择的项目关系 + for (String pid : manager.getPids().split(",")) { + ProjectUser projectUser = new ProjectUser(); + projectUser.setUserId(manager.getId()); + projectUser.setProjectId(Integer.valueOf(pid)); + projectUserMapper.insert(projectUser); + } + } + return 1; + } + + /** + * 执行重置密码 + * @param id 用户ID + * @return + */ + public int resetPassword(Integer id, String username) { + String salt = ShiroKit.getRandomSalt(16); + //进行散列 + SimpleHash hash = new SimpleHash("md5", "12345678", username + salt, 2); + String password = hash.toHex(); + Manager p = new Manager(); + p.setId(id); + p.setPassword(password); + p.setSalt(salt); + p.setUpdatedTime(new Date()); + return managerInfoDao.updateById(p); + } + + /** + * 执行删除用户 + * @param id 用户ID + * @return + */ + public int deleteUer(Integer id) { + return managerInfoDao.deleteById(id); + } + + /** + * 修改密码 + * @param username 用户名 + * @param password 加密后的密码 + * @return result + */ + public int updatePassword(String username, String password) { + Manager v = new Manager(); + v.setPassword(password); + v.setUpdatedTime(new Date()); + return managerInfoDao.update(v, Condition.create().eq("username", username)); + } + + /** + * 分页查询用户 + * @param page + * @param searchUser + * @return + */ + public List searchUsers(Page page, SearchUser searchUser) { + List list = managerInfoDao.selectUsers(page, searchUser); + for (ManagerInfo managerInfo : list) { + managerInfo.buildTable(); + } + return list; + } + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/service/MonitorService.java b/app-manage/src/main/java/com/enzhico/pos/service/MonitorService.java new file mode 100644 index 0000000..3a3c46d --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/service/MonitorService.java @@ -0,0 +1,95 @@ +package com.enzhico.pos.service; + +import com.baomidou.mybatisplus.mapper.Condition; +import com.baomidou.mybatisplus.plugins.Page; +import com.enzhico.pos.common.dao.entity.Project; +import com.enzhico.pos.common.dao.repository.ProjectMapper; +import com.enzhico.pos.common.util.DateUtil; +import com.enzhico.pos.config.properties.MyProperties; +import com.enzhico.pos.dao.entity.*; +import com.enzhico.pos.dao.repository.PosInfoDao; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +/** + * 监控管理Service + */ + +@Service +public class MonitorService { + + @Resource + private ProjectMapper projectMapper; + @Resource + private PosInfoDao posInfoDao; + @Resource + private MyProperties myProperties; + + /** + * 查询所有项目 + * @return + */ + public List selectAllProjects(List pidList) { + return projectMapper.selectList(Condition.create().in("id", pidList)); + } + + /** + * 入网机具总数 + * @return + */ + public int posCount(Integer projectId, List pidList) { + if (projectId != 0) { + return posInfoDao.selectCount( + Condition.create().eq("project_id", projectId).ne("location", "")); + } + return posInfoDao.selectCount(Condition.create().ne("location", "").in("project_id", pidList)); + } + + /** + * 布放网点数 + * @param projectId + * @return + */ + public int locationCount(Integer projectId, List pidList) { + return posInfoDao.searchLocationCount(projectId, pidList); + } + + /** + * 分页查询,以网点分组 + * @param page + * @param searchPos + * @return + */ + public List searchListGroupByLocation(Page page, SearchPos searchPos) { + List list = posInfoDao.searchListGroupByLocation(page, searchPos); + return list; + } + + /** + * 网点详细页面分页查询 + * @param page + * @param searchMonitor + * @return + */ + public List searchLocationMonitorList(Page page, SearchMonitor searchMonitor) { + List list = posInfoDao.selectPosMonitorList(page, searchMonitor); + if (list != null) { + for (MonitorInfo monitorInfo : list) { + monitorInfo.buildTable(); + } + } + return list; + } + + /** + * 定期更新在线状态 + */ + public void updateOnlineState() { + posInfoDao.updateOnlineState(DateUtil.offsiteDate(new Date(), Calendar.MINUTE, -10)); + } + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/service/ProjectService.java b/app-manage/src/main/java/com/enzhico/pos/service/ProjectService.java new file mode 100644 index 0000000..4b656b8 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/service/ProjectService.java @@ -0,0 +1,94 @@ +package com.enzhico.pos.service; + +import com.baomidou.mybatisplus.mapper.Condition; +import com.enzhico.pos.common.dao.entity.App; +import com.enzhico.pos.common.dao.entity.Pos; +import com.enzhico.pos.common.dao.entity.Project; +import com.enzhico.pos.common.dao.entity.ProjectUser; +import com.enzhico.pos.common.dao.repository.AppMapper; +import com.enzhico.pos.common.dao.repository.PosMapper; +import com.enzhico.pos.common.dao.repository.ProjectMapper; +import com.enzhico.pos.common.dao.repository.ProjectUserMapper; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.Date; +import java.util.List; + +/** + * 项目管理Service + */ + +@Service +public class ProjectService { + + @Resource + private ProjectMapper projectMapper; + + @Resource + private ProjectUserMapper projectUserMapper; + + @Resource + protected PosMapper posMapper; + + @Resource + private AppMapper appMapper; + + /** + * 查询所有项目的数量 + * @return 项目的数量 + */ + public int selectProjectNum() { + return projectMapper.selectCount(null); + } + + /** + * 查询该项目下所有用户数量 + * @return + */ + public int selectUsersByPrjectId(Integer projectId) { + return projectUserMapper.selectCount(Condition.create().eq("project_id", projectId)); + } + + /** + * 查询所有项目 + * @return 所有项目 + */ + public List selectAll() { + return projectMapper.selectList(null); + } + + /** + * 添加项目 + * @param project 项目 + * @return 结果 + */ + public int add(Project project) { + return projectMapper.insert(project); + } + + /** + * 删除项目 + * @param id 项目ID + * @return 结果 + */ + public int delete(Integer id) { + // 先删项目表 + projectMapper.deleteById(id); + // 删项目用户关联表记录 + projectUserMapper.delete(Condition.create().eq("project_id", id)); + // 更新pos机记录 + Pos pos = new Pos(); + pos.setProjectId(0); + Date now = new Date(); + pos.setUpdatedTime(now); + posMapper.update(pos, Condition.create().eq("project_id", id)); + // 更新App表记录 + App app = new App(); + app.setProjectId(0); + app.setUpdatedTime(now); + appMapper.update(app, Condition.create().eq("project_id", id)); + return 1; + } + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/shiro/CaptchaUsernamePasswordToken.java b/app-manage/src/main/java/com/enzhico/pos/shiro/CaptchaUsernamePasswordToken.java new file mode 100644 index 0000000..39922a7 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/shiro/CaptchaUsernamePasswordToken.java @@ -0,0 +1,29 @@ +package com.enzhico.pos.shiro; + +import org.apache.shiro.authc.UsernamePasswordToken; + +/** + * Description : 拓展登陆验证字段 + */ +public class CaptchaUsernamePasswordToken extends UsernamePasswordToken { + + private static final long serialVersionUID = 1L; + + //验证码字符串 + private String captcha; + + public CaptchaUsernamePasswordToken(String username, char[] password, + boolean rememberMe, String host, String captcha) { + super(username, password, rememberMe, host); + this.captcha = captcha; + } + + public String getCaptcha() { + return captcha; + } + + public void setCaptcha(String captcha) { + this.captcha = captcha; + } + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/shiro/IncorrectCaptchaException.java b/app-manage/src/main/java/com/enzhico/pos/shiro/IncorrectCaptchaException.java new file mode 100644 index 0000000..568d9ec --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/shiro/IncorrectCaptchaException.java @@ -0,0 +1,28 @@ +package com.enzhico.pos.shiro; + +import org.apache.shiro.authc.AuthenticationException; + +/** + * Description : 验证码错误异常 + */ +public class IncorrectCaptchaException extends AuthenticationException { + + private static final long serialVersionUID = 1L; + + public IncorrectCaptchaException() { + super(); + } + + public IncorrectCaptchaException(String message, Throwable cause) { + super(message, cause); + } + + public IncorrectCaptchaException(String message) { + super(message); + } + + public IncorrectCaptchaException(Throwable cause) { + super(cause); + } + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/shiro/KaptchaFilter.java b/app-manage/src/main/java/com/enzhico/pos/shiro/KaptchaFilter.java new file mode 100644 index 0000000..efe9144 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/shiro/KaptchaFilter.java @@ -0,0 +1,107 @@ +package com.enzhico.pos.shiro; + +import com.enzhico.pos.dao.entity.ManagerInfo; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.AuthenticationToken; +import org.apache.shiro.subject.Subject; +import org.apache.shiro.web.filter.authc.FormAuthenticationFilter; +import org.apache.shiro.web.util.WebUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.http.HttpServletRequest; + +/** + * Description: 验证码过滤器此过滤器已经在shiro中配置,这里不需要再次配置拦截路径 + */ +public class KaptchaFilter extends FormAuthenticationFilter { + + public static final String DEFAULT_CAPTCHA_PARAM = "captcha"; + + private String captchaParam = DEFAULT_CAPTCHA_PARAM; + + private static final Logger _logger = LoggerFactory.getLogger(KaptchaFilter.class); + + //登录验证 + @Override + protected boolean executeLogin(ServletRequest request, ServletResponse response) + throws Exception { + + CaptchaUsernamePasswordToken token = createToken(request, response); + try { + _logger.info("KaptchaFilter.executeLogin"); + /*图形验证码验证*/ + doCaptchaValidate((HttpServletRequest) request, token); + Subject subject = getSubject(request, response); + subject.login(token);//正常验证 + + //到这里就算验证成功了,把用户信息放到session中 + ManagerInfo user = ShiroKit.getUser(); + ((HttpServletRequest) request).getSession().setAttribute("user", user); + + return onLoginSuccess(token, subject, request, response); + + } catch (AuthenticationException e) { + return onLoginFailure(token, e, request, response); + } + } + + @Override + protected boolean onLoginSuccess(AuthenticationToken token, Subject subject, + ServletRequest request, ServletResponse response) throws Exception { + issueSuccessRedirect(request, response); + //we handled the success redirect directly, prevent the chain from continuing: + return false; + } + + protected void issueSuccessRedirect(ServletRequest request, ServletResponse response) throws Exception { + WebUtils.issueRedirect(request, response, "/", null, true); + } + + // 验证码校验 + protected void doCaptchaValidate(HttpServletRequest request, CaptchaUsernamePasswordToken token) { + _logger.info("KaptchaFilter.doCaptchaValidate"); + //session中的图形码字符串 + String captcha = (String) request.getSession().getAttribute( + com.google.code.kaptcha.Constants.KAPTCHA_SESSION_KEY); + _logger.info("session中的图形码字符串:" + captcha); + + //比对 + if (captcha == null || !captcha.equalsIgnoreCase(token.getCaptcha())) { + throw new IncorrectCaptchaException(); + } + } + + @Override + protected CaptchaUsernamePasswordToken createToken(ServletRequest request, ServletResponse response) { + + String username = getUsername(request); + String password = getPassword(request); + String captcha = getCaptcha(request); + boolean rememberMe = isRememberMe(request); + String host = getHost(request); + + return new CaptchaUsernamePasswordToken(username, password.toCharArray(), rememberMe, host, captcha); + } + + public String getCaptchaParam() { + return captchaParam; + } + + public void setCaptchaParam(String captchaParam) { + this.captchaParam = captchaParam; + } + + protected String getCaptcha(ServletRequest request) { + return WebUtils.getCleanParam(request, getCaptchaParam()); + } + + //保存异常对象到request + @Override + protected void setFailureAttribute(ServletRequest request, AuthenticationException ae) { + request.setAttribute(getFailureKeyAttribute(), ae); + } + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/shiro/MyExceptionResolver.java b/app-manage/src/main/java/com/enzhico/pos/shiro/MyExceptionResolver.java new file mode 100644 index 0000000..ddb728b --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/shiro/MyExceptionResolver.java @@ -0,0 +1,24 @@ +package com.enzhico.pos.shiro; + +import org.apache.shiro.authz.UnauthorizedException; +import org.springframework.web.servlet.HandlerExceptionResolver; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * Description : 自定义异常处理类 + */ +public class MyExceptionResolver implements HandlerExceptionResolver { + + @Override + public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { + //如果是shiro无权操作,因为shiro 在操作auno等一部分不进行转发至无权限url + if (ex instanceof UnauthorizedException) { + return new ModelAndView("error/shiro_403"); + } + return null; + } + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/shiro/MyShiroRealm.java b/app-manage/src/main/java/com/enzhico/pos/shiro/MyShiroRealm.java new file mode 100644 index 0000000..e1711a6 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/shiro/MyShiroRealm.java @@ -0,0 +1,126 @@ +package com.enzhico.pos.shiro; + +import com.enzhico.pos.common.dao.entity.Permission; +import com.enzhico.pos.service.ManagerInfoService; +import com.enzhico.pos.dao.entity.ManagerInfo; +import com.enzhico.pos.dao.entity.SysRole; +import org.apache.shiro.authc.AuthenticationException; +import org.apache.shiro.authc.AuthenticationInfo; +import org.apache.shiro.authc.AuthenticationToken; +import org.apache.shiro.authc.SimpleAuthenticationInfo; +import org.apache.shiro.authc.credential.CredentialsMatcher; +import org.apache.shiro.authc.credential.HashedCredentialsMatcher; +import org.apache.shiro.authz.AuthorizationInfo; +import org.apache.shiro.authz.SimpleAuthorizationInfo; +import org.apache.shiro.realm.AuthorizingRealm; +import org.apache.shiro.subject.PrincipalCollection; +import org.apache.shiro.util.ByteSource; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * Description : 身份校验核心类 + */ + +public class MyShiroRealm extends AuthorizingRealm { + + private static final Logger _logger = LoggerFactory.getLogger(MyShiroRealm.class); + + @Autowired + ManagerInfoService managerInfoService; + + /** + * 认证信息.(身份验证) + * Authentication 是用来验证用户身份 + * + * @param token + * @return + * @throws AuthenticationException + */ + @Override + protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) + throws AuthenticationException { + + _logger.info("MyShiroRealm.doGetAuthenticationInfo()"); + + //获取用户的输入的账号. + String username = (String) token.getPrincipal(); + //_logger.info("用户的账号:"+username); + + //通过username从数据库中查找 ManagerInfo对象 + //实际项目中,这里可以根据实际情况做缓存,如果不做,Shiro自己也是有时间间隔机制,2分钟内不会重复执行该方法 + ManagerInfo managerInfo = managerInfoService.findByUsername(username); + + if (managerInfo == null) { + return null; + } + + //交给AuthenticatingRealm使用CredentialsMatcher进行密码匹配,如果觉得人家的不好可以自定义实现 + SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo( + managerInfo, //用户 + managerInfo.getPassword(), //密码 + ByteSource.Util.bytes(managerInfo.getCredentialsSalt()),//salt=username+salt + getName() //realm name + ); + + //明文: 若存在,将此用户存放到登录认证info中,无需自己做密码对比,Shiro会为我们进行密码对比校验 +// SimpleAuthenticationInfo authenticationInfo = new SimpleAuthenticationInfo( +// managerInfo, //用户名 +// managerInfo.getPassword(), //密码 +// getName() //realm name +// ); + return authenticationInfo; + } + + /** + * 此方法调用hasRole,hasPermission的时候才会进行回调. + *

    + * 权限信息.(授权): + * 1、如果用户正常退出,缓存自动清空; + * 2、如果用户非正常退出,缓存自动清空; + * 3、如果我们修改了用户的权限,而用户不退出系统,修改的权限无法立即生效。 + * (需要手动编程进行实现;放在service进行调用) + * 在权限修改后调用realm中的方法,realm已经由spring管理,所以从spring中获取realm实例,调用clearCached方法; + * :Authorization 是授权访问控制,用于对用户进行的操作授权,证明该用户是否允许进行当前操作,如访问某个链接,某个资源文件等。 + * + * @param principals + * @return + */ + @Override + protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { + /* + * 当没有使用缓存的时候,不断刷新页面的话,这个代码会不断执行, + * 当其实没有必要每次都重新设置权限信息,所以我们需要放到缓存中进行管理; + * 当放到缓存中时,这样的话,doGetAuthorizationInfo就只会执行一次了, + * 缓存过期之后会再次执行。 + */ + _logger.info("权限配置-->MyShiroRealm.doGetAuthorizationInfo()"); + SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); + ManagerInfo managerInfo = (ManagerInfo) principals.getPrimaryPrincipal(); + + //设置相应角色的权限信息 + for (SysRole role : managerInfo.getRoles()) { + //设置角色 + authorizationInfo.addRole(role.getRole()); + for (Permission p : role.getPermissions()) { + //设置权限 + authorizationInfo.addStringPermission(p.getPermission()); + } + } + + return authorizationInfo; + } + + /** + * 设置认证加密方式 + */ + @Override + public void setCredentialsMatcher(CredentialsMatcher credentialsMatcher) { + HashedCredentialsMatcher md5CredentialsMatcher = new HashedCredentialsMatcher(); + md5CredentialsMatcher.setHashAlgorithmName(ShiroKit.HASH_ALGORITHM_NAME); + md5CredentialsMatcher.setHashIterations(ShiroKit.HASH_ITERATIONS); + super.setCredentialsMatcher(md5CredentialsMatcher); + } + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/shiro/RoleFilter.java b/app-manage/src/main/java/com/enzhico/pos/shiro/RoleFilter.java new file mode 100644 index 0000000..b23983b --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/shiro/RoleFilter.java @@ -0,0 +1,32 @@ +package com.enzhico.pos.shiro; + +import org.apache.shiro.subject.Subject; +import org.apache.shiro.web.filter.authz.RolesAuthorizationFilter; + +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import java.io.IOException; + +/** + * Description : 角色过滤器,为了实现or的效果就使用这个过滤器,shiro默认是and的效果 + */ +public class RoleFilter extends RolesAuthorizationFilter { + + public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) + throws IOException { + + Subject subject = getSubject(request, response); + String[] rolesArray = (String[]) mappedValue; + + if (rolesArray == null || rolesArray.length == 0) { + return true; + } + for (int i = 0; i < rolesArray.length; i++) { + if (subject.hasRole(rolesArray[i])) { + return true; + } + } + return false; + } + +} diff --git a/app-manage/src/main/java/com/enzhico/pos/shiro/ShiroKit.java b/app-manage/src/main/java/com/enzhico/pos/shiro/ShiroKit.java new file mode 100644 index 0000000..310d732 --- /dev/null +++ b/app-manage/src/main/java/com/enzhico/pos/shiro/ShiroKit.java @@ -0,0 +1,252 @@ +/** + * Copyright (c) 2015-2017, Chill Zhuang 庄骞 (smallchill@163.com). + *

    + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + *

    + * http://www.apache.org/licenses/LICENSE-2.0 + *

    + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.enzhico.pos.shiro; + +import com.enzhico.pos.dao.entity.ManagerInfo; +import org.apache.shiro.SecurityUtils; +import org.apache.shiro.crypto.SecureRandomNumberGenerator; +import org.apache.shiro.crypto.hash.SimpleHash; +import org.apache.shiro.session.Session; +import org.apache.shiro.subject.Subject; + +/** + * shiro工具类 + * + * @author dafei, Chill Zhuang + */ +public class ShiroKit { + + private static final String NAMES_DELIMETER = ","; + + /** + * 散列算法 + */ + public final static String HASH_ALGORITHM_NAME = "MD5"; + + /** + * 循环次数 + */ + public final static int HASH_ITERATIONS = 2; + + /** + * shiro密码加密工具类 + * + * @param credentials 密码 + * @param saltSource 密码盐 + * @return + */ + public static String md5(String credentials, String saltSource) { + return new SimpleHash(HASH_ALGORITHM_NAME, credentials, saltSource, HASH_ITERATIONS).toHex(); + } + + /** + * 获取随机盐值 + * + * @param length 字节长度,一个字节2位16进制数表示 + * @return + */ + public static String getRandomSalt(int length) { + return new SecureRandomNumberGenerator().nextBytes(length).toHex(); + } + + /** + * 获取当前 Subject + * + * @return Subject + */ + public static Subject getSubject() { + return SecurityUtils.getSubject(); + } + + /** + * 获取封装的 ShiroUser + * + * @return ShiroUser + */ + public static ManagerInfo getUser() { + if (isGuest()) { + return null; + } else { + return (ManagerInfo) getSubject().getPrincipals().getPrimaryPrincipal(); + } + } + + /** + * 从shiro获取session + */ + public static Session getSession() { + return getSubject().getSession(); + } + + /** + * 获取shiro指定的sessionKey + */ + @SuppressWarnings("unchecked") + public static T getSessionAttr(String key) { + Session session = getSession(); + return session != null ? (T) session.getAttribute(key) : null; + } + + /** + * 设置shiro指定的sessionKey + */ + public static void setSessionAttr(String key, Object value) { + Session session = getSession(); + session.setAttribute(key, value); + } + + /** + * 移除shiro指定的sessionKey + */ + public static void removeSessionAttr(String key) { + Session session = getSession(); + if (session != null) + session.removeAttribute(key); + } + + /** + * 验证当前用户是否属于该角色?,使用时与lacksRole 搭配使用 + * + * @param roleName 角色名 + * @return 属于该角色:true,否则false + */ + public static boolean hasRole(String roleName) { + return getSubject() != null && roleName != null + && roleName.length() > 0 && getSubject().hasRole(roleName); + } + + /** + * 与hasRole标签逻辑相反,当用户不属于该角色时验证通过。 + * + * @param roleName 角色名 + * @return 不属于该角色:true,否则false + */ + public static boolean lacksRole(String roleName) { + return !hasRole(roleName); + } + + /** + * 验证当前用户是否属于以下任意一个角色。 + * + * @param roleNames 角色列表 + * @return 属于:true,否则false + */ + public static boolean hasAnyRoles(String roleNames) { + boolean hasAnyRole = false; + Subject subject = getSubject(); + if (subject != null && roleNames != null && roleNames.length() > 0) { + for (String role : roleNames.split(NAMES_DELIMETER)) { + if (subject.hasRole(role.trim())) { + hasAnyRole = true; + break; + } + } + } + return hasAnyRole; + } + + /** + * 验证当前用户是否属于以下所有角色。 + * + * @param roleNames 角色列表 + * @return 属于:true,否则false + */ + public static boolean hasAllRoles(String roleNames) { + boolean hasAllRole = true; + Subject subject = getSubject(); + if (subject != null && roleNames != null && roleNames.length() > 0) { + for (String role : roleNames.split(NAMES_DELIMETER)) { + if (!subject.hasRole(role.trim())) { + hasAllRole = false; + break; + } + } + } + return hasAllRole; + } + + /** + * 验证当前用户是否拥有指定权限,使用时与lacksPermission 搭配使用 + * + * @param permission 权限名 + * @return 拥有权限:true,否则false + */ + public static boolean hasPermission(String permission) { + return getSubject() != null && permission != null + && permission.length() > 0 + && getSubject().isPermitted(permission); + } + + /** + * 与hasPermission标签逻辑相反,当前用户没有制定权限时,验证通过。 + * + * @param permission 权限名 + * @return 拥有权限:true,否则false + */ + public static boolean lacksPermission(String permission) { + return !hasPermission(permission); + } + + /** + * 已认证通过的用户,不包含已记住的用户,这是与user标签的区别所在。与notAuthenticated搭配使用 + * + * @return 通过身份验证:true,否则false + */ + public static boolean isAuthenticated() { + return getSubject() != null && getSubject().isAuthenticated(); + } + + /** + * 未认证通过用户,与authenticated标签相对应。与guest标签的区别是,该标签包含已记住用户。。 + * + * @return 没有通过身份验证:true,否则false + */ + public static boolean notAuthenticated() { + return !isAuthenticated(); + } + + /** + * 认证通过或已记住的用户。与guset搭配使用。 + * + * @return 用户:true,否则 false + */ + public static boolean isUser() { + return getSubject() != null && getSubject().getPrincipal() != null; + } + + /** + * 验证当前用户是否为“访客”,即未认证(包含未记住)的用户。用user搭配使用 + * + * @return 访客:true,否则false + */ + public static boolean isGuest() { + return !isUser(); + } + + /** + * 输出当前用户信息,通常为登录帐号信息。 + * + * @return 当前用户信息 + */ + public static String principal() { + if (getSubject() != null) { + Object principal = getSubject().getPrincipal(); + return principal.toString(); + } + return ""; + } + +} diff --git a/app-manage/src/main/resources/application.yml b/app-manage/src/main/resources/application.yml new file mode 100644 index 0000000..93291f8 --- /dev/null +++ b/app-manage/src/main/resources/application.yml @@ -0,0 +1,116 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## + +################### 自定义项目配置 ################### +enzhico: + kaptcha-open: true #是否开启登录时验证码 (true/false) + session-open: false #是否开启session验证 (true/false) + session-invalidate-time: 7200 #session失效时间 单位:秒 + session-validation-interval: 3600 #多久检测一次失效的session 单位:秒 + heartbeat-timeout: 10 # 机具心跳报告超时时间 单位:分钟 + +################### 项目启动端口 ################### +server.port: 8092 + +################### spring配置 ################### +spring: + profiles: + active: dev + thymeleaf: + mode: HTML + cache: false + mvc: + view: + prefix: /templates + http: + multipart: + max-request-size: 100MB #最大请求大小 + max-file-size: 100MB #最大文件大小 + +################### mybatis-plus配置 ################### +mybatis-plus: + mapper-locations: classpath*:com/enzhico/pos/dao/repository/mapping/*.xml + typeAliasesPackage: > + com.enzhico.pos.api.model, + com.enzhico.pos.dao.entity, + com.enzhico.pos.common.dao.entity + global-config: + id-type: 0 # 0:数据库ID自增 1:用户输入id 2:全局唯一id(IdWorker) 3:全局唯一ID(uuid) + db-column-underline: false + refresh-mapper: true + configuration: + map-underscore-to-camel-case: true + cache-enabled: true #配置的缓存的全局开关 + lazyLoadingEnabled: true #延时加载的开关 + multipleResultSetsEnabled: true #开启的话,延时加载一个属性时会加载该对象全部属性,否则按需加载属性 + +################### spring security配置 ################### +security: + ignored: /static/** + +logging: + level: + org.springframework.web.servlet: ERROR + +--- + +##################################################################### +######################## 开发环境profile ########################## +##################################################################### +spring: + profiles: dev + datasource: + url: jdbc:mysql://123.207.66.156:3306/pos?useSSL=false&autoReconnect=true&tinyInt1isBit=false&useUnicode=true&characterEncoding=utf8 + username: root + password: _EnZhi123 + thymeleaf: + cache: false + +################### 自定义项目配置 ################### +enzhico: + excel-path: E:/home/ + files-path: E:/home/ + files-url-prefix: https://show.enzhico.net/files/ # 文件访问URL前缀 + pics-path: E:/home/ + pics-url-prefix: https://show.enzhico.net/pics/ # 图片访问URL前缀 + posapi-url-prefix: http://123.207.66.156:9095 + +logging: + level: + ROOT: INFO + com: + enzhico: DEBUG + file: E:/logs/app-manage.log + +--- + +##################################################################### +######################## 测试环境profile ########################## +##################################################################### + +spring: + profiles: test + datasource: + url: jdbc:mysql://123.207.66.156:3306/pos?useSSL=false&autoReconnect=true&tinyInt1isBit=false&useUnicode=true&characterEncoding=utf8 + username: root + password: _EnZhi123 + thymeleaf: + cache: false + +################### 自定义项目配置 ################### +enzhico: + excel-path: /var/data/ + files-path: /usr/share/nginx/html/files/ + files-url-prefix: https://show.enzhico.net/files/ # 文件访问URL前缀 + pics-path: /usr/share/nginx/html/pics/ + pics-url-prefix: https://show.enzhico.net/pics/ # 图片访问URL前缀 +# posapi-url-prefix: http://posapi.enzhico.net + posapi-url-prefix: http://123.207.66.156:9095 + +logging: + level: + ROOT: INFO + com: + enzhico: DEBUG + file: /var/logs/app-manage.log diff --git a/app-manage/src/main/resources/banner.txt b/app-manage/src/main/resources/banner.txt new file mode 100644 index 0000000..859b78f --- /dev/null +++ b/app-manage/src/main/resources/banner.txt @@ -0,0 +1,23 @@ + + _____ _______ _____ _____ + /\ \ /::\ \ /\ \ /\ \ + /::\____\ /::::\ \ /::\____\ /::\ \ + /:::/ / /::::::\ \ /:::/ / /::::\ \ + /:::/ / /::::::::\ \ /:::/ / /::::::\ \ + /:::/ / /:::/~~\:::\ \ /:::/ / /:::/\:::\ \ + /:::/ / /:::/ \:::\ \ /:::/____/ /:::/__\:::\ \ + /:::/ / /:::/ / \:::\ \ |::| | /::::\ \:::\ \ + /:::/ / /:::/____/ \:::\____\ |::| | _____ /::::::\ \:::\ \ + /:::/ / |:::| | |:::| | |::| | /\ \ /:::/\:::\ \:::\ \ +/:::/____/ |:::|____| |:::| | |::| | /::\____\/:::/__\:::\ \:::\____\ +\:::\ \ \:::\ \ /:::/ / |::| | /:::/ /\:::\ \:::\ \::/ / + \:::\ \ \:::\ \ /:::/ / |::| | /:::/ / \:::\ \:::\ \/____/ + \:::\ \ \:::\ /:::/ / |::|____|/:::/ / \:::\ \:::\ \ + \:::\ \ \:::\__/:::/ / |:::::::::::/ / \:::\ \:::\____\ + \:::\ \ \::::::::/ / \::::::::::/____/ \:::\ \::/ / + \:::\ \ \::::::/ / ~~~~~~~~~~ \:::\ \/____/ + \:::\ \ \::::/ / \:::\ \ + \:::\____\ \::/____/ \:::\____\ + \::/ / ~~ \::/ / + \/____/ \/____/ + diff --git a/app-manage/src/main/resources/ehcache.xml b/app-manage/src/main/resources/ehcache.xml new file mode 100644 index 0000000..4c585ea --- /dev/null +++ b/app-manage/src/main/resources/ehcache.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + diff --git a/app-manage/src/main/resources/libs/AXMLPrinter-1.0.jar b/app-manage/src/main/resources/libs/AXMLPrinter-1.0.jar new file mode 100644 index 0000000..34c3e1b Binary files /dev/null and b/app-manage/src/main/resources/libs/AXMLPrinter-1.0.jar differ diff --git a/app-manage/src/main/resources/public/favicon.ico b/app-manage/src/main/resources/public/favicon.ico new file mode 100644 index 0000000..fe6cf7a Binary files /dev/null and b/app-manage/src/main/resources/public/favicon.ico differ diff --git a/app-manage/src/main/resources/public/static/css/404.css b/app-manage/src/main/resources/public/static/css/404.css new file mode 100644 index 0000000..b2fe0bc --- /dev/null +++ b/app-manage/src/main/resources/public/static/css/404.css @@ -0,0 +1,36 @@ +body, div { + margin: 0; + padding: 0; +} +body { + background: url("../img/error/error_bg.jpg") repeat-x scroll 0 0 #67ACE4; +} +#container { + margin: 0 auto; + padding-top: 50px; + text-align: center; + width: 560px; +} +#container img { + border: medium none; + margin-bottom: 50px; +} +#container .error { + height: 200px; + position: relative; +} +#container .error img { + bottom: -50px; + position: absolute; + right: -50px; +} +#container .msg { + margin-bottom: 65px; +} +#cloud { + background: url("../img/error/error_cloud.png") repeat-x scroll 0 0 transparent; + bottom: 0; + height: 170px; + position: absolute; + width: 100%; +} \ No newline at end of file diff --git a/app-manage/src/main/resources/public/static/css/animate.css b/app-manage/src/main/resources/public/static/css/animate.css new file mode 100644 index 0000000..b051d5f --- /dev/null +++ b/app-manage/src/main/resources/public/static/css/animate.css @@ -0,0 +1,2848 @@ +@charset "UTF-8"; + +/*! +Animate.css - http://daneden.me/animate +Licensed under the MIT license + +Copyright (c) 2013 Daniel Eden + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +*/ + +.animated { + -webkit-animation-duration: 1s; + animation-duration: 1s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; + z-index: 100; +} + +.animated.infinite { + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite; +} + +.animated.hinge { + -webkit-animation-duration: 2s; + animation-duration: 2s; +} + +@-webkit-keyframes bounce { + 0%, 20%, 50%, 80%, 100% { + -webkit-transform: translateY(0); + transform: translateY(0); + } + + 40% { + -webkit-transform: translateY(-30px); + transform: translateY(-30px); + } + + 60% { + -webkit-transform: translateY(-15px); + transform: translateY(-15px); + } +} + +@keyframes bounce { + 0%, 20%, 50%, 80%, 100% { + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } + + 40% { + -webkit-transform: translateY(-30px); + -ms-transform: translateY(-30px); + transform: translateY(-30px); + } + + 60% { + -webkit-transform: translateY(-15px); + -ms-transform: translateY(-15px); + transform: translateY(-15px); + } +} + +.bounce { + -webkit-animation-name: bounce; + animation-name: bounce; +} + +@-webkit-keyframes flash { + 0%, 50%, 100% { + opacity: 1; + } + + 25%, 75% { + opacity: 0; + } +} + +@keyframes flash { + 0%, 50%, 100% { + opacity: 1; + } + + 25%, 75% { + opacity: 0; + } +} + +.flash { + -webkit-animation-name: flash; + animation-name: flash; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes pulse { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + } + + 50% { + -webkit-transform: scale(1.1); + transform: scale(1.1); + } + + 100% { + -webkit-transform: scale(1); + transform: scale(1); + } +} + +@keyframes pulse { + 0% { + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + + 50% { + -webkit-transform: scale(1.1); + -ms-transform: scale(1.1); + transform: scale(1.1); + } + + 100% { + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} + +.pulse { + -webkit-animation-name: pulse; + animation-name: pulse; +} + +@-webkit-keyframes rubberBand { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + } + + 30% { + -webkit-transform: scaleX(1.25) scaleY(0.75); + transform: scaleX(1.25) scaleY(0.75); + } + + 40% { + -webkit-transform: scaleX(0.75) scaleY(1.25); + transform: scaleX(0.75) scaleY(1.25); + } + + 60% { + -webkit-transform: scaleX(1.15) scaleY(0.85); + transform: scaleX(1.15) scaleY(0.85); + } + + 100% { + -webkit-transform: scale(1); + transform: scale(1); + } +} + +@keyframes rubberBand { + 0% { + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + + 30% { + -webkit-transform: scaleX(1.25) scaleY(0.75); + -ms-transform: scaleX(1.25) scaleY(0.75); + transform: scaleX(1.25) scaleY(0.75); + } + + 40% { + -webkit-transform: scaleX(0.75) scaleY(1.25); + -ms-transform: scaleX(0.75) scaleY(1.25); + transform: scaleX(0.75) scaleY(1.25); + } + + 60% { + -webkit-transform: scaleX(1.15) scaleY(0.85); + -ms-transform: scaleX(1.15) scaleY(0.85); + transform: scaleX(1.15) scaleY(0.85); + } + + 100% { + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} + +.rubberBand { + -webkit-animation-name: rubberBand; + animation-name: rubberBand; +} + +@-webkit-keyframes shake { + 0%, 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 10%, 30%, 50%, 70%, 90% { + -webkit-transform: translateX(-10px); + transform: translateX(-10px); + } + + 20%, 40%, 60%, 80% { + -webkit-transform: translateX(10px); + transform: translateX(10px); + } +} + +@keyframes shake { + 0%, 100% { + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + + 10%, 30%, 50%, 70%, 90% { + -webkit-transform: translateX(-10px); + -ms-transform: translateX(-10px); + transform: translateX(-10px); + } + + 20%, 40%, 60%, 80% { + -webkit-transform: translateX(10px); + -ms-transform: translateX(10px); + transform: translateX(10px); + } +} + +.shake { + -webkit-animation-name: shake; + animation-name: shake; +} + +@-webkit-keyframes swing { + 20% { + -webkit-transform: rotate(15deg); + transform: rotate(15deg); + } + + 40% { + -webkit-transform: rotate(-10deg); + transform: rotate(-10deg); + } + + 60% { + -webkit-transform: rotate(5deg); + transform: rotate(5deg); + } + + 80% { + -webkit-transform: rotate(-5deg); + transform: rotate(-5deg); + } + + 100% { + -webkit-transform: rotate(0deg); + transform: rotate(0deg); + } +} + +@keyframes swing { + 20% { + -webkit-transform: rotate(15deg); + -ms-transform: rotate(15deg); + transform: rotate(15deg); + } + + 40% { + -webkit-transform: rotate(-10deg); + -ms-transform: rotate(-10deg); + transform: rotate(-10deg); + } + + 60% { + -webkit-transform: rotate(5deg); + -ms-transform: rotate(5deg); + transform: rotate(5deg); + } + + 80% { + -webkit-transform: rotate(-5deg); + -ms-transform: rotate(-5deg); + transform: rotate(-5deg); + } + + 100% { + -webkit-transform: rotate(0deg); + -ms-transform: rotate(0deg); + transform: rotate(0deg); + } +} + +.swing { + -webkit-transform-origin: top center; + -ms-transform-origin: top center; + transform-origin: top center; + -webkit-animation-name: swing; + animation-name: swing; +} + +@-webkit-keyframes tada { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + } + + 10%, 20% { + -webkit-transform: scale(0.9) rotate(-3deg); + transform: scale(0.9) rotate(-3deg); + } + + 30%, 50%, 70%, 90% { + -webkit-transform: scale(1.1) rotate(3deg); + transform: scale(1.1) rotate(3deg); + } + + 40%, 60%, 80% { + -webkit-transform: scale(1.1) rotate(-3deg); + transform: scale(1.1) rotate(-3deg); + } + + 100% { + -webkit-transform: scale(1) rotate(0); + transform: scale(1) rotate(0); + } +} + +@keyframes tada { + 0% { + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + + 10%, 20% { + -webkit-transform: scale(0.9) rotate(-3deg); + -ms-transform: scale(0.9) rotate(-3deg); + transform: scale(0.9) rotate(-3deg); + } + + 30%, 50%, 70%, 90% { + -webkit-transform: scale(1.1) rotate(3deg); + -ms-transform: scale(1.1) rotate(3deg); + transform: scale(1.1) rotate(3deg); + } + + 40%, 60%, 80% { + -webkit-transform: scale(1.1) rotate(-3deg); + -ms-transform: scale(1.1) rotate(-3deg); + transform: scale(1.1) rotate(-3deg); + } + + 100% { + -webkit-transform: scale(1) rotate(0); + -ms-transform: scale(1) rotate(0); + transform: scale(1) rotate(0); + } +} + +.tada { + -webkit-animation-name: tada; + animation-name: tada; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes wobble { + 0% { + -webkit-transform: translateX(0%); + transform: translateX(0%); + } + + 15% { + -webkit-transform: translateX(-25%) rotate(-5deg); + transform: translateX(-25%) rotate(-5deg); + } + + 30% { + -webkit-transform: translateX(20%) rotate(3deg); + transform: translateX(20%) rotate(3deg); + } + + 45% { + -webkit-transform: translateX(-15%) rotate(-3deg); + transform: translateX(-15%) rotate(-3deg); + } + + 60% { + -webkit-transform: translateX(10%) rotate(2deg); + transform: translateX(10%) rotate(2deg); + } + + 75% { + -webkit-transform: translateX(-5%) rotate(-1deg); + transform: translateX(-5%) rotate(-1deg); + } + + 100% { + -webkit-transform: translateX(0%); + transform: translateX(0%); + } +} + +@keyframes wobble { + 0% { + -webkit-transform: translateX(0%); + -ms-transform: translateX(0%); + transform: translateX(0%); + } + + 15% { + -webkit-transform: translateX(-25%) rotate(-5deg); + -ms-transform: translateX(-25%) rotate(-5deg); + transform: translateX(-25%) rotate(-5deg); + } + + 30% { + -webkit-transform: translateX(20%) rotate(3deg); + -ms-transform: translateX(20%) rotate(3deg); + transform: translateX(20%) rotate(3deg); + } + + 45% { + -webkit-transform: translateX(-15%) rotate(-3deg); + -ms-transform: translateX(-15%) rotate(-3deg); + transform: translateX(-15%) rotate(-3deg); + } + + 60% { + -webkit-transform: translateX(10%) rotate(2deg); + -ms-transform: translateX(10%) rotate(2deg); + transform: translateX(10%) rotate(2deg); + } + + 75% { + -webkit-transform: translateX(-5%) rotate(-1deg); + -ms-transform: translateX(-5%) rotate(-1deg); + transform: translateX(-5%) rotate(-1deg); + } + + 100% { + -webkit-transform: translateX(0%); + -ms-transform: translateX(0%); + transform: translateX(0%); + } +} + +.wobble { + -webkit-animation-name: wobble; + animation-name: wobble; +} + +@-webkit-keyframes bounceIn { + 0% { + opacity: 0; + -webkit-transform: scale(.3); + transform: scale(.3); + } + + 50% { + opacity: 1; + -webkit-transform: scale(1.05); + transform: scale(1.05); + } + + 70% { + -webkit-transform: scale(.9); + transform: scale(.9); + } + + 100% { + opacity: 1; + -webkit-transform: scale(1); + transform: scale(1); + } +} + +@keyframes bounceIn { + 0% { + opacity: 0; + -webkit-transform: scale(.3); + -ms-transform: scale(.3); + transform: scale(.3); + } + + 50% { + opacity: 1; + -webkit-transform: scale(1.05); + -ms-transform: scale(1.05); + transform: scale(1.05); + } + + 70% { + -webkit-transform: scale(.9); + -ms-transform: scale(.9); + transform: scale(.9); + } + + 100% { + opacity: 1; + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } +} + +.bounceIn { + -webkit-animation-name: bounceIn; + animation-name: bounceIn; +} + +@-webkit-keyframes bounceInDown { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + transform: translateY(-2000px); + } + + 60% { + opacity: 1; + -webkit-transform: translateY(30px); + transform: translateY(30px); + } + + 80% { + -webkit-transform: translateY(-10px); + transform: translateY(-10px); + } + + 100% { + -webkit-transform: translateY(0); + transform: translateY(0); + } +} + +@keyframes bounceInDown { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + -ms-transform: translateY(-2000px); + transform: translateY(-2000px); + } + + 60% { + opacity: 1; + -webkit-transform: translateY(30px); + -ms-transform: translateY(30px); + transform: translateY(30px); + } + + 80% { + -webkit-transform: translateY(-10px); + -ms-transform: translateY(-10px); + transform: translateY(-10px); + } + + 100% { + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} + +.bounceInDown { + -webkit-animation-name: bounceInDown; + animation-name: bounceInDown; +} + +@-webkit-keyframes bounceInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + transform: translateX(-2000px); + } + + 60% { + opacity: 1; + -webkit-transform: translateX(30px); + transform: translateX(30px); + } + + 80% { + -webkit-transform: translateX(-10px); + transform: translateX(-10px); + } + + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +@keyframes bounceInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + -ms-transform: translateX(-2000px); + transform: translateX(-2000px); + } + + 60% { + opacity: 1; + -webkit-transform: translateX(30px); + -ms-transform: translateX(30px); + transform: translateX(30px); + } + + 80% { + -webkit-transform: translateX(-10px); + -ms-transform: translateX(-10px); + transform: translateX(-10px); + } + + 100% { + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} + +.bounceInLeft { + -webkit-animation-name: bounceInLeft; + animation-name: bounceInLeft; +} + +@-webkit-keyframes bounceInRight { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + transform: translateX(2000px); + } + + 60% { + opacity: 1; + -webkit-transform: translateX(-30px); + transform: translateX(-30px); + } + + 80% { + -webkit-transform: translateX(10px); + transform: translateX(10px); + } + + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +@keyframes bounceInRight { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + -ms-transform: translateX(2000px); + transform: translateX(2000px); + } + + 60% { + opacity: 1; + -webkit-transform: translateX(-30px); + -ms-transform: translateX(-30px); + transform: translateX(-30px); + } + + 80% { + -webkit-transform: translateX(10px); + -ms-transform: translateX(10px); + transform: translateX(10px); + } + + 100% { + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} + +.bounceInRight { + -webkit-animation-name: bounceInRight; + animation-name: bounceInRight; +} + +@-webkit-keyframes bounceInUp { + 0% { + opacity: 0; + -webkit-transform: translateY(2000px); + transform: translateY(2000px); + } + + 60% { + opacity: 1; + -webkit-transform: translateY(-30px); + transform: translateY(-30px); + } + + 80% { + -webkit-transform: translateY(10px); + transform: translateY(10px); + } + + 100% { + -webkit-transform: translateY(0); + transform: translateY(0); + } +} + +@keyframes bounceInUp { + 0% { + opacity: 0; + -webkit-transform: translateY(2000px); + -ms-transform: translateY(2000px); + transform: translateY(2000px); + } + + 60% { + opacity: 1; + -webkit-transform: translateY(-30px); + -ms-transform: translateY(-30px); + transform: translateY(-30px); + } + + 80% { + -webkit-transform: translateY(10px); + -ms-transform: translateY(10px); + transform: translateY(10px); + } + + 100% { + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} + +.bounceInUp { + -webkit-animation-name: bounceInUp; + animation-name: bounceInUp; +} + +@-webkit-keyframes bounceOut { + 0% { + -webkit-transform: scale(1); + transform: scale(1); + } + + 25% { + -webkit-transform: scale(.95); + transform: scale(.95); + } + + 50% { + opacity: 1; + -webkit-transform: scale(1.1); + transform: scale(1.1); + } + + 100% { + opacity: 0; + -webkit-transform: scale(.3); + transform: scale(.3); + } +} + +@keyframes bounceOut { + 0% { + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); + } + + 25% { + -webkit-transform: scale(.95); + -ms-transform: scale(.95); + transform: scale(.95); + } + + 50% { + opacity: 1; + -webkit-transform: scale(1.1); + -ms-transform: scale(1.1); + transform: scale(1.1); + } + + 100% { + opacity: 0; + -webkit-transform: scale(.3); + -ms-transform: scale(.3); + transform: scale(.3); + } +} + +.bounceOut { + -webkit-animation-name: bounceOut; + animation-name: bounceOut; +} + +@-webkit-keyframes bounceOutDown { + 0% { + -webkit-transform: translateY(0); + transform: translateY(0); + } + + 20% { + opacity: 1; + -webkit-transform: translateY(-20px); + transform: translateY(-20px); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(2000px); + transform: translateY(2000px); + } +} + +@keyframes bounceOutDown { + 0% { + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } + + 20% { + opacity: 1; + -webkit-transform: translateY(-20px); + -ms-transform: translateY(-20px); + transform: translateY(-20px); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(2000px); + -ms-transform: translateY(2000px); + transform: translateY(2000px); + } +} + +.bounceOutDown { + -webkit-animation-name: bounceOutDown; + animation-name: bounceOutDown; +} + +@-webkit-keyframes bounceOutLeft { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 20% { + opacity: 1; + -webkit-transform: translateX(20px); + transform: translateX(20px); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + transform: translateX(-2000px); + } +} + +@keyframes bounceOutLeft { + 0% { + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + + 20% { + opacity: 1; + -webkit-transform: translateX(20px); + -ms-transform: translateX(20px); + transform: translateX(20px); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + -ms-transform: translateX(-2000px); + transform: translateX(-2000px); + } +} + +.bounceOutLeft { + -webkit-animation-name: bounceOutLeft; + animation-name: bounceOutLeft; +} + +@-webkit-keyframes bounceOutRight { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 20% { + opacity: 1; + -webkit-transform: translateX(-20px); + transform: translateX(-20px); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + transform: translateX(2000px); + } +} + +@keyframes bounceOutRight { + 0% { + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + + 20% { + opacity: 1; + -webkit-transform: translateX(-20px); + -ms-transform: translateX(-20px); + transform: translateX(-20px); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + -ms-transform: translateX(2000px); + transform: translateX(2000px); + } +} + +.bounceOutRight { + -webkit-animation-name: bounceOutRight; + animation-name: bounceOutRight; +} + +@-webkit-keyframes bounceOutUp { + 0% { + -webkit-transform: translateY(0); + transform: translateY(0); + } + + 20% { + opacity: 1; + -webkit-transform: translateY(20px); + transform: translateY(20px); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(-2000px); + transform: translateY(-2000px); + } +} + +@keyframes bounceOutUp { + 0% { + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } + + 20% { + opacity: 1; + -webkit-transform: translateY(20px); + -ms-transform: translateY(20px); + transform: translateY(20px); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(-2000px); + -ms-transform: translateY(-2000px); + transform: translateY(-2000px); + } +} + +.bounceOutUp { + -webkit-animation-name: bounceOutUp; + animation-name: bounceOutUp; +} + +@-webkit-keyframes fadeIn { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } +} + +@keyframes fadeIn { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } +} + +.fadeIn { + -webkit-animation-name: fadeIn; + animation-name: fadeIn; +} + +@-webkit-keyframes fadeInDown { + 0% { + opacity: 0; + -webkit-transform: translateY(-20px); + transform: translateY(-20px); + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0); + } +} + +@keyframes fadeInDown { + 0% { + opacity: 0; + -webkit-transform: translateY(-20px); + -ms-transform: translateY(-20px); + transform: translateY(-20px); + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} + +.fadeInDown { + -webkit-animation-name: fadeInDown; + animation-name: fadeInDown; +} + +@-webkit-keyframes fadeInDownBig { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + transform: translateY(-2000px); + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0); + } +} + +@keyframes fadeInDownBig { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + -ms-transform: translateY(-2000px); + transform: translateY(-2000px); + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} + +.fadeInDownBig { + -webkit-animation-name: fadeInDownBig; + animation-name: fadeInDownBig; +} + +@-webkit-keyframes fadeInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-20px); + transform: translateX(-20px); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +@keyframes fadeInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-20px); + -ms-transform: translateX(-20px); + transform: translateX(-20px); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} + +.fadeInLeft { + -webkit-animation-name: fadeInLeft; + animation-name: fadeInLeft; +} + +@-webkit-keyframes fadeInLeftBig { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + transform: translateX(-2000px); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +@keyframes fadeInLeftBig { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + -ms-transform: translateX(-2000px); + transform: translateX(-2000px); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} + +.fadeInLeftBig { + -webkit-animation-name: fadeInLeftBig; + animation-name: fadeInLeftBig; +} + +@-webkit-keyframes fadeInRight { + 0% { + opacity: 0; + -webkit-transform: translateX(20px); + transform: translateX(20px); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +@keyframes fadeInRight { + 0% { + opacity: 0; + -webkit-transform: translateX(40px); + -ms-transform: translateX(40px); + transform: translateX(40px); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} + +.fadeInRight { + -webkit-animation-name: fadeInRight; + animation-name: fadeInRight; +} + +@-webkit-keyframes fadeInRightBig { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + transform: translateX(2000px); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +@keyframes fadeInRightBig { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + -ms-transform: translateX(2000px); + transform: translateX(2000px); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} + +.fadeInRightBig { + -webkit-animation-name: fadeInRightBig; + animation-name: fadeInRightBig; +} + +@-webkit-keyframes fadeInUp { + 0% { + opacity: 0; + -webkit-transform: translateY(20px); + transform: translateY(20px); + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0); + } +} + +@keyframes fadeInUp { + 0% { + opacity: 0; + -webkit-transform: translateY(20px); + -ms-transform: translateY(20px); + transform: translateY(20px); + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} + +.fadeInUp { + -webkit-animation-name: fadeInUp; + animation-name: fadeInUp; +} + +@-webkit-keyframes fadeInUpBig { + 0% { + opacity: 0; + -webkit-transform: translateY(2000px); + transform: translateY(2000px); + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0); + } +} + +@keyframes fadeInUpBig { + 0% { + opacity: 0; + -webkit-transform: translateY(2000px); + -ms-transform: translateY(2000px); + transform: translateY(2000px); + } + + 100% { + opacity: 1; + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} + +.fadeInUpBig { + -webkit-animation-name: fadeInUpBig; + animation-name: fadeInUpBig; +} + +@-webkit-keyframes fadeOut { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + } +} + +@keyframes fadeOut { + 0% { + opacity: 1; + } + + 100% { + opacity: 0; + } +} + +.fadeOut { + -webkit-animation-name: fadeOut; + animation-name: fadeOut; +} + +@-webkit-keyframes fadeOutDown { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(20px); + transform: translateY(20px); + } +} + +@keyframes fadeOutDown { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(20px); + -ms-transform: translateY(20px); + transform: translateY(20px); + } +} + +.fadeOutDown { + -webkit-animation-name: fadeOutDown; + animation-name: fadeOutDown; +} + +@-webkit-keyframes fadeOutDownBig { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(2000px); + transform: translateY(2000px); + } +} + +@keyframes fadeOutDownBig { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(2000px); + -ms-transform: translateY(2000px); + transform: translateY(2000px); + } +} + +.fadeOutDownBig { + -webkit-animation-name: fadeOutDownBig; + animation-name: fadeOutDownBig; +} + +@-webkit-keyframes fadeOutLeft { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(-20px); + transform: translateX(-20px); + } +} + +@keyframes fadeOutLeft { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(-20px); + -ms-transform: translateX(-20px); + transform: translateX(-20px); + } +} + +.fadeOutLeft { + -webkit-animation-name: fadeOutLeft; + animation-name: fadeOutLeft; +} + +@-webkit-keyframes fadeOutLeftBig { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + transform: translateX(-2000px); + } +} + +@keyframes fadeOutLeftBig { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + -ms-transform: translateX(-2000px); + transform: translateX(-2000px); + } +} + +.fadeOutLeftBig { + -webkit-animation-name: fadeOutLeftBig; + animation-name: fadeOutLeftBig; +} + +@-webkit-keyframes fadeOutRight { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(20px); + transform: translateX(20px); + } +} + +@keyframes fadeOutRight { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(20px); + -ms-transform: translateX(20px); + transform: translateX(20px); + } +} + +.fadeOutRight { + -webkit-animation-name: fadeOutRight; + animation-name: fadeOutRight; +} + +@-webkit-keyframes fadeOutRightBig { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + transform: translateX(2000px); + } +} + +@keyframes fadeOutRightBig { + 0% { + opacity: 1; + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + -ms-transform: translateX(2000px); + transform: translateX(2000px); + } +} + +.fadeOutRightBig { + -webkit-animation-name: fadeOutRightBig; + animation-name: fadeOutRightBig; +} + +@-webkit-keyframes fadeOutUp { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(-20px); + transform: translateY(-20px); + } +} + +@keyframes fadeOutUp { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(-20px); + -ms-transform: translateY(-20px); + transform: translateY(-20px); + } +} + +.fadeOutUp { + -webkit-animation-name: fadeOutUp; + animation-name: fadeOutUp; +} + +@-webkit-keyframes fadeOutUpBig { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(-2000px); + transform: translateY(-2000px); + } +} + +@keyframes fadeOutUpBig { + 0% { + opacity: 1; + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(-2000px); + -ms-transform: translateY(-2000px); + transform: translateY(-2000px); + } +} + +.fadeOutUpBig { + -webkit-animation-name: fadeOutUpBig; + animation-name: fadeOutUpBig; +} + +@-webkit-keyframes flip { + 0% { + -webkit-transform: perspective(400px) translateZ(0) rotateY(0) scale(1); + transform: perspective(400px) translateZ(0) rotateY(0) scale(1); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 40% { + -webkit-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); + transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 50% { + -webkit-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 80% { + -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95); + transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 100% { + -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); + transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } +} + +@keyframes flip { + 0% { + -webkit-transform: perspective(400px) translateZ(0) rotateY(0) scale(1); + -ms-transform: perspective(400px) translateZ(0) rotateY(0) scale(1); + transform: perspective(400px) translateZ(0) rotateY(0) scale(1); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 40% { + -webkit-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); + -ms-transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); + transform: perspective(400px) translateZ(150px) rotateY(170deg) scale(1); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 50% { + -webkit-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + -ms-transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + transform: perspective(400px) translateZ(150px) rotateY(190deg) scale(1); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 80% { + -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95); + -ms-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95); + transform: perspective(400px) translateZ(0) rotateY(360deg) scale(.95); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 100% { + -webkit-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); + -ms-transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); + transform: perspective(400px) translateZ(0) rotateY(360deg) scale(1); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } +} + +.animated.flip { + -webkit-backface-visibility: visible; + -ms-backface-visibility: visible; + backface-visibility: visible; + -webkit-animation-name: flip; + animation-name: flip; +} + +@-webkit-keyframes flipInX { + 0% { + -webkit-transform: perspective(400px) rotateX(90deg); + transform: perspective(400px) rotateX(90deg); + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotateX(-10deg); + transform: perspective(400px) rotateX(-10deg); + } + + 70% { + -webkit-transform: perspective(400px) rotateX(10deg); + transform: perspective(400px) rotateX(10deg); + } + + 100% { + -webkit-transform: perspective(400px) rotateX(0deg); + transform: perspective(400px) rotateX(0deg); + opacity: 1; + } +} + +@keyframes flipInX { + 0% { + -webkit-transform: perspective(400px) rotateX(90deg); + -ms-transform: perspective(400px) rotateX(90deg); + transform: perspective(400px) rotateX(90deg); + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotateX(-10deg); + -ms-transform: perspective(400px) rotateX(-10deg); + transform: perspective(400px) rotateX(-10deg); + } + + 70% { + -webkit-transform: perspective(400px) rotateX(10deg); + -ms-transform: perspective(400px) rotateX(10deg); + transform: perspective(400px) rotateX(10deg); + } + + 100% { + -webkit-transform: perspective(400px) rotateX(0deg); + -ms-transform: perspective(400px) rotateX(0deg); + transform: perspective(400px) rotateX(0deg); + opacity: 1; + } +} + +.flipInX { + -webkit-backface-visibility: visible !important; + -ms-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipInX; + animation-name: flipInX; +} + +@-webkit-keyframes flipInY { + 0% { + -webkit-transform: perspective(400px) rotateY(90deg); + transform: perspective(400px) rotateY(90deg); + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotateY(-10deg); + transform: perspective(400px) rotateY(-10deg); + } + + 70% { + -webkit-transform: perspective(400px) rotateY(10deg); + transform: perspective(400px) rotateY(10deg); + } + + 100% { + -webkit-transform: perspective(400px) rotateY(0deg); + transform: perspective(400px) rotateY(0deg); + opacity: 1; + } +} + +@keyframes flipInY { + 0% { + -webkit-transform: perspective(400px) rotateY(90deg); + -ms-transform: perspective(400px) rotateY(90deg); + transform: perspective(400px) rotateY(90deg); + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotateY(-10deg); + -ms-transform: perspective(400px) rotateY(-10deg); + transform: perspective(400px) rotateY(-10deg); + } + + 70% { + -webkit-transform: perspective(400px) rotateY(10deg); + -ms-transform: perspective(400px) rotateY(10deg); + transform: perspective(400px) rotateY(10deg); + } + + 100% { + -webkit-transform: perspective(400px) rotateY(0deg); + -ms-transform: perspective(400px) rotateY(0deg); + transform: perspective(400px) rotateY(0deg); + opacity: 1; + } +} + +.flipInY { + -webkit-backface-visibility: visible !important; + -ms-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipInY; + animation-name: flipInY; +} + +@-webkit-keyframes flipOutX { + 0% { + -webkit-transform: perspective(400px) rotateX(0deg); + transform: perspective(400px) rotateX(0deg); + opacity: 1; + } + + 100% { + -webkit-transform: perspective(400px) rotateX(90deg); + transform: perspective(400px) rotateX(90deg); + opacity: 0; + } +} + +@keyframes flipOutX { + 0% { + -webkit-transform: perspective(400px) rotateX(0deg); + -ms-transform: perspective(400px) rotateX(0deg); + transform: perspective(400px) rotateX(0deg); + opacity: 1; + } + + 100% { + -webkit-transform: perspective(400px) rotateX(90deg); + -ms-transform: perspective(400px) rotateX(90deg); + transform: perspective(400px) rotateX(90deg); + opacity: 0; + } +} + +.flipOutX { + -webkit-animation-name: flipOutX; + animation-name: flipOutX; + -webkit-backface-visibility: visible !important; + -ms-backface-visibility: visible !important; + backface-visibility: visible !important; +} + +@-webkit-keyframes flipOutY { + 0% { + -webkit-transform: perspective(400px) rotateY(0deg); + transform: perspective(400px) rotateY(0deg); + opacity: 1; + } + + 100% { + -webkit-transform: perspective(400px) rotateY(90deg); + transform: perspective(400px) rotateY(90deg); + opacity: 0; + } +} + +@keyframes flipOutY { + 0% { + -webkit-transform: perspective(400px) rotateY(0deg); + -ms-transform: perspective(400px) rotateY(0deg); + transform: perspective(400px) rotateY(0deg); + opacity: 1; + } + + 100% { + -webkit-transform: perspective(400px) rotateY(90deg); + -ms-transform: perspective(400px) rotateY(90deg); + transform: perspective(400px) rotateY(90deg); + opacity: 0; + } +} + +.flipOutY { + -webkit-backface-visibility: visible !important; + -ms-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipOutY; + animation-name: flipOutY; +} + +@-webkit-keyframes lightSpeedIn { + 0% { + -webkit-transform: translateX(100%) skewX(-30deg); + transform: translateX(100%) skewX(-30deg); + opacity: 0; + } + + 60% { + -webkit-transform: translateX(-20%) skewX(30deg); + transform: translateX(-20%) skewX(30deg); + opacity: 1; + } + + 80% { + -webkit-transform: translateX(0%) skewX(-15deg); + transform: translateX(0%) skewX(-15deg); + opacity: 1; + } + + 100% { + -webkit-transform: translateX(0%) skewX(0deg); + transform: translateX(0%) skewX(0deg); + opacity: 1; + } +} + +@keyframes lightSpeedIn { + 0% { + -webkit-transform: translateX(100%) skewX(-30deg); + -ms-transform: translateX(100%) skewX(-30deg); + transform: translateX(100%) skewX(-30deg); + opacity: 0; + } + + 60% { + -webkit-transform: translateX(-20%) skewX(30deg); + -ms-transform: translateX(-20%) skewX(30deg); + transform: translateX(-20%) skewX(30deg); + opacity: 1; + } + + 80% { + -webkit-transform: translateX(0%) skewX(-15deg); + -ms-transform: translateX(0%) skewX(-15deg); + transform: translateX(0%) skewX(-15deg); + opacity: 1; + } + + 100% { + -webkit-transform: translateX(0%) skewX(0deg); + -ms-transform: translateX(0%) skewX(0deg); + transform: translateX(0%) skewX(0deg); + opacity: 1; + } +} + +.lightSpeedIn { + -webkit-animation-name: lightSpeedIn; + animation-name: lightSpeedIn; + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; +} + +@-webkit-keyframes lightSpeedOut { + 0% { + -webkit-transform: translateX(0%) skewX(0deg); + transform: translateX(0%) skewX(0deg); + opacity: 1; + } + + 100% { + -webkit-transform: translateX(100%) skewX(-30deg); + transform: translateX(100%) skewX(-30deg); + opacity: 0; + } +} + +@keyframes lightSpeedOut { + 0% { + -webkit-transform: translateX(0%) skewX(0deg); + -ms-transform: translateX(0%) skewX(0deg); + transform: translateX(0%) skewX(0deg); + opacity: 1; + } + + 100% { + -webkit-transform: translateX(100%) skewX(-30deg); + -ms-transform: translateX(100%) skewX(-30deg); + transform: translateX(100%) 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 { + 0% { + -webkit-transform-origin: center center; + transform-origin: center center; + -webkit-transform: rotate(-200deg); + transform: rotate(-200deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: center center; + transform-origin: center center; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} + +@keyframes rotateIn { + 0% { + -webkit-transform-origin: center center; + -ms-transform-origin: center center; + transform-origin: center center; + -webkit-transform: rotate(-200deg); + -ms-transform: rotate(-200deg); + transform: rotate(-200deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: center center; + -ms-transform-origin: center center; + transform-origin: center center; + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} + +.rotateIn { + -webkit-animation-name: rotateIn; + animation-name: rotateIn; +} + +@-webkit-keyframes rotateInDownLeft { + 0% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(-90deg); + transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} + +@keyframes rotateInDownLeft { + 0% { + -webkit-transform-origin: left bottom; + -ms-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: left bottom; + -ms-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} + +.rotateInDownLeft { + -webkit-animation-name: rotateInDownLeft; + animation-name: rotateInDownLeft; +} + +@-webkit-keyframes rotateInDownRight { + 0% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} + +@keyframes rotateInDownRight { + 0% { + -webkit-transform-origin: right bottom; + -ms-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: right bottom; + -ms-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} + +.rotateInDownRight { + -webkit-animation-name: rotateInDownRight; + animation-name: rotateInDownRight; +} + +@-webkit-keyframes rotateInUpLeft { + 0% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} + +@keyframes rotateInUpLeft { + 0% { + -webkit-transform-origin: left bottom; + -ms-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: left bottom; + -ms-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} + +.rotateInUpLeft { + -webkit-animation-name: rotateInUpLeft; + animation-name: rotateInUpLeft; +} + +@-webkit-keyframes rotateInUpRight { + 0% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(-90deg); + transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} + +@keyframes rotateInUpRight { + 0% { + -webkit-transform-origin: right bottom; + -ms-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + transform: rotate(-90deg); + opacity: 0; + } + + 100% { + -webkit-transform-origin: right bottom; + -ms-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } +} + +.rotateInUpRight { + -webkit-animation-name: rotateInUpRight; + animation-name: rotateInUpRight; +} + +@-webkit-keyframes rotateOut { + 0% { + -webkit-transform-origin: center center; + transform-origin: center center; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: center center; + transform-origin: center center; + -webkit-transform: rotate(200deg); + transform: rotate(200deg); + opacity: 0; + } +} + +@keyframes rotateOut { + 0% { + -webkit-transform-origin: center center; + -ms-transform-origin: center center; + transform-origin: center center; + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: center center; + -ms-transform-origin: center center; + transform-origin: center center; + -webkit-transform: rotate(200deg); + -ms-transform: rotate(200deg); + transform: rotate(200deg); + opacity: 0; + } +} + +.rotateOut { + -webkit-animation-name: rotateOut; + animation-name: rotateOut; +} + +@-webkit-keyframes rotateOutDownLeft { + 0% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); + opacity: 0; + } +} + +@keyframes rotateOutDownLeft { + 0% { + -webkit-transform-origin: left bottom; + -ms-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: left bottom; + -ms-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); + opacity: 0; + } +} + +.rotateOutDownLeft { + -webkit-animation-name: rotateOutDownLeft; + animation-name: rotateOutDownLeft; +} + +@-webkit-keyframes rotateOutDownRight { + 0% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(-90deg); + transform: rotate(-90deg); + opacity: 0; + } +} + +@keyframes rotateOutDownRight { + 0% { + -webkit-transform-origin: right bottom; + -ms-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: right bottom; + -ms-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + transform: rotate(-90deg); + opacity: 0; + } +} + +.rotateOutDownRight { + -webkit-animation-name: rotateOutDownRight; + animation-name: rotateOutDownRight; +} + +@-webkit-keyframes rotateOutUpLeft { + 0% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(-90deg); + transform: rotate(-90deg); + opacity: 0; + } +} + +@keyframes rotateOutUpLeft { + 0% { + -webkit-transform-origin: left bottom; + -ms-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: left bottom; + -ms-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate(-90deg); + -ms-transform: rotate(-90deg); + transform: rotate(-90deg); + opacity: 0; + } +} + +.rotateOutUpLeft { + -webkit-animation-name: rotateOutUpLeft; + animation-name: rotateOutUpLeft; +} + +@-webkit-keyframes rotateOutUpRight { + 0% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(90deg); + transform: rotate(90deg); + opacity: 0; + } +} + +@keyframes rotateOutUpRight { + 0% { + -webkit-transform-origin: right bottom; + -ms-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + opacity: 1; + } + + 100% { + -webkit-transform-origin: right bottom; + -ms-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); + opacity: 0; + } +} + +.rotateOutUpRight { + -webkit-animation-name: rotateOutUpRight; + animation-name: rotateOutUpRight; +} + +@-webkit-keyframes slideInDown { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + transform: translateY(-2000px); + } + + 100% { + -webkit-transform: translateY(0); + transform: translateY(0); + } +} + +@keyframes slideInDown { + 0% { + opacity: 0; + -webkit-transform: translateY(-2000px); + -ms-transform: translateY(-2000px); + transform: translateY(-2000px); + } + + 100% { + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } +} + +.slideInDown { + -webkit-animation-name: slideInDown; + animation-name: slideInDown; +} + +@-webkit-keyframes slideInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + transform: translateX(-2000px); + } + + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +@keyframes slideInLeft { + 0% { + opacity: 0; + -webkit-transform: translateX(-2000px); + -ms-transform: translateX(-2000px); + transform: translateX(-2000px); + } + + 100% { + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} + +.slideInLeft { + -webkit-animation-name: slideInLeft; + animation-name: slideInLeft; +} + +@-webkit-keyframes slideInRight { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + transform: translateX(2000px); + } + + 100% { + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +@keyframes slideInRight { + 0% { + opacity: 0; + -webkit-transform: translateX(2000px); + -ms-transform: translateX(2000px); + transform: translateX(2000px); + } + + 100% { + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } +} + +.slideInRight { + -webkit-animation-name: slideInRight; + animation-name: slideInRight; +} + +@-webkit-keyframes slideOutLeft { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + transform: translateX(-2000px); + } +} + +@keyframes slideOutLeft { + 0% { + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(-2000px); + -ms-transform: translateX(-2000px); + transform: translateX(-2000px); + } +} + +.slideOutLeft { + -webkit-animation-name: slideOutLeft; + animation-name: slideOutLeft; +} + +@-webkit-keyframes slideOutRight { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + transform: translateX(2000px); + } +} + +@keyframes slideOutRight { + 0% { + -webkit-transform: translateX(0); + -ms-transform: translateX(0); + transform: translateX(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(2000px); + -ms-transform: translateX(2000px); + transform: translateX(2000px); + } +} + +.slideOutRight { + -webkit-animation-name: slideOutRight; + animation-name: slideOutRight; +} + +@-webkit-keyframes slideOutUp { + 0% { + -webkit-transform: translateY(0); + transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(-2000px); + transform: translateY(-2000px); + } +} + +@keyframes slideOutUp { + 0% { + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(-2000px); + -ms-transform: translateY(-2000px); + transform: translateY(-2000px); + } +} + +.slideOutUp { + -webkit-animation-name: slideOutUp; + animation-name: slideOutUp; +} + +@-webkit-keyframes slideOutDown { + 0% { + -webkit-transform: translateY(0); + transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(2000px); + transform: translateY(2000px); + } +} + +@keyframes slideOutDown { + 0% { + -webkit-transform: translateY(0); + -ms-transform: translateY(0); + transform: translateY(0); + } + + 100% { + opacity: 0; + -webkit-transform: translateY(2000px); + -ms-transform: translateY(2000px); + transform: translateY(2000px); + } +} + +.slideOutDown { + -webkit-animation-name: slideOutDown; + animation-name: slideOutDown; +} + +@-webkit-keyframes hinge { + 0% { + -webkit-transform: rotate(0); + transform: rotate(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: rotate(80deg); + transform: rotate(80deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 40% { + -webkit-transform: rotate(60deg); + transform: rotate(60deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 80% { + -webkit-transform: rotate(60deg) translateY(0); + transform: rotate(60deg) translateY(0); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + opacity: 1; + } + + 100% { + -webkit-transform: translateY(700px); + transform: translateY(700px); + opacity: 0; + } +} + +@keyframes hinge { + 0% { + -webkit-transform: rotate(0); + -ms-transform: rotate(0); + transform: rotate(0); + -webkit-transform-origin: top left; + -ms-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: rotate(80deg); + -ms-transform: rotate(80deg); + transform: rotate(80deg); + -webkit-transform-origin: top left; + -ms-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 40% { + -webkit-transform: rotate(60deg); + -ms-transform: rotate(60deg); + transform: rotate(60deg); + -webkit-transform-origin: top left; + -ms-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 80% { + -webkit-transform: rotate(60deg) translateY(0); + -ms-transform: rotate(60deg) translateY(0); + transform: rotate(60deg) translateY(0); + -webkit-transform-origin: top left; + -ms-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + opacity: 1; + } + + 100% { + -webkit-transform: translateY(700px); + -ms-transform: translateY(700px); + transform: translateY(700px); + opacity: 0; + } +} + +.hinge { + -webkit-animation-name: hinge; + animation-name: hinge; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes rollIn { + 0% { + opacity: 0; + -webkit-transform: translateX(-100%) rotate(-120deg); + transform: translateX(-100%) rotate(-120deg); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0px) rotate(0deg); + transform: translateX(0px) rotate(0deg); + } +} + +@keyframes rollIn { + 0% { + opacity: 0; + -webkit-transform: translateX(-100%) rotate(-120deg); + -ms-transform: translateX(-100%) rotate(-120deg); + transform: translateX(-100%) rotate(-120deg); + } + + 100% { + opacity: 1; + -webkit-transform: translateX(0px) rotate(0deg); + -ms-transform: translateX(0px) rotate(0deg); + transform: translateX(0px) rotate(0deg); + } +} + +.rollIn { + -webkit-animation-name: rollIn; + animation-name: rollIn; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes rollOut { + 0% { + opacity: 1; + -webkit-transform: translateX(0px) rotate(0deg); + transform: translateX(0px) rotate(0deg); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(100%) rotate(120deg); + transform: translateX(100%) rotate(120deg); + } +} + +@keyframes rollOut { + 0% { + opacity: 1; + -webkit-transform: translateX(0px) rotate(0deg); + -ms-transform: translateX(0px) rotate(0deg); + transform: translateX(0px) rotate(0deg); + } + + 100% { + opacity: 0; + -webkit-transform: translateX(100%) rotate(120deg); + -ms-transform: translateX(100%) rotate(120deg); + transform: translateX(100%) rotate(120deg); + } +} + +.rollOut { + -webkit-animation-name: rollOut; + animation-name: rollOut; +} diff --git a/app-manage/src/main/resources/public/static/css/bootstrap-table.css b/app-manage/src/main/resources/public/static/css/bootstrap-table.css new file mode 100644 index 0000000..ebf5e95 --- /dev/null +++ b/app-manage/src/main/resources/public/static/css/bootstrap-table.css @@ -0,0 +1,313 @@ +/** + * @author zhixin wen + * version: 1.11.1 + * https://github.com/wenzhixin/bootstrap-table/ + */ + +.bootstrap-table .table { + margin-bottom: 0 !important; + border-bottom: 1px solid #dddddd; + border-collapse: collapse !important; + border-radius: 1px; +} + +.bootstrap-table .table:not(.table-condensed), +.bootstrap-table .table:not(.table-condensed) > tbody > tr > th, +.bootstrap-table .table:not(.table-condensed) > tfoot > tr > th, +.bootstrap-table .table:not(.table-condensed) > thead > tr > td, +.bootstrap-table .table:not(.table-condensed) > tbody > tr > td, +.bootstrap-table .table:not(.table-condensed) > tfoot > tr > td { + padding: 8px; +} + +.bootstrap-table .table.table-no-bordered > thead > tr > th, +.bootstrap-table .table.table-no-bordered > tbody > tr > td { + border-right: 2px solid transparent; +} + +.bootstrap-table .table.table-no-bordered > tbody > tr > td:last-child { + border-right: none; +} + +.fixed-table-container { + position: relative; + clear: both; + border: 1px solid #dddddd; + border-radius: 4px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; +} + +.fixed-table-container.table-no-bordered { + border: 1px solid transparent; +} + +.fixed-table-footer, +.fixed-table-header { + overflow: hidden; +} + +.fixed-table-footer { + border-top: 1px solid #dddddd; +} + +.fixed-table-body { + overflow-x: auto; + overflow-y: auto; + height: 100%; +} + +.fixed-table-container table { + width: 100%; +} + +.fixed-table-container thead th { + height: 0; + padding: 0; + margin: 0; + border-left: 1px solid #dddddd; +} + +.fixed-table-container thead th:focus { + outline: 0 solid transparent; +} + +.fixed-table-container thead th:first-child { + border-left: none; + border-top-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.fixed-table-container thead th .th-inner, +.fixed-table-container tbody td .th-inner { + padding: 8px; + line-height: 24px; + vertical-align: top; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.fixed-table-container thead th .sortable { + cursor: pointer; + background-position: right; + background-repeat: no-repeat; + padding-right: 30px; +} + +.fixed-table-container thead th .both { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAQAAADYWf5HAAAAkElEQVQoz7X QMQ5AQBCF4dWQSJxC5wwax1Cq1e7BAdxD5SL+Tq/QCM1oNiJidwox0355mXnG/DrEtIQ6azioNZQxI0ykPhTQIwhCR+BmBYtlK7kLJYwWCcJA9M4qdrZrd8pPjZWPtOqdRQy320YSV17OatFC4euts6z39GYMKRPCTKY9UnPQ6P+GtMRfGtPnBCiqhAeJPmkqAAAAAElFTkSuQmCC'); +} + +.fixed-table-container thead th .asc { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZ0lEQVQ4y2NgGLKgquEuFxBPAGI2ahhWCsS/gDibUoO0gPgxEP8H4ttArEyuQYxAPBdqEAxPBImTY5gjEL9DM+wTENuQahAvEO9DMwiGdwAxOymGJQLxTyD+jgWDxCMZRsEoGAVoAADeemwtPcZI2wAAAABJRU5ErkJggg=='); +} + +.fixed-table-container thead th .desc { + background-image: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAByUDbMAAAAZUlEQVQ4y2NgGAWjYBSggaqGu5FA/BOIv2PBIPFEUgxjB+IdQPwfC94HxLykus4GiD+hGfQOiB3J8SojEE9EM2wuSJzcsFMG4ttQgx4DsRalkZENxL+AuJQaMcsGxBOAmGvopk8AVz1sLZgg0bsAAAAASUVORK5CYII= '); +} + +.fixed-table-container th.detail { + width: 30px; +} + +.fixed-table-container tbody td { + border-left: 1px solid #dddddd; +} + +.fixed-table-container tbody tr:first-child td { + border-top: none; +} + +.fixed-table-container tbody td:first-child { + border-left: none; +} + +/* the same color with .active */ +.fixed-table-container tbody .selected td { + background-color: #f5f5f5; +} + +.fixed-table-container .bs-checkbox { + text-align: center; +} + +.fixed-table-container .bs-checkbox .th-inner { + padding: 8px 0; +} + +.fixed-table-container input[type="radio"], +.fixed-table-container input[type="checkbox"] { + margin: 0 auto !important; +} + +.fixed-table-container .no-records-found { + text-align: center; +} + +.fixed-table-pagination div.pagination, +.fixed-table-pagination .pagination-detail { + margin-top: 10px; + margin-bottom: 10px; +} + +.fixed-table-pagination div.pagination .pagination { + margin: 0; +} + +.fixed-table-pagination .pagination a { + padding: 6px 12px; + line-height: 1.428571429; +} + +.fixed-table-pagination .pagination-info { + line-height: 34px; + margin-right: 5px; +} + +.fixed-table-pagination .btn-group { + position: relative; + display: inline-block; + vertical-align: middle; +} + +.fixed-table-pagination .dropup .dropdown-menu { + margin-bottom: 0; +} + +.fixed-table-pagination .page-list { + display: inline-block; +} + +.fixed-table-toolbar .columns-left { + margin-right: 5px; +} + +.fixed-table-toolbar .columns-right { + margin-left: 5px; +} + +.fixed-table-toolbar .columns label { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.428571429; +} + +.fixed-table-toolbar .bs-bars, +.fixed-table-toolbar .search, +.fixed-table-toolbar .columns { + position: relative; + margin-top: 10px; + margin-bottom: 10px; + line-height: 34px; +} + +.fixed-table-pagination li.disabled a { + pointer-events: none; + cursor: default; +} + +.fixed-table-loading { + display: none; + position: absolute; + top: 42px; + right: 0; + bottom: 0; + left: 0; + z-index: 99; + background-color: #fff; + text-align: center; +} + +.fixed-table-body .card-view .title { + font-weight: bold; + display: inline-block; + min-width: 30%; + text-align: left !important; +} + +/* support bootstrap 2 */ +.fixed-table-body thead th .th-inner { + box-sizing: border-box; +} + +.table th, .table td { + vertical-align: middle; + box-sizing: border-box; +} + +.fixed-table-toolbar .dropdown-menu { + text-align: left; + max-height: 300px; + overflow: auto; +} + +.fixed-table-toolbar .btn-group > .btn-group { + display: inline-block; + margin-left: -1px !important; +} + +.fixed-table-toolbar .btn-group > .btn-group > .btn { + border-radius: 0; +} + +.fixed-table-toolbar .btn-group > .btn-group:first-child > .btn { + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} + +.fixed-table-toolbar .btn-group > .btn-group:last-child > .btn { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} + +.bootstrap-table .table > thead > tr > th { + vertical-align: bottom; + border-bottom: 1px solid #ddd; +} + +/* support bootstrap 3 */ +.bootstrap-table .table thead > tr > th { + padding: 0; + margin: 0; +} + +.bootstrap-table .fixed-table-footer tbody > tr > td { + padding: 0 !important; +} + +.bootstrap-table .fixed-table-footer .table { + border-bottom: none; + border-radius: 0; + padding: 0 !important; +} + +.bootstrap-table .pull-right .dropdown-menu { + right: 0; + left: auto; +} + +/* calculate scrollbar width */ +p.fixed-table-scroll-inner { + width: 100%; + height: 200px; +} + +div.fixed-table-scroll-outer { + top: 0; + left: 0; + visibility: hidden; + width: 200px; + height: 150px; + overflow: hidden; +} + +/* for get correct heights */ +.fixed-table-toolbar:after, .fixed-table-pagination:after { + content: ""; + display: block; + clear: both; +} diff --git a/app-manage/src/main/resources/public/static/css/bootstrap.min.css b/app-manage/src/main/resources/public/static/css/bootstrap.min.css new file mode 100644 index 0000000..f7bca0a --- /dev/null +++ b/app-manage/src/main/resources/public/static/css/bootstrap.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{margin:.67em 0;font-size:2em}mark{color:#000;background:#ff0}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{height:0;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{margin:0;font:inherit;color:inherit}button{overflow:visible}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}input{line-height:normal}input[type=checkbox],input[type=radio]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}input[type=search]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid silver}legend{padding:0;border:0}textarea{overflow:auto}optgroup{font-weight:700}table{border-spacing:0;border-collapse:collapse}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,:after,:before{color:#000!important;text-shadow:none!important;background:0 0!important;-webkit-box-shadow:none!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.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 td,.table-bordered th{border:1px solid #ddd!important}}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-eur:before,.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub: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}:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}button,input,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:focus,a:hover{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.carousel-inner>.item>a>img,.carousel-inner>.item>img,.img-responsive,.thumbnail a>img,.thumbnail>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;max-width:100%;height:auto;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role=button]{cursor:pointer}.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,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-weight:400;line-height:1;color:#777}.h1,.h2,.h3,h1,h2,h3{margin-top:20px;margin-bottom:10px}.h1 .small,.h1 small,.h2 .small,.h2 small,.h3 .small,.h3 small,h1 .small,h1 small,h2 .small,h2 small,h3 .small,h3 small{font-size:65%}.h4,.h5,.h6,h4,h5,h6{margin-top:10px;margin-bottom:10px}.h4 .small,.h4 small,.h5 .small,.h5 small,.h6 .small,.h6 small,h4 .small,h4 small,h5 .small,h5 small,h6 .small,h6 small{font-size:75%}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}.small,small{font-size:85%}.mark,mark{padding:.2em;background-color:#fcf8e3}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:focus,a.text-primary:hover{color:#286090}.text-success{color:#3c763d}a.text-success:focus,a.text-success:hover{color:#2b542c}.text-info{color:#31708f}a.text-info:focus,a.text-info:hover{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:focus,a.text-warning:hover{color:#66512c}.text-danger{color:#a94442}a.text-danger:focus,a.text-danger:hover{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:focus,a.bg-primary:hover{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:focus,a.bg-success:hover{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:focus,a.bg-info:hover{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:focus,a.bg-warning:hover{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:focus,a.bg-danger:hover{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ol,ul{margin-top:0;margin-bottom:10px}ol ol,ol ul,ul ol,ul ul{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;margin-left:-5px;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-top:0;margin-bottom:20px}dd,dt{line-height:1.42857143}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote ol:last-child,blockquote p:last-child,blockquote ul:last-child{margin-bottom:0}blockquote .small,blockquote footer,blockquote small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote .small:before,blockquote footer:before,blockquote small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;text-align:right;border-right:5px solid #eee;border-left:0}.blockquote-reverse .small:before,.blockquote-reverse footer:before,.blockquote-reverse small:before,blockquote.pull-right .small:before,blockquote.pull-right footer:before,blockquote.pull-right small:before{content:''}.blockquote-reverse .small:after,.blockquote-reverse footer:after,.blockquote-reverse small:after,blockquote.pull-right .small:after,blockquote.pull-right footer:after,blockquote.pull-right small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,.25)}kbd kbd{padding:0;font-size:100%;font-weight:700;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-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-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-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-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{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-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{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-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{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-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{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>td,.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>td,.table>thead:first-child>tr:first-child>th{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>tbody>tr>td,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>td,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>thead>tr>th{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*=col-]{position:static;display:table-column;float:none}table td[class*=col-],table th[class*=col-]{position:static;display:table-cell;float:none}.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover{background-color:#e8e8e8}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6}.table>tbody>tr.info>td,.table>tbody>tr.info>th,.table>tbody>tr>td.info,.table>tbody>tr>th.info,.table>tfoot>tr.info>td,.table>tfoot>tr.info>th,.table>tfoot>tr>td.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>thead>tr.info>th,.table>thead>tr>td.info,.table>thead>tr>th.info{background-color:#d9edf7}.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover{background-color:#c4e3f3}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc}.table-responsive{min-height:.01%;overflow-x:auto}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}}fieldset{min-width:0;padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{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=checkbox]:focus,input[type=radio]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{background-color:transparent;border:0}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type=search]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type=date].form-control,input[type=time].form-control,input[type=datetime-local].form-control,input[type=month].form-control{line-height:34px}.input-group-sm input[type=date],.input-group-sm input[type=time],.input-group-sm input[type=datetime-local],.input-group-sm input[type=month],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-group-lg input[type=date],.input-group-lg input[type=time],.input-group-lg input[type=datetime-local],.input-group-lg input[type=month],input[type=date].input-lg,input[type=time].input-lg,input[type=datetime-local].input-lg,input[type=month].input-lg{line-height:46px}}.form-group{margin-bottom:15px}.checkbox,.radio{position:relative;display:block;margin-top:10px;margin-bottom:10px}.checkbox label,.radio label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:400;cursor:pointer}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{position:absolute;margin-top:4px\9;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;font-weight:400;vertical-align:middle;cursor:pointer}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox].disabled,input[type=checkbox][disabled],input[type=radio].disabled,input[type=radio][disabled]{cursor:not-allowed}.checkbox-inline.disabled,.radio-inline.disabled,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio-inline{cursor:not-allowed}.checkbox.disabled label,.radio.disabled label,fieldset[disabled] .checkbox label,fieldset[disabled] .radio label{cursor:not-allowed}.form-control-static{min-height:34px;padding-top:7px;padding-bottom:7px;margin-bottom:0}.form-control-static.input-lg,.form-control-static.input-sm{padding-right:0;padding-left:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}select[multiple].input-sm,textarea.input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm select[multiple].form-control,.form-group-sm textarea.form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}select[multiple].input-lg,textarea.input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg select[multiple].form-control,.form-group-lg textarea.form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.form-group-lg .form-control+.form-control-feedback,.input-group-lg+.form-control-feedback,.input-lg+.form-control-feedback{width:46px;height:46px;line-height:46px}.form-group-sm .form-control+.form-control-feedback,.input-group-sm+.form-control-feedback,.input-sm+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .checkbox,.has-success .checkbox-inline,.has-success .control-label,.has-success .help-block,.has-success .radio,.has-success .radio-inline,.has-success.checkbox label,.has-success.checkbox-inline label,.has-success.radio label,.has-success.radio-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;background-color:#dff0d8;border-color:#3c763d}.has-success .form-control-feedback{color:#3c763d}.has-warning .checkbox,.has-warning .checkbox-inline,.has-warning .control-label,.has-warning .help-block,.has-warning .radio,.has-warning .radio-inline,.has-warning.checkbox label,.has-warning.checkbox-inline label,.has-warning.radio label,.has-warning.radio-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;background-color:#fcf8e3;border-color:#8a6d3b}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .checkbox,.has-error .checkbox-inline,.has-error .control-label,.has-error .help-block,.has-error .radio,.has-error .radio-inline,.has-error.checkbox label,.has-error.checkbox-inline label,.has-error.radio label,.has-error.radio-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;background-color:#f2dede;border-color:#a94442}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .form-control,.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .checkbox,.form-inline .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .checkbox label,.form-inline .radio label{padding-left:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .checkbox,.form-horizontal .radio{min-height:27px}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.form-horizontal .control-label{padding-top:7px;margin-bottom:0;text-align:right}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:400;line-height:1.42857143;text-align:center;white-space:nowrap;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-image:none;border:1px solid transparent;border-radius:4px}.btn.active.focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn:active:focus,.btn:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn.focus,.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none;opacity:.65}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.focus,.btn-default:focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default.active.focus,.btn-default.active:focus,.btn-default.active:hover,.btn-default:active.focus,.btn-default:active:focus,.btn-default:active:hover,.open>.dropdown-toggle.btn-default.focus,.open>.dropdown-toggle.btn-default:focus,.open>.dropdown-toggle.btn-default:hover{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default.active,.btn-default:active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled.focus,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled].focus,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary.focus,.btn-primary:focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary.active.focus,.btn-primary.active:focus,.btn-primary.active:hover,.btn-primary:active.focus,.btn-primary:active:focus,.btn-primary:active:hover,.open>.dropdown-toggle.btn-primary.focus,.open>.dropdown-toggle.btn-primary:focus,.open>.dropdown-toggle.btn-primary:hover{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary.active,.btn-primary:active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled.focus,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled].focus,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.focus,.btn-success:focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success.active.focus,.btn-success.active:focus,.btn-success.active:hover,.btn-success:active.focus,.btn-success:active:focus,.btn-success:active:hover,.open>.dropdown-toggle.btn-success.focus,.open>.dropdown-toggle.btn-success:focus,.open>.dropdown-toggle.btn-success:hover{color:#fff;background-color:#398439;border-color:#255625}.btn-success.active,.btn-success:active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled.focus,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled].focus,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.focus,.btn-info:focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info.active.focus,.btn-info.active:focus,.btn-info.active:hover,.btn-info:active.focus,.btn-info:active:focus,.btn-info:active:hover,.open>.dropdown-toggle.btn-info.focus,.open>.dropdown-toggle.btn-info:focus,.open>.dropdown-toggle.btn-info:hover{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info.active,.btn-info:active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled.focus,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled].focus,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.focus,.btn-warning:focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning.active.focus,.btn-warning.active:focus,.btn-warning.active:hover,.btn-warning:active.focus,.btn-warning:active:focus,.btn-warning:active:hover,.open>.dropdown-toggle.btn-warning.focus,.open>.dropdown-toggle.btn-warning:focus,.open>.dropdown-toggle.btn-warning:hover{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning.active,.btn-warning:active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled.focus,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled].focus,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.focus,.btn-danger:focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger.active.focus,.btn-danger.active:focus,.btn-danger.active:hover,.btn-danger:active.focus,.btn-danger:active:focus,.btn-danger:active:hover,.open>.dropdown-toggle.btn-danger.focus,.open>.dropdown-toggle.btn-danger:focus,.open>.dropdown-toggle.btn-danger:hover{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger.active,.btn-danger:active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled.focus,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled].focus,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{font-weight:400;color:#337ab7;border-radius:0}.btn-link,.btn-link.active,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#777;text-decoration:none}.btn-group-lg>.btn,.btn-lg{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-group-sm>.btn,.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-xs>.btn,.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].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}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease;-webkit-transition-duration:.35s;-o-transition-duration:.35s;transition-duration:.35s;-webkit-transition-property:height,visibility;-o-transition-property:height,visibility;transition-property:height,visibility}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid\9;border-right:4px solid transparent;border-left:4px solid transparent}.dropdown,.dropup{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;text-align:left;list-style:none;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175)}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:400;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#262626;text-decoration:none;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#337ab7;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#777}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{right:0;left:auto}.dropdown-menu-left{right:auto;left:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{content:"";border-top:0;border-bottom:4px dashed;border-bottom:4px solid\9}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.navbar-right .dropdown-menu-left{right:auto;left:0}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover{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,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-bottom-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-left-radius:0;border-top-right-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-left-radius:0;border-top-right-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{display:table-cell;float:none;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle=buttons]>.btn input[type=checkbox],[data-toggle=buttons]>.btn input[type=radio],[data-toggle=buttons]>.btn-group>.btn input[type=checkbox],[data-toggle=buttons]>.btn-group>.btn input[type=radio]{position:absolute;clip:rect(0,0,0,0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-right:0;padding-left:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn,textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn,textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{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-group:not(:last-child)>.btn,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn-group:not(:first-child)>.btn,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle{border-top-left-radius:0;border-bottom-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:active,.input-group-btn>.btn:focus,.input-group-btn>.btn:hover{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{z-index:2;margin-left:-1px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#777;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:focus,.nav-tabs.nav-justified>.active>a:hover{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{margin-bottom:5px;text-align:center}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:focus,.nav-tabs-justified>.active>a:hover{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-left-radius:0;border-top-right-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{padding-right:15px;padding-left:15px;overflow-x:visible;-webkit-overflow-scrolling:touch;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1)}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse{padding-right:0;padding-left:0}}.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-bottom .navbar-collapse,.navbar-fixed-top .navbar-collapse{max-height:200px}}.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container-fluid>.navbar-collapse,.container-fluid>.navbar-header,.container>.navbar-collapse,.container>.navbar-header{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-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-bottom,.navbar-fixed-top{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;height:50px;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1)}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .form-control,.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .checkbox label,.navbar-form .radio label{padding-left:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-left-radius:0;border-top-right-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-left-radius:4px;border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-right:15px;margin-left:15px}}@media (min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:focus,.navbar-default .btn-link:hover{color:#333}.navbar-default .btn-link[disabled]:focus,.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:focus,fieldset[disabled] .navbar-default .btn-link:hover{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{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:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:focus,.navbar-inverse .btn-link:hover{color:#fff}.navbar-inverse .btn-link[disabled]:focus,.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:focus,fieldset[disabled] .navbar-inverse .btn-link:hover{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;color:#337ab7;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-top-left-radius:4px;border-bottom-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:3;color:#fff;cursor:default;background-color:#337ab7;border-color:#337ab7}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span,.pagination>.disabled>span:focus,.pagination>.disabled>span:hover{color:#777;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-top-left-radius:6px;border-bottom-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-top-left-radius:3px;border-bottom-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{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:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#777;cursor:not-allowed;background-color:#fff}.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:focus,a.label:hover{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]:focus,.label-default[href]:hover{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:middle;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-group-xs>.btn .badge,.btn-xs .badge{top:0;padding:1px 5px}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron .h1,.jumbotron h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{padding-right:15px;padding-left:15px;border-radius:6px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-right:60px;padding-left:60px}.jumbotron .h1,.jumbotron h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail a>img,.thumbnail>img{margin-right:auto;margin-left:auto}a.thumbnail.active,a.thumbnail:focus,a.thumbnail:hover{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight: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{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-bar-striped,.progress-striped .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);-webkit-background-size:40px 40px;background-size:40px 40px}.progress-bar.active,.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{overflow:hidden;zoom:1}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-body,.media-left,.media-right{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-left-radius:4px;border-top-right-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover,button.list-group-item:focus,button.list-group-item:hover{color:#555;text-decoration:none;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:focus,.list-group-item.disabled:hover{color:#777;cursor:not-allowed;background-color:#eee}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:focus,a.list-group-item-success:hover,button.list-group-item-success:focus,button.list-group-item-success:hover{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,a.list-group-item-success.active:focus,a.list-group-item-success.active:hover,button.list-group-item-success.active,button.list-group-item-success.active:focus,button.list-group-item-success.active:hover{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:focus,a.list-group-item-info:hover,button.list-group-item-info:focus,button.list-group-item-info:hover{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,a.list-group-item-info.active:focus,a.list-group-item-info.active:hover,button.list-group-item-info.active,button.list-group-item-info.active:focus,button.list-group-item-info.active:hover{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:focus,a.list-group-item-warning:hover,button.list-group-item-warning:focus,button.list-group-item-warning:hover{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,a.list-group-item-warning.active:focus,a.list-group-item-warning.active:hover,button.list-group-item-warning.active,button.list-group-item-warning.active:focus,button.list-group-item-warning.active:hover{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:focus,a.list-group-item-danger:hover,button.list-group-item-danger:focus,button.list-group-item-danger:hover{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,a.list-group-item-danger.active:focus,a.list-group-item-danger.active:hover,button.list-group-item-danger.active,button.list-group-item-danger.active:focus,button.list-group-item-danger.active:hover{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-left-radius:3px;border-top-right-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>.small,.panel-title>.small>a,.panel-title>a,.panel-title>small,.panel-title>small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-left-radius:3px;border-top-right-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-left-radius:0;border-top-right-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.panel-collapse>.table,.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.panel-collapse>.table caption,.panel>.table caption,.panel>.table-responsive>.table caption{padding-right:15px;padding-left:15px}.panel>.table-responsive:first-child>.table:first-child,.panel>.table:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.table:first-child>tbody: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:first-child>thead:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table-responsive:first-child>.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 th:first-child,.panel>.table-responsive:first-child>.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 th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table-responsive:first-child>.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 th:last-child,.panel>.table-responsive:first-child>.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 th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table-responsive:last-child>.table:last-child,.panel>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.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 th:first-child,.panel>.table-responsive:last-child>.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 th:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table-responsive:last-child>.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 th:last-child,.panel>.table-responsive:last-child>.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 th:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child td,.panel>.table>tbody:first-child>tr:first-child th{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{margin-bottom:0;border:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.list-group,.panel-group .panel-heading+.panel-collapse>.panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive 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-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;filter:alpha(opacity=20);opacity:.2}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;filter:alpha(opacity=50);opacity:.5}button.close{-webkit-appearance:none;padding:0;cursor:pointer;background:0 0;border:0}.modal-open{overflow:hidden}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;display:none;overflow:hidden;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out;-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);-o-transform:translate(0,-25%);transform:translate(0,-25%)}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{filter:alpha(opacity=0);opacity:0}.modal-backdrop.in{filter:alpha(opacity=50);opacity:.5}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:12px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;filter:alpha(opacity=0);opacity:0;line-break:auto}.tooltip.in{filter:alpha(opacity=90);opacity:.9}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{right:5px;bottom:0;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;font-style:normal;font-weight:400;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;letter-spacing:normal;word-break:normal;word-spacing:normal;word-wrap:normal;white-space:normal;background-color:#fff;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);line-break:auto}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{content:"";border-width:10px}.popover.top>.arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top>.arrow:after{bottom:1px;margin-left:-10px;content:" ";border-top-color:#fff;border-bottom-width:0}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right>.arrow:after{bottom:-10px;left:1px;content:" ";border-right-color:#fff;border-left-width:0}.popover.bottom>.arrow{top:-11px;left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25)}.popover.bottom>.arrow:after{top:1px;margin-left:-10px;content:" ";border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,.25)}.popover.left>.arrow:after{right:1px;bottom:-10px;content:" ";border-right-width:0;border-left-color:#fff}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.active.right,.carousel-inner>.item.next{left:0;-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0)}.carousel-inner>.item.active.left,.carousel-inner>.item.prev{left:0;-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0)}.carousel-inner>.item.active,.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right{left:0;-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6);background-color:rgba(0,0,0,0);filter:alpha(opacity=50);opacity:.5}.carousel-control.left{background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);background-repeat:repeat-x}.carousel-control.right{right:0;left:auto;background-image:-webkit-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-o-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);background-repeat:repeat-x}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;filter:alpha(opacity=90);outline:0;opacity:.9}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;z-index:5;display:inline-block;margin-top:-10px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{left:50%;margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{right:50%;margin-right:-10px}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;font-family:serif;line-height:1}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;background-color:#000\9;background-color:rgba(0,0,0,0);border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before,.btn-toolbar:after,.btn-toolbar:before,.clearfix:after,.clearfix:before,.container-fluid:after,.container-fluid:before,.container:after,.container:before,.dl-horizontal dd:after,.dl-horizontal dd:before,.form-horizontal .form-group:after,.form-horizontal .form-group:before,.modal-footer:after,.modal-footer:before,.modal-header:after,.modal-header:before,.nav:after,.nav:before,.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before,.pager:after,.pager:before,.panel-body:after,.panel-body:before,.row:after,.row:before{display:table;content:" "}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container-fluid:after,.container:after,.dl-horizontal dd:after,.form-horizontal .form-group:after,.modal-footer:after,.modal-header:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after{clear:both}.center-block{display:block;margin-right:auto;margin-left:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-lg,.visible-md,.visible-sm,.visible-xs{display:none!important}.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block{display:none!important}@media (max-width:767px){.visible-xs{display:block!important}table.visible-xs{display:table!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.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!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.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!important}tr.visible-md{display:table-row!important}td.visible-md,th.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!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.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!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}}.visible-print-block{display:none!important}@media print{.visible-print-block{display:block!important}}.visible-print-inline{display:none!important}@media print{.visible-print-inline{display:inline!important}}.visible-print-inline-block{display:none!important}@media print{.visible-print-inline-block{display:inline-block!important}}@media print{.hidden-print{display:none!important}} +/*# sourceMappingURL=bootstrap.min.css.map */ diff --git a/app-manage/src/main/resources/public/static/css/diyUpload.css b/app-manage/src/main/resources/public/static/css/diyUpload.css new file mode 100644 index 0000000..02f1935 --- /dev/null +++ b/app-manage/src/main/resources/public/static/css/diyUpload.css @@ -0,0 +1,161 @@ +@charset "utf-8"; +/* CSS Document*/ +.parentFileBox { + width:auto; + height:auto; + overflow:hidden; + position:relative; + float: left; +} +.parentFileBox>.fileBoxUl { + position:relative; + width:100%; + height:auto; + overflow:hidden; + padding-bottom:5px; +} +.parentFileBox>.fileBoxUl>li { + float:left; + border:1px solid #09F; + border-radius:5px; + width:150px; + height:100px; + margin-top:5px; + margin-right:20px; + overflow:hidden; + position:relative; + background-color:#099; +} +.parentFileBox>.fileBoxUl>li>.viewThumb { + position:absolute; + top:0; + left:0; + width:150px; + height:100px; + overflow:hidden; +} +.parentFileBox>.fileBoxUl>li>.viewThumb>img { + width:100%; + height:100%; +} +.parentFileBox>.fileBoxUl>li>.diyCancel,.parentFileBox>.fileBoxUl>li>.diySuccess { + position:absolute; + width:32px; + height:32px; + top:2px; + right:2px; + cursor:pointer; + display:none; +} +.parentFileBox>.fileBoxUl>li>.diyCancel { + background:url(../img/x_alt.png) no-repeat; +} +.parentFileBox>.fileBoxUl>li>.diySuccess { + background:url(../img/check_alt.png) no-repeat; + cursor:default; +} +.parentFileBox>.fileBoxUl>li>.diyFileName { + position:absolute; + bottom:0px; + left:0px; + width:100%; + height:20px; + line-height:20px; + text-align:center; + color:#fff; + font-size:12px; + display:none; + background:url(../img/bgblack.png); +} +.parentFileBox>.fileBoxUl>li>.diyBar { + top:0; + left:0; + position: absolute; + width: 300px; + height: 150px; + line-height:150px; + background:url(../img/bgblack.png); + display:none; +} +.parentFileBox>.fileBoxUl>li>.diyBar>.diyProgressText { + font-size:14px; + text-align:center; + color:#FFF; + position:relative; + z-index:99; +} +.parentFileBox>.fileBoxUl>li>.diyBar>.diyProgress { + position:absolute; + left:0; + top:42%; + height:24px; + width:100%; + background-color:#09F; + filter:alpha(opacity=70); + -moz-opacity:0.7; + opacity:0.7; + z-index:97; +} +.parentFileBox>.diyButton { + width:100%; + margin-top:5px; + margin-bottom:5px; + height:20px; + line-height:20px; + text-align:center; +} +.parentFileBox>.diyButton>a { + padding:5px 10px 5px 10px; + background-color:#09C; + color:#FFF; + font-size:12px; + text-decoration:none; + border-radius:3px; + margin-right: 10px; +} +.parentFileBox>.diyButton>a:hover { + background-color:#0CC; + /*color:#F30;*/ +} +.parentFileBox>.fileBoxUl>li:hover { + -moz-box-shadow: 3px 3px 4px #FF0; + -webkit-box-shadow: 3px 3px 4px #FF0; + box-shadow: 3px 3px 4px #FF0; +} +.parentFileBox>.fileBoxUl>.diyUploadHover:hover .diyCancel { + display:block; +} +.parentFileBox>.fileBoxUl>li:hover .diyFileName { + display:block; +} +.avi_diy_bg,.txt_diy_bg,.doc_diy_bg,.zip_diy_bg,.csv_diy_bg,.xls_diy_bg,.mp3_diy_bg,.pdf_diy_bg,.rar_diy_bg { + background-position:center; + background-repeat:no-repeat; +} +.avi_diy_bg { + background-image:url(../img/filebg/avi.png); +} +.txt_diy_bg { + background-image:url(../img/filebg/txt.png); +} +.doc_diy_bg { + background-image:url(../img/filebg/doc.png); +} +.zip_diy_bg { + background-image:url(../img/filebg/zip.png); +} +.csv_diy_bg { + background-image:url(../img/filebg/csv.png); +} +.xls_diy_bg { + background-image:url(../img/filebg/xls.png); +} +.mp3_diy_bg { + background-image:url(../img/filebg/mp3.png); +} +.pdf_diy_bg { + background-image:url(../img/filebg/pdf.png); +} +.rar_diy_bg { + background-image:url(../img/filebg/rar.png); +} diff --git a/app-manage/src/main/resources/public/static/css/font-awesome.min.css b/app-manage/src/main/resources/public/static/css/font-awesome.min.css new file mode 100644 index 0000000..ee4e978 --- /dev/null +++ b/app-manage/src/main/resources/public/static/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.4.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.4.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.4.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.4.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.4.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.4.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.4.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{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-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper: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-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"} diff --git a/app-manage/src/main/resources/public/static/css/login.css b/app-manage/src/main/resources/public/static/css/login.css new file mode 100644 index 0000000..bfe8cb6 --- /dev/null +++ b/app-manage/src/main/resources/public/static/css/login.css @@ -0,0 +1,93 @@ +html{height: 100%;} +body.signin { + background: #18c8f6; + height: auto; + background:url("../img/login-background.jpg") no-repeat center fixed; + -webkit-background-size: cover; + -moz-background-size: cover; + -o-background-size: cover; + background-size: cover; + color: rgba(255,255,255,.95); +} + +.signinpanel { + width: 750px; + margin: 10% auto 0 auto; +} + +.signinpanel .logopanel { + float: none; + width: auto; + padding: 0; + background: none; +} + +.signinpanel .signin-info ul { + list-style: none; + padding: 0; + margin: 20px 0; +} + +.signinpanel .form-control { + display: block; + margin-top: 15px; +} + +.signinpanel .uname { + background: #fff url(../img/user.png) no-repeat 95% center;color:#333; +} + +.signinpanel .pword { + background: #fff url(../img/locked.png) no-repeat 95% center;color:#333; +} + +.signinpanel .btn { + margin-top: 15px; +} + +.signinpanel form { + background: rgba(255, 255, 255, 0.2); + border: 1px solid rgba(255,255,255,.3); + -moz-box-shadow: 0 3px 0 rgba(12, 12, 12, 0.03); + -webkit-box-shadow: 0 3px 0 rgba(12, 12, 12, 0.03); + box-shadow: 0 3px 0 rgba(12, 12, 12, 0.03); + -moz-border-radius: 3px; + -webkit-border-radius: 3px; + border-radius: 3px; + padding: 30px; +} + +.signup-footer{border-top: solid 1px rgba(255,255,255,.3);margin:20px 0;padding-top: 15px;} + +@media screen and (max-width: 768px) { + .signinpanel, + .signuppanel { + margin: 0 auto; + width: 420px!important; + padding: 20px; + } + .signinpanel form { + margin-top: 20px; + } + .signup-footer { + margin-bottom: 10px; + } + .signuppanel .form-control { + margin-bottom: 10px; + } + .signup-footer .pull-left, + .signup-footer .pull-right { + float: none !important; + text-align: center; + } + .signinpanel .signin-info ul { + display: none; + } +} +@media screen and (max-width: 320px) { + .signinpanel, + .signuppanel { + margin:0 20px; + width:auto; + } +} diff --git a/app-manage/src/main/resources/public/static/css/patterns/header-profile-skin-1.png b/app-manage/src/main/resources/public/static/css/patterns/header-profile-skin-1.png new file mode 100644 index 0000000..41c5c08 Binary files /dev/null and b/app-manage/src/main/resources/public/static/css/patterns/header-profile-skin-1.png differ diff --git a/app-manage/src/main/resources/public/static/css/patterns/header-profile-skin-3.png b/app-manage/src/main/resources/public/static/css/patterns/header-profile-skin-3.png new file mode 100644 index 0000000..7a80132 Binary files /dev/null and b/app-manage/src/main/resources/public/static/css/patterns/header-profile-skin-3.png differ diff --git a/app-manage/src/main/resources/public/static/css/patterns/header-profile.png b/app-manage/src/main/resources/public/static/css/patterns/header-profile.png new file mode 100644 index 0000000..7dea7f2 Binary files /dev/null and b/app-manage/src/main/resources/public/static/css/patterns/header-profile.png differ diff --git a/app-manage/src/main/resources/public/static/css/patterns/shattered.png b/app-manage/src/main/resources/public/static/css/patterns/shattered.png new file mode 100644 index 0000000..90ed42b Binary files /dev/null and b/app-manage/src/main/resources/public/static/css/patterns/shattered.png differ diff --git a/app-manage/src/main/resources/public/static/css/plugins/chosen/chosen-sprite.png b/app-manage/src/main/resources/public/static/css/plugins/chosen/chosen-sprite.png new file mode 100644 index 0000000..3611ae4 Binary files /dev/null and b/app-manage/src/main/resources/public/static/css/plugins/chosen/chosen-sprite.png differ diff --git a/app-manage/src/main/resources/public/static/css/plugins/chosen/chosen-sprite@2x.png b/app-manage/src/main/resources/public/static/css/plugins/chosen/chosen-sprite@2x.png new file mode 100644 index 0000000..ffe4d7d Binary files /dev/null and b/app-manage/src/main/resources/public/static/css/plugins/chosen/chosen-sprite@2x.png differ diff --git a/app-manage/src/main/resources/public/static/css/plugins/chosen/chosen.css b/app-manage/src/main/resources/public/static/css/plugins/chosen/chosen.css new file mode 100644 index 0000000..edd6767 --- /dev/null +++ b/app-manage/src/main/resources/public/static/css/plugins/chosen/chosen.css @@ -0,0 +1,423 @@ +/*! +Chosen, a Select Box Enhancer for jQuery and Prototype +by Patrick Filler for Harvest, http://getharvest.com + +Version 1.1.0 +Full source at https://github.com/harvesthq/chosen +Copyright (c) 2011 Harvest http://getharvest.com + +MIT License, https://github.com/harvesthq/chosen/blob/master/LICENSE.md +This file is generated by `grunt build`, do not edit it by hand. +*/ + +/* @group Base */ +.chosen-container { + position: relative; + display: inline-block; + vertical-align: middle; + font-size: 13px; + zoom: 1; + *display: inline; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} +.chosen-container .chosen-drop { + position: absolute; + top: 100%; + left: -9999px; + z-index: 1010; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + border: 1px solid #aaa; + border-top: 0; + background: #fff; + box-shadow: 0 4px 5px rgba(0, 0, 0, 0.15); +} +.chosen-container.chosen-with-drop .chosen-drop { + left: 0; +} +.chosen-container a { + cursor: pointer; +} + +/* @end */ +/* @group Single Chosen */ +.chosen-container-single .chosen-single { + position: relative; + display: block; + overflow: hidden; + padding: 0 0 0 8px; + height: 23px; + border: 1px solid #aaa; + border-radius: 5px; + background-color: #fff; + background: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #ffffff), color-stop(50%, #f6f6f6), color-stop(52%, #eeeeee), color-stop(100%, #f4f4f4)); + background: -webkit-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); + background: -moz-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); + background: -o-linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); + background: linear-gradient(top, #ffffff 20%, #f6f6f6 50%, #eeeeee 52%, #f4f4f4 100%); + background-clip: padding-box; + box-shadow: 0 0 3px white inset, 0 1px 1px rgba(0, 0, 0, 0.1); + color: #444; + text-decoration: none; + white-space: nowrap; + line-height: 24px; +} +.chosen-container-single .chosen-default { + color: #999; +} +.chosen-container-single .chosen-single span { + display: block; + overflow: hidden; + margin-right: 26px; + text-overflow: ellipsis; + white-space: nowrap; +} +.chosen-container-single .chosen-single-with-deselect span { + margin-right: 38px; +} +.chosen-container-single .chosen-single abbr { + position: absolute; + top: 6px; + right: 26px; + display: block; + width: 12px; + height: 12px; + background: url('chosen-sprite.png') -42px 1px no-repeat; + font-size: 1px; +} +.chosen-container-single .chosen-single abbr:hover { + background-position: -42px -10px; +} +.chosen-container-single.chosen-disabled .chosen-single abbr:hover { + background-position: -42px -10px; +} +.chosen-container-single .chosen-single div { + position: absolute; + top: 0; + right: 0; + display: block; + width: 18px; + height: 100%; +} +.chosen-container-single .chosen-single div b { + display: block; + width: 100%; + height: 100%; + background: url('chosen-sprite.png') no-repeat 0px 7px; +} +.chosen-container-single .chosen-search { + position: relative; + z-index: 1010; + margin: 0; + padding: 3px 4px; + white-space: nowrap; +} +.chosen-container-single .chosen-search input[type="text"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + margin: 1px 0; + padding: 4px 20px 4px 5px; + width: 100%; + height: auto; + outline: 0; + border: 1px solid #aaa; + background: white url('chosen-sprite.png') no-repeat 100% -20px; + background: url('chosen-sprite.png') no-repeat 100% -20px; + font-size: 1em; + font-family: sans-serif; + line-height: normal; + border-radius: 0; +} +.chosen-container-single .chosen-drop { + margin-top: -1px; + border-radius: 0 0 4px 4px; + background-clip: padding-box; +} +.chosen-container-single.chosen-container-single-nosearch .chosen-search { + position: absolute; + left: -9999px; +} + +/* @end */ +/* @group Results */ +.chosen-container .chosen-results { + position: relative; + overflow-x: hidden; + overflow-y: auto; + margin: 0 4px 4px 0; + padding: 0 0 0 4px; + max-height: 240px; + -webkit-overflow-scrolling: touch; +} +.chosen-container .chosen-results li { + display: none; + margin: 0; + padding: 5px 6px; + list-style: none; + line-height: 15px; + -webkit-touch-callout: none; +} +.chosen-container .chosen-results li.active-result { + display: list-item; + cursor: pointer; +} +.chosen-container .chosen-results li.disabled-result { + display: list-item; + color: #ccc; + cursor: default; +} +.chosen-container .chosen-results li.highlighted { + background-color: #3875d7; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #3875d7), color-stop(90%, #2a62bc)); + background-image: -webkit-linear-gradient(#3875d7 20%, #2a62bc 90%); + background-image: -moz-linear-gradient(#3875d7 20%, #2a62bc 90%); + background-image: -o-linear-gradient(#3875d7 20%, #2a62bc 90%); + background-image: linear-gradient(#3875d7 20%, #2a62bc 90%); + color: #fff; +} +.chosen-container .chosen-results li.no-results { + display: list-item; + background: #f4f4f4; +} +.chosen-container .chosen-results li.group-result { + display: list-item; + font-weight: bold; + cursor: default; +} +.chosen-container .chosen-results li.group-option { + padding-left: 15px; +} +.chosen-container .chosen-results li em { + font-style: normal; + text-decoration: underline; +} + +/* @end */ +/* @group Multi Chosen */ +.chosen-container-multi .chosen-choices { + -moz-box-sizing: border-box; + background-color: #FFFFFF; + border: 1px solid #CBD5DD; + border-radius: 2px; + cursor: text; + height: auto !important; + margin: 0; + min-height: 30px; + overflow: hidden; + padding: 2px; + position: relative; + width: 100%; +} +.chosen-container-multi .chosen-choices li { + float: left; + list-style: none; +} +.chosen-container-multi .chosen-choices li.search-field { + margin: 0; + padding: 0; + white-space: nowrap; +} +.chosen-container-multi .chosen-choices li.search-field input[type="text"] { + margin: 1px 0; + padding: 5px; + height: 25px; + outline: 0; + border: 0 !important; + background: transparent !important; + box-shadow: none; + color: #666; + font-size: 100%; + font-family: sans-serif; + line-height: normal; + border-radius: 0; +} +.chosen-container-multi .chosen-choices li.search-field .default { + color: #999; +} +.chosen-container-multi .chosen-choices li.search-choice { + position: relative; + margin: 3px 0 3px 5px; + padding: 3px 20px 3px 5px; + border: 1px solid #aaa; + border-radius: 3px; + background-color: #e4e4e4; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee)); + background-image: -webkit-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: -moz-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: -o-linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: linear-gradient(#f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-clip: padding-box; + box-shadow: 0 0 2px white inset, 0 1px 0 rgba(0, 0, 0, 0.05); + color: #333; + line-height: 13px; + cursor: default; +} +.chosen-container-multi .chosen-choices li.search-choice .search-choice-close { + position: absolute; + top: 4px; + right: 3px; + display: block; + width: 12px; + height: 12px; + background: url('chosen-sprite.png') -42px 1px no-repeat; + font-size: 1px; +} +.chosen-container-multi .chosen-choices li.search-choice .search-choice-close:hover { + background-position: -42px -10px; +} +.chosen-container-multi .chosen-choices li.search-choice-disabled { + padding-right: 5px; + border: 1px solid #ccc; + background-color: #e4e4e4; + background-image: -webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eeeeee)); + background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: -o-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + background-image: linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eeeeee 100%); + color: #666; +} +.chosen-container-multi .chosen-choices li.search-choice-focus { + background: #d4d4d4; +} +.chosen-container-multi .chosen-choices li.search-choice-focus .search-choice-close { + background-position: -42px -10px; +} +.chosen-container-multi .chosen-results { + margin: 0; + padding: 0; +} +.chosen-container-multi .chosen-drop .result-selected { + display: list-item; + color: #ccc; + cursor: default; +} + +/* @end */ +/* @group Active */ +.chosen-container-active .chosen-single { + border: 1px solid #5897fb; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.3); +} +.chosen-container-active.chosen-with-drop .chosen-single { + border: 1px solid #aaa; + -moz-border-radius-bottomright: 0; + border-bottom-right-radius: 0; + -moz-border-radius-bottomleft: 0; + border-bottom-left-radius: 0; +} +.chosen-container-active.chosen-with-drop .chosen-single div { + border-left: none; + background: transparent; +} +.chosen-container-active.chosen-with-drop .chosen-single div b { + background-position: -18px 7px; +} +.chosen-container-active .chosen-choices { + border: 1px solid #5897fb; + box-shadow: 0 0 5px rgba(0, 0, 0, 0.3); +} +.chosen-container-active .chosen-choices li.search-field input[type="text"] { + color: #111 !important; +} + +/* @end */ +/* @group Disabled Support */ +.chosen-disabled { + opacity: 0.5 !important; + cursor: default; +} +.chosen-disabled .chosen-single { + cursor: default; +} +.chosen-disabled .chosen-choices .search-choice .search-choice-close { + cursor: default; +} + +/* @end */ +/* @group Right to Left */ +.chosen-rtl { + text-align: right; +} +.chosen-rtl .chosen-single { + overflow: visible; + padding: 0 8px 0 0; +} +.chosen-rtl .chosen-single span { + margin-right: 0; + margin-left: 26px; + direction: rtl; +} +.chosen-rtl .chosen-single-with-deselect span { + margin-left: 38px; +} +.chosen-rtl .chosen-single div { + right: auto; + left: 3px; +} +.chosen-rtl .chosen-single abbr { + right: auto; + left: 26px; +} +.chosen-rtl .chosen-choices li { + float: right; +} +.chosen-rtl .chosen-choices li.search-field input[type="text"] { + direction: rtl; +} +.chosen-rtl .chosen-choices li.search-choice { + margin: 3px 5px 3px 0; + padding: 3px 5px 3px 19px; +} +.chosen-rtl .chosen-choices li.search-choice .search-choice-close { + right: auto; + left: 4px; +} +.chosen-rtl.chosen-container-single-nosearch .chosen-search, +.chosen-rtl .chosen-drop { + left: 9999px; +} +.chosen-rtl.chosen-container-single .chosen-results { + margin: 0 0 4px 4px; + padding: 0 4px 0 0; +} +.chosen-rtl .chosen-results li.group-option { + padding-right: 15px; + padding-left: 0; +} +.chosen-rtl.chosen-container-active.chosen-with-drop .chosen-single div { + border-right: none; +} +.chosen-rtl .chosen-search input[type="text"] { + padding: 4px 5px 4px 20px; + background: white url('chosen-sprite.png') no-repeat -30px -20px; + background: url('chosen-sprite.png') no-repeat -30px -20px; + direction: rtl; +} +.chosen-rtl.chosen-container-single .chosen-single div b { + background-position: 6px 2px; +} +.chosen-rtl.chosen-container-single.chosen-with-drop .chosen-single div b { + background-position: -12px 2px; +} + +/* @end */ +/* @group Retina compatibility */ +@media only screen and (-webkit-min-device-pixel-ratio: 2), only screen and (min-resolution: 144dpi) { + .chosen-rtl .chosen-search input[type="text"], + .chosen-container-single .chosen-single abbr, + .chosen-container-single .chosen-single div b, + .chosen-container-single .chosen-search input[type="text"], + .chosen-container-multi .chosen-choices .search-choice .search-choice-close, + .chosen-container .chosen-results-scroll-down span, + .chosen-container .chosen-results-scroll-up span { + background-image: url('chosen-sprite@2x.png') !important; + background-size: 52px 37px !important; + background-repeat: no-repeat !important; + } +} +/* @end */ diff --git a/app-manage/src/main/resources/public/static/css/plugins/iCheck/custom.css b/app-manage/src/main/resources/public/static/css/plugins/iCheck/custom.css new file mode 100644 index 0000000..84e950b --- /dev/null +++ b/app-manage/src/main/resources/public/static/css/plugins/iCheck/custom.css @@ -0,0 +1,59 @@ +/* iCheck plugin Square skin, green +----------------------------------- */ +.icheckbox_square-green, +.iradio_square-green { + display: inline-block; + *display: inline; + vertical-align: middle; + margin: 0; + padding: 0; + width: 22px; + height: 22px; + background: url(green.png) no-repeat; + border: none; + cursor: pointer; +} + +.icheckbox_square-green { + background-position: 0 0; +} +.icheckbox_square-green.hover { + background-position: -24px 0; +} +.icheckbox_square-green.checked { + background-position: -48px 0; +} +.icheckbox_square-green.disabled { + background-position: -72px 0; + cursor: default; +} +.icheckbox_square-green.checked.disabled { + background-position: -96px 0; +} + +.iradio_square-green { + background-position: -120px 0; +} +.iradio_square-green.hover { + background-position: -144px 0; +} +.iradio_square-green.checked { + background-position: -168px 0; +} +.iradio_square-green.disabled { + background-position: -192px 0; + cursor: default; +} +.iradio_square-green.checked.disabled { + background-position: -216px 0; +} + +/* HiDPI support */ +@media (-o-min-device-pixel-ratio: 5/4), (-webkit-min-device-pixel-ratio: 1.25), (min-resolution: 120dpi) { + .icheckbox_square-green, + .iradio_square-green { + background-image: url(green@2x.png); + -webkit-background-size: 240px 24px; + background-size: 240px 24px; + } +} diff --git a/app-manage/src/main/resources/public/static/css/plugins/iCheck/green.png b/app-manage/src/main/resources/public/static/css/plugins/iCheck/green.png new file mode 100644 index 0000000..cf62300 Binary files /dev/null and b/app-manage/src/main/resources/public/static/css/plugins/iCheck/green.png differ diff --git a/app-manage/src/main/resources/public/static/css/plugins/iCheck/green@2x.png b/app-manage/src/main/resources/public/static/css/plugins/iCheck/green@2x.png new file mode 100644 index 0000000..3bda5be Binary files /dev/null and b/app-manage/src/main/resources/public/static/css/plugins/iCheck/green@2x.png differ diff --git a/app-manage/src/main/resources/public/static/css/style.css b/app-manage/src/main/resources/public/static/css/style.css new file mode 100644 index 0000000..6cf461d --- /dev/null +++ b/app-manage/src/main/resources/public/static/css/style.css @@ -0,0 +1,7928 @@ +/* + * + * H+ - 后台主题UI框架 + * version 4.0 + * +*/ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-weight: 100; +} + +h1 { + font-size: 30px; +} + +h2 { + font-size: 24px; +} + +h3 { + font-size: 16px; +} + +h4 { + font-size: 14px; +} + +h5 { + font-size: 12px; +} + +h6 { + font-size: 10px; +} + +h3, +h4, +h5 { + margin-top: 5px; + font-weight: 600; +} + +a:focus { + outline: none; +} + +.nav > li > a { + color: #a7b1c2; + font-weight: 600; + padding: 14px 20px 14px 25px; +} + +.nav li>a { + display: block; + /*white-space: nowrap;*/ +} + +.nav.navbar-right > li > a { + color: #999c9e; +} + +.nav > li.active > a { + color: #ffffff; +} + +.navbar-default .nav > li > a:hover, +.navbar-default .nav > li > a:focus { + background-color: #293846; + color: white; +} + +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background: #fff; +} + +.nav > li > a i { + margin-right: 6px; +} + +.navbar { + border: 0; +} + +.navbar-default { + background-color: transparent; + border-color: #2f4050; + position: relative; +} + +.navbar-top-links li { + display: inline-block; +} + +.navbar-top-links li:last-child { + margin-right: 30px; +} + +body.body-small .navbar-top-links li:last-child { + margin-right: 10px; +} + +.navbar-top-links li a { + padding: 20px 10px; + min-height: 50px; +} + +.dropdown-menu { + border: medium none; + display: none; + float: left; + font-size: 12px; + left: 0; + list-style: none outside none; + padding: 0; + position: absolute; + text-shadow: none; + top: 100%; + z-index: 1000; + border-radius: 0; + box-shadow: 0 0 3px rgba(86, 96, 117, 0.3); +} + +.dropdown-menu > li > a { + border-radius: 3px; + color: inherit; + line-height: 25px; + margin: 4px; + text-align: left; + font-weight: normal; +} + +.dropdown-menu > li > a.font-bold { + font-weight: 600; +} + +.navbar-top-links .dropdown-menu li { + display: block; +} + +.navbar-top-links .dropdown-menu li:last-child { + margin-right: 0; +} + +.navbar-top-links .dropdown-menu li a { + padding: 3px 20px; + min-height: 0; +} + +.navbar-top-links .dropdown-menu li a div { + white-space: normal; +} + +.navbar-top-links .dropdown-messages, +.navbar-top-links .dropdown-tasks, +.navbar-top-links .dropdown-alerts { + width: 310px; + min-width: 0; +} + +.navbar-top-links .dropdown-messages { + margin-left: 5px; +} + +.navbar-top-links .dropdown-tasks { + margin-left: -59px; +} + +.navbar-top-links .dropdown-alerts { + margin-left: -123px; +} + +.navbar-top-links .dropdown-user { + right: 0; + left: auto; +} + +.dropdown-messages, +.dropdown-alerts { + padding: 10px 10px 10px 10px; +} + +.dropdown-messages li a, +.dropdown-alerts li a { + font-size: 12px; +} + +.dropdown-messages li em, +.dropdown-alerts li em { + font-size: 10px; +} + +.nav.navbar-top-links .dropdown-alerts a { + font-size: 12px; +} + +.nav-header { + padding: 33px 25px; + background: url("patterns/header-profile.png") no-repeat; +} + +.pace-done .nav-header { + -webkit-transition: all 0.5s; + transition: all 0.5s; +} + +.nav > li.active { + border-left: 4px solid #19aa8d; + background: #293846; +} + +.nav.nav-second-level > li.active { + border: none; +} + +.nav.nav-second-level.collapse[style] { + height: auto !important; +} + +.nav-header a { + color: #DFE4ED; +} + +.nav-header .text-muted { + color: #8095a8; +} + +.minimalize-styl-2 { + padding: 4px 12px; + margin: 14px 5px 5px 20px; + font-size: 14px; + float: left; +} + +.navbar-form-custom { + float: left; + height: 50px; + padding: 0; + width: 200px; + display: inline-table; +} + +.navbar-form-custom .form-group { + margin-bottom: 0; +} + +.nav.navbar-top-links a { + font-size: 14px; +} + +.navbar-form-custom .form-control { + background: none repeat scroll 0 0 rgba(0, 0, 0, 0); + border: medium none; + font-size: 14px; + height: 60px; + margin: 0; + z-index: 2000; +} + +.count-info .label { + line-height: 12px; + padding: 1px 5px; + position: absolute; + right: 6px; + top: 12px; +} + +.arrow { + float: right; + margin-top: 2px; +} + +.fa.arrow:before { + content: "\f104"; +} + +.active > a > .fa.arrow:before { + content: "\f107"; +} + +.nav-second-level li, +.nav-third-level li { + border-bottom: none !important; +} + +.nav-second-level li a { + padding: 7px 15px 7px 10px; + padding-left: 52px; +} + +.nav-third-level li a { + padding-left: 62px; +} + +.nav-second-level li:last-child { + margin-bottom: 10px; +} + +body:not(.fixed-sidebar):not(.canvas-menu).mini-navbar .nav li:hover > .nav-second-level, +.mini-navbar .nav li:focus > .nav-second-level { + display: block; + border-radius: 0 2px 2px 0; + min-width: 140px; + height: auto; +} + +body.mini-navbar .navbar-default .nav > li > .nav-second-level li a { + font-size: 12px; + border-radius: 0 2px 2px 0; +} + +.fixed-nav .slimScrollDiv #side-menu { + padding-bottom: 60px; + position: relative; +} + +.slimScrollDiv >* { + overflow: hidden; +} + +.mini-navbar .nav-second-level li a { + padding: 10px 10px 10px 15px; +} + +.canvas-menu.mini-navbar .nav-second-level { + background: #293846; +} + +.mini-navbar li.active .nav-second-level { + left: 65px; +} + +.navbar-default .special_link a { + background: #1ab394; + color: white; +} + +.navbar-default .special_link a:hover { + background: #17987e !important; + color: white; +} + +.navbar-default .special_link a span.label { + background: #fff; + color: #1ab394; +} + +.navbar-default .landing_link a { + background: #1cc09f; + color: white; +} + +.navbar-default .landing_link a:hover { + background: #1ab394 !important; + color: white; +} + +.navbar-default .landing_link a span.label { + background: #fff; + color: #1cc09f; +} + +.logo-element { + text-align: center; + font-size: 18px; + font-weight: 600; + color: white; + display: none; + padding: 18px 0; +} + +.pace-done .navbar-static-side, +.pace-done .nav-header, +.pace-done li.active, +.pace-done #page-wrapper, +.pace-done .footer { + -webkit-transition: all 0.5s; + transition: all 0.5s; +} + +.navbar-fixed-top { + background: #fff; + -webkit-transition-duration: 0.5s; + transition-duration: 0.5s; + z-index: 2030; +} + +.navbar-fixed-top, +.navbar-static-top { + background: #f3f3f4; +} + +.fixed-nav #wrapper { + padding-top: 60px; + box-sizing: border-box; +} + +.fixed-nav .minimalize-styl-2 { + margin: 14px 5px 5px 15px; +} + +.body-small .navbar-fixed-top { + margin-left: 0px; +} + +body.mini-navbar .navbar-static-side { + width: 70px; +} + +body.mini-navbar .profile-element, +body.mini-navbar .nav-label, +body.mini-navbar .navbar-default .nav li a span { + display: none; +} + +body.canvas-menu .profile-element { + display: block; +} + +body:not(.fixed-sidebar):not(.canvas-menu).mini-navbar .nav-second-level { + display: none; +} + +body.mini-navbar .navbar-default .nav > li > a { + font-size: 16px; +} + +body.mini-navbar .logo-element { + display: block; +} + +body.canvas-menu .logo-element { + display: none; +} + +body.mini-navbar .nav-header { + padding: 0; + background-color: #1ab394; +} + +body.canvas-menu .nav-header { + padding: 33px 25px; +} + +body.mini-navbar #page-wrapper { + margin: 0 0 0 70px; +} + +body.canvas-menu.mini-navbar #page-wrapper, +body.canvas-menu.mini-navbar .footer { + margin: 0 0 0 0; +} + +body.fixed-sidebar .navbar-static-side, +body.canvas-menu .navbar-static-side { + position: fixed; + width: 220px; + z-index: 2001; + height: 100%; +} + +body.fixed-sidebar.mini-navbar .navbar-static-side { + width: 70px; +} + +body.fixed-sidebar.mini-navbar #page-wrapper { + margin: 0 0 0 70px; +} + +body.body-small.fixed-sidebar.mini-navbar #page-wrapper { + margin: 0 0 0 70px; +} + +body.body-small.fixed-sidebar.mini-navbar .navbar-static-side { + width: 70px; +} + +.fixed-sidebar.mini-navbar .nav li> .nav-second-level { + display: none; +} + +.fixed-sidebar.mini-navbar .nav li.active { + border-left-width: 0; +} + +.fixed-sidebar.mini-navbar .nav li:hover > .nav-second-level, +.canvas-menu.mini-navbar .nav li:hover > .nav-second-level { + position: absolute; + left: 70px; + top: 0px; + background-color: #2f4050; + padding: 10px 10px 0 10px; + font-size: 12px; + display: block; + min-width: 140px; + border-radius: 2px; +} + +body.fixed-sidebar.mini-navbar .navbar-default .nav > li > .nav-second-level li a { + font-size: 12px; + border-radius: 3px; +} + +body.canvas-menu.mini-navbar .navbar-default .nav > li > .nav-second-level li a { + font-size: 13px; + border-radius: 3px; +} + +.fixed-sidebar.mini-navbar .nav-second-level li a, +.canvas-menu.mini-navbar .nav-second-level li a { + padding: 10px 10px 10px 15px; +} + +.fixed-sidebar.mini-navbar .nav-second-level, +.canvas-menu.mini-navbar .nav-second-level { + position: relative; + padding: 0; + font-size: 13px; +} + +.fixed-sidebar.mini-navbar li.active .nav-second-level, +.canvas-menu.mini-navbar li.active .nav-second-level { + left: 0px; +} + +body.canvas-menu nav.navbar-static-side { + z-index: 2001; + background: #2f4050; + height: 100%; + position: fixed; + display: none; +} + +body.canvas-menu.mini-navbar nav.navbar-static-side { + display: block; + width: 70px; +} + +.top-navigation #page-wrapper { + margin-left: 0; +} + +.top-navigation .navbar-nav .dropdown-menu > .active > a { + background: white; + color: #1ab394; + font-weight: bold; +} + +.white-bg .navbar-fixed-top, +.white-bg .navbar-static-top { + background: #fff; +} + +.top-navigation .navbar { + margin-bottom: 0; +} + +.top-navigation .nav > li > a { + padding: 15px 20px; + color: #676a6c; +} + +.top-navigation .nav > li a:hover, +.top-navigation .nav > li a:focus { + background: #fff; + color: #1ab394; +} + +.top-navigation .nav > li.active { + background: #fff; + border: none; +} + +.top-navigation .nav > li.active > a { + color: #1ab394; +} + +.top-navigation .navbar-right { + padding-right: 10px; +} + +.top-navigation .navbar-nav .dropdown-menu { + box-shadow: none; + border: 1px solid #e7eaec; +} + +.top-navigation .dropdown-menu > li > a { + margin: 0; + padding: 7px 20px; +} + +.navbar .dropdown-menu { + margin-top: 0px; +} + +.top-navigation .navbar-brand { + background: #1ab394; + color: #fff; + padding: 15px 25px; +} + +.top-navigation .navbar-top-links li:last-child { + margin-right: 0; +} + +.top-navigation.mini-navbar #page-wrapper, +.top-navigation.body-small.fixed-sidebar.mini-navbar #page-wrapper, +.mini-navbar .top-navigation #page-wrapper, +.body-small.fixed-sidebar.mini-navbar .top-navigation #page-wrapper, +.canvas-menu #page-wrapper { + margin: 0; +} + +.top-navigation.fixed-nav #wrapper, +.fixed-nav #wrapper.top-navigation { + margin-top: 50px; +} + +.top-navigation .footer.fixed { + margin-left: 0 !important; +} + +.top-navigation .wrapper.wrapper-content { + padding: 40px; +} + +.top-navigation.body-small .wrapper.wrapper-content, +.body-small .top-navigation .wrapper.wrapper-content { + padding: 40px 0px 40px 0px; +} + +.navbar-toggle { + background-color: #1ab394; + color: #fff; + padding: 6px 12px; + font-size: 14px; +} + +.top-navigation .navbar-nav .open .dropdown-menu > li > a, +.top-navigation .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 10px 15px 10px 20px; +} + +@media (max-width: 768px) { + .top-navigation .navbar-header { + display: block; + float: none; + } +} + +.menu-visible-lg, +.menu-visible-md { + display: none !important; +} + +@media (min-width: 1200px) { + .menu-visible-lg { + display: block !important; + } +} + +@media (min-width: 992px) { + .menu-visible-md { + display: block !important; + } +} + +@media (max-width: 767px) { + .menu-visible-md { + display: block !important; + } + .menu-visible-lg { + display: block !important; + } +} + +.btn { + border-radius: 3px; +} + +.float-e-margins .btn { + margin-bottom: 5px; +} + +.btn-w-m { + min-width: 120px; +} + +.btn-primary.btn-outline { + color: #1ab394; +} + +.btn-success.btn-outline { + color: #1c84c6; +} + +.btn-info.btn-outline { + color: #23c6c8; +} + +.btn-warning.btn-outline { + color: #f8ac59; +} + +.btn-danger.btn-outline { + color: #ed5565; +} + +.btn-primary.btn-outline:hover, +.btn-success.btn-outline:hover, +.btn-info.btn-outline:hover, +.btn-warning.btn-outline:hover, +.btn-danger.btn-outline:hover { + color: #fff; +} + +.btn-primary { + background-color: #1ab394; + border-color: #1ab394; + color: #FFFFFF; +} + +.btn-primary:hover, +.btn-primary:focus, +.btn-primary:active, +.btn-primary.active, +.open .dropdown-toggle.btn-primary { + background-color: #18a689; + border-color: #18a689; + color: #FFFFFF; +} + +.btn-primary:active, +.btn-primary.active, +.open .dropdown-toggle.btn-primary { + background-image: none; +} + +.btn-primary.disabled, +.btn-primary.disabled:hover, +.btn-primary.disabled:focus, +.btn-primary.disabled:active, +.btn-primary.disabled.active, +.btn-primary[disabled], +.btn-primary[disabled]:hover, +.btn-primary[disabled]:focus, +.btn-primary[disabled]:active, +.btn-primary.active[disabled], +fieldset[disabled] .btn-primary, +fieldset[disabled] .btn-primary:hover, +fieldset[disabled] .btn-primary:focus, +fieldset[disabled] .btn-primary:active, +fieldset[disabled] .btn-primary.active { + background-color: #1dc5a3; + border-color: #1dc5a3; +} + +.btn-success { + background-color: #1c84c6; + border-color: #1c84c6; + color: #FFFFFF; +} + +.btn-success:hover, +.btn-success:focus, +.btn-success:active, +.btn-success.active, +.open .dropdown-toggle.btn-success { + background-color: #1a7bb9; + border-color: #1a7bb9; + color: #FFFFFF; +} + +.btn-success:active, +.btn-success.active, +.open .dropdown-toggle.btn-success { + background-image: none; +} + +.btn-success.disabled, +.btn-success.disabled:hover, +.btn-success.disabled:focus, +.btn-success.disabled:active, +.btn-success.disabled.active, +.btn-success[disabled], +.btn-success[disabled]:hover, +.btn-success[disabled]:focus, +.btn-success[disabled]:active, +.btn-success.active[disabled], +fieldset[disabled] .btn-success, +fieldset[disabled] .btn-success:hover, +fieldset[disabled] .btn-success:focus, +fieldset[disabled] .btn-success:active, +fieldset[disabled] .btn-success.active { + background-color: #1f90d8; + border-color: #1f90d8; +} + +.btn-info { + background-color: #23c6c8; + border-color: #23c6c8; + color: #FFFFFF; +} + +.btn-info:hover, +.btn-info:focus, +.btn-info:active, +.btn-info.active, +.open .dropdown-toggle.btn-info { + background-color: #21b9bb; + border-color: #21b9bb; + color: #FFFFFF; +} + +.btn-info:active, +.btn-info.active, +.open .dropdown-toggle.btn-info { + background-image: none; +} + +.btn-info.disabled, +.btn-info.disabled:hover, +.btn-info.disabled:focus, +.btn-info.disabled:active, +.btn-info.disabled.active, +.btn-info[disabled], +.btn-info[disabled]:hover, +.btn-info[disabled]:focus, +.btn-info[disabled]:active, +.btn-info.active[disabled], +fieldset[disabled] .btn-info, +fieldset[disabled] .btn-info:hover, +fieldset[disabled] .btn-info:focus, +fieldset[disabled] .btn-info:active, +fieldset[disabled] .btn-info.active { + background-color: #26d7d9; + border-color: #26d7d9; +} + +.btn-default { + background-color: #c2c2c2; + border-color: #c2c2c2; + color: #FFFFFF; +} + +.btn-default:hover, +.btn-default:focus, +.btn-default:active, +.btn-default.active, +.open .dropdown-toggle.btn-default { + background-color: #bababa; + border-color: #bababa; + color: #FFFFFF; +} + +.btn-default:active, +.btn-default.active, +.open .dropdown-toggle.btn-default { + background-image: none; +} + +.btn-default.disabled, +.btn-default.disabled:hover, +.btn-default.disabled:focus, +.btn-default.disabled:active, +.btn-default.disabled.active, +.btn-default[disabled], +.btn-default[disabled]:hover, +.btn-default[disabled]:focus, +.btn-default[disabled]:active, +.btn-default.active[disabled], +fieldset[disabled] .btn-default, +fieldset[disabled] .btn-default:hover, +fieldset[disabled] .btn-default:focus, +fieldset[disabled] .btn-default:active, +fieldset[disabled] .btn-default.active { + background-color: #cccccc; + border-color: #cccccc; +} + +.btn-warning { + background-color: #f8ac59; + border-color: #f8ac59; + color: #FFFFFF; +} + +.btn-warning:hover, +.btn-warning:focus, +.btn-warning:active, +.btn-warning.active, +.open .dropdown-toggle.btn-warning { + background-color: #f7a54a; + border-color: #f7a54a; + color: #FFFFFF; +} + +.btn-warning:active, +.btn-warning.active, +.open .dropdown-toggle.btn-warning { + background-image: none; +} + +.btn-warning.disabled, +.btn-warning.disabled:hover, +.btn-warning.disabled:focus, +.btn-warning.disabled:active, +.btn-warning.disabled.active, +.btn-warning[disabled], +.btn-warning[disabled]:hover, +.btn-warning[disabled]:focus, +.btn-warning[disabled]:active, +.btn-warning.active[disabled], +fieldset[disabled] .btn-warning, +fieldset[disabled] .btn-warning:hover, +fieldset[disabled] .btn-warning:focus, +fieldset[disabled] .btn-warning:active, +fieldset[disabled] .btn-warning.active { + background-color: #f9b66d; + border-color: #f9b66d; +} + +.btn-danger { + background-color: #ed5565; + border-color: #ed5565; + color: #FFFFFF; +} + +.btn-danger:hover, +.btn-danger:focus, +.btn-danger:active, +.btn-danger.active, +.open .dropdown-toggle.btn-danger { + background-color: #ec4758; + border-color: #ec4758; + color: #FFFFFF; +} + +.btn-danger:active, +.btn-danger.active, +.open .dropdown-toggle.btn-danger { + background-image: none; +} + +.btn-danger.disabled, +.btn-danger.disabled:hover, +.btn-danger.disabled:focus, +.btn-danger.disabled:active, +.btn-danger.disabled.active, +.btn-danger[disabled], +.btn-danger[disabled]:hover, +.btn-danger[disabled]:focus, +.btn-danger[disabled]:active, +.btn-danger.active[disabled], +fieldset[disabled] .btn-danger, +fieldset[disabled] .btn-danger:hover, +fieldset[disabled] .btn-danger:focus, +fieldset[disabled] .btn-danger:active, +fieldset[disabled] .btn-danger.active { + background-color: #ef6776; + border-color: #ef6776; +} + +.btn-link { + color: inherit; +} + +.btn-link:hover, +.btn-link:focus, +.btn-link:active, +.btn-link.active, +.open .dropdown-toggle.btn-link { + color: #1ab394; + text-decoration: none; +} + +.btn-link:active, +.btn-link.active, +.open .dropdown-toggle.btn-link { + background-image: none; +} + +.btn-link.disabled, +.btn-link.disabled:hover, +.btn-link.disabled:focus, +.btn-link.disabled:active, +.btn-link.disabled.active, +.btn-link[disabled], +.btn-link[disabled]:hover, +.btn-link[disabled]:focus, +.btn-link[disabled]:active, +.btn-link.active[disabled], +fieldset[disabled] .btn-link, +fieldset[disabled] .btn-link:hover, +fieldset[disabled] .btn-link:focus, +fieldset[disabled] .btn-link:active, +fieldset[disabled] .btn-link.active { + color: #cacaca; +} + +.btn-white { + color: inherit; + background: white; + border: 1px solid #e7eaec; +} + +.btn-white:hover, +.btn-white:focus, +.btn-white:active, +.btn-white.active, +.open .dropdown-toggle.btn-white { + color: inherit; + border: 1px solid #d2d2d2; +} + +.btn-white:active, +.btn-white.active { + box-shadow: 0 2px 5px rgba(0, 0, 0, 0.15) inset; +} + +.btn-white:active, +.btn-white.active, +.open .dropdown-toggle.btn-white { + background-image: none; +} + +.btn-white.disabled, +.btn-white.disabled:hover, +.btn-white.disabled:focus, +.btn-white.disabled:active, +.btn-white.disabled.active, +.btn-white[disabled], +.btn-white[disabled]:hover, +.btn-white[disabled]:focus, +.btn-white[disabled]:active, +.btn-white.active[disabled], +fieldset[disabled] .btn-white, +fieldset[disabled] .btn-white:hover, +fieldset[disabled] .btn-white:focus, +fieldset[disabled] .btn-white:active, +fieldset[disabled] .btn-white.active { + color: #cacaca; +} + +.form-control, +.form-control:focus, +.has-error .form-control:focus, +.has-success .form-control:focus, +.has-warning .form-control:focus, +.navbar-collapse, +.navbar-form, +.navbar-form-custom .form-control:focus, +.navbar-form-custom .form-control:hover, +.open .btn.dropdown-toggle, +.panel, +.popover, +.progress, +.progress-bar { + box-shadow: none; +} + +.btn-outline { + color: inherit; + background-color: transparent; + -webkit-transition: all .5s; + transition: all .5s; +} + +.btn-rounded { + border-radius: 50px; +} + +.btn-large-dim { + width: 90px; + height: 90px; + font-size: 42px; +} + +button.dim { + display: inline-block; + color: #fff; + text-decoration: none; + text-transform: uppercase; + text-align: center; + padding-top: 6px; + margin-right: 10px; + position: relative; + cursor: pointer; + border-radius: 5px; + font-weight: 600; + margin-bottom: 20px !important; +} + +button.dim:active { + top: 3px; +} + +button.btn-primary.dim { + box-shadow: inset 0px 0px 0px #16987e, 0px 5px 0px 0px #16987e, 0px 10px 5px #999999; +} + +button.btn-primary.dim:active { + box-shadow: inset 0px 0px 0px #16987e, 0px 2px 0px 0px #16987e, 0px 5px 3px #999999; +} + +button.btn-default.dim { + box-shadow: inset 0px 0px 0px #b3b3b3, 0px 5px 0px 0px #b3b3b3, 0px 10px 5px #999999; +} + +button.btn-default.dim:active { + box-shadow: inset 0px 0px 0px #b3b3b3, 0px 2px 0px 0px #b3b3b3, 0px 5px 3px #999999; +} + +button.btn-warning.dim { + box-shadow: inset 0px 0px 0px #f79d3c, 0px 5px 0px 0px #f79d3c, 0px 10px 5px #999999; +} + +button.btn-warning.dim:active { + box-shadow: inset 0px 0px 0px #f79d3c, 0px 2px 0px 0px #f79d3c, 0px 5px 3px #999999; +} + +button.btn-info.dim { + box-shadow: inset 0px 0px 0px #1eacae, 0px 5px 0px 0px #1eacae, 0px 10px 5px #999999; +} + +button.btn-info.dim:active { + box-shadow: inset 0px 0px 0px #1eacae, 0px 2px 0px 0px #1eacae, 0px 5px 3px #999999; +} + +button.btn-success.dim { + box-shadow: inset 0px 0px 0px #1872ab, 0px 5px 0px 0px #1872ab, 0px 10px 5px #999999; +} + +button.btn-success.dim:active { + box-shadow: inset 0px 0px 0px #1872ab, 0px 2px 0px 0px #1872ab, 0px 5px 3px #999999; +} + +button.btn-danger.dim { + box-shadow: inset 0px 0px 0px #ea394c, 0px 5px 0px 0px #ea394c, 0px 10px 5px #999999; +} + +button.btn-danger.dim:active { + box-shadow: inset 0px 0px 0px #ea394c, 0px 2px 0px 0px #ea394c, 0px 5px 3px #999999; +} + +button.dim:before { + font-size: 50px; + line-height: 1em; + font-weight: normal; + color: #fff; + display: block; + padding-top: 10px; +} + +button.dim:active:before { + top: 7px; + font-size: 50px; +} + +.label { + background-color: #d1dade; + color: #5e5e5e; + font-size: 10px; + font-weight: 600; + padding: 3px 8px; + text-shadow: none; +} + +.badge { + background-color: #d1dade; + color: #5e5e5e; + font-size: 11px; + font-weight: 600; + padding-bottom: 4px; + padding-left: 6px; + padding-right: 6px; + text-shadow: none; +} + +.label-primary, +.badge-primary { + background-color: #1ab394; + color: #FFFFFF; +} + +.label-success, +.badge-success { + background-color: #1c84c6; + color: #FFFFFF; +} + +.label-warning, +.badge-warning { + background-color: #f8ac59; + color: #FFFFFF; +} + +.label-warning-light, +.badge-warning-light { + background-color: #f8ac59; + color: #ffffff; +} + +.label-danger, +.badge-danger { + background-color: #ed5565; + color: #FFFFFF; +} + +.label-info, +.badge-info { + background-color: #23c6c8; + color: #FFFFFF; +} + +.label-inverse, +.badge-inverse { + background-color: #262626; + color: #FFFFFF; +} + +.label-white, +.badge-white { + background-color: #FFFFFF; + color: #5E5E5E; +} + +.label-white, +.badge-disable { + background-color: #2A2E36; + color: #8B91A0; +} + + +/* TOOGLE SWICH */ + +.onoffswitch { + position: relative; + width: 64px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; +} + +.onoffswitch-checkbox { + display: none; +} + +.onoffswitch-label { + display: block; + overflow: hidden; + cursor: pointer; + border: 2px solid #1ab394; + border-radius: 2px; +} + +.onoffswitch-inner { + width: 200%; + margin-left: -100%; + -webkit-transition: margin 0.3s ease-in 0s; + transition: margin 0.3s ease-in 0s; +} + +.onoffswitch-inner:before, +.onoffswitch-inner:after { + float: left; + width: 50%; + height: 20px; + padding: 0; + line-height: 20px; + font-size: 12px; + color: white; + font-family: Trebuchet, Arial, sans-serif; + font-weight: bold; + box-sizing: border-box; +} + +.onoffswitch-inner:before { + content: "ON"; + padding-left: 10px; + background-color: #1ab394; + color: #FFFFFF; +} + +.onoffswitch-inner:after { + content: "OFF"; + padding-right: 10px; + background-color: #FFFFFF; + color: #999999; + text-align: right; +} + +.onoffswitch-switch { + width: 20px; + margin: 0px; + background: #FFFFFF; + border: 2px solid #1ab394; + border-radius: 2px; + position: absolute; + top: 0; + bottom: 0; + right: 44px; + -webkit-transition: all 0.3s ease-in 0s; + transition: all 0.3s ease-in 0s; +} + +.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-inner { + margin-left: 0; +} + +.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-switch { + right: 0px; +} + + +/* CHOSEN PLUGIN */ + +.chosen-container-single .chosen-single { + background: #ffffff; + box-shadow: none; + -moz-box-sizing: border-box; + background-color: #FFFFFF; + border: 1px solid #CBD5DD; + border-radius: 2px; + cursor: text; + height: auto !important; + margin: 0; + min-height: 30px; + overflow: hidden; + padding: 4px 12px; + position: relative; + width: 100%; +} + +.chosen-container-multi .chosen-choices li.search-choice { + background: #f1f1f1; + border: 1px solid #ededed; + border-radius: 2px; + box-shadow: none; + color: #333333; + cursor: default; + line-height: 13px; + margin: 3px 0 3px 5px; + padding: 3px 20px 3px 5px; + position: relative; +} + + +/* PAGINATIN */ + +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + background-color: #f4f4f4; + border-color: #DDDDDD; + color: inherit; + cursor: default; + z-index: 2; +} + +.pagination > li > a, +.pagination > li > span { + background-color: #FFFFFF; + border: 1px solid #DDDDDD; + color: inherit; + float: left; + line-height: 1.42857; + margin-left: -1px; + padding: 4px 10px; + position: relative; + text-decoration: none; +} + + +/* TOOLTIPS */ + +.tooltip-inner { + background-color: #2F4050; +} + +.tooltip.top .tooltip-arrow { + border-top-color: #2F4050; +} + +.tooltip.right .tooltip-arrow { + border-right-color: #2F4050; +} + +.tooltip.bottom .tooltip-arrow { + border-bottom-color: #2F4050; +} + +.tooltip.left .tooltip-arrow { + border-left-color: #2F4050; +} + + +/* EASY PIE CHART*/ + +.easypiechart { + position: relative; + text-align: center; +} + +.easypiechart .h2 { + margin-left: 10px; + margin-top: 10px; + display: inline-block; +} + +.easypiechart canvas { + top: 0; + left: 0; +} + +.easypiechart .easypie-text { + line-height: 1; + position: absolute; + top: 33px; + width: 100%; + z-index: 1; +} + +.easypiechart img { + margin-top: -4px; +} + +.jqstooltip { + box-sizing: content-box; +} + + +/* FULLCALENDAR */ + +.fc-state-default { + background-color: #ffffff; + background-image: none; + background-repeat: repeat-x; + box-shadow: none; + color: #333333; + text-shadow: none; +} + +.fc-state-default { + border: 1px solid; +} + +.fc-button { + color: inherit; + border: 1px solid #e7eaec; + cursor: pointer; + display: inline-block; + height: 1.9em; + line-height: 1.9em; + overflow: hidden; + padding: 0 0.6em; + position: relative; + white-space: nowrap; +} + +.fc-state-active { + background-color: #1ab394; + border-color: #1ab394; + color: #ffffff; +} + +.fc-header-title h2 { + font-size: 16px; + font-weight: 600; + color: inherit; +} + +.fc-content .fc-widget-header, +.fc-content .fc-widget-content { + border-color: #e7eaec; + font-weight: normal; +} + +.fc-border-separate tbody { + background-color: #F8F8F8; +} + +.fc-state-highlight { + background: none repeat scroll 0 0 #FCF8E3; +} + +.external-event { + padding: 5px 10px; + border-radius: 2px; + cursor: pointer; + margin-bottom: 5px; +} + +.fc-ltr .fc-event-hori.fc-event-end, +.fc-rtl .fc-event-hori.fc-event-start { + border-radius: 2px; +} + +.fc-event, +.fc-agenda .fc-event-time, +.fc-event a { + padding: 4px 6px; + background-color: #1ab394; + /* background color */ + border-color: #1ab394; + /* border color */ +} + +.fc-event-time, +.fc-event-title { + color: #717171; + padding: 0 1px; +} + +.ui-calendar .fc-event-time, +.ui-calendar .fc-event-title { + color: #fff; +} + + +/* Chat */ + +.chat-activity-list .chat-element { + border-bottom: 1px solid #e7eaec; +} + +.chat-element:first-child { + margin-top: 0; +} + +.chat-element { + padding-bottom: 15px; +} + +.chat-element, +.chat-element .media { + margin-top: 15px; +} + +.chat-element, +.media-body { + overflow: hidden; +} + +.media-body { + display: block; + width: auto; +} + +.chat-element > .pull-left { + margin-right: 10px; +} + +.chat-element img.img-circle, +.dropdown-messages-box img.img-circle { + width: 38px; + height: 38px; +} + +.chat-element .well { + border: 1px solid #e7eaec; + box-shadow: none; + margin-top: 10px; + margin-bottom: 5px; + padding: 10px 20px; + font-size: 11px; + line-height: 16px; +} + +.chat-element .actions { + margin-top: 10px; +} + +.chat-element .photos { + margin: 10px 0; +} + +.right.chat-element > .pull-right { + margin-left: 10px; +} + +.chat-photo { + max-height: 180px; + border-radius: 4px; + overflow: hidden; + margin-right: 10px; + margin-bottom: 10px; +} + +.chat { + margin: 0; + padding: 0; + list-style: none; +} + +.chat li { + margin-bottom: 10px; + padding-bottom: 5px; + border-bottom: 1px dotted #B3A9A9; +} + +.chat li.left .chat-body { + margin-left: 60px; +} + +.chat li.right .chat-body { + margin-right: 60px; +} + +.chat li .chat-body p { + margin: 0; + color: #777777; +} + +.panel .slidedown .glyphicon, +.chat .glyphicon { + margin-right: 5px; +} + +.chat-panel .panel-body { + height: 350px; + overflow-y: scroll; +} + + +/* LIST GROUP */ + +a.list-group-item.active, +a.list-group-item.active:hover, +a.list-group-item.active:focus { + background-color: #1ab394; + border-color: #1ab394; + color: #FFFFFF; + z-index: 2; +} + +.list-group-item-heading { + margin-top: 10px; +} + +.list-group-item-text { + margin: 0 0 10px; + color: inherit; + font-size: 12px; + line-height: inherit; +} + +.no-padding .list-group-item { + border-left: none; + border-right: none; + border-bottom: none; +} + +.no-padding .list-group-item:first-child { + border-left: none; + border-right: none; + border-bottom: none; + border-top: none; +} + +.no-padding .list-group { + margin-bottom: 0; +} + +.list-group-item { + background-color: inherit; + border: 1px solid #e7eaec; + display: block; + margin-bottom: -1px; + padding: 10px 15px; + position: relative; +} + +.elements-list .list-group-item { + border-left: none; + border-right: none; + /*border-top: none;*/ + padding: 15px 25px; +} + +.elements-list .list-group-item:first-child { + border-left: none; + border-right: none; + border-top: none !important; +} + +.elements-list .list-group { + margin-bottom: 0; +} + +.elements-list a { + color: inherit; +} + +.elements-list .list-group-item.active, +.elements-list .list-group-item:hover { + background: #f3f3f4; + color: inherit; + border-color: #e7eaec; + /*border-bottom: 1px solid #e7eaec;*/ + /*border-top: 1px solid #e7eaec;*/ + border-radius: 0; +} + +.elements-list li.active { + -webkit-transition: none; + transition: none; +} + +.element-detail-box { + padding: 25px; +} + + +/* FLOT CHART */ + +.flot-chart { + display: block; + height: 200px; +} + +.widget .flot-chart.dashboard-chart { + display: block; + height: 120px; + margin-top: 40px; +} + +.flot-chart.dashboard-chart { + display: block; + height: 180px; + margin-top: 40px; +} + +.flot-chart-content { + width: 100%; + height: 100%; +} + +.flot-chart-pie-content { + width: 200px; + height: 200px; + margin: auto; +} + +.jqstooltip { + position: absolute; + display: block; + left: 0px; + top: 0px; + visibility: hidden; + background: #2b303a; + background-color: rgba(43, 48, 58, 0.8); + color: white; + text-align: left; + white-space: nowrap; + z-index: 10000; + padding: 5px 5px 5px 5px; + min-height: 22px; + border-radius: 3px; +} + +.jqsfield { + color: white; + text-align: left; +} + +.h-200 { + min-height: 200px; +} + +.legendLabel { + padding-left: 5px; +} + +.stat-list li:first-child { + margin-top: 0; +} + +.stat-list { + list-style: none; + padding: 0; + margin: 0; +} + +.stat-percent { + float: right; +} + +.stat-list li { + margin-top: 15px; + position: relative; +} + + +/* DATATABLES */ + +table.dataTable thead .sorting, +table.dataTable thead .sorting_asc:after, +table.dataTable thead .sorting_desc, +table.dataTable thead .sorting_asc_disabled, +table.dataTable thead .sorting_desc_disabled { + background: transparent; +} + +table.dataTable thead .sorting_asc:after { + float: right; + font-family: fontawesome; +} + +table.dataTable thead .sorting_desc:after { + content: "\f0dd"; + float: right; + font-family: fontawesome; +} + +table.dataTable thead .sorting:after { + content: "\f0dc"; + float: right; + font-family: fontawesome; + color: rgba(50, 50, 50, 0.5); +} + +.dataTables_wrapper { + padding-bottom: 30px; +} + + +/* CIRCLE */ + +.img-circle { + border-radius: 50%; +} + +.btn-circle { + width: 30px; + height: 30px; + padding: 6px 0; + border-radius: 15px; + text-align: center; + font-size: 12px; + line-height: 1.428571429; +} + +.btn-circle.btn-lg { + width: 50px; + height: 50px; + padding: 10px 16px; + border-radius: 25px; + font-size: 18px; + line-height: 1.33; +} + +.btn-circle.btn-xl { + width: 70px; + height: 70px; + padding: 10px 16px; + border-radius: 35px; + font-size: 24px; + line-height: 1.33; +} + +.show-grid [class^="col-"] { + padding-top: 10px; + padding-bottom: 10px; + border: 1px solid #ddd; + background-color: #eee !important; +} + +.show-grid { + margin: 15px 0; +} + + +/* ANIMATION */ + +.css-animation-box h1 { + font-size: 44px; +} + +.animation-efect-links a { + padding: 4px 6px; + font-size: 12px; +} + +#animation_box { + background-color: #f9f8f8; + border-radius: 16px; + width: 80%; + margin: 0 auto; + padding-top: 80px; +} + +.animation-text-box { + position: absolute; + margin-top: 40px; + left: 50%; + margin-left: -100px; + width: 200px; +} + +.animation-text-info { + position: absolute; + margin-top: -60px; + left: 50%; + margin-left: -100px; + width: 200px; + font-size: 10px; +} + +.animation-text-box h2 { + font-size: 54px; + font-weight: 600; + margin-bottom: 5px; +} + +.animation-text-box p { + font-size: 12px; + text-transform: uppercase; +} + + +/* PEACE */ + +.pace { + -webkit-pointer-events: none; + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.pace-inactive { + display: none; +} + +.pace .pace-progress { + background: #1ab394; + position: fixed; + z-index: 2000; + top: 0; + width: 100%; + height: 2px; +} + +.pace-inactive { + display: none; +} + + +/* WIDGETS */ + +.widget { + border-radius: 5px; + padding: 15px 20px; + margin-bottom: 10px; + margin-top: 10px; +} + +.widget.style1 h2 { + font-size: 30px; +} + +.widget h2, +.widget h3 { + margin-top: 5px; + margin-bottom: 0; +} + +.widget-text-box { + padding: 20px; + border: 1px solid #e7eaec; + background: #ffffff; +} + +.widget-head-color-box { + border-radius: 5px 5px 0px 0px; + margin-top: 10px; +} + +.widget .flot-chart { + height: 100px; +} + +.vertical-align div { + display: inline-block; + vertical-align: middle; +} + +.vertical-align h2, +.vertical-align h3 { + margin: 0; +} + +.todo-list { + list-style: none outside none; + margin: 0; + padding: 0; + font-size: 14px; +} + +.todo-list.small-list { + font-size: 12px; +} + +.todo-list.small-list > li { + background: #f3f3f4; + border-left: none; + border-right: none; + border-radius: 4px; + color: inherit; + margin-bottom: 2px; + padding: 6px 6px 6px 12px; +} + +.todo-list.small-list .btn-xs, +.todo-list.small-list .btn-group-xs > .btn { + border-radius: 5px; + font-size: 10px; + line-height: 1.5; + padding: 1px 2px 1px 5px; +} + +.todo-list > li { + background: #f3f3f4; + border-left: 6px solid #e7eaec; + border-right: 6px solid #e7eaec; + border-radius: 4px; + color: inherit; + margin-bottom: 2px; + padding: 10px; +} + +.todo-list .handle { + cursor: move; + display: inline-block; + font-size: 16px; + margin: 0 5px; +} + +.todo-list > li .label { + font-size: 9px; + margin-left: 10px; +} + +.check-link { + font-size: 16px; +} + +.todo-completed { + text-decoration: line-through; +} + +.geo-statistic h1 { + font-size: 36px; + margin-bottom: 0; +} + +.glyphicon.fa { + font-family: "FontAwesome"; +} + + +/* INPUTS */ + +.inline { + display: inline-block !important; +} + +.input-s-sm { + width: 120px; +} + +.input-s { + width: 200px; +} + +.input-s-lg { + width: 250px; +} + +.i-checks { + padding-left: 0; +} + +.form-control, +.single-line { + background-color: #FFFFFF; + background-image: none; + border: 1px solid #e5e6e7; + border-radius: 1px; + color: inherit; + display: block; + padding: 6px 12px; + -webkit-transition: border-color 0.15s ease-in-out 0s, box-shadow 0.15s ease-in-out 0s; + transition: border-color 0.15s ease-in-out 0s, box-shadow 0.15s ease-in-out 0s; + width: 100%; + font-size: 14px; +} + +.form-control:focus, +.single-line:focus { + border-color: #1ab394 !important; +} + +.has-success .form-control { + border-color: #1ab394; +} + +.has-warning .form-control { + border-color: #f8ac59; +} + +.has-error .form-control { + border-color: #ed5565; +} + +.has-success .control-label { + color: #1ab394; +} + +.has-warning .control-label { + color: #f8ac59; +} + +.has-error .control-label { + color: #ed5565; +} + +.input-group-addon { + background-color: #fff; + border: 1px solid #E5E6E7; + border-radius: 1px; + color: inherit; + font-size: 14px; + font-weight: 400; + line-height: 1; + padding: 6px 12px; + text-align: center; +} + +.spinner-buttons.input-group-btn .btn-xs { + line-height: 1.13; +} + +.spinner-buttons.input-group-btn { + width: 20%; +} + +.noUi-connect { + background: none repeat scroll 0 0 #1ab394; + box-shadow: none; +} + +.slider_red .noUi-connect { + background: none repeat scroll 0 0 #ed5565; + box-shadow: none; +} + + +/* UI Sortable */ + +.ui-sortable .ibox-title { + cursor: move; +} + +.ui-sortable-placeholder { + border: 1px dashed #cecece !important; + visibility: visible !important; + background: #e7eaec; +} + +.ibox.ui-sortable-placeholder { + margin: 0px 0px 23px !important; +} + + +/* Tabs */ + +.tabs-container .panel-body { + background: #fff; + border: 1px solid #e7eaec; + border-radius: 2px; + padding: 20px; + position: relative; +} + +.tabs-container .nav-tabs > li.active > a, +.tabs-container .nav-tabs > li.active > a:hover, +.tabs-container .nav-tabs > li.active > a:focus { + border: 1px solid #e7eaec; + border-bottom-color: transparent; + background-color: #fff; +} + +.tabs-container .nav-tabs > li { + float: left; + margin-bottom: -1px; +} + +.tabs-container .tab-pane .panel-body { + border-top: none; +} + +.tabs-container .nav-tabs > li.active > a, +.tabs-container .nav-tabs > li.active > a:hover, +.tabs-container .nav-tabs > li.active > a:focus { + border: 1px solid #e7eaec; + border-bottom-color: transparent; +} + +.tabs-container .nav-tabs { + border-bottom: 1px solid #e7eaec; +} + +.tabs-container .tab-pane .panel-body { + border-top: none; +} + +.tabs-container .tabs-left .tab-pane .panel-body, +.tabs-container .tabs-right .tab-pane .panel-body { + border-top: 1px solid #e7eaec; +} + +.tabs-container .nav-tabs > li a:hover { + background: transparent; + border-color: transparent; +} + +.tabs-container .tabs-below > .nav-tabs, +.tabs-container .tabs-right > .nav-tabs, +.tabs-container .tabs-left > .nav-tabs { + border-bottom: 0; +} + +.tabs-container .tabs-left .panel-body { + position: static; +} + +.tabs-container .tabs-left > .nav-tabs, +.tabs-container .tabs-right > .nav-tabs { + width: 20%; +} + +.tabs-container .tabs-left .panel-body { + width: 80%; + margin-left: 20%; +} + +.tabs-container .tabs-right .panel-body { + width: 80%; + margin-right: 20%; +} + +.tabs-container .tab-content > .tab-pane, +.tabs-container .pill-content > .pill-pane { + display: none; +} + +.tabs-container .tab-content > .active, +.tabs-container .pill-content > .active { + display: block; +} + +.tabs-container .tabs-below > .nav-tabs { + border-top: 1px solid #e7eaec; +} + +.tabs-container .tabs-below > .nav-tabs > li { + margin-top: -1px; + margin-bottom: 0; +} + +.tabs-container .tabs-below > .nav-tabs > li > a { + border-radius: 0 0 4px 4px; +} + +.tabs-container .tabs-below > .nav-tabs > li > a:hover, +.tabs-container .tabs-below > .nav-tabs > li > a:focus { + border-top-color: #e7eaec; + border-bottom-color: transparent; +} + +.tabs-container .tabs-left > .nav-tabs > li, +.tabs-container .tabs-right > .nav-tabs > li { + float: none; +} + +.tabs-container .tabs-left > .nav-tabs > li > a, +.tabs-container .tabs-right > .nav-tabs > li > a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px; +} + +.tabs-container .tabs-left > .nav-tabs { + float: left; + margin-right: 19px; +} + +.tabs-container .tabs-left > .nav-tabs > li > a { + margin-right: -1px; + border-radius: 4px 0 0 4px; +} + +.tabs-container .tabs-left > .nav-tabs .active > a, +.tabs-container .tabs-left > .nav-tabs .active > a:hover, +.tabs-container .tabs-left > .nav-tabs .active > a:focus { + border-color: #e7eaec transparent #e7eaec #e7eaec; + *border-right-color: #ffffff; +} + +.tabs-container .tabs-right > .nav-tabs { + float: right; + margin-left: 19px; +} + +.tabs-container .tabs-right > .nav-tabs > li > a { + margin-left: -1px; + border-radius: 0 4px 4px 0; +} + +.tabs-container .tabs-right > .nav-tabs .active > a, +.tabs-container .tabs-right > .nav-tabs .active > a:hover, +.tabs-container .tabs-right > .nav-tabs .active > a:focus { + border-color: #e7eaec #e7eaec #e7eaec transparent; + *border-left-color: #ffffff; + z-index: 1; +} + + +/* SWITCHES */ + +.onoffswitch { + position: relative; + width: 54px; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; +} + +.onoffswitch-checkbox { + display: none; +} + +.onoffswitch-label { + display: block; + overflow: hidden; + cursor: pointer; + border: 2px solid #1AB394; + border-radius: 3px; +} + +.onoffswitch-inner { + display: block; + width: 200%; + margin-left: -100%; + -webkit-transition: margin 0.3s ease-in 0s; + transition: margin 0.3s ease-in 0s; +} + +.onoffswitch-inner:before, +.onoffswitch-inner:after { + display: block; + float: left; + width: 50%; + height: 16px; + padding: 0; + line-height: 16px; + font-size: 10px; + color: white; + font-family: Trebuchet, Arial, sans-serif; + font-weight: bold; + box-sizing: border-box; +} + +.onoffswitch-inner:before { + content: "ON"; + padding-left: 7px; + background-color: #1AB394; + color: #FFFFFF; +} + +.onoffswitch-inner:after { + content: "OFF"; + padding-right: 7px; + background-color: #FFFFFF; + color: #919191; + text-align: right; +} + +.onoffswitch-switch { + display: block; + width: 18px; + margin: 0px; + background: #FFFFFF; + border: 2px solid #1AB394; + border-radius: 3px; + position: absolute; + top: 0; + bottom: 0; + right: 36px; + -webkit-transition: all 0.3s ease-in 0s; + transition: all 0.3s ease-in 0s; +} + +.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-inner { + margin-left: 0; +} + +.onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-switch { + right: 0px; +} + + +/* Nestable list */ + +.dd { + position: relative; + display: block; + margin: 0; + padding: 0; + list-style: none; + font-size: 13px; + line-height: 20px; +} + +.dd-list { + display: block; + position: relative; + margin: 0; + padding: 0; + list-style: none; +} + +.dd-list .dd-list { + padding-left: 30px; +} + +.dd-collapsed .dd-list { + display: none; +} + +.dd-item, +.dd-empty, +.dd-placeholder { + display: block; + position: relative; + margin: 0; + padding: 0; + min-height: 20px; + font-size: 13px; + line-height: 20px; +} + +.dd-handle { + display: block; + margin: 5px 0; + padding: 5px 10px; + color: #333; + text-decoration: none; + border: 1px solid #e7eaec; + background: #f5f5f5; + border-radius: 3px; + box-sizing: border-box; + -moz-box-sizing: border-box; +} + +.dd-handle span { + font-weight: bold; +} + +.dd-handle:hover { + background: #f0f0f0; + cursor: pointer; + font-weight: bold; +} + +.dd-item > button { + display: block; + position: relative; + cursor: pointer; + float: left; + width: 25px; + height: 20px; + margin: 5px 0; + padding: 0; + text-indent: 100%; + white-space: nowrap; + overflow: hidden; + border: 0; + background: transparent; + font-size: 12px; + line-height: 1; + text-align: center; + font-weight: bold; +} + +.dd-item > button:before { + content: '+'; + display: block; + position: absolute; + width: 100%; + text-align: center; + text-indent: 0; +} + +.dd-item > button[data-action="collapse"]:before { + content: '-'; +} + +#nestable2 .dd-item > button { + font-family: FontAwesome; + height: 34px; + width: 33px; + color: #c1c1c1; +} + +#nestable2 .dd-item > button:before { + content: "\f067"; +} + +#nestable2 .dd-item > button[data-action="collapse"]:before { + content: "\f068"; +} + +.dd-placeholder, +.dd-empty { + margin: 5px 0; + padding: 0; + min-height: 30px; + background: #f2fbff; + border: 1px dashed #b6bcbf; + box-sizing: border-box; + -moz-box-sizing: border-box; +} + +.dd-empty { + border: 1px dashed #bbb; + min-height: 100px; + background-color: #e5e5e5; + background-image: -webkit-linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent 75%, #ffffff 75%, #ffffff), -webkit-linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent 75%, #ffffff 75%, #ffffff); + background-image: linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent 75%, #ffffff 75%, #ffffff), linear-gradient(45deg, #ffffff 25%, transparent 25%, transparent 75%, #ffffff 75%, #ffffff); + background-size: 60px 60px; + background-position: 0 0, 30px 30px; +} + +.dd-dragel { + position: absolute; + z-index: 9999; + pointer-events: none; +} + +.dd-dragel > .dd-item .dd-handle { + margin-top: 0; +} + +.dd-dragel .dd-handle { + box-shadow: 2px 4px 6px 0 rgba(0, 0, 0, 0.1); +} + + +/** +* Nestable Extras +*/ + +.nestable-lists { + display: block; + clear: both; + padding: 30px 0; + width: 100%; + border: 0; + border-top: 2px solid #ddd; + border-bottom: 2px solid #ddd; +} + +#nestable-menu { + padding: 0; + margin: 10px 0 20px 0; +} + +#nestable-output, +#nestable2-output { + width: 100%; + font-size: 0.75em; + line-height: 1.333333em; + font-family: lucida grande, lucida sans unicode, helvetica, arial, sans-serif; + padding: 5px; + box-sizing: border-box; + -moz-box-sizing: border-box; +} + +#nestable2 .dd-handle { + color: inherit; + border: 1px dashed #e7eaec; + background: #f3f3f4; + padding: 10px; +} + +#nestable2 .dd-handle:hover { + /*background: #bbb;*/ +} + +#nestable2 span.label { + margin-right: 10px; +} + +#nestable-output, +#nestable2-output { + font-size: 12px; + padding: 25px; + box-sizing: border-box; + -moz-box-sizing: border-box; +} + + +/* CodeMirror */ + +.CodeMirror { + border: 1px solid #eee; + height: auto; +} + +.CodeMirror-scroll { + overflow-y: hidden; + overflow-x: auto; +} + + +/* Google Maps */ + +.google-map { + height: 300px; +} + + +/* Validation */ + +label.error { + color: #cc5965; + display: inline-block; + margin-left: 5px; +} + +.form-control.error { + border: 1px dotted #cc5965; +} + + +/* ngGrid */ + +.gridStyle { + border: 1px solid #d4d4d4; + width: 100%; + height: 400px; +} + +.gridStyle2 { + border: 1px solid #d4d4d4; + width: 500px; + height: 300px; +} + +.ngH eaderCell { + border-right: none; + border-bottom: 1px solid #e7eaec; +} + +.ngCell { + border-right: none; +} + +.ngTopPanel { + background: #F5F5F6; +} + +.ngRow.even { + background: #f9f9f9; +} + +.ngRow.selected { + background: #EBF2F1; +} + +.ngRow { + border-bottom: 1px solid #e7eaec; +} + +.ngCell { + background-color: transparent; +} + +.ngHeaderCell { + border-right: none; +} + + +/* Toastr custom style */ + +#toast-container > .toast { + background-image: none !important; +} + +#toast-container > .toast:before { + position: fixed; + font-family: FontAwesome; + font-size: 24px; + line-height: 24px; + float: left; + color: #FFF; + padding-right: 0.5em; + margin: auto 0.5em auto -1.5em; +} + +#toast-container > div { + box-shadow: 0 0 3px #999; + opacity: .9; + -ms-filter: alpha(opacity=90); + filter: alpha(opacity=90); +} + +#toast-container >:hover { + box-shadow: 0 0 4px #999; + opacity: 1; + -ms-filter: alpha(opacity=100); + filter: alpha(opacity=100); + cursor: pointer; +} + +.toast { + background-color: #1ab394; +} + +.toast-success { + background-color: #1ab394; +} + +.toast-error { + background-color: #ed5565; +} + +.toast-info { + background-color: #23c6c8; +} + +.toast-warning { + background-color: #f8ac59; +} + +.toast-top-full-width { + margin-top: 20px; +} + +.toast-bottom-full-width { + margin-bottom: 20px; +} + + +/* Image cropper style */ + +.img-container, +.img-preview { + overflow: hidden; + text-align: center; + width: 100%; +} + +.img-preview-sm { + height: 130px; + width: 200px; +} + + +/* Forum styles */ + +.forum-post-container .media { + margin: 10px 10px 10px 10px; + padding: 20px 10px 20px 10px; + border-bottom: 1px solid #f1f1f1; +} + +.forum-avatar { + float: left; + margin-right: 20px; + text-align: center; + width: 110px; +} + +.forum-avatar .img-circle { + height: 48px; + width: 48px; +} + +.author-info { + color: #676a6c; + font-size: 11px; + margin-top: 5px; + text-align: center; +} + +.forum-post-info { + padding: 9px 12px 6px 12px; + background: #f9f9f9; + border: 1px solid #f1f1f1; +} + +.media-body > .media { + background: #f9f9f9; + border-radius: 3px; + border: 1px solid #f1f1f1; +} + +.forum-post-container .media-body .photos { + margin: 10px 0; +} + +.forum-photo { + max-width: 140px; + border-radius: 3px; +} + +.media-body > .media .forum-avatar { + width: 70px; + margin-right: 10px; +} + +.media-body > .media .forum-avatar .img-circle { + height: 38px; + width: 38px; +} + +.mid-icon { + font-size: 66px; +} + +.forum-item { + margin: 10px 0; + padding: 10px 0 20px; + border-bottom: 1px solid #f1f1f1; +} + +.views-number { + font-size: 24px; + line-height: 18px; + font-weight: 400; +} + +.forum-container, +.forum-post-container { + padding: 30px !important; +} + +.forum-item small { + color: #999; +} + +.forum-item .forum-sub-title { + color: #999; + margin-left: 50px; +} + +.forum-title { + margin: 15px 0 15px 0; +} + +.forum-info { + text-align: center; +} + +.forum-desc { + color: #999; +} + +.forum-icon { + float: left; + width: 30px; + margin-right: 20px; + text-align: center; +} + +a.forum-item-title { + color: inherit; + display: block; + font-size: 18px; + font-weight: 600; +} + +a.forum-item-title:hover { + color: inherit; +} + +.forum-icon .fa { + font-size: 30px; + margin-top: 8px; + color: #9b9b9b; +} + +.forum-item.active .fa { + color: #1ab394; +} + +.forum-item.active a.forum-item-title { + color: #1ab394; +} + +@media (max-width: 992px) { + .forum-info { + margin: 15px 0 10px 0px; + /* Comment this is you want to show forum info in small devices */ + display: none; + } + .forum-desc { + float: none !important; + } +} + + +/* New Timeline style */ + +.vertical-container { + /* this class is used to give a max-width to the element it is applied to, and center it horizontally when it reaches that max-width */ + width: 90%; + max-width: 1170px; + margin: 0 auto; +} + +.vertical-container::after { + /* clearfix */ + content: ''; + display: table; + clear: both; +} + +#vertical-timeline { + position: relative; + padding: 0; + margin-top: 2em; + margin-bottom: 2em; +} + +#vertical-timeline::before { + content: ''; + position: absolute; + top: 0; + left: 18px; + height: 100%; + width: 4px; + background: #f1f1f1; +} + +.vertical-timeline-content .btn { + float: right; +} + +#vertical-timeline.light-timeline:before { + background: #e7eaec; +} + +.dark-timeline .vertical-timeline-content:before { + border-color: transparent #f5f5f5 transparent transparent; +} + +.dark-timeline.center-orientation .vertical-timeline-content:before { + border-color: transparent transparent transparent #f5f5f5; +} + +.dark-timeline .vertical-timeline-block:nth-child(2n) .vertical-timeline-content:before, +.dark-timeline.center-orientation .vertical-timeline-block:nth-child(2n) .vertical-timeline-content:before { + border-color: transparent #f5f5f5 transparent transparent; +} + +.dark-timeline .vertical-timeline-content, +.dark-timeline.center-orientation .vertical-timeline-content { + background: #f5f5f5; +} + +@media only screen and (min-width: 1170px) { + #vertical-timeline.center-orientation { + margin-top: 3em; + margin-bottom: 3em; + } + #vertical-timeline.center-orientation:before { + left: 50%; + margin-left: -2px; + } +} + +@media only screen and (max-width: 1170px) { + .center-orientation.dark-timeline .vertical-timeline-content:before { + border-color: transparent #f5f5f5 transparent transparent; + } +} + +.vertical-timeline-block { + position: relative; + margin: 2em 0; +} + +.vertical-timeline-block:after { + content: ""; + display: table; + clear: both; +} + +.vertical-timeline-block:first-child { + margin-top: 0; +} + +.vertical-timeline-block:last-child { + margin-bottom: 0; +} + +@media only screen and (min-width: 1170px) { + .center-orientation .vertical-timeline-block { + margin: 4em 0; + } + .center-orientation .vertical-timeline-block:first-child { + margin-top: 0; + } + .center-orientation .vertical-timeline-block:last-child { + margin-bottom: 0; + } +} + +.vertical-timeline-icon { + position: absolute; + top: 0; + left: 0; + width: 40px; + height: 40px; + border-radius: 50%; + font-size: 16px; + border: 3px solid #f1f1f1; + text-align: center; +} + +.vertical-timeline-icon i { + display: block; + width: 24px; + height: 24px; + position: relative; + left: 50%; + top: 50%; + margin-left: -12px; + margin-top: -9px; +} + +@media only screen and (min-width: 1170px) { + .center-orientation .vertical-timeline-icon { + width: 50px; + height: 50px; + left: 50%; + margin-left: -25px; + -webkit-transform: translateZ(0); + -webkit-backface-visibility: hidden; + font-size: 19px; + } + .center-orientation .vertical-timeline-icon i { + margin-left: -12px; + margin-top: -10px; + } + .center-orientation .cssanimations .vertical-timeline-icon.is-hidden { + visibility: hidden; + } +} + +.vertical-timeline-content { + position: relative; + margin-left: 60px; + background: white; + border-radius: 0.25em; + padding: 1em; +} + +.vertical-timeline-content:after { + content: ""; + display: table; + clear: both; +} + +.vertical-timeline-content h2 { + font-weight: 400; + margin-top: 4px; +} + +.vertical-timeline-content p { + margin: 1em 0; + line-height: 1.6; +} + +.vertical-timeline-content .vertical-date { + float: left; + font-weight: 500; +} + +.vertical-date small { + color: #1ab394; + font-weight: 400; +} + +.vertical-timeline-content::before { + content: ''; + position: absolute; + top: 16px; + right: 100%; + height: 0; + width: 0; + border: 7px solid transparent; + border-right: 7px solid white; +} + +@media only screen and (min-width: 768px) { + .vertical-timeline-content h2 { + font-size: 18px; + } + .vertical-timeline-content p { + font-size: 13px; + } +} + +@media only screen and (min-width: 1170px) { + .center-orientation .vertical-timeline-content { + margin-left: 0; + padding: 1.6em; + width: 45%; + } + .center-orientation .vertical-timeline-content::before { + top: 24px; + left: 100%; + border-color: transparent; + border-left-color: white; + } + .center-orientation .vertical-timeline-content .btn { + float: left; + } + .center-orientation .vertical-timeline-content .vertical-date { + position: absolute; + width: 100%; + left: 122%; + top: 2px; + font-size: 14px; + } + .center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content { + float: right; + } + .center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content::before { + top: 24px; + left: auto; + right: 100%; + border-color: transparent; + border-right-color: white; + } + .center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content .btn { + float: right; + } + .center-orientation .vertical-timeline-block:nth-child(even) .vertical-timeline-content .vertical-date { + left: auto; + right: 122%; + text-align: right; + } + .center-orientation .cssanimations .vertical-timeline-content.is-hidden { + visibility: hidden; + } +} + +.sidebard-panel { + width: 220px; + background: #ebebed; + padding: 10px 20px; + position: absolute; + right: 0; +} + +.sidebard-panel .feed-element img.img-circle { + width: 32px; + height: 32px; +} + +.sidebard-panel .feed-element, +.media-body, +.sidebard-panel p { + font-size: 12px; +} + +.sidebard-panel .feed-element { + margin-top: 20px; + padding-bottom: 0; +} + +.sidebard-panel .list-group { + margin-bottom: 10px; +} + +.sidebard-panel .list-group .list-group-item { + padding: 5px 0; + font-size: 12px; + border: 0; +} + +.sidebar-content .wrapper, +.wrapper.sidebar-content { + padding-right: 240px !important; +} + +#right-sidebar { + background-color: #fff; + border-left: 1px solid #e7eaec; + border-top: 1px solid #e7eaec; + overflow: hidden; + position: fixed; + top: 60px; + width: 260px !important; + z-index: 1009; + bottom: 0; + right: -260px; +} + +#right-sidebar.sidebar-open { + right: 0; +} + +#right-sidebar.sidebar-open.sidebar-top { + top: 0; + border-top: none; +} + +.sidebar-container ul.nav-tabs { + border: none; +} + +.sidebar-container ul.nav-tabs.navs-4 li { + width: 25%; +} + +.sidebar-container ul.nav-tabs.navs-3 li { + width: 33.3333%; +} + +.sidebar-container ul.nav-tabs.navs-2 li { + width: 50%; +} + +.sidebar-container ul.nav-tabs li { + border: none; +} + +.sidebar-container ul.nav-tabs li a { + border: none; + padding: 12px 10px; + margin: 0; + border-radius: 0; + background: #2f4050; + color: #fff; + text-align: center; + border-right: 1px solid #334556; +} + +.sidebar-container ul.nav-tabs li.active a { + border: none; + background: #f9f9f9; + color: #676a6c; + font-weight: bold; +} + +.sidebar-container .nav-tabs > li.active > a:hover, +.sidebar-container .nav-tabs > li.active > a:focus { + border: none; +} + +.sidebar-container ul.sidebar-list { + margin: 0; + padding: 0; +} + +.sidebar-container ul.sidebar-list li { + border-bottom: 1px solid #e7eaec; + padding: 15px 20px; + list-style: none; + font-size: 12px; +} + +.sidebar-container .sidebar-message:nth-child(2n+2) { + background: #f9f9f9; +} + +.sidebar-container ul.sidebar-list li a { + text-decoration: none; + color: inherit; +} + +.sidebar-container .sidebar-content { + padding: 15px 20px; + font-size: 12px; +} + +.sidebar-container .sidebar-title { + background: #f9f9f9; + padding: 20px; + border-bottom: 1px solid #e7eaec; +} + +.sidebar-container .sidebar-title h3 { + margin-bottom: 3px; + padding-left: 2px; +} + +.sidebar-container .tab-content h4 { + margin-bottom: 5px; +} + +.sidebar-container .sidebar-message > a > .pull-left { + margin-right: 10px; +} + +.sidebar-container .sidebar-message > a { + text-decoration: none; + color: inherit; +} + +.sidebar-container .sidebar-message { + padding: 15px 20px; +} + +.sidebar-container .sidebar-message .message-avatar { + height: 38px; + width: 38px; + border-radius: 50%; +} + +.sidebar-container .setings-item { + padding: 15px 20px; + border-bottom: 1px solid #e7eaec; +} + +body { + font-family: "open sans", "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + color: #676a6c; + overflow-x: hidden; +} + +html, +body { + height: 100%; +} + +body.full-height-layout #wrapper, +body.full-height-layout #page-wrapper { + height: 100%; +} + +#page-wrapper { + min-height: auto; +} + +body.boxed-layout { + background: url('patterns/shattered.png'); +} + +body.boxed-layout #wrapper { + background-color: #2f4050; + max-width: 1200px; + margin: 0 auto; +} + +.top-navigation.boxed-layout #wrapper, +.boxed-layout #wrapper.top-navigation { + max-width: 1300px !important; +} + +.block { + display: block; +} + +.clear { + display: block; + overflow: hidden; +} + +a { + cursor: pointer; +} + +a:hover, +a:focus { + text-decoration: none; +} + +.border-bottom { + border-bottom: 1px solid #e7eaec !important; +} + +.font-bold { + font-weight: 600; +} + +.font-noraml { + font-weight: 400; +} + +.text-uppercase { + text-transform: uppercase; +} + +.b-r { + border-right: 1px solid #e7eaec; +} + +.hr-line-dashed { + border-top: 1px dashed #e7eaec; + color: #ffffff; + background-color: #ffffff; + height: 1px; + margin: 20px 0; +} + +.hr-line-solid { + border-bottom: 1px solid #e7eaec; + background-color: rgba(0, 0, 0, 0); + border-style: solid !important; + margin-top: 15px; + margin-bottom: 15px; +} + +video { + width: 100% !important; + height: auto !important; +} + + +/* GALLERY */ + +.gallery > .row > div { + margin-bottom: 15px; +} + +.fancybox img { + margin-bottom: 5px; + /* Only for demo */ + width: 24%; +} + + +/* Summernote text editor */ + +.note-editor { + height: auto!important; + min-height: 100px; + border: solid 1px #e5e6e7; +} + + +/* MODAL */ + +.modal-content { + background-clip: padding-box; + background-color: #FFFFFF; + border: 1px solid rgba(0, 0, 0, 0); + border-radius: 4px; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.3); + outline: 0 none; +} + +.modal-dialog { + z-index: 1200; +} + +.modal-body { + padding: 20px 30px 30px 30px; +} + +.inmodal .modal-body { + background: #f8fafb; +} + +.inmodal .modal-header { + padding: 30px 15px; + text-align: center; +} + +.animated.modal.fade .modal-dialog { + -webkit-transform: none; + -ms-transform: none; + transform: none; +} + +.inmodal .modal-title { + font-size: 26px; +} + +.inmodal .modal-icon { + font-size: 84px; + color: #e2e3e3; +} + +.modal-footer { + margin-top: 0; +} + + +/* WRAPPERS */ + +#wrapper { + width: 100%; + overflow-x: hidden; + background-color: #2f4050; +} + +.wrapper { + padding: 0 20px; +} + +.wrapper-content { + padding: 20px; +} + +#page-wrapper { + padding: 0 15px; + position: inherit; + margin: 0 0 0 220px; +} + +.title-action { + text-align: right; + padding-top: 30px; +} + +.ibox-content h1, +.ibox-content h2, +.ibox-content h3, +.ibox-content h4, +.ibox-content h5, +.ibox-title h1, +.ibox-title h2, +.ibox-title h3, +.ibox-title h4, +.ibox-title h5 { + margin-top: 5px; +} + +ul.unstyled, +ol.unstyled { + list-style: none outside none; + margin-left: 0; +} + +.big-icon { + font-size: 160px; + color: #e5e6e7; +} + + +/* FOOTER */ + +.footer { + background: none repeat scroll 0 0 white; + border-top: 1px solid #e7eaec; + overflow: hidden; + padding: 10px 20px; + margin: 0 -15px; + height: 36px; +} + +.footer.fixed_full { + position: fixed; + bottom: 0; + left: 0; + right: 0; + z-index: 1000; + padding: 10px 20px; + background: white; + border-top: 1px solid #e7eaec; +} + +.footer.fixed { + position: fixed; + bottom: 0; + left: 0; + right: 0; + z-index: 1000; + padding: 10px 20px; + background: white; + border-top: 1px solid #e7eaec; + margin-left: 220px; +} + +body.mini-navbar .footer.fixed, +body.body-small.mini-navbar .footer.fixed { + margin: 0 0 0 70px; +} + +body.mini-navbar.canvas-menu .footer.fixed, +body.canvas-menu .footer.fixed { + margin: 0 !important; +} + +body.fixed-sidebar.body-small.mini-navbar .footer.fixed { + margin: 0 0 0 220px; +} + +body.body-small .footer.fixed { + margin-left: 0px; +} + + +/* PANELS */ + +.page-heading { + border-top: 0; + padding: 0px 20px 20px; +} + +.panel-heading h1, +.panel-heading h2 { + margin-bottom: 5px; +} + + +/*CONTENTTABS*/ + +.content-tabs { + position: relative; + height: 42px; + background: #fafafa; + line-height: 40px; +} + +.content-tabs .roll-nav, +.page-tabs-list { + position: absolute; + width: 40px; + height: 40px; + text-align: center; + color: #999; + z-index: 2; + top: 0; +} + +.content-tabs .roll-left { + left: 0; + border-right: solid 1px #eee; +} + +.content-tabs .roll-right { + right: 0; + border-left: solid 1px #eee; +} + +.content-tabs button { + background: #fff; + border: 0; + height: 40px; + width: 40px; + outline: none; +} + +.content-tabs button:hover { + background: #fafafa; +} + +nav.page-tabs { + margin-left: 40px; + width: 100000px; + height: 40px; + overflow: hidden; +} + +nav.page-tabs .page-tabs-content { + float: left; +} + +.page-tabs a { + display: block; + float: left; + border-right: solid 1px #eee; + padding: 0 15px; +} + +.page-tabs a i:hover { + color: #c00; +} + +.page-tabs a:hover, +.content-tabs .roll-nav:hover { + color: #777; + background: #f2f2f2; + cursor: pointer; +} + +.roll-right.J_tabRight { + right: 140px; +} + +.roll-right.btn-group { + right: 60px; + width: 80px; + padding: 0; +} + +.roll-right.btn-group button { + width: 80px; +} + +.roll-right.J_tabExit { + background: #fff; + height: 40px; + width: 60px; + outline: none; +} + +.dropdown-menu-right { + left: auto; +} + +#content-main { + height: calc(100% - 42px); + overflow: hidden; +} + +.fixed-nav #content-main { + height: calc(100% - 80px); + overflow: hidden; +} + + +/* TABLES */ + +.table-bordered { + border: 1px solid #EBEBEB; +} + +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + background-color: #F5F5F6; + border-bottom-width: 1px; +} + +.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 #e7e7e7; +} + +.table > thead > tr > th { + border-bottom: 1px solid #DDDDDD; + vertical-align: bottom; +} + +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + border-top: 1px solid #e7eaec; + line-height: 1.42857; + padding: 8px; + vertical-align: middle; +} + + +/* PANELS */ + +.panel.blank-panel { + background: none; + margin: 0; +} + +.blank-panel .panel-heading { + padding-bottom: 0; +} + +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + -moz-border-bottom-colors: none; + -moz-border-left-colors: none; + -moz-border-right-colors: none; + -moz-border-top-colors: none; + background: none; + border-color: #dddddd #dddddd rgba(0, 0, 0, 0); + border-bottom: #f3f3f4; + -webkit-border-image: none; + -o-border-image: none; + border-image: none; + border-style: solid; + border-width: 1px; + color: #555555; + cursor: default; +} + +.nav.nav-tabs li { + background: none; + border: none; +} + +.nav-tabs > li > a { + color: #A7B1C2; + font-weight: 600; + padding: 10px 20px 10px 25px; +} + +.nav-tabs > li > a:hover, +.nav-tabs > li > a:focus { + background-color: #e6e6e6; + color: #676a6c; +} + +.ui-tab .tab-content { + padding: 20px 0px; +} + + +/* GLOBAL */ + +.no-padding { + padding: 0 !important; +} + +.no-borders { + border: none !important; +} + +.no-margins { + margin: 0 !important; +} + +.no-top-border { + border-top: 0 !important; +} + +.ibox-content.text-box { + padding-bottom: 0px; + padding-top: 15px; +} + +.border-left-right { + border-left: 1px solid #e7eaec; + border-right: 1px solid #e7eaec; + border-top: none; + border-bottom: none; +} + +.border-left { + border-left: 1px solid #e7eaec; + border-right: none; + border-top: none; + border-bottom: none; +} + +.border-right { + border-left: none; + border-right: 1px solid #e7eaec; + border-top: none; + border-bottom: none; +} + +.full-width { + width: 100% !important; +} + +.link-block { + font-size: 12px; + padding: 10px; +} + +.nav.navbar-top-links .link-block a { + font-size: 12px; +} + +.link-block a { + font-size: 10px; + color: inherit; +} + +body.mini-navbar .branding { + display: none; +} + +img.circle-border { + border: 6px solid #FFFFFF; + border-radius: 50%; +} + +.branding { + float: left; + color: #FFFFFF; + font-size: 18px; + font-weight: 600; + padding: 17px 20px; + text-align: center; + background-color: #1ab394; +} + +.login-panel { + margin-top: 25%; +} + +.page-header { + padding: 20px 0 9px; + margin: 0 0 20px; + border-bottom: 1px solid #eeeeee; +} + +.fontawesome-icon-list { + margin-top: 22px; +} + +.fontawesome-icon-list .fa-hover a { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + display: block; + color: #222222; + line-height: 32px; + height: 32px; + padding-left: 10px; + border-radius: 4px; +} + +.fontawesome-icon-list .fa-hover a .fa { + width: 32px; + font-size: 14px; + display: inline-block; + text-align: right; + margin-right: 10px; +} + +.fontawesome-icon-list .fa-hover a:hover { + background-color: #1d9d74; + color: #ffffff; + text-decoration: none; +} + +.fontawesome-icon-list .fa-hover a:hover .fa { + font-size: 30px; + vertical-align: -6px; +} + +.fontawesome-icon-list .fa-hover a:hover .text-muted { + color: #bbe2d5; +} + +.feature-list .col-md-4 { + margin-bottom: 22px; +} + +.feature-list h4 .fa:before { + vertical-align: -10%; + font-size: 28px; + display: inline-block; + width: 1.07142857em; + text-align: center; + margin-right: 5px; +} + +.ui-draggable .ibox-title { + cursor: move; +} + +.breadcrumb { + background-color: #ffffff; + padding: 0; + margin-bottom: 0; +} + +.breadcrumb > li a { + color: inherit; +} + +.breadcrumb > .active { + color: inherit; +} + +code { + background-color: #F9F2F4; + border-radius: 4px; + color: #ca4440; + font-size: 90%; + padding: 2px 4px; + white-space: nowrap; +} + +.ibox { + clear: both; + margin-bottom: 25px; + margin-top: 0; + padding: 0; +} + +.ibox.collapsed .ibox-content { + display: none; +} + +.ibox.collapsed .fa.fa-chevron-up:before { + content: "\f078"; +} + +.ibox.collapsed .fa.fa-chevron-down:before { + content: "\f077"; +} + +.ibox:after, +.ibox:before { + display: table; +} + +.ibox-title { + -moz-border-bottom-colors: none; + -moz-border-left-colors: none; + -moz-border-right-colors: none; + -moz-border-top-colors: none; + background-color: #ffffff; + border-color: #e7eaec; + -webkit-border-image: none; + -o-border-image: none; + border-image: none; + border-style: solid solid none; + border-width: 4px 0px 0; + color: inherit; + margin-bottom: 0; + padding: 14px 15px 7px; + min-height: 48px; +} + +.ibox-content { + background-color: #ffffff; + color: inherit; + padding: 15px 20px 20px 20px; + border-color: #e7eaec; + -webkit-border-image: none; + -o-border-image: none; + border-image: none; + border-style: solid solid none; + border-width: 1px 0px; +} + +table.table-mail tr td { + padding: 12px; +} + +.table-mail .check-mail { + padding-left: 20px; +} + +.table-mail .mail-date { + padding-right: 20px; +} + +.star-mail, +.check-mail { + width: 40px; +} + +.unread td a, +.unread td { + font-weight: 600; + color: inherit; +} + +.read td a, +.read td { + font-weight: normal; + color: inherit; +} + +.unread td { + background-color: #f9f8f8; +} + +.ibox-content { + clear: both; +} + +.ibox-heading { + background-color: #f3f6fb; + border-bottom: none; +} + +.ibox-heading h3 { + font-weight: 200; + font-size: 24px; +} + +.ibox-title h5 { + display: inline-block; + font-size: 14px; + margin: 0 0 7px; + padding: 0; + text-overflow: ellipsis; + float: left; +} + +.ibox-title .label { + float: left; + margin-left: 4px; +} + +.ibox-tools { + display: inline-block; + float: right; + margin-top: 0; + position: relative; + padding: 0; +} + +.ibox-tools a { + cursor: pointer; + margin-left: 5px; + color: #c4c4c4; +} + +.ibox-tools a.btn-primary { + color: #fff; +} + +.ibox-tools .dropdown-menu > li > a { + padding: 4px 10px; + font-size: 12px; +} + +.ibox .open > .dropdown-menu { + left: auto; + right: 0; +} + + +/* BACKGROUNDS */ + +.gray-bg { + background-color: #f3f3f4; +} + +.white-bg { + background-color: #ffffff; +} + +.navy-bg { + background-color: #1ab394; + color: #ffffff; +} + +.blue-bg { + background-color: #1c84c6; + color: #ffffff; +} + +.lazur-bg { + background-color: #23c6c8; + color: #ffffff; +} + +.yellow-bg { + background-color: #f8ac59; + color: #ffffff; +} + +.red-bg { + background-color: #ed5565; + color: #ffffff; +} + +.black-bg { + background-color: #262626; +} + +.panel-primary { + border-color: #1ab394; +} + +.panel-primary > .panel-heading { + background-color: #1ab394; + border-color: #1ab394; +} + +.panel-success { + border-color: #1c84c6; +} + +.panel-success > .panel-heading { + background-color: #1c84c6; + border-color: #1c84c6; + color: #ffffff; +} + +.panel-info { + border-color: #23c6c8; +} + +.panel-info > .panel-heading { + background-color: #23c6c8; + border-color: #23c6c8; + color: #ffffff; +} + +.panel-warning { + border-color: #f8ac59; +} + +.panel-warning > .panel-heading { + background-color: #f8ac59; + border-color: #f8ac59; + color: #ffffff; +} + +.panel-danger { + border-color: #ed5565; +} + +.panel-danger > .panel-heading { + background-color: #ed5565; + border-color: #ed5565; + color: #ffffff; +} + +.progress-bar { + background-color: #1ab394; +} + +.progress-small, +.progress-small .progress-bar { + height: 10px; +} + +.progress-small, +.progress-mini { + margin-top: 5px; +} + +.progress-mini, +.progress-mini .progress-bar { + height: 5px; + margin-bottom: 0px; +} + +.progress-bar-navy-light { + background-color: #3dc7ab; +} + +.progress-bar-success { + background-color: #1c84c6; +} + +.progress-bar-info { + background-color: #23c6c8; +} + +.progress-bar-warning { + background-color: #f8ac59; +} + +.progress-bar-danger { + background-color: #ed5565; +} + +.panel-title { + font-size: inherit; +} + +.jumbotron { + border-radius: 6px; + padding: 40px; +} + +.jumbotron h1 { + margin-top: 0; +} + + +/* COLORS */ + +.text-navy { + color: #1ab394; +} + +.text-primary { + color: inherit; +} + +.text-success { + color: #1c84c6; +} + +.text-info { + color: #23c6c8; +} + +.text-warning { + color: #f8ac59; +} + +.text-danger { + color: #ed5565; +} + +.text-muted { + color: #888888; +} + +.simple_tag { + background-color: #f3f3f4; + border: 1px solid #e7eaec; + border-radius: 2px; + color: inherit; + font-size: 10px; + margin-right: 5px; + margin-top: 5px; + padding: 5px 12px; + display: inline-block; +} + +.img-shadow { + box-shadow: 0px 0px 3px 0px #919191; +} + + +/* For handle diferent bg color in AngularJS version */ + +.dashboards\.dashboard_2 nav.navbar, +.dashboards\.dashboard_3 nav.navbar, +.mailbox\.inbox nav.navbar, +.mailbox\.email_view nav.navbar, +.mailbox\.email_compose nav.navbar, +.dashboards\.dashboard_4_1 nav.navbar { + background: #fff; +} + + +/* For handle diferent bg color in MVC version */ + +.Dashboard_2 .navbar.navbar-static-top, +.Dashboard_3 .navbar.navbar-static-top, +.Dashboard_4_1 .navbar.navbar-static-top, +.ComposeEmail .navbar.navbar-static-top, +.EmailView .navbar.navbar-static-top, +.Inbox .navbar.navbar-static-top { + background: #fff; +} + +a.close-canvas-menu { + position: absolute; + top: 10px; + right: 15px; + z-index: 1011; + color: #a7b1c2; +} + +a.close-canvas-menu:hover { + color: #fff; +} + + +/* FULL HEIGHT */ + +.full-height { + height: 100%; +} + +.fh-breadcrumb { + height: calc(100% - 196px); + margin: 0 -15px; + position: relative; +} + +.fh-no-breadcrumb { + height: calc(100% - 99px); + margin: 0 -15px; + position: relative; +} + +.fh-column { + background: #fff; + height: 100%; + width: 240px; + float: left; +} + +.modal-backdrop { + z-index: 2040 !important; +} + +.modal { + z-index: 2050 !important; +} + +.spiner-example { + height: 200px; + padding-top: 70px; +} + + +/* MARGINS & PADDINGS */ + +.p-xxs { + padding: 5px; +} + +.p-xs { + padding: 10px; +} + +.p-sm { + padding: 15px; +} + +.p-m { + padding: 20px; +} + +.p-md { + padding: 25px; +} + +.p-lg { + padding: 30px; +} + +.p-xl { + padding: 40px; +} + +.m-xxs { + margin: 2px 4px; +} + +.m-xs { + margin: 5px; +} + +.m-sm { + margin: 10px; +} + +.m { + margin: 15px; +} + +.m-md { + margin: 20px; +} + +.m-lg { + margin: 30px; +} + +.m-xl { + margin: 50px; +} + +.m-n { + margin: 0 !important; +} + +.m-l-none { + margin-left: 0; +} + +.m-l-xs { + margin-left: 5px; +} + +.m-l-sm { + margin-left: 10px; +} + +.m-l { + margin-left: 15px; +} + +.m-l-md { + margin-left: 20px; +} + +.m-l-lg { + margin-left: 30px; +} + +.m-l-xl { + margin-left: 40px; +} + +.m-l-n-xxs { + margin-left: -1px; +} + +.m-l-n-xs { + margin-left: -5px; +} + +.m-l-n-sm { + margin-left: -10px; +} + +.m-l-n { + margin-left: -15px; +} + +.m-l-n-md { + margin-left: -20px; +} + +.m-l-n-lg { + margin-left: -30px; +} + +.m-l-n-xl { + margin-left: -40px; +} + +.m-t-none { + margin-top: 0; +} + +.m-t-xxs { + margin-top: 1px; +} + +.m-t-xs { + margin-top: 5px; +} + +.m-t-sm { + margin-top: 10px; +} + +.m-t { + margin-top: 15px; +} + +.m-t-md { + margin-top: 20px; +} + +.m-t-lg { + margin-top: 30px; +} + +.m-t-xl { + margin-top: 40px; +} + +.m-t-n-xxs { + margin-top: -1px; +} + +.m-t-n-xs { + margin-top: -5px; +} + +.m-t-n-sm { + margin-top: -10px; +} + +.m-t-n { + margin-top: -15px; +} + +.m-t-n-md { + margin-top: -20px; +} + +.m-t-n-lg { + margin-top: -30px; +} + +.m-t-n-xl { + margin-top: -40px; +} + +.m-r-none { + margin-right: 0; +} + +.m-r-xxs { + margin-right: 1px; +} + +.m-r-xs { + margin-right: 5px; +} + +.m-r-sm { + margin-right: 10px; +} + +.m-r { + margin-right: 15px; +} + +.m-r-md { + margin-right: 20px; +} + +.m-r-lg { + margin-right: 30px; +} + +.m-r-xl { + margin-right: 40px; +} + +.m-r-n-xxs { + margin-right: -1px; +} + +.m-r-n-xs { + margin-right: -5px; +} + +.m-r-n-sm { + margin-right: -10px; +} + +.m-r-n { + margin-right: -15px; +} + +.m-r-n-md { + margin-right: -20px; +} + +.m-r-n-lg { + margin-right: -30px; +} + +.m-r-n-xl { + margin-right: -40px; +} + +.m-b-none { + margin-bottom: 0; +} + +.m-b-xxs { + margin-bottom: 1px; +} + +.m-b-xs { + margin-bottom: 5px; +} + +.m-b-sm { + margin-bottom: 10px; +} + +.m-b { + margin-bottom: 15px; +} + +.m-b-md { + margin-bottom: 20px; +} + +.m-b-lg { + margin-bottom: 30px; +} + +.m-b-xl { + margin-bottom: 40px; +} + +.m-b-n-xxs { + margin-bottom: -1px; +} + +.m-b-n-xs { + margin-bottom: -5px; +} + +.m-b-n-sm { + margin-bottom: -10px; +} + +.m-b-n { + margin-bottom: -15px; +} + +.m-b-n-md { + margin-bottom: -20px; +} + +.m-b-n-lg { + margin-bottom: -30px; +} + +.m-b-n-xl { + margin-bottom: -40px; +} + +.space-15 { + margin: 15px 0; +} + +.space-20 { + margin: 20px 0; +} + +.space-25 { + margin: 25px 0; +} + +.space-30 { + margin: 30px 0; +} + +body.modal-open { + padding-right: inherit !important; +} + + +/* SEARCH PAGE */ + +.search-form { + margin-top: 10px; +} + +.search-result h3 { + margin-bottom: 0; + color: #1E0FBE; +} + +.search-result .search-link { + color: #006621; +} + +.search-result p { + font-size: 12px; + margin-top: 5px; +} + + +/* CONTACTS */ + +.contact-box { + background-color: #ffffff; + border: 1px solid #e7eaec; + padding: 20px; + margin-bottom: 20px; +} + +.contact-box a { + color: inherit; +} + + +/* INVOICE */ + +.invoice-table tbody > tr > td:last-child, +.invoice-table tbody > tr > td:nth-child(4), +.invoice-table tbody > tr > td:nth-child(3), +.invoice-table tbody > tr > td:nth-child(2) { + text-align: right; +} + +.invoice-table thead > tr > th:last-child, +.invoice-table thead > tr > th:nth-child(4), +.invoice-table thead > tr > th:nth-child(3), +.invoice-table thead > tr > th:nth-child(2) { + text-align: right; +} + +.invoice-total > tbody > tr > td:first-child { + text-align: right; +} + +.invoice-total > tbody > tr > td { + border: 0 none; +} + +.invoice-total > tbody > tr > td:last-child { + border-bottom: 1px solid #DDDDDD; + text-align: right; + width: 15%; +} + + +/* ERROR & LOGIN & LOCKSCREEN*/ + +.middle-box { + max-width: 400px; + z-index: 100; + margin: 0 auto; + padding-top: 40px; +} + +.lockscreen.middle-box { + width: 200px; + padding-top: 110px; +} + +.loginscreen.middle-box { + width: 300px; +} + +.loginColumns { + max-width: 800px; + margin: 0 auto; + padding: 100px 20px 20px 20px; +} + +.passwordBox { + max-width: 460px; + margin: 0 auto; + padding: 100px 20px 20px 20px; +} + +.logo-name { + color: #e6e6e6; + font-size: 180px; + font-weight: 800; + letter-spacing: -10px; + margin-bottom: 0px; +} + +.middle-box h1 { + font-size: 170px; +} + +.wrapper .middle-box { + margin-top: 140px; +} + +.lock-word { + z-index: 10; + position: absolute; + top: 110px; + left: 50%; + margin-left: -470px; +} + +.lock-word span { + font-size: 100px; + font-weight: 600; + color: #e9e9e9; + display: inline-block; +} + +.lock-word .first-word { + margin-right: 160px; +} + + +/* DASBOARD */ + +.dashboard-header { + border-top: 0; + padding: 20px 20px 20px 20px; +} + +.dashboard-header h2 { + margin-top: 10px; + font-size: 26px; +} + +.fist-item { + border-top: none !important; +} + +.statistic-box { + margin-top: 40px; +} + +.dashboard-header .list-group-item span.label { + margin-right: 10px; +} + +.list-group.clear-list .list-group-item { + border-top: 1px solid #e7eaec; + border-bottom: 0; + border-right: 0; + border-left: 0; + padding: 10px 0; +} + +ul.clear-list:first-child { + border-top: none !important; +} + + +/* Intimeline */ + +.timeline-item .date i { + position: absolute; + top: 0; + right: 0; + padding: 5px; + width: 30px; + text-align: center; + border-top: 1px solid #e7eaec; + border-bottom: 1px solid #e7eaec; + border-left: 1px solid #e7eaec; + background: #f8f8f8; +} + +.timeline-item .date { + text-align: right; + width: 110px; + position: relative; + padding-top: 30px; +} + +.timeline-item .content { + border-left: 1px solid #e7eaec; + border-top: 1px solid #e7eaec; + padding-top: 10px; + min-height: 100px; +} + +.timeline-item .content:hover { + background: #f6f6f6; +} + + +/* PIN BOARD */ + +ul.notes li, +ul.tag-list li { + list-style: none; +} + +ul.notes li h4 { + margin-top: 20px; + font-size: 16px; +} + +ul.notes li div { + text-decoration: none; + color: #000; + background: #ffc; + display: block; + height: 140px; + width: 140px; + padding: 1em; + position: relative; +} + +ul.notes li div small { + position: absolute; + top: 5px; + right: 5px; + font-size: 10px; +} + +ul.notes li div a { + position: absolute; + right: 10px; + bottom: 10px; + color: inherit; +} + +ul.notes li { + margin: 10px 40px 50px 0px; + float: left; +} + +ul.notes li div p { + font-size: 12px; +} + +ul.notes li div { + text-decoration: none; + color: #000; + background: #ffc; + display: block; + height: 140px; + width: 140px; + padding: 1em; + /* Firefox */ + /* Safari+Chrome */ + /* Opera */ + box-shadow: 5px 5px 2px rgba(33, 33, 33, 0.7); +} + +ul.notes li div { + -webkit-transform: rotate(-6deg); + -o-transform: rotate(-6deg); + -moz-transform: rotate(-6deg); +} + +ul.notes li:nth-child(even) div { + -o-transform: rotate(4deg); + -webkit-transform: rotate(4deg); + -moz-transform: rotate(4deg); + position: relative; + top: 5px; +} + +ul.notes li:nth-child(3n) div { + -o-transform: rotate(-3deg); + -webkit-transform: rotate(-3deg); + -moz-transform: rotate(-3deg); + position: relative; + top: -5px; +} + +ul.notes li:nth-child(5n) div { + -o-transform: rotate(5deg); + -webkit-transform: rotate(5deg); + -moz-transform: rotate(5deg); + position: relative; + top: -10px; +} + +ul.notes li div:hover, +ul.notes li div:focus { + -webkit-transform: scale(1.1); + -moz-transform: scale(1.1); + -o-transform: scale(1.1); + position: relative; + z-index: 5; +} + +ul.notes li div { + text-decoration: none; + color: #000; + background: #ffc; + display: block; + height: 210px; + width: 210px; + padding: 1em; + box-shadow: 5px 5px 7px rgba(33, 33, 33, 0.7); + -webkit-transition: -webkit-transform 0.15s linear; +} + + +/* FILE MANAGER */ + +.file-box { + float: left; + width: 220px; +} + +.file-manager h5 { + text-transform: uppercase; +} + +.file-manager { + list-style: none outside none; + margin: 0; + padding: 0; +} + +.folder-list li a { + color: #666666; + display: block; + padding: 5px 0; +} + +.folder-list li { + border-bottom: 1px solid #e7eaec; + display: block; +} + +.folder-list li i { + margin-right: 8px; + color: #3d4d5d; +} + +.category-list li a { + color: #666666; + display: block; + padding: 5px 0; +} + +.category-list li { + display: block; +} + +.category-list li i { + margin-right: 8px; + color: #3d4d5d; +} + +.category-list li a .text-navy { + color: #1ab394; +} + +.category-list li a .text-primary { + color: #1c84c6; +} + +.category-list li a .text-info { + color: #23c6c8; +} + +.category-list li a .text-danger { + color: #EF5352; +} + +.category-list li a .text-warning { + color: #F8AC59; +} + +.file-manager h5.tag-title { + margin-top: 20px; +} + +.tag-list li { + float: left; +} + +.tag-list li a { + font-size: 10px; + background-color: #f3f3f4; + padding: 5px 12px; + color: inherit; + border-radius: 2px; + border: 1px solid #e7eaec; + margin-right: 5px; + margin-top: 5px; + display: block; +} + +.file { + border: 1px solid #e7eaec; + padding: 0; + background-color: #ffffff; + position: relative; + margin-bottom: 20px; + margin-right: 20px; +} + +.file-manager .hr-line-dashed { + margin: 15px 0; +} + +.file .icon, +.file .image { + height: 100px; + overflow: hidden; +} + +.file .icon { + padding: 15px 10px; + text-align: center; +} + +.file-control { + color: inherit; + font-size: 11px; + margin-right: 10px; +} + +.file-control.active { + text-decoration: underline; +} + +.file .icon i { + font-size: 70px; + color: #dadada; +} + +.file .file-name { + padding: 10px; + background-color: #f8f8f8; + border-top: 1px solid #e7eaec; +} + +.file-name small { + color: #676a6c; +} + +.corner { + position: absolute; + display: inline-block; + width: 0; + height: 0; + line-height: 0; + border: 0.6em solid transparent; + border-right: 0.6em solid #f1f1f1; + border-bottom: 0.6em solid #f1f1f1; + right: 0em; + bottom: 0em; +} + +a.compose-mail { + padding: 8px 10px; +} + +.mail-search { + max-width: 300px; +} + + +/* PROFILE */ + +.profile-content { + border-top: none !important; +} + +.feed-activity-list .feed-element { + border-bottom: 1px solid #e7eaec; +} + +.feed-element:first-child { + margin-top: 0; +} + +.feed-element { + padding-bottom: 15px; +} + +.feed-element, +.feed-element .media { + margin-top: 15px; +} + +.feed-element, +.media-body { + overflow: hidden; +} + +.feed-element > .pull-left { + margin-right: 10px; +} + +.feed-element img.img-circle, +.dropdown-messages-box img.img-circle { + width: 38px; + height: 38px; +} + +.feed-element .well { + border: 1px solid #e7eaec; + box-shadow: none; + margin-top: 10px; + margin-bottom: 5px; + padding: 10px 20px; + font-size: 11px; + line-height: 16px; +} + +.feed-element .actions { + margin-top: 10px; +} + +.feed-element .photos { + margin: 10px 0; +} + +.feed-photo { + max-height: 180px; + border-radius: 4px; + overflow: hidden; + margin-right: 10px; + margin-bottom: 10px; +} + + +/* MAILBOX */ + +.mail-box { + background-color: #ffffff; + border: 1px solid #e7eaec; + border-top: 0; + padding: 0px; + margin-bottom: 20px; +} + +.mail-box-header { + background-color: #ffffff; + border: 1px solid #e7eaec; + border-bottom: 0; + padding: 30px 20px 20px 20px; +} + +.mail-box-header h2 { + margin-top: 0px; +} + +.mailbox-content .tag-list li a { + background: #ffffff; +} + +.mail-body { + border-top: 1px solid #e7eaec; + padding: 20px; +} + +.mail-text { + border-top: 1px solid #e7eaec; +} + +.mail-text .note-toolbar { + padding: 10px 15px; +} + +.mail-body .form-group { + margin-bottom: 5px; +} + +.mail-text .note-editor .note-toolbar { + background-color: #F9F8F8; +} + +.mail-attachment { + border-top: 1px solid #e7eaec; + padding: 20px; + font-size: 12px; +} + +.mailbox-content { + background: none; + border: none; + padding: 10px; +} + +.mail-ontact { + width: 23%; +} + + +/* PROJECTS */ + +.project-people, +.project-actions { + text-align: right; + vertical-align: middle; +} + +dd.project-people { + text-align: left; + margin-top: 5px; +} + +.project-people img { + width: 32px; + height: 32px; +} + +.project-title a { + font-size: 14px; + color: #676a6c; + font-weight: 600; +} + +.project-list table tr td { + border-top: none; + border-bottom: 1px solid #e7eaec; + padding: 15px 10px; + vertical-align: middle; +} + +.project-manager .tag-list li a { + font-size: 10px; + background-color: white; + padding: 5px 12px; + color: inherit; + border-radius: 2px; + border: 1px solid #e7eaec; + margin-right: 5px; + margin-top: 5px; + display: block; +} + +.project-files li a { + font-size: 11px; + color: #676a6c; + margin-left: 10px; + line-height: 22px; +} + + +/* FAQ */ + +.faq-item { + padding: 20px; + margin-bottom: 2px; + background: #fff; +} + +.faq-question { + font-size: 18px; + font-weight: 600; + color: #1ab394; + display: block; +} + +.faq-question:hover { + color: #179d82; +} + +.faq-answer { + margin-top: 10px; + background: #f3f3f4; + border: 1px solid #e7eaec; + border-radius: 3px; + padding: 15px; +} + +.faq-item .tag-item { + background: #f3f3f4; + padding: 2px 6px; + font-size: 10px; + text-transform: uppercase; +} + + +/* Chat view */ + +.message-input { + height: 90px !important; +} + +.chat-avatar { + white: 36px; + height: 36px; + float: left; + margin-right: 10px; +} + +.chat-user-name { + padding: 10px; +} + +.chat-user { + padding: 8px 10px; + border-bottom: 1px solid #e7eaec; +} + +.chat-user a { + color: inherit; +} + +.chat-view { + z-index: 20012; +} + +.chat-users, +.chat-statistic { + margin-left: -30px; +} + +@media (max-width: 992px) { + .chat-users, + .chat-statistic { + margin-left: 0px; + } +} + +.chat-view .ibox-content { + padding: 0; +} + +.chat-message { + padding: 10px 20px; +} + +.message-avatar { + height: 48px; + width: 48px; + border: 1px solid #e7eaec; + border-radius: 4px; + margin-top: 1px; +} + +.chat-discussion .chat-message:nth-child(2n+1) .message-avatar { + float: left; + margin-right: 10px; +} + +.chat-discussion .chat-message:nth-child(2n) .message-avatar { + float: right; + margin-left: 10px; +} + +.message { + background-color: #fff; + border: 1px solid #e7eaec; + text-align: left; + display: block; + padding: 10px 20px; + position: relative; + border-radius: 4px; +} + +.chat-discussion .chat-message:nth-child(2n+1) .message-date { + float: right; +} + +.chat-discussion .chat-message:nth-child(2n) .message-date { + float: left; +} + +.chat-discussion .chat-message:nth-child(2n+1) .message { + text-align: left; + margin-left: 55px; +} + +.chat-discussion .chat-message:nth-child(2n) .message { + text-align: right; + margin-right: 55px; +} + +.message-date { + font-size: 10px; + color: #888888; +} + +.message-content { + display: block; +} + +.chat-discussion { + background: #eee; + padding: 15px; + height: 400px; + overflow-y: auto; +} + +.chat-users { + overflow-y: auto; + height: 400px; +} + +.chat-message-form .form-group { + margin-bottom: 0; +} + + +/* jsTree */ + +.jstree-open > .jstree-anchor > .fa-folder:before { + content: "\f07c"; +} + +.jstree-default .jstree-icon.none { + width: 0; +} + + +/* CLIENTS */ + +.clients-list { + margin-top: 20px; +} + +.clients-list .tab-pane { + position: relative; + height: 600px; +} + +.client-detail { + position: relative; + height: 620px; +} + +.clients-list table tr td { + height: 46px; + vertical-align: middle; + border: none; +} + +.client-link { + font-weight: 600; + color: inherit; +} + +.client-link:hover { + color: inherit; +} + +.client-avatar { + width: 42px; +} + +.client-avatar img { + width: 28px; + height: 28px; + border-radius: 50%; +} + +.contact-type { + width: 20px; + color: #c1c3c4; +} + +.client-status { + text-align: left; +} + +.client-detail .vertical-timeline-content p { + margin: 0; +} + +.client-detail .vertical-timeline-icon.gray-bg { + color: #a7aaab; +} + +.clients-list .nav-tabs > li.active > a, +.clients-list .nav-tabs > li.active > a:hover, +.clients-list .nav-tabs > li.active > a:focus { + border-bottom: 1px solid #fff; +} + + +/* BLOG ARTICLE */ + +.blog h2 { + font-weight: 700; +} + +.blog h5 { + margin: 0 0 5px 0; +} + +.blog .btn { + margin: 0 0 5px 0; +} + +.article h1 { + font-size: 48px; + font-weight: 700; + color: #2F4050; +} + +.article p { + font-size: 15px; + line-height: 26px; +} + +.article-title { + text-align: center; + margin: 60px 0 40px 0; +} + +.article .ibox-content { + padding: 40px; +} + + +/* ISSUE TRACKER */ + +.issue-tracker .btn-link { + color: #1ab394; +} + +table.issue-tracker tbody tr td { + vertical-align: middle; + height: 50px; +} + +.issue-info { + width: 50%; +} + +.issue-info a { + font-weight: 600; + color: #676a6c; +} + +.issue-info small { + display: block; +} + + +/* TEAMS */ + +.team-members { + margin: 10px 0; +} + +.team-members img.img-circle { + width: 42px; + height: 42px; + margin-bottom: 5px; +} + + +/* AGILE BOARD */ + +.sortable-list { + padding: 10px 0; +} + +.agile-list { + list-style: none; + margin: 0; +} + +.agile-list li { + background: #FAFAFB; + border: 1px solid #e7eaec; + margin: 0px 0 10px 0; + padding: 10px; + border-radius: 2px; +} + +.agile-list li:hover { + cursor: pointer; + background: #fff; +} + +.agile-list li.warning-element { + border-left: 3px solid #f8ac59; +} + +.agile-list li.danger-element { + border-left: 3px solid #ed5565; +} + +.agile-list li.info-element { + border-left: 3px solid #1c84c6; +} + +.agile-list li.success-element { + border-left: 3px solid #1ab394; +} + +.agile-detail { + margin-top: 5px; + font-size: 12px; +} + + +/* DIFF */ + +ins { + background-color: #c6ffc6; + text-decoration: none; +} + +del { + background-color: #ffc6c6; +} + +#small-chat { + position: fixed; + bottom: 50px; + right: 26px; + z-index: 100; +} + +#small-chat .badge { + position: absolute; + top: -3px; + right: -4px; +} + +.open-small-chat { + height: 38px; + width: 38px; + display: block; + background: #1ab394; + padding: 9px 8px; + text-align: center; + color: #fff; + border-radius: 50%; +} + +.open-small-chat:hover { + color: white; + background: #1ab394; +} + +.small-chat-box { + display: none; + position: fixed; + bottom: 50px; + right: 80px; + background: #fff; + border: 1px solid #e7eaec; + width: 230px; + height: 320px; + border-radius: 4px; +} + +.small-chat-box.ng-small-chat { + display: block; +} + +.body-small .small-chat-box { + bottom: 70px; + right: 20px; +} + +.small-chat-box.active { + display: block; +} + +.small-chat-box .heading { + background: #2f4050; + padding: 8px 15px; + font-weight: bold; + color: #fff; +} + +.small-chat-box .chat-date { + opacity: 0.6; + font-size: 10px; + font-weight: normal; +} + +.small-chat-box .content { + padding: 15px 15px; +} + +.small-chat-box .content .author-name { + font-weight: bold; + margin-bottom: 3px; + font-size: 11px; +} + +.small-chat-box .content > div { + padding-bottom: 20px; +} + +.small-chat-box .content .chat-message { + padding: 5px 10px; + border-radius: 6px; + font-size: 11px; + line-height: 14px; + max-width: 80%; + background: #f3f3f4; + margin-bottom: 10px; +} + +.small-chat-box .content .chat-message.active { + background: #1ab394; + color: #fff; +} + +.small-chat-box .content .left { + text-align: left; + clear: both; +} + +.small-chat-box .content .left .chat-message { + float: left; +} + +.small-chat-box .content .right { + text-align: right; + clear: both; +} + +.small-chat-box .content .right .chat-message { + float: right; +} + +.small-chat-box .form-chat { + padding: 10px 10px; +} + + +/* + * Usage: + * + *

    + * + */ + +.sk-spinner-rotating-plane.sk-spinner { + width: 30px; + height: 30px; + background-color: #1ab394; + margin: 0 auto; + -webkit-animation: sk-rotatePlane 1.2s infinite ease-in-out; + animation: sk-rotatePlane 1.2s infinite ease-in-out; +} + +@-webkit-keyframes sk-rotatePlane { + 0% { + -webkit-transform: perspective(120px) rotateX(0deg) rotateY(0deg); + transform: perspective(120px) rotateX(0deg) rotateY(0deg); + } + 50% { + -webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg); + transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg); + } + 100% { + -webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); + transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); + } +} + +@keyframes sk-rotatePlane { + 0% { + -webkit-transform: perspective(120px) rotateX(0deg) rotateY(0deg); + transform: perspective(120px) rotateX(0deg) rotateY(0deg); + } + 50% { + -webkit-transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg); + transform: perspective(120px) rotateX(-180.1deg) rotateY(0deg); + } + 100% { + -webkit-transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); + transform: perspective(120px) rotateX(-180deg) rotateY(-179.9deg); + } +} + + +/* + * Usage: + * + *
    + *
    + *
    + *
    + * + */ + +.sk-spinner-double-bounce.sk-spinner { + width: 40px; + height: 40px; + position: relative; + margin: 0 auto; +} + +.sk-spinner-double-bounce .sk-double-bounce1, +.sk-spinner-double-bounce .sk-double-bounce2 { + width: 100%; + height: 100%; + border-radius: 50%; + background-color: #1ab394; + opacity: 0.6; + position: absolute; + top: 0; + left: 0; + -webkit-animation: sk-doubleBounce 2s infinite ease-in-out; + animation: sk-doubleBounce 2s infinite ease-in-out; +} + +.sk-spinner-double-bounce .sk-double-bounce2 { + -webkit-animation-delay: -1s; + animation-delay: -1s; +} + +@-webkit-keyframes sk-doubleBounce { + 0%, + 100% { + -webkit-transform: scale(0); + transform: scale(0); + } + 50% { + -webkit-transform: scale(1); + transform: scale(1); + } +} + +@keyframes sk-doubleBounce { + 0%, + 100% { + -webkit-transform: scale(0); + transform: scale(0); + } + 50% { + -webkit-transform: scale(1); + transform: scale(1); + } +} + + +/* + * Usage: + * + *
    + *
    + *
    + *
    + *
    + *
    + *
    + * + */ + +.sk-spinner-wave.sk-spinner { + margin: 0 auto; + width: 50px; + height: 30px; + text-align: center; + font-size: 10px; +} + +.sk-spinner-wave div { + background-color: #1ab394; + height: 100%; + width: 6px; + display: inline-block; + -webkit-animation: sk-waveStretchDelay 1.2s infinite ease-in-out; + animation: sk-waveStretchDelay 1.2s infinite ease-in-out; +} + +.sk-spinner-wave .sk-rect2 { + -webkit-animation-delay: -1.1s; + animation-delay: -1.1s; +} + +.sk-spinner-wave .sk-rect3 { + -webkit-animation-delay: -1s; + animation-delay: -1s; +} + +.sk-spinner-wave .sk-rect4 { + -webkit-animation-delay: -0.9s; + animation-delay: -0.9s; +} + +.sk-spinner-wave .sk-rect5 { + -webkit-animation-delay: -0.8s; + animation-delay: -0.8s; +} + +@-webkit-keyframes sk-waveStretchDelay { + 0%, + 40%, + 100% { + -webkit-transform: scaleY(0.4); + transform: scaleY(0.4); + } + 20% { + -webkit-transform: scaleY(1); + transform: scaleY(1); + } +} + +@keyframes sk-waveStretchDelay { + 0%, + 40%, + 100% { + -webkit-transform: scaleY(0.4); + transform: scaleY(0.4); + } + 20% { + -webkit-transform: scaleY(1); + transform: scaleY(1); + } +} + + +/* + * Usage: + * + *
    + *
    + *
    + *
    + * + */ + +.sk-spinner-wandering-cubes.sk-spinner { + margin: 0 auto; + width: 32px; + height: 32px; + position: relative; +} + +.sk-spinner-wandering-cubes .sk-cube1, +.sk-spinner-wandering-cubes .sk-cube2 { + background-color: #1ab394; + width: 10px; + height: 10px; + position: absolute; + top: 0; + left: 0; + -webkit-animation: sk-wanderingCubeMove 1.8s infinite ease-in-out; + animation: sk-wanderingCubeMove 1.8s infinite ease-in-out; +} + +.sk-spinner-wandering-cubes .sk-cube2 { + -webkit-animation-delay: -0.9s; + animation-delay: -0.9s; +} + +@-webkit-keyframes sk-wanderingCubeMove { + 25% { + -webkit-transform: translateX(42px) rotate(-90deg) scale(0.5); + transform: translateX(42px) rotate(-90deg) scale(0.5); + } + 50% { + /* Hack to make FF rotate in the right direction */ + -webkit-transform: translateX(42px) translateY(42px) rotate(-179deg); + transform: translateX(42px) translateY(42px) rotate(-179deg); + } + 50.1% { + -webkit-transform: translateX(42px) translateY(42px) rotate(-180deg); + transform: translateX(42px) translateY(42px) rotate(-180deg); + } + 75% { + -webkit-transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5); + transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5); + } + 100% { + -webkit-transform: rotate(-360deg); + transform: rotate(-360deg); + } +} + +@keyframes sk-wanderingCubeMove { + 25% { + -webkit-transform: translateX(42px) rotate(-90deg) scale(0.5); + transform: translateX(42px) rotate(-90deg) scale(0.5); + } + 50% { + /* Hack to make FF rotate in the right direction */ + -webkit-transform: translateX(42px) translateY(42px) rotate(-179deg); + transform: translateX(42px) translateY(42px) rotate(-179deg); + } + 50.1% { + -webkit-transform: translateX(42px) translateY(42px) rotate(-180deg); + transform: translateX(42px) translateY(42px) rotate(-180deg); + } + 75% { + -webkit-transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5); + transform: translateX(0px) translateY(42px) rotate(-270deg) scale(0.5); + } + 100% { + -webkit-transform: rotate(-360deg); + transform: rotate(-360deg); + } +} + + +/* + * Usage: + * + *
    + * + */ + +.sk-spinner-pulse.sk-spinner { + width: 40px; + height: 40px; + margin: 0 auto; + background-color: #1ab394; + border-radius: 100%; + -webkit-animation: sk-pulseScaleOut 1s infinite ease-in-out; + animation: sk-pulseScaleOut 1s infinite ease-in-out; +} + +@-webkit-keyframes sk-pulseScaleOut { + 0% { + -webkit-transform: scale(0); + transform: scale(0); + } + 100% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 0; + } +} + +@keyframes sk-pulseScaleOut { + 0% { + -webkit-transform: scale(0); + transform: scale(0); + } + 100% { + -webkit-transform: scale(1); + transform: scale(1); + opacity: 0; + } +} + + +/* + * Usage: + * + *
    + *
    + *
    + *
    + * + */ + +.sk-spinner-chasing-dots.sk-spinner { + margin: 0 auto; + width: 40px; + height: 40px; + position: relative; + text-align: center; + -webkit-animation: sk-chasingDotsRotate 2s infinite linear; + animation: sk-chasingDotsRotate 2s infinite linear; +} + +.sk-spinner-chasing-dots .sk-dot1, +.sk-spinner-chasing-dots .sk-dot2 { + width: 60%; + height: 60%; + display: inline-block; + position: absolute; + top: 0; + background-color: #1ab394; + border-radius: 100%; + -webkit-animation: sk-chasingDotsBounce 2s infinite ease-in-out; + animation: sk-chasingDotsBounce 2s infinite ease-in-out; +} + +.sk-spinner-chasing-dots .sk-dot2 { + top: auto; + bottom: 0px; + -webkit-animation-delay: -1s; + animation-delay: -1s; +} + +@-webkit-keyframes sk-chasingDotsRotate { + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +@keyframes sk-chasingDotsRotate { + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +@-webkit-keyframes sk-chasingDotsBounce { + 0%, + 100% { + -webkit-transform: scale(0); + transform: scale(0); + } + 50% { + -webkit-transform: scale(1); + transform: scale(1); + } +} + +@keyframes sk-chasingDotsBounce { + 0%, + 100% { + -webkit-transform: scale(0); + transform: scale(0); + } + 50% { + -webkit-transform: scale(1); + transform: scale(1); + } +} + + +/* + * Usage: + * + *
    + *
    + *
    + *
    + *
    + * + */ + +.sk-spinner-three-bounce.sk-spinner { + margin: 0 auto; + width: 70px; + text-align: center; +} + +.sk-spinner-three-bounce div { + width: 18px; + height: 18px; + background-color: #1ab394; + border-radius: 100%; + display: inline-block; + -webkit-animation: sk-threeBounceDelay 1.4s infinite ease-in-out; + animation: sk-threeBounceDelay 1.4s infinite ease-in-out; + /* Prevent first frame from flickering when animation starts */ + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} + +.sk-spinner-three-bounce .sk-bounce1 { + -webkit-animation-delay: -0.32s; + animation-delay: -0.32s; +} + +.sk-spinner-three-bounce .sk-bounce2 { + -webkit-animation-delay: -0.16s; + animation-delay: -0.16s; +} + +@-webkit-keyframes sk-threeBounceDelay { + 0%, + 80%, + 100% { + -webkit-transform: scale(0); + transform: scale(0); + } + 40% { + -webkit-transform: scale(1); + transform: scale(1); + } +} + +@keyframes sk-threeBounceDelay { + 0%, + 80%, + 100% { + -webkit-transform: scale(0); + transform: scale(0); + } + 40% { + -webkit-transform: scale(1); + transform: scale(1); + } +} + + +/* + * Usage: + * + *
    + *
    + *
    + *
    + *
    + *
    + *
    + *
    + *
    + *
    + *
    + *
    + *
    + *
    + * + */ + +.sk-spinner-circle.sk-spinner { + margin: 0 auto; + width: 22px; + height: 22px; + position: relative; +} + +.sk-spinner-circle .sk-circle { + width: 100%; + height: 100%; + position: absolute; + left: 0; + top: 0; +} + +.sk-spinner-circle .sk-circle:before { + content: ''; + display: block; + margin: 0 auto; + width: 20%; + height: 20%; + background-color: #1ab394; + border-radius: 100%; + -webkit-animation: sk-circleBounceDelay 1.2s infinite ease-in-out; + animation: sk-circleBounceDelay 1.2s infinite ease-in-out; + /* Prevent first frame from flickering when animation starts */ + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} + +.sk-spinner-circle .sk-circle2 { + -webkit-transform: rotate(30deg); + -ms-transform: rotate(30deg); + transform: rotate(30deg); +} + +.sk-spinner-circle .sk-circle3 { + -webkit-transform: rotate(60deg); + -ms-transform: rotate(60deg); + transform: rotate(60deg); +} + +.sk-spinner-circle .sk-circle4 { + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} + +.sk-spinner-circle .sk-circle5 { + -webkit-transform: rotate(120deg); + -ms-transform: rotate(120deg); + transform: rotate(120deg); +} + +.sk-spinner-circle .sk-circle6 { + -webkit-transform: rotate(150deg); + -ms-transform: rotate(150deg); + transform: rotate(150deg); +} + +.sk-spinner-circle .sk-circle7 { + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} + +.sk-spinner-circle .sk-circle8 { + -webkit-transform: rotate(210deg); + -ms-transform: rotate(210deg); + transform: rotate(210deg); +} + +.sk-spinner-circle .sk-circle9 { + -webkit-transform: rotate(240deg); + -ms-transform: rotate(240deg); + transform: rotate(240deg); +} + +.sk-spinner-circle .sk-circle10 { + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); +} + +.sk-spinner-circle .sk-circle11 { + -webkit-transform: rotate(300deg); + -ms-transform: rotate(300deg); + transform: rotate(300deg); +} + +.sk-spinner-circle .sk-circle12 { + -webkit-transform: rotate(330deg); + -ms-transform: rotate(330deg); + transform: rotate(330deg); +} + +.sk-spinner-circle .sk-circle2:before { + -webkit-animation-delay: -1.1s; + animation-delay: -1.1s; +} + +.sk-spinner-circle .sk-circle3:before { + -webkit-animation-delay: -1s; + animation-delay: -1s; +} + +.sk-spinner-circle .sk-circle4:before { + -webkit-animation-delay: -0.9s; + animation-delay: -0.9s; +} + +.sk-spinner-circle .sk-circle5:before { + -webkit-animation-delay: -0.8s; + animation-delay: -0.8s; +} + +.sk-spinner-circle .sk-circle6:before { + -webkit-animation-delay: -0.7s; + animation-delay: -0.7s; +} + +.sk-spinner-circle .sk-circle7:before { + -webkit-animation-delay: -0.6s; + animation-delay: -0.6s; +} + +.sk-spinner-circle .sk-circle8:before { + -webkit-animation-delay: -0.5s; + animation-delay: -0.5s; +} + +.sk-spinner-circle .sk-circle9:before { + -webkit-animation-delay: -0.4s; + animation-delay: -0.4s; +} + +.sk-spinner-circle .sk-circle10:before { + -webkit-animation-delay: -0.3s; + animation-delay: -0.3s; +} + +.sk-spinner-circle .sk-circle11:before { + -webkit-animation-delay: -0.2s; + animation-delay: -0.2s; +} + +.sk-spinner-circle .sk-circle12:before { + -webkit-animation-delay: -0.1s; + animation-delay: -0.1s; +} + +@-webkit-keyframes sk-circleBounceDelay { + 0%, + 80%, + 100% { + -webkit-transform: scale(0); + transform: scale(0); + } + 40% { + -webkit-transform: scale(1); + transform: scale(1); + } +} + +@keyframes sk-circleBounceDelay { + 0%, + 80%, + 100% { + -webkit-transform: scale(0); + transform: scale(0); + } + 40% { + -webkit-transform: scale(1); + transform: scale(1); + } +} + + +/* + * Usage: + * + *
    + *
    + *
    + *
    + *
    + *
    + *
    + *
    + *
    + *
    + *
    + * + */ + +.sk-spinner-cube-grid { + /* + * Spinner positions + * 1 2 3 + * 4 5 6 + * 7 8 9 + */ +} + +.sk-spinner-cube-grid.sk-spinner { + width: 30px; + height: 30px; + margin: 0 auto; +} + +.sk-spinner-cube-grid .sk-cube { + width: 33%; + height: 33%; + background-color: #1ab394; + float: left; + -webkit-animation: sk-cubeGridScaleDelay 1.3s infinite ease-in-out; + animation: sk-cubeGridScaleDelay 1.3s infinite ease-in-out; +} + +.sk-spinner-cube-grid .sk-cube:nth-child(1) { + -webkit-animation-delay: 0.2s; + animation-delay: 0.2s; +} + +.sk-spinner-cube-grid .sk-cube:nth-child(2) { + -webkit-animation-delay: 0.3s; + animation-delay: 0.3s; +} + +.sk-spinner-cube-grid .sk-cube:nth-child(3) { + -webkit-animation-delay: 0.4s; + animation-delay: 0.4s; +} + +.sk-spinner-cube-grid .sk-cube:nth-child(4) { + -webkit-animation-delay: 0.1s; + animation-delay: 0.1s; +} + +.sk-spinner-cube-grid .sk-cube:nth-child(5) { + -webkit-animation-delay: 0.2s; + animation-delay: 0.2s; +} + +.sk-spinner-cube-grid .sk-cube:nth-child(6) { + -webkit-animation-delay: 0.3s; + animation-delay: 0.3s; +} + +.sk-spinner-cube-grid .sk-cube:nth-child(7) { + -webkit-animation-delay: 0s; + animation-delay: 0s; +} + +.sk-spinner-cube-grid .sk-cube:nth-child(8) { + -webkit-animation-delay: 0.1s; + animation-delay: 0.1s; +} + +.sk-spinner-cube-grid .sk-cube:nth-child(9) { + -webkit-animation-delay: 0.2s; + animation-delay: 0.2s; +} + +@-webkit-keyframes sk-cubeGridScaleDelay { + 0%, + 70%, + 100% { + -webkit-transform: scale3D(1, 1, 1); + transform: scale3D(1, 1, 1); + } + 35% { + -webkit-transform: scale3D(0, 0, 1); + transform: scale3D(0, 0, 1); + } +} + +@keyframes sk-cubeGridScaleDelay { + 0%, + 70%, + 100% { + -webkit-transform: scale3D(1, 1, 1); + transform: scale3D(1, 1, 1); + } + 35% { + -webkit-transform: scale3D(0, 0, 1); + transform: scale3D(0, 0, 1); + } +} + + +/* + * Usage: + * + *
    + * + *
    + * + */ + +.sk-spinner-wordpress.sk-spinner { + background-color: #1ab394; + width: 30px; + height: 30px; + border-radius: 30px; + position: relative; + margin: 0 auto; + -webkit-animation: sk-innerCircle 1s linear infinite; + animation: sk-innerCircle 1s linear infinite; +} + +.sk-spinner-wordpress .sk-inner-circle { + display: block; + background-color: #fff; + width: 8px; + height: 8px; + position: absolute; + border-radius: 8px; + top: 5px; + left: 5px; +} + +@-webkit-keyframes sk-innerCircle { + 0% { + -webkit-transform: rotate(0); + transform: rotate(0); + } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + +@keyframes sk-innerCircle { + 0% { + -webkit-transform: rotate(0); + transform: rotate(0); + } + 100% { + -webkit-transform: rotate(360deg); + transform: rotate(360deg); + } +} + + +/* + * Usage: + * + *
    + *
    + *
    + *
    + *
    + *
    + *
    + *
    + *
    + *
    + *
    + *
    + *
    + *
    + * + */ + +.sk-spinner-fading-circle.sk-spinner { + margin: 0 auto; + width: 22px; + height: 22px; + position: relative; +} + +.sk-spinner-fading-circle .sk-circle { + width: 100%; + height: 100%; + position: absolute; + left: 0; + top: 0; +} + +.sk-spinner-fading-circle .sk-circle:before { + content: ''; + display: block; + margin: 0 auto; + width: 18%; + height: 18%; + background-color: #1ab394; + border-radius: 100%; + -webkit-animation: sk-circleFadeDelay 1.2s infinite ease-in-out; + animation: sk-circleFadeDelay 1.2s infinite ease-in-out; + /* Prevent first frame from flickering when animation starts */ + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} + +.sk-spinner-fading-circle .sk-circle2 { + -webkit-transform: rotate(30deg); + -ms-transform: rotate(30deg); + transform: rotate(30deg); +} + +.sk-spinner-fading-circle .sk-circle3 { + -webkit-transform: rotate(60deg); + -ms-transform: rotate(60deg); + transform: rotate(60deg); +} + +.sk-spinner-fading-circle .sk-circle4 { + -webkit-transform: rotate(90deg); + -ms-transform: rotate(90deg); + transform: rotate(90deg); +} + +.sk-spinner-fading-circle .sk-circle5 { + -webkit-transform: rotate(120deg); + -ms-transform: rotate(120deg); + transform: rotate(120deg); +} + +.sk-spinner-fading-circle .sk-circle6 { + -webkit-transform: rotate(150deg); + -ms-transform: rotate(150deg); + transform: rotate(150deg); +} + +.sk-spinner-fading-circle .sk-circle7 { + -webkit-transform: rotate(180deg); + -ms-transform: rotate(180deg); + transform: rotate(180deg); +} + +.sk-spinner-fading-circle .sk-circle8 { + -webkit-transform: rotate(210deg); + -ms-transform: rotate(210deg); + transform: rotate(210deg); +} + +.sk-spinner-fading-circle .sk-circle9 { + -webkit-transform: rotate(240deg); + -ms-transform: rotate(240deg); + transform: rotate(240deg); +} + +.sk-spinner-fading-circle .sk-circle10 { + -webkit-transform: rotate(270deg); + -ms-transform: rotate(270deg); + transform: rotate(270deg); +} + +.sk-spinner-fading-circle .sk-circle11 { + -webkit-transform: rotate(300deg); + -ms-transform: rotate(300deg); + transform: rotate(300deg); +} + +.sk-spinner-fading-circle .sk-circle12 { + -webkit-transform: rotate(330deg); + -ms-transform: rotate(330deg); + transform: rotate(330deg); +} + +.sk-spinner-fading-circle .sk-circle2:before { + -webkit-animation-delay: -1.1s; + animation-delay: -1.1s; +} + +.sk-spinner-fading-circle .sk-circle3:before { + -webkit-animation-delay: -1s; + animation-delay: -1s; +} + +.sk-spinner-fading-circle .sk-circle4:before { + -webkit-animation-delay: -0.9s; + animation-delay: -0.9s; +} + +.sk-spinner-fading-circle .sk-circle5:before { + -webkit-animation-delay: -0.8s; + animation-delay: -0.8s; +} + +.sk-spinner-fading-circle .sk-circle6:before { + -webkit-animation-delay: -0.7s; + animation-delay: -0.7s; +} + +.sk-spinner-fading-circle .sk-circle7:before { + -webkit-animation-delay: -0.6s; + animation-delay: -0.6s; +} + +.sk-spinner-fading-circle .sk-circle8:before { + -webkit-animation-delay: -0.5s; + animation-delay: -0.5s; +} + +.sk-spinner-fading-circle .sk-circle9:before { + -webkit-animation-delay: -0.4s; + animation-delay: -0.4s; +} + +.sk-spinner-fading-circle .sk-circle10:before { + -webkit-animation-delay: -0.3s; + animation-delay: -0.3s; +} + +.sk-spinner-fading-circle .sk-circle11:before { + -webkit-animation-delay: -0.2s; + animation-delay: -0.2s; +} + +.sk-spinner-fading-circle .sk-circle12:before { + -webkit-animation-delay: -0.1s; + animation-delay: -0.1s; +} + +@-webkit-keyframes sk-circleFadeDelay { + 0%, + 39%, + 100% { + opacity: 0; + } + 40% { + opacity: 1; + } +} + +@keyframes sk-circleFadeDelay { + 0%, + 39%, + 100% { + opacity: 0; + } + 40% { + opacity: 1; + } +} + +body.rtls { + /* Theme config */ +} + +body.rtls #page-wrapper { + margin: 0 220px 0 0; +} + +body.rtls .nav-second-level li a { + padding: 7px 35px 7px 10px; +} + +body.rtls .ibox-title h5 { + float: right; +} + +body.rtls .pull-right { + float: left !important; +} + +body.rtls .pull-left { + float: right !important; +} + +body.rtls .ibox-tools { + float: left; +} + +body.rtls .stat-percent { + float: left; +} + +body.rtls .navbar-right { + float: left !important; +} + +body.rtls .navbar-top-links li:last-child { + margin-left: 40px; + margin-right: 0; +} + +body.rtls .minimalize-styl-2 { + float: right; + margin: 14px 20px 5px 5px; +} + +body.rtls .feed-element > .pull-left { + margin-left: 10px; + margin-right: 0; +} + +body.rtls .timeline-item .date { + text-align: left; +} + +body.rtls .timeline-item .date i { + left: 0; + right: auto; +} + +body.rtls .timeline-item .content { + border-right: 1px solid #e7eaec; + border-left: none; +} + +body.rtls .toast-close-button { + float: left; +} + +body.rtls #toast-container > .toast:before { + margin: auto -1.5em auto 0.5em; +} + +body.rtls #toast-container > div { + padding: 15px 50px 15px 15px; +} + +body.rtls .center-orientation .vertical-timeline-icon i { + margin-left: 0; + margin-right: -12px; +} + +body.rtls .vertical-timeline-icon i { + right: 50%; + left: auto; + margin-left: auto; + margin-right: -12px; +} + +body.rtls .file-box { + float: right; +} + +body.rtls ul.notes li { + float: right; +} + +body.rtls .chat-users, +body.rtls .chat-statistic { + margin-right: -30px; + margin-left: auto; +} + +body.rtls .dropdown-menu > li > a { + text-align: right; +} + +body.rtls .b-r { + border-left: 1px solid #e7eaec; + border-right: none; +} + +body.rtls .dd-list .dd-list { + padding-right: 30px; + padding-left: 0; +} + +body.rtls .dd-item > button { + float: right; +} + +body.rtls .skin-setttings { + margin-right: 40px; + margin-left: 0; +} + +body.rtls .skin-setttings { + direction: ltr; +} + +body.rtls .footer.fixed { + margin-right: 220px; + margin-left: 0; +} + +@media (max-width: 992px) { + body.rtls .chat-users, + body.rtls .chat-statistic { + margin-right: 0px; + } +} + +body.rtls.mini-navbar .footer.fixed, +body.body-small.mini-navbar .footer.fixed { + margin: 0 70px 0 0; +} + +body.rtls.mini-navbar.fixed-sidebar .footer.fixed, +body.body-small.mini-navbar .footer.fixed { + margin: 0 0 0 0; +} + +body.rtls.top-navigation .navbar-toggle { + float: right; + margin-left: 15px; + margin-right: 15px; +} + +.body-small.rtls.top-navigation .navbar-header { + float: none; +} + +body.rtls.top-navigation #page-wrapper { + margin: 0; +} + +body.rtls.mini-navbar #page-wrapper { + margin: 0 70px 0 0; +} + +body.rtls.mini-navbar.fixed-sidebar #page-wrapper { + margin: 0 0 0 0; +} + +body.rtls.body-small.fixed-sidebar.mini-navbar #page-wrapper { + margin: 0 220px 0 0; +} + +body.rtls.body-small.fixed-sidebar.mini-navbar .navbar-static-side { + width: 220px; +} + +.body-small.rtls .navbar-fixed-top { + margin-right: 0px; +} + +.body-small.rtls .navbar-header { + float: right; +} + +body.rtls .navbar-top-links li:last-child { + margin-left: 20px; +} + +body.rtls .top-navigation #page-wrapper, +body.rtls.mini-navbar .top-navigation #page-wrapper, +body.rtls.mini-navbar.top-navigation #page-wrapper { + margin: 0; +} + +body.rtls .top-navigation .footer.fixed, +body.rtls.top-navigation .footer.fixed { + margin: 0; +} + +@media (max-width: 768px) { + body.rtls .navbar-top-links li:last-child { + margin-left: 20px; + } + .body-small.rtls #page-wrapper { + position: inherit; + margin: 0 0 0 0px; + min-height: 1000px; + } + .body-small.rtls .navbar-static-side { + display: none; + z-index: 2001; + position: absolute; + width: 70px; + } + .body-small.rtls.mini-navbar .navbar-static-side { + display: block; + } + .rtls.fixed-sidebar.body-small .navbar-static-side { + display: none; + z-index: 2001; + position: fixed; + width: 220px; + } + .rtls.fixed-sidebar.body-small.mini-navbar .navbar-static-side { + display: block; + } +} + +.rtls .ltr-support { + direction: ltr; +} + + +/* + * + * This is style for skin config + * Use only in demo theme + * +*/ + +.skin-setttings .title { + background: #efefef; + text-align: center; + text-transform: uppercase; + font-weight: 600; + display: block; + padding: 10px 15px; + font-size: 12px; +} + +.setings-item { + padding: 10px 30px; +} + +.setings-item.nb { + border: none; +} + +.setings-item.skin { + text-align: center; +} + +.setings-item .switch { + float: right; +} + +.skin-name a { + text-transform: uppercase; +} + +.setings-item a { + color: #fff; +} + +.default-skin, +.blue-skin, +.ultra-skin, +.yellow-skin { + text-align: center; +} + +.default-skin { + font-weight: 600; + background: #1ab394; +} + +.default-skin:hover { + background: #199d82; +} + +.blue-skin { + font-weight: 600; + background: url("patterns/header-profile-skin-1.png") repeat scroll 0 0; +} + +.blue-skin:hover { + background: #0d8ddb; +} + +.yellow-skin { + font-weight: 600; + background: url("patterns/header-profile-skin-3.png") repeat scroll 0 100%; +} + +.yellow-skin:hover { + background: #ce8735; +} + +.content-tabs { + border-bottom: solid 2px #2f4050; +} + +.page-tabs a { + color: #999; +} + +.page-tabs a i { + color: #ccc; +} + +.page-tabs a.active { + background: #2f4050; + color: #a7b1c2; +} + +.page-tabs a.active:hover, +.page-tabs a.active i:hover { + background: #293846; + color: #fff; +} + + +/* + * + * SKIN 1 - H+ - 后台主题UI框架 + * NAME - Blue light + * +*/ + +.skin-1 .minimalize-styl-2 { + margin: 14px 5px 5px 30px; +} + +.skin-1 .navbar-top-links li:last-child { + margin-right: 30px; +} + +.skin-1.fixed-nav .minimalize-styl-2 { + margin: 14px 5px 5px 15px; +} + +.skin-1 .spin-icon { + background: #0e9aef !important; +} + +.skin-1 .nav-header { + background: #0e9aef; + background: url('patterns/header-profile-skin-1.png'); +} + +.skin-1.mini-navbar .nav-second-level { + background: #3e495f; +} + +.skin-1 .breadcrumb { + background: transparent; +} + +.skin-1 .page-heading { + border: none; +} + +.skin-1 .nav > li.active { + background: #3a4459; +} + +.skin-1 .nav > li > a { + color: #9ea6b9; +} + +.skin-1 .nav > li.active > a { + color: #fff; +} + +.skin-1 .navbar-minimalize { + background: #0e9aef; + border-color: #0e9aef; +} + +body.skin-1 { + background: #3e495f; +} + +.skin-1 .navbar-static-top { + background: #ffffff; +} + +.skin-1 .dashboard-header { + background: transparent; + border-bottom: none !important; + border-top: none; + padding: 20px 30px 10px 30px; +} + +.fixed-nav.skin-1 .navbar-fixed-top { + background: #fff; +} + +.skin-1 .wrapper-content { + padding: 30px 15px; +} + +.skin-1 #page-wrapper { + background: #f4f6fa; +} + +.skin-1 .ibox-title, +.skin-1 .ibox-content { + border-width: 1px; +} + +.skin-1 .ibox-content:last-child { + border-style: solid solid solid solid; +} + +.skin-1 .nav > li.active { + border: none; +} + +.skin-1 .nav-header { + padding: 35px 25px 25px 25px; +} + +.skin-1 .nav-header a.dropdown-toggle { + color: #fff; + margin-top: 10px; +} + +.skin-1 .nav-header a.dropdown-toggle .text-muted { + color: #fff; + opacity: 0.8; +} + +.skin-1 .profile-element { + text-align: center; +} + +.skin-1 .img-circle { + border-radius: 5px; +} + +.skin-1 .navbar-default .nav > li > a:hover, +.skin-1 .navbar-default .nav > li > a:focus { + background: #39aef5; + color: #fff; +} + +.skin-1 .nav.nav-tabs > li.active > a { + color: #555; +} + +.skin-1 .content-tabs { + border-bottom: solid 2px #39aef5; +} + +.skin-1 .nav.nav-tabs > li.active { + background: transparent; +} + +.skin-1 .page-tabs a.active { + background: #39aef5; + color: #fff; +} + +.skin-1 .page-tabs a.active:hover, +.skin-1 .page-tabs a.active i:hover { + background: #0e9aef; + color: #fff; +} + + +/* + * + * SKIN 3 - H+ - 后台主题UI框架 + * NAME - Yellow/purple + * +*/ + +.skin-3 .minimalize-styl-2 { + margin: 14px 5px 5px 30px; +} + +.skin-3 .navbar-top-links li:last-child { + margin-right: 30px; +} + +.skin-3.fixed-nav .minimalize-styl-2 { + margin: 14px 5px 5px 15px; +} + +.skin-3 .spin-icon { + background: #ecba52 !important; +} + +body.boxed-layout.skin-3 #wrapper { + background: #3e2c42; +} + +.skin-3 .nav-header { + background: #ecba52; + background: url('patterns/header-profile-skin-3.png'); +} + +.skin-3.mini-navbar .nav-second-level { + background: #3e2c42; +} + +.skin-3 .breadcrumb { + background: transparent; +} + +.skin-3 .page-heading { + border: none; +} + +.skin-3 .nav > li.active { + background: #38283c; +} + +.fixed-nav.skin-3 .navbar-fixed-top { + background: #fff; +} + +.skin-3 .nav > li > a { + color: #948b96; +} + +.skin-3 .nav > li.active > a { + color: #fff; +} + +.skin-3 .navbar-minimalize { + background: #ecba52; + border-color: #ecba52; +} + +body.skin-3 { + background: #3e2c42; +} + +.skin-3 .navbar-static-top { + background: #ffffff; +} + +.skin-3 .dashboard-header { + background: transparent; + border-bottom: none !important; + border-top: none; + padding: 20px 30px 10px 30px; +} + +.skin-3 .wrapper-content { + padding: 30px 15px; +} + +.skin-3 #page-wrapper { + background: #f4f6fa; +} + +.skin-3 .ibox-title, +.skin-3 .ibox-content { + border-width: 1px; +} + +.skin-3 .ibox-content:last-child { + border-style: solid solid solid solid; +} + +.skin-3 .nav > li.active { + border: none; +} + +.skin-3 .nav-header { + padding: 35px 25px 25px 25px; +} + +.skin-3 .nav-header a.dropdown-toggle { + color: #fff; + margin-top: 10px; +} + +.skin-3 .nav-header a.dropdown-toggle .text-muted { + color: #fff; + opacity: 0.8; +} + +.skin-3 .profile-element { + text-align: center; +} + +.skin-3 .img-circle { + border-radius: 5px; +} + +.skin-3 .navbar-default .nav > li > a:hover, +.skin-3 .navbar-default .nav > li > a:focus { + background: #38283c; + color: #fff; +} + +.skin-3 .nav.nav-tabs > li.active > a { + color: #555; +} + +.skin-3 .nav.nav-tabs > li.active { + background: transparent; +} + +.skin-3 .content-tabs { + border-bottom: solid 2px #3e2c42; +} + +.skin-3 .nav.nav-tabs > li.active { + background: transparent; +} + +.skin-3 .page-tabs a.active { + background: #3e2c42; + color: #fff; +} + +.skin-3 .page-tabs a.active:hover, +.skin-3 .page-tabs a.active i:hover { + background: #38283c; + color: #fff; +} + +@media (min-width: 768px) { + .navbar-top-links .dropdown-messages, + .navbar-top-links .dropdown-tasks, + .navbar-top-links .dropdown-alerts { + margin-left: auto; + } +} + +@media (max-width: 768px) { + body.fixed-sidebar .navbar-static-side { + display: none; + } + body.fixed-sidebar.mini-navbar .navbar-static-side { + width: 70px; + } + .lock-word { + display: none; + } + .navbar-form-custom { + display: none; + } + .navbar-header { + display: inline; + float: left; + } + .sidebard-panel { + z-index: 2; + position: relative; + width: auto; + min-height: 100% !important; + } + .sidebar-content .wrapper { + padding-right: 0px; + z-index: 1; + } + .fixed-sidebar.body-small .navbar-static-side { + display: none; + z-index: 2001; + position: fixed; + width: 220px; + } + .fixed-sidebar.body-small.mini-navbar .navbar-static-side { + display: block; + } + .ibox-tools { + float: none; + text-align: right; + display: block; + } + .content-tabs { + display: none; + } + #content-main { + height: calc(100% - 100px); + } + .fixed-nav #content-main { + height: calc(100% - 38px); + } +} + +.navbar-static-side { + background: #2f4050; +} + +.nav-close { + padding: 10px; + display: block; + position: absolute; + right: 5px; + top: 5px; + font-size: 1.4em; + cursor: pointer; + z-index: 10; + display: none; + color: rgba(255, 255, 255, .3); +} + +@media (max-width: 350px) { + body.fixed-sidebar.mini-navbar .navbar-static-side { + width: 0; + } + .nav-close { + display: block; + } + #page-wrapper { + margin-left: 0!important; + } + .timeline-item .date { + text-align: left; + width: 110px; + position: relative; + padding-top: 30px; + } + .timeline-item .date i { + position: absolute; + top: 0; + left: 15px; + padding: 5px; + width: 30px; + text-align: center; + border: 1px solid #e7eaec; + background: #f8f8f8; + } + .timeline-item .content { + border-left: none; + border-top: 1px solid #e7eaec; + padding-top: 10px; + min-height: 100px; + } + .nav.navbar-top-links li.dropdown { + display: none; + } + .ibox-tools { + float: none; + text-align: left; + display: inline-block; + } +} + + +/*JQGRID*/ + +.ui-jqgrid-titlebar { + height: 40px; + line-height: 24px; + color: #676a6c; + background-color: #F9F9F9; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} + +.ui-jqgrid .ui-jqgrid-title { + float: left; + margin-left: 5px; + font-weight: 700; +} + +.ui-jqgrid .ui-jqgrid-titlebar { + position: relative; + border-left: 0px solid; + border-right: 0px solid; + border-top: 0px solid; +} + + +/* Social feed */ + +.social-feed-separated .social-feed-box { + margin-left: 62px; +} + +.social-feed-separated .social-avatar { + float: left; + padding: 0; +} + +.social-feed-separated .social-avatar img { + width: 52px; + height: 52px; + border: 1px solid #e7eaec; +} + +.social-feed-separated .social-feed-box .social-avatar { + padding: 15px 15px 0 15px; + float: none; +} + +.social-feed-box { + /*padding: 15px;*/ + border: 1px solid #e7eaec; + background: #fff; + margin-bottom: 15px; +} + +.article .social-feed-box { + margin-bottom: 0; + border-bottom: none; +} + +.article .social-feed-box:last-child { + margin-bottom: 0; + border-bottom: 1px solid #e7eaec; +} + +.article .social-feed-box p { + font-size: 13px; + line-height: 18px; +} + +.social-action { + margin: 15px; +} + +.social-avatar { + padding: 15px 15px 0 15px; +} + +.social-comment .social-comment { + margin-left: 45px; +} + +.social-avatar img { + height: 40px; + width: 40px; + margin-right: 10px; +} + +.social-avatar .media-body a { + font-size: 14px; + display: block; +} + +.social-body { + padding: 15px; +} + +.social-body img { + margin-bottom: 10px; +} + +.social-footer { + border-top: 1px solid #e7eaec; + padding: 10px 15px; + background: #f9f9f9; +} + +.social-footer .social-comment img { + width: 32px; + margin-right: 10px; +} + +.social-comment:first-child { + margin-top: 0; +} + +.social-comment { + margin-top: 15px; +} + +.social-comment textarea { + font-size: 12px; +} + +.checkbox input[type=checkbox], +.checkbox-inline input[type=checkbox], +.radio input[type=radio], +.radio-inline input[type=radio] { + margin-top: -4px; +} + + +/* Only demo */ + +@media (max-width: 1000px) { + .welcome-message { + display: none; + } +} + + +/* ECHARTS */ + +.echarts { + height: 240px; +} + +.checkbox-inline, +.radio-inline, +.checkbox-inline+.checkbox-inline, +.radio-inline+.radio-inline { + margin: 0 15px 0 0; +} + +.navbar-toggle { + background-color: #fff; +} + +.J_menuTab { + -webkit-transition: all .3s ease-out 0s; + transition: all .3s ease-out 0s; +} + +::-webkit-scrollbar-track { + background-color: #F5F5F5; +} + +::-webkit-scrollbar { + width: 6px; + background-color: #F5F5F5; +} + +::-webkit-scrollbar-thumb { + background-color: #999; +} + + +/*GO HOME*/ + +.gohome { + position: fixed; + top: 20px; + right: 20px; + z-index: 100; +} + +.gohome a { + height: 38px; + width: 38px; + display: block; + background: #2f4050; + padding: 9px 8px; + text-align: center; + color: #fff; + border-radius: 50%; + opacity: .5; +} + +.gohome a:hover { + opacity: 1; +} + +@media only screen and (-webkit-min-device-pixel-ratio : 2){ + #content-main { + -webkit-overflow-scrolling: touch; + } +} + +.navbar-header { + width: 60%; +} + +.bs-glyphicons { + margin: 0 -10px 20px; + overflow: hidden +} + +.bs-glyphicons-list { + padding-left: 0; + list-style: none +} + +.bs-glyphicons li { + float: left; + width: 25%; + height: 115px; + padding: 10px; + font-size: 10px; + line-height: 1.4; + text-align: center; + background-color: #f9f9f9; + border: 1px solid #fff +} + +.bs-glyphicons .glyphicon { + margin-top: 5px; + margin-bottom: 10px; + font-size: 24px +} + +.bs-glyphicons .glyphicon-class { + display: block; + text-align: center; + word-wrap: break-word +} + +.bs-glyphicons li:hover { + color: #fff; + background-color: #1ab394; +} + +@media (min-width: 768px) { + .bs-glyphicons { + margin-right: 0; + margin-left: 0 + } + .bs-glyphicons li { + width: 12.5%; + font-size: 12px + } +} +.table tr td { + word-break: break-all; + word-wrap: break-word; +} +.Validform_checktip{ + margin-left:8px; + line-height:20px; + height:20px; + display: inline-block; + color:#999; + font-size:12px; +} +.Validform_right{ + color:#71b83d; + padding-left:20px; + background:url(../img/right.png) no-repeat left center; +} +.Validform_wrong{ + color:red; + padding-left:20px; + white-space:nowrap; + background:url(../img/error.png) no-repeat left center; +} +.Validform_loading{ + padding-left:20px; + background:url(../img/onLoad.gif) no-repeat left center; +} +.Validform_error{ + background-color:#ffe7e7; +} +#Validform_msg{color:#7d8289; font: 12px/1.5 tahoma, arial, \5b8b\4f53, sans-serif; width:280px; -webkit-box-shadow:2px 2px 3px #aaa; -moz-box-shadow:2px 2px 3px #aaa; background:#fff; position:absolute; top:0px; right:50px; z-index:99999; display:none;filter: progid:DXImageTransform.Microsoft.Shadow(Strength=3, Direction=135, Color='#999999');} +#Validform_msg .iframe{position:absolute; left:0px; top:-1px; z-index:-1;} +#Validform_msg .Validform_title{line-height:25px; height:25px; text-align:left; font-weight:bold; padding:0 8px; color:#fff; position:relative; background-color:#000;} +#Validform_msg a.Validform_close:link,#Validform_msg a.Validform_close:visited{line-height:22px; position:absolute; right:8px; top:0px; color:#fff; text-decoration:none;} +#Validform_msg a.Validform_close:hover{color:#cc0;} +#Validform_msg .Validform_info{padding:8px;border:1px solid #000; border-top:none; text-align:left;} \ No newline at end of file diff --git a/app-manage/src/main/resources/public/static/css/webuploader.css b/app-manage/src/main/resources/public/static/css/webuploader.css new file mode 100644 index 0000000..2bdeda7 --- /dev/null +++ b/app-manage/src/main/resources/public/static/css/webuploader.css @@ -0,0 +1,43 @@ +.webuploader-container { + margin-top:5px; + position: relative; + display: inline-block; + vertical-align: top; +} +.webuploader-element-invisible { + position: absolute !important; + clip: rect(1px 1px 1px 1px); /* IE6, IE7 */ + clip: rect(1px,1px,1px,1px); +} +.webuploader-pick { + width: 150px; + height: 100px; + background: url(../img/upload.jpg); + cursor: pointer; +} +/*.webuploader-pick { + position: relative; + display: inline-block; + cursor: pointer; + background: #00b7ee; + padding: 10px 15px; + color: #fff; + text-align: center; + border-radius: 3px; + overflow: hidden; +}*/ +/*.webuploader-pick-hover { + background: #00a2d4; +}*/ + +.webuploader-pick-disable { + opacity: 0.6; + pointer-events:none; +} +.webuploader-container > div { + width: 150px !important; + height: 100px !important; +} +.webuploader-container > div:last-child { + left: 0 !important; +} diff --git a/app-manage/src/main/resources/public/static/fonts/FontAwesome.otf b/app-manage/src/main/resources/public/static/fonts/FontAwesome.otf new file mode 100644 index 0000000..681bdd4 Binary files /dev/null and b/app-manage/src/main/resources/public/static/fonts/FontAwesome.otf differ diff --git a/app-manage/src/main/resources/public/static/fonts/fontawesome-webfont.eot b/app-manage/src/main/resources/public/static/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000..a30335d Binary files /dev/null and b/app-manage/src/main/resources/public/static/fonts/fontawesome-webfont.eot differ diff --git a/app-manage/src/main/resources/public/static/fonts/fontawesome-webfont.svg b/app-manage/src/main/resources/public/static/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000..6c5bb76 --- /dev/null +++ b/app-manage/src/main/resources/public/static/fonts/fontawesome-webfont.svg @@ -0,0 +1,640 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app-manage/src/main/resources/public/static/fonts/fontawesome-webfont.ttf b/app-manage/src/main/resources/public/static/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000..d7994e1 Binary files /dev/null and b/app-manage/src/main/resources/public/static/fonts/fontawesome-webfont.ttf differ diff --git a/app-manage/src/main/resources/public/static/fonts/fontawesome-webfont.woff b/app-manage/src/main/resources/public/static/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000..6fd4ede Binary files /dev/null and b/app-manage/src/main/resources/public/static/fonts/fontawesome-webfont.woff differ diff --git a/app-manage/src/main/resources/public/static/fonts/fontawesome-webfont.woff2 b/app-manage/src/main/resources/public/static/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000..5560193 Binary files /dev/null and b/app-manage/src/main/resources/public/static/fonts/fontawesome-webfont.woff2 differ diff --git a/app-manage/src/main/resources/public/static/fonts/glyphicons-halflings-regular.eot b/app-manage/src/main/resources/public/static/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000..b93a495 Binary files /dev/null and b/app-manage/src/main/resources/public/static/fonts/glyphicons-halflings-regular.eot differ diff --git a/app-manage/src/main/resources/public/static/fonts/glyphicons-halflings-regular.svg b/app-manage/src/main/resources/public/static/fonts/glyphicons-halflings-regular.svg new file mode 100644 index 0000000..187805a --- /dev/null +++ b/app-manage/src/main/resources/public/static/fonts/glyphicons-halflings-regular.svg @@ -0,0 +1,288 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/app-manage/src/main/resources/public/static/fonts/glyphicons-halflings-regular.ttf b/app-manage/src/main/resources/public/static/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000..1413fc6 Binary files /dev/null and b/app-manage/src/main/resources/public/static/fonts/glyphicons-halflings-regular.ttf differ diff --git a/app-manage/src/main/resources/public/static/fonts/glyphicons-halflings-regular.woff b/app-manage/src/main/resources/public/static/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 0000000..9e61285 Binary files /dev/null and b/app-manage/src/main/resources/public/static/fonts/glyphicons-halflings-regular.woff differ diff --git a/app-manage/src/main/resources/public/static/fonts/glyphicons-halflings-regular.woff2 b/app-manage/src/main/resources/public/static/fonts/glyphicons-halflings-regular.woff2 new file mode 100644 index 0000000..64539b5 Binary files /dev/null and b/app-manage/src/main/resources/public/static/fonts/glyphicons-halflings-regular.woff2 differ diff --git a/app-manage/src/main/resources/public/static/img/add.png b/app-manage/src/main/resources/public/static/img/add.png new file mode 100644 index 0000000..50473ce Binary files /dev/null and b/app-manage/src/main/resources/public/static/img/add.png differ diff --git a/app-manage/src/main/resources/public/static/img/bgblack.png b/app-manage/src/main/resources/public/static/img/bgblack.png new file mode 100644 index 0000000..8377655 Binary files /dev/null and b/app-manage/src/main/resources/public/static/img/bgblack.png differ diff --git a/app-manage/src/main/resources/public/static/img/check_alt.png b/app-manage/src/main/resources/public/static/img/check_alt.png new file mode 100644 index 0000000..5be78b4 Binary files /dev/null and b/app-manage/src/main/resources/public/static/img/check_alt.png differ diff --git a/app-manage/src/main/resources/public/static/img/error.png b/app-manage/src/main/resources/public/static/img/error.png new file mode 100644 index 0000000..aeff2a4 Binary files /dev/null and b/app-manage/src/main/resources/public/static/img/error.png differ diff --git a/app-manage/src/main/resources/public/static/img/error/404.png b/app-manage/src/main/resources/public/static/img/error/404.png new file mode 100644 index 0000000..600d6d8 Binary files /dev/null and b/app-manage/src/main/resources/public/static/img/error/404.png differ diff --git a/app-manage/src/main/resources/public/static/img/error/404_msg.png b/app-manage/src/main/resources/public/static/img/error/404_msg.png new file mode 100644 index 0000000..ffc72d4 Binary files /dev/null and b/app-manage/src/main/resources/public/static/img/error/404_msg.png differ diff --git a/app-manage/src/main/resources/public/static/img/error/404_to_index.png b/app-manage/src/main/resources/public/static/img/error/404_to_index.png new file mode 100644 index 0000000..34799f7 Binary files /dev/null and b/app-manage/src/main/resources/public/static/img/error/404_to_index.png differ diff --git a/app-manage/src/main/resources/public/static/img/error/error_bg.jpg b/app-manage/src/main/resources/public/static/img/error/error_bg.jpg new file mode 100644 index 0000000..ab75e5c Binary files /dev/null and b/app-manage/src/main/resources/public/static/img/error/error_bg.jpg differ diff --git a/app-manage/src/main/resources/public/static/img/error/error_cloud.png b/app-manage/src/main/resources/public/static/img/error/error_cloud.png new file mode 100644 index 0000000..2c55284 Binary files /dev/null and b/app-manage/src/main/resources/public/static/img/error/error_cloud.png differ diff --git a/app-manage/src/main/resources/public/static/img/project.png b/app-manage/src/main/resources/public/static/img/project.png new file mode 100644 index 0000000..a69f6bd Binary files /dev/null and b/app-manage/src/main/resources/public/static/img/project.png differ diff --git a/app-manage/src/main/resources/public/static/img/right.png b/app-manage/src/main/resources/public/static/img/right.png new file mode 100644 index 0000000..9b4d17f Binary files /dev/null and b/app-manage/src/main/resources/public/static/img/right.png differ diff --git a/app-manage/src/main/resources/public/static/img/upload.jpg b/app-manage/src/main/resources/public/static/img/upload.jpg new file mode 100644 index 0000000..a2e2580 Binary files /dev/null and b/app-manage/src/main/resources/public/static/img/upload.jpg differ diff --git a/app-manage/src/main/resources/public/static/img/x_alt.png b/app-manage/src/main/resources/public/static/img/x_alt.png new file mode 100644 index 0000000..d560b26 Binary files /dev/null and b/app-manage/src/main/resources/public/static/img/x_alt.png differ diff --git a/app-manage/src/main/resources/public/static/js/Validform_v5.3.2.js b/app-manage/src/main/resources/public/static/js/Validform_v5.3.2.js new file mode 100644 index 0000000..a02df96 --- /dev/null +++ b/app-manage/src/main/resources/public/static/js/Validform_v5.3.2.js @@ -0,0 +1,1331 @@ +/* + 通用表单验证方法 + Validform version 5.3.2 + By sean during April 7, 2010 - March 26, 2013 + For more information, please visit http://validform.rjboy.cn + Validform is available under the terms of the MIT license. + + Demo: + $(".demoform").Validform({//$(".demoform")指明是哪一表单需要验证,名称需加在form表单上; + btnSubmit:"#btn_sub", //#btn_sub是该表单下要绑定点击提交表单事件的按钮;如果form内含有submit按钮该参数可省略; + btnReset:".btn_reset",//可选项 .btn_reset是该表单下要绑定点击重置表单事件的按钮; + tiptype:1, //可选项 1=>pop box,2=>side tip(parent.next.find; with default pop),3=>side tip(siblings; with default pop),4=>side tip(siblings; none pop),默认为1,也可以传入一个function函数,自定义提示信息的显示方式(可以实现你想要的任何效果,具体参见demo页); + ignoreHidden:false,//可选项 true | false 默认为false,当为true时对:hidden的表单元素将不做验证; + dragonfly:false,//可选项 true | false 默认false,当为true时,值为空时不做验证; + tipSweep:true,//可选项 true | false 默认为false,只在表单提交时触发检测,blur事件将不会触发检测(实时验证会在后台进行,不会显示检测结果); + label:".label",//可选项 选择符,在没有绑定nullmsg时查找要显示的提示文字,默认查找".Validform_label"下的文字; + showAllError:false,//可选项 true | false,true:提交表单时所有错误提示信息都会显示,false:一碰到验证不通过的就停止检测后面的元素,只显示该元素的错误信息; + postonce:true, //可选项 表单是否只能提交一次,true开启,不填则默认关闭; + ajaxPost:true, //使用ajax方式提交表单数据,默认false,提交地址就是action指定地址; + datatype:{//传入自定义datatype类型,可以是正则,也可以是函数(函数内会传入一个参数); + "*6-20": /^[^\s]{6,20}$/, + "z2-4" : /^[\u4E00-\u9FA5\uf900-\ufa2d]{2,4}$/, + "username":function(gets,obj,curform,regxp){ + //参数gets是获取到的表单元素值,obj为当前表单元素,curform为当前验证的表单,regxp为内置的一些正则表达式的引用; + var reg1=/^[\w\.]{4,16}$/, + reg2=/^[\u4E00-\u9FA5\uf900-\ufa2d]{2,8}$/; + + if(reg1.test(gets)){return true;} + if(reg2.test(gets)){return true;} + return false; + + //注意return可以返回true 或 false 或 字符串文字,true表示验证通过,返回字符串表示验证失败,字符串作为错误提示显示,返回false则用errmsg或默认的错误提示; + }, + "phone":function(){ + // 5.0 版本之后,要实现二选一的验证效果,datatype 的名称 不 需要以 "option_" 开头; + } + }, + usePlugin:{ + swfupload:{}, + datepicker:{}, + passwordstrength:{}, + jqtransform:{ + selector:"select,input" + } + }, + beforeCheck:function(curform){ + //在表单提交执行验证之前执行的函数,curform参数是当前表单对象。 + //这里明确return false的话将不会继续执行验证操作; + }, + beforeSubmit:function(curform){ + //在验证成功后,表单提交前执行的函数,curform参数是当前表单对象。 + //这里明确return false的话表单将不会提交; + }, + callback:function(data){ + //返回数据data是json格式,{"info":"demo info","status":"y"} + //info: 输出提示信息; + //status: 返回提交数据的状态,是否提交成功。如可以用"y"表示提交成功,"n"表示提交失败,在ajax_post.php文件返回数据里自定字符,主要用在callback函数里根据该值执行相应的回调操作; + //你也可以在ajax_post.php文件返回更多信息在这里获取,进行相应操作; + //ajax遇到服务端错误时也会执行回调,这时的data是{ status:**, statusText:**, readyState:**, responseText:** }; + + //这里执行回调操作; + //注意:如果不是ajax方式提交表单,传入callback,这时data参数是当前表单对象,回调函数会在表单验证全部通过后执行,然后判断是否提交表单,如果callback里明确return false,则表单不会提交,如果return true或没有return,则会提交表单。 + } + }); + + Validform对象的方法和属性: + tipmsg:自定义提示信息,通过修改Validform对象的这个属性值来让同一个页面的不同表单使用不同的提示文字; + dataType:获取内置的一些正则; + eq(n):获取Validform对象的第n个元素; + ajaxPost(flag,sync,url):以ajax方式提交表单。flag为true时,跳过验证直接提交,sync为true时将以同步的方式进行ajax提交,传入了url地址时,表单会提交到这个地址; + abort():终止ajax的提交; + submitForm(flag,url):以参数里设置的方式提交表单,flag为true时,跳过验证直接提交,传入了url地址时,表单会提交到这个地址; + resetForm():重置表单; + resetStatus():重置表单的提交状态。传入了postonce参数的话,表单成功提交后状态会设置为"posted",重置提交状态可以让表单继续可以提交; + getStatus():获取表单的提交状态,normal:未提交,posting:正在提交,posted:已成功提交过; + setStatus(status):设置表单的提交状态,可以设置normal,posting,posted三种状态,不传参则设置状态为posting,这个状态表单可以验证,但不能提交; + ignore(selector):忽略对所选择对象的验证; + unignore(selector):将ignore方法所忽略验证的对象重新获取验证效果; + addRule(rule):可以通过Validform对象的这个方法来给表单元素绑定验证规则; + check(bool,selector):对指定对象进行验证(默认验证当前整个表单),通过返回true,否则返回false(绑定实时验证的对象,格式符合要求时返回true,而不会等ajax的返回结果),bool为true时则只验证不显示提示信息; + config(setup):可以通过这个方法来修改初始化参数,指定表单的提交地址,给表单ajax和实时验证的ajax里设置参数; +*/ + +(function($,win,undef){ + var errorobj=null,//指示当前验证失败的表单元素; + msgobj=null,//pop box object + msghidden=true;//msgbox hidden? + + var tipmsg={//默认提示文字; + tit:"提示信息", + w:{ + "*":"不能为空!", + "*6-16":"请填写6到16位任意字符!", + "n":"请填写数字!", + "n6-16":"请填写6到16位数字!", + "s":"不能输入特殊字符!", + "s6-18":"请填写6到18位字符!", + "p":"请填写邮政编码!", + "m":"请填写手机号码!", + "e":"邮箱地址格式不对!", + "url":"请填写网址!" + }, + def:"请填写正确信息!", + undef:"datatype未定义!", + reck:"两次输入的内容不一致!", + r:"通过信息验证!", + c:"正在检测信息…", + s:"请{填写|选择}{0|信息}!", + v:"所填信息没有经过验证,请稍后…", + p:"正在提交数据…" + } + $.Tipmsg=tipmsg; + + var Validform=function(forms,settings,inited){ + var settings=$.extend({},Validform.defaults,settings); + settings.datatype && $.extend(Validform.util.dataType,settings.datatype); + + var brothers=this; + brothers.tipmsg={w:{}}; + brothers.forms=forms; + brothers.objects=[]; + + //创建子对象时不再绑定事件; + if(inited===true){ + return false; + } + + forms.each(function(){ + //已经绑定事件时跳过,避免事件重复绑定; + if(this.validform_inited=="inited"){return true;} + this.validform_inited="inited"; + + var curform=this; + curform.settings=$.extend({},settings); + + var $this=$(curform); + + //防止表单按钮双击提交两次; + curform.validform_status="normal"; //normal | posting | posted; + + //让每个Validform对象都能自定义tipmsg; + $this.data("tipmsg",brothers.tipmsg); + + //bind the blur event; + $this.delegate("[datatype]","blur",function(){ + //判断是否是在提交表单操作时触发的验证请求; + var subpost=arguments[1]; + Validform.util.check.call(this,$this,subpost); + }); + + $this.delegate(":text","keypress",function(event){ + if(event.keyCode==13 && $this.find(":submit").length==0){ + $this.submit(); + } + }); + + //点击表单元素,默认文字消失效果; + //表单元素值比较时的信息提示增强; + //radio、checkbox提示信息增强; + //外调插件初始化; + Validform.util.enhance.call($this,curform.settings.tiptype,curform.settings.usePlugin,curform.settings.tipSweep); + + curform.settings.btnSubmit && $this.find(curform.settings.btnSubmit).bind("click",function(){ + $this.trigger("submit"); + return false; + }); + + $this.submit(function(){ + var subflag=Validform.util.submitForm.call($this,curform.settings); + subflag === undef && (subflag=true); + return subflag; + }); + + $this.find("[type='reset']").add($this.find(curform.settings.btnReset)).bind("click",function(){ + Validform.util.resetForm.call($this); + }); + + }); + + //预创建pop box; + if( settings.tiptype==1 || (settings.tiptype==2 || settings.tiptype==3) && settings.ajaxPost ){ + creatMsgbox(); + } + } + + Validform.defaults={ + tiptype:1, + tipSweep:false, + showAllError:false, + postonce:false, + ajaxPost:false + } + + Validform.util={ + dataType:{ + "*":/[\w\W]+/, + "*6-16":/^[\w\W]{6,16}$/, + "n":/^\d+$/, + "n6-16":/^\d{6,16}$/, + "s":/^[\u4E00-\u9FA5\uf900-\ufa2d\w\.\s]+$/, + "s6-18":/^[\u4E00-\u9FA5\uf900-\ufa2d\w\.\s]{6,18}$/, + "p":/^[0-9]{6}$/, + "m":/^13[0-9]{9}$|14[0-9]{9}|15[0-9]{9}$|18[0-9]{9}$/, + "e":/^\w+([-+.']\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/, + "url":/^(\w+:\/\/)?\w+(\.\w+)+.*$/ + }, + + toString:Object.prototype.toString, + + isEmpty:function(val){ + return val==="" || val===$.trim(this.attr("tip")); + }, + + getValue:function(obj){ + var inputval, + curform=this; + + if(obj.is(":radio")){ + inputval=curform.find(":radio[name='"+obj.attr("name")+"']:checked").val(); + inputval= inputval===undef ? "" : inputval; + }else if(obj.is(":checkbox")){ + inputval=""; + curform.find(":checkbox[name='"+obj.attr("name")+"']:checked").each(function(){ + inputval +=$(this).val()+','; + }) + inputval= inputval===undef ? "" : inputval; + }else{ + inputval=obj.val(); + } + inputval=$.trim(inputval); + + return Validform.util.isEmpty.call(obj,inputval) ? "" : inputval; + }, + + enhance:function(tiptype,usePlugin,tipSweep,addRule){ + var curform=this; + + //页面上不存在提示信息的标签时,自动创建; + curform.find("[datatype]").each(function(){ + if(tiptype==2){ + if($(this).parent().next().find(".Validform_checktip").length==0){ + $(this).parent().next().append(""); + $(this).siblings(".Validform_checktip").remove(); + } + }else if(tiptype==3 || tiptype==4){ + if($(this).siblings(".Validform_checktip").length==0){ + $(this).parent().append(""); + $(this).parent().next().find(".Validform_checktip").remove(); + } + } + }) + + //表单元素值比较时的信息提示增强; + curform.find("input[recheck]").each(function(){ + //已经绑定事件时跳过; + if(this.validform_inited=="inited"){return true;} + this.validform_inited="inited"; + + var _this=$(this); + var recheckinput=curform.find("input[name='"+$(this).attr("recheck")+"']"); + recheckinput.bind("keyup",function(){ + if(recheckinput.val()==_this.val() && recheckinput.val() != ""){ + if(recheckinput.attr("tip")){ + if(recheckinput.attr("tip") == recheckinput.val()){return false;} + } + _this.trigger("blur"); + } + }).bind("blur",function(){ + if(recheckinput.val()!=_this.val() && _this.val()!=""){ + if(_this.attr("tip")){ + if(_this.attr("tip") == _this.val()){return false;} + } + _this.trigger("blur"); + } + }); + }); + + //hasDefaultText; + curform.find("[tip]").each(function(){//tip是表单元素的默认提示信息,这是点击清空效果; + //已经绑定事件时跳过; + if(this.validform_inited=="inited"){return true;} + this.validform_inited="inited"; + + var defaultvalue=$(this).attr("tip"); + var altercss=$(this).attr("altercss"); + $(this).focus(function(){ + if($(this).val()==defaultvalue){ + $(this).val(''); + if(altercss){$(this).removeClass(altercss);} + } + }).blur(function(){ + if($.trim($(this).val())===''){ + $(this).val(defaultvalue); + if(altercss){$(this).addClass(altercss);} + } + }); + }); + + //enhance info feedback for checkbox & radio; + curform.find(":checkbox[datatype],:radio[datatype]").each(function(){ + //已经绑定事件时跳过; + if(this.validform_inited=="inited"){return true;} + this.validform_inited="inited"; + + var _this=$(this); + var name=_this.attr("name"); + curform.find("[name='"+name+"']").filter(":checkbox,:radio").bind("click",function(){ + //避免多个事件绑定时的取值滞后问题; + setTimeout(function(){ + _this.trigger("blur"); + },0); + }); + + }); + + //select multiple; + curform.find("select[datatype][multiple]").bind("click",function(){ + var _this=$(this); + setTimeout(function(){ + _this.trigger("blur"); + },0); + }); + + //plugins here to start; + Validform.util.usePlugin.call(curform,usePlugin,tiptype,tipSweep,addRule); + }, + + usePlugin:function(plugin,tiptype,tipSweep,addRule){ + /* + plugin:settings.usePlugin; + tiptype:settings.tiptype; + tipSweep:settings.tipSweep; + addRule:是否在addRule时触发; + */ + + var curform=this, + plugin=plugin || {}; + //swfupload; + if(curform.find("input[plugin='swfupload']").length && typeof(swfuploadhandler) != "undefined"){ + + var custom={ + custom_settings:{ + form:curform, + showmsg:function(msg,type,obj){ + Validform.util.showmsg.call(curform,msg,tiptype,{obj:curform.find("input[plugin='swfupload']"),type:type,sweep:tipSweep}); + } + } + }; + + custom=$.extend(true,{},plugin.swfupload,custom); + + curform.find("input[plugin='swfupload']").each(function(n){ + if(this.validform_inited=="inited"){return true;} + this.validform_inited="inited"; + + $(this).val(""); + swfuploadhandler.init(custom,n); + }); + + } + + //datepicker; + if(curform.find("input[plugin='datepicker']").length && $.fn.datePicker){ + plugin.datepicker=plugin.datepicker || {}; + + if(plugin.datepicker.format){ + Date.format=plugin.datepicker.format; + delete plugin.datepicker.format; + } + if(plugin.datepicker.firstDayOfWeek){ + Date.firstDayOfWeek=plugin.datepicker.firstDayOfWeek; + delete plugin.datepicker.firstDayOfWeek; + } + + curform.find("input[plugin='datepicker']").each(function(n){ + if(this.validform_inited=="inited"){return true;} + this.validform_inited="inited"; + + plugin.datepicker.callback && $(this).bind("dateSelected",function(){ + var d=new Date( $.event._dpCache[this._dpId].getSelected()[0] ).asString(Date.format); + plugin.datepicker.callback(d,this); + }); + $(this).datePicker(plugin.datepicker); + }); + } + + //passwordstrength; + if(curform.find("input[plugin*='passwordStrength']").length && $.fn.passwordStrength){ + plugin.passwordstrength=plugin.passwordstrength || {}; + plugin.passwordstrength.showmsg=function(obj,msg,type){ + Validform.util.showmsg.call(curform,msg,tiptype,{obj:obj,type:type,sweep:tipSweep}); + }; + + curform.find("input[plugin='passwordStrength']").each(function(n){ + if(this.validform_inited=="inited"){return true;} + this.validform_inited="inited"; + + $(this).passwordStrength(plugin.passwordstrength); + }); + } + + //jqtransform; + if(addRule!="addRule" && plugin.jqtransform && $.fn.jqTransSelect){ + if(curform[0].jqTransSelected=="true"){return;}; + curform[0].jqTransSelected="true"; + + var jqTransformHideSelect = function(oTarget){ + var ulVisible = $('.jqTransformSelectWrapper ul:visible'); + ulVisible.each(function(){ + var oSelect = $(this).parents(".jqTransformSelectWrapper:first").find("select").get(0); + //do not hide if click on the label object associated to the select + if( !(oTarget && oSelect.oLabel && oSelect.oLabel.get(0) == oTarget.get(0)) ){$(this).hide();} + }); + }; + + /* Check for an external click */ + var jqTransformCheckExternalClick = function(event) { + if ($(event.target).parents('.jqTransformSelectWrapper').length === 0) { jqTransformHideSelect($(event.target)); } + }; + + var jqTransformAddDocumentListener = function (){ + $(document).mousedown(jqTransformCheckExternalClick); + }; + + if(plugin.jqtransform.selector){ + curform.find(plugin.jqtransform.selector).filter('input:submit, input:reset, input[type="button"]').jqTransInputButton(); + curform.find(plugin.jqtransform.selector).filter('input:text, input:password').jqTransInputText(); + curform.find(plugin.jqtransform.selector).filter('input:checkbox').jqTransCheckBox(); + curform.find(plugin.jqtransform.selector).filter('input:radio').jqTransRadio(); + curform.find(plugin.jqtransform.selector).filter('textarea').jqTransTextarea(); + if(curform.find(plugin.jqtransform.selector).filter("select").length > 0 ){ + curform.find(plugin.jqtransform.selector).filter("select").jqTransSelect(); + jqTransformAddDocumentListener(); + } + + }else{ + curform.jqTransform(); + } + + curform.find(".jqTransformSelectWrapper").find("li a").click(function(){ + $(this).parents(".jqTransformSelectWrapper").find("select").trigger("blur"); + }); + } + + }, + + getNullmsg:function(curform){ + var obj=this; + var reg=/[\u4E00-\u9FA5\uf900-\ufa2da-zA-Z\s]+/g; + var nullmsg; + + var label=curform[0].settings.label || ".Validform_label"; + label=obj.siblings(label).eq(0).text() || obj.siblings().find(label).eq(0).text() || obj.parent().siblings(label).eq(0).text() || obj.parent().siblings().find(label).eq(0).text(); + label=label.replace(/\s(?![a-zA-Z])/g,"").match(reg); + label=label? label.join("") : [""]; + + reg=/\{(.+)\|(.+)\}/; + nullmsg=curform.data("tipmsg").s || tipmsg.s; + + if(label != ""){ + nullmsg=nullmsg.replace(/\{0\|(.+)\}/,label); + if(obj.attr("recheck")){ + nullmsg=nullmsg.replace(/\{(.+)\}/,""); + obj.attr("nullmsg",nullmsg); + return nullmsg; + } + }else{ + nullmsg=obj.is(":checkbox,:radio,select") ? nullmsg.replace(/\{0\|(.+)\}/,"") : nullmsg.replace(/\{0\|(.+)\}/,"$1"); + } + nullmsg=obj.is(":checkbox,:radio,select") ? nullmsg.replace(reg,"$2") : nullmsg.replace(reg,"$1"); + + obj.attr("nullmsg",nullmsg); + return nullmsg; + }, + + getErrormsg:function(curform,datatype,recheck){ + var regxp=/^(.+?)((\d+)-(\d+))?$/, + regxp2=/^(.+?)(\d+)-(\d+)$/, + regxp3=/(.*?)\d+(.+?)\d+(.*)/, + mac=datatype.match(regxp), + temp,str; + + //如果是值不一样而报错; + if(recheck=="recheck"){ + str=curform.data("tipmsg").reck || tipmsg.reck; + return str; + } + + var tipmsg_w_ex=$.extend({},tipmsg.w,curform.data("tipmsg").w); + + //如果原来就有,直接显示该项的提示信息; + if(mac[0] in tipmsg_w_ex){ + return curform.data("tipmsg").w[mac[0]] || tipmsg.w[mac[0]]; + } + + //没有的话在提示对象里查找相似; + for(var name in tipmsg_w_ex){ + if(name.indexOf(mac[1])!=-1 && regxp2.test(name)){ + str=(curform.data("tipmsg").w[name] || tipmsg.w[name]).replace(regxp3,"$1"+mac[3]+"$2"+mac[4]+"$3"); + curform.data("tipmsg").w[mac[0]]=str; + + return str; + } + + } + + return curform.data("tipmsg").def || tipmsg.def; + }, + + _regcheck:function(datatype,gets,obj,curform){ + var curform=curform, + info=null, + passed=false, + reg=/\/.+\//g, + regex=/^(.+?)(\d+)-(\d+)$/, + type=3;//default set to wrong type, 2,3,4; + + //datatype有三种情况:正则,函数和直接绑定的正则; + + //直接是正则; + if(reg.test(datatype)){ + var regstr=datatype.match(reg)[0].slice(1,-1); + var param=datatype.replace(reg,""); + var rexp=RegExp(regstr,param); + + passed=rexp.test(gets); + + //function; + }else if(Validform.util.toString.call(Validform.util.dataType[datatype])=="[object Function]"){ + passed=Validform.util.dataType[datatype](gets,obj,curform,Validform.util.dataType); + if(passed === true || passed===undef){ + passed = true; + }else{ + info= passed; + passed=false; + } + + //自定义正则; + }else{ + //自动扩展datatype; + if(!(datatype in Validform.util.dataType)){ + var mac=datatype.match(regex), + temp; + + if(!mac){ + passed=false; + info=curform.data("tipmsg").undef||tipmsg.undef; + }else{ + for(var name in Validform.util.dataType){ + temp=name.match(regex); + if(!temp){continue;} + if(mac[1]===temp[1]){ + var str=Validform.util.dataType[name].toString(), + param=str.match(/\/[mgi]*/g)[1].replace("\/",""), + regxp=new RegExp("\\{"+temp[2]+","+temp[3]+"\\}","g"); + str=str.replace(/\/[mgi]*/g,"\/").replace(regxp,"{"+mac[2]+","+mac[3]+"}").replace(/^\//,"").replace(/\/$/,""); + Validform.util.dataType[datatype]=new RegExp(str,param); + break; + } + } + } + } + + if(Validform.util.toString.call(Validform.util.dataType[datatype])=="[object RegExp]"){ + passed=Validform.util.dataType[datatype].test(gets); + } + + } + + + if(passed){ + type=2; + info=obj.attr("sucmsg") || curform.data("tipmsg").r||tipmsg.r; + + //规则验证通过后,还需要对绑定recheck的对象进行值比较; + if(obj.attr("recheck")){ + var theother=curform.find("input[name='"+obj.attr("recheck")+"']:first"); + if(gets!=theother.val()){ + passed=false; + type=3; + info=obj.attr("errormsg") || Validform.util.getErrormsg.call(obj,curform,datatype,"recheck"); + } + } + }else{ + info=info || obj.attr("errormsg") || Validform.util.getErrormsg.call(obj,curform,datatype); + + //验证不通过且为空时; + if(Validform.util.isEmpty.call(obj,gets)){ + info=obj.attr("nullmsg") || Validform.util.getNullmsg.call(obj,curform); + } + } + + return{ + passed:passed, + type:type, + info:info + }; + + }, + + regcheck:function(datatype,gets,obj){ + /* + datatype:datatype; + gets:inputvalue; + obj:input object; + */ + var curform=this, + info=null, + passed=false, + type=3;//default set to wrong type, 2,3,4; + + //ignore; + if(obj.attr("ignore")==="ignore" && Validform.util.isEmpty.call(obj,gets)){ + if(obj.data("cked")){ + info=""; + } + + return { + passed:true, + type:4, + info:info + }; + } + + obj.data("cked","cked");//do nothing if is the first time validation triggered; + + var dtype=Validform.util.parseDatatype(datatype); + var res; + for(var eithor=0; eithor[["/regexp/"],["phone"],["tel","s","e"],["f","e"]]; + */ + + var reg=/\/.+?\/[mgi]*(?=(,|$|\||\s))|[\w\*-]+/g, + dtype=datatype.match(reg), + sepor=datatype.replace(reg,"").replace(/\s*/g,"").split(""), + arr=[], + m=0; + + arr[0]=[]; + arr[0].push(dtype[0]); + for(var n=0;n正在检测 | 2=>通过, sweep:true | false}, + triggered:在blur或提交表单触发的验证中,有些情况不需要显示提示文字,如自定义弹出提示框的显示方式,不需要每次blur时就马上弹出提示; + + tiptype:1\2\3时都有坑能会弹出自定义提示框 + tiptype:1时在triggered bycheck时不弹框 + tiptype:2\3时在ajax时弹框 + tipSweep为true时在triggered bycheck时不触发showmsg,但ajax出错的情况下要提示 + */ + + //如果msg为undefined,那么就没必要执行后面的操作,ignore有可能会出现这情况; + if(msg==undef){return;} + + //tipSweep为true,且当前不是处于错误状态时,blur事件不触发信息显示; + if(/*triggered=="bycheck" && */o.sweep && (o.obj && !o.obj.is(".Validform_error") || typeof type == "function")){return;} + + $.extend(o,{curform:this}); + + if(typeof type == "function"){ + type(msg,o,Validform.util.cssctl); + return; + } + + if(type==1 || triggered=="byajax" && type!=4){ + msgobj.find(".Validform_info").html(msg); + } + + //tiptypt=1时,blur触发showmsg,验证是否通过都不弹框,提交表单触发的话,只要验证出错,就弹框; + if(type==1 && triggered!="bycheck" && o.type!=2 || triggered=="byajax" && type!=4){ + msghidden=false; + msgobj.find(".iframe").css("height",msgobj.outerHeight()); + msgobj.show(); + setCenter(msgobj,100); + } + + if(type==2 && o.obj){ + o.obj.parent().next().find(".Validform_checktip").html(msg); + Validform.util.cssctl(o.obj.parent().next().find(".Validform_checktip"),o.type); + } + + if((type==3 || type==4) && o.obj){ + o.obj.siblings(".Validform_checktip").html(msg); + Validform.util.cssctl(o.obj.siblings(".Validform_checktip"),o.type); + } + + }, + + cssctl:function(obj,status){ + switch(status){ + case 1: + obj.removeClass("Validform_right Validform_wrong").addClass("Validform_checktip Validform_loading");//checking; + break; + case 2: + obj.removeClass("Validform_wrong Validform_loading").addClass("Validform_checktip Validform_right");//passed; + break; + case 4: + obj.removeClass("Validform_right Validform_wrong Validform_loading").addClass("Validform_checktip");//for ignore; + break; + default: + obj.removeClass("Validform_right Validform_loading").addClass("Validform_checktip Validform_wrong");//wrong; + } + }, + + check:function(curform,subpost,bool){ + /* + 检测单个表单元素; + 验证通过返回true,否则返回false、实时验证返回值为ajax; + bool,传入true则只检测不显示提示信息; + */ + var settings=curform[0].settings; + var subpost=subpost || ""; + var inputval=Validform.util.getValue.call(curform,$(this)); + + //隐藏或绑定dataIgnore的表单对象不做验证; + if(settings.ignoreHidden && $(this).is(":hidden") || $(this).data("dataIgnore")==="dataIgnore"){ + return true; + } + + //dragonfly=true时,没有绑定ignore,值为空不做验证,但验证不通过; + if(settings.dragonfly && !$(this).data("cked") && Validform.util.isEmpty.call($(this),inputval) && $(this).attr("ignore")!="ignore"){ + return false; + } + + var flag=Validform.util.regcheck.call(curform,$(this).attr("datatype"),inputval,$(this)); + + //值没变化不做检测,这时要考虑recheck情况; + //不是在提交表单时触发的ajax验证; + if(inputval==this.validform_lastval && !$(this).attr("recheck") && subpost==""){ + return flag.passed ? true : false; + } + + this.validform_lastval=inputval;//存储当前值; + + var _this; + errorobj=_this=$(this); + + if(!flag.passed){ + //取消正在进行的ajax验证; + Validform.util.abort.call(_this[0]); + + if(!bool){ + //传入"bycheck",指示当前是check方法里调用的,当tiptype=1时,blur事件不让触发错误信息显示; + Validform.util.showmsg.call(curform,flag.info,settings.tiptype,{obj:$(this),type:flag.type,sweep:settings.tipSweep},"bycheck"); + + !settings.tipSweep && _this.addClass("Validform_error"); + } + return false; + } + + //验证通过的话,如果绑定有ajaxurl,要执行ajax检测; + //当ignore="ignore"时,为空值可以通过验证,这时不需要ajax检测; + var ajaxurl=$(this).attr("ajaxurl"); + if(ajaxurl && !Validform.util.isEmpty.call($(this),inputval) && !bool){ + var inputobj=$(this); + + //当提交表单时,表单中的某项已经在执行ajax检测,这时需要让该项ajax结束后继续提交表单; + if(subpost=="postform"){ + inputobj[0].validform_subpost="postform"; + }else{ + inputobj[0].validform_subpost=""; + } + + if(inputobj[0].validform_valid==="posting" && inputval==inputobj[0].validform_ckvalue){return "ajax";} + + inputobj[0].validform_valid="posting"; + inputobj[0].validform_ckvalue=inputval; + Validform.util.showmsg.call(curform,curform.data("tipmsg").c||tipmsg.c,settings.tiptype,{obj:inputobj,type:1,sweep:settings.tipSweep},"bycheck"); + + Validform.util.abort.call(_this[0]); + + var ajaxsetup=$.extend(true,{},settings.ajaxurl || {}); + + var localconfig={ + type: "POST", + cache:false, + url: ajaxurl, + data: "param="+encodeURIComponent(inputval)+"&name="+encodeURIComponent($(this).attr("name")), + success: function(data){ + if($.trim(data.status)==="y"){ + inputobj[0].validform_valid="true"; + data.info && inputobj.attr("sucmsg",data.info); + Validform.util.showmsg.call(curform,inputobj.attr("sucmsg") || curform.data("tipmsg").r||tipmsg.r,settings.tiptype,{obj:inputobj,type:2,sweep:settings.tipSweep},"bycheck"); + _this.removeClass("Validform_error"); + errorobj=null; + if(inputobj[0].validform_subpost=="postform"){ + curform.trigger("submit"); + } + }else{ + inputobj[0].validform_valid=data.info; + Validform.util.showmsg.call(curform,data.info,settings.tiptype,{obj:inputobj,type:3,sweep:settings.tipSweep}); + _this.addClass("Validform_error"); + } + _this[0].validform_ajax=null; + }, + error: function(data){ + if(data.status=="200"){ + if(data.responseText=="y"){ + ajaxsetup.success({"status":"y"}); + }else{ + ajaxsetup.success({"status":"n","info":data.responseText}); + } + return false; + } + + //正在检测时,要检测的数据发生改变,这时要终止当前的ajax。不是这种情况引起的ajax错误,那么显示相关错误信息; + if(data.statusText!=="abort"){ + var msg="status: "+data.status+"; statusText: "+data.statusText; + + Validform.util.showmsg.call(curform,msg,settings.tiptype,{obj:inputobj,type:3,sweep:settings.tipSweep}); + _this.addClass("Validform_error"); + } + + inputobj[0].validform_valid=data.statusText; + _this[0].validform_ajax=null; + + //localconfig.error返回true表示还需要执行temp_err; + return true; + } + } + + if(ajaxsetup.success){ + var temp_suc=ajaxsetup.success; + ajaxsetup.success=function(data){ + localconfig.success(data); + temp_suc(data,inputobj); + } + } + + if(ajaxsetup.error){ + var temp_err=ajaxsetup.error; + ajaxsetup.error=function(data){ + //localconfig.error返回false表示不需要执行temp_err; + localconfig.error(data) && temp_err(data,inputobj); + } + } + + ajaxsetup=$.extend({},localconfig,ajaxsetup,{dataType:"json"}); + _this[0].validform_ajax=$.ajax(ajaxsetup); + + return "ajax"; + }else if(ajaxurl && Validform.util.isEmpty.call($(this),inputval)){ + Validform.util.abort.call(_this[0]); + _this[0].validform_valid="true"; + } + + if(!bool){ + Validform.util.showmsg.call(curform,flag.info,settings.tiptype,{obj:$(this),type:flag.type,sweep:settings.tipSweep},"bycheck"); + _this.removeClass("Validform_error"); + } + errorobj=null; + + return true; + + }, + + submitForm:function(settings,flg,url,ajaxPost,sync){ + /* + flg===true时跳过验证直接提交; + ajaxPost==="ajaxPost"指示当前表单以ajax方式提交; + */ + var curform=this; + + //表单正在提交时点击提交按钮不做反应; + if(curform[0].validform_status==="posting"){return false;} + + //要求只能提交一次时; + if(settings.postonce && curform[0].validform_status==="posted"){return false;} + + var beforeCheck=settings.beforeCheck && settings.beforeCheck(curform); + if(beforeCheck===false){return false;} + + var flag=true, + inflag; + + curform.find("[datatype]").each(function(){ + //跳过验证; + if(flg){ + return false; + } + + //隐藏或绑定dataIgnore的表单对象不做验证; + if(settings.ignoreHidden && $(this).is(":hidden") || $(this).data("dataIgnore")==="dataIgnore"){ + return true; + } + + var inputval=Validform.util.getValue.call(curform,$(this)), + _this; + errorobj=_this=$(this); + + inflag=Validform.util.regcheck.call(curform,$(this).attr("datatype"),inputval,$(this)); + + if(!inflag.passed){ + Validform.util.showmsg.call(curform,inflag.info,settings.tiptype,{obj:$(this),type:inflag.type,sweep:settings.tipSweep}); + _this.addClass("Validform_error"); + + if(!settings.showAllError){ + _this.focus(); + flag=false; + return false; + } + + flag && (flag=false); + return true; + } + + //当ignore="ignore"时,为空值可以通过验证,这时不需要ajax检测; + if($(this).attr("ajaxurl") && !Validform.util.isEmpty.call($(this),inputval)){ + if(this.validform_valid!=="true"){ + var thisobj=$(this); + Validform.util.showmsg.call(curform,curform.data("tipmsg").v||tipmsg.v,settings.tiptype,{obj:thisobj,type:3,sweep:settings.tipSweep}); + _this.addClass("Validform_error"); + + thisobj.trigger("blur",["postform"]);//continue the form post; + + if(!settings.showAllError){ + flag=false; + return false; + } + + flag && (flag=false); + return true; + } + }else if($(this).attr("ajaxurl") && Validform.util.isEmpty.call($(this),inputval)){ + Validform.util.abort.call(this); + this.validform_valid="true"; + } + + Validform.util.showmsg.call(curform,inflag.info,settings.tiptype,{obj:$(this),type:inflag.type,sweep:settings.tipSweep}); + _this.removeClass("Validform_error"); + errorobj=null; + }); + + if(settings.showAllError){ + curform.find(".Validform_error:first").focus(); + } + + if(flag){ + var beforeSubmit=settings.beforeSubmit && settings.beforeSubmit(curform); + if(beforeSubmit===false){return false;} + + curform[0].validform_status="posting"; + + if(settings.ajaxPost || ajaxPost==="ajaxPost"){ + //获取配置参数; + var ajaxsetup=$.extend(true,{},settings.ajaxpost || {}); + //有可能需要动态的改变提交地址,所以把action所指定的url层级设为最低; + ajaxsetup.url=url || ajaxsetup.url || settings.url || curform.attr("action"); + + //byajax:ajax时,tiptye为1、2或3需要弹出提示框; + Validform.util.showmsg.call(curform,curform.data("tipmsg").p||tipmsg.p,settings.tiptype,{obj:curform,type:1,sweep:settings.tipSweep},"byajax"); + + //方法里的优先级要高; + //有undefined情况; + if(sync){ + ajaxsetup.async=false; + }else if(sync===false){ + ajaxsetup.async=true; + } + + if(ajaxsetup.success){ + var temp_suc=ajaxsetup.success; + ajaxsetup.success=function(data){ + settings.callback && settings.callback(data); + curform[0].validform_ajax=null; + if($.trim(data.status)==="y"){ + curform[0].validform_status="posted"; + }else{ + curform[0].validform_status="normal"; + } + + temp_suc(data,curform); + } + } + + if(ajaxsetup.error){ + var temp_err=ajaxsetup.error; + ajaxsetup.error=function(data){ + settings.callback && settings.callback(data); + curform[0].validform_status="normal"; + curform[0].validform_ajax=null; + + temp_err(data,curform); + } + } + + var localconfig={ + type: "POST", + async:true, + data: curform.serializeArray(), + success: function(data){ + if($.trim(data.status)==="y"){ + //成功提交; + curform[0].validform_status="posted"; + Validform.util.showmsg.call(curform,data.info,settings.tiptype,{obj:curform,type:2,sweep:settings.tipSweep},"byajax"); + }else{ + //提交出错; + curform[0].validform_status="normal"; + Validform.util.showmsg.call(curform,data.info,settings.tiptype,{obj:curform,type:3,sweep:settings.tipSweep},"byajax"); + } + + settings.callback && settings.callback(data); + curform[0].validform_ajax=null; + }, + error: function(data){ + var msg="status: "+data.status+"; statusText: "+data.statusText; + + Validform.util.showmsg.call(curform,msg,settings.tiptype,{obj:curform,type:3,sweep:settings.tipSweep},"byajax"); + + settings.callback && settings.callback(data); + curform[0].validform_status="normal"; + curform[0].validform_ajax=null; + } + } + + ajaxsetup=$.extend({},localconfig,ajaxsetup,{dataType:"json"}); + + curform[0].validform_ajax=$.ajax(ajaxsetup); + + }else{ + if(!settings.postonce){ + curform[0].validform_status="normal"; + } + + var url=url || settings.url; + if(url){ + curform.attr("action",url); + } + + return settings.callback && settings.callback(curform); + } + } + + return false; + + }, + + resetForm:function(){ + var brothers=this; + brothers.each(function(){ + this.reset && this.reset(); + this.validform_status="normal"; + }); + + brothers.find(".Validform_right").text(""); + brothers.find(".passwordStrength").children().removeClass("bgStrength"); + brothers.find(".Validform_checktip").removeClass("Validform_wrong Validform_right Validform_loading"); + brothers.find(".Validform_error").removeClass("Validform_error"); + brothers.find("[datatype]").removeData("cked").removeData("dataIgnore").each(function(){ + this.validform_lastval=null; + }); + brothers.eq(0).find("input:first").focus(); + }, + + abort:function(){ + if(this.validform_ajax){ + this.validform_ajax.abort(); + } + } + + } + + $.Datatype=Validform.util.dataType; + + Validform.prototype={ + dataType:Validform.util.dataType, + + eq:function(n){ + var obj=this; + + if(n>=obj.forms.length){ + return null; + } + + if(!(n in obj.objects)){ + obj.objects[n]=new Validform($(obj.forms[n]).get(),{},true); + } + + return obj.objects[n]; + + }, + + resetStatus:function(){ + var obj=this; + $(obj.forms).each(function(){ + this.validform_status="normal"; + }); + + return this; + }, + + setStatus:function(status){ + var obj=this; + $(obj.forms).each(function(){ + this.validform_status=status || "posting"; + }); + + return this; + }, + + getStatus:function(){ + var obj=this; + var status=$(obj.forms)[0].validform_status; + + return status; + }, + + ignore:function(selector){ + var obj=this; + var selector=selector || "[datatype]" + + $(obj.forms).find(selector).each(function(){ + $(this).data("dataIgnore","dataIgnore").removeClass("Validform_error"); + }); + + return this; + }, + + unignore:function(selector){ + var obj=this; + var selector=selector || "[datatype]" + + $(obj.forms).find(selector).each(function(){ + $(this).removeData("dataIgnore"); + }); + + return this; + }, + + addRule:function(rule){ + /* + rule => [{ + ele:"#id", + datatype:"*", + errormsg:"出错提示文字!", + nullmsg:"为空时的提示文字!", + tip:"默认显示的提示文字", + altercss:"gray", + ignore:"ignore", + ajaxurl:"valid.php", + recheck:"password", + plugin:"passwordStrength" + },{},{},...] + */ + var obj=this; + var rule=rule || []; + + for(var index=0; index0?top:0); + + obj.css({ + left:left + }).animate({ + top : top + },{ duration:time , queue:false }); + } + + function creatMsgbox(){ + if($("#Validform_msg").length!==0){return false;} + msgobj=$('
    '+tipmsg.tit+'χ
    ').appendTo("body");//提示信息框; + msgobj.find("a.Validform_close").click(function(){ + msgobj.hide(); + msghidden=true; + if(errorobj){ + errorobj.focus().addClass("Validform_error"); + } + return false; + }).focus(function(){this.blur();}); + + $(window).bind("scroll resize",function(){ + !msghidden && setCenter(msgobj,400); + }); + }; + + //公用方法显示&关闭信息提示框; + $.Showmsg=function(msg){ + creatMsgbox(); + Validform.util.showmsg.call(win,msg,1,{}); + }; + + $.Hidemsg=function(){ + msgobj.hide(); + msghidden=true; + }; + +})(jQuery,window); \ No newline at end of file diff --git a/app-manage/src/main/resources/public/static/js/bootstrap.min.js b/app-manage/src/main/resources/public/static/js/bootstrap.min.js new file mode 100644 index 0000000..e364a13 --- /dev/null +++ b/app-manage/src/main/resources/public/static/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.3.6 (http://getbootstrap.com) + * Copyright 2011-2015 Twitter, Inc. + * Licensed under the MIT license + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>2)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3")}(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.6",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.6",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")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),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"),a(c.target).is('input[type="radio"]')||a(c.target).is('input[type="checkbox"]')||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=null,this.sliding=null,this.interval=null,this.$active=null,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.6",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|hide/.test(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('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][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.6",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},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":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(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 c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}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.6",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth
    ',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),c.isInStateTrue()?void 0:(clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide())},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;(e||!/destroy|hide/.test(b))&&(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.6",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.6",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.6",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return c>e?"top":!1;if("bottom"==this.affixed)return null!=c?e+this.unpin<=f.top?!1:"bottom":a-d>=e+g?!1:"bottom";var h=null==this.affixed,i=h?e:f.top,j=h?g:b;return null!=c&&c>=e?"top":null!=d&&i+j>=a-d?"bottom":!1},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); diff --git a/app-manage/src/main/resources/public/static/js/contabs.js b/app-manage/src/main/resources/public/static/js/contabs.js new file mode 100644 index 0000000..2f3112b --- /dev/null +++ b/app-manage/src/main/resources/public/static/js/contabs.js @@ -0,0 +1,310 @@ + +$(function () { + //计算元素集合的总宽度 + function calSumWidth(elements) { + var width = 0; + $(elements).each(function () { + width += $(this).outerWidth(true); + }); + return width; + } + //滚动到指定选项卡 + function scrollToTab(element) { + var marginLeftVal = calSumWidth($(element).prevAll()), marginRightVal = calSumWidth($(element).nextAll()); + // 可视区域非tab宽度 + var tabOuterWidth = calSumWidth($(".content-tabs").children().not(".J_menuTabs")); + //可视区域tab宽度 + var visibleWidth = $(".content-tabs").outerWidth(true) - tabOuterWidth; + //实际滚动宽度 + var scrollVal = 0; + if ($(".page-tabs-content").outerWidth() < visibleWidth) { + scrollVal = 0; + } else if (marginRightVal <= (visibleWidth - $(element).outerWidth(true) - $(element).next().outerWidth(true))) { + if ((visibleWidth - $(element).next().outerWidth(true)) > marginRightVal) { + scrollVal = marginLeftVal; + var tabElement = element; + while ((scrollVal - $(tabElement).outerWidth()) > ($(".page-tabs-content").outerWidth() - visibleWidth)) { + scrollVal -= $(tabElement).prev().outerWidth(); + tabElement = $(tabElement).prev(); + } + } + } else if (marginLeftVal > (visibleWidth - $(element).outerWidth(true) - $(element).prev().outerWidth(true))) { + scrollVal = marginLeftVal - $(element).prev().outerWidth(true); + } + $('.page-tabs-content').animate({ + marginLeft: 0 - scrollVal + 'px' + }, "fast"); + } + //查看左侧隐藏的选项卡 + function scrollTabLeft() { + var marginLeftVal = Math.abs(parseInt($('.page-tabs-content').css('margin-left'))); + // 可视区域非tab宽度 + var tabOuterWidth = calSumWidth($(".content-tabs").children().not(".J_menuTabs")); + //可视区域tab宽度 + var visibleWidth = $(".content-tabs").outerWidth(true) - tabOuterWidth; + //实际滚动宽度 + var scrollVal = 0; + if ($(".page-tabs-content").width() < visibleWidth) { + return false; + } else { + var tabElement = $(".J_menuTab:first"); + var offsetVal = 0; + while ((offsetVal + $(tabElement).outerWidth(true)) <= marginLeftVal) {//找到离当前tab最近的元素 + offsetVal += $(tabElement).outerWidth(true); + tabElement = $(tabElement).next(); + } + offsetVal = 0; + if (calSumWidth($(tabElement).prevAll()) > visibleWidth) { + while ((offsetVal + $(tabElement).outerWidth(true)) < (visibleWidth) && tabElement.length > 0) { + offsetVal += $(tabElement).outerWidth(true); + tabElement = $(tabElement).prev(); + } + scrollVal = calSumWidth($(tabElement).prevAll()); + } + } + $('.page-tabs-content').animate({ + marginLeft: 0 - scrollVal + 'px' + }, "fast"); + } + //查看右侧隐藏的选项卡 + function scrollTabRight() { + var marginLeftVal = Math.abs(parseInt($('.page-tabs-content').css('margin-left'))); + // 可视区域非tab宽度 + var tabOuterWidth = calSumWidth($(".content-tabs").children().not(".J_menuTabs")); + //可视区域tab宽度 + var visibleWidth = $(".content-tabs").outerWidth(true) - tabOuterWidth; + //实际滚动宽度 + var scrollVal = 0; + if ($(".page-tabs-content").width() < visibleWidth) { + return false; + } else { + var tabElement = $(".J_menuTab:first"); + var offsetVal = 0; + while ((offsetVal + $(tabElement).outerWidth(true)) <= marginLeftVal) {//找到离当前tab最近的元素 + offsetVal += $(tabElement).outerWidth(true); + tabElement = $(tabElement).next(); + } + offsetVal = 0; + while ((offsetVal + $(tabElement).outerWidth(true)) < (visibleWidth) && tabElement.length > 0) { + offsetVal += $(tabElement).outerWidth(true); + tabElement = $(tabElement).next(); + } + scrollVal = calSumWidth($(tabElement).prevAll()); + if (scrollVal > 0) { + $('.page-tabs-content').animate({ + marginLeft: 0 - scrollVal + 'px' + }, "fast"); + } + } + } + + //通过遍历给菜单项加上data-index属性 + $(".J_menuItem").each(function (index) { + if (!$(this).attr('data-index')) { + $(this).attr('data-index', index); + } + }); + + function menuItem() { + // 获取标识数据 + var dataUrl = $(this).attr('href'), + dataIndex = $(this).data('index'), + menuName = $.trim($(this).text()), + flag = true; + if (dataUrl == undefined || $.trim(dataUrl).length == 0)return false; + + // 选项卡菜单已存在 + $('.J_menuTab').each(function () { + if ($(this).data('id') == dataUrl) { + if (!$(this).hasClass('active')) { + $(this).addClass('active').siblings('.J_menuTab').removeClass('active'); + scrollToTab(this); + // 显示tab对应的内容区 + $('.J_mainContent .J_iframe').each(function () { + if ($(this).data('id') == dataUrl) { + $(this).show().siblings('.J_iframe').hide(); + return false; + } + }); + } + flag = false; + return false; + } + }); + + // 选项卡菜单不存在 + if (flag) { + var str = '' + menuName + ' '; + $('.J_menuTab').removeClass('active'); + + // 添加选项卡对应的iframe + var str1 = ''; + $('.J_mainContent').find('iframe.J_iframe').hide().parents('.J_mainContent').append(str1); + + //显示loading提示 +// var loading = layer.load(); +// +// $('.J_mainContent iframe:visible').load(function () { +// //iframe加载完成后隐藏loading提示 +// layer.close(loading); +// }); + // 添加选项卡 + $('.J_menuTabs .page-tabs-content').append(str); + scrollToTab($('.J_menuTab.active')); + } + return false; + } + + $('.J_menuItem').on('click', menuItem); + + // 关闭选项卡菜单 + function closeTab() { + var closeTabId = $(this).parents('.J_menuTab').data('id'); + var currentWidth = $(this).parents('.J_menuTab').width(); + + // 当前元素处于活动状态 + if ($(this).parents('.J_menuTab').hasClass('active')) { + + // 当前元素后面有同辈元素,使后面的一个元素处于活动状态 + if ($(this).parents('.J_menuTab').next('.J_menuTab').size()) { + + var activeId = $(this).parents('.J_menuTab').next('.J_menuTab:eq(0)').data('id'); + $(this).parents('.J_menuTab').next('.J_menuTab:eq(0)').addClass('active'); + + $('.J_mainContent .J_iframe').each(function () { + if ($(this).data('id') == activeId) { + $(this).show().siblings('.J_iframe').hide(); + return false; + } + }); + + var marginLeftVal = parseInt($('.page-tabs-content').css('margin-left')); + if (marginLeftVal < 0) { + $('.page-tabs-content').animate({ + marginLeft: (marginLeftVal + currentWidth) + 'px' + }, "fast"); + } + + // 移除当前选项卡 + $(this).parents('.J_menuTab').remove(); + + // 移除tab对应的内容区 + $('.J_mainContent .J_iframe').each(function () { + if ($(this).data('id') == closeTabId) { + $(this).remove(); + return false; + } + }); + } + + // 当前元素后面没有同辈元素,使当前元素的上一个元素处于活动状态 + if ($(this).parents('.J_menuTab').prev('.J_menuTab').size()) { + var activeId = $(this).parents('.J_menuTab').prev('.J_menuTab:last').data('id'); + $(this).parents('.J_menuTab').prev('.J_menuTab:last').addClass('active'); + $('.J_mainContent .J_iframe').each(function () { + if ($(this).data('id') == activeId) { + $(this).show().siblings('.J_iframe').hide(); + return false; + } + }); + + // 移除当前选项卡 + $(this).parents('.J_menuTab').remove(); + + // 移除tab对应的内容区 + $('.J_mainContent .J_iframe').each(function () { + if ($(this).data('id') == closeTabId) { + $(this).remove(); + return false; + } + }); + } + } + // 当前元素不处于活动状态 + else { + // 移除当前选项卡 + $(this).parents('.J_menuTab').remove(); + + // 移除相应tab对应的内容区 + $('.J_mainContent .J_iframe').each(function () { + if ($(this).data('id') == closeTabId) { + $(this).remove(); + return false; + } + }); + scrollToTab($('.J_menuTab.active')); + } + return false; + } + + $('.J_menuTabs').on('click', '.J_menuTab i', closeTab); + + //关闭其他选项卡 + function closeOtherTabs(){ + $('.page-tabs-content').children("[data-id]").not(":first").not(".active").each(function () { + $('.J_iframe[data-id="' + $(this).data('id') + '"]').remove(); + $(this).remove(); + }); + $('.page-tabs-content').css("margin-left", "0"); + } + $('.J_tabCloseOther').on('click', closeOtherTabs); + + //滚动到已激活的选项卡 + function showActiveTab(){ + scrollToTab($('.J_menuTab.active')); + } + $('.J_tabShowActive').on('click', showActiveTab); + + + // 点击选项卡菜单 + function activeTab() { + if (!$(this).hasClass('active')) { + var currentId = $(this).data('id'); + // 显示tab对应的内容区 + $('.J_mainContent .J_iframe').each(function () { + if ($(this).data('id') == currentId) { + $(this).show().siblings('.J_iframe').hide(); + return false; + } + }); + $(this).addClass('active').siblings('.J_menuTab').removeClass('active'); + scrollToTab(this); + } + } + + $('.J_menuTabs').on('click', '.J_menuTab', activeTab); + + //刷新iframe + function refreshTab() { + var target = $('.J_iframe[data-id="' + $(this).data('id') + '"]'); + var url = target.attr('src'); +// //显示loading提示 +// var loading = layer.load(); +// target.attr('src', url).load(function () { +// //关闭loading提示 +// layer.close(loading); +// }); + } + + $('.J_menuTabs').on('dblclick', '.J_menuTab', refreshTab); + + // 左移按扭 + $('.J_tabLeft').on('click', scrollTabLeft); + + // 右移按扭 + $('.J_tabRight').on('click', scrollTabRight); + + // 关闭全部 + $('.J_tabCloseAll').on('click', function () { + $('.page-tabs-content').children("[data-id]").not(":first").each(function () { + $('.J_iframe[data-id="' + $(this).data('id') + '"]').remove(); + $(this).remove(); + }); + $('.page-tabs-content').children("[data-id]:first").each(function () { + $('.J_iframe[data-id="' + $(this).data('id') + '"]').show(); + $(this).addClass("active"); + }); + $('.page-tabs-content').css("margin-left", "0"); + }); + +}); diff --git a/app-manage/src/main/resources/public/static/js/content.js b/app-manage/src/main/resources/public/static/js/content.js new file mode 100644 index 0000000..1d8ec0b --- /dev/null +++ b/app-manage/src/main/resources/public/static/js/content.js @@ -0,0 +1,72 @@ +var $parentNode = window.parent.document; + +function $childNode(name) { + return window.frames[name] +} + +// tooltips +$('.tooltip-demo').tooltip({ + selector: "[data-toggle=tooltip]", + container: "body" +}); + +// 使用animation.css修改Bootstrap Modal +$('.modal').appendTo("body"); + +$("[data-toggle=popover]").popover(); + +//折叠ibox +$('.collapse-link').click(function () { + var ibox = $(this).closest('div.ibox'); + var button = $(this).find('i'); + var content = ibox.find('div.ibox-content'); + content.slideToggle(200); + button.toggleClass('fa-chevron-up').toggleClass('fa-chevron-down'); + ibox.toggleClass('').toggleClass('border-bottom'); + setTimeout(function () { + ibox.resize(); + ibox.find('[id^=map-]').resize(); + }, 50); +}); + +//关闭ibox +$('.close-link').click(function () { + var content = $(this).closest('div.ibox'); + content.remove(); +}); + +//判断当前页面是否在iframe中 +if (top == this) { + var gohome = '
    '; + $('body').append(gohome); +} + +//animation.css +function animationHover(element, animation) { + element = $(element); + element.hover( + function () { + element.addClass('animated ' + animation); + }, + function () { + //动画完成之前移除class + window.setTimeout(function () { + element.removeClass('animated ' + animation); + }, 2000); + }); +} + +//拖动面板 +function WinMove() { + var element = "[class*=col]"; + var handle = ".ibox-title"; + var connect = "[class*=col]"; + $(element).sortable({ + handle: handle, + connectWith: connect, + tolerance: 'pointer', + forcePlaceholderSize: true, + opacity: 0.8, + }) + .disableSelection(); +}; diff --git a/app-manage/src/main/resources/public/static/js/hplus.js b/app-manage/src/main/resources/public/static/js/hplus.js new file mode 100644 index 0000000..c99a23a --- /dev/null +++ b/app-manage/src/main/resources/public/static/js/hplus.js @@ -0,0 +1,278 @@ +//自定义js + +//公共配置 + + +$(document).ready(function () { + + // MetsiMenu + $('#side-menu').metisMenu(); + + // 打开右侧边栏 + $('.right-sidebar-toggle').click(function () { + $('#right-sidebar').toggleClass('sidebar-open'); + }); + + // 右侧边栏使用slimscroll + $('.sidebar-container').slimScroll({ + height: '100%', + railOpacity: 0.4, + wheelStep: 10 + }); + + // 打开聊天窗口 + $('.open-small-chat').click(function () { + $(this).children().toggleClass('fa-comments').toggleClass('fa-remove'); + $('.small-chat-box').toggleClass('active'); + }); + + // 聊天窗口使用slimscroll + $('.small-chat-box .content').slimScroll({ + height: '234px', + railOpacity: 0.4 + }); + + // Small todo handler + $('.check-link').click(function () { + var button = $(this).find('i'); + var label = $(this).next('span'); + button.toggleClass('fa-check-square').toggleClass('fa-square-o'); + label.toggleClass('todo-completed'); + return false; + }); + + //固定菜单栏 + $(function () { + $('.sidebar-collapse').slimScroll({ + height: '100%', + railOpacity: 0.9, + alwaysVisible: false + }); + }); + + + // 菜单切换 + $('.navbar-minimalize').click(function () { + $("body").toggleClass("mini-navbar"); + SmoothlyMenu(); + }); + + + // 侧边栏高度 + function fix_height() { + var heightWithoutNavbar = $("body > #wrapper").height() - 61; + $(".sidebard-panel").css("min-height", heightWithoutNavbar + "px"); + } + fix_height(); + + $(window).bind("load resize click scroll", function () { + if (!$("body").hasClass('body-small')) { + fix_height(); + } + }); + + //侧边栏滚动 + $(window).scroll(function () { + if ($(window).scrollTop() > 0 && !$('body').hasClass('fixed-nav')) { + $('#right-sidebar').addClass('sidebar-top'); + } else { + $('#right-sidebar').removeClass('sidebar-top'); + } + }); + + $('.full-height-scroll').slimScroll({ + height: '100%' + }); + + $('#side-menu>li').click(function () { + if ($('body').hasClass('mini-navbar')) { + NavToggle(); + } + }); + $('#side-menu>li li a').click(function () { + if ($(window).width() < 769) { + NavToggle(); + } + }); + + $('.nav-close').click(NavToggle); + + //ios浏览器兼容性处理 + if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) { + $('#content-main').css('overflow-y', 'auto'); + } + +}); + +$(window).bind("load resize", function () { + if ($(this).width() < 769) { + $('body').addClass('mini-navbar'); + $('.navbar-static-side').fadeIn(); + } +}); + +function NavToggle() { + $('.navbar-minimalize').trigger('click'); +} + +function SmoothlyMenu() { + if (!$('body').hasClass('mini-navbar')) { + $('#side-menu').hide(); + setTimeout( + function () { + $('#side-menu').fadeIn(500); + }, 100); + } else if ($('body').hasClass('fixed-sidebar')) { + $('#side-menu').hide(); + setTimeout( + function () { + $('#side-menu').fadeIn(500); + }, 300); + } else { + $('#side-menu').removeAttr('style'); + } +} + + +//主题设置 +$(function () { + + // 顶部菜单固定 + $('#fixednavbar').click(function () { + if ($('#fixednavbar').is(':checked')) { + $(".navbar-static-top").removeClass('navbar-static-top').addClass('navbar-fixed-top'); + $("body").removeClass('boxed-layout'); + $("body").addClass('fixed-nav'); + $('#boxedlayout').prop('checked', false); + + if (localStorageSupport) { + localStorage.setItem("boxedlayout", 'off'); + } + + if (localStorageSupport) { + localStorage.setItem("fixednavbar", 'on'); + } + } else { + $(".navbar-fixed-top").removeClass('navbar-fixed-top').addClass('navbar-static-top'); + $("body").removeClass('fixed-nav'); + + if (localStorageSupport) { + localStorage.setItem("fixednavbar", 'off'); + } + } + }); + + + // 收起左侧菜单 + $('#collapsemenu').click(function () { + if ($('#collapsemenu').is(':checked')) { + $("body").addClass('mini-navbar'); + SmoothlyMenu(); + + if (localStorageSupport) { + localStorage.setItem("collapse_menu", 'on'); + } + + } else { + $("body").removeClass('mini-navbar'); + SmoothlyMenu(); + + if (localStorageSupport) { + localStorage.setItem("collapse_menu", 'off'); + } + } + }); + + // 固定宽度 + $('#boxedlayout').click(function () { + if ($('#boxedlayout').is(':checked')) { + $("body").addClass('boxed-layout'); + $('#fixednavbar').prop('checked', false); + $(".navbar-fixed-top").removeClass('navbar-fixed-top').addClass('navbar-static-top'); + $("body").removeClass('fixed-nav'); + if (localStorageSupport) { + localStorage.setItem("fixednavbar", 'off'); + } + + + if (localStorageSupport) { + localStorage.setItem("boxedlayout", 'on'); + } + } else { + $("body").removeClass('boxed-layout'); + + if (localStorageSupport) { + localStorage.setItem("boxedlayout", 'off'); + } + } + }); + + // 默认主题 + $('.s-skin-0').click(function () { + $("body").removeClass("skin-1"); + $("body").removeClass("skin-2"); + $("body").removeClass("skin-3"); + return false; + }); + + // 蓝色主题 + $('.s-skin-1').click(function () { + $("body").removeClass("skin-2"); + $("body").removeClass("skin-3"); + $("body").addClass("skin-1"); + return false; + }); + + // 黄色主题 + $('.s-skin-3').click(function () { + $("body").removeClass("skin-1"); + $("body").removeClass("skin-2"); + $("body").addClass("skin-3"); + return false; + }); + + if (localStorageSupport) { + var collapse = localStorage.getItem("collapse_menu"); + var fixednavbar = localStorage.getItem("fixednavbar"); + var boxedlayout = localStorage.getItem("boxedlayout"); + + if (collapse == 'on') { + $('#collapsemenu').prop('checked', 'checked') + } + if (fixednavbar == 'on') { + $('#fixednavbar').prop('checked', 'checked') + } + if (boxedlayout == 'on') { + $('#boxedlayout').prop('checked', 'checked') + } + } + + if (localStorageSupport) { + + var collapse = localStorage.getItem("collapse_menu"); + var fixednavbar = localStorage.getItem("fixednavbar"); + var boxedlayout = localStorage.getItem("boxedlayout"); + + var body = $('body'); + + if (collapse == 'on') { + if (!body.hasClass('body-small')) { + body.addClass('mini-navbar'); + } + } + + if (fixednavbar == 'on') { + $(".navbar-static-top").removeClass('navbar-static-top').addClass('navbar-fixed-top'); + body.addClass('fixed-nav'); + } + + if (boxedlayout == 'on') { + body.addClass('boxed-layout'); + } + } +}); + +//判断浏览器是否支持html5本地存储 +function localStorageSupport() { + return (('localStorage' in window) && window['localStorage'] !== null) +} diff --git a/app-manage/src/main/resources/public/static/js/jquery.min.js b/app-manage/src/main/resources/public/static/js/jquery.min.js new file mode 100644 index 0000000..49990d6 --- /dev/null +++ b/app-manage/src/main/resources/public/static/js/jquery.min.js @@ -0,0 +1,4 @@ +/*! jQuery v2.1.4 | (c) 2005, 2015 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l=a.document,m="2.1.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){return!n.isArray(a)&&a-parseFloat(a)+1>=0},isPlainObject:function(a){return"object"!==n.type(a)||a.nodeType||n.isWindow(a)?!1:a.constructor&&!j.call(a.constructor.prototype,"isPrototypeOf")?!1:!0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=l.createElement("script"),b.text=a,l.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:g.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(e=d.call(arguments,2),f=function(){return a.apply(b||this,e.concat(d.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:k}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b="length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N=M.replace("w","w#"),O="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+N+"))|)"+L+"*\\]",P=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+O+")*)|.*)\\)|)",Q=new RegExp(L+"+","g"),R=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),S=new RegExp("^"+L+"*,"+L+"*"),T=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),U=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),V=new RegExp(P),W=new RegExp("^"+N+"$"),X={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M.replace("w","w*")+")"),ATTR:new RegExp("^"+O),PSEUDO:new RegExp("^"+P),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,aa=/[+~]/,ba=/'|\\/g,ca=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),da=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ea=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(fa){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],k=b.nodeType,"string"!=typeof a||!a||1!==k&&9!==k&&11!==k)return d;if(!e&&p){if(11!==k&&(f=_.exec(a)))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return H.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName)return H.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=1!==k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(ba,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+ra(o[l]);w=aa.test(a)&&pa(b.parentNode)||b,x=o.join(",")}if(x)try{return H.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function pa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=g.documentElement,e=g.defaultView,e&&e!==e.top&&(e.addEventListener?e.addEventListener("unload",ea,!1):e.attachEvent&&e.attachEvent("onunload",ea)),p=!f(g),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(g.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(g.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!g.getElementsByName||!g.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ca,da);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(g.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){var b=g.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",P)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===g||a.ownerDocument===v&&t(v,a)?-1:b===g||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,h=[a],i=[b];if(!e||!f)return a===g?-1:b===g?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?la(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},g):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ca,da),a[3]=(a[3]||a[4]||a[5]||"").replace(ca,da),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ca,da).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(Q," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(ca,da),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return W.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(ca,da).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:oa(function(){return[0]}),last:oa(function(a,b){return[b-1]}),eq:oa(function(a,b,c){return[0>c?c+b:c]}),even:oa(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:oa(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:oa(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:oa(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function sa(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function ta(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ua(a,b,c){for(var d=0,e=b.length;e>d;d++)ga(a,b[d],c);return c}function va(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function wa(a,b,c,d,e,f){return d&&!d[u]&&(d=wa(d)),e&&!e[u]&&(e=wa(e,f)),ia(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ua(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:va(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=va(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=va(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function xa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=sa(function(a){return a===b},h,!0),l=sa(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[sa(ta(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return wa(i>1&&ta(m),i>1&&ra(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&xa(a.slice(i,e)),f>e&&xa(a=a.slice(e)),f>e&&ra(a))}m.push(c)}return ta(m)}function ya(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=F.call(i));s=va(s)}H.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&ga.uniqueSort(i)}return k&&(w=v,j=t),r};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=xa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,ya(e,d)),f.selector=a}return f},i=ga.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ca,da),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ca,da),aa.test(j[0].type)&&pa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&ra(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,aa.test(a)&&pa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return g.call(b,a)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:l,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}return d=l.getElementById(c[2]),d&&d.parentNode&&(this.length=1,this[0]=d),this.context=l,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};A.prototype=n.fn,y=n(l);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?g.call(n(a),this[0]):g.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(C[a]||n.unique(e),B.test(a)&&e.reverse()),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return n.each(a.match(E)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(b=a.memory&&l,c=!0,g=e||0,e=0,f=h.length,d=!0;h&&f>g;g++)if(h[g].apply(l[0],l[1])===!1&&a.stopOnFalse){b=!1;break}d=!1,h&&(i?i.length&&j(i.shift()):b?h=[]:k.disable())},k={add:function(){if(h){var c=h.length;!function g(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&g(c)})}(arguments),d?f=h.length:b&&(e=c,j(b))}return this},remove:function(){return h&&n.each(arguments,function(a,b){var c;while((c=n.inArray(b,h,c))>-1)h.splice(c,1),d&&(f>=c&&f--,g>=c&&g--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],f=0,this},disable:function(){return h=i=b=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,b||k.disable(),this},locked:function(){return!i},fireWith:function(a,b){return!h||c&&!i||(b=b||[],b=[a,b.slice?b.slice():b],d?i.push(b):j(b)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!c}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(H.resolveWith(l,[n]),n.fn.triggerHandler&&(n(l).triggerHandler("ready"),n(l).off("ready"))))}});function I(){l.removeEventListener("DOMContentLoaded",I,!1),a.removeEventListener("load",I,!1),n.ready()}n.ready.promise=function(b){return H||(H=n.Deferred(),"complete"===l.readyState?setTimeout(n.ready):(l.addEventListener("DOMContentLoaded",I,!1),a.addEventListener("load",I,!1))),H.promise(b)},n.ready.promise();var J=n.access=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)n.access(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f};n.acceptData=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function K(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=n.expando+K.uid++}K.uid=1,K.accepts=n.acceptData,K.prototype={key:function(a){if(!K.accepts(a))return 0;var b={},c=a[this.expando];if(!c){c=K.uid++;try{b[this.expando]={value:c},Object.defineProperties(a,b)}catch(d){b[this.expando]=c,n.extend(a,b)}}return this.cache[c]||(this.cache[c]={}),c},set:function(a,b,c){var d,e=this.key(a),f=this.cache[e];if("string"==typeof b)f[b]=c;else if(n.isEmptyObject(f))n.extend(this.cache[e],b);else for(d in b)f[d]=b[d];return f},get:function(a,b){var c=this.cache[this.key(a)];return void 0===b?c:c[b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=this.key(a),g=this.cache[f];if(void 0===b)this.cache[f]={};else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in g?d=[b,e]:(d=e,d=d in g?[d]:d.match(E)||[])),c=d.length;while(c--)delete g[d[c]]}},hasData:function(a){return!n.isEmptyObject(this.cache[a[this.expando]]||{})},discard:function(a){a[this.expando]&&delete this.cache[a[this.expando]]}};var L=new K,M=new K,N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(O,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}M.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return M.hasData(a)||L.hasData(a)},data:function(a,b,c){ +return M.access(a,b,c)},removeData:function(a,b){M.remove(a,b)},_data:function(a,b,c){return L.access(a,b,c)},_removeData:function(a,b){L.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=M.get(f),1===f.nodeType&&!L.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d])));L.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){M.set(this,a)}):J(this,function(b){var c,d=n.camelCase(a);if(f&&void 0===b){if(c=M.get(f,a),void 0!==c)return c;if(c=M.get(f,d),void 0!==c)return c;if(c=P(f,d,void 0),void 0!==c)return c}else this.each(function(){var c=M.get(this,d);M.set(this,d,b),-1!==a.indexOf("-")&&void 0!==c&&M.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){M.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=L.get(a,b),c&&(!d||n.isArray(c)?d=L.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return L.get(a,c)||L.access(a,c,{empty:n.Callbacks("once memory").add(function(){L.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthx",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var U="undefined";k.focusinBubbles="onfocusin"in a;var V=/^key/,W=/^(?:mouse|pointer|contextmenu)|click/,X=/^(?:focusinfocus|focusoutblur)$/,Y=/^([^.]*)(?:\.(.+)|)$/;function Z(){return!0}function $(){return!1}function _(){try{return l.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return typeof n!==U&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(E)||[""],j=b.length;while(j--)h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g,!1)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=L.hasData(a)&&L.get(a);if(r&&(i=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=Y.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&(delete r.handle,L.remove(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,m,o,p=[d||l],q=j.call(b,"type")?b.type:b,r=j.call(b,"namespace")?b.namespace.split("."):[];if(g=h=d=d||l,3!==d.nodeType&&8!==d.nodeType&&!X.test(q+n.event.triggered)&&(q.indexOf(".")>=0&&(r=q.split("."),q=r.shift(),r.sort()),k=q.indexOf(":")<0&&"on"+q,b=b[n.expando]?b:new n.Event(q,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=r.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+r.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),o=n.event.special[q]||{},e||!o.trigger||o.trigger.apply(d,c)!==!1)){if(!e&&!o.noBubble&&!n.isWindow(d)){for(i=o.delegateType||q,X.test(i+q)||(g=g.parentNode);g;g=g.parentNode)p.push(g),h=g;h===(d.ownerDocument||l)&&p.push(h.defaultView||h.parentWindow||a)}f=0;while((g=p[f++])&&!b.isPropagationStopped())b.type=f>1?i:o.bindType||q,m=(L.get(g,"events")||{})[b.type]&&L.get(g,"handle"),m&&m.apply(g,c),m=k&&g[k],m&&m.apply&&n.acceptData(g)&&(b.result=m.apply(g,c),b.result===!1&&b.preventDefault());return b.type=q,e||b.isDefaultPrevented()||o._default&&o._default.apply(p.pop(),c)!==!1||!n.acceptData(d)||k&&n.isFunction(d[q])&&!n.isWindow(d)&&(h=d[k],h&&(d[k]=null),n.event.triggered=q,d[q](),n.event.triggered=void 0,h&&(d[k]=h)),b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(L.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(g.namespace))&&(a.handleObj=g,a.data=g.data,e=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==e&&(a.result=e)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!==this;i=i.parentNode||this)if(i.disabled!==!0||"click"!==a.type){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>=0:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,ba=/<([\w:]+)/,ca=/<|&#?\w+;/,da=/<(?:script|style|link)/i,ea=/checked\s*(?:[^=]|=\s*.checked.)/i,fa=/^$|\/(?:java|ecma)script/i,ga=/^true\/(.*)/,ha=/^\s*\s*$/g,ia={option:[1,""],thead:[1,"
    ","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};ia.optgroup=ia.option,ia.tbody=ia.tfoot=ia.colgroup=ia.caption=ia.thead,ia.th=ia.td;function ja(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function ka(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function la(a){var b=ga.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function ma(a,b){for(var c=0,d=a.length;d>c;c++)L.set(a[c],"globalEval",!b||L.get(b[c],"globalEval"))}function na(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(L.hasData(a)&&(f=L.access(a),g=L.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}M.hasData(a)&&(h=M.access(a),i=n.extend({},h),M.set(b,i))}}function oa(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function pa(a,b){var c=b.nodeName.toLowerCase();"input"===c&&T.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}n.extend({clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=oa(h),f=oa(a),d=0,e=f.length;e>d;d++)pa(f[d],g[d]);if(b)if(c)for(f=f||oa(a),g=g||oa(h),d=0,e=f.length;e>d;d++)na(f[d],g[d]);else na(a,h);return g=oa(h,"script"),g.length>0&&ma(g,!i&&oa(a,"script")),h},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k=b.createDocumentFragment(),l=[],m=0,o=a.length;o>m;m++)if(e=a[m],e||0===e)if("object"===n.type(e))n.merge(l,e.nodeType?[e]:e);else if(ca.test(e)){f=f||k.appendChild(b.createElement("div")),g=(ba.exec(e)||["",""])[1].toLowerCase(),h=ia[g]||ia._default,f.innerHTML=h[1]+e.replace(aa,"<$1>")+h[2],j=h[0];while(j--)f=f.lastChild;n.merge(l,f.childNodes),f=k.firstChild,f.textContent=""}else l.push(b.createTextNode(e));k.textContent="",m=0;while(e=l[m++])if((!d||-1===n.inArray(e,d))&&(i=n.contains(e.ownerDocument,e),f=oa(k.appendChild(e),"script"),i&&ma(f),c)){j=0;while(e=f[j++])fa.test(e.type||"")&&c.push(e)}return k},cleanData:function(a){for(var b,c,d,e,f=n.event.special,g=0;void 0!==(c=a[g]);g++){if(n.acceptData(c)&&(e=c[L.expando],e&&(b=L.cache[e]))){if(b.events)for(d in b.events)f[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);L.cache[e]&&delete L.cache[e]}delete M.cache[c[M.expando]]}}}),n.fn.extend({text:function(a){return J(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&(this.textContent=a)})},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=ja(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(oa(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&ma(oa(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(oa(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return J(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!da.test(a)&&!ia[(ba.exec(a)||["",""])[1].toLowerCase()]){a=a.replace(aa,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(oa(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(oa(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,m=this,o=l-1,p=a[0],q=n.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&ea.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(c=n.buildFragment(a,this[0].ownerDocument,!1,this),d=c.firstChild,1===c.childNodes.length&&(c=d),d)){for(f=n.map(oa(c,"script"),ka),g=f.length;l>j;j++)h=c,j!==o&&(h=n.clone(h,!0,!0),g&&n.merge(f,oa(h,"script"))),b.call(this[j],h,j);if(g)for(i=f[f.length-1].ownerDocument,n.map(f,la),j=0;g>j;j++)h=f[j],fa.test(h.type||"")&&!L.access(h,"globalEval")&&n.contains(i,h)&&(h.src?n._evalUrl&&n._evalUrl(h.src):n.globalEval(h.textContent.replace(ha,"")))}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),g=e.length-1,h=0;g>=h;h++)c=h===g?this:this.clone(!0),n(e[h])[b](c),f.apply(d,c.get());return this.pushStack(d)}});var qa,ra={};function sa(b,c){var d,e=n(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:n.css(e[0],"display");return e.detach(),f}function ta(a){var b=l,c=ra[a];return c||(c=sa(a,b),"none"!==c&&c||(qa=(qa||n("';break;case 3:b.title=!1,b.closeBtn=!1,-1===b.icon&&0===b.icon,f.closeAll("loading");break;case 4:j||(b.content=[b.content,"body"]),b.follow=b.content[1],b.content=b.content[0]+'',b.title=!1,b.shade=!1,b.fix=!1,b.tips="object"==typeof b.tips?b.tips:[b.tips,!0],b.tipsMore||f.closeAll("tips")}a.vessel(j,function(d,e){c("body").append(d[0]),j?function(){2==b.type||4==b.type?function(){c("body").append(d[1])}():function(){i.parents("."+h[0])[0]||(i.show().addClass("layui-layer-wrap").wrap(d[1]),c("#"+h[0]+g).find("."+h[5]).before(e))}()}():c("body").append(d[1]),a.layero=c("#"+h[0]+g),b.scrollbar||h.html.css("overflow","hidden").attr("layer-full",g)}).auto(g),2==b.type&&f.ie6&&a.layero.find("iframe").attr("src",i[0]),c(document).off("keydown",e.enter).on("keydown",e.enter),a.layero.on("keydown",function(a){c(document).off("keydown",e.enter)}),4==b.type?a.tips():a.offset(),b.fix&&d.on("resize",function(){a.offset(),(/^\d+%$/.test(b.area[0])||/^\d+%$/.test(b.area[1]))&&a.auto(g),4==b.type&&a.tips()}),b.time<=0||setTimeout(function(){f.close(a.index)},b.time),a.move().callback()},g.pt.auto=function(a){function b(a){a=g.find(a),a.height(i[1]-j-k-2*(0|parseFloat(a.css("padding"))))}var e=this,f=e.config,g=c("#"+h[0]+a);""===f.area[0]&&f.maxWidth>0&&(/MSIE 7/.test(navigator.userAgent)&&f.btn&&g.width(g.innerWidth()),g.outerWidth()>f.maxWidth&&g.width(f.maxWidth));var i=[g.innerWidth(),g.innerHeight()],j=g.find(h[1]).outerHeight()||0,k=g.find("."+h[6]).outerHeight()||0;switch(f.type){case 2:b("iframe");break;default:""===f.area[1]?f.fix&&i[1]>=d.height()&&(i[1]=d.height(),b("."+h[5])):b("."+h[5])}return e},g.pt.offset=function(){var a=this,b=a.config,c=a.layero,e=[c.outerWidth(),c.outerHeight()],f="object"==typeof b.offset;a.offsetTop=(d.height()-e[1])/2,a.offsetLeft=(d.width()-e[0])/2,f?(a.offsetTop=b.offset[0],a.offsetLeft=b.offset[1]||a.offsetLeft):"auto"!==b.offset&&(a.offsetTop=b.offset,"rb"===b.offset&&(a.offsetTop=d.height()-e[1],a.offsetLeft=d.width()-e[0])),b.fix||(a.offsetTop=/%$/.test(a.offsetTop)?d.height()*parseFloat(a.offsetTop)/100:parseFloat(a.offsetTop),a.offsetLeft=/%$/.test(a.offsetLeft)?d.width()*parseFloat(a.offsetLeft)/100:parseFloat(a.offsetLeft),a.offsetTop+=d.scrollTop(),a.offsetLeft+=d.scrollLeft()),c.css({top:a.offsetTop,left:a.offsetLeft})},g.pt.tips=function(){var a=this,b=a.config,e=a.layero,f=[e.outerWidth(),e.outerHeight()],g=c(b.follow);g[0]||(g=c("body"));var i={width:g.outerWidth(),height:g.outerHeight(),top:g.offset().top,left:g.offset().left},j=e.find(".layui-layer-TipsG"),k=b.tips[0];b.tips[1]||j.remove(),i.autoLeft=function(){i.left+f[0]-d.width()>0?(i.tipLeft=i.left+i.width-f[0],j.css({right:12,left:"auto"})):i.tipLeft=i.left},i.where=[function(){i.autoLeft(),i.tipTop=i.top-f[1]-10,j.removeClass("layui-layer-TipsB").addClass("layui-layer-TipsT").css("border-right-color",b.tips[1])},function(){i.tipLeft=i.left+i.width+10,i.tipTop=i.top,j.removeClass("layui-layer-TipsL").addClass("layui-layer-TipsR").css("border-bottom-color",b.tips[1])},function(){i.autoLeft(),i.tipTop=i.top+i.height+10,j.removeClass("layui-layer-TipsT").addClass("layui-layer-TipsB").css("border-right-color",b.tips[1])},function(){i.tipLeft=i.left-f[0]-10,i.tipTop=i.top,j.removeClass("layui-layer-TipsR").addClass("layui-layer-TipsL").css("border-bottom-color",b.tips[1])}],i.where[k-1](),1===k?i.top-(d.scrollTop()+f[1]+16)<0&&i.where[2]():2===k?d.width()-(i.left+i.width+f[0]+16)>0||i.where[3]():3===k?i.top-d.scrollTop()+i.height+f[1]+16-d.height()>0&&i.where[0]():4===k&&f[0]+16-i.left>0&&i.where[1](),e.find("."+h[5]).css({"background-color":b.tips[1],"padding-right":b.closeBtn?"30px":""}),e.css({left:i.tipLeft,top:i.tipTop})},g.pt.move=function(){var a=this,b=a.config,e={setY:0,moveLayer:function(){var a=e.layero,b=parseInt(a.css("margin-left")),c=parseInt(e.move.css("left"));0===b||(c-=b),"fixed"!==a.css("position")&&(c-=a.parent().offset().left,e.setY=0),a.css({left:c,top:parseInt(e.move.css("top"))-e.setY})}},f=a.layero.find(b.move);return b.move&&f.attr("move","ok"),f.css({cursor:b.move?"move":"auto"}),c(b.move).on("mousedown",function(a){if(a.preventDefault(),"ok"===c(this).attr("move")){e.ismove=!0,e.layero=c(this).parents("."+h[0]);var f=e.layero.offset().left,g=e.layero.offset().top,i=e.layero.outerWidth()-6,j=e.layero.outerHeight()-6;c("#layui-layer-moves")[0]||c("body").append('
    '),e.move=c("#layui-layer-moves"),b.moveType&&e.move.css({visibility:"hidden"}),e.moveX=a.pageX-e.move.position().left,e.moveY=a.pageY-e.move.position().top,"fixed"!==e.layero.css("position")||(e.setY=d.scrollTop())}}),c(document).mousemove(function(a){if(e.ismove){var c=a.pageX-e.moveX,f=a.pageY-e.moveY;if(a.preventDefault(),!b.moveOut){e.setY=d.scrollTop();var g=d.width()-e.move.outerWidth(),h=e.setY;0>c&&(c=0),c>g&&(c=g),h>f&&(f=h),f>d.height()-e.move.outerHeight()+e.setY&&(f=d.height()-e.move.outerHeight()+e.setY)}e.move.css({left:c,top:f}),b.moveType&&e.moveLayer(),c=f=g=h=null}}).mouseup(function(){try{e.ismove&&(e.moveLayer(),e.move.remove(),b.moveEnd&&b.moveEnd()),e.ismove=!1}catch(a){e.ismove=!1}}),a},g.pt.callback=function(){function a(){var a=g.cancel&&g.cancel(b.index);a===!1||f.close(b.index)}var b=this,d=b.layero,g=b.config;b.openLayer(),g.success&&(2==g.type?d.find("iframe").on("load",function(){g.success(d,b.index)}):g.success(d,b.index)),f.ie6&&b.IE6(d),d.find("."+h[6]).children("a").on("click",function(){var e=c(this).index();g["btn"+(e+1)]&&g["btn"+(e+1)](b.index,d),0===e?g.yes?g.yes(b.index,d):f.close(b.index):1===e?a():g["btn"+(e+1)]||f.close(b.index)}),d.find("."+h[7]).on("click",a),g.shadeClose&&c("#layui-layer-shade"+b.index).on("click",function(){f.close(b.index)}),d.find(".layui-layer-min").on("click",function(){f.min(b.index,g),g.min&&g.min(d)}),d.find(".layui-layer-max").on("click",function(){c(this).hasClass("layui-layer-maxmin")?(f.restore(b.index),g.restore&&g.restore(d)):(f.full(b.index,g),g.full&&g.full(d))}),g.end&&(e.end[b.index]=g.end)},e.reselect=function(){c.each(c("select"),function(a,b){var d=c(this);d.parents("."+h[0])[0]||1==d.attr("layer")&&c("."+h[0]).length<1&&d.removeAttr("layer").show(),d=null})},g.pt.IE6=function(a){function b(){a.css({top:f+(e.config.fix?d.scrollTop():0)})}var e=this,f=a.offset().top;b(),d.scroll(b),c("select").each(function(a,b){var d=c(this);d.parents("."+h[0])[0]||"none"===d.css("display")||d.attr({layer:"1"}).hide(),d=null})},g.pt.openLayer=function(){var a=this;f.zIndex=a.config.zIndex,f.setTop=function(a){var b=function(){f.zIndex++,a.css("z-index",f.zIndex+1)};return f.zIndex=parseInt(a[0].style.zIndex),a.on("mousedown",b),f.zIndex}},e.record=function(a){var b=[a.outerWidth(),a.outerHeight(),a.position().top,a.position().left+parseFloat(a.css("margin-left"))];a.find(".layui-layer-max").addClass("layui-layer-maxmin"),a.attr({area:b})},e.rescollbar=function(a){h.html.attr("layer-full")==a&&(h.html[0].style.removeProperty?h.html[0].style.removeProperty("overflow"):h.html[0].style.removeAttribute("overflow"),h.html.removeAttr("layer-full"))},a.layer=f,f.getChildFrame=function(a,b){return b=b||c("."+h[4]).attr("times"),c("#"+h[0]+b).find("iframe").contents().find(a)},f.getFrameIndex=function(a){return c("#"+a).parents("."+h[4]).attr("times")},f.iframeAuto=function(a){if(a){var b=f.getChildFrame("html",a).outerHeight(),d=c("#"+h[0]+a),e=d.find(h[1]).outerHeight()||0,g=d.find("."+h[6]).outerHeight()||0;d.css({height:b+e+g}),d.find("iframe").css({height:b})}},f.iframeSrc=function(a,b){c("#"+h[0]+a).find("iframe").attr("src",b)},f.style=function(a,b){var d=c("#"+h[0]+a),f=d.attr("type"),g=d.find(h[1]).outerHeight()||0,i=d.find("."+h[6]).outerHeight()||0;(f===e.type[1]||f===e.type[2])&&(d.css(b),f===e.type[2]&&d.find("iframe").css({height:parseFloat(b.height)-g-i}))},f.min=function(a,b){var d=c("#"+h[0]+a),g=d.find(h[1]).outerHeight()||0;e.record(d),f.style(a,{width:180,height:g,overflow:"hidden"}),d.find(".layui-layer-min").hide(),"page"===d.attr("type")&&d.find(h[4]).hide(),e.rescollbar(a)},f.restore=function(a){var b=c("#"+h[0]+a),d=b.attr("area").split(",");b.attr("type");f.style(a,{width:parseFloat(d[0]),height:parseFloat(d[1]),top:parseFloat(d[2]),left:parseFloat(d[3]),overflow:"visible"}),b.find(".layui-layer-max").removeClass("layui-layer-maxmin"),b.find(".layui-layer-min").show(),"page"===b.attr("type")&&b.find(h[4]).show(),e.rescollbar(a)},f.full=function(a){var b,g=c("#"+h[0]+a);e.record(g),h.html.attr("layer-full")||h.html.css("overflow","hidden").attr("layer-full",a),clearTimeout(b),b=setTimeout(function(){var b="fixed"===g.css("position");f.style(a,{top:b?0:d.scrollTop(),left:b?0:d.scrollLeft(),width:d.width(),height:d.height()}),g.find(".layui-layer-min").hide()},100)},f.title=function(a,b){var d=c("#"+h[0]+(b||f.index)).find(h[1]);d.html(a)},f.close=function(a){var b=c("#"+h[0]+a),d=b.attr("type");if(b[0]){if(d===e.type[1]&&"object"===b.attr("conType")){b.children(":not(."+h[5]+")").remove();for(var g=0;2>g;g++)b.find(".layui-layer-wrap").unwrap().hide()}else{if(d===e.type[2])try{var i=c("#"+h[4]+a)[0];i.contentWindow.document.write(""),i.contentWindow.close(),b.find("."+h[5])[0].removeChild(i)}catch(j){}b[0].innerHTML="",b.remove()}c("#layui-layer-moves, #layui-layer-shade"+a).remove(),f.ie6&&e.reselect(),e.rescollbar(a),c(document).off("keydown",e.enter),"function"==typeof e.end[a]&&e.end[a](),delete e.end[a]}},f.closeAll=function(a){c.each(c("."+h[0]),function(){var b=c(this),d=a?b.attr("type")===a:1;d&&f.close(b.attr("times")),d=null})},e.run=function(){c=jQuery,d=c(a),h.html=c("html"),f.open=function(a){var b=new g(a);return b.index}},"function"==typeof define?define(function(){return e.run(),f}):function(){e.run(),f.use("skin/layer.css")}()}(window); diff --git a/app-manage/src/main/resources/public/static/js/plugins/layer/layim/data/chatlog.json b/app-manage/src/main/resources/public/static/js/plugins/layer/layim/data/chatlog.json new file mode 100644 index 0000000..13954d7 --- /dev/null +++ b/app-manage/src/main/resources/public/static/js/plugins/layer/layim/data/chatlog.json @@ -0,0 +1,30 @@ +{ + "status": 1, + "msg": "ok", + "data": [ + { + "id": "100001", + "name": "Beaut-zihan", + "time": "10:23", + "face": "img/a1.jpg" + }, + { + "id": "100002", + "name": "慕容晓晓", + "time": "昨天", + "face": "img/a2.jpg" + }, + { + "id": "1000033", + "name": "乔峰", + "time": "2014-4.22", + "face": "img/a3.jpg" + }, + { + "id": "10000333", + "name": "高圆圆", + "time": "2014-4.21", + "face": "img/a4.jpg" + } + ] +} diff --git a/app-manage/src/main/resources/public/static/js/plugins/layer/layim/data/friend.json b/app-manage/src/main/resources/public/static/js/plugins/layer/layim/data/friend.json new file mode 100644 index 0000000..13a2b65 --- /dev/null +++ b/app-manage/src/main/resources/public/static/js/plugins/layer/layim/data/friend.json @@ -0,0 +1,107 @@ +{ + "status": 1, + "msg": "ok", + "data": [ + { + "name": "销售部", + "nums": 36, + "id": 1, + "item": [ + { + "id": "100001", + "name": "郭敬明", + "face": "img/a5.jpg" + }, + { + "id": "100002", + "name": "作家崔成浩", + "face": "img/a6.jpg" + }, + { + "id": "1000022", + "name": "韩寒", + "face": "img/a7.jpg" + }, + { + "id": "10000222", + "name": "范爷", + "face": "img/a8.jpg" + }, + { + "id": "100002222", + "name": "小马哥", + "face": "img/a9.jpg" + } + ] + }, + { + "name": "大学同窗", + "nums": 16, + "id": 2, + "item": [ + { + "id": "1000033", + "name": "苏醒", + "face": "img/a9.jpg" + }, + { + "id": "10000333", + "name": "马云", + "face": "img/a8.jpg" + }, + { + "id": "100003", + "name": "鬼脚七", + "face": "img/a7.jpg" + }, + { + "id": "100004", + "name": "谢楠", + "face": "img/a6.jpg" + }, + { + "id": "100005", + "name": "徐峥", + "face": "img/a5.jpg" + } + ] + }, + { + "name": "H+后台主题", + "nums": 38, + "id": 3, + "item": [ + { + "id": "100006", + "name": "柏雪近在它香", + "face": "img/a4.jpg" + }, + { + "id": "100007", + "name": "罗昌平", + "face": "img/a3.jpg" + }, + { + "id": "100008", + "name": "Crystal影子", + "face": "img/a2.jpg" + }, + { + "id": "100009", + "name": "艺小想", + "face": "img/a1.jpg" + }, + { + "id": "100010", + "name": "天猫", + "face": "img/a8.jpg" + }, + { + "id": "100011", + "name": "张泉灵", + "face": "img/a7.jpg" + } + ] + } + ] +} diff --git a/app-manage/src/main/resources/public/static/js/plugins/layer/layim/data/group.json b/app-manage/src/main/resources/public/static/js/plugins/layer/layim/data/group.json new file mode 100644 index 0000000..3352f65 --- /dev/null +++ b/app-manage/src/main/resources/public/static/js/plugins/layer/layim/data/group.json @@ -0,0 +1,57 @@ +{ + "status": 1, + "msg": "ok", + "data": [ + { + "name": "H+交流群", + "nums": 36, + "id": 1, + "item": [ + { + "id": "101", + "name": "H+ Bug反馈", + "face": "http://tp2.sinaimg.cn/2211874245/180/40050524279/0" + }, + { + "id": "102", + "name": "H+ 技术交流", + "face": "http://tp3.sinaimg.cn/1820711170/180/1286855219/1" + } + ] + }, + { + "name": "Bootstrap", + "nums": 16, + "id": 2, + "item": [ + { + "id": "103", + "name": "Bootstrap中文", + "face": "http://tp2.sinaimg.cn/2211874245/180/40050524279/0" + }, + { + "id": "104", + "name": "Bootstrap资源", + "face": "http://tp3.sinaimg.cn/1820711170/180/1286855219/1" + } + ] + }, + { + "name": "WebApp", + "nums": 106, + "id": 3, + "item": [ + { + "id": "105", + "name": "移动开发", + "face": "http://tp2.sinaimg.cn/2211874245/180/40050524279/0" + }, + { + "id": "106", + "name": "H5前言", + "face": "http://tp3.sinaimg.cn/1820711170/180/1286855219/1" + } + ] + } + ] +} diff --git a/app-manage/src/main/resources/public/static/js/plugins/layer/layim/data/groups.json b/app-manage/src/main/resources/public/static/js/plugins/layer/layim/data/groups.json new file mode 100644 index 0000000..fd0464a --- /dev/null +++ b/app-manage/src/main/resources/public/static/js/plugins/layer/layim/data/groups.json @@ -0,0 +1,56 @@ +{ + "status": 1, + "msg": "ok", + "data": [ + { + "id": "100001", + "name": "無言的蒁説", + "face": "img/a1.jpg" + }, + { + "id": "100002", + "name": "婷宝奢侈品", + "face": "img/a2.jpg" + }, + { + "id": "100003", + "name": "忆恨思爱", + "face": "img/a3.jpg" + }, + { + "id": "100004", + "name": "天涯奥拓慢", + "face": "img/a4.jpg" + }, + { + "id": "100005", + "name": "雨落无声的天空", + "face": "img/a5.jpg" + }, + { + "id": "100006", + "name": "李越LycorisRadiate", + "face": "img/a6.jpg" + }, + { + "id": "100007", + "name": "冯胖妞张直丑", + "face": "img/a7.jpg" + }, + { + "id": "100008", + "name": "陈龙hmmm", + "face": "img/a8.jpg" + }, + { + "id": "100009", + "name": "别闹哥胆儿小", + "face": "img/a9.jpg" + }, + { + "id": "100010", + "name": "锅锅锅锅萌哒哒 ", + "face": "img/a10.jpg" + } + ] +} diff --git a/app-manage/src/main/resources/public/static/js/plugins/layer/layim/layim.css b/app-manage/src/main/resources/public/static/js/plugins/layer/layim/layim.css new file mode 100644 index 0000000..a568a03 --- /dev/null +++ b/app-manage/src/main/resources/public/static/js/plugins/layer/layim/layim.css @@ -0,0 +1,158 @@ +/* + + @Name: layim WebIM 1.0.0 + @Author:贤心(子涵修改) + @Date: 2014-04-25 + @Blog: http://sentsin.com + + */ +body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,input,button,textarea,p,blockquote,th,td,form{margin:0; padding:0;} +input,button,textarea,select,optgroup,option{font-family:inherit; font-size:inherit; font-style:inherit; font-weight:inherit; outline: 0;} +li{list-style:none;} +.xxim_icon, .xxim_main i, .layim_chatbox i{position:absolute;} +.loading{background:url(loading.gif) no-repeat center center;} +.layim_chatbox a, .layim_chatbox a:hover{color:#343434; text-decoration:none; } +.layim_zero{position:absolute; width:0; height:0; border-style:dashed; border-color:transparent; overflow:hidden;} + +.xxim_main{position:fixed; right:1px; bottom:1px; width:230px; border:1px solid #BEBEBE; background-color:#fff; font-size:12px; box-shadow: 0 0 10px rgba(0,0,0,.2); z-index:99999999} +.layim_chatbox textarea{resize:none;} +.xxim_main em, .xxim_main i, .layim_chatbox em, .layim_chatbox i{font-style:normal; font-weight:400;} +.xxim_main h5{font-size:100%; font-weight:400;} + +/* 搜索栏 */ +.xxim_search{position:relative; padding-left:40px; height:40px; border-bottom:1px solid #DCDCDC; background-color:#fff;} +.xxim_search i{left:10px; top:12px; width:16px; height:16px;font-size: 16px;color:#999;} +.xxim_search input{border:none; background:none; width: 180px; margin-top:10px; line-height:20px;} +.xxim_search span{display:none; position:absolute; right:10px; top:10px; height:18px; line-height:18px;width:18px;text-align: center;background-color:#AFAFAF; color:#fff; cursor:pointer; border-radius:2px; font-size:12px; font-weight:900;} +.xxim_search span:hover{background-color:#FCBE00;} + +/* 主面板tab */ +.xxim_tabs{height:45px; border-bottom:1px solid #DBDBDB; background-color:#F4F4F4; font-size:0;} +.xxim_tabs span{position:relative; display:inline-block; *display:inline; *zoom:1; vertical-align:top; width:76px; height:45px; border-right:1px solid #DBDBDB; cursor:pointer; font-size:12px;} +.xxim_tabs span i{top:12px; left:50%; width:20px; margin-left:-10px; height:20px;font-size:20px;color:#ccc;} +.xxim_tabs .xxim_tabnow{height:46px; background-color:#fff;} +.xxim_tabs .xxim_tabnow i{color:#1ab394;} +.xxim_tabs .xxim_latechat{border-right:none;} +.xxim_tabs .xxim_tabfriend i{width:14px; margin-left:-7px;} + +/* 主面板列表 */ +.xxim_list{display:none; height:350px; padding:5px 0; overflow:hidden;} +.xxim_list:hover{ overflow-y:auto;} +.xxim_list h5{position:relative; padding-left:32px; height:26px; line-height:26px; cursor:pointer; color:#000; font-size:0;} +.xxim_list h5 span{display:inline-block; *display:inline; *zoom:1; vertical-align:top; max-width:140px; overflow:hidden; text-overflow: ellipsis; white-space:nowrap; font-size:12px;} +.xxim_list h5 i{left:15px; top:8px; width:10px; height:10px;font-size:10px;color:#666;} +.xxim_list h5 *{font-size:12px;} +.xxim_list .xxim_chatlist{display:none;} +.xxim_list .xxim_liston h5 i{width:8px; height:7px;} +.xxim_list .xxim_liston .xxim_chatlist{display:block;} +.xxim_chatlist {} +.xxim_chatlist li{position:relative; height:40px; line-height:30px; padding:5px 10px; font-size:0; cursor:pointer;} +.xxim_chatlist li:hover{background-color:#F2F4F8} +.xxim_chatlist li *{display:inline-block; *display:inline; *zoom:1; vertical-align:top; font-size:12px;} +.xxim_chatlist li span{padding-left:10px; max-width:120px; overflow:hidden; text-overflow: ellipsis; white-space:nowrap;} +.xxim_chatlist li img{width:30px; height:30px;} +.xxim_chatlist li .xxim_time{position:absolute; right:10px; color:#999;} +.xxim_list .xxim_errormsg{text-align:center; margin:50px 0; color:#999;} +.xxim_searchmain{position:absolute; width:230px; height:491px; left:0; top:41px; z-index:10; background-color:#fff;} + +/* 主面板底部 */ +.xxim_bottom{height:34px; border-top:1px solid #D0DCF3; background-color:#F2F4F8;} +.xxim_expend{border-left:1px solid #D0DCF3; border-bottom:1px solid #D0DCF3;} +.xxim_bottom li{position:relative; width:50px; height:32px; line-height:32px; float:left; border-right:1px solid #D0DCF3; cursor:pointer;} +.xxim_bottom li i{ top:9px;} +.xxim_bottom .xxim_hide{border-right:none;} +.xxim_bottom .xxim_online{width:72px; padding-left:35px;} +.xxim_online i{left:13px; width:14px; height:14px;font-size:14px;color:#FFA00A;} +.xxim_setonline{display:none; position:absolute; left:-79px; bottom:-1px; border:1px solid #DCDCDC; background-color:#fff;} +.xxim_setonline span{position:relative; display:block; width:32px;width: 77px; padding:0 10px 0 35px;} +.xxim_setonline span:hover{background-color:#F2F4F8;} +.xxim_offline .xxim_nowstate, .xxim_setoffline i{color:#999;} +.xxim_mymsg i{left:18px; width:14px; height:14px;font-size: 14px;} +.xxim_mymsg a{position:absolute; left:0; top:0; width:50px; height:32px;} +.xxim_seter i{left:18px; width:14px; height:14px;font-size: 14px;} +.xxim_hide i{left:18px; width:14px; height:14px;font-size: 14px;} +.xxim_show i{} +.xxim_bottom .xxim_on{position:absolute; left:-17px; top:50%; width:16px;text-align: center;color:#999;line-height: 97px; height:97px; margin-top:-49px;border:solid 1px #BEBEBE;border-right: none; background:#F2F4F8;} +.xxim_bottom .xxim_off{} + +/* 聊天窗口 */ +.layim_chatbox{width:620px; border:1px solid #BEBEBE; background-color:#fff; font-size:12px; box-shadow: 0 0 10px rgba(0,0,0,.2);} +.layim_chatbox h6{position:relative; height:40px; border-bottom:1px solid #D9D9D9; background-color:#FCFDFA} +.layim_move{position:absolute; height:40px; width: 620px; z-index:0;} +.layim_face{position:absolute; bottom:-1px; left:10px; width:64px; height:64px;padding:1px;background: #fff; border:1px solid #ccc;} +.layim_face img{width:60px; height:60px;} +.layim_names{position:absolute; left:90px; max-width:300px; line-height:40px; color:#000; overflow:hidden; text-overflow: ellipsis; white-space:nowrap; font-size:14px;} +.layim_rightbtn{position:absolute; right:15px; top:12px; font-size:20px;} +.layim_rightbtn i{position:relative; width:16px; height:16px; display:inline-block; *display:inline; *zoom:1; vertical-align:top; cursor:pointer; transition: all .3s;text-align: center;line-height: 16px;} +.layim_rightbtn .layim_close{background: #FFA00A;color:#fff;} +.layim_rightbtn .layim_close:hover{-webkit-transform: rotate(180deg); -moz-transform: rotate(180deg);} +.layim_rightbtn .layer_setmin{margin-right:5px;color:#999;font-size:14px;font-weight: 700;} +.layim_chat, .layim_chatmore,.layim_groups{height:450px; overflow:hidden;} +.layim_chatmore{display:none; float:left; width:135px; border-right:1px solid #BEBEBE; background-color:#F2F2F2} +.layim_chatlist li, .layim_groups li{position:relative; height:30px; line-height:30px; padding:0 10px; overflow:hidden; text-overflow: ellipsis; white-space:nowrap; cursor:pointer;} +.layim_chatlist li{padding:0 20px 0 10px;} +.layim_chatlist li:hover{background-color:#E3E3E3;} +.layim_chatlist li span{display:inline-block; *display:inline; *zoom:1; vertical-align:top; width:90px; overflow:hidden; text-overflow: ellipsis; white-space:nowrap;} +.layim_chatlist li em{display:none; position:absolute; top:6px; right:10px; height:18px; line-height:18px;width:18px;text-align: center;font-size:14px;font-weight:900; border-radius:3px;} +.layim_chatlist li em:hover{background-color: #FCBE00; color:#fff;} +.layim_chatlist .layim_chatnow,.layim_chatlist .layim_chatnow:hover{/*border-top:1px solid #D9D9D9; border-bottom:1px solid #D9D9D9;*/ background-color:#fff;} +.layim_chat{} +.layim_chatarea{height:280px;} +.layim_chatview{display:none; height:280px; overflow:hidden;} +.layim_chatmore:hover, .layim_groups:hover, .layim_chatview:hover{overflow-y:auto;} +.layim_chatview li{margin-bottom:10px; clear:both; *zoom:1;} +.layim_chatview li:after{content:'\20'; clear:both; *zoom:1; display:block; height:0;} + +.layim_chatthis{display:block;} +.layim_chatuser{float:left; padding:15px; font-size:0;} +.layim_chatuser *{display:inline-block; *display:inline; *zoom:1; vertical-align:top; line-height:30px; font-size:12px; padding-right:10px;} +.layim_chatuser img{width:30px; height:30px;padding-right: 0;margin-right: 15px;} +.layim_chatuser .layim_chatname{max-width:230px; overflow:hidden; text-overflow: ellipsis; white-space:nowrap;} +.layim_chatuser .layim_chattime{color:#999; padding-left:10px;} +.layim_chatsay{position:relative; float:left; margin:0 15px; padding:10px; line-height:20px; background-color:#F3F3F3; border-radius:3px; clear:both;} +.layim_chatsay .layim_zero{left:5px; top:-8px; border-width:8px; border-right-style:solid; border-right-color:#F3F3F3;} +.layim_chateme .layim_chatuser{float:right;} +.layim_chateme .layim_chatuser *{padding-right:0; padding-left:10px;} +.layim_chateme .layim_chatuser img{margin-left:15px;padding-left: 0;} +.layim_chateme .layim_chatsay .layim_zero{left:auto; right:10px;} +.layim_chateme .layim_chatuser .layim_chattime{padding-left:0; padding-right:10px;} +.layim_chateme .layim_chatsay{float:right; background-color:#EBFBE3} +.layim_chateme .layim_zero{border-right-color:#EBFBE3;} +.layim_groups{display:none; float:right; width:130px; border-left:1px solid #D9D9D9; background-color:#fff;} +.layim_groups ul{display:none;} +.layim_groups ul.layim_groupthis{display:block;} +.layim_groups li *{display:inline-block; *display:inline; *zoom:1; vertical-align:top; margin-right:10px;} +.layim_groups li img{width:20px; height:20px; margin-top:5px;} +.layim_groups li span{max-width:80px; overflow:hidden; text-overflow: ellipsis; white-space:nowrap;} +.layim_groups li:hover{background-color:#F3F3F3;} +.layim_groups .layim_errors{text-align:center; color:#999;} +.layim_tool{position:relative; height:35px; line-height:35px; padding-left:10px; background-color:#F3F3F3;} +.layim_tool i{position:relative; top:10px; display:inline-block; *display:inline; *zoom:1; vertical-align:top; width:16px; height:16px; margin-right:10px; cursor:pointer;font-size:16px;color:#999;font-weight: 700;} +.layim_tool i:hover{color:#FFA00A;} +.layim_tool .layim_seechatlog{position:absolute; right:15px;} +.layim_tool .layim_seechatlog i{} +.layim_write{display:block; border:none; width:98%; height:90px; line-height:20px; margin:5px auto 0;} +.layim_send{position:relative; height:40px; background-color:#F3F3F3;} +.layim_sendbtn{position:absolute; height:26px; line-height:26px; right:10px; top:8px; padding:0 40px 0 20px; background-color:#FFA00A; color:#fff; border-radius:3px; cursor:pointer;} +.layim_enter{position:absolute; right:0; border-left:1px solid #FFB94F; width:24px; height:26px;} +.layim_enter:hover{background-color:#E68A00; border-radius:0 3px 3px 0;} +.layim_enter .layim_zero{left:7px; top:11px; border-width:5px; border-top-style:solid; border-top-color:#FFE0B3;} +.layim_sendtype{display:none; position:absolute; right:10px; bottom:37px; border:1px solid #D9D9D9; background-color:#fff; text-align:left;} +.layim_sendtype span{display:block; line-height:24px; padding:0 10px 0 25px; cursor:pointer;} +.layim_sendtype span:hover{background-color:#F3F3F3;} +.layim_sendtype span i{left:5px;} + +.layim_min{display:none; position:absolute; left:-190px; bottom:-1px; width:160px; height:32px; line-height:32px; padding:0 10px; overflow:hidden; text-overflow: ellipsis; white-space:nowrap; border:1px solid #ccc; box-shadow: 0 0 5px rgba(0,0,75,.2); background-color:#FCFDFA; cursor:pointer;} + + + + + + + + + + + + + diff --git a/app-manage/src/main/resources/public/static/js/plugins/layer/layim/layim.js b/app-manage/src/main/resources/public/static/js/plugins/layer/layim/layim.js new file mode 100644 index 0000000..52f0083 --- /dev/null +++ b/app-manage/src/main/resources/public/static/js/plugins/layer/layim/layim.js @@ -0,0 +1,630 @@ +/* + + @Name: layui WebIM 1.0.0 + @Author:贤心 + @Date: 2014-04-25 + @Blog: http://sentsin.com + + */ + +;!function(win, undefined){ + +var config = { + msgurl: 'mailbox.html?msg=', + chatlogurl: 'mailbox.html?user=', + aniTime: 200, + right: -232, + api: { + friend: 'js/plugins/layer/layim/data/friend.json', //好友列表接口 + group: 'js/plugins/layer/layim/data/group.json', //群组列表接口 + chatlog: 'js/plugins/layer/layim/data/chatlog.json', //聊天记录接口 + groups: 'js/plugins/layer/layim/data/groups.json', //群组成员接口 + sendurl: '' //发送消息接口 + }, + user: { //当前用户信息 + name: '游客', + face: 'img/a1.jpg' + }, + + //自动回复内置文案,也可动态读取数据库配置 + autoReplay: [ + '您好,我现在有事不在,一会再和您联系。', + '你没发错吧?', + '洗澡中,请勿打扰,偷窥请购票,个体四十,团体八折,订票电话:一般人我不告诉他!', + '你好,我是主人的美女秘书,有什么事就跟我说吧,等他回来我会转告他的。', + '我正在拉磨,没法招呼您,因为我们家毛驴去动物保护协会把我告了,说我剥夺它休产假的权利。', + '<(@ ̄︶ ̄@)>', + '你要和我说话?你真的要和我说话?你确定自己想说吗?你一定非说不可吗?那你说吧,这是自动回复。', + '主人正在开机自检,键盘鼠标看好机会出去凉快去了,我是他的电冰箱,我打字比较慢,你慢慢说,别急……', + '(*^__^*) 嘻嘻,是贤心吗?' + ], + + + chating: {}, + hosts: (function(){ + var dk = location.href.match(/\:\d+/); + dk = dk ? dk[0] : ''; + return 'http://' + document.domain + dk + '/'; + })(), + json: function(url, data, callback, error){ + return $.ajax({ + type: 'POST', + url: url, + data: data, + dataType: 'json', + success: callback, + error: error + }); + }, + stopMP: function(e){ + e ? e.stopPropagation() : e.cancelBubble = true; + } +}, dom = [$(window), $(document), $('html'), $('body')], xxim = {}; + +//主界面tab +xxim.tabs = function(index){ + var node = xxim.node; + node.tabs.eq(index).addClass('xxim_tabnow').siblings().removeClass('xxim_tabnow'); + node.list.eq(index).show().siblings('.xxim_list').hide(); + if(node.list.eq(index).find('li').length === 0){ + xxim.getDates(index); + } +}; + +//节点 +xxim.renode = function(){ + var node = xxim.node = { + tabs: $('#xxim_tabs>span'), + list: $('.xxim_list'), + online: $('.xxim_online'), + setonline: $('.xxim_setonline'), + onlinetex: $('#xxim_onlinetex'), + xximon: $('#xxim_on'), + layimFooter: $('#xxim_bottom'), + xximHide: $('#xxim_hide'), + xximSearch: $('#xxim_searchkey'), + searchMian: $('#xxim_searchmain'), + closeSearch: $('#xxim_closesearch'), + layimMin: $('#layim_min') + }; +}; + +//主界面缩放 +xxim.expend = function(){ + var node = xxim.node; + if(xxim.layimNode.attr('state') !== '1'){ + xxim.layimNode.stop().animate({right: config.right}, config.aniTime, function(){ + node.xximon.addClass('xxim_off'); + try{ + localStorage.layimState = 1; + }catch(e){} + xxim.layimNode.attr({state: 1}); + node.layimFooter.addClass('xxim_expend').stop().animate({marginLeft: config.right}, config.aniTime/2); + node.xximHide.addClass('xxim_show'); + }); + } else { + xxim.layimNode.stop().animate({right: 1}, config.aniTime, function(){ + node.xximon.removeClass('xxim_off'); + try{ + localStorage.layimState = 2; + }catch(e){} + xxim.layimNode.removeAttr('state'); + node.layimFooter.removeClass('xxim_expend'); + node.xximHide.removeClass('xxim_show'); + }); + node.layimFooter.stop().animate({marginLeft: 0}, config.aniTime); + } +}; + +//初始化窗口格局 +xxim.layinit = function(){ + var node = xxim.node; + + //主界面 + try{ + /* + if(!localStorage.layimState){ + config.aniTime = 0; + localStorage.layimState = 1; + } + */ + if(localStorage.layimState === '1'){ + xxim.layimNode.attr({state: 1}).css({right: config.right}); + node.xximon.addClass('xxim_off'); + node.layimFooter.addClass('xxim_expend').css({marginLeft: config.right}); + node.xximHide.addClass('xxim_show'); + } + }catch(e){ + //layer.msg(e.message, 5, -1); + } +}; + +//聊天窗口 +xxim.popchat = function(param){ + var node = xxim.node, log = {}; + + log.success = function(layero){ + layer.setMove(); + + xxim.chatbox = layero.find('#layim_chatbox'); + log.chatlist = xxim.chatbox.find('.layim_chatmore>ul'); + + log.chatlist.html('
  • '+ param.name +'×
  • ') + xxim.tabchat(param, xxim.chatbox); + + //最小化聊天窗 + xxim.chatbox.find('.layer_setmin').on('click', function(){ + var indexs = layero.attr('times'); + layero.hide(); + node.layimMin.text(xxim.nowchat.name).show(); + }); + + //关闭窗口 + xxim.chatbox.find('.layim_close').on('click', function(){ + var indexs = layero.attr('times'); + layer.close(indexs); + xxim.chatbox = null; + config.chating = {}; + config.chatings = 0; + }); + + //关闭某个聊天 + log.chatlist.on('mouseenter', 'li', function(){ + $(this).find('em').show(); + }).on('mouseleave', 'li', function(){ + $(this).find('em').hide(); + }); + log.chatlist.on('click', 'li em', function(e){ + var parents = $(this).parent(), dataType = parents.attr('type'); + var dataId = parents.attr('data-id'), index = parents.index(); + var chatlist = log.chatlist.find('li'), indexs; + + config.stopMP(e); + + delete config.chating[dataType + dataId]; + config.chatings--; + + parents.remove(); + $('#layim_area'+ dataType + dataId).remove(); + if(dataType === 'group'){ + $('#layim_group'+ dataType + dataId).remove(); + } + + if(parents.hasClass('layim_chatnow')){ + if(index === config.chatings){ + indexs = index - 1; + } else { + indexs = index + 1; + } + xxim.tabchat(config.chating[chatlist.eq(indexs).attr('type') + chatlist.eq(indexs).attr('data-id')]); + } + + if(log.chatlist.find('li').length === 1){ + log.chatlist.parent().hide(); + } + }); + + //聊天选项卡 + log.chatlist.on('click', 'li', function(){ + var othis = $(this), dataType = othis.attr('type'), dataId = othis.attr('data-id'); + xxim.tabchat(config.chating[dataType + dataId]); + }); + + //发送热键切换 + log.sendType = $('#layim_sendtype'), log.sendTypes = log.sendType.find('span'); + $('#layim_enter').on('click', function(e){ + config.stopMP(e); + log.sendType.show(); + }); + log.sendTypes.on('click', function(){ + log.sendTypes.find('i').text('') + $(this).find('i').text('√'); + }); + + xxim.transmit(); + }; + + log.html = '
    ' + +'
    ' + +'' + +' ' + +' '+ param.name +'' + +' ' + +' ' + +' ×' + +' ' + +'
    ' + +'
    ' + +'
      ' + +'
      ' + +'
      ' + +'
      ' + +'
      ' + +'
        ' + +'
        ' + +'
        ' + +' ' + +' ' + +' ' + +' 聊天记录' + +'
        ' + +' ' + +'
        ' + +'
        发送
        ' + +'
        ' + +' 按Enter键发送' + +' 按Ctrl+Enter键发送' + +'
        ' + +'
        ' + +'
        ' + +'
        '; + + if(config.chatings < 1){ + $.layer({ + type: 1, + border: [0], + title: false, + shade: [0], + area: ['620px', '493px'], + move: '.layim_chatbox .layim_move', + moveType: 1, + closeBtn: false, + offset: [(($(window).height() - 493)/2)+'px', ''], + page: { + html: log.html + }, success: function(layero){ + log.success(layero); + } + }) + } else { + log.chatmore = xxim.chatbox.find('#layim_chatmore'); + log.chatarea = xxim.chatbox.find('#layim_chatarea'); + + log.chatmore.show(); + + log.chatmore.find('ul>li').removeClass('layim_chatnow'); + log.chatmore.find('ul').append('
      • '+ param.name +'×
      • '); + + log.chatarea.find('.layim_chatview').removeClass('layim_chatthis'); + log.chatarea.append('
          '); + + xxim.tabchat(param); + } + + //群组 + log.chatgroup = xxim.chatbox.find('#layim_groups'); + if(param.type === 'group'){ + log.chatgroup.find('ul').removeClass('layim_groupthis'); + log.chatgroup.append('
            '); + xxim.getGroups(param); + } + //点击群员切换聊天窗 + log.chatgroup.on('click', 'ul>li', function(){ + xxim.popchatbox($(this)); + }); +}; + +//定位到某个聊天队列 +xxim.tabchat = function(param){ + var node = xxim.node, log = {}, keys = param.type + param.id; + xxim.nowchat = param; + + xxim.chatbox.find('#layim_user'+ keys).addClass('layim_chatnow').siblings().removeClass('layim_chatnow'); + xxim.chatbox.find('#layim_area'+ keys).addClass('layim_chatthis').siblings().removeClass('layim_chatthis'); + xxim.chatbox.find('#layim_group'+ keys).addClass('layim_groupthis').siblings().removeClass('layim_groupthis'); + + xxim.chatbox.find('.layim_face>img').attr('src', param.face); + xxim.chatbox.find('.layim_face, .layim_names').attr('href', param.href); + xxim.chatbox.find('.layim_names').text(param.name); + + xxim.chatbox.find('.layim_seechatlog').attr('href', config.chatlogurl + param.id); + + log.groups = xxim.chatbox.find('.layim_groups'); + if(param.type === 'group'){ + log.groups.show(); + } else { + log.groups.hide(); + } + + $('#layim_write').focus(); + +}; + +//弹出聊天窗 +xxim.popchatbox = function(othis){ + var node = xxim.node, dataId = othis.attr('data-id'), param = { + id: dataId, //用户ID + type: othis.attr('type'), + name: othis.find('.xxim_onename').text(), //用户名 + face: othis.find('.xxim_oneface').attr('src'), //用户头像 + href: 'profile.html?user=' + dataId //用户主页 + }, key = param.type + dataId; + if(!config.chating[key]){ + xxim.popchat(param); + config.chatings++; + } else { + xxim.tabchat(param); + } + config.chating[key] = param; + + var chatbox = $('#layim_chatbox'); + if(chatbox[0]){ + node.layimMin.hide(); + chatbox.parents('.xubox_layer').show(); + } +}; + +//请求群员 +xxim.getGroups = function(param){ + var keys = param.type + param.id, str = '', + groupss = xxim.chatbox.find('#layim_group'+ keys); + groupss.addClass('loading'); + config.json(config.api.groups, {}, function(datas){ + if(datas.status === 1){ + var ii = 0, lens = datas.data.length; + if(lens > 0){ + for(; ii < lens; ii++){ + str += '
          • '+ datas.data[ii].name +'
          • '; + } + } else { + str = '
          • 没有群员
          • '; + } + + } else { + str = '
          • '+ datas.msg +'
          • '; + } + groupss.removeClass('loading'); + groupss.html(str); + }, function(){ + groupss.removeClass('loading'); + groupss.html('
          • 请求异常
          • '); + }); +}; + +//消息传输 +xxim.transmit = function(){ + var node = xxim.node, log = {}; + node.sendbtn = $('#layim_sendbtn'); + node.imwrite = $('#layim_write'); + + //发送 + log.send = function(){ + var data = { + content: node.imwrite.val(), + id: xxim.nowchat.id, + sign_key: '', //密匙 + _: +new Date + }; + + if(data.content.replace(/\s/g, '') === ''){ + layer.tips('说点啥呗!', '#layim_write', 2); + node.imwrite.focus(); + } else { + //此处皆为模拟 + var keys = xxim.nowchat.type + xxim.nowchat.id; + + //聊天模版 + log.html = function(param, type){ + return '
          • ' + +'
            ' + + function(){ + if(type === 'me'){ + return ''+ param.time +'' + +''+ param.name +'' + +''; + } else { + return '' + +''+ param.name +'' + +''+ param.time +''; + } + }() + +'
            ' + +'
            '+ param.content +'
            ' + +'
          • '; + }; + + log.imarea = xxim.chatbox.find('#layim_area'+ keys); + + log.imarea.append(log.html({ + time: '2014-04-26 0:37', + name: config.user.name, + face: config.user.face, + content: data.content + }, 'me')); + node.imwrite.val('').focus(); + log.imarea.scrollTop(log.imarea[0].scrollHeight); + + setTimeout(function(){ + log.imarea.append(log.html({ + time: '2014-04-26 0:38', + name: xxim.nowchat.name, + face: xxim.nowchat.face, + content: config.autoReplay[(Math.random()*config.autoReplay.length) | 0] + })); + log.imarea.scrollTop(log.imarea[0].scrollHeight); + }, 500); + + /* + that.json(config.api.sendurl, data, function(datas){ + + }); + */ + } + + }; + node.sendbtn.on('click', log.send); + + node.imwrite.keyup(function(e){ + if(e.keyCode === 13){ + log.send(); + } + }); +}; + +//事件 +xxim.event = function(){ + var node = xxim.node; + + //主界面tab + node.tabs.eq(0).addClass('xxim_tabnow'); + node.tabs.on('click', function(){ + var othis = $(this), index = othis.index(); + xxim.tabs(index); + }); + + //列表展收 + node.list.on('click', 'h5', function(){ + var othis = $(this), chat = othis.siblings('.xxim_chatlist'), parentss = othis.find("i"); + if(parentss.hasClass('fa-caret-down')){ + chat.hide(); + parentss.attr('class','fa fa-caret-right'); + } else { + chat.show(); + parentss.attr('class','fa fa-caret-down'); + } + }); + + //设置在线隐身 + node.online.on('click', function(e){ + config.stopMP(e); + node.setonline.show(); + }); + node.setonline.find('span').on('click', function(e){ + var index = $(this).index(); + config.stopMP(e); + if(index === 0){ + node.onlinetex.html('在线'); + node.online.removeClass('xxim_offline'); + } else if(index === 1) { + node.onlinetex.html('隐身'); + node.online.addClass('xxim_offline'); + } + node.setonline.hide(); + }); + + node.xximon.on('click', xxim.expend); + node.xximHide.on('click', xxim.expend); + + //搜索 + node.xximSearch.keyup(function(){ + var val = $(this).val().replace(/\s/g, ''); + if(val !== ''){ + node.searchMian.show(); + node.closeSearch.show(); + //此处的搜索ajax参考xxim.getDates + node.list.eq(3).html('
          • 没有符合条件的结果
          • '); + } else { + node.searchMian.hide(); + node.closeSearch.hide(); + } + }); + node.closeSearch.on('click', function(){ + $(this).hide(); + node.searchMian.hide(); + node.xximSearch.val('').focus(); + }); + + //弹出聊天窗 + config.chatings = 0; + node.list.on('click', '.xxim_childnode', function(){ + var othis = $(this); + xxim.popchatbox(othis); + }); + + //点击最小化栏 + node.layimMin.on('click', function(){ + $(this).hide(); + $('#layim_chatbox').parents('.xubox_layer').show(); + }); + + + //document事件 + dom[1].on('click', function(){ + node.setonline.hide(); + $('#layim_sendtype').hide(); + }); +}; + +//请求列表数据 +xxim.getDates = function(index){ + var api = [config.api.friend, config.api.group, config.api.chatlog], + node = xxim.node, myf = node.list.eq(index); + myf.addClass('loading'); + config.json(api[index], {}, function(datas){ + if(datas.status === 1){ + var i = 0, myflen = datas.data.length, str = '', item; + if(myflen > 1){ + if(index !== 2){ + for(; i < myflen; i++){ + str += '
          • ' + +'
            '+ datas.data[i].name +'('+ datas.data[i].nums +')
            ' + +'
              '; + item = datas.data[i].item; + for(var j = 0; j < item.length; j++){ + str += '
            • '+ item[j].name +'
            • '; + } + str += '
          • '; + } + } else { + str += '
          • ' + +'
              '; + for(; i < myflen; i++){ + str += '
            • '+ datas.data[i].name +''+ datas.data[i].time +'
            • '; + } + str += '
          • '; + } + myf.html(str); + } else { + myf.html('
          • 没有任何数据
          • '); + } + myf.removeClass('loading'); + } else { + myf.html('
          • '+ datas.msg +'
          • '); + } + }, function(){ + myf.html('
          • 请求失败
          • '); + myf.removeClass('loading'); + }); +}; + +//渲染骨架 +xxim.view = (function(){ + var xximNode = xxim.layimNode = $('
            ' + +'
            ' + +' ' + +'
            ' + +'
              ' + +'
                ' + +'
                  ' + +'
                    ' + +'
                    ' + +'
                      ' + +'
                    • ' + +'在线' + +'
                      ' + +'在线' + +'隐身' + +'
                      ' + +'
                    • ' + +'
                    • ' + +'
                    • ' + +'' + +'
                      ' + + +'
                      ' + +'
                    • ' + +'
                    • ' + +'
                    • ' + +'
                      ' + +'
                    ' + +'
                    '); + dom[3].append(xximNode); + + xxim.renode(); + xxim.getDates(0); + xxim.event(); + xxim.layinit(); +}()); + +}(window); + diff --git a/app-manage/src/main/resources/public/static/js/plugins/layer/layim/loading.gif b/app-manage/src/main/resources/public/static/js/plugins/layer/layim/loading.gif new file mode 100644 index 0000000..059b1ac Binary files /dev/null and b/app-manage/src/main/resources/public/static/js/plugins/layer/layim/loading.gif differ diff --git a/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/icon-ext.png b/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/icon-ext.png new file mode 100644 index 0000000..bbbb669 Binary files /dev/null and b/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/icon-ext.png differ diff --git a/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/icon.png b/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/icon.png new file mode 100644 index 0000000..b5c8f1e Binary files /dev/null and b/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/icon.png differ diff --git a/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/icon_ext.png b/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/icon_ext.png new file mode 100644 index 0000000..8baee59 Binary files /dev/null and b/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/icon_ext.png differ diff --git a/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/loading-0.gif b/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/loading-0.gif new file mode 100644 index 0000000..6f3c953 Binary files /dev/null and b/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/loading-0.gif differ diff --git a/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/loading-1.gif b/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/loading-1.gif new file mode 100644 index 0000000..db3a483 Binary files /dev/null and b/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/loading-1.gif differ diff --git a/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/loading-2.gif b/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/loading-2.gif new file mode 100644 index 0000000..5bb90fd Binary files /dev/null and b/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/loading-2.gif differ diff --git a/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/textbg.png b/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/textbg.png new file mode 100644 index 0000000..ad1040c Binary files /dev/null and b/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/textbg.png differ diff --git a/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/xubox_ico0.png b/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/xubox_ico0.png new file mode 100644 index 0000000..7754a47 Binary files /dev/null and b/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/xubox_ico0.png differ diff --git a/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/xubox_loading0.gif b/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/xubox_loading0.gif new file mode 100644 index 0000000..6f3c953 Binary files /dev/null and b/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/xubox_loading0.gif differ diff --git a/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/xubox_loading1.gif b/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/xubox_loading1.gif new file mode 100644 index 0000000..db3a483 Binary files /dev/null and b/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/xubox_loading1.gif differ diff --git a/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/xubox_loading2.gif b/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/xubox_loading2.gif new file mode 100644 index 0000000..5bb90fd Binary files /dev/null and b/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/xubox_loading2.gif differ diff --git a/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/xubox_loading3.gif b/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/xubox_loading3.gif new file mode 100644 index 0000000..fbe57be Binary files /dev/null and b/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/xubox_loading3.gif differ diff --git a/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/xubox_title0.png b/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/xubox_title0.png new file mode 100644 index 0000000..4ffbe31 Binary files /dev/null and b/app-manage/src/main/resources/public/static/js/plugins/layer/skin/default/xubox_title0.png differ diff --git a/app-manage/src/main/resources/public/static/js/plugins/layer/skin/layer.css b/app-manage/src/main/resources/public/static/js/plugins/layer/skin/layer.css new file mode 100644 index 0000000..c6bc000 --- /dev/null +++ b/app-manage/src/main/resources/public/static/js/plugins/layer/skin/layer.css @@ -0,0 +1,7 @@ +/*! + + @Name: layer's style + @Author: 贤心 + @Blog: sentsin.com + + */*html{background-image:url(about:blank);background-attachment:fixed}html #layui_layer_skinlayercss{display:none;position:absolute;width:1989px}.layui-layer,.layui-layer-shade{position:fixed;_position:absolute;pointer-events:auto}.layui-layer-shade{top:0;left:0;width:100%;height:100%;_height:expression(document.body.offsetHeight+"px")}.layui-layer{top:150px;left:50%;margin:0;padding:0;background-color:#fff;-webkit-background-clip:content;box-shadow:1px 1px 50px rgba(0,0,0,.3);border-radius:2px;-webkit-animation-fill-mode:both;animation-fill-mode:both;-webkit-animation-duration:.3s;animation-duration:.3s}.layui-layer-close{position:absolute}.layui-layer-content{position:relative}.layui-layer-border{border:1px solid #B2B2B2;border:1px solid rgba(0,0,0,.3);box-shadow:1px 1px 5px rgba(0,0,0,.2)}.layui-layer-moves{position:absolute;border:3px solid #666;border:3px solid rgba(0,0,0,.5);cursor:move;background-color:#fff;background-color:rgba(255,255,255,.3);filter:alpha(opacity=50)}.layui-layer-load{background:url(default/loading-0.gif) center center no-repeat #fff}.layui-layer-ico{background:url(default/icon.png) no-repeat}.layui-layer-btn a,.layui-layer-dialog .layui-layer-ico,.layui-layer-setwin a{display:inline-block;*display:inline;*zoom:1;vertical-align:top}@-webkit-keyframes bounceIn{0%{opacity:0;-webkit-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);transform:scale(1)}}@keyframes bounceIn{0%{opacity:0;-webkit-transform:scale(.5);-ms-transform:scale(.5);transform:scale(.5)}100%{opacity:1;-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layui-anim{-webkit-animation-name:bounceIn;animation-name:bounceIn}@-webkit-keyframes bounceOut{100%{opacity:0;-webkit-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.03);transform:scale(1.03)}0%{-webkit-transform:scale(1);transform:scale(1)}}@keyframes bounceOut{100%{opacity:0;-webkit-transform:scale(.7);-ms-transform:scale(.7);transform:scale(.7)}30%{-webkit-transform:scale(1.03);-ms-transform:scale(1.03);transform:scale(1.03)}0%{-webkit-transform:scale(1);-ms-transform:scale(1);transform:scale(1)}}.layui-anim-close{-webkit-animation-name:bounceOut;animation-name:bounceOut;-webkit-animation-duration:.2s;animation-duration:.2s}@-webkit-keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes zoomInDown{0%{opacity:0;-webkit-transform:scale(.1) translateY(-2000px);-ms-transform:scale(.1) translateY(-2000px);transform:scale(.1) translateY(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateY(60px);-ms-transform:scale(.475) translateY(60px);transform:scale(.475) translateY(60px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layui-anim-01{-webkit-animation-name:zoomInDown;animation-name:zoomInDown}@-webkit-keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes fadeInUpBig{0%{opacity:0;-webkit-transform:translateY(2000px);-ms-transform:translateY(2000px);transform:translateY(2000px)}100%{opacity:1;-webkit-transform:translateY(0);-ms-transform:translateY(0);transform:translateY(0)}}.layui-anim-02{-webkit-animation-name:fadeInUpBig;animation-name:fadeInUpBig}@-webkit-keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}@keyframes zoomInLeft{0%{opacity:0;-webkit-transform:scale(.1) translateX(-2000px);-ms-transform:scale(.1) translateX(-2000px);transform:scale(.1) translateX(-2000px);-webkit-animation-timing-function:ease-in-out;animation-timing-function:ease-in-out}60%{opacity:1;-webkit-transform:scale(.475) translateX(48px);-ms-transform:scale(.475) translateX(48px);transform:scale(.475) translateX(48px);-webkit-animation-timing-function:ease-out;animation-timing-function:ease-out}}.layui-anim-03{-webkit-animation-name:zoomInLeft;animation-name:zoomInLeft}@-webkit-keyframes rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}@keyframes rollIn{0%{opacity:0;-webkit-transform:translateX(-100%) rotate(-120deg);-ms-transform:translateX(-100%) rotate(-120deg);transform:translateX(-100%) rotate(-120deg)}100%{opacity:1;-webkit-transform:translateX(0) rotate(0);-ms-transform:translateX(0) rotate(0);transform:translateX(0) rotate(0)}}.layui-anim-04{-webkit-animation-name:rollIn;animation-name:rollIn}@keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-anim-05{-webkit-animation-name:fadeIn;animation-name:fadeIn}@-webkit-keyframes shake{0%,100%{-webkit-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);transform:translateX(10px)}}@keyframes shake{0%,100%{-webkit-transform:translateX(0);-ms-transform:translateX(0);transform:translateX(0)}10%,30%,50%,70%,90%{-webkit-transform:translateX(-10px);-ms-transform:translateX(-10px);transform:translateX(-10px)}20%,40%,60%,80%{-webkit-transform:translateX(10px);-ms-transform:translateX(10px);transform:translateX(10px)}}.layui-anim-06{-webkit-animation-name:shake;animation-name:shake}@-webkit-keyframes fadeIn{0%{opacity:0}100%{opacity:1}}.layui-layer-title{padding:0 80px 0 20px;height:42px;line-height:42px;border-bottom:1px solid #eee;font-size:14px;color:#333;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;background-color:#F8F8F8}.layui-layer-setwin{position:absolute;right:15px;*right:0;top:15px;font-size:0;line-height:initial}.layui-layer-setwin a{position:relative;width:16px;height:16px;margin-left:10px;font-size:12px;_overflow:hidden}.layui-layer-setwin .layui-layer-min cite{position:absolute;width:14px;height:2px;left:0;top:50%;margin-top:-1px;background-color:#2E2D3C;cursor:pointer;_overflow:hidden}.layui-layer-setwin .layui-layer-min:hover cite{background-color:#2D93CA}.layui-layer-setwin .layui-layer-max{background-position:-32px -40px}.layui-layer-setwin .layui-layer-max:hover{background-position:-16px -40px}.layui-layer-setwin .layui-layer-maxmin{background-position:-65px -40px}.layui-layer-setwin .layui-layer-maxmin:hover{background-position:-49px -40px}.layui-layer-setwin .layui-layer-close1{background-position:0 -40px;cursor:pointer}.layui-layer-setwin .layui-layer-close1:hover{opacity:.7}.layui-layer-setwin .layui-layer-close2{position:absolute;right:-28px;top:-28px;width:30px;height:30px;margin-left:0;background-position:-150px -31px;*right:-18px;_display:none}.layui-layer-setwin .layui-layer-close2:hover{background-position:-181px -31px}.layui-layer-btn{text-align:right;padding:0 10px 12px;pointer-events:auto}.layui-layer-btn a{height:28px;line-height:28px;margin:0 6px;padding:0 15px;border:1px solid #dedede;background-color:#f1f1f1;color:#333;border-radius:2px;font-weight:400;cursor:pointer;text-decoration:none}.layui-layer-btn a:hover{opacity:.9;text-decoration:none}.layui-layer-btn a:active{opacity:.7}.layui-layer-btn .layui-layer-btn0{border-color:#4898d5;background-color:#2e8ded;color:#fff}.layui-layer-dialog{min-width:260px}.layui-layer-dialog .layui-layer-content{position:relative;padding:20px;line-height:24px;word-break:break-all;font-size:14px;overflow:auto}.layui-layer-dialog .layui-layer-content .layui-layer-ico{position:absolute;top:16px;left:15px;_left:-40px;width:30px;height:30px}.layui-layer-ico1{background-position:-30px 0}.layui-layer-ico2{background-position:-60px 0}.layui-layer-ico3{background-position:-90px 0}.layui-layer-ico4{background-position:-120px 0}.layui-layer-ico5{background-position:-150px 0}.layui-layer-ico6{background-position:-180px 0}.layui-layer-rim{border:6px solid #8D8D8D;border:6px solid rgba(0,0,0,.3);border-radius:5px;box-shadow:none}.layui-layer-msg{min-width:180px;border:1px solid #D3D4D3;box-shadow:none}.layui-layer-hui{min-width:100px;background-color:#000;filter:alpha(opacity=60);background-color:rgba(0,0,0,.6);color:#fff;border:none}.layui-layer-hui .layui-layer-content{padding:12px 25px;text-align:center}.layui-layer-dialog .layui-layer-padding{padding:20px 20px 20px 55px;text-align:left}.layui-layer-page .layui-layer-content{position:relative;overflow:auto}.layui-layer-iframe .layui-layer-btn,.layui-layer-page .layui-layer-btn{padding-top:10px}.layui-layer-nobg{background:0 0}.layui-layer-iframe .layui-layer-content{overflow:hidden}.layui-layer-iframe iframe{display:block;width:100%}.layui-layer-loading{border-radius:100%;background:0 0;box-shadow:none;border:none}.layui-layer-loading .layui-layer-content{width:60px;height:24px;background:url(default/loading-0.gif) no-repeat}.layui-layer-loading .layui-layer-loading1{width:37px;height:37px;background:url(default/loading-1.gif) no-repeat}.layui-layer-ico16,.layui-layer-loading .layui-layer-loading2{width:32px;height:32px;background:url(default/loading-2.gif) no-repeat}.layui-layer-tips{background:0 0;box-shadow:none;border:none}.layui-layer-tips .layui-layer-content{position:relative;line-height:22px;min-width:12px;padding:5px 10px;font-size:12px;_float:left;border-radius:3px;box-shadow:1px 1px 3px rgba(0,0,0,.3);background-color:#F90;color:#fff}.layui-layer-tips .layui-layer-close{right:-2px;top:-1px}.layui-layer-tips i.layui-layer-TipsG{position:absolute;width:0;height:0;border-width:8px;border-color:transparent;border-style:dashed;*overflow:hidden}.layui-layer-tips i.layui-layer-TipsB,.layui-layer-tips i.layui-layer-TipsT{left:5px;border-right-style:solid;border-right-color:#F90}.layui-layer-tips i.layui-layer-TipsT{bottom:-8px}.layui-layer-tips i.layui-layer-TipsB{top:-8px}.layui-layer-tips i.layui-layer-TipsL,.layui-layer-tips i.layui-layer-TipsR{top:1px;border-bottom-style:solid;border-bottom-color:#F90}.layui-layer-tips i.layui-layer-TipsR{left:-8px}.layui-layer-tips i.layui-layer-TipsL{right:-8px}.layui-layer-lan[type=dialog]{min-width:280px}.layui-layer-lan .layui-layer-title{background:#4476A7;color:#fff;border:none}.layui-layer-lan .layui-layer-lan .layui-layer-btn{padding:10px;text-align:right;border-top:1px solid #E9E7E7}.layui-layer-lan .layui-layer-btn a{background:#BBB5B5;border:none}.layui-layer-lan .layui-layer-btn .layui-layer-btn1{background:#C9C5C5}.layui-layer-molv .layui-layer-title{background:#009f95;color:#fff;border:none}.layui-layer-molv .layui-layer-btn a{background:#009f95}.layui-layer-molv .layui-layer-btn .layui-layer-btn1{background:#92B8B1} diff --git a/app-manage/src/main/resources/public/static/js/plugins/layer/skin/layer.ext.css b/app-manage/src/main/resources/public/static/js/plugins/layer/skin/layer.ext.css new file mode 100644 index 0000000..95c9bb4 --- /dev/null +++ b/app-manage/src/main/resources/public/static/js/plugins/layer/skin/layer.ext.css @@ -0,0 +1,8 @@ +/*! + + @Name: layer拓展样式 + @Date: 2012.12.13 + @Author: 贤心 + @blog: sentsin.com + + */.layui-layer-imgbar,.layui-layer-imgtit a,.layui-layer-tab .layui-layer-title span{text-overflow:ellipsis;white-space:nowrap}.layui-layer-iconext{background:url(default/icon-ext.png) no-repeat}html #layui_layer_skinlayerextcss{display:none;position:absolute;width:1989px}.layui-layer-prompt .layui-layer-input{display:block;width:220px;height:30px;margin:0 auto;line-height:30px;padding:0 5px;border:1px solid #ccc;box-shadow:1px 1px 5px rgba(0,0,0,.1) inset;color:#333}.layui-layer-prompt textarea.layui-layer-input{width:300px;height:100px;line-height:20px}.layui-layer-tab{box-shadow:1px 1px 50px rgba(0,0,0,.4)}.layui-layer-tab .layui-layer-title{padding-left:0;border-bottom:1px solid #ccc;background-color:#eee;overflow:visible}.layui-layer-tab .layui-layer-title span{position:relative;float:left;min-width:80px;max-width:260px;padding:0 20px;text-align:center;cursor:default;overflow:hidden}.layui-layer-tab .layui-layer-title span.layui-layer-tabnow{height:43px;border-left:1px solid #ccc;border-right:1px solid #ccc;background-color:#fff;z-index:10}.layui-layer-tab .layui-layer-title span:first-child{border-left:none}.layui-layer-tabmain{line-height:24px;clear:both}.layui-layer-tabmain .layui-layer-tabli{display:none}.layui-layer-tabmain .layui-layer-tabli.xubox_tab_layer{display:block}.xubox_tabclose{position:absolute;right:10px;top:5px;cursor:pointer}.layui-layer-photos{-webkit-animation-duration:1s;animation-duration:1s;background:url(default/xubox_loading1.gif) center center no-repeat #000}.layui-layer-photos .layui-layer-content{overflow:hidden;text-align:center}.layui-layer-photos .layui-layer-phimg img{position:relative;width:100%;display:inline-block;*display:inline;*zoom:1;vertical-align:top}.layui-layer-imgbar,.layui-layer-imguide{display:none}.layui-layer-imgnext,.layui-layer-imgprev{position:absolute;top:50%;width:27px;_width:44px;height:44px;margin-top:-22px;outline:0;blr:expression(this.onFocus=this.blur())}.layui-layer-imgprev{left:10px;background-position:-5px -5px;_background-position:-70px -5px}.layui-layer-imgprev:hover{background-position:-33px -5px;_background-position:-120px -5px}.layui-layer-imgnext{right:10px;_right:8px;background-position:-5px -50px;_background-position:-70px -50px}.layui-layer-imgnext:hover{background-position:-33px -50px;_background-position:-120px -50px}.layui-layer-imgbar{position:absolute;left:0;bottom:0;width:100%;height:32px;line-height:32px;background-color:rgba(0,0,0,.8);background-color:#000\9;filter:Alpha(opacity=80);color:#fff;overflow:hidden;font-size:0}.layui-layer-imgtit *{display:inline-block;*display:inline;*zoom:1;vertical-align:top;font-size:12px}.layui-layer-imgtit a{max-width:65%;overflow:hidden;color:#fff}.layui-layer-imgtit a:hover{color:#fff;text-decoration:underline}.layui-layer-imgtit em{padding-left:10px;font-style:normal} diff --git a/app-manage/src/main/resources/public/static/js/plugins/layer/skin/moon/default.png b/app-manage/src/main/resources/public/static/js/plugins/layer/skin/moon/default.png new file mode 100644 index 0000000..77dfaf3 Binary files /dev/null and b/app-manage/src/main/resources/public/static/js/plugins/layer/skin/moon/default.png differ diff --git a/app-manage/src/main/resources/public/static/js/plugins/layer/skin/moon/style.css b/app-manage/src/main/resources/public/static/js/plugins/layer/skin/moon/style.css new file mode 100644 index 0000000..8a00dc3 --- /dev/null +++ b/app-manage/src/main/resources/public/static/js/plugins/layer/skin/moon/style.css @@ -0,0 +1,141 @@ +/* + * layer皮肤 + * 作者:一☆隐☆一 + * QQ:9073194 + * 请保留这里的信息 谢谢!虽然你不保留我也不能把你怎么样! + */ + +html #layui_layer_skinmoonstylecss { + display: none; + position: absolute; + width: 1989px; +} +body .layer-ext-moon[type="dialog"] { + min-width: 320px; +} +body .layer-ext-moon-msg[type="dialog"]{min-width:200px;} +body .layer-ext-moon .layui-layer-title { + background: #f6f6f6; + color: #212a31; + font-size: 16px; + font-weight: bold; + height: 46px; + line-height: 46px; +} + + + +body .layer-ext-moon .layui-layer-content .layui-layer-ico { + height: 32px; + width: 32px; + top:18.5px; +} +body .layer-ext-moon .layui-layer-ico0 { + background: url(default.png) no-repeat -96px 0; + ; +} +body .layer-ext-moon .layui-layer-ico1 { + background: url(default.png) no-repeat -224px 0; + ; +} +body .layer-ext-moon .layui-layer-ico2 { + background: url(default.png) no-repeat -192px 0; +} +body .layer-ext-moon .layui-layer-ico3 { + background: url(default.png) no-repeat -160px 0; +} +body .layer-ext-moon .layui-layer-ico4 { + background: url(default.png) no-repeat -320px 0; +} +body .layer-ext-moon .layui-layer-ico5 { + background: url(default.png) no-repeat -288px 0; +} +body .layer-ext-moon .layui-layer-ico6 { + background: url(default.png) -256px 0; +} +body .layer-ext-moon .layui-layer-ico7 { + background: url(default.png) no-repeat -128px 0; +} +body .layer-ext-moon .layui-layer-setwin { + top: 15px; + right: 15px; +} +body .layer-ext-moon .layui-layer-setwin a { + width: 16px; + height: 16px; +} +body .layer-ext-moon .layui-layer-setwin .layui-layer-min cite:hover { + background-color: #56abe4; +} +body .layer-ext-moon .layui-layer-setwin .layui-layer-max { + background: url(default.png) no-repeat -80px 0; +} +body .layer-ext-moon .layui-layer-setwin .layui-layer-max:hover { + background: url(default.png) no-repeat -64px 0; +} +body .layer-ext-moon .layui-layer-setwin .layui-layer-maxmin { + background: url(default.png) no-repeat -32px 0; +} +body .layer-ext-moon .layui-layer-setwin .layui-layer-maxmin:hover { + background: url(default.png) no-repeat -16px 0; +} +body .layer-ext-moon .layui-layer-setwin .layui-layer-close1,body .layer-ext-moon .layui-layer-setwin .layui-layer-close2 { + background: url(default.png) 0 0; +} +body .layer-ext-moon .layui-layer-setwin .layui-layer-close1:hover,body .layer-ext-moon .layui-layer-setwin .layui-layer-close2:hover { + background: url(default.png) -48px 0; +} +body .layer-ext-moon .layui-layer-padding{padding-top: 24px;} +body .layer-ext-moon .layui-layer-btn { + padding: 15px 0; + background: #f0f4f7; + border-top: 1px #c7c7c7 solid; +} +body .layer-ext-moon .layui-layer-btn a { + font-size: 12px; + font-weight: normal; + margin: 0 3px; + margin-right: 7px; + margin-left: 7px; + padding: 6px 20px; + color: #fff; + border: 1px solid #0064b6; + background: #0071ce; + border-radius: 3px; + display: inline-block; + height: 20px; + line-height: 20px; + text-align: center; + vertical-align: middle; + background-repeat: no-repeat; + text-decoration: none; + outline: none; + -moz-box-sizing: content-box; + -webkit-box-sizing: content-box; + box-sizing: content-box; +} +body .layer-ext-moon .layui-layer-btn .layui-layer-btn0 { + background: #0071ce; +} +body .layer-ext-moon .layui-layer-btn .layui-layer-btn1 { + background: #fff; + color: #404a58; + border: 1px solid #c0c4cd; + border-radius: 3px; +} +body .layer-ext-moon .layui-layer-btn .layui-layer-btn2 { + background: #f60; + color: #fff; + border: 1px solid #f60; + border-radius: 3px; +} +body .layer-ext-moon .layui-layer-btn .layui-layer-btn3 { + background: #f00; + color: #fff; + border: 1px solid #f00; + border-radius: 3px; +} + +body .layer-ext-moon .layui-layer-title span.layui-layer-tabnow{ + height:46px; +} diff --git a/app-manage/src/main/resources/public/static/js/plugins/metisMenu/jquery.metisMenu.js b/app-manage/src/main/resources/public/static/js/plugins/metisMenu/jquery.metisMenu.js new file mode 100644 index 0000000..a04cdb0 --- /dev/null +++ b/app-manage/src/main/resources/public/static/js/plugins/metisMenu/jquery.metisMenu.js @@ -0,0 +1,120 @@ +/* + * metismenu - v1.1.3 + * Easy menu jQuery plugin for Twitter Bootstrap 3 + * https://github.com/onokumus/metisMenu + * + * Made by Osman Nuri Okumus + * Under MIT License + */ +;(function($, window, document, undefined) { + + var pluginName = "metisMenu", + defaults = { + toggle: true, + doubleTapToGo: false + }; + + function Plugin(element, options) { + this.element = $(element); + this.settings = $.extend({}, defaults, options); + this._defaults = defaults; + this._name = pluginName; + this.init(); + } + + Plugin.prototype = { + init: function() { + + var $this = this.element, + $toggle = this.settings.toggle, + obj = this; + + if (this.isIE() <= 9) { + $this.find("li.active").has("ul").children("ul").collapse("show"); + $this.find("li").not(".active").has("ul").children("ul").collapse("hide"); + } else { + $this.find("li.active").has("ul").children("ul").addClass("collapse in"); + $this.find("li").not(".active").has("ul").children("ul").addClass("collapse"); + } + + //add the "doubleTapToGo" class to active items if needed + if (obj.settings.doubleTapToGo) { + $this.find("li.active").has("ul").children("a").addClass("doubleTapToGo"); + } + + $this.find("li").has("ul").children("a").on("click" + "." + pluginName, function(e) { + e.preventDefault(); + + //Do we need to enable the double tap + if (obj.settings.doubleTapToGo) { + + //if we hit a second time on the link and the href is valid, navigate to that url + if (obj.doubleTapToGo($(this)) && $(this).attr("href") !== "#" && $(this).attr("href") !== "") { + e.stopPropagation(); + document.location = $(this).attr("href"); + return; + } + } + + $(this).parent("li").toggleClass("active").children("ul").collapse("toggle"); + + if ($toggle) { + $(this).parent("li").siblings().removeClass("active").children("ul.in").collapse("hide"); + } + + }); + }, + + isIE: function() { //https://gist.github.com/padolsey/527683 + var undef, + v = 3, + div = document.createElement("div"), + all = div.getElementsByTagName("i"); + + while ( + div.innerHTML = "", + all[0] + ) { + return v > 4 ? v : undef; + } + }, + + //Enable the link on the second click. + doubleTapToGo: function(elem) { + var $this = this.element; + + //if the class "doubleTapToGo" exists, remove it and return + if (elem.hasClass("doubleTapToGo")) { + elem.removeClass("doubleTapToGo"); + return true; + } + + //does not exists, add a new class and return false + if (elem.parent().children("ul").length) { + //first remove all other class + $this.find(".doubleTapToGo").removeClass("doubleTapToGo"); + //add the class on the current element + elem.addClass("doubleTapToGo"); + return false; + } + }, + + remove: function() { + this.element.off("." + pluginName); + this.element.removeData(pluginName); + } + + }; + + $.fn[pluginName] = function(options) { + this.each(function () { + var el = $(this); + if (el.data(pluginName)) { + el.data(pluginName).remove(); + } + el.data(pluginName, new Plugin(this, options)); + }); + return this; + }; + +})(jQuery, window, document); diff --git a/app-manage/src/main/resources/public/static/js/plugins/prettyfile/bootstrap-prettyfile.js b/app-manage/src/main/resources/public/static/js/plugins/prettyfile/bootstrap-prettyfile.js new file mode 100644 index 0000000..09809bc --- /dev/null +++ b/app-manage/src/main/resources/public/static/js/plugins/prettyfile/bootstrap-prettyfile.js @@ -0,0 +1,76 @@ +/* + * jQuery and Bootsrap3 Plugin prettyFile + * + * version 2.0, Jan 20th, 2014 + * by episage, sujin2f + * Git repository : https://github.com/episage/bootstrap-3-pretty-file-upload + */ +( function( $ ) { + $.fn.extend({ + prettyFile: function( options ) { + var defaults = { + text : "选择文件" + }; + + var options = $.extend(defaults, options); + var plugin = this; + + function make_form( $el, text ) { + $el.wrap('
                    '); + + $el.hide(); + $el.after( '\ +
                    \ + \ + \ + \ + \ +
                    \ + ' ); + + return $el.parent(); + }; + + function bind_change( $wrap, multiple ) { + $wrap.find( 'input[type="file"]' ).change(function () { + // When original file input changes, get its value, show it in the fake input + var files = $( this )[0].files, + info = ''; + + if ( files.length == 0 ) + return false; + + if ( !multiple || files.length == 1 ) { + var path = $( this ).val().split('\\'); + info = path[path.length - 1]; + } else if ( files.length > 1 ) { + // Display number of selected files instead of filenames + info = "已选择了" + files.length + ' 个文件'; + } + + $wrap.find('.input-append input').val( info ); + }); + }; + + function bind_button( $wrap, multiple ) { + $wrap.find( '.input-append' ).click( function( e ) { + e.preventDefault(); + $wrap.find( 'input[type="file"]' ).click(); + }); + }; + + return plugin.each( function() { + $this = $( this ); + + if ( $this ) { + var multiple = $this.attr( 'multiple' ); + + $wrap = make_form( $this, options.text ); + bind_change( $wrap, multiple ); + bind_button( $wrap ); + } + }); + } + }); +}( jQuery )); + diff --git a/app-manage/src/main/resources/public/static/js/plugins/slimscroll/jquery.slimscroll.min.js b/app-manage/src/main/resources/public/static/js/plugins/slimscroll/jquery.slimscroll.min.js new file mode 100644 index 0000000..97f60c5 --- /dev/null +++ b/app-manage/src/main/resources/public/static/js/plugins/slimscroll/jquery.slimscroll.min.js @@ -0,0 +1,15 @@ +/*! Copyright (c) 2011 Piotr Rochala (http://rocha.la) + * Dual licensed under the MIT (http://www.opensource.org/licenses/mit-license.php) + * and GPL (http://www.opensource.org/licenses/gpl-license.php) licenses. + * + * Version: 1.3.0 + * + */ +(function(f){jQuery.fn.extend({slimScroll:function(h){var a=f.extend({width:"auto",height:"250px",size:"4px",color:"#000",position:"right",distance:"1px",start:"top",opacity:0.4,alwaysVisible:!1,disableFadeOut:!1,railVisible:!1,railColor:"#333",railOpacity:0.2,railDraggable:!0,railClass:"slimScrollRail",barClass:"slimScrollBar",wrapperClass:"slimScrollDiv",allowPageScroll:!1,wheelStep:20,touchScrollStep:200,borderRadius:"7px",railBorderRadius:"7px"},h);this.each(function(){function r(d){if(s){d=d|| +window.event;var c=0;d.wheelDelta&&(c=-d.wheelDelta/120);d.detail&&(c=d.detail/3);f(d.target||d.srcTarget||d.srcElement).closest("."+a.wrapperClass).is(b.parent())&&m(c,!0);d.preventDefault&&!k&&d.preventDefault();k||(d.returnValue=!1)}}function m(d,f,h){k=!1;var e=d,g=b.outerHeight()-c.outerHeight();f&&(e=parseInt(c.css("top"))+d*parseInt(a.wheelStep)/100*c.outerHeight(),e=Math.min(Math.max(e,0),g),e=0=b.outerHeight()?k=!0:(c.stop(!0,!0).fadeIn("fast"),a.railVisible&&g.stop(!0,!0).fadeIn("fast"))}function p(){a.alwaysVisible||(A=setTimeout(function(){a.disableFadeOut&&s||(x||y)||(c.fadeOut("slow"),g.fadeOut("slow"))},1E3))}var s,x,y,A,z,u,l,B,D=30,k=!1,b=f(this);if(b.parent().hasClass(a.wrapperClass)){var n=b.scrollTop(), +c=b.parent().find("."+a.barClass),g=b.parent().find("."+a.railClass);w();if(f.isPlainObject(h)){if("height"in h&&"auto"==h.height){b.parent().css("height","auto");b.css("height","auto");var q=b.parent().parent().height();b.parent().css("height",q);b.css("height",q)}if("scrollTo"in h)n=parseInt(a.scrollTo);else if("scrollBy"in h)n+=parseInt(a.scrollBy);else if("destroy"in h){c.remove();g.remove();b.unwrap();return}m(n,!1,!0)}}else{a.height="auto"==a.height?b.parent().height():a.height;n=f("
                    ").addClass(a.wrapperClass).css({position:"relative",width:a.width,height:a.height});b.css({width:a.width,height:a.height});var g=f("
                    ").addClass(a.railClass).css({width:a.size,height:"100%",position:"absolute",top:0,display:a.alwaysVisible&&a.railVisible?"block":"none","border-radius":a.railBorderRadius,background:a.railColor,opacity:a.railOpacity,zIndex:90}),c=f("
                    ").addClass(a.barClass).css({background:a.color,width:a.size,position:"absolute",top:0,opacity:a.opacity,display:a.alwaysVisible? +"block":"none","border-radius":a.borderRadius,BorderRadius:a.borderRadius,MozBorderRadius:a.borderRadius,WebkitBorderRadius:a.borderRadius,zIndex:99}),q="right"==a.position?{right:a.distance}:{left:a.distance};g.css(q);c.css(q);b.wrap(n);b.parent().append(c);b.parent().append(g);a.railDraggable&&c.bind("mousedown",function(a){var b=f(document);y=!0;t=parseFloat(c.css("top"));pageY=a.pageY;b.bind("mousemove.slimscroll",function(a){currTop=t+a.pageY-pageY;c.css("top",currTop);m(0,c.position().top,!1)}); +b.bind("mouseup.slimscroll",function(a){y=!1;p();b.unbind(".slimscroll")});return!1}).bind("selectstart.slimscroll",function(a){a.stopPropagation();a.preventDefault();return!1});g.hover(function(){v()},function(){p()});c.hover(function(){x=!0},function(){x=!1});b.hover(function(){s=!0;v();p()},function(){s=!1;p()});b.bind("touchstart",function(a,b){a.originalEvent.touches.length&&(z=a.originalEvent.touches[0].pageY)});b.bind("touchmove",function(b){k||b.originalEvent.preventDefault();b.originalEvent.touches.length&& +(m((z-b.originalEvent.touches[0].pageY)/a.touchScrollStep,!0),z=b.originalEvent.touches[0].pageY)});w();"bottom"===a.start?(c.css({top:b.outerHeight()-c.outerHeight()}),m(0,!0)):"top"!==a.start&&(m(f(a.start).position().top,null,!0),a.alwaysVisible||c.hide());C()}});return this}});jQuery.fn.extend({slimscroll:jQuery.fn.slimScroll})})(jQuery); diff --git a/app-manage/src/main/resources/public/static/js/plugins/validate/additional-methods.min.js b/app-manage/src/main/resources/public/static/js/plugins/validate/additional-methods.min.js new file mode 100644 index 0000000..2d8735b --- /dev/null +++ b/app-manage/src/main/resources/public/static/js/plugins/validate/additional-methods.min.js @@ -0,0 +1,4 @@ +/*! jQuery Validation Plugin - v1.13.1 - 10/14/2014 + * http://jqueryvalidation.org/ + * Copyright (c) 2014 Jörn Zaefferer; Licensed MIT */ +!function(a){"function"==typeof define&&define.amd?define(["jquery","./jquery.validate.min"],a):a(jQuery)}(function(a){!function(){function b(a){return a.replace(/<.[^<>]*?>/g," ").replace(/ | /gi," ").replace(/[.(),;:!?%#$'\"_+=\/\-“”’]*/g,"")}a.validator.addMethod("maxWords",function(a,c,d){return this.optional(c)||b(a).match(/\b\w+\b/g).length<=d},a.validator.format("Please enter {0} words or less.")),a.validator.addMethod("minWords",function(a,c,d){return this.optional(c)||b(a).match(/\b\w+\b/g).length>=d},a.validator.format("Please enter at least {0} words.")),a.validator.addMethod("rangeWords",function(a,c,d){var e=b(a),f=/\b\w+\b/g;return this.optional(c)||e.match(f).length>=d[0]&&e.match(f).length<=d[1]},a.validator.format("Please enter between {0} and {1} words."))}(),a.validator.addMethod("accept",function(b,c,d){var e,f,g="string"==typeof d?d.replace(/\s/g,"").replace(/,/g,"|"):"image/*",h=this.optional(c);if(h)return h;if("file"===a(c).attr("type")&&(g=g.replace(/\*/g,".*"),c.files&&c.files.length))for(e=0;ec;c++)d=h-c,e=f.substring(c,c+1),g+=d*e;return g%11===0},"Please specify a valid bank account number"),a.validator.addMethod("bankorgiroaccountNL",function(b,c){return this.optional(c)||a.validator.methods.bankaccountNL.call(this,b,c)||a.validator.methods.giroaccountNL.call(this,b,c)},"Please specify a valid bank or giro account number"),a.validator.addMethod("bic",function(a,b){return this.optional(b)||/^([A-Z]{6}[A-Z2-9][A-NP-Z1-2])(X{3}|[A-WY-Z0-9][A-Z0-9]{2})?$/.test(a)},"Please specify a valid BIC code"),a.validator.addMethod("cifES",function(a){"use strict";var b,c,d,e,f,g,h=[];if(a=a.toUpperCase(),!a.match("((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)"))return!1;for(d=0;9>d;d++)h[d]=parseInt(a.charAt(d),10);for(c=h[2]+h[4]+h[6],e=1;8>e;e+=2)f=(2*h[e]).toString(),g=f.charAt(1),c+=parseInt(f.charAt(0),10)+(""===g?0:parseInt(g,10));return/^[ABCDEFGHJNPQRSUVW]{1}/.test(a)?(c+="",b=10-parseInt(c.charAt(c.length-1),10),a+=b,h[8].toString()===String.fromCharCode(64+b)||h[8].toString()===a.charAt(a.length-1)):!1},"Please specify a valid CIF number."),a.validator.addMethod("creditcardtypes",function(a,b,c){if(/[^0-9\-]+/.test(a))return!1;a=a.replace(/\D/g,"");var d=0;return c.mastercard&&(d|=1),c.visa&&(d|=2),c.amex&&(d|=4),c.dinersclub&&(d|=8),c.enroute&&(d|=16),c.discover&&(d|=32),c.jcb&&(d|=64),c.unknown&&(d|=128),c.all&&(d=255),1&d&&/^(5[12345])/.test(a)?16===a.length:2&d&&/^(4)/.test(a)?16===a.length:4&d&&/^(3[47])/.test(a)?15===a.length:8&d&&/^(3(0[012345]|[68]))/.test(a)?14===a.length:16&d&&/^(2(014|149))/.test(a)?15===a.length:32&d&&/^(6011)/.test(a)?16===a.length:64&d&&/^(3)/.test(a)?16===a.length:64&d&&/^(2131|1800)/.test(a)?15===a.length:128&d?!0:!1},"Please enter a valid credit card number."),a.validator.addMethod("currency",function(a,b,c){var d,e="string"==typeof c,f=e?c:c[0],g=e?!0:c[1];return f=f.replace(/,/g,""),f=g?f+"]":f+"]?",d="^["+f+"([1-9]{1}[0-9]{0,2}(\\,[0-9]{3})*(\\.[0-9]{0,2})?|[1-9]{1}[0-9]{0,}(\\.[0-9]{0,2})?|0(\\.[0-9]{0,2})?|(\\.[0-9]{1,2})?)$",d=new RegExp(d),this.optional(b)||d.test(a)},"Please specify a valid currency"),a.validator.addMethod("dateFA",function(a,b){return this.optional(b)||/^[1-4]\d{3}\/((0?[1-6]\/((3[0-1])|([1-2][0-9])|(0?[1-9])))|((1[0-2]|(0?[7-9]))\/(30|([1-2][0-9])|(0?[1-9]))))$/.test(a)},"Please enter a correct date"),a.validator.addMethod("dateITA",function(a,b){var c,d,e,f,g,h=!1,i=/^\d{1,2}\/\d{1,2}\/\d{4}$/;return i.test(a)?(c=a.split("/"),d=parseInt(c[0],10),e=parseInt(c[1],10),f=parseInt(c[2],10),g=new Date(f,e-1,d,12,0,0,0),h=g.getUTCFullYear()===f&&g.getUTCMonth()===e-1&&g.getUTCDate()===d?!0:!1):h=!1,this.optional(b)||h},"Please enter a correct date"),a.validator.addMethod("dateNL",function(a,b){return this.optional(b)||/^(0?[1-9]|[12]\d|3[01])[\.\/\-](0?[1-9]|1[012])[\.\/\-]([12]\d)?(\d\d)$/.test(a)},"Please enter a correct date"),a.validator.addMethod("extension",function(a,b,c){return c="string"==typeof c?c.replace(/,/g,"|"):"png|jpe?g|gif",this.optional(b)||a.match(new RegExp(".("+c+")$","i"))},a.validator.format("Please enter a value with a valid extension.")),a.validator.addMethod("giroaccountNL",function(a,b){return this.optional(b)||/^[0-9]{1,7}$/.test(a)},"Please specify a valid giro account number"),a.validator.addMethod("iban",function(a,b){if(this.optional(b))return!0;var c,d,e,f,g,h,i,j,k,l=a.replace(/ /g,"").toUpperCase(),m="",n=!0,o="",p="";if(!/^([a-zA-Z0-9]{4} ){2,8}[a-zA-Z0-9]{1,4}|[a-zA-Z0-9]{12,34}$/.test(l))return!1;if(c=l.substring(0,2),h={AL:"\\d{8}[\\dA-Z]{16}",AD:"\\d{8}[\\dA-Z]{12}",AT:"\\d{16}",AZ:"[\\dA-Z]{4}\\d{20}",BE:"\\d{12}",BH:"[A-Z]{4}[\\dA-Z]{14}",BA:"\\d{16}",BR:"\\d{23}[A-Z][\\dA-Z]",BG:"[A-Z]{4}\\d{6}[\\dA-Z]{8}",CR:"\\d{17}",HR:"\\d{17}",CY:"\\d{8}[\\dA-Z]{16}",CZ:"\\d{20}",DK:"\\d{14}",DO:"[A-Z]{4}\\d{20}",EE:"\\d{16}",FO:"\\d{14}",FI:"\\d{14}",FR:"\\d{10}[\\dA-Z]{11}\\d{2}",GE:"[\\dA-Z]{2}\\d{16}",DE:"\\d{18}",GI:"[A-Z]{4}[\\dA-Z]{15}",GR:"\\d{7}[\\dA-Z]{16}",GL:"\\d{14}",GT:"[\\dA-Z]{4}[\\dA-Z]{20}",HU:"\\d{24}",IS:"\\d{22}",IE:"[\\dA-Z]{4}\\d{14}",IL:"\\d{19}",IT:"[A-Z]\\d{10}[\\dA-Z]{12}",KZ:"\\d{3}[\\dA-Z]{13}",KW:"[A-Z]{4}[\\dA-Z]{22}",LV:"[A-Z]{4}[\\dA-Z]{13}",LB:"\\d{4}[\\dA-Z]{20}",LI:"\\d{5}[\\dA-Z]{12}",LT:"\\d{16}",LU:"\\d{3}[\\dA-Z]{13}",MK:"\\d{3}[\\dA-Z]{10}\\d{2}",MT:"[A-Z]{4}\\d{5}[\\dA-Z]{18}",MR:"\\d{23}",MU:"[A-Z]{4}\\d{19}[A-Z]{3}",MC:"\\d{10}[\\dA-Z]{11}\\d{2}",MD:"[\\dA-Z]{2}\\d{18}",ME:"\\d{18}",NL:"[A-Z]{4}\\d{10}",NO:"\\d{11}",PK:"[\\dA-Z]{4}\\d{16}",PS:"[\\dA-Z]{4}\\d{21}",PL:"\\d{24}",PT:"\\d{21}",RO:"[A-Z]{4}[\\dA-Z]{16}",SM:"[A-Z]\\d{10}[\\dA-Z]{12}",SA:"\\d{2}[\\dA-Z]{18}",RS:"\\d{18}",SK:"\\d{20}",SI:"\\d{15}",ES:"\\d{20}",SE:"\\d{20}",CH:"\\d{5}[\\dA-Z]{12}",TN:"\\d{20}",TR:"\\d{5}[\\dA-Z]{17}",AE:"\\d{3}\\d{16}",GB:"[A-Z]{4}\\d{14}",VG:"[\\dA-Z]{4}\\d{16}"},g=h[c],"undefined"!=typeof g&&(i=new RegExp("^[A-Z]{2}\\d{2}"+g+"$",""),!i.test(l)))return!1;for(d=l.substring(4,l.length)+l.substring(0,4),j=0;j9&&a.match(/^(?:(?:(?:00\s?|\+)44\s?|0)7(?:[1345789]\d{2}|624)\s?\d{3}\s?\d{3})$/)},"Please specify a valid mobile number"),a.validator.addMethod("nieES",function(a){"use strict";return a=a.toUpperCase(),a.match("((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)")?/^[T]{1}/.test(a)?a[8]===/^[T]{1}[A-Z0-9]{8}$/.test(a):/^[XYZ]{1}/.test(a)?a[8]==="TRWAGMYFPDXBNJZSQVHLCKE".charAt(a.replace("X","0").replace("Y","1").replace("Z","2").substring(0,8)%23):!1:!1},"Please specify a valid NIE number."),a.validator.addMethod("nifES",function(a){"use strict";return a=a.toUpperCase(),a.match("((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)")?/^[0-9]{8}[A-Z]{1}$/.test(a)?"TRWAGMYFPDXBNJZSQVHLCKE".charAt(a.substring(8,0)%23)===a.charAt(8):/^[KLM]{1}/.test(a)?a[8]===String.fromCharCode(64):!1:!1},"Please specify a valid NIF number."),a.validator.addMethod("nowhitespace",function(a,b){return this.optional(b)||/^\S+$/i.test(a)},"No white space please"),a.validator.addMethod("pattern",function(a,b,c){return this.optional(b)?!0:("string"==typeof c&&(c=new RegExp("^(?:"+c+")$")),c.test(a))},"Invalid format."),a.validator.addMethod("phoneNL",function(a,b){return this.optional(b)||/^((\+|00(\s|\s?\-\s?)?)31(\s|\s?\-\s?)?(\(0\)[\-\s]?)?|0)[1-9]((\s|\s?\-\s?)?[0-9]){8}$/.test(a)},"Please specify a valid phone number."),a.validator.addMethod("phoneUK",function(a,b){return a=a.replace(/\(|\)|\s+|-/g,""),this.optional(b)||a.length>9&&a.match(/^(?:(?:(?:00\s?|\+)44\s?)|(?:\(?0))(?:\d{2}\)?\s?\d{4}\s?\d{4}|\d{3}\)?\s?\d{3}\s?\d{3,4}|\d{4}\)?\s?(?:\d{5}|\d{3}\s?\d{3})|\d{5}\)?\s?\d{4,5})$/)},"Please specify a valid phone number"),a.validator.addMethod("phoneUS",function(a,b){return a=a.replace(/\s+/g,""),this.optional(b)||a.length>9&&a.match(/^(\+?1-?)?(\([2-9]([02-9]\d|1[02-9])\)|[2-9]([02-9]\d|1[02-9]))-?[2-9]([02-9]\d|1[02-9])-?\d{4}$/)},"Please specify a valid phone number"),a.validator.addMethod("phonesUK",function(a,b){return a=a.replace(/\(|\)|\s+|-/g,""),this.optional(b)||a.length>9&&a.match(/^(?:(?:(?:00\s?|\+)44\s?|0)(?:1\d{8,9}|[23]\d{9}|7(?:[1345789]\d{8}|624\d{6})))$/)},"Please specify a valid uk phone number"),a.validator.addMethod("postalCodeCA",function(a,b){return this.optional(b)||/^[ABCEGHJKLMNPRSTVXY]\d[A-Z] \d[A-Z]\d$/.test(a)},"Please specify a valid postal code"),a.validator.addMethod("postalcodeBR",function(a,b){return this.optional(b)||/^\d{2}.\d{3}-\d{3}?$|^\d{5}-?\d{3}?$/.test(a)},"Informe um CEP válido."),a.validator.addMethod("postalcodeIT",function(a,b){return this.optional(b)||/^\d{5}$/.test(a)},"Please specify a valid postal code"),a.validator.addMethod("postalcodeNL",function(a,b){return this.optional(b)||/^[1-9][0-9]{3}\s?[a-zA-Z]{2}$/.test(a)},"Please specify a valid postal code"),a.validator.addMethod("postcodeUK",function(a,b){return this.optional(b)||/^((([A-PR-UWYZ][0-9])|([A-PR-UWYZ][0-9][0-9])|([A-PR-UWYZ][A-HK-Y][0-9])|([A-PR-UWYZ][A-HK-Y][0-9][0-9])|([A-PR-UWYZ][0-9][A-HJKSTUW])|([A-PR-UWYZ][A-HK-Y][0-9][ABEHMNPRVWXY]))\s?([0-9][ABD-HJLNP-UW-Z]{2})|(GIR)\s?(0AA))$/i.test(a)},"Please specify a valid UK postcode"),a.validator.addMethod("require_from_group",function(b,c,d){var e=a(d[1],c.form),f=e.eq(0),g=f.data("valid_req_grp")?f.data("valid_req_grp"):a.extend({},this),h=e.filter(function(){return g.elementValue(this)}).length>=d[0];return f.data("valid_req_grp",g),a(c).data("being_validated")||(e.data("being_validated",!0),e.each(function(){g.element(this)}),e.data("being_validated",!1)),h},a.validator.format("Please fill at least {0} of these fields.")),a.validator.addMethod("skip_or_fill_minimum",function(b,c,d){var e=a(d[1],c.form),f=e.eq(0),g=f.data("valid_skip")?f.data("valid_skip"):a.extend({},this),h=e.filter(function(){return g.elementValue(this)}).length,i=0===h||h>=d[0];return f.data("valid_skip",g),a(c).data("being_validated")||(e.data("being_validated",!0),e.each(function(){g.element(this)}),e.data("being_validated",!1)),i},a.validator.format("Please either skip these fields or fill at least {0} of them.")),jQuery.validator.addMethod("stateUS",function(a,b,c){var d,e="undefined"==typeof c,f=e||"undefined"==typeof c.caseSensitive?!1:c.caseSensitive,g=e||"undefined"==typeof c.includeTerritories?!1:c.includeTerritories,h=e||"undefined"==typeof c.includeMilitary?!1:c.includeMilitary;return d=g||h?g&&h?"^(A[AEKLPRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$":g?"^(A[KLRSZ]|C[AOT]|D[CE]|FL|G[AU]|HI|I[ADLN]|K[SY]|LA|M[ADEINOPST]|N[CDEHJMVY]|O[HKR]|P[AR]|RI|S[CD]|T[NX]|UT|V[AIT]|W[AIVY])$":"^(A[AEKLPRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$":"^(A[KLRZ]|C[AOT]|D[CE]|FL|GA|HI|I[ADLN]|K[SY]|LA|M[ADEINOST]|N[CDEHJMVY]|O[HKR]|PA|RI|S[CD]|T[NX]|UT|V[AT]|W[AIVY])$",d=f?new RegExp(d):new RegExp(d,"i"),this.optional(b)||d.test(a)},"Please specify a valid state"),a.validator.addMethod("strippedminlength",function(b,c,d){return a(b).text().length>=d},a.validator.format("Please enter at least {0} characters")),a.validator.addMethod("time",function(a,b){return this.optional(b)||/^([01]\d|2[0-3])(:[0-5]\d){1,2}$/.test(a)},"Please enter a valid time, between 00:00 and 23:59"),a.validator.addMethod("time12h",function(a,b){return this.optional(b)||/^((0?[1-9]|1[012])(:[0-5]\d){1,2}(\ ?[AP]M))$/i.test(a)},"Please enter a valid time in 12-hour am/pm format"),a.validator.addMethod("url2",function(a,b){return this.optional(b)||/^(https?|ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)*(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(a)},a.validator.messages.url),a.validator.addMethod("vinUS",function(a){if(17!==a.length)return!1;var b,c,d,e,f,g,h=["A","B","C","D","E","F","G","H","J","K","L","M","N","P","R","S","T","U","V","W","X","Y","Z"],i=[1,2,3,4,5,6,7,8,1,2,3,4,5,7,9,2,3,4,5,6,7,8,9],j=[8,7,6,5,4,3,2,10,0,9,8,7,6,5,4,3,2],k=0;for(b=0;17>b;b++){if(e=j[b],d=a.slice(b,b+1),8===b&&(g=d),isNaN(d)){for(c=0;c").attr("name",c.submitButton.name).val(a(c.submitButton).val()).appendTo(c.currentForm)),c.settings.submitHandler.call(c,c.currentForm,b),c.submitButton&&d.remove(),!1):!0}return c.settings.debug&&b.preventDefault(),c.cancelSubmit?(c.cancelSubmit=!1,d()):c.form()?c.pendingRequest?(c.formSubmitted=!0,!1):d():(c.focusInvalid(),!1)})),c)},valid:function(){var b,c;return a(this[0]).is("form")?b=this.validate().form():(b=!0,c=a(this[0].form).validate(),this.each(function(){b=c.element(this)&&b})),b},removeAttrs:function(b){var c={},d=this;return a.each(b.split(/\s/),function(a,b){c[b]=d.attr(b),d.removeAttr(b)}),c},rules:function(b,c){var d,e,f,g,h,i,j=this[0];if(b)switch(d=a.data(j.form,"validator").settings,e=d.rules,f=a.validator.staticRules(j),b){case"add":a.extend(f,a.validator.normalizeRule(c)),delete f.messages,e[j.name]=f,c.messages&&(d.messages[j.name]=a.extend(d.messages[j.name],c.messages));break;case"remove":return c?(i={},a.each(c.split(/\s/),function(b,c){i[c]=f[c],delete f[c],"required"===c&&a(j).removeAttr("aria-required")}),i):(delete e[j.name],f)}return g=a.validator.normalizeRules(a.extend({},a.validator.classRules(j),a.validator.attributeRules(j),a.validator.dataRules(j),a.validator.staticRules(j)),j),g.required&&(h=g.required,delete g.required,g=a.extend({required:h},g),a(j).attr("aria-required","true")),g.remote&&(h=g.remote,delete g.remote,g=a.extend(g,{remote:h})),g}}),a.extend(a.expr[":"],{blank:function(b){return!a.trim(""+a(b).val())},filled:function(b){return!!a.trim(""+a(b).val())},unchecked:function(b){return!a(b).prop("checked")}}),a.validator=function(b,c){this.settings=a.extend(!0,{},a.validator.defaults,b),this.currentForm=c,this.init()},a.validator.format=function(b,c){return 1===arguments.length?function(){var c=a.makeArray(arguments);return c.unshift(b),a.validator.format.apply(this,c)}:(arguments.length>2&&c.constructor!==Array&&(c=a.makeArray(arguments).slice(1)),c.constructor!==Array&&(c=[c]),a.each(c,function(a,c){b=b.replace(new RegExp("\\{"+a+"\\}","g"),function(){return c})}),b)},a.extend(a.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",validClass:"valid",errorElement:"label",focusInvalid:!0,errorContainer:a([]),errorLabelContainer:a([]),onsubmit:!0,ignore:":hidden",ignoreTitle:!1,onfocusin:function(a){this.lastActive=a,this.settings.focusCleanup&&!this.blockFocusCleanup&&(this.settings.unhighlight&&this.settings.unhighlight.call(this,a,this.settings.errorClass,this.settings.validClass),this.hideThese(this.errorsFor(a)))},onfocusout:function(a){this.checkable(a)||!(a.name in this.submitted)&&this.optional(a)||this.element(a)},onkeyup:function(a,b){(9!==b.which||""!==this.elementValue(a))&&(a.name in this.submitted||a===this.lastElement)&&this.element(a)},onclick:function(a){a.name in this.submitted?this.element(a):a.parentNode.name in this.submitted&&this.element(a.parentNode)},highlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).addClass(c).removeClass(d):a(b).addClass(c).removeClass(d)},unhighlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).removeClass(c).addClass(d):a(b).removeClass(c).addClass(d)}},setDefaults:function(b){a.extend(a.validator.defaults,b)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date ( ISO ).",number:"Please enter a valid number.",digits:"Please enter only digits.",creditcard:"Please enter a valid credit card number.",equalTo:"Please enter the same value again.",maxlength:a.validator.format("Please enter no more than {0} characters."),minlength:a.validator.format("Please enter at least {0} characters."),rangelength:a.validator.format("Please enter a value between {0} and {1} characters long."),range:a.validator.format("Please enter a value between {0} and {1}."),max:a.validator.format("Please enter a value less than or equal to {0}."),min:a.validator.format("Please enter a value greater than or equal to {0}.")},autoCreateRanges:!1,prototype:{init:function(){function b(b){var c=a.data(this[0].form,"validator"),d="on"+b.type.replace(/^validate/,""),e=c.settings;e[d]&&!this.is(e.ignore)&&e[d].call(c,this[0],b)}this.labelContainer=a(this.settings.errorLabelContainer),this.errorContext=this.labelContainer.length&&this.labelContainer||a(this.currentForm),this.containers=a(this.settings.errorContainer).add(this.settings.errorLabelContainer),this.submitted={},this.valueCache={},this.pendingRequest=0,this.pending={},this.invalid={},this.reset();var c,d=this.groups={};a.each(this.settings.groups,function(b,c){"string"==typeof c&&(c=c.split(/\s/)),a.each(c,function(a,c){d[c]=b})}),c=this.settings.rules,a.each(c,function(b,d){c[b]=a.validator.normalizeRule(d)}),a(this.currentForm).validateDelegate(":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'] ,[type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], [type='radio'], [type='checkbox']","focusin focusout keyup",b).validateDelegate("select, option, [type='radio'], [type='checkbox']","click",b),this.settings.invalidHandler&&a(this.currentForm).bind("invalid-form.validate",this.settings.invalidHandler),a(this.currentForm).find("[required], [data-rule-required], .required").attr("aria-required","true")},form:function(){return this.checkForm(),a.extend(this.submitted,this.errorMap),this.invalid=a.extend({},this.errorMap),this.valid()||a(this.currentForm).triggerHandler("invalid-form",[this]),this.showErrors(),this.valid()},checkForm:function(){this.prepareForm();for(var a=0,b=this.currentElements=this.elements();b[a];a++)this.check(b[a]);return this.valid()},element:function(b){var c=this.clean(b),d=this.validationTargetFor(c),e=!0;return this.lastElement=d,void 0===d?delete this.invalid[c.name]:(this.prepareElement(d),this.currentElements=a(d),e=this.check(d)!==!1,e?delete this.invalid[d.name]:this.invalid[d.name]=!0),a(b).attr("aria-invalid",!e),this.numberOfInvalids()||(this.toHide=this.toHide.add(this.containers)),this.showErrors(),e},showErrors:function(b){if(b){a.extend(this.errorMap,b),this.errorList=[];for(var c in b)this.errorList.push({message:b[c],element:this.findByName(c)[0]});this.successList=a.grep(this.successList,function(a){return!(a.name in b)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){a.fn.resetForm&&a(this.currentForm).resetForm(),this.submitted={},this.lastElement=null,this.prepareForm(),this.hideErrors(),this.elements().removeClass(this.settings.errorClass).removeData("previousValue").removeAttr("aria-invalid")},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(a){var b,c=0;for(b in a)c++;return c},hideErrors:function(){this.hideThese(this.toHide)},hideThese:function(a){a.not(this.containers).text(""),this.addWrapper(a).hide()},valid:function(){return 0===this.size()},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{a(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").focus().trigger("focusin")}catch(b){}},findLastActive:function(){var b=this.lastActive;return b&&1===a.grep(this.errorList,function(a){return a.element.name===b.name}).length&&b},elements:function(){var b=this,c={};return a(this.currentForm).find("input, select, textarea").not(":submit, :reset, :image, [disabled]").not(this.settings.ignore).filter(function(){return!this.name&&b.settings.debug&&window.console&&console.error("%o has no name assigned",this),this.name in c||!b.objectLength(a(this).rules())?!1:(c[this.name]=!0,!0)})},clean:function(b){return a(b)[0]},errors:function(){var b=this.settings.errorClass.split(" ").join(".");return a(this.settings.errorElement+"."+b,this.errorContext)},reset:function(){this.successList=[],this.errorList=[],this.errorMap={},this.toShow=a([]),this.toHide=a([]),this.currentElements=a([])},prepareForm:function(){this.reset(),this.toHide=this.errors().add(this.containers)},prepareElement:function(a){this.reset(),this.toHide=this.errorsFor(a)},elementValue:function(b){var c,d=a(b),e=b.type;return"radio"===e||"checkbox"===e?a("input[name='"+b.name+"']:checked").val():"number"===e&&"undefined"!=typeof b.validity?b.validity.badInput?!1:d.val():(c=d.val(),"string"==typeof c?c.replace(/\r/g,""):c)},check:function(b){b=this.validationTargetFor(this.clean(b));var c,d,e,f=a(b).rules(),g=a.map(f,function(a,b){return b}).length,h=!1,i=this.elementValue(b);for(d in f){e={method:d,parameters:f[d]};try{if(c=a.validator.methods[d].call(this,i,b,e.parameters),"dependency-mismatch"===c&&1===g){h=!0;continue}if(h=!1,"pending"===c)return void(this.toHide=this.toHide.not(this.errorsFor(b)));if(!c)return this.formatAndAdd(b,e),!1}catch(j){throw this.settings.debug&&window.console&&console.log("Exception occurred when checking element "+b.id+", check the '"+e.method+"' method.",j),j}}if(!h)return this.objectLength(f)&&this.successList.push(b),!0},customDataMessage:function(b,c){return a(b).data("msg"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase())||a(b).data("msg")},customMessage:function(a,b){var c=this.settings.messages[a];return c&&(c.constructor===String?c:c[b])},findDefined:function(){for(var a=0;aWarning: No message defined for "+b.name+"")},formatAndAdd:function(b,c){var d=this.defaultMessage(b,c.method),e=/\$?\{(\d+)\}/g;"function"==typeof d?d=d.call(this,c.parameters,b):e.test(d)&&(d=a.validator.format(d.replace(e,"{$1}"),c.parameters)),this.errorList.push({message:d,element:b,method:c.method}),this.errorMap[b.name]=d,this.submitted[b.name]=d},addWrapper:function(a){return this.settings.wrapper&&(a=a.add(a.parent(this.settings.wrapper))),a},defaultShowErrors:function(){var a,b,c;for(a=0;this.errorList[a];a++)c=this.errorList[a],this.settings.highlight&&this.settings.highlight.call(this,c.element,this.settings.errorClass,this.settings.validClass),this.showLabel(c.element,c.message);if(this.errorList.length&&(this.toShow=this.toShow.add(this.containers)),this.settings.success)for(a=0;this.successList[a];a++)this.showLabel(this.successList[a]);if(this.settings.unhighlight)for(a=0,b=this.validElements();b[a];a++)this.settings.unhighlight.call(this,b[a],this.settings.errorClass,this.settings.validClass);this.toHide=this.toHide.not(this.toShow),this.hideErrors(),this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return a(this.errorList).map(function(){return this.element})},showLabel:function(b,c){var d,e,f,g=this.errorsFor(b),h=this.idOrName(b),i=a(b).attr("aria-describedby");g.length?(g.removeClass(this.settings.validClass).addClass(this.settings.errorClass),g.html(c)):(g=a("<"+this.settings.errorElement+">").attr("id",h+"-error").addClass(this.settings.errorClass).html(c||""),d=g,this.settings.wrapper&&(d=g.hide().show().wrap("<"+this.settings.wrapper+"/>").parent()),this.labelContainer.length?this.labelContainer.append(d):this.settings.errorPlacement?this.settings.errorPlacement(d,a(b)):d.insertAfter(b),g.is("label")?g.attr("for",h):0===g.parents("label[for='"+h+"']").length&&(f=g.attr("id"),i?i.match(new RegExp("\b"+f+"\b"))||(i+=" "+f):i=f,a(b).attr("aria-describedby",i),e=this.groups[b.name],e&&a.each(this.groups,function(b,c){c===e&&a("[name='"+b+"']",this.currentForm).attr("aria-describedby",g.attr("id"))}))),!c&&this.settings.success&&(g.text(""),"string"==typeof this.settings.success?g.addClass(this.settings.success):this.settings.success(g,b)),this.toShow=this.toShow.add(g)},errorsFor:function(b){var c=this.idOrName(b),d=a(b).attr("aria-describedby"),e="label[for='"+c+"'], label[for='"+c+"'] *";return d&&(e=e+", #"+d.replace(/\s+/g,", #")),this.errors().filter(e)},idOrName:function(a){return this.groups[a.name]||(this.checkable(a)?a.name:a.id||a.name)},validationTargetFor:function(a){return this.checkable(a)&&(a=this.findByName(a.name).not(this.settings.ignore)[0]),a},checkable:function(a){return/radio|checkbox/i.test(a.type)},findByName:function(b){return a(this.currentForm).find("[name='"+b+"']")},getLength:function(b,c){switch(c.nodeName.toLowerCase()){case"select":return a("option:selected",c).length;case"input":if(this.checkable(c))return this.findByName(c.name).filter(":checked").length}return b.length},depend:function(a,b){return this.dependTypes[typeof a]?this.dependTypes[typeof a](a,b):!0},dependTypes:{"boolean":function(a){return a},string:function(b,c){return!!a(b,c.form).length},"function":function(a,b){return a(b)}},optional:function(b){var c=this.elementValue(b);return!a.validator.methods.required.call(this,c,b)&&"dependency-mismatch"},startRequest:function(a){this.pending[a.name]||(this.pendingRequest++,this.pending[a.name]=!0)},stopRequest:function(b,c){this.pendingRequest--,this.pendingRequest<0&&(this.pendingRequest=0),delete this.pending[b.name],c&&0===this.pendingRequest&&this.formSubmitted&&this.form()?(a(this.currentForm).submit(),this.formSubmitted=!1):!c&&0===this.pendingRequest&&this.formSubmitted&&(a(this.currentForm).triggerHandler("invalid-form",[this]),this.formSubmitted=!1)},previousValue:function(b){return a.data(b,"previousValue")||a.data(b,"previousValue",{old:null,valid:!0,message:this.defaultMessage(b,"remote")})}},classRuleSettings:{required:{required:!0},email:{email:!0},url:{url:!0},date:{date:!0},dateISO:{dateISO:!0},number:{number:!0},digits:{digits:!0},creditcard:{creditcard:!0}},addClassRules:function(b,c){b.constructor===String?this.classRuleSettings[b]=c:a.extend(this.classRuleSettings,b)},classRules:function(b){var c={},d=a(b).attr("class");return d&&a.each(d.split(" "),function(){this in a.validator.classRuleSettings&&a.extend(c,a.validator.classRuleSettings[this])}),c},attributeRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)"required"===c?(d=b.getAttribute(c),""===d&&(d=!0),d=!!d):d=f.attr(c),/min|max/.test(c)&&(null===g||/number|range|text/.test(g))&&(d=Number(d)),d||0===d?e[c]=d:g===c&&"range"!==g&&(e[c]=!0);return e.maxlength&&/-1|2147483647|524288/.test(e.maxlength)&&delete e.maxlength,e},dataRules:function(b){var c,d,e={},f=a(b);for(c in a.validator.methods)d=f.data("rule"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase()),void 0!==d&&(e[c]=d);return e},staticRules:function(b){var c={},d=a.data(b.form,"validator");return d.settings.rules&&(c=a.validator.normalizeRule(d.settings.rules[b.name])||{}),c},normalizeRules:function(b,c){return a.each(b,function(d,e){if(e===!1)return void delete b[d];if(e.param||e.depends){var f=!0;switch(typeof e.depends){case"string":f=!!a(e.depends,c.form).length;break;case"function":f=e.depends.call(c,c)}f?b[d]=void 0!==e.param?e.param:!0:delete b[d]}}),a.each(b,function(d,e){b[d]=a.isFunction(e)?e(c):e}),a.each(["minlength","maxlength"],function(){b[this]&&(b[this]=Number(b[this]))}),a.each(["rangelength","range"],function(){var c;b[this]&&(a.isArray(b[this])?b[this]=[Number(b[this][0]),Number(b[this][1])]:"string"==typeof b[this]&&(c=b[this].replace(/[\[\]]/g,"").split(/[\s,]+/),b[this]=[Number(c[0]),Number(c[1])]))}),a.validator.autoCreateRanges&&(b.min&&b.max&&(b.range=[b.min,b.max],delete b.min,delete b.max),b.minlength&&b.maxlength&&(b.rangelength=[b.minlength,b.maxlength],delete b.minlength,delete b.maxlength)),b},normalizeRule:function(b){if("string"==typeof b){var c={};a.each(b.split(/\s/),function(){c[this]=!0}),b=c}return b},addMethod:function(b,c,d){a.validator.methods[b]=c,a.validator.messages[b]=void 0!==d?d:a.validator.messages[b],c.length<3&&a.validator.addClassRules(b,a.validator.normalizeRule(b))},methods:{required:function(b,c,d){if(!this.depend(d,c))return"dependency-mismatch";if("select"===c.nodeName.toLowerCase()){var e=a(c).val();return e&&e.length>0}return this.checkable(c)?this.getLength(b,c)>0:a.trim(b).length>0},email:function(a,b){return this.optional(b)||/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(a)},url:function(a,b){return this.optional(b)||/^(https?|s?ftp):\/\/(((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:)*@)?(((\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5])\.(\d|[1-9]\d|1\d\d|2[0-4]\d|25[0-5]))|((([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|\d|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.)+(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])*([a-z]|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])))\.?)(:\d*)?)(\/((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)+(\/(([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)*)*)?)?(\?((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|[\uE000-\uF8FF]|\/|\?)*)?(#((([a-z]|\d|-|\.|_|~|[\u00A0-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF])|(%[\da-f]{2})|[!\$&'\(\)\*\+,;=]|:|@)|\/|\?)*)?$/i.test(a)},date:function(a,b){return this.optional(b)||!/Invalid|NaN/.test(new Date(a).toString())},dateISO:function(a,b){return this.optional(b)||/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(a)},number:function(a,b){return this.optional(b)||/^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(a)},digits:function(a,b){return this.optional(b)||/^\d+$/.test(a)},creditcard:function(a,b){if(this.optional(b))return"dependency-mismatch";if(/[^0-9 \-]+/.test(a))return!1;var c,d,e=0,f=0,g=!1;if(a=a.replace(/\D/g,""),a.length<13||a.length>19)return!1;for(c=a.length-1;c>=0;c--)d=a.charAt(c),f=parseInt(d,10),g&&(f*=2)>9&&(f-=9),e+=f,g=!g;return e%10===0},minlength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(a.trim(b),c);return this.optional(c)||e>=d},maxlength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(a.trim(b),c);return this.optional(c)||d>=e},rangelength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(a.trim(b),c);return this.optional(c)||e>=d[0]&&e<=d[1]},min:function(a,b,c){return this.optional(b)||a>=c},max:function(a,b,c){return this.optional(b)||c>=a},range:function(a,b,c){return this.optional(b)||a>=c[0]&&a<=c[1]},equalTo:function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.unbind(".validate-equalTo").bind("blur.validate-equalTo",function(){a(c).valid()}),b===e.val()},remote:function(b,c,d){if(this.optional(c))return"dependency-mismatch";var e,f,g=this.previousValue(c);return this.settings.messages[c.name]||(this.settings.messages[c.name]={}),g.originalMessage=this.settings.messages[c.name].remote,this.settings.messages[c.name].remote=g.message,d="string"==typeof d&&{url:d}||d,g.old===b?g.valid:(g.old=b,e=this,this.startRequest(c),f={},f[c.name]=b,a.ajax(a.extend(!0,{url:d,mode:"abort",port:"validate"+c.name,dataType:"json",data:f,context:e.currentForm,success:function(d){var f,h,i,j=d===!0||"true"===d;e.settings.messages[c.name].remote=g.originalMessage,j?(i=e.formSubmitted,e.prepareElement(c),e.formSubmitted=i,e.successList.push(c),delete e.invalid[c.name],e.showErrors()):(f={},h=d||e.defaultMessage(c,"remote"),f[c.name]=g.message=a.isFunction(h)?h(b):h,e.invalid[c.name]=!0,e.showErrors(f)),g.valid=j,e.stopRequest(c,j)}},d)),"pending")}}}),a.format=function(){throw"$.format has been deprecated. Please use $.validator.format instead."};var b,c={};a.ajaxPrefilter?a.ajaxPrefilter(function(a,b,d){var e=a.port;"abort"===a.mode&&(c[e]&&c[e].abort(),c[e]=d)}):(b=a.ajax,a.ajax=function(d){var e=("mode"in d?d:a.ajaxSettings).mode,f=("port"in d?d:a.ajaxSettings).port;return"abort"===e?(c[f]&&c[f].abort(),c[f]=b.apply(this,arguments),c[f]):b.apply(this,arguments)}),a.extend(a.fn,{validateDelegate:function(b,c,d){return this.bind(c,function(c){var e=a(c.target);return e.is(b)?d.apply(e,arguments):void 0})}})}); diff --git a/app-manage/src/main/resources/public/static/js/plugins/validate/messages_zh.min.js b/app-manage/src/main/resources/public/static/js/plugins/validate/messages_zh.min.js new file mode 100644 index 0000000..2b0d210 --- /dev/null +++ b/app-manage/src/main/resources/public/static/js/plugins/validate/messages_zh.min.js @@ -0,0 +1,27 @@ +/*! jQuery Validation Plugin - v1.13.1 - 10/14/2014 + * http://jqueryvalidation.org/ + * Copyright (c) 2014 Jörn Zaefferer; Licensed MIT */ +! function (a) { + "function" == typeof define && define.amd ? define(["jquery", "jquery.validate.min"], a) : a(jQuery) +}(function (a) { + var icon = " "; + a.extend(a.validator.messages, { + required: icon + "必填", + remote: icon + "请修正此栏位", + email: icon + "请输入有效的电子邮件", + url: icon + "请输入有效的网址", + date: icon + "请输入有效的日期", + dateISO: icon + "请输入有效的日期 (YYYY-MM-DD)", + number: icon + "请输入正确的数字", + digits: icon + "只能输入数字", + creditcard: icon + "请输入有效的信用卡号码", + equalTo: icon + "你的输入不相同", + extension: icon + "请输入有效的后缀", + maxlength: a.validator.format(icon + "最多 {0} 个字"), + minlength: a.validator.format(icon + "最少 {0} 个字"), + rangelength: a.validator.format(icon + "请输入长度为 {0} 至 {1} 之间的字串"), + range: a.validator.format(icon + "请输入 {0} 至 {1} 之间的数值"), + max: a.validator.format(icon + "请输入不大于 {0} 的数值"), + min: a.validator.format(icon + "请输入不小于 {0} 的数值") + }) +}); diff --git a/app-manage/src/main/resources/sql/generate_mapper.py b/app-manage/src/main/resources/sql/generate_mapper.py new file mode 100644 index 0000000..af710c6 --- /dev/null +++ b/app-manage/src/main/resources/sql/generate_mapper.py @@ -0,0 +1,314 @@ +#!/usr/bin/env python +# -*- encoding: utf-8 -*- +""" +通过一个schema.sql来生成标准表结构的Domain和基础Mapper +基于mybatis-plus库使用 + +使用方法2种: + +1. python generate_mapper.py src_base_dir domain_package mapper_package schema_name author +2. 配置好下面的参数后直接运行此文件 python generate_mapper.py + +参数: +1. src_base_dir 源码基础路径 +2. domain_package domain类的包名 +3. mapper_package mapper类的包名 +4. schema_name schema sql文件的绝对路径 +5. author 源代码的作者:熊能 +""" + +###################################下面的参数你来指定########################### +src_base_dir = r'E:\enzhico\app-manage\src\main\java' +domain_package = r'com.enzhico.pos.common.dao.entity' +mapper_package = r'com.enzhico.pos.common.dao.repository' +schema_name = r'E:\enzhico\app-manage\src\main\resources\sql\schema.sql' +author = r'熊能' +TODAY_STR = '2018/01/02' +############################################################################### + +import sys +import os +import datetime +import shutil + +# 基类功能列 +BASE_FIELS = {} + +# MySQL type to java type +MYSQL_TYPE_MAP = { + 'BIT(1)': ('Boolean',) + , 'BIT': ('byte[]',) + , 'TINYINT': ('Integer',) + , 'BOOLEAN': ('Boolean',) + , 'BOOL': ('Boolean',) + , 'SMALLINT': ('Integer',) + , 'MEDIUMINT': ('Integer',) + , 'INT': ('Integer',) + , 'INTEGER': ('Integer',) + , 'BIGINT': ('Long',) + , 'FLOAT': ('Float',) + , 'DOUBLE': ('Double',) + , 'DECIMAL': ('BigDecimal', 'java.math.BigDecimal') + , 'DATE': ('Date', 'java.util.Date') + , 'DATETIME': ('Date', 'java.util.Date') + , 'TIMESTAMP': ('Date', 'java.util.Date') + , 'TIME': ('Date', 'java.util.Date') + , 'CHAR': ('String ',) + , 'VARCHAR': ('String',) + , 'BINARY': ('byte[]',) + , 'VARBINARY': ('byte[]',) + , 'TINYBLOB': ('byte[]',) + , 'TINYTEXT': ('String',) + , 'BLOB': ('byte[]',) + , 'TEXT': ('String',) + , 'MEDIUMBLOB': ('byte[]',) + , 'MEDIUMTEXT': ('String',) + , 'LONGBLOB': ('byte[]',) + , 'LONGTEXT': ('String',) + , 'ENUM': ('String',) + , 'SET': ('String',) + , 'bit(1)': ('Boolean',) + , 'bit': ('byte[]',) + , 'tinyint': ('Integer',) + , 'boolean': ('Boolean',) + , 'bool': ('Boolean',) + , 'smallint': ('Integer',) + , 'mediumint': ('Integer',) + , 'int': ('Integer',) + , 'integer': ('Integer',) + , 'bigint': ('Long',) + , 'float': ('Float',) + , 'double': ('Double',) + , 'decimal': ('BigDecimal', 'java.math.BigDecimal') + , 'date': ('Date', 'java.util.Date') + , 'datetime': ('Date', 'java.util.Date') + , 'timestamp': ('Date', 'java.util.Date') + , 'time': ('Date', 'java.util.Date') + , 'char': ('String ',) + , 'varchar': ('String',) + , 'binary': ('byte[]',) + , 'varbinary': ('byte[]',) + , 'tinyblob': ('byte[]',) + , 'tinytext': ('String',) + , 'blob': ('byte[]',) + , 'text': ('String',) + , 'mediumblob': ('byte[]',) + , 'mediumtext': ('String',) + , 'longblob': ('byte[]',) + , 'longtext': ('String',) + , 'enum': ('String',) + , 'set': ('String',) +} + + +def camel_to_underline(camel_format): + """ + 驼峰命名格式转下划线命名格式 + """ + return ''.join([s if s.islower() else '_' + s.lower() for s in camel_format])[1:] + + +def underline_to_camel(underline_format, is_field=False): + """ + 下划线命名格式驼峰命名格式 + """ + try: + result = ''.join([s.capitalize() for s in underline_format.split('_')]) + except: + print(underline_format + "...error...") + return result[0].lower() + result[1:] if is_field else result + + +def load_schema(filename): + """先加载schema.sql文件来获取所有建表语句""" + result = [] + with open(filename, encoding='utf-8') as sqlfile: + each_table = [] # 每张表定义 + for line in sqlfile: + linestrip = line.strip() + if not linestrip or linestrip.startswith("#") \ + or linestrip.startswith("INDEX") or linestrip.startswith("ALTER TABLE"): + continue + line = line.replace("`", "") + if line.startswith('--'): + temp_comment = line.split('--')[1].strip() + elif 'DROP TABLE' in line: + each_table.insert(0, temp_comment) + each_table.insert(1, line.strip().split()[-1][:-1]) + elif ' COMMENT ' in line and 'ENGINE=' not in line: + col_arr = line.split() + col_name = col_arr[0] + col_type = col_arr[1] + if 'PRIMARY KEY' in line or 'NOT NULL' in line: + col_null = 'NOT NULL' + else: + col_null = '' + col_remark = line.split(' COMMENT ') + cr = col_remark[-1].strip().replace("'", "") + each_table.append((col_name, col_type, col_null, cr[:-1] if cr.endswith(',') else cr)) + elif 'ENGINE=' in line: + # 单个表定义结束 + result.append(list(each_table)) + each_table.clear() + return result + + +def write_beans(src_base_dir, domain_package, mapper_package, schema_name, author): + + beans_dir = os.path.join(src_base_dir, domain_package.replace('.', os.sep)) + mapper_dir = os.path.join(src_base_dir, mapper_package.replace('.', os.sep)) + + if not os.path.exists(beans_dir): + os.makedirs(beans_dir) + if not os.path.exists(mapper_dir): + os.makedirs(mapper_dir) + shutil.rmtree(beans_dir) + os.mkdir(beans_dir) + shutil.rmtree(mapper_dir) + os.mkdir(mapper_dir) + + domain_package_with_semicolon = domain_package + ";" + mapper_package_with_semicolon = mapper_package + ";" + + # 今日格式化字符串 + # today_today = datetime.datetime.now().strftime('%Y/%m/%d') + today_today = TODAY_STR + today_str = ' * @since {}'.format(today_today) + + table_data = load_schema(schema_name) + # 然后开始对每个表生成一个Domain类 + for table in table_data: + table_name_comment = table[0] + table_name_real = table[1] + class_name = underline_to_camel(table_name_real[2:]) + lines = [] + lines.append('package ' + domain_package_with_semicolon) + lines.append('\n') + lines.append('import com.baomidou.mybatisplus.annotations.TableName;') + lines.append('import com.baomidou.mybatisplus.enums.IdType;') + lines.append('import com.baomidou.mybatisplus.annotations.TableId;') + lines.append('import com.baomidou.mybatisplus.activerecord.Model;') + lines.append('import java.io.Serializable;') + lines.append('\n') + lines.append('/**') + lines.append(' * ' + table_name_comment) + lines.append(' *') + lines.append(' * @author {}'.format(author)) + lines.append(' * @version 1.0') + lines.append(today_str) + lines.append(' */') + lines.append('@TableName(value = "{}")'.format(table_name_real)) + lines.append('public class {} extends Model<{}> {{'.format(class_name, class_name)) + lines.append('\n') + lines.append('private static final long serialVersionUID = 1L;') + lines.append('\n') + lines_fields = [] + lines_methods = [] + other_import = set() + field_name_list = [] + + for each_column in table[2:]: + # 列名 + column_name = each_column[0] + if column_name in BASE_FIELS: + continue + field_name = underline_to_camel(column_name, is_field=True) + field_name_list.append(field_name) + field_name_method = underline_to_camel(column_name) + # 类型 + ctype = each_column[1] + java_type_t = MYSQL_TYPE_MAP[ctype.split('(')[0] if ctype != 'BIT(1)' else ctype] + java_type = java_type_t[0] + import_str = 'import {};'.format(java_type_t[1]) if len(java_type_t) > 1 else None + # 空值约束 + column_null = each_column[2] + # 字段生成 + column_comment = each_column[3] + lines_fields.append(' /**') + lines_fields.append(' * {}'.format(column_comment)) + lines_fields.append(' */') + if column_name == 'id': + lines_fields.append(' @TableId(value="id", type= IdType.AUTO)') + lines_fields.append(' private {} {};'.format(java_type, field_name)) + if import_str: + other_import.add(import_str) + + # get方法生成 + lines_methods.append(' /**') + lines_methods.append(' * 获取 {}.'.format(column_comment)) + lines_methods.append(' *') + lines_methods.append(' * @return {}.'.format(column_comment)) + lines_methods.append(' */') + lines_methods.append(' public {} get{}() {{'.format(java_type, field_name_method)) + lines_methods.append(' return {};'.format(field_name)) + lines_methods.append(' }') + lines_methods.append('\n') + # set方法生成 + lines_methods.append(' /**') + lines_methods.append(' * 设置 {}.'.format(column_comment)) + lines_methods.append(' *') + lines_methods.append(' * @param {} {}.'.format(field_name, column_comment)) + lines_methods.append(' */') + lines_methods.append(' public void set{}({} {}) {{'.format( + field_name_method, java_type, field_name)) + lines_methods.append(' this.{} = {};'.format(field_name, field_name)) + lines_methods.append(' }') + lines_methods.append('\n') + + for each_other in sorted(other_import): + lines.insert(2, each_other) + lines.extend(lines_fields) + lines.append('\n') + lines.extend(lines_methods) + # 最后加上pkVal()实现 + lines.append(' @Override') + lines.append(' protected Serializable pkVal() {') + lines.append(' return this.id;') + lines.append(' }') + lines.append('\n') + lines.append('}') + + # 加上换行符 + lines = [line + "\n" if line != '\n' else line for line in lines] + # 开始写java源文件 + java_file = class_name + '.java' + with open(os.path.join(beans_dir, java_file), mode='w', encoding='utf-8') as jf: + jf.writelines(lines) + + # 然后开始对每个表生成一个Mapper类 + for table in table_data: + table_name_comment = table[0] + table_name_real = table[1] + class_name = underline_to_camel(table_name_real[2:]) + lines = [] + lines.append('package ' + mapper_package_with_semicolon) + lines.append('\n') + lines.append('import {}.{};'.format(domain_package, class_name)) + lines.append('import com.baomidou.mybatisplus.mapper.BaseMapper;') + lines.append('\n') + lines.append('/**') + lines.append(' * ' + table_name_comment + " Mapper") + lines.append(' *') + lines.append(' * @author {}'.format(author)) + lines.append(' * @version 1.0') + lines.append(today_str) + lines.append(' */') + lines.append('public interface {0}Mapper extends BaseMapper<{0}> {{'.format(class_name)) + lines.append('\n') + lines.append('}') + + lines = [line + "\n" if line != '\n' else line for line in lines] + # 开始写mapper源文件 + with open(os.path.join(mapper_dir, '{}Mapper.java'.format(class_name)), mode='w', encoding='utf-8') as jf: + jf.writelines(lines) + print('successful...') + pass + +if __name__ == '__main__': + if len(sys.argv) > 4: + src_base_dir = sys.argv[1] + domain_package = sys.argv[2] + mapper_package = sys.argv[3] + schema_name = sys.argv[4] + author = sys.argv[5] + write_beans(src_base_dir, domain_package, mapper_package, schema_name, author) diff --git a/app-manage/src/main/resources/sql/schema.sql b/app-manage/src/main/resources/sql/schema.sql new file mode 100644 index 0000000..44f605a --- /dev/null +++ b/app-manage/src/main/resources/sql/schema.sql @@ -0,0 +1,180 @@ +# -------------------------------------以下业务表开始------------------------------------------- +# CREATE DATABASE IF NOT EXISTS pos default charset utf8 COLLATE utf8_general_ci; +# SET FOREIGN_KEY_CHECKS=0; +# USE pos; + +-- 项目表 +DROP TABLE IF EXISTS `t_project`; +CREATE TABLE `t_project` ( + `id` INT(11) PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + `name` VARCHAR(64) DEFAULT '' COMMENT '项目名称', + `application_id` VARCHAR(64) DEFAULT '' COMMENT '应用编号', + `icon` VARCHAR(64) DEFAULT '' COMMENT '项目图片', + `created_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='项目表'; + +-- 项目用户关联表 +DROP TABLE IF EXISTS `t_project_user`; +CREATE TABLE `t_project_user` ( + `id` INT(11) PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + `user_id` INT(11) NOT NULL COMMENT '用户ID', + `project_id` INT(11) NOT NULL COMMENT '项目ID', + `created_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='项目用户关联表'; + +-- POS机表 +DROP TABLE IF EXISTS `t_pos`; +CREATE TABLE `t_pos` ( + `id` INT(11) PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + `imei` VARCHAR(32) DEFAULT '' COMMENT '机具IMEI码', + `sn` VARCHAR(64) DEFAULT '' COMMENT '序列号(SN)', + `series` VARCHAR(32) DEFAULT '' COMMENT '机具型号', + `android_version` VARCHAR(32) DEFAULT '' COMMENT 'Android版本', + `version` VARCHAR(64) DEFAULT '' COMMENT '版本号', + `location` VARCHAR(64) DEFAULT '' COMMENT '归属网点', + `project_id` INT(11) DEFAULT 0 COMMENT '归属项目ID', + `jointime` DATETIME COMMENT '入网时间', + `bindtime` DATETIME COMMENT '绑定时间', + `owner` VARCHAR(64) DEFAULT '' COMMENT '产权方', + `tips` VARCHAR(255) DEFAULT '' COMMENT '备注', + `pos_state` TINYINT(1) COMMENT '机具状态: 1:正常 2:故障 3:维修中(返厂) 4:已禁用(丢失) 5:已停用(回收)', + `created_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='POS机表'; + +-- POS机监控表 +DROP TABLE IF EXISTS `t_pos_monitor`; +CREATE TABLE `t_pos_monitor` ( + `id` INT(11) PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + `pos_id` INT(11) COMMENT 'POS机ID', + `session_id` VARCHAR(64) DEFAULT '' COMMENT 'Socket会话ID', + `report_time` DATETIME COMMENT '最近一次报告时间', + `report_location` VARCHAR(255) DEFAULT '' COMMENT '最近一次报告地址', + `online_state` TINYINT(1) COMMENT '在线状态: 1:在线 2:离线', + `created_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='POS机历史归属表'; + +-- POS机历史归属表 +DROP TABLE IF EXISTS `t_pos_history`; +CREATE TABLE `t_pos_history` ( + `id` INT(11) PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + `pos_id` INT(11) COMMENT 'POS机ID', + `location` VARCHAR(64) DEFAULT '' COMMENT '归属网点', + `bindtime` DATETIME COMMENT '绑定时间', + `unbindtime` DATETIME COMMENT '解绑时间', + `created_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='POS机历史归属表'; + +-- APP表 +DROP TABLE IF EXISTS `t_app`; +CREATE TABLE `t_app` ( + `id` INT(11) PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + `application_id` VARCHAR(64) DEFAULT '' COMMENT '应用编号', + `name` VARCHAR(32) DEFAULT '' COMMENT '应用名称', + `version` VARCHAR(8) DEFAULT '' COMMENT '版本号', + `tips` VARCHAR(255) DEFAULT '' COMMENT '版本说明', + `project_id` INT(11) DEFAULT 0 COMMENT '归属项目ID', + `publishtime` DATETIME COMMENT '发布时间', + `publish_range` TINYINT(1) COMMENT '发布范围 1:全网发布 2:灰度发布', + `operator_id` INT(11) COMMENT '操作者ID', + `created_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='APP表'; + +-- APP发布表 +DROP TABLE IF EXISTS `t_app_publish`; +CREATE TABLE `t_app_publish` ( + `id` INT(11) PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + `app_id` INT(11) COMMENT 'APP主键', + `pos_id` INT(11) COMMENT 'POS主键', + `created_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='APP发布表'; + + +# -------------------------------------以下用户管理表开始------------------------------------------- + +-- 后台管理用户表 +DROP TABLE IF EXISTS `t_manager`; +CREATE TABLE `t_manager` ( + `id` INT(11) PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + `username` VARCHAR(32) NOT NULL COMMENT '账号', + `name` VARCHAR(16) DEFAULT '' COMMENT '名字', + `password` VARCHAR(128) DEFAULT '' COMMENT '密码', + `salt` VARCHAR(64) DEFAULT '' COMMENT 'md5密码盐', + `phone` VARCHAR(32) DEFAULT '' COMMENT '联系电话', + `tips` VARCHAR(255) COMMENT '备注', + `state` TINYINT(1) DEFAULT 1 COMMENT '状态 1:正常 2:禁用', + `created_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='后台管理用户表'; +INSERT INTO `t_manager` VALUES (1,'admin','系统管理员','4a496ba2a4172c71540fa643ddc8bb7c','b4752b4b73034de06afb2db30fe19061', '17890908889', '系统管理员', 1, '2017-12-12 09:46:12', '2017-12-12 09:46:12'); +INSERT INTO `t_manager` VALUES (2,'aix','张三','2412d3972722eb186f69a8f4011fbd48','20545a7eaea0241ddf6652a3f9a4ae24', '17859569358', '', 1, '2017-12-12 09:46:12', '2017-12-12 09:46:12'); + +-- 角色表 +DROP TABLE IF EXISTS `t_role`; +CREATE TABLE `t_role` ( + `id` INT(11) PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + `role` VARCHAR(16) DEFAULT '' COMMENT '角色名称', + `description` VARCHAR(255) DEFAULT '' COMMENT '角色说明', + `created_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='角色表'; +INSERT INTO `t_role` VALUES (1,'admin','超级管理员', '2017-12-12 09:46:12', '2017-12-12 09:46:12'); +INSERT INTO `t_role` VALUES (2,'aix','系统监控员', '2017-12-12 09:46:12', '2017-12-12 09:46:12'); + +-- 用户角色关联表 +DROP TABLE IF EXISTS `t_manager_role`; +CREATE TABLE `t_manager_role` ( + `id` INT(11) PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + `manager_id` INT(11) NOT NULL COMMENT '管理用户ID', + `role_id` INT(11) NOT NULL COMMENT '角色ID', + `created_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='用户角色关联表'; +INSERT INTO `t_manager_role` VALUES (1, 1, 1, '2017-05-05 00:00:00','2017-05-05 00:00:00'); +INSERT INTO `t_manager_role` VALUES (2, 2, 2, '2017-05-05 00:00:00','2017-05-05 00:00:00'); + +-- 权限表 +DROP TABLE IF EXISTS `t_permission`; +CREATE TABLE `t_permission` ( + `id` INT(11) PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + `permission` VARCHAR(16) DEFAULT '' COMMENT '权限名称', + `description` VARCHAR(255) DEFAULT '' COMMENT '权限说明', + `created_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='权限表'; +INSERT INTO `t_permission` VALUES (1,'permission:admin','超级管理权限', '2017-12-12 09:46:12', '2017-12-12 09:46:12'); +INSERT INTO `t_permission` VALUES (2,'permission:aix','监控权限', '2017-12-12 09:46:12', '2017-12-12 09:46:12'); +INSERT INTO `t_permission` VALUES (3,'permission:adduser','添加用户权限', '2017-12-12 09:46:12', '2017-12-12 09:46:12'); + +-- 角色权限关联表 +DROP TABLE IF EXISTS `t_role_permission`; +CREATE TABLE `t_role_permission` ( + `id` INT(11) PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + `role_id` INT(11) NOT NULL COMMENT '角色ID', + `permission_id` INT(11) NOT NULL COMMENT '权限ID', + `created_time` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' +) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='角色权限关联表'; +INSERT INTO `t_role_permission` VALUES (1, 1, 1, '2017-12-12 09:46:12', '2017-12-12 09:46:12'); +INSERT INTO `t_role_permission` VALUES (2, 1, 3, '2017-12-12 09:46:12', '2017-12-12 09:46:12'); +INSERT INTO `t_role_permission` VALUES (3, 2, 2, '2017-12-12 09:46:12', '2017-12-12 09:46:12'); + +-- 操作日志表 +DROP TABLE IF EXISTS `t_operation_log`; +CREATE TABLE `t_operation_log` ( + `id` INT(11) PRIMARY KEY AUTO_INCREMENT COMMENT '主键ID', + `operator_id` INT(11) NOT NULL COMMENT '操作者ID', + `target_id` INT(11) NOT NULL COMMENT '操作对象ID', + `target_name` VARCHAR(32) DEFAULT '' COMMENT '操作对象名称', + `operate_type` VARCHAR(32) DEFAULT '' COMMENT '操作类型', + `tips` VARCHAR(255) DEFAULT '' COMMENT '备注', + `created_time` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', + `updated_time` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间' +) ENGINE=InnoDB AUTO_INCREMENT=985 DEFAULT CHARSET=utf8 COMMENT='操作日志表'; + diff --git a/app-manage/src/main/resources/templates/error/404.html b/app-manage/src/main/resources/templates/error/404.html new file mode 100644 index 0000000..e2bf3b1 --- /dev/null +++ b/app-manage/src/main/resources/templates/error/404.html @@ -0,0 +1,22 @@ + + + + 404-页面未找到 + + + + + + +
                    + + +

                    + +

                    +
                    +
                    +
                    
                    +
                    +
                    \ No newline at end of file
                    diff --git a/app-manage/src/main/resources/templates/error/500.html b/app-manage/src/main/resources/templates/error/500.html
                    new file mode 100644
                    index 0000000..c80bce8
                    --- /dev/null
                    +++ b/app-manage/src/main/resources/templates/error/500.html
                    @@ -0,0 +1,10 @@
                    +
                    +
                    +
                    +    500 错误页面
                    +
                    +
                    +

                    500 Error

                    + + + \ No newline at end of file diff --git a/app-manage/src/main/resources/templates/error/shiro_403.html b/app-manage/src/main/resources/templates/error/shiro_403.html new file mode 100644 index 0000000..3f1a2d3 --- /dev/null +++ b/app-manage/src/main/resources/templates/error/shiro_403.html @@ -0,0 +1,10 @@ + + + + 机具管理平台 + + +

                    没有权限

                    + + + \ No newline at end of file diff --git a/app-manage/src/main/resources/templates/index.html b/app-manage/src/main/resources/templates/index.html new file mode 100644 index 0000000..28dbd56 --- /dev/null +++ b/app-manage/src/main/resources/templates/index.html @@ -0,0 +1,119 @@ + + + + + + + 机具管理平台 + + + + + + + +
                    + + + + +
                    +
                    + + + + + 退出 +
                    +
                    + +
                    +
                    + +
                    + + + + + + + + + + + \ No newline at end of file diff --git a/app-manage/src/main/resources/templates/login.html b/app-manage/src/main/resources/templates/login.html new file mode 100644 index 0000000..5ddd8fe --- /dev/null +++ b/app-manage/src/main/resources/templates/login.html @@ -0,0 +1,79 @@ + + + + + + 机具管理平台 + + + + + + + + + +
                    +
                    +
                    +

                    +
                    +

                    欢迎使用机具管理平台

                    +
                    +
                    +
                    +
                    + +
                    +
                    +
                    + +
                    +
                    + +
                    +
                    +
                    + +
                    +
                    + +
                    +
                    +
                    + +
                    + + + +
                    +
                    +
                    + + + + + \ No newline at end of file diff --git a/app-manage/src/main/resources/templates/modules/app/addVersion.html b/app-manage/src/main/resources/templates/modules/app/addVersion.html new file mode 100644 index 0000000..c2a7757 --- /dev/null +++ b/app-manage/src/main/resources/templates/modules/app/addVersion.html @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + +
                    +
                    +
                    +
                    + +
                    +
                    + +
                    +
                    +
                    +
                    + +
                    + + + + +
                    +
                    + + + + + + + + + + + + + + +
                    + +
                    + +
                    +
                    +
                    + +
                    +
                    + +
                    +
                    + +
                    +
                    +
                    + + +
                    +
                    + 提交 + 取消 +
                    +
                    +
                    +
                    +
                    + + + + + + + + + + + + + + diff --git a/app-manage/src/main/resources/templates/modules/app/appManagement.html b/app-manage/src/main/resources/templates/modules/app/appManagement.html new file mode 100644 index 0000000..d5ac0b4 --- /dev/null +++ b/app-manage/src/main/resources/templates/modules/app/appManagement.html @@ -0,0 +1,85 @@ + + + + + + + + + + + + + + + +
                    +
                    +
                    +
                    +
                    + +
                    +
                    + + +
                    +
                    + +
                    +
                    + +
                    +
                    + + +
                    + + 发布新版本 +
                    +
                    + + + + + + + + + + + + + + + +
                    编号应用名称版本号归属项目名称版本说明发布时间发布范围操作者用户名操作者姓名操作
                    +
                    +
                    + + + + + + + + + + + diff --git a/app-manage/src/main/resources/templates/modules/app/grayPublish.html b/app-manage/src/main/resources/templates/modules/app/grayPublish.html new file mode 100644 index 0000000..8f4d0ed --- /dev/null +++ b/app-manage/src/main/resources/templates/modules/app/grayPublish.html @@ -0,0 +1,68 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/app-manage/src/main/resources/templates/modules/common/modifyPassword.html b/app-manage/src/main/resources/templates/modules/common/modifyPassword.html new file mode 100644 index 0000000..73dc3e1 --- /dev/null +++ b/app-manage/src/main/resources/templates/modules/common/modifyPassword.html @@ -0,0 +1,42 @@ + + + + + + 机具管理平台 + + + + + + + + +
                    +
                    +
                    +

                    +
                    +

                    修改密码

                    +
                    +
                    + +
                    +
                    + +
                    +
                    + +
                    + + 取消 +
                    +
                    +
                    + + + + + + diff --git a/app-manage/src/main/resources/templates/modules/common/welcome.html b/app-manage/src/main/resources/templates/modules/common/welcome.html new file mode 100644 index 0000000..2a7c658 --- /dev/null +++ b/app-manage/src/main/resources/templates/modules/common/welcome.html @@ -0,0 +1,24 @@ + + + + + + + + + + + + +
                    +
                    +

                    欢迎您!

                    +
                    +
                    + + + + + + diff --git a/app-manage/src/main/resources/templates/modules/device/deviceDetail.html b/app-manage/src/main/resources/templates/modules/device/deviceDetail.html new file mode 100644 index 0000000..4499fbb --- /dev/null +++ b/app-manage/src/main/resources/templates/modules/device/deviceDetail.html @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + +
                    + 返回 +
                    +
                    +

                    机具详情

                    +
                    +
                    硬件信息
                    +
                    +
                    + + +
                    +
                    + + +
                    +
                    + + +
                    +
                    + + +
                    +
                    + + +
                    +
                    +
                    +
                    +
                    关联信息
                    +
                    +
                    + + +
                    +
                    + + +
                    +
                    + + +
                    + +
                    + + +
                    +
                    + + +
                    +
                    + +
                    + + +
                    +
                    +
                    +
                    +
                    +
                    机具状态
                    +
                    +
                    + + +
                    +
                    +
                    +
                    +
                    +
                    + + + + + + + + + + diff --git a/app-manage/src/main/resources/templates/modules/device/deviceManagement.html b/app-manage/src/main/resources/templates/modules/device/deviceManagement.html new file mode 100644 index 0000000..2658bdc --- /dev/null +++ b/app-manage/src/main/resources/templates/modules/device/deviceManagement.html @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + +
                    +
                    +
                    +
                    +
                    + +
                    +
                    + +
                    +
                    + +
                    + +
                    +
                    + + + + + + + + + + + + + +
                    机具IMEI码机具型号入网时间机具归属网点机具状态机具归属项目备注操作
                    +
                    +
                    + + + + + + + + + diff --git a/app-manage/src/main/resources/templates/modules/monitor/deviceStatus.html b/app-manage/src/main/resources/templates/modules/monitor/deviceStatus.html new file mode 100644 index 0000000..cc02f5e --- /dev/null +++ b/app-manage/src/main/resources/templates/modules/monitor/deviceStatus.html @@ -0,0 +1,75 @@ + + + + + + + + + + + + + + + +
                    +
                    +
                    +
                    + +
                    +
                    +
                    +
                    入网机具总数(台)
                    +
                    xx
                    +
                    +
                    +
                    +
                    布放单位数(个)
                    +
                    xx
                    +
                    +
                    +
                    +
                    +
                    +
                    + +
                    + +
                    +
                    + + + + + + + + + +
                    机具归属网点名称机具归属项目机具数量操作
                    +
                    +
                    + + + + + + + + + + diff --git a/app-manage/src/main/resources/templates/modules/monitor/deviceStatusDetail.html b/app-manage/src/main/resources/templates/modules/monitor/deviceStatusDetail.html new file mode 100644 index 0000000..bc1b386 --- /dev/null +++ b/app-manage/src/main/resources/templates/modules/monitor/deviceStatusDetail.html @@ -0,0 +1,65 @@ + + + + + + + + + + + + + + + +
                    + 返回 +
                    +
                    +
                    昆明公安局车管所
                    + +
                    +
                    +
                    +
                    + +
                    +
                    + +
                    + +
                    +
                    + + + + + + + + + + +
                    机具IMEI码机具型号机具上传时间(离线时显示最近一次机具上传的时间)布放地址(离线时显示最近一次在线的地址)应用状态
                    +
                    +
                    + + + + + + + + + + diff --git a/app-manage/src/main/resources/templates/modules/project/projectManagement.html b/app-manage/src/main/resources/templates/modules/project/projectManagement.html new file mode 100644 index 0000000..50ea132 --- /dev/null +++ b/app-manage/src/main/resources/templates/modules/project/projectManagement.html @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + +
                    +
                    +
                    +
                    +
                    + +
                    +

                    点击添加项目

                    +
                    +
                    + x +
                    + +
                    +

                    非税收入收费

                    +
                    +
                    +
                    +
                    + + + + + + + + + + + + diff --git a/app-manage/src/main/resources/templates/modules/user/userEdit.html b/app-manage/src/main/resources/templates/modules/user/userEdit.html new file mode 100644 index 0000000..ac9b139 --- /dev/null +++ b/app-manage/src/main/resources/templates/modules/user/userEdit.html @@ -0,0 +1,60 @@ + +
                    +
                    + +
                    + + +
                    +
                    +
                    +
                    + +
                    + +
                    +
                    +
                    +
                    + +
                    +
                    + +
                    +
                    +
                    +
                    + +
                    + +
                    +
                    +
                    + +
                    + +
                    +
                    +
                    + +
                    +
                    + +
                    +
                    + +
                    +
                    +
                    +
                    +
                    diff --git a/app-manage/src/main/resources/templates/modules/user/userManagement.html b/app-manage/src/main/resources/templates/modules/user/userManagement.html new file mode 100644 index 0000000..bf415a8 --- /dev/null +++ b/app-manage/src/main/resources/templates/modules/user/userManagement.html @@ -0,0 +1,149 @@ + + + + + + + + + + + + + + + + + +
                    +
                    +
                    +
                    +
                    + +
                    +
                    + +
                    +
                    + +
                    +
                    + + +
                    + + 添加用户 +
                    +
                    + + + + + + + + + + + + + +
                    用户名姓名联系电话归属项目备注状态创建时间操作
                    +
                    +
                    + + + + + + + + + + + + + + diff --git a/app-manage/src/test/java/com/enzhico/pos/ApplicationTests.java b/app-manage/src/test/java/com/enzhico/pos/ApplicationTests.java new file mode 100644 index 0000000..2694112 --- /dev/null +++ b/app-manage/src/test/java/com/enzhico/pos/ApplicationTests.java @@ -0,0 +1,35 @@ +package com.enzhico.pos; + +import com.enzhico.pos.async.AsyncTask; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Future; + +/** + * 测试异步任务 + */ +@RunWith(SpringRunner.class) +@SpringBootTest +public class ApplicationTests { + private static final Logger log = LoggerFactory.getLogger(ApplicationTests.class); + @Autowired + private AsyncTask asyncTask; + + @Test + public void testAsync() throws InterruptedException, ExecutionException { + asyncTask.dealNoReturnTask(); + + Future f = asyncTask.dealHaveReturnTask(5); + + log.info("主线程执行finished"); + + log.info(f.get()); + } +} diff --git a/app-manage/src/test/java/com/enzhico/pos/SimpleTest.java b/app-manage/src/test/java/com/enzhico/pos/SimpleTest.java new file mode 100644 index 0000000..59a4e2d --- /dev/null +++ b/app-manage/src/test/java/com/enzhico/pos/SimpleTest.java @@ -0,0 +1,51 @@ +package com.enzhico.pos; + +import com.enzhico.pos.shiro.ShiroKit; +import org.junit.Test; + +import java.nio.file.*; + +/** + * SimpleTest + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/4 + */ +public class SimpleTest { + @Test + public void testMd5() { + //盐(用户名+随机数) + String username = "admin"; + String salt = ShiroKit.getRandomSalt(16); + //原密码 + String password = "12345678"; + String encodedPassword = ShiroKit.md5(password, username + salt); + System.out.println("这个是保存进数据库的密码:" + encodedPassword); + System.out.println("这个是保存进数据库的盐:" + salt); + } + + @Test + public void test1() throws Exception { + WatchService watchService + = FileSystems.getDefault().newWatchService(); + + Path path = Paths.get(System.getProperty("user.home")); + + path.register( + watchService, + StandardWatchEventKinds.ENTRY_CREATE, + StandardWatchEventKinds.ENTRY_DELETE, + StandardWatchEventKinds.ENTRY_MODIFY); + + WatchKey key; + while ((key = watchService.take()) != null) { + for (WatchEvent event : key.pollEvents()) { + System.out.println( + "Event kind:" + event.kind() + + ". File affected: " + event.context() + "."); + } + key.reset(); + } + } +} diff --git a/app-manage/src/test/java/com/enzhico/pos/common/util/CommonUtilTest.java b/app-manage/src/test/java/com/enzhico/pos/common/util/CommonUtilTest.java new file mode 100644 index 0000000..8b4db9f --- /dev/null +++ b/app-manage/src/test/java/com/enzhico/pos/common/util/CommonUtilTest.java @@ -0,0 +1,24 @@ +package com.enzhico.pos.common.util; + +import org.junit.Test; + +import static org.hamcrest.Matchers.*; +import static org.junit.Assert.*; + +public class CommonUtilTest { + + @Test + public void isNewer() { + assertThat(CommonUtil.isNewer("1.2.1", "1.2.0"), is(true)); + assertThat(CommonUtil.isNewer("1.2", "1.2.0"), is(false)); + assertThat(CommonUtil.isNewer("2.1.9", "1.2.0"), is(true)); + assertThat(CommonUtil.isNewer("adfa.1.3", "1.2.0"), is(false)); + } + + @Test + public void testTimestamp() { + // 1516072088813 + // 1441594722 + System.out.println(System.currentTimeMillis()); + } +} \ No newline at end of file diff --git a/app-manage/src/test/java/com/enzhico/pos/crypto/asymmetric/RSAUtil.java b/app-manage/src/test/java/com/enzhico/pos/crypto/asymmetric/RSAUtil.java new file mode 100644 index 0000000..17b464a --- /dev/null +++ b/app-manage/src/test/java/com/enzhico/pos/crypto/asymmetric/RSAUtil.java @@ -0,0 +1,305 @@ +package com.enzhico.pos.crypto.asymmetric; + +import org.apache.commons.codec.binary.Base64; + +import javax.crypto.Cipher; +import java.nio.charset.Charset; +import java.security.*; +import java.security.interfaces.RSAPrivateKey; +import java.security.interfaces.RSAPublicKey; +import java.security.spec.PKCS8EncodedKeySpec; +import java.security.spec.X509EncodedKeySpec; +import java.util.HashMap; +import java.util.Map; + +/** + * 非对称加密算法:RSA + * 非对称算法一般是用来传送对称加密算法的密钥来使用的 + * + * RSA 算法规定: + * 待加密的字节数不能超过密钥的长度值除以 8 再减去 11(即:KeySize / 8 - 11), + * 而加密后得到密文的字节数,正好是密钥的长度值除以 8(即:KeySize / 8) + * 也就是对于常见的2048位的密钥,最大加密长度为256 - 11 = 245个字节 + * + * RSA: + * RSA是企业级应用标准,很多第三方的加密软件使用RSA 2048bit加密 + * + * 优点: + *  密码分配简单,安全保障性高 + * + * 缺点: + * 1.速度慢,RSA最快的情况也比DES慢上好几倍,RSA的速度比对应同样安全级别的对称密码算法要慢1000倍左右 + * 2.一般来说只用于少量数据加密 + * 3.产生密钥很麻烦,受到素数产生技术的限制,因而难以做到一次一密。 + * + * 实际上,这些缺点是非对称加密本身的局限。 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/21 + */ +public class RSAUtil { + // 非对称密钥算法 + private static final String KEY_ALGORITHM = "RSA"; + // 密钥长度必须是64的倍数,在512到65536位之间 + private static final int KEY_SIZE = 2048; + // 公钥 + private static final String PUBLIC_KEY = "RSAPublicKey"; + // 私钥 + private static final String PRIVATE_KEY = "RSAPrivateKey"; + // 字符编码 + private static final Charset UTF8 = Charset.forName("UTF-8"); + + /** + * 私钥加密 + * + * @param dataStr 待加密数据 + * @param key 密钥 + * @return byte[] 加密数据 + */ + public static byte[] encryptByPrivateKey(String dataStr, byte[] key) throws Exception { + //取得私钥 + PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + //生成私钥 + PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec); + //数据加密 + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.ENCRYPT_MODE, privateKey); + return cipher.doFinal(dataStr.getBytes(UTF8)); + } + + /** + * 公钥加密 + * + * @param dataStr 待加密数据 + * @param key 密钥 + * @return byte[] 加密数据 + */ + public static byte[] encryptByPublicKey(String dataStr, byte[] key) throws Exception { + + //实例化密钥工厂 + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + //初始化公钥,密钥材料转换 + X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key); + //产生公钥 + PublicKey pubKey = keyFactory.generatePublic(x509KeySpec); + + //数据加密 + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.ENCRYPT_MODE, pubKey); + return cipher.doFinal(dataStr.getBytes(UTF8)); + } + + /** + * 私钥解密 + * + * @param data 待解密数据 + * @param key 密钥 + * @return String 解密数据 + */ + public static String decryptByPrivateKey(byte[] data, byte[] key) throws Exception { + //取得私钥 + PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + //生成私钥 + PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec); + //数据解密 + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.DECRYPT_MODE, privateKey); + return new String(cipher.doFinal(data), UTF8); + } + + /** + * 公钥解密 + * + * @param data 待解密数据 + * @param key 密钥 + * @return String 解密数据 + */ + public static String decryptByPublicKey(byte[] data, byte[] key) throws Exception { + //实例化密钥工厂 + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + //初始化公钥,密钥材料转换 + X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key); + //产生公钥 + PublicKey pubKey = keyFactory.generatePublic(x509KeySpec); + //数据解密 + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.DECRYPT_MODE, pubKey); + return new String(cipher.doFinal(data), UTF8); + } + + /** + * 初始化密钥对 + * + * @return Map 甲方密钥的Map + */ + private static Map initKey() throws Exception { + //实例化密钥生成器 + KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(KEY_ALGORITHM); + //初始化密钥生成器 + keyPairGenerator.initialize(KEY_SIZE); + //生成密钥对 + KeyPair keyPair = keyPairGenerator.generateKeyPair(); + //甲方公钥 + RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); + //甲方私钥 + RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); + //将密钥存储在map中 + Map keyMap = new HashMap(); + keyMap.put(PUBLIC_KEY, publicKey); + keyMap.put(PRIVATE_KEY, privateKey); + return keyMap; + } + + /** + * 私钥加密 + * + * @param data 待加密数据 + * @param key 密钥 + * @return byte[] 加密数据 + */ + private static byte[] encryptByPrivateKey0(byte[] data, byte[] key) throws Exception { + //取得私钥 + PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + //生成私钥 + PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec); + //数据加密 + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.ENCRYPT_MODE, privateKey); + return cipher.doFinal(data); + } + + /** + * 公钥加密 + * + * @param data 待加密数据 + * @param key 密钥 + * @return byte[] 加密数据 + */ + private static byte[] encryptByPublicKey0(byte[] data, byte[] key) throws Exception { + + //实例化密钥工厂 + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + //初始化公钥,密钥材料转换 + X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key); + //产生公钥 + PublicKey pubKey = keyFactory.generatePublic(x509KeySpec); + + //数据加密 + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.ENCRYPT_MODE, pubKey); + return cipher.doFinal(data); + } + + /** + * 私钥解密 + * + * @param data 待解密数据 + * @param key 密钥 + * @return byte[] 解密数据 + */ + private static byte[] decryptByPrivateKey0(byte[] data, byte[] key) throws Exception { + //取得私钥 + PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(key); + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + //生成私钥 + PrivateKey privateKey = keyFactory.generatePrivate(pkcs8KeySpec); + //数据解密 + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.DECRYPT_MODE, privateKey); + return cipher.doFinal(data); + } + + /** + * 公钥解密 + * + * @param data 待解密数据 + * @param key 密钥 + * @return byte[] 解密数据 + */ + private static byte[] decryptByPublicKey0(byte[] data, byte[] key) throws Exception { + //实例化密钥工厂 + KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); + //初始化公钥,密钥材料转换 + X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(key); + //产生公钥 + PublicKey pubKey = keyFactory.generatePublic(x509KeySpec); + //数据解密 + Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm()); + cipher.init(Cipher.DECRYPT_MODE, pubKey); + return cipher.doFinal(data); + } + + /** + * 取得私钥 + * + * @param keyMap 密钥map + * @return byte[] 私钥 + */ + private static byte[] getPrivateKey(Map keyMap) { + Key key = (Key) keyMap.get(PRIVATE_KEY); + return key.getEncoded(); + } + + /** + * 取得公钥 + * + * @param keyMap 密钥map + * @return byte[] 公钥 + */ + private static byte[] getPublicKey(Map keyMap) throws Exception { + Key key = (Key) keyMap.get(PUBLIC_KEY); + return key.getEncoded(); + } + + /** + * @param args args + * @throws Exception ex + */ + public static void main(String[] args) throws Exception { + //初始化密钥,生成密钥对 + Map keyMap = initKey(); + //公钥 + byte[] publicKey = getPublicKey(keyMap); + + //私钥 + byte[] privateKey = getPrivateKey(keyMap); + System.out.println("公钥:" + Base64.encodeBase64String(publicKey)); + System.out.println("私钥:" + Base64.encodeBase64String(privateKey)); + + System.out.println("================密钥对构造完毕,甲方将公钥公布给乙方,开始进行加密数据的传输============="); + String str = "RSA密码交换算法"; + System.out.println("===========甲方向乙方发送加密数据=============="); + System.out.println("原文:" + str); + //甲方进行数据的加密 + byte[] code1 = encryptByPrivateKey(str, privateKey); + System.out.println("加密后的数据:" + Base64.encodeBase64String(code1)); + System.out.println("===========乙方使用甲方提供的公钥对数据进行解密=============="); + //乙方进行数据的解密 + String decode1 = decryptByPublicKey(code1, publicKey); + System.out.println("乙方解密后的数据:" + decode1); + + System.out.println("===========反向进行操作,乙方向甲方发送数据=============="); + + str = "乙方向甲方发送数据RSA算法"; + + System.out.println("原文:" + str); + + //乙方使用公钥对数据进行加密 + byte[] code2 = encryptByPublicKey(str, publicKey); + System.out.println("===========乙方使用公钥对数据进行加密=============="); + System.out.println("加密后的数据:" + Base64.encodeBase64String(code2)); + + System.out.println("=============乙方将数据传送给甲方======================"); + System.out.println("===========甲方使用私钥对数据进行解密=============="); + + //甲方使用私钥对数据进行解密 + String decode2 = decryptByPrivateKey(code2, privateKey); + + System.out.println("甲方解密后的数据:" + decode2); + } + +} diff --git a/app-manage/src/test/java/com/enzhico/pos/crypto/symmetric/AESUtil.java b/app-manage/src/test/java/com/enzhico/pos/crypto/symmetric/AESUtil.java new file mode 100644 index 0000000..9f9661c --- /dev/null +++ b/app-manage/src/test/java/com/enzhico/pos/crypto/symmetric/AESUtil.java @@ -0,0 +1,79 @@ +package com.enzhico.pos.crypto.symmetric; + +import org.apache.commons.codec.binary.Hex; + +import javax.crypto.Cipher; +import javax.crypto.spec.SecretKeySpec; +import java.nio.charset.Charset; +import java.security.Key; + +/** + * 对称加密/解密算法(推荐算法):AES + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/21 + */ +public class AESUtil { + private static final String DATA = "这个是内容"; + private static final String KEY_ALGORITHM = "AES"; + private static final String CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding"; + private static final Charset UTF8 = Charset.forName("UTF-8"); + + public static byte[] encrypt(String data, String key) throws Exception { + return encrypt(data.getBytes(UTF8), key.getBytes(UTF8)); + } + + public static byte[] encrypt(String data, byte[] key) throws Exception { + return encrypt(data.getBytes(UTF8), key); + } + + public static byte[] encrypt(byte[] data, String key) throws Exception { + return encrypt(data, key.getBytes(UTF8)); + } + + public static byte[] encrypt(byte[] data, byte[] key) throws Exception { + Key k = genSecretKey(key); + Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); + cipher.init(Cipher.ENCRYPT_MODE, k); + return cipher.doFinal(data); + } + + public static byte[] decrypt(String data, String key) throws Exception { + return decrypt(data.getBytes(UTF8), key.getBytes(UTF8)); + } + + public static byte[] decrypt(String data, byte[] key) throws Exception { + return decrypt(data.getBytes(UTF8), key); + } + + public static byte[] decrypt(byte[] data, String key) throws Exception { + return decrypt(data, key.getBytes(UTF8)); + } + + public static byte[] decrypt(byte[] data, byte[] key) throws Exception { + Key k = genSecretKey(key); + Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); + cipher.init(Cipher.DECRYPT_MODE, k); + return cipher.doFinal(data); + } + + /** + * AES only supports key sizes of 16, 24 or 32 bytes + */ + public static Key genSecretKey(byte[] key) throws Exception { + if (key.length == 16 || key.length == 24 || key.length == 32) { + return new SecretKeySpec(key, KEY_ALGORITHM); + } + throw new IllegalArgumentException("AES only supports key sizes of 16, 24 or 32 bytes"); + } + + public static void main(String[] args) throws Exception { + String key = "1234567890123456"; + byte[] desResult = encrypt(DATA, key); + System.out.println(DATA + ">>>AES 加密结果>>>" + Hex.encodeHexString(desResult)); + + byte[] desPlain = decrypt(desResult, key); + System.out.println(DATA + ">>>AES 解密结果>>>" + new String(desPlain, Charset.forName("UTF-8"))); + } +} diff --git a/app-manage/src/test/java/com/enzhico/pos/crypto/symmetric/DESTripleUtil.java b/app-manage/src/test/java/com/enzhico/pos/crypto/symmetric/DESTripleUtil.java new file mode 100644 index 0000000..8c2a92d --- /dev/null +++ b/app-manage/src/test/java/com/enzhico/pos/crypto/symmetric/DESTripleUtil.java @@ -0,0 +1,91 @@ +package com.enzhico.pos.crypto.symmetric; + +import org.apache.commons.codec.binary.Hex; + +import javax.crypto.Cipher; +import javax.crypto.SecretKey; +import javax.crypto.spec.SecretKeySpec; +import java.io.UnsupportedEncodingException; +import java.nio.charset.Charset; + +/** + * 对称加密/解密算法:3DES(DES加强版,使用3次DES计算,Triple DES,DESede) + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/21 + */ +public class DESTripleUtil { + private static final String DATA = "这个是内容"; + /* 算法名称 */ + private static final String KEY_ALGORITHM = "DESede"; + /* 算法名称/加密模式/填充方式 */ + private static final String CIPHER_ALGORITHM = "DESede/ECB/PKCS5Padding"; + private static final Charset UTF8 = Charset.forName("UTF-8"); + + public static byte[] encrypt(String data, String key) throws Exception { + return encrypt(data.getBytes(UTF8), key.getBytes(UTF8)); + } + + public static byte[] encrypt(String data, byte[] key) throws Exception { + return encrypt(data.getBytes(UTF8), key); + } + + public static byte[] encrypt(byte[] data, String key) throws Exception { + return encrypt(data, key.getBytes(UTF8)); + } + + public static byte[] encrypt(byte[] data, byte[] key) throws Exception { + SecretKey secretKey = build3DesKey(key); + Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); + cipher.init(Cipher.ENCRYPT_MODE, secretKey); + return cipher.doFinal(data); + } + + public static byte[] decrypt(String data, String key) throws Exception { + return decrypt(data.getBytes(UTF8), key.getBytes(UTF8)); + } + + public static byte[] decrypt(String data, byte[] key) throws Exception { + return decrypt(data.getBytes(UTF8), key); + } + + public static byte[] decrypt(byte[] data, String key) throws Exception { + return decrypt(data, key.getBytes(UTF8)); + } + + public static byte[] decrypt(byte[] data, byte[] key) throws Exception { + SecretKey secretKey = build3DesKey(key); + Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); + cipher.init(Cipher.DECRYPT_MODE, secretKey); + return cipher.doFinal(data); + } + + /* + * 根据字符串生成密钥字节数组 + * @param key 密钥字节数组 + * @return + * @throws UnsupportedEncodingException + */ + public static SecretKey build3DesKey(byte[] keyTemp) throws UnsupportedEncodingException { + byte[] keyResult = new byte[24]; //声明一个24位的字节数组,默认里面都是0 + // 执行数组拷贝 + if (keyResult.length > keyTemp.length) { + //如果temp不够24位,则拷贝temp数组整个长度的内容到key数组中 + System.arraycopy(keyTemp, 0, keyResult, 0, keyTemp.length); + } else { + //如果temp大于24位,则拷贝temp数组24个长度的内容到key数组中 + System.arraycopy(keyTemp, 0, keyResult, 0, keyResult.length); + } + return new SecretKeySpec(keyResult, KEY_ALGORITHM); + } + + public static void main(String[] args) throws Exception { + String key = "1233344534534423423"; + byte[] desResult = encrypt(DATA, key); + System.out.println(DATA + ">>>DESede 加密结果>>>" + Hex.encodeHexString(desResult)); + + byte[] desPlain = decrypt(desResult, key); + System.out.println(DATA + ">>>DESede 解密结果>>>" + new String(desPlain, Charset.forName("UTF-8"))); + } +} diff --git a/app-manage/src/test/java/com/enzhico/pos/crypto/symmetric/DESUtil.java b/app-manage/src/test/java/com/enzhico/pos/crypto/symmetric/DESUtil.java new file mode 100644 index 0000000..7ef0c85 --- /dev/null +++ b/app-manage/src/test/java/com/enzhico/pos/crypto/symmetric/DESUtil.java @@ -0,0 +1,75 @@ +package com.enzhico.pos.crypto.symmetric; + +import org.apache.commons.codec.binary.Hex; + +import javax.crypto.Cipher; +import javax.crypto.KeyGenerator; +import javax.crypto.SecretKey; +import java.nio.charset.Charset; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; + +/** + * 对称加密算法:DES + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/21 + */ +public class DESUtil { + private static final String DATA = "这个是内容"; + /* 算法名称 */ + private static final String KEY_ALGORITHM = "DES"; + /* 算法名称/加密模式/填充方式 */ + private static final String CIPHER_ALGORITHM = "DES/ECB/PKCS5Padding"; + private static final Charset UTF8 = Charset.forName("UTF-8"); + + public static byte[] encrypt(String data, String key) throws Exception { + return encrypt(data.getBytes(UTF8), key.getBytes(UTF8)); + } + public static byte[] encrypt(String data, byte[] key) throws Exception { + return encrypt(data.getBytes(UTF8), key); + } + public static byte[] encrypt(byte[] data, String key) throws Exception { + return encrypt(data, key.getBytes(UTF8)); + } + public static byte[] encrypt(byte[] data, byte[] key) throws Exception { + SecretKey secretKey = generateSecretKey(key); + Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); + cipher.init(Cipher.ENCRYPT_MODE, secretKey); + return cipher.doFinal(data); + } + + public static byte[] decrypt(String data, String key) throws Exception { + return decrypt(data.getBytes(UTF8), key.getBytes(UTF8)); + } + public static byte[] decrypt(String data, byte[] key) throws Exception { + return decrypt(data.getBytes(UTF8), key); + } + public static byte[] decrypt(byte[] data, String key) throws Exception { + return decrypt(data, key.getBytes(UTF8)); + } + public static byte[] decrypt(byte[] data, byte[] key) throws Exception { + SecretKey secretKey = generateSecretKey(key); + Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); + cipher.init(Cipher.DECRYPT_MODE, secretKey); + return cipher.doFinal(data); + } + + private static SecretKey generateSecretKey(byte[] key) throws NoSuchAlgorithmException { + SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG"); + secureRandom.setSeed(key); + KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM); + kg.init(secureRandom); + return kg.generateKey(); + } + + public static void main(String[] args) throws Exception { + String key = "1233344534534423423"; + byte[] desResult = encrypt(DATA, key); + System.out.println(DATA + ">>>DES 加密结果>>>" + Hex.encodeHexString(desResult)); + + byte[] desPlain = decrypt(desResult, key); + System.out.println(DATA + ">>>DES 解密结果>>>" + new String(desPlain, Charset.forName("UTF-8"))); + } +} diff --git a/springboot-aop/.gitignore b/springboot-aop/.gitignore new file mode 100644 index 0000000..1e3c5bb --- /dev/null +++ b/springboot-aop/.gitignore @@ -0,0 +1,14 @@ +# 此为注释– 将被Git 忽略 +# /结尾表示是目录,忽略目录和目录下的所有件 +# /开头表示根目录,否则是.gitignore的相对目录 +# !开头表示反选 +.idea/ +target/ +*.iml +*.ipr +*.iws +*.log +.svn/ +.project +rebel.xml +.rebel-remote.xml.* diff --git a/springboot-aop/LICENSE b/springboot-aop/LICENSE new file mode 100644 index 0000000..83cd47d --- /dev/null +++ b/springboot-aop/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2018 Xiong Neng + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/springboot-aop/README.md b/springboot-aop/README.md new file mode 100644 index 0000000..c1187c0 --- /dev/null +++ b/springboot-aop/README.md @@ -0,0 +1,25 @@ +## SpringBoot AOP演示项目 + +面向切面编程 + +几个重要概念搞清楚就行 + +* 执行点(Executepoint) - 类初始化,方法调用。 +* 连接点(Joinpoint) - 执行点+方位的组合,可确定Joinpoint,比如类开始初始化前,类初始化后,方法调用前,方法调用后。 +* 切点(Pointcut) - 在众多执行点中,定位感兴趣的执行点。Executepoint相当于数据库表中的记录,而Pointcut相当于查询条件。 +* 增强(Advice) - 织入到目标类连接点上的一段程序代码。除了一段程序代码外,还拥有执行点的方位信息。 +* 目标对象(Target) - 增强逻辑的织入目标类 +* 引介(Introduction) - 一种特殊的增强(advice),它为类添加一些额外的属性和方法,动态为业务类添加其他接口的实现逻辑,让业务类成为这个接口的实现类。 +* 代理(Proxy) - 一个类被AOP织入后,产生一个结果类,它便是融合了原类和增强逻辑的代理类。 +* 切面(Aspect) - 切面由切点(Pointcut)和增强(Advice/Introduction)组成,既包括横切逻辑定义,也包括连接点定义。 + +AOP工作重点: + +1. 如何通过切点(Pointcut)和增强(Advice)定位到连接点(Jointpoint)上; +2. 如何在增强(Advice)中编写切面的代码。 + +## 许可证 + +Copyright (c) 2018 Xiong Neng + +基于 MIT 协议发布: diff --git a/springboot-aop/pom.xml b/springboot-aop/pom.xml new file mode 100644 index 0000000..acbb69f --- /dev/null +++ b/springboot-aop/pom.xml @@ -0,0 +1,90 @@ + + + 4.0.0 + + com.enzhico + springboot-aop + 1.0.0-SNAPSHOT + jar + + springboot-aop + SpringBoot AOP演示 + + + org.springframework.boot + spring-boot-starter-parent + 1.5.9.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + org.springframework.boot + spring-boot-starter-jetty + + + org.springframework.boot + spring-boot-starter-aop + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.6.1 + + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.20 + + true + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + + + src/main/resources + + + src/main/java + + **/*.xml + + + + + + diff --git a/springboot-aop/run.sh b/springboot-aop/run.sh new file mode 100644 index 0000000..955efb1 --- /dev/null +++ b/springboot-aop/run.sh @@ -0,0 +1,72 @@ +#!/bin/bash +# 项目自动更新脚本 +# 先clone相应的分支下来: +# git clone ssh://git@120.24.173.142:7999/xxx.git +# 远程调试启动: +# nohup java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -Xms512m -Xmx1024m -jar -Dspring.profiles.active=${profile} ${jarfile} >/dev/null 2>&1 & + +function start { + profile="$1" + echo "启动环境profile=${profile}" + jarfile=$(ls target/*.jar) + if [[ "$?" == "0" ]]; then + stop $profile $jarfile + fi + branch=$(git branch |awk '{print $2}') + git pull origin ${branch} + echo "更新完代码开始重新打包" + mvn clean && mvn clean && mvn package -DskipTests=true + if [[ "$?" != "0" ]]; then + echo "编译出错,退出!" + exit 1 + fi + echo "nohup java -Xms512m -Xmx1024m -jar -Dspring.profiles.active=${profile} ${jarfile} >/dev/null 2>&1 &" + nohup java -Xms512m -Xmx1024m -jar -Dspring.profiles.active=${profile} ${jarfile} >/dev/null 2>&1 & + echo "启动应用中,请查看日志文件..." +} + +function stop { + profile="$1" + jarfile="$2" + ps aux | grep "${jarfile}" | grep "spring.profiles.active=${profile}" | grep -v grep > /dev/null + if [[ "$?" == "0" ]]; then + echo "该应用还在跑,我先停了它" + pid=$(ps aux | grep "${jarfile}" | grep "spring.profiles.active=${profile}" | grep -v grep |awk '{print $2}') + if [[ "$pid" != "" ]]; then + kill -9 $pid + fi + echo "停止应用成功..." + fi +} + +if [[ "$1" == "start" ]]; then + if [[ "$#" < 2 ]]; then + echo "请输入正确参数:./epay.sh start {profile}" + exit 1 + fi + profile="$2" + if [[ "$profile" != "dev" && "$profile" != "test" && "$profile" != "show" && "$profile" != "production" ]]; then + echo "参数错误,请输入正确的profile参数,使用方法:" + echo "./epay.sh start {profile} ==> 启动应用,{profile}取值:dev|test|show|production" + exit 1 + fi + start "${profile}" +elif [[ "$1" == "stop" ]]; then + if [[ "$#" < 2 ]]; then + echo "请输入正确参数:./epay.sh stop {profile}" + exit 1 + fi + profile="$2" + if [[ "$profile" != "dev" && "$profile" != "test" && "$profile" != "show" && "$profile" != "production" ]]; then + echo "参数错误,请输入正确的profile参数,使用方法:" + echo "./epay.sh stop {profile} ==> 停止应用,{profile}取值:dev|test|show|production" + exit 1 + fi + jarfile=$(ls target/*.jar) + stop $profile $jarfile +else + echo "参数错误,使用方法:{}参数是必填的,[]参数可选" + echo "./epay.sh start {profile} ==> 启动应用,{profile}取值:dev|test|show|production" + echo "./epay.sh stop {profile} ==> 停止应用,{profile}取值:dev|test|show|production" + exit 1 +fi diff --git a/springboot-aop/src/main/java/com/enzhico/aop/Application.java b/springboot-aop/src/main/java/com/enzhico/aop/Application.java new file mode 100644 index 0000000..8a667c9 --- /dev/null +++ b/springboot-aop/src/main/java/com/enzhico/aop/Application.java @@ -0,0 +1,12 @@ +package com.enzhico.aop; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/springboot-aop/src/main/java/com/enzhico/aop/aspect/LogAspect.java b/springboot-aop/src/main/java/com/enzhico/aop/aspect/LogAspect.java new file mode 100644 index 0000000..3ad4ff0 --- /dev/null +++ b/springboot-aop/src/main/java/com/enzhico/aop/aspect/LogAspect.java @@ -0,0 +1,67 @@ +package com.enzhico.aop.aspect; + +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.*; +import org.springframework.stereotype.Component; +import org.springframework.web.context.request.RequestContextHolder; +import org.springframework.web.context.request.ServletRequestAttributes; + +import javax.servlet.http.HttpServletRequest; +import java.util.Arrays; + +/** + * 日志切面 + */ +@Aspect +@Component +public class LogAspect { + @Pointcut("execution(public * com.enzhico.aop.controller.*.*(..))") + public void webLog(){} + + @Before("webLog()") + public void deBefore(JoinPoint joinPoint) throws Throwable { + // 接收到请求,记录请求内容 + ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes(); + HttpServletRequest request = attributes.getRequest(); + // 记录下请求内容 + System.out.println("URL : " + request.getRequestURL().toString()); + System.out.println("HTTP_METHOD : " + request.getMethod()); + System.out.println("IP : " + request.getRemoteAddr()); + System.out.println("CLASS_METHOD : " + joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName()); + System.out.println("ARGS : " + Arrays.toString(joinPoint.getArgs())); + + } + + @AfterReturning(returning = "ret", pointcut = "webLog()") + public void doAfterReturning(Object ret) throws Throwable { + // 处理完请求,返回内容 + System.out.println("方法的返回值 : " + ret); + } + + //后置异常通知 + @AfterThrowing("webLog()") + public void throwss(JoinPoint jp){ + System.out.println("方法异常时执行....."); + } + + //后置最终通知,final增强,不管是抛出异常或者正常退出都会执行 + @After("webLog()") + public void after(JoinPoint jp){ + System.out.println("方法最后执行....."); + } + + //环绕通知,环绕增强,相当于MethodInterceptor + @Around("webLog()") + public Object arround(ProceedingJoinPoint pjp) { + System.out.println("方法环绕start....."); + try { + Object o = pjp.proceed(); + System.out.println("方法环绕proceed,结果是 :" + o); + return o; + } catch (Throwable e) { + e.printStackTrace(); + return null; + } + } +} \ No newline at end of file diff --git a/springboot-aop/src/main/java/com/enzhico/aop/aspect/UserAccess.java b/springboot-aop/src/main/java/com/enzhico/aop/aspect/UserAccess.java new file mode 100644 index 0000000..0ee659b --- /dev/null +++ b/springboot-aop/src/main/java/com/enzhico/aop/aspect/UserAccess.java @@ -0,0 +1,12 @@ +package com.enzhico.aop.aspect; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Target({ElementType.METHOD, ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +public @interface UserAccess { + String desc() default "无信息"; +} \ No newline at end of file diff --git a/springboot-aop/src/main/java/com/enzhico/aop/aspect/UserAccessAspect.java b/springboot-aop/src/main/java/com/enzhico/aop/aspect/UserAccessAspect.java new file mode 100644 index 0000000..8a07d5f --- /dev/null +++ b/springboot-aop/src/main/java/com/enzhico/aop/aspect/UserAccessAspect.java @@ -0,0 +1,33 @@ +package com.enzhico.aop.aspect; + +import org.aspectj.lang.JoinPoint; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.*; +import org.springframework.stereotype.Component; + +@Component +@Aspect +public class UserAccessAspect { + + @Pointcut(value = "@annotation(com.enzhico.aop.aspect.UserAccess)") + public void access() { + + } + + @Before("access()") + public void deBefore(JoinPoint joinPoint) throws Throwable { + System.out.println("second before"); + } + + @Around("@annotation(userAccess)") + public Object around(ProceedingJoinPoint pjp, UserAccess userAccess) { + //获取注解里的值 + System.out.println("second around:" + userAccess.desc()); + try { + return pjp.proceed(); + } catch (Throwable throwable) { + throwable.printStackTrace(); + return null; + } + } +} \ No newline at end of file diff --git a/springboot-aop/src/main/java/com/enzhico/aop/controller/UserController.java b/springboot-aop/src/main/java/com/enzhico/aop/controller/UserController.java new file mode 100644 index 0000000..e0ecd04 --- /dev/null +++ b/springboot-aop/src/main/java/com/enzhico/aop/controller/UserController.java @@ -0,0 +1,29 @@ +package com.enzhico.aop.controller; + +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.enzhico.aop.aspect.UserAccess; + +/** + * Description: + */ +@RestController +public class UserController { + @RequestMapping("/first") + public Object first() { + return "first controller"; + } + + @RequestMapping("/doError") + public Object error() { + return 1 / 0; + } + + @RequestMapping("/second") + @UserAccess(desc = "second") + public Object second() { + return "second controller"; + } + +} diff --git a/springboot-aop/src/main/resources/application.yml b/springboot-aop/src/main/resources/application.yml new file mode 100644 index 0000000..8d729b5 --- /dev/null +++ b/springboot-aop/src/main/resources/application.yml @@ -0,0 +1,36 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## + +################### 自定义项目配置 ################### +enzhico: + kaptcha-open: true #是否开启登录时验证码 (true/false) + session-open: false #是否开启session验证 (true/false) + +################### 项目启动端口 ################### +server.port: 8092 + +################### spring配置 ################### +spring: + profiles: + active: dev + +logging: + level: + org.springframework.web.servlet: ERROR + +--- + +##################################################################### +######################## 开发环境profile ########################## +##################################################################### +spring: + profiles: dev + +logging: + level: + ROOT: INFO + com: + enzhico: DEBUG + file: E:/logs/aop.log + diff --git a/springboot-batch/.gitignore b/springboot-batch/.gitignore new file mode 100644 index 0000000..1e3c5bb --- /dev/null +++ b/springboot-batch/.gitignore @@ -0,0 +1,14 @@ +# 此为注释– 将被Git 忽略 +# /结尾表示是目录,忽略目录和目录下的所有件 +# /开头表示根目录,否则是.gitignore的相对目录 +# !开头表示反选 +.idea/ +target/ +*.iml +*.ipr +*.iws +*.log +.svn/ +.project +rebel.xml +.rebel-remote.xml.* diff --git a/springboot-batch/LICENSE b/springboot-batch/LICENSE new file mode 100644 index 0000000..83cd47d --- /dev/null +++ b/springboot-batch/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2018 Xiong Neng + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/springboot-batch/README.md b/springboot-batch/README.md new file mode 100644 index 0000000..57fc04c --- /dev/null +++ b/springboot-batch/README.md @@ -0,0 +1,34 @@ +## SpringBoot Batch演示项目 + +SpringBoot对批处理的支持演示 + +## 初始化 + +批处理初始化采用手动模式最好,先执行/resources/sql/下面对应SQL语句的初始化, +任务完成后再执行清除语句。 + +## 运行 + +采用手动触发方式,对于每种类型的任务,只需要在/modules/common/vo/下面定义对应的Bean类即可。 + +然后参照测试类中方法: + +``` java +@Test +public void testRunSimple() throws Exception { + runTask(BscCanton.class); + runTask(BscOfficeExeItem.class); + runTask(BscExeOffice.class); + runTask(BscTollItem.class); + while (true) { + Thread.sleep(200000L); + } +} +``` + +## 许可证 + +Copyright (c) 2018 Xiong Neng + +基于 MIT 协议发布: + diff --git a/springboot-batch/pom.xml b/springboot-batch/pom.xml new file mode 100644 index 0000000..b43a2c0 --- /dev/null +++ b/springboot-batch/pom.xml @@ -0,0 +1,145 @@ + + + 4.0.0 + + com.enzhico + springboot-batch + 1.0.0-SNAPSHOT + jar + + springboot-batch + SpringBoot Batch演示 + + + org.springframework.boot + spring-boot-starter-parent + 1.5.9.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + 2.9.4 + 1.1.2 + 8.0.7-dmr + 2.1.8 + 1.0.5 + + + + + org.springframework.boot + spring-boot-starter-batch + + + org.hsqldb + hsqldb + + + + + + org.hibernate.validator + hibernate-validator + 6.0.7.Final + + + javax.validation + validation-api + 2.0.1.Final + + + javax.el + javax.el-api + 3.0.1-b04 + + + org.glassfish.web + javax.el + 2.2.6 + + + + org.springframework.boot + spring-boot-starter-test + + + com.vaadin.external.google + android-json + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + + com.oracle + ojdbc6 + 11.2.0.4.0-atlassian-hosted + + + com.alibaba + druid + ${druid.version} + + + + com.baomidou + mybatis-plus + ${mybatis-plus.version} + + + com.baomidou + mybatisplus-spring-boot-starter + ${mybatisplus-spring-boot-starter.version} + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.6.1 + + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.20 + + true + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + + + src/main/resources + + + src/main/java + + **/*.xml + + + + + + diff --git a/springboot-batch/run.sh b/springboot-batch/run.sh new file mode 100644 index 0000000..955efb1 --- /dev/null +++ b/springboot-batch/run.sh @@ -0,0 +1,72 @@ +#!/bin/bash +# 项目自动更新脚本 +# 先clone相应的分支下来: +# git clone ssh://git@120.24.173.142:7999/xxx.git +# 远程调试启动: +# nohup java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -Xms512m -Xmx1024m -jar -Dspring.profiles.active=${profile} ${jarfile} >/dev/null 2>&1 & + +function start { + profile="$1" + echo "启动环境profile=${profile}" + jarfile=$(ls target/*.jar) + if [[ "$?" == "0" ]]; then + stop $profile $jarfile + fi + branch=$(git branch |awk '{print $2}') + git pull origin ${branch} + echo "更新完代码开始重新打包" + mvn clean && mvn clean && mvn package -DskipTests=true + if [[ "$?" != "0" ]]; then + echo "编译出错,退出!" + exit 1 + fi + echo "nohup java -Xms512m -Xmx1024m -jar -Dspring.profiles.active=${profile} ${jarfile} >/dev/null 2>&1 &" + nohup java -Xms512m -Xmx1024m -jar -Dspring.profiles.active=${profile} ${jarfile} >/dev/null 2>&1 & + echo "启动应用中,请查看日志文件..." +} + +function stop { + profile="$1" + jarfile="$2" + ps aux | grep "${jarfile}" | grep "spring.profiles.active=${profile}" | grep -v grep > /dev/null + if [[ "$?" == "0" ]]; then + echo "该应用还在跑,我先停了它" + pid=$(ps aux | grep "${jarfile}" | grep "spring.profiles.active=${profile}" | grep -v grep |awk '{print $2}') + if [[ "$pid" != "" ]]; then + kill -9 $pid + fi + echo "停止应用成功..." + fi +} + +if [[ "$1" == "start" ]]; then + if [[ "$#" < 2 ]]; then + echo "请输入正确参数:./epay.sh start {profile}" + exit 1 + fi + profile="$2" + if [[ "$profile" != "dev" && "$profile" != "test" && "$profile" != "show" && "$profile" != "production" ]]; then + echo "参数错误,请输入正确的profile参数,使用方法:" + echo "./epay.sh start {profile} ==> 启动应用,{profile}取值:dev|test|show|production" + exit 1 + fi + start "${profile}" +elif [[ "$1" == "stop" ]]; then + if [[ "$#" < 2 ]]; then + echo "请输入正确参数:./epay.sh stop {profile}" + exit 1 + fi + profile="$2" + if [[ "$profile" != "dev" && "$profile" != "test" && "$profile" != "show" && "$profile" != "production" ]]; then + echo "参数错误,请输入正确的profile参数,使用方法:" + echo "./epay.sh stop {profile} ==> 停止应用,{profile}取值:dev|test|show|production" + exit 1 + fi + jarfile=$(ls target/*.jar) + stop $profile $jarfile +else + echo "参数错误,使用方法:{}参数是必填的,[]参数可选" + echo "./epay.sh start {profile} ==> 启动应用,{profile}取值:dev|test|show|production" + echo "./epay.sh stop {profile} ==> 停止应用,{profile}取值:dev|test|show|production" + exit 1 +fi diff --git a/springboot-batch/src/main/java/com/enzhico/trans/Application.java b/springboot-batch/src/main/java/com/enzhico/trans/Application.java new file mode 100644 index 0000000..61cb67f --- /dev/null +++ b/springboot-batch/src/main/java/com/enzhico/trans/Application.java @@ -0,0 +1,13 @@ +package com.enzhico.trans; + +import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/springboot-batch/src/main/java/com/enzhico/trans/config/MybatisPlusConfig.java b/springboot-batch/src/main/java/com/enzhico/trans/config/MybatisPlusConfig.java new file mode 100644 index 0000000..34b544e --- /dev/null +++ b/springboot-batch/src/main/java/com/enzhico/trans/config/MybatisPlusConfig.java @@ -0,0 +1,44 @@ +package com.enzhico.trans.config; + +import com.alibaba.druid.pool.DruidDataSource; +import com.baomidou.mybatisplus.plugins.PaginationInterceptor; +import com.enzhico.trans.config.properties.DruidProperties; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import javax.annotation.Resource; + +/** + * MybatisPlus配置 + * + * @author xiongneng + * @since 2017/5/20 21:58 + */ +@Configuration +@EnableTransactionManagement(order = 2) +@MapperScan(basePackages = {"com.enzhico.trans.dao.repository"}) +public class MybatisPlusConfig { + + @Resource + private DruidProperties druidProperties; + + /** + * 单数据源连接池配置 + */ + @Bean + public DruidDataSource singleDatasource() { + DruidDataSource dataSource = new DruidDataSource(); + druidProperties.config(dataSource); + return dataSource; + } + + /** + * mybatis-plus分页插件 + */ + @Bean + public PaginationInterceptor paginationInterceptor() { + return new PaginationInterceptor(); + } +} diff --git a/springboot-batch/src/main/java/com/enzhico/trans/config/properties/CommonProperties.java b/springboot-batch/src/main/java/com/enzhico/trans/config/properties/CommonProperties.java new file mode 100644 index 0000000..303c533 --- /dev/null +++ b/springboot-batch/src/main/java/com/enzhico/trans/config/properties/CommonProperties.java @@ -0,0 +1,88 @@ +package com.enzhico.trans.config.properties; + +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.util.JdbcConstants; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.sql.SQLException; + +/** + * 自定义配置文件 + * + * @author xiongneng + * @since 2017-05-21 11:18 + */ +@Component +@ConfigurationProperties(prefix = "common") +public class CommonProperties { + /** + * csv文件路径,文件名格式为“表名.csv” + */ + private String csvDir; + private String csvVtoll; + private String csvCanton; + private String csvExeOffice; + private String csvApp; + private String csvLog; + /** + * csv文件在哪 1:文件系统 2:类路径下面 + */ + private Integer location; + + public String getCsvDir() { + return csvDir; + } + + public void setCsvDir(String csvDir) { + this.csvDir = csvDir; + } + + public String getCsvExeOffice() { + return csvExeOffice; + } + + public void setCsvExeOffice(String csvExeOffice) { + this.csvExeOffice = csvExeOffice; + } + + public String getCsvVtoll() { + return csvVtoll; + } + + public void setCsvVtoll(String csvVtoll) { + this.csvVtoll = csvVtoll; + } + + public String getCsvApp() { + return csvApp; + } + + public void setCsvApp(String csvApp) { + this.csvApp = csvApp; + } + + public String getCsvLog() { + return csvLog; + } + + public void setCsvLog(String csvLog) { + this.csvLog = csvLog; + } + + public String getCsvCanton() { + return csvCanton; + } + + public void setCsvCanton(String csvCanton) { + this.csvCanton = csvCanton; + } + + public Integer getLocation() { + return location; + } + + public void setLocation(Integer location) { + this.location = location; + } +} \ No newline at end of file diff --git a/springboot-batch/src/main/java/com/enzhico/trans/config/properties/DruidProperties.java b/springboot-batch/src/main/java/com/enzhico/trans/config/properties/DruidProperties.java new file mode 100644 index 0000000..a0f3d1c --- /dev/null +++ b/springboot-batch/src/main/java/com/enzhico/trans/config/properties/DruidProperties.java @@ -0,0 +1,249 @@ +package com.enzhico.trans.config.properties; + +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.util.JdbcConstants; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.sql.SQLException; + +/** + *

                    数据库数据源配置

                    + *

                    说明:这个类中包含了许多默认配置,若这些配置符合您的情况,您可以不用管,若不符合,建议不要修改本类,建议直接在"application.yml"中配置即可

                    + * + * @author xiongneng + * @since 2017-05-21 11:18 + */ +@Component +@ConfigurationProperties(prefix = "spring.datasource") +public class DruidProperties { + + private String url; + + private String username; + + private String password; + + private String driverClassName; + + private Integer initialSize = 10; + + private Integer minIdle = 3; + + private Integer maxActive = 60; + + private Integer maxWait = 60000; + + private Boolean removeAbandoned = true; + + private Integer removeAbandonedTimeout = 180; + + private Integer timeBetweenEvictionRunsMillis = 60000; + + private Integer minEvictableIdleTimeMillis = 300000; + + private String validationQuery = "SELECT 1 from dual"; + + private Boolean testWhileIdle = true; + + private Boolean testOnBorrow = false; + + private Boolean testOnReturn = false; + + private Boolean poolPreparedStatements = true; + + private Integer maxPoolPreparedStatementPerConnectionSize = 50; + + private String filters = "stat"; + + public void config(DruidDataSource dataSource) { + dataSource.setDbType(JdbcConstants.ORACLE); + dataSource.setUrl(url); + dataSource.setUsername(username); + dataSource.setPassword(password); + dataSource.setDriverClassName(driverClassName); + dataSource.setInitialSize(initialSize); // 定义初始连接数 + dataSource.setMinIdle(minIdle); // 最小空闲 + dataSource.setMaxActive(maxActive); // 定义最大连接数 + dataSource.setMaxWait(maxWait); // 获取连接等待超时的时间 + dataSource.setRemoveAbandoned(removeAbandoned); // 超过时间限制是否回收 + dataSource.setRemoveAbandonedTimeout(removeAbandonedTimeout); // 超过时间限制多长 + + // 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + dataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); + // 配置一个连接在池中最小生存的时间,单位是毫秒 + dataSource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); + // 用来检测连接是否有效的sql,要求是一个查询语句 + dataSource.setValidationQuery(validationQuery); + // 申请连接的时候检测 + dataSource.setTestWhileIdle(testWhileIdle); + // 申请连接时执行validationQuery检测连接是否有效,配置为true会降低性能 + dataSource.setTestOnBorrow(testOnBorrow); + // 归还连接时执行validationQuery检测连接是否有效,配置为true会降低性能 + dataSource.setTestOnReturn(testOnReturn); + // 打开PSCache,并且指定每个连接上PSCache的大小 + dataSource.setPoolPreparedStatements(poolPreparedStatements); + dataSource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize); + // 属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有: + // 监控统计用的filter:stat + // 日志用的filter:log4j + // 防御SQL注入的filter:wall + try { + dataSource.setFilters(filters); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getDriverClassName() { + return driverClassName; + } + + public void setDriverClassName(String driverClassName) { + this.driverClassName = driverClassName; + } + + public Integer getInitialSize() { + return initialSize; + } + + public void setInitialSize(Integer initialSize) { + this.initialSize = initialSize; + } + + public Integer getMinIdle() { + return minIdle; + } + + public void setMinIdle(Integer minIdle) { + this.minIdle = minIdle; + } + + public Integer getMaxActive() { + return maxActive; + } + + public void setMaxActive(Integer maxActive) { + this.maxActive = maxActive; + } + + public Integer getMaxWait() { + return maxWait; + } + + public void setMaxWait(Integer maxWait) { + this.maxWait = maxWait; + } + + public Integer getTimeBetweenEvictionRunsMillis() { + return timeBetweenEvictionRunsMillis; + } + + public void setTimeBetweenEvictionRunsMillis(Integer timeBetweenEvictionRunsMillis) { + this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis; + } + + public Integer getMinEvictableIdleTimeMillis() { + return minEvictableIdleTimeMillis; + } + + public void setMinEvictableIdleTimeMillis(Integer minEvictableIdleTimeMillis) { + this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis; + } + + public String getValidationQuery() { + return validationQuery; + } + + public void setValidationQuery(String validationQuery) { + this.validationQuery = validationQuery; + } + + public Boolean getTestWhileIdle() { + return testWhileIdle; + } + + public void setTestWhileIdle(Boolean testWhileIdle) { + this.testWhileIdle = testWhileIdle; + } + + public Boolean getTestOnBorrow() { + return testOnBorrow; + } + + public void setTestOnBorrow(Boolean testOnBorrow) { + this.testOnBorrow = testOnBorrow; + } + + public Boolean getTestOnReturn() { + return testOnReturn; + } + + public void setTestOnReturn(Boolean testOnReturn) { + this.testOnReturn = testOnReturn; + } + + public Boolean getPoolPreparedStatements() { + return poolPreparedStatements; + } + + public void setPoolPreparedStatements(Boolean poolPreparedStatements) { + this.poolPreparedStatements = poolPreparedStatements; + } + + public Integer getMaxPoolPreparedStatementPerConnectionSize() { + return maxPoolPreparedStatementPerConnectionSize; + } + + public void setMaxPoolPreparedStatementPerConnectionSize(Integer maxPoolPreparedStatementPerConnectionSize) { + this.maxPoolPreparedStatementPerConnectionSize = maxPoolPreparedStatementPerConnectionSize; + } + + public String getFilters() { + return filters; + } + + public void setFilters(String filters) { + this.filters = filters; + } + + public Boolean getRemoveAbandoned() { + return removeAbandoned; + } + + public void setRemoveAbandoned(Boolean removeAbandoned) { + this.removeAbandoned = removeAbandoned; + } + + public Integer getRemoveAbandonedTimeout() { + return removeAbandonedTimeout; + } + + public void setRemoveAbandonedTimeout(Integer removeAbandonedTimeout) { + this.removeAbandonedTimeout = removeAbandonedTimeout; + } +} \ No newline at end of file diff --git a/springboot-batch/src/main/java/com/enzhico/trans/dao/entity/User.java b/springboot-batch/src/main/java/com/enzhico/trans/dao/entity/User.java new file mode 100644 index 0000000..259dc1b --- /dev/null +++ b/springboot-batch/src/main/java/com/enzhico/trans/dao/entity/User.java @@ -0,0 +1,59 @@ +package com.enzhico.trans.dao.entity; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +import java.io.Serializable; + +@TableName(value = "t_user") +public class User extends Model { + /** + * 主键ID + */ + @TableId(value = "id", type = IdType.INPUT) + private Integer id; + + private String username; + + private String password; + + public User() { + } + + public User(Integer id, String username, String password) { + this.id = id; + this.username = username; + this.password = password; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/springboot-batch/src/main/java/com/enzhico/trans/dao/repository/UserMapper.java b/springboot-batch/src/main/java/com/enzhico/trans/dao/repository/UserMapper.java new file mode 100644 index 0000000..a7800de --- /dev/null +++ b/springboot-batch/src/main/java/com/enzhico/trans/dao/repository/UserMapper.java @@ -0,0 +1,7 @@ +package com.enzhico.trans.dao.repository; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.enzhico.trans.dao.entity.User; + +public interface UserMapper extends BaseMapper { +} diff --git a/springboot-batch/src/main/java/com/enzhico/trans/modules/MyBatchConfig.java b/springboot-batch/src/main/java/com/enzhico/trans/modules/MyBatchConfig.java new file mode 100644 index 0000000..0848d41 --- /dev/null +++ b/springboot-batch/src/main/java/com/enzhico/trans/modules/MyBatchConfig.java @@ -0,0 +1,75 @@ +package com.enzhico.trans.modules; + +import com.alibaba.druid.pool.DruidDataSource; +import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing; +import org.springframework.batch.core.launch.support.SimpleJobLauncher; +import org.springframework.batch.core.repository.JobRepository; +import org.springframework.batch.core.repository.support.JobRepositoryFactoryBean; +import org.springframework.batch.support.DatabaseType; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.annotation.Order; +import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor; +import org.springframework.transaction.PlatformTransactionManager; + +/** + * 这里是批处理公共配置类 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/5 + */ +@Configuration +@EnableBatchProcessing +@Order(3) +public class MyBatchConfig { + + @Bean + public ThreadPoolTaskExecutor taskExecutor() { + ThreadPoolTaskExecutor taskExecutor = new ThreadPoolTaskExecutor(); + taskExecutor.setCorePoolSize(5); + taskExecutor.setMaxPoolSize(10); + taskExecutor.setQueueCapacity(200); + return taskExecutor; + } + + /** + * JobRepository,用来注册Job的容器 + * jobRepositor的定义需要dataSource和transactionManager,Spring Boot已为我们自动配置了 + * 这两个类,Spring可通过方法注入已有的Bean + * + * @param dataSource + * @param transactionManager + * @return + * @throws Exception + */ + @Bean + public JobRepository jobRepository(DruidDataSource dataSource, PlatformTransactionManager transactionManager) throws Exception { + JobRepositoryFactoryBean jobRepositoryFactoryBean = new JobRepositoryFactoryBean(); + jobRepositoryFactoryBean.setDataSource(dataSource); + jobRepositoryFactoryBean.setTransactionManager(transactionManager); + jobRepositoryFactoryBean.setDatabaseType(String.valueOf(DatabaseType.ORACLE)); + jobRepositoryFactoryBean.setMaxVarCharLength(5000); + // 下面事务隔离级别的配置是针对Oracle的 + jobRepositoryFactoryBean.setIsolationLevelForCreate("ISOLATION_READ_COMMITTED"); + jobRepositoryFactoryBean.afterPropertiesSet(); + return jobRepositoryFactoryBean.getObject(); + } + + /** + * JobLauncher定义,用来启动Job的接口 + * + * @param dataSource + * @param transactionManager + * @return + * @throws Exception + */ + @Bean + public SimpleJobLauncher jobLauncher(ThreadPoolTaskExecutor taskExecutor, DruidDataSource dataSource, + PlatformTransactionManager transactionManager) throws Exception { + SimpleJobLauncher jobLauncher = new SimpleJobLauncher(); + jobLauncher.setTaskExecutor(taskExecutor); + jobLauncher.setJobRepository(jobRepository(dataSource, transactionManager)); + return jobLauncher; + } +} diff --git a/springboot-batch/src/main/java/com/enzhico/trans/modules/MyBeanValidator.java b/springboot-batch/src/main/java/com/enzhico/trans/modules/MyBeanValidator.java new file mode 100644 index 0000000..71b501c --- /dev/null +++ b/springboot-batch/src/main/java/com/enzhico/trans/modules/MyBeanValidator.java @@ -0,0 +1,45 @@ +package com.enzhico.trans.modules; + +import org.springframework.batch.item.validator.ValidationException; +import org.springframework.batch.item.validator.Validator; +import org.springframework.beans.factory.InitializingBean; + +import javax.validation.ConstraintViolation; +import javax.validation.Validation; +import javax.validation.ValidatorFactory; +import java.util.Set; + +/** + * MyBeanValidator + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/3 + */ +public class MyBeanValidator implements Validator, InitializingBean { + private javax.validation.Validator validator; + + @Override + public void validate(T value) throws ValidationException { + /* + * 使用Validator的validate方法校验数据 + */ + Set> constraintViolations = validator.validate(value); + if (constraintViolations.size() > 0) { + StringBuilder message = new StringBuilder(); + for (ConstraintViolation constraintViolation : constraintViolations) { + message.append(constraintViolation.getMessage()).append("\n"); + } + throw new ValidationException(message.toString()); + } + } + + /** + * 使用JSR-303的Validator来校验我们的数据,在此进行JSR-303的Validator的初始化 + */ + @Override + public void afterPropertiesSet() { + ValidatorFactory validatorFactory = Validation.buildDefaultValidatorFactory(); + validator = validatorFactory.usingContext().getValidator(); + } +} diff --git a/springboot-batch/src/main/java/com/enzhico/trans/modules/MyBeanWrapperFieldSetMapper.java b/springboot-batch/src/main/java/com/enzhico/trans/modules/MyBeanWrapperFieldSetMapper.java new file mode 100644 index 0000000..968634c --- /dev/null +++ b/springboot-batch/src/main/java/com/enzhico/trans/modules/MyBeanWrapperFieldSetMapper.java @@ -0,0 +1,44 @@ +package com.enzhico.trans.modules; + +import com.baomidou.mybatisplus.toolkit.StringUtils; +import com.enzhico.trans.modules.common.DateUtil; +import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper; +import org.springframework.validation.DataBinder; + +import java.beans.PropertyEditorSupport; +import java.sql.Timestamp; +import java.time.LocalDate; +import java.time.format.DateTimeFormatter; + +/** + * MyBeanWrapperFieldSetMapper + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/5 + */ +public class MyBeanWrapperFieldSetMapper extends BeanWrapperFieldSetMapper { + @Override + protected void initBinder(DataBinder binder) { + binder.registerCustomEditor(Timestamp.class, new PropertyEditorSupport() { + @Override + public void setAsText(String text) throws IllegalArgumentException { + if (StringUtils.isNotEmpty(text)) { + setValue(DateUtil.parseTimestamp(text)); + } else { + setValue(null); + } + } + + @Override + public String getAsText() throws IllegalArgumentException { + Object date = getValue(); + if (date != null) { + return DateUtil.formatTimestamp((Timestamp) date); + } else { + return ""; + } + } + }); + } +} diff --git a/springboot-batch/src/main/java/com/enzhico/trans/modules/MyJobListener.java b/springboot-batch/src/main/java/com/enzhico/trans/modules/MyJobListener.java new file mode 100644 index 0000000..661187b --- /dev/null +++ b/springboot-batch/src/main/java/com/enzhico/trans/modules/MyJobListener.java @@ -0,0 +1,33 @@ +package com.enzhico.trans.modules; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.batch.core.JobExecution; +import org.springframework.batch.core.JobExecutionListener; + +/** + * MyJobListener + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/3 + */ +public class MyJobListener implements JobExecutionListener { + private Logger logger = LoggerFactory.getLogger(this.getClass()); + private long startTime; + private long endTime; + + @Override + public void beforeJob(JobExecution jobExecution) { + startTime = System.currentTimeMillis(); + String jobName = jobExecution.getJobParameters().getString("input.job.name"); + logger.info("任务-{}处理开始", jobName); + } + + @Override + public void afterJob(JobExecution jobExecution) { + endTime = System.currentTimeMillis(); + String jobName = jobExecution.getJobParameters().getString("input.job.name"); + logger.info("任务-{}处理结束,总耗时=" + (endTime - startTime) + "ms", jobName); + } +} diff --git a/springboot-batch/src/main/java/com/enzhico/trans/modules/canton/Canton.java b/springboot-batch/src/main/java/com/enzhico/trans/modules/canton/Canton.java new file mode 100644 index 0000000..c2de0a6 --- /dev/null +++ b/springboot-batch/src/main/java/com/enzhico/trans/modules/canton/Canton.java @@ -0,0 +1,173 @@ +package com.enzhico.trans.modules.canton; + +/** + * Canton + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/5 + */ +public class Canton { + private String id; + private String code; + private String name; + private String parentid; + private String financial; + private String contactman; + private String tel; + private String email; + private String cantonlev; + private String taxorgcode; + private String memo; + private String using; + private String usingdate; + private Integer level; + private String end; + private String qrcantonid; + private String declare; + private String declareisend; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getParentid() { + return parentid; + } + + public void setParentid(String parentid) { + this.parentid = parentid; + } + + public String getFinancial() { + return financial; + } + + public void setFinancial(String financial) { + this.financial = financial; + } + + public String getContactman() { + return contactman; + } + + public void setContactman(String contactman) { + this.contactman = contactman; + } + + public String getTel() { + return tel; + } + + public void setTel(String tel) { + this.tel = tel; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getCantonlev() { + return cantonlev; + } + + public void setCantonlev(String cantonlev) { + this.cantonlev = cantonlev; + } + + public String getTaxorgcode() { + return taxorgcode; + } + + public void setTaxorgcode(String taxorgcode) { + this.taxorgcode = taxorgcode; + } + + public String getMemo() { + return memo; + } + + public void setMemo(String memo) { + this.memo = memo; + } + + public String getUsing() { + return using; + } + + public void setUsing(String using) { + this.using = using; + } + + public String getUsingdate() { + return usingdate; + } + + public void setUsingdate(String usingdate) { + this.usingdate = usingdate; + } + + public Integer getLevel() { + return level; + } + + public void setLevel(Integer level) { + this.level = level; + } + + public String getEnd() { + return end; + } + + public void setEnd(String end) { + this.end = end; + } + + public String getQrcantonid() { + return qrcantonid; + } + + public void setQrcantonid(String qrcantonid) { + this.qrcantonid = qrcantonid; + } + + public String getDeclare() { + return declare; + } + + public void setDeclare(String declare) { + this.declare = declare; + } + + public String getDeclareisend() { + return declareisend; + } + + public void setDeclareisend(String declareisend) { + this.declareisend = declareisend; + } +} diff --git a/springboot-batch/src/main/java/com/enzhico/trans/modules/canton/CantonConfig.java b/springboot-batch/src/main/java/com/enzhico/trans/modules/canton/CantonConfig.java new file mode 100644 index 0000000..25c314f --- /dev/null +++ b/springboot-batch/src/main/java/com/enzhico/trans/modules/canton/CantonConfig.java @@ -0,0 +1,178 @@ +package com.enzhico.trans.modules.canton; + +import com.alibaba.druid.pool.DruidDataSource; +import com.enzhico.trans.modules.MyBeanValidator; +import com.enzhico.trans.modules.MyJobListener; +import org.springframework.batch.core.Job; +import org.springframework.batch.core.Step; +import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; +import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; +import org.springframework.batch.core.configuration.annotation.StepScope; +import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.item.ItemProcessor; +import org.springframework.batch.item.ItemReader; +import org.springframework.batch.item.ItemWriter; +import org.springframework.batch.item.ParseException; +import org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider; +import org.springframework.batch.item.database.JdbcBatchItemWriter; +import org.springframework.batch.item.file.FlatFileItemReader; +import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper; +import org.springframework.batch.item.file.mapping.DefaultLineMapper; +import org.springframework.batch.item.file.transform.DelimitedLineTokenizer; +import org.springframework.batch.item.validator.ValidatingItemProcessor; +import org.springframework.batch.item.validator.ValidationException; +import org.springframework.batch.item.validator.Validator; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.FileSystemResource; + +/** + * CsvBatchConfig + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/3 + */ +@Configuration +public class CantonConfig { + /** + * ItemReader定义,用来读取数据 + * 1,使用FlatFileItemReader读取文件 + * 2,使用FlatFileItemReader的setResource方法设置csv文件的路径 + * 3,对此对cvs文件的数据和领域模型类做对应映射 + * + * @return FlatFileItemReader + */ + @Bean(name = "cantonReader") + @StepScope + public FlatFileItemReader reader(@Value("#{jobParameters['input.file.name']}") String pathToFile) { + FlatFileItemReader reader = new FlatFileItemReader<>(); +// reader.setResource(new ClassPathResource(pathToFile)); + reader.setResource(new FileSystemResource(pathToFile)); + reader.setLineMapper(new DefaultLineMapper() { + { + setLineTokenizer(new DelimitedLineTokenizer(",") { + { + setNames(new String[]{ + "id", "code", "name", "parentid", "financial", "contactman", "tel", "email", + "cantonlev", "taxorgcode", "memo", "using", "usingdate", "level", "end", + "qrcantonid", "declare", "declareisend" + }); + } + }); + setFieldSetMapper(new BeanWrapperFieldSetMapper() {{ + setTargetType(Canton.class); + }}); + } + }); + // 如果包含header,需要忽略掉 + reader.setLinesToSkip(1); + return reader; + } + + /** + * ItemProcessor定义,用来处理数据 + * + * @return + */ + @Bean(name = "cantonProcessor") + public ItemProcessor processor() { + //使用我们自定义的ItemProcessor的实现CsvItemProcessor + ValidatingItemProcessor processor = new ValidatingItemProcessor() { + @Override + public Canton process(Canton item) throws ValidationException { + /* + * 需要执行super.process(item)才会调用自定义校验器 + */ + super.process(item); + /* + * 对数据进行简单的处理和转换 todo + */ + return item; + } + }; + //为processor指定校验器为CsvBeanValidator() + processor.setValidator(csvBeanValidator()); + return processor; + } + + /** + * ItemWriter定义,用来输出数据 + * spring能让容器中已有的Bean以参数的形式注入,Spring Boot已经为我们定义了dataSource + * + * @param dataSource + * @return + */ + @Bean(name = "cantonWriter") + public ItemWriter writer(DruidDataSource dataSource) { + JdbcBatchItemWriter writer = new JdbcBatchItemWriter<>(); + //我们使用JDBC批处理的JdbcBatchItemWriter来写数据到数据库 + writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>()); + + String sql = "insert into nt_bsc_Canton " + " (f_id,f_code,f_name,f_parentid,f_financial,f_contactman,f_tel,f_email,f_cantonlev,f_taxorgcode,f_memo,f_using,f_usingdate,f_level,f_end,f_qrcantonid,f_declare,f_declareisend) " + + " values(:id,:code,:name,:parentid,:financial,:contactman,:tel,:email,:cantonlev,:taxorgcode,:memo,:using,:usingdate,:level,:end,:qrcantonid,:declare,:declareisend)"; + //在此设置要执行批处理的SQL语句 + writer.setSql(sql); + writer.setDataSource(dataSource); + return writer; + } + + /** + * Job定义,我们要实际执行的任务,包含一个或多个Step + * + * @param jobBuilderFactory + * @param s1 + * @return + */ + @Bean(name = "cantonJob") + public Job cantonJob(JobBuilderFactory jobBuilderFactory, @Qualifier("cantonStep1") Step s1) { + return jobBuilderFactory.get("cantonJob") + .incrementer(new RunIdIncrementer()) + .flow(s1)//为Job指定Step + .end() + .listener(new MyJobListener())//绑定监听器csvJobListener + .build(); + } + + /** + * step步骤,包含ItemReader,ItemProcessor和ItemWriter + * + * @param stepBuilderFactory + * @param reader + * @param writer + * @param processor + * @return + */ + @Bean(name = "cantonStep1") + public Step cantonStep1(StepBuilderFactory stepBuilderFactory, + @Qualifier("cantonReader") ItemReader reader, + @Qualifier("cantonWriter") ItemWriter writer, + @Qualifier("cantonProcessor") ItemProcessor processor) { + return stepBuilderFactory + .get("cantonStep1") + .chunk(5000)//批处理每次提交5000条数据 + .reader(reader)//给step绑定reader + .processor(processor)//给step绑定processor + .writer(writer)//给step绑定writer + .faultTolerant() + .retry(Exception.class) // 重试 + .noRetry(ParseException.class) + .retryLimit(1) //每条记录重试一次 + .skip(Exception.class) + .skipLimit(200) //一共允许跳过200次异常 +// .taskExecutor(new SimpleAsyncTaskExecutor()) //设置每个Job通过并发方式执行,一般来讲一个Job就让它串行完成的好 +// .throttleLimit(10) //并发任务数为 10,默认为4 + .build(); + } + + @Bean + public Validator csvBeanValidator() { + return new MyBeanValidator<>(); + } +} + + + + diff --git a/springboot-batch/src/main/java/com/enzhico/trans/modules/common/CommonConfig.java b/springboot-batch/src/main/java/com/enzhico/trans/modules/common/CommonConfig.java new file mode 100644 index 0000000..8410728 --- /dev/null +++ b/springboot-batch/src/main/java/com/enzhico/trans/modules/common/CommonConfig.java @@ -0,0 +1,191 @@ +package com.enzhico.trans.modules.common; + +import com.alibaba.druid.pool.DruidDataSource; +import com.enzhico.trans.config.properties.CommonProperties; +import com.enzhico.trans.modules.MyBeanValidator; +import com.enzhico.trans.modules.MyBeanWrapperFieldSetMapper; +import com.enzhico.trans.modules.MyJobListener; +import org.springframework.batch.core.Job; +import org.springframework.batch.core.Step; +import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; +import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; +import org.springframework.batch.core.configuration.annotation.StepScope; +import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.item.ItemProcessor; +import org.springframework.batch.item.ItemReader; +import org.springframework.batch.item.ItemWriter; +import org.springframework.batch.item.ParseException; +import org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider; +import org.springframework.batch.item.database.JdbcBatchItemWriter; +import org.springframework.batch.item.file.FlatFileItemReader; +import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper; +import org.springframework.batch.item.file.mapping.DefaultLineMapper; +import org.springframework.batch.item.file.transform.DelimitedLineTokenizer; +import org.springframework.batch.item.validator.ValidatingItemProcessor; +import org.springframework.batch.item.validator.ValidationException; +import org.springframework.batch.item.validator.Validator; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.FileSystemResource; + +import javax.annotation.Resource; + +/** + * 泛型配置 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/3 + */ +@Configuration +public class CommonConfig { + @Resource + private CommonProperties p; + /** + * ItemReader定义,用来读取数据 + * 1,使用FlatFileItemReader读取文件 + * 2,使用FlatFileItemReader的setResource方法设置csv文件的路径 + * 3,对此对cvs文件的数据和领域模型类做对应映射 + * + * @return FlatFileItemReader + */ + @Bean(name = "commonReader") + @StepScope + public FlatFileItemReader reader(@Value("#{jobParameters['input.file.name']}") String pathToFile, + @Value("#{jobParameters['input.vo.name']}") String voClass, + @Value("#{jobParameters['input.columns']}") String columns) { + FlatFileItemReader reader = new FlatFileItemReader<>(); + if (p.getLocation() == 1) { + reader.setResource(new FileSystemResource(pathToFile)); + } else { + reader.setResource(new ClassPathResource(pathToFile)); + } + reader.setLineMapper(new DefaultLineMapper() { + { + setLineTokenizer(new DelimitedLineTokenizer("|") { + { + setNames(columns.split(",")); + setQuoteCharacter('^'); + } + }); + setFieldSetMapper(new MyBeanWrapperFieldSetMapper() {{ + try { + setTargetType(Class.forName(voClass)); + } catch (ClassNotFoundException e) { + e.printStackTrace(); + } + }}); + } + }); + // 如果包含header,需要忽略掉 + reader.setLinesToSkip(1); + return reader; + } + + /** + * ItemProcessor定义,用来处理数据 + * + * @return + */ + @Bean(name = "commonProcessor") + public ItemProcessor processor() { + //使用我们自定义的ItemProcessor的实现CsvItemProcessor + ValidatingItemProcessor processor = new ValidatingItemProcessor() { + public Object process(Object item) throws ValidationException { + /* + * 需要执行super.process(item)才会调用自定义校验器 + */ + super.process(item); + /* + * 对数据进行简单的处理和转换 todo + */ + + return item; + } + }; + //为processor指定校验器为CsvBeanValidator() + processor.setValidator(csvBeanValidator()); + return processor; + } + + /** + * ItemWriter定义,用来输出数据 + * spring能让容器中已有的Bean以参数的形式注入,Spring Boot已经为我们定义了dataSource + * + * @param dataSource + * @return + */ + @Bean(name = "commonWriter") + @StepScope + public ItemWriter writer(DruidDataSource dataSource, + @Value("#{jobParameters['input.sql']}") String sql) { + JdbcBatchItemWriter writer = new JdbcBatchItemWriter<>(); + //我们使用JDBC批处理的JdbcBatchItemWriter来写数据到数据库 + writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>()); + //在此设置要执行批处理的SQL语句 + writer.setSql(sql); + writer.setDataSource(dataSource); + return writer; + } + + /** + * Job定义,我们要实际执行的任务,包含一个或多个Step + * + * @param jobBuilderFactory + * @param s1 + * @return + */ + @Bean(name = "commonJob") + public Job commonJob(JobBuilderFactory jobBuilderFactory, + @Qualifier("commonStep1") Step s1) { + return jobBuilderFactory.get("commonJob") + .incrementer(new RunIdIncrementer()) + .flow(s1)//为Job指定Step + .end() + .listener(new MyJobListener())//绑定监听器csvJobListener + .build(); + } + + /** + * step步骤,包含ItemReader,ItemProcessor和ItemWriter + * + * @param stepBuilderFactory + * @param reader + * @param writer + * @param processor + * @return + */ + @Bean(name = "commonStep1") + public Step commonStep1(StepBuilderFactory stepBuilderFactory, + @Qualifier("commonReader") ItemReader reader, + @Qualifier("commonWriter") ItemWriter writer, + @Qualifier("commonProcessor") ItemProcessor processor) { + return stepBuilderFactory + .get("commonStep1") + .chunk(5000)//批处理每次提交5000条数据 + .reader(reader)//给step绑定reader + .processor(processor)//给step绑定processor + .writer(writer)//给step绑定writer +// .faultTolerant() +// .retry(Exception.class) // 重试 +// .noRetry(ParseException.class) +// .retryLimit(1) //每条记录重试一次 +// .skip(Exception.class) +// .skipLimit(100) //一共允许跳过100次异常 +// .taskExecutor(new SimpleAsyncTaskExecutor()) //设置每个Job通过并发方式执行,一般来讲一个Job就让它串行完成的好 +// .throttleLimit(10) //并发任务数为 10,默认为4 + .build(); + } + + @Bean + public Validator csvBeanValidator() { + return new MyBeanValidator<>(); + } +} + + + + diff --git a/springboot-batch/src/main/java/com/enzhico/trans/modules/common/DateUtil.java b/springboot-batch/src/main/java/com/enzhico/trans/modules/common/DateUtil.java new file mode 100644 index 0000000..2ff0335 --- /dev/null +++ b/springboot-batch/src/main/java/com/enzhico/trans/modules/common/DateUtil.java @@ -0,0 +1,49 @@ +package com.enzhico.trans.modules.common; + +import java.sql.Timestamp; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; + +/** + * DateUtil + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/5 + */ +public class DateUtil { + private static final SimpleDateFormat sdf = new SimpleDateFormat("dd-M月-y hh.mm.ss.S a", Locale.CHINA); + private static final SimpleDateFormat sdf2 = new SimpleDateFormat("dd-M月 -y hh.mm.ss.S a", Locale.CHINA); + + public static synchronized Date parseDatetime(String dateStr) { + try { + return sdf.parse(dateStr); + } catch (ParseException e) { + return new Date(); + } + } + + public static synchronized Timestamp parseTimestamp(String dateStr) { + try { + return new Timestamp(sdf.parse(dateStr).getTime()); + } catch (ParseException e) { + try { + return new Timestamp(sdf2.parse(dateStr).getTime()); + } catch (ParseException ee) { + return new Timestamp(System.currentTimeMillis()); + } + } + } + + public static synchronized String formatTimestamp(Timestamp date) { + return sdf.format(date); + } + + public static void main(String[] args) { + Timestamp t = parseTimestamp("08-12月-17 05.38.07.859000 下午"); + System.out.println(t); + System.out.println(formatTimestamp(t)); + } +} diff --git a/springboot-batch/src/main/java/com/enzhico/trans/modules/common/anno/TableName.java b/springboot-batch/src/main/java/com/enzhico/trans/modules/common/anno/TableName.java new file mode 100644 index 0000000..6541541 --- /dev/null +++ b/springboot-batch/src/main/java/com/enzhico/trans/modules/common/anno/TableName.java @@ -0,0 +1,20 @@ +package com.enzhico.trans.modules.common.anno; + +import java.lang.annotation.*; + +/** + * 表名注解 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/6 + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.TYPE) +@Documented +public @interface TableName { + /** + * 表名 + */ + String value(); +} diff --git a/springboot-batch/src/main/java/com/enzhico/trans/modules/common/vo/BscCanton.java b/springboot-batch/src/main/java/com/enzhico/trans/modules/common/vo/BscCanton.java new file mode 100644 index 0000000..97671e8 --- /dev/null +++ b/springboot-batch/src/main/java/com/enzhico/trans/modules/common/vo/BscCanton.java @@ -0,0 +1,176 @@ +package com.enzhico.trans.modules.common.vo; + +import com.enzhico.trans.modules.common.anno.TableName; + +/** + * BscCanton + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/10 + */ +@TableName("NT_BSC_CANTON") +public class BscCanton { + private String F_ID; + private String F_CODE; + private String F_NAME; + private String F_PARENTID; + private String F_FINANCIAL; + private String F_CONTACTMAN; + private String F_TEL; + private String F_EMAIL; + private String F_CANTONLEV; + private String F_TAXORGCODE; + private String F_MEMO; + private String F_USING; + private String F_USINGDATE; + private Integer F_LEVEL; + private String F_END; + private String F_QRCANTONID; + private String F_DECLARE; + private String F_DECLAREISEND; + + public String getF_ID() { + return F_ID; + } + + public void setF_ID(String f_ID) { + F_ID = f_ID; + } + + public String getF_CODE() { + return F_CODE; + } + + public void setF_CODE(String f_CODE) { + F_CODE = f_CODE; + } + + public String getF_NAME() { + return F_NAME; + } + + public void setF_NAME(String f_NAME) { + F_NAME = f_NAME; + } + + public String getF_PARENTID() { + return F_PARENTID; + } + + public void setF_PARENTID(String f_PARENTID) { + F_PARENTID = f_PARENTID; + } + + public String getF_FINANCIAL() { + return F_FINANCIAL; + } + + public void setF_FINANCIAL(String f_FINANCIAL) { + F_FINANCIAL = f_FINANCIAL; + } + + public String getF_CONTACTMAN() { + return F_CONTACTMAN; + } + + public void setF_CONTACTMAN(String f_CONTACTMAN) { + F_CONTACTMAN = f_CONTACTMAN; + } + + public String getF_TEL() { + return F_TEL; + } + + public void setF_TEL(String f_TEL) { + F_TEL = f_TEL; + } + + public String getF_EMAIL() { + return F_EMAIL; + } + + public void setF_EMAIL(String f_EMAIL) { + F_EMAIL = f_EMAIL; + } + + public String getF_CANTONLEV() { + return F_CANTONLEV; + } + + public void setF_CANTONLEV(String f_CANTONLEV) { + F_CANTONLEV = f_CANTONLEV; + } + + public String getF_TAXORGCODE() { + return F_TAXORGCODE; + } + + public void setF_TAXORGCODE(String f_TAXORGCODE) { + F_TAXORGCODE = f_TAXORGCODE; + } + + public String getF_MEMO() { + return F_MEMO; + } + + public void setF_MEMO(String f_MEMO) { + F_MEMO = f_MEMO; + } + + public String getF_USING() { + return F_USING; + } + + public void setF_USING(String f_USING) { + F_USING = f_USING; + } + + public String getF_USINGDATE() { + return F_USINGDATE; + } + + public void setF_USINGDATE(String f_USINGDATE) { + F_USINGDATE = f_USINGDATE; + } + + public Integer getF_LEVEL() { + return F_LEVEL; + } + + public void setF_LEVEL(Integer f_LEVEL) { + F_LEVEL = f_LEVEL; + } + + public String getF_END() { + return F_END; + } + + public void setF_END(String f_END) { + F_END = f_END; + } + + public String getF_QRCANTONID() { + return F_QRCANTONID; + } + + public void setF_QRCANTONID(String f_QRCANTONID) { + F_QRCANTONID = f_QRCANTONID; + } + + public String getF_DECLARE() { + return F_DECLARE; + } + + public void setF_DECLARE(String f_DECLARE) { + F_DECLARE = f_DECLARE; + } + + public String getF_DECLAREISEND() { + return F_DECLAREISEND; + } + + public void setF_DECLAREISEND(String f_DECLAREISEND) { + F_DECLAREISEND = f_DECLAREISEND; + } +} diff --git a/springboot-batch/src/main/java/com/enzhico/trans/modules/common/vo/BscExeOffice.java b/springboot-batch/src/main/java/com/enzhico/trans/modules/common/vo/BscExeOffice.java new file mode 100644 index 0000000..5a68162 --- /dev/null +++ b/springboot-batch/src/main/java/com/enzhico/trans/modules/common/vo/BscExeOffice.java @@ -0,0 +1,242 @@ +package com.enzhico.trans.modules.common.vo; + +import com.enzhico.trans.modules.common.anno.TableName; +import org.springframework.format.annotation.DateTimeFormat; + +import java.sql.Timestamp; + +/** + * BscExeOffice + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/5 + */ +@TableName("NT_BSC_EXEOFFICE") +public class BscExeOffice { + private String F_ID; + private String F_CANTONID; + private String F_CODE; + private String F_NAME; + private String F_MEMCODE; + private String F_SUPDEPTID; + private String F_COMDEPTID; + private String F_CONTACTMAN; + private String F_TEL; + private String F_MOBIL; + private String F_EMAIL; + private String F_BGOFFICEID; + private String F_INFOMOBIL; + private String F_INFOMAN; + private String F_LOGPASS; + private String F_STARTDATE; + private String F_STOPDATE; + private String F_STATUS; + private String F_MEMO; + private String F_AUDITER; + private String F_AUDITTIME; + private String F_ISAUDIT; + private Timestamp F_EDITTIME; + private Integer F_PLATFORM_ID; + private String F_ISPRINTBILL; + + public String getF_ID() { + return F_ID; + } + + public void setF_ID(String f_ID) { + F_ID = f_ID; + } + + public String getF_CANTONID() { + return F_CANTONID; + } + + public void setF_CANTONID(String f_CANTONID) { + F_CANTONID = f_CANTONID; + } + + public String getF_CODE() { + return F_CODE; + } + + public void setF_CODE(String f_CODE) { + F_CODE = f_CODE; + } + + public String getF_NAME() { + return F_NAME; + } + + public void setF_NAME(String f_NAME) { + F_NAME = f_NAME; + } + + public String getF_MEMCODE() { + return F_MEMCODE; + } + + public void setF_MEMCODE(String f_MEMCODE) { + F_MEMCODE = f_MEMCODE; + } + + public String getF_SUPDEPTID() { + return F_SUPDEPTID; + } + + public void setF_SUPDEPTID(String f_SUPDEPTID) { + F_SUPDEPTID = f_SUPDEPTID; + } + + public String getF_COMDEPTID() { + return F_COMDEPTID; + } + + public void setF_COMDEPTID(String f_COMDEPTID) { + F_COMDEPTID = f_COMDEPTID; + } + + public String getF_CONTACTMAN() { + return F_CONTACTMAN; + } + + public void setF_CONTACTMAN(String f_CONTACTMAN) { + F_CONTACTMAN = f_CONTACTMAN; + } + + public String getF_TEL() { + return F_TEL; + } + + public void setF_TEL(String f_TEL) { + F_TEL = f_TEL; + } + + public String getF_MOBIL() { + return F_MOBIL; + } + + public void setF_MOBIL(String f_MOBIL) { + F_MOBIL = f_MOBIL; + } + + public String getF_EMAIL() { + return F_EMAIL; + } + + public void setF_EMAIL(String f_EMAIL) { + F_EMAIL = f_EMAIL; + } + + public String getF_BGOFFICEID() { + return F_BGOFFICEID; + } + + public void setF_BGOFFICEID(String f_BGOFFICEID) { + F_BGOFFICEID = f_BGOFFICEID; + } + + public String getF_INFOMOBIL() { + return F_INFOMOBIL; + } + + public void setF_INFOMOBIL(String f_INFOMOBIL) { + F_INFOMOBIL = f_INFOMOBIL; + } + + public String getF_INFOMAN() { + return F_INFOMAN; + } + + public void setF_INFOMAN(String f_INFOMAN) { + F_INFOMAN = f_INFOMAN; + } + + public String getF_LOGPASS() { + return F_LOGPASS; + } + + public void setF_LOGPASS(String f_LOGPASS) { + F_LOGPASS = f_LOGPASS; + } + + public String getF_STARTDATE() { + return F_STARTDATE; + } + + public void setF_STARTDATE(String f_STARTDATE) { + F_STARTDATE = f_STARTDATE; + } + + public String getF_STOPDATE() { + return F_STOPDATE; + } + + public void setF_STOPDATE(String f_STOPDATE) { + F_STOPDATE = f_STOPDATE; + } + + public String getF_STATUS() { + return F_STATUS; + } + + public void setF_STATUS(String f_STATUS) { + F_STATUS = f_STATUS; + } + + public String getF_MEMO() { + return F_MEMO; + } + + public void setF_MEMO(String f_MEMO) { + F_MEMO = f_MEMO; + } + + public String getF_AUDITER() { + return F_AUDITER; + } + + public void setF_AUDITER(String f_AUDITER) { + F_AUDITER = f_AUDITER; + } + + public String getF_AUDITTIME() { + return F_AUDITTIME; + } + + public void setF_AUDITTIME(String f_AUDITTIME) { + F_AUDITTIME = f_AUDITTIME; + } + + public String getF_ISAUDIT() { + return F_ISAUDIT; + } + + public void setF_ISAUDIT(String f_ISAUDIT) { + F_ISAUDIT = f_ISAUDIT; + } + + public Timestamp getF_EDITTIME() { + return F_EDITTIME; + } + + public void setF_EDITTIME(Timestamp f_EDITTIME) { + F_EDITTIME = f_EDITTIME; + } + + public Integer getF_PLATFORM_ID() { + return F_PLATFORM_ID; + } + + public void setF_PLATFORM_ID(Integer f_PLATFORM_ID) { + F_PLATFORM_ID = f_PLATFORM_ID; + } + + public String getF_ISPRINTBILL() { + return F_ISPRINTBILL; + } + + public void setF_ISPRINTBILL(String f_ISPRINTBILL) { + F_ISPRINTBILL = f_ISPRINTBILL; + } +} diff --git a/springboot-batch/src/main/java/com/enzhico/trans/modules/common/vo/BscOfficeExeItem.java b/springboot-batch/src/main/java/com/enzhico/trans/modules/common/vo/BscOfficeExeItem.java new file mode 100644 index 0000000..3bd339d --- /dev/null +++ b/springboot-batch/src/main/java/com/enzhico/trans/modules/common/vo/BscOfficeExeItem.java @@ -0,0 +1,95 @@ +package com.enzhico.trans.modules.common.vo; + +import com.enzhico.trans.modules.common.anno.TableName; + +/** + * BscOfficeExeItem + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/6 + */ +@TableName("NT_BSC_OFFICEEXEITEM") +public class BscOfficeExeItem { + private String F_ID; + private String F_CANTONID; + private String F_OFFICEID; + private String F_TOLLID; + private String F_TOLLCODE; + private String F_START; + private String F_END; + private String F_STATUS; + private String F_VERSION; + + public String getF_ID() { + return F_ID; + } + + public void setF_ID(String f_ID) { + F_ID = f_ID; + } + + public String getF_CANTONID() { + return F_CANTONID; + } + + public void setF_CANTONID(String f_CANTONID) { + F_CANTONID = f_CANTONID; + } + + public String getF_OFFICEID() { + return F_OFFICEID; + } + + public void setF_OFFICEID(String f_OFFICEID) { + F_OFFICEID = f_OFFICEID; + } + + public String getF_TOLLID() { + return F_TOLLID; + } + + public void setF_TOLLID(String f_TOLLID) { + F_TOLLID = f_TOLLID; + } + + public String getF_TOLLCODE() { + return F_TOLLCODE; + } + + public void setF_TOLLCODE(String f_TOLLCODE) { + F_TOLLCODE = f_TOLLCODE; + } + + public String getF_START() { + return F_START; + } + + public void setF_START(String f_START) { + F_START = f_START; + } + + public String getF_END() { + return F_END; + } + + public void setF_END(String f_END) { + F_END = f_END; + } + + public String getF_STATUS() { + return F_STATUS; + } + + public void setF_STATUS(String f_STATUS) { + F_STATUS = f_STATUS; + } + + public String getF_VERSION() { + return F_VERSION; + } + + public void setF_VERSION(String f_VERSION) { + F_VERSION = f_VERSION; + } +} diff --git a/springboot-batch/src/main/java/com/enzhico/trans/modules/common/vo/BscTollItem.java b/springboot-batch/src/main/java/com/enzhico/trans/modules/common/vo/BscTollItem.java new file mode 100644 index 0000000..08fab36 --- /dev/null +++ b/springboot-batch/src/main/java/com/enzhico/trans/modules/common/vo/BscTollItem.java @@ -0,0 +1,305 @@ +package com.enzhico.trans.modules.common.vo; + +import com.enzhico.trans.modules.common.anno.TableName; + +import java.math.BigDecimal; +import java.sql.Timestamp; + +/** + * BscTollItem + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/6 + */ +@TableName("NT_BSC_TOLLITEM") +public class BscTollItem { + private String F_ID; + private String F_CANTONID; + private String F_CODE; + private String F_NAME; + private String F_MEMCODE; + private String F_UNICODE; + private String F_UNIT; + private String F_ISRNGSTD; + private String F_APRLEVEL; + private String F_ISSHARE; + private String F_SHAREMODE; + private String F_ENDCANTONID; + private String F_FUNDSORT; + private String F_TOLLSORT; + private String F_STARTDATE; + private String F_ENDDATE; + private String F_TAX; + private String F_ISPUB; + private String F_ALLOWADD; + private String F_MEMO; + private String F_LEVEL; + private String F_END; + private String F_SHAREDIREC; + private String F_HISTORYID; + private String F_STATUS; + private String F_VERSION; + private String F_ISSTD; + private Timestamp F_EDITTIME; + private String F_PLATFORM_ID; + private String F_ISENTERPRISES; + private String F_ISCLEAR; + private String F_PARENTID; + + public String getF_ID() { + return F_ID; + } + + public void setF_ID(String f_ID) { + F_ID = f_ID; + } + + public String getF_CANTONID() { + return F_CANTONID; + } + + public void setF_CANTONID(String f_CANTONID) { + F_CANTONID = f_CANTONID; + } + + public String getF_CODE() { + return F_CODE; + } + + public void setF_CODE(String f_CODE) { + F_CODE = f_CODE; + } + + public String getF_NAME() { + return F_NAME; + } + + public void setF_NAME(String f_NAME) { + F_NAME = f_NAME; + } + + public String getF_MEMCODE() { + return F_MEMCODE; + } + + public void setF_MEMCODE(String f_MEMCODE) { + F_MEMCODE = f_MEMCODE; + } + + public String getF_UNICODE() { + return F_UNICODE; + } + + public void setF_UNICODE(String f_UNICODE) { + F_UNICODE = f_UNICODE; + } + + public String getF_UNIT() { + return F_UNIT; + } + + public void setF_UNIT(String f_UNIT) { + F_UNIT = f_UNIT; + } + + public String getF_ISRNGSTD() { + return F_ISRNGSTD; + } + + public void setF_ISRNGSTD(String f_ISRNGSTD) { + F_ISRNGSTD = f_ISRNGSTD; + } + + public String getF_APRLEVEL() { + return F_APRLEVEL; + } + + public void setF_APRLEVEL(String f_APRLEVEL) { + F_APRLEVEL = f_APRLEVEL; + } + + public String getF_ISSHARE() { + return F_ISSHARE; + } + + public void setF_ISSHARE(String f_ISSHARE) { + F_ISSHARE = f_ISSHARE; + } + + public String getF_SHAREMODE() { + return F_SHAREMODE; + } + + public void setF_SHAREMODE(String f_SHAREMODE) { + F_SHAREMODE = f_SHAREMODE; + } + + public String getF_ENDCANTONID() { + return F_ENDCANTONID; + } + + public void setF_ENDCANTONID(String f_ENDCANTONID) { + F_ENDCANTONID = f_ENDCANTONID; + } + + public String getF_FUNDSORT() { + return F_FUNDSORT; + } + + public void setF_FUNDSORT(String f_FUNDSORT) { + F_FUNDSORT = f_FUNDSORT; + } + + public String getF_TOLLSORT() { + return F_TOLLSORT; + } + + public void setF_TOLLSORT(String f_TOLLSORT) { + F_TOLLSORT = f_TOLLSORT; + } + + public String getF_STARTDATE() { + return F_STARTDATE; + } + + public void setF_STARTDATE(String f_STARTDATE) { + F_STARTDATE = f_STARTDATE; + } + + public String getF_ENDDATE() { + return F_ENDDATE; + } + + public void setF_ENDDATE(String f_ENDDATE) { + F_ENDDATE = f_ENDDATE; + } + + public String getF_TAX() { + return F_TAX; + } + + public void setF_TAX(String f_TAX) { + F_TAX = f_TAX; + } + + public String getF_ISPUB() { + return F_ISPUB; + } + + public void setF_ISPUB(String f_ISPUB) { + F_ISPUB = f_ISPUB; + } + + public String getF_ALLOWADD() { + return F_ALLOWADD; + } + + public void setF_ALLOWADD(String f_ALLOWADD) { + F_ALLOWADD = f_ALLOWADD; + } + + public String getF_MEMO() { + return F_MEMO; + } + + public void setF_MEMO(String f_MEMO) { + F_MEMO = f_MEMO; + } + + public String getF_LEVEL() { + return F_LEVEL; + } + + public void setF_LEVEL(String f_LEVEL) { + F_LEVEL = f_LEVEL; + } + + public String getF_END() { + return F_END; + } + + public void setF_END(String f_END) { + F_END = f_END; + } + + public String getF_SHAREDIREC() { + return F_SHAREDIREC; + } + + public void setF_SHAREDIREC(String f_SHAREDIREC) { + F_SHAREDIREC = f_SHAREDIREC; + } + + public String getF_HISTORYID() { + return F_HISTORYID; + } + + public void setF_HISTORYID(String f_HISTORYID) { + F_HISTORYID = f_HISTORYID; + } + + public String getF_STATUS() { + return F_STATUS; + } + + public void setF_STATUS(String f_STATUS) { + F_STATUS = f_STATUS; + } + + public String getF_VERSION() { + return F_VERSION; + } + + public void setF_VERSION(String f_VERSION) { + F_VERSION = f_VERSION; + } + + public String getF_ISSTD() { + return F_ISSTD; + } + + public void setF_ISSTD(String f_ISSTD) { + F_ISSTD = f_ISSTD; + } + + public Timestamp getF_EDITTIME() { + return F_EDITTIME; + } + + public void setF_EDITTIME(Timestamp f_EDITTIME) { + F_EDITTIME = f_EDITTIME; + } + + public String getF_PLATFORM_ID() { + return F_PLATFORM_ID; + } + + public void setF_PLATFORM_ID(String f_PLATFORM_ID) { + F_PLATFORM_ID = f_PLATFORM_ID; + } + + public String getF_ISENTERPRISES() { + return F_ISENTERPRISES; + } + + public void setF_ISENTERPRISES(String f_ISENTERPRISES) { + F_ISENTERPRISES = f_ISENTERPRISES; + } + + public String getF_ISCLEAR() { + return F_ISCLEAR; + } + + public void setF_ISCLEAR(String f_ISCLEAR) { + F_ISCLEAR = f_ISCLEAR; + } + + public String getF_PARENTID() { + return F_PARENTID; + } + + public void setF_PARENTID(String f_PARENTID) { + F_PARENTID = f_PARENTID; + } +} diff --git a/springboot-batch/src/main/java/com/enzhico/trans/modules/common/vo/BscTollSpecialShare.java b/springboot-batch/src/main/java/com/enzhico/trans/modules/common/vo/BscTollSpecialShare.java new file mode 100644 index 0000000..0bdeb3f --- /dev/null +++ b/springboot-batch/src/main/java/com/enzhico/trans/modules/common/vo/BscTollSpecialShare.java @@ -0,0 +1,205 @@ +package com.enzhico.trans.modules.common.vo; + +import com.enzhico.trans.modules.common.anno.TableName; + +import java.math.BigDecimal; + +/** + * BscTollSpecialShare + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/6 + */ +@TableName("NT_BSC_TOLLSPECIALSHARE") +public class BscTollSpecialShare { + private String F_ID; + private String F_SUBID; + private String F_CANTONID; + private String F_OFFICEID; + private String F_TOLLID; + private Integer F_ORDER; + private BigDecimal F_SHARE; + private String F_ISRATION; + private String F_INCANTONID; + private String F_INOFFICEID; + private Integer F_INACCOUNTTYPE; + private String F_INACCOUNTID; + private String F_STARTDATE; + private String F_ENDDATE; + private String F_MEMO; + private String F_STATUS; + private String F_ISAUDIT; + private String F_AUDITER; + private String F_AUDITTIME; + private String F_VERSION; + private String F_BUDGETCODE; + + public String getF_ID() { + return F_ID; + } + + public void setF_ID(String f_ID) { + F_ID = f_ID; + } + + public String getF_SUBID() { + return F_SUBID; + } + + public void setF_SUBID(String f_SUBID) { + F_SUBID = f_SUBID; + } + + public String getF_CANTONID() { + return F_CANTONID; + } + + public void setF_CANTONID(String f_CANTONID) { + F_CANTONID = f_CANTONID; + } + + public String getF_OFFICEID() { + return F_OFFICEID; + } + + public void setF_OFFICEID(String f_OFFICEID) { + F_OFFICEID = f_OFFICEID; + } + + public String getF_TOLLID() { + return F_TOLLID; + } + + public void setF_TOLLID(String f_TOLLID) { + F_TOLLID = f_TOLLID; + } + + public Integer getF_ORDER() { + return F_ORDER; + } + + public void setF_ORDER(Integer f_ORDER) { + F_ORDER = f_ORDER; + } + + public BigDecimal getF_SHARE() { + return F_SHARE; + } + + public void setF_SHARE(BigDecimal f_SHARE) { + F_SHARE = f_SHARE; + } + + public String getF_ISRATION() { + return F_ISRATION; + } + + public void setF_ISRATION(String f_ISRATION) { + F_ISRATION = f_ISRATION; + } + + public String getF_INCANTONID() { + return F_INCANTONID; + } + + public void setF_INCANTONID(String f_INCANTONID) { + F_INCANTONID = f_INCANTONID; + } + + public String getF_INOFFICEID() { + return F_INOFFICEID; + } + + public void setF_INOFFICEID(String f_INOFFICEID) { + F_INOFFICEID = f_INOFFICEID; + } + + public Integer getF_INACCOUNTTYPE() { + return F_INACCOUNTTYPE; + } + + public void setF_INACCOUNTTYPE(Integer f_INACCOUNTTYPE) { + F_INACCOUNTTYPE = f_INACCOUNTTYPE; + } + + public String getF_INACCOUNTID() { + return F_INACCOUNTID; + } + + public void setF_INACCOUNTID(String f_INACCOUNTID) { + F_INACCOUNTID = f_INACCOUNTID; + } + + public String getF_STARTDATE() { + return F_STARTDATE; + } + + public void setF_STARTDATE(String f_STARTDATE) { + F_STARTDATE = f_STARTDATE; + } + + public String getF_ENDDATE() { + return F_ENDDATE; + } + + public void setF_ENDDATE(String f_ENDDATE) { + F_ENDDATE = f_ENDDATE; + } + + public String getF_MEMO() { + return F_MEMO; + } + + public void setF_MEMO(String f_MEMO) { + F_MEMO = f_MEMO; + } + + public String getF_STATUS() { + return F_STATUS; + } + + public void setF_STATUS(String f_STATUS) { + F_STATUS = f_STATUS; + } + + public String getF_ISAUDIT() { + return F_ISAUDIT; + } + + public void setF_ISAUDIT(String f_ISAUDIT) { + F_ISAUDIT = f_ISAUDIT; + } + + public String getF_AUDITER() { + return F_AUDITER; + } + + public void setF_AUDITER(String f_AUDITER) { + F_AUDITER = f_AUDITER; + } + + public String getF_AUDITTIME() { + return F_AUDITTIME; + } + + public void setF_AUDITTIME(String f_AUDITTIME) { + F_AUDITTIME = f_AUDITTIME; + } + + public String getF_VERSION() { + return F_VERSION; + } + + public void setF_VERSION(String f_VERSION) { + F_VERSION = f_VERSION; + } + + public String getF_BUDGETCODE() { + return F_BUDGETCODE; + } + + public void setF_BUDGETCODE(String f_BUDGETCODE) { + F_BUDGETCODE = f_BUDGETCODE; + } +} diff --git a/springboot-batch/src/main/java/com/enzhico/trans/modules/vtoll/BudgetVtoll.java b/springboot-batch/src/main/java/com/enzhico/trans/modules/vtoll/BudgetVtoll.java new file mode 100644 index 0000000..ead5f97 --- /dev/null +++ b/springboot-batch/src/main/java/com/enzhico/trans/modules/vtoll/BudgetVtoll.java @@ -0,0 +1,152 @@ +package com.enzhico.trans.modules.vtoll; + +import javax.validation.constraints.Size; + +/** + * BudgetVtoll + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/3 + */ +public class BudgetVtoll { + private String id; + private String year; + private String tollid; + private String budgetid; + private String cbudgetid; + private String version; + /** + * 使用JSR-303注解来校验数据 + */ + @Size(max = 100) + private String auditmsg; + private String trialstatus; + private String firauditer; + private String firaudittime; + private String finauditer; + private String finaudittime; + private String edittime; + private String startdate; + private String enddate; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getYear() { + return year; + } + + public void setYear(String year) { + this.year = year; + } + + public String getTollid() { + return tollid; + } + + public void setTollid(String tollid) { + this.tollid = tollid; + } + + public String getBudgetid() { + return budgetid; + } + + public void setBudgetid(String budgetid) { + this.budgetid = budgetid; + } + + public String getCbudgetid() { + return cbudgetid; + } + + public void setCbudgetid(String cbudgetid) { + this.cbudgetid = cbudgetid; + } + + public String getVersion() { + return version; + } + + public void setVersion(String version) { + this.version = version; + } + + public String getAuditmsg() { + return auditmsg; + } + + public void setAuditmsg(String auditmsg) { + this.auditmsg = auditmsg; + } + + public String getTrialstatus() { + return trialstatus; + } + + public void setTrialstatus(String trialstatus) { + this.trialstatus = trialstatus; + } + + public String getFirauditer() { + return firauditer; + } + + public void setFirauditer(String firauditer) { + this.firauditer = firauditer; + } + + public String getFiraudittime() { + return firaudittime; + } + + public void setFiraudittime(String firaudittime) { + this.firaudittime = firaudittime; + } + + public String getFinauditer() { + return finauditer; + } + + public void setFinauditer(String finauditer) { + this.finauditer = finauditer; + } + + public String getFinaudittime() { + return finaudittime; + } + + public void setFinaudittime(String finaudittime) { + this.finaudittime = finaudittime; + } + + public String getEdittime() { + return edittime; + } + + public void setEdittime(String edittime) { + this.edittime = edittime; + } + + public String getStartdate() { + return startdate; + } + + public void setStartdate(String startdate) { + this.startdate = startdate; + } + + public String getEnddate() { + return enddate; + } + + public void setEnddate(String enddate) { + this.enddate = enddate; + } +} diff --git a/springboot-batch/src/main/java/com/enzhico/trans/modules/vtoll/BudgetVtollConfig.java b/springboot-batch/src/main/java/com/enzhico/trans/modules/vtoll/BudgetVtollConfig.java new file mode 100644 index 0000000..1777c62 --- /dev/null +++ b/springboot-batch/src/main/java/com/enzhico/trans/modules/vtoll/BudgetVtollConfig.java @@ -0,0 +1,178 @@ +package com.enzhico.trans.modules.vtoll; + +import com.alibaba.druid.pool.DruidDataSource; +import com.enzhico.trans.modules.MyBeanValidator; +import com.enzhico.trans.modules.MyJobListener; +import org.springframework.batch.core.Job; +import org.springframework.batch.core.Step; +import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; +import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; +import org.springframework.batch.core.configuration.annotation.StepScope; +import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.item.ItemProcessor; +import org.springframework.batch.item.ItemReader; +import org.springframework.batch.item.ItemWriter; +import org.springframework.batch.item.ParseException; +import org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider; +import org.springframework.batch.item.database.JdbcBatchItemWriter; +import org.springframework.batch.item.file.FlatFileItemReader; +import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper; +import org.springframework.batch.item.file.mapping.DefaultLineMapper; +import org.springframework.batch.item.file.transform.DelimitedLineTokenizer; +import org.springframework.batch.item.validator.ValidatingItemProcessor; +import org.springframework.batch.item.validator.ValidationException; +import org.springframework.batch.item.validator.Validator; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.FileSystemResource; +import org.springframework.core.task.SimpleAsyncTaskExecutor; + +/** + * CsvBatchConfig + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/3 + */ +@Configuration +public class BudgetVtollConfig { + /** + * ItemReader定义,用来读取数据 + * 1,使用FlatFileItemReader读取文件 + * 2,使用FlatFileItemReader的setResource方法设置csv文件的路径 + * 3,对此对cvs文件的数据和领域模型类做对应映射 + * + * @return FlatFileItemReader + */ + @Bean(name = "vtollReader") + @StepScope + public FlatFileItemReader reader(@Value("#{jobParameters['input.file.name']}") String pathToFile) { + FlatFileItemReader reader = new FlatFileItemReader<>(); +// reader.setResource(new ClassPathResource(pathToFile)); + reader.setResource(new FileSystemResource(pathToFile)); + reader.setLineMapper(new DefaultLineMapper() { + { + setLineTokenizer(new DelimitedLineTokenizer(",") { + { + setNames(new String[]{ + "id", "year", "tollid", "budgetid", "cbudgetid", "version", "auditmsg", "trialstatus", + "firauditer", "firaudittime", "finauditer", "finaudittime", "edittime", "startdate", "enddate" + }); + } + }); + setFieldSetMapper(new BeanWrapperFieldSetMapper() {{ + setTargetType(BudgetVtoll.class); + }}); + } + }); + // 如果包含header,需要忽略掉 + reader.setLinesToSkip(1); + return reader; + } + + /** + * ItemProcessor定义,用来处理数据 + * + * @return + */ + @Bean(name = "vtollProcessor") + public ItemProcessor processor() { + //使用我们自定义的ItemProcessor的实现CsvItemProcessor + ValidatingItemProcessor processor = new ValidatingItemProcessor() { + @Override + public BudgetVtoll process(BudgetVtoll item) throws ValidationException { + /* + * 需要执行super.process(item)才会调用自定义校验器 + */ + super.process(item); + /* + * 对数据进行简单的处理和转换 todo + */ + return item; + } + }; + //为processor指定校验器为CsvBeanValidator() + processor.setValidator(csvBeanValidator()); + return processor; + } + + /** + * ItemWriter定义,用来输出数据 + * spring能让容器中已有的Bean以参数的形式注入,Spring Boot已经为我们定义了dataSource + * + * @param dataSource + * @return + */ + @Bean(name = "vtollWriter") + public ItemWriter writer(DruidDataSource dataSource) { + JdbcBatchItemWriter writer = new JdbcBatchItemWriter<>(); + //我们使用JDBC批处理的JdbcBatchItemWriter来写数据到数据库 + writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>()); + + String sql = "insert into nt_bsc_BudgetVtoll " + " (f_id,f_year,f_tollid,f_budgetid,f_cbudgetid,f_version,f_auditmsg,f_trialstatus,f_firauditer,f_firaudittime,f_finauditer,f_finaudittime,f_edittime,f_startdate,f_enddate) " + + " values(:id,:year,:tollid,:budgetid,:cbudgetid,:version,:auditmsg,:trialstatus,:firauditer,:firaudittime,:finauditer,:finaudittime,:edittime,:startdate,:enddate)"; + //在此设置要执行批处理的SQL语句 + writer.setSql(sql); + writer.setDataSource(dataSource); + return writer; + } + + /** + * Job定义,我们要实际执行的任务,包含一个或多个Step + * + * @param jobBuilderFactory + * @param s1 + * @return + */ + @Bean(name = "vtollJob") + public Job vtollJob(JobBuilderFactory jobBuilderFactory, @Qualifier("vtollStep1") Step s1) { + return jobBuilderFactory.get("vtollJob") + .incrementer(new RunIdIncrementer()) + .flow(s1)//为Job指定Step + .end() + .listener(new MyJobListener())//绑定监听器csvJobListener + .build(); + } + + /** + * step步骤,包含ItemReader,ItemProcessor和ItemWriter + * + * @param stepBuilderFactory + * @param reader + * @param writer + * @param processor + * @return + */ + @Bean(name = "vtollStep1") + public Step vtollStep1(StepBuilderFactory stepBuilderFactory, + @Qualifier("vtollReader") ItemReader reader, + @Qualifier("vtollWriter") ItemWriter writer, + @Qualifier("vtollProcessor") ItemProcessor processor) { + return stepBuilderFactory + .get("vtollStep1") + .chunk(5000)//批处理每次提交5000条数据 + .reader(reader)//给step绑定reader + .processor(processor)//给step绑定processor + .writer(writer)//给step绑定writer + .faultTolerant() + .retry(Exception.class) // 重试 + .noRetry(ParseException.class) + .retryLimit(1) //每条记录重试一次 + .skip(Exception.class) + .skipLimit(200) //一共允许跳过200次异常 +// .taskExecutor(new SimpleAsyncTaskExecutor()) //设置每个Job通过并发方式执行,一般来讲一个Job就让它串行完成的好 +// .throttleLimit(10) //并发任务数为 10,默认为4 + .build(); + } + + @Bean + public Validator csvBeanValidator() { + return new MyBeanValidator<>(); + } +} + + + + diff --git a/springboot-batch/src/main/java/com/enzhico/trans/modules/zapp/App.java b/springboot-batch/src/main/java/com/enzhico/trans/modules/zapp/App.java new file mode 100644 index 0000000..3b9fbda --- /dev/null +++ b/springboot-batch/src/main/java/com/enzhico/trans/modules/zapp/App.java @@ -0,0 +1,41 @@ +package com.enzhico.trans.modules.zapp; + +import com.enzhico.trans.modules.common.anno.TableName; + +/** + * App + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/5 + */ +@TableName("Z_TEST_APP") +public class App { + private int appid; + private String zname; + private String flag; + + public int getAppid() { + return appid; + } + + public void setAppid(int appid) { + this.appid = appid; + } + + public String getZname() { + return zname; + } + + public void setZname(String zname) { + this.zname = zname; + } + + public String getFlag() { + return flag; + } + + public void setFlag(String flag) { + this.flag = flag; + } +} diff --git a/springboot-batch/src/main/java/com/enzhico/trans/modules/zapp/AppConfig.java b/springboot-batch/src/main/java/com/enzhico/trans/modules/zapp/AppConfig.java new file mode 100644 index 0000000..c2e13b2 --- /dev/null +++ b/springboot-batch/src/main/java/com/enzhico/trans/modules/zapp/AppConfig.java @@ -0,0 +1,175 @@ +package com.enzhico.trans.modules.zapp; + +import com.alibaba.druid.pool.DruidDataSource; +import com.enzhico.trans.modules.MyBeanValidator; +import com.enzhico.trans.modules.MyJobListener; +import org.springframework.batch.core.Job; +import org.springframework.batch.core.Step; +import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; +import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; +import org.springframework.batch.core.configuration.annotation.StepScope; +import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.item.ItemProcessor; +import org.springframework.batch.item.ItemReader; +import org.springframework.batch.item.ItemWriter; +import org.springframework.batch.item.ParseException; +import org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider; +import org.springframework.batch.item.database.JdbcBatchItemWriter; +import org.springframework.batch.item.file.FlatFileItemReader; +import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper; +import org.springframework.batch.item.file.mapping.DefaultLineMapper; +import org.springframework.batch.item.file.transform.DelimitedLineTokenizer; +import org.springframework.batch.item.validator.ValidatingItemProcessor; +import org.springframework.batch.item.validator.ValidationException; +import org.springframework.batch.item.validator.Validator; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.FileSystemResource; + +/** + * CsvBatchConfig + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/3 + */ +@Configuration +public class AppConfig { + /** + * ItemReader定义,用来读取数据 + * 1,使用FlatFileItemReader读取文件 + * 2,使用FlatFileItemReader的setResource方法设置csv文件的路径 + * 3,对此对cvs文件的数据和领域模型类做对应映射 + * + * @return FlatFileItemReader + */ + @Bean(name = "appReader") + @StepScope + public FlatFileItemReader reader(@Value("#{jobParameters['input.file.name']}") String pathToFile) { + FlatFileItemReader reader = new FlatFileItemReader<>(); +// reader.setResource(new ClassPathResource(pathToFile)); + reader.setResource(new FileSystemResource(pathToFile)); + reader.setLineMapper(new DefaultLineMapper() { + { + setLineTokenizer(new DelimitedLineTokenizer("|") { + { + setNames(new String[]{ + "appid", "zname", "flag" + }); + } + }); + setFieldSetMapper(new BeanWrapperFieldSetMapper() {{ + setTargetType(App.class); + }}); + } + }); + // 如果包含header,需要忽略掉 + reader.setLinesToSkip(0); + return reader; + } + + /** + * ItemProcessor定义,用来处理数据 + * + * @return + */ + @Bean(name = "appProcessor") + public ItemProcessor processor() { + //使用我们自定义的ItemProcessor的实现CsvItemProcessor + ValidatingItemProcessor processor = new ValidatingItemProcessor() { + @Override + public App process(App item) throws ValidationException { + /* + * 需要执行super.process(item)才会调用自定义校验器 + */ + super.process(item); + /* + * 对数据进行简单的处理和转换 todo + */ + return item; + } + }; + //为processor指定校验器为CsvBeanValidator() + processor.setValidator(csvBeanValidator()); + return processor; + } + + /** + * ItemWriter定义,用来输出数据 + * spring能让容器中已有的Bean以参数的形式注入,Spring Boot已经为我们定义了dataSource + * + * @param dataSource + * @return + */ + @Bean(name = "appWriter") + public ItemWriter writer(DruidDataSource dataSource) { + JdbcBatchItemWriter writer = new JdbcBatchItemWriter<>(); + //我们使用JDBC批处理的JdbcBatchItemWriter来写数据到数据库 + writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>()); + + String sql = "insert into z_test_App (appid, zname, flag) values(:appid, :zname, :flag)"; + //在此设置要执行批处理的SQL语句 + writer.setSql(sql); + writer.setDataSource(dataSource); + return writer; + } + + /** + * Job定义,我们要实际执行的任务,包含一个或多个Step + * + * @param jobBuilderFactory + * @param s1 + * @return + */ + @Bean(name = "zappJob") + public Job zappJob(JobBuilderFactory jobBuilderFactory, @Qualifier("zappStep1") Step s1) { + return jobBuilderFactory.get("zappJob") + .incrementer(new RunIdIncrementer()) + .flow(s1)//为Job指定Step + .end() + .listener(new MyJobListener())//绑定监听器csvJobListener + .build(); + } + + /** + * step步骤,包含ItemReader,ItemProcessor和ItemWriter + * + * @param stepBuilderFactory + * @param reader + * @param writer + * @param processor + * @return + */ + @Bean(name = "zappStep1") + public Step zappStep1(StepBuilderFactory stepBuilderFactory, + @Qualifier("appReader") ItemReader reader, + @Qualifier("appWriter") ItemWriter writer, + @Qualifier("appProcessor") ItemProcessor processor) { + return stepBuilderFactory + .get("zappStep1") + .chunk(5000)//批处理每次提交5000条数据 + .reader(reader)//给step绑定reader + .processor(processor)//给step绑定processor + .writer(writer)//给step绑定writer + .faultTolerant() + .retry(Exception.class) // 重试 + .noRetry(ParseException.class) + .retryLimit(1) //每条记录重试一次 + .skip(Exception.class) + .skipLimit(200) //一共允许跳过200次异常 +// .taskExecutor(new SimpleAsyncTaskExecutor()) //设置每个Job通过并发方式执行,一般来讲一个Job就让它串行完成的好 +// .throttleLimit(10) //并发任务数为 10,默认为4 + .build(); + } + + @Bean + public Validator csvBeanValidator() { + return new MyBeanValidator<>(); + } +} + + + + diff --git a/springboot-batch/src/main/java/com/enzhico/trans/modules/zlog/Log.java b/springboot-batch/src/main/java/com/enzhico/trans/modules/zlog/Log.java new file mode 100644 index 0000000..788a028 --- /dev/null +++ b/springboot-batch/src/main/java/com/enzhico/trans/modules/zlog/Log.java @@ -0,0 +1,38 @@ +package com.enzhico.trans.modules.zlog; + +/** + * Log + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/5 + */ +public class Log { + private int logid; + private String msg; + private String logtime; + + public int getLogid() { + return logid; + } + + public void setLogid(int logid) { + this.logid = logid; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public String getLogtime() { + return logtime; + } + + public void setLogtime(String logtime) { + this.logtime = logtime; + } +} diff --git a/springboot-batch/src/main/java/com/enzhico/trans/modules/zlog/LogConfig.java b/springboot-batch/src/main/java/com/enzhico/trans/modules/zlog/LogConfig.java new file mode 100644 index 0000000..51676f3 --- /dev/null +++ b/springboot-batch/src/main/java/com/enzhico/trans/modules/zlog/LogConfig.java @@ -0,0 +1,174 @@ +package com.enzhico.trans.modules.zlog; + +import com.alibaba.druid.pool.DruidDataSource; +import com.enzhico.trans.modules.MyBeanValidator; +import com.enzhico.trans.modules.MyJobListener; +import org.springframework.batch.core.Job; +import org.springframework.batch.core.Step; +import org.springframework.batch.core.configuration.annotation.JobBuilderFactory; +import org.springframework.batch.core.configuration.annotation.StepBuilderFactory; +import org.springframework.batch.core.configuration.annotation.StepScope; +import org.springframework.batch.core.launch.support.RunIdIncrementer; +import org.springframework.batch.item.ItemProcessor; +import org.springframework.batch.item.ItemReader; +import org.springframework.batch.item.ItemWriter; +import org.springframework.batch.item.ParseException; +import org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider; +import org.springframework.batch.item.database.JdbcBatchItemWriter; +import org.springframework.batch.item.file.FlatFileItemReader; +import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper; +import org.springframework.batch.item.file.mapping.DefaultLineMapper; +import org.springframework.batch.item.file.transform.DelimitedLineTokenizer; +import org.springframework.batch.item.validator.ValidatingItemProcessor; +import org.springframework.batch.item.validator.ValidationException; +import org.springframework.batch.item.validator.Validator; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.FileSystemResource; + +/** + * CsvBatchConfig + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/3 + */ +@Configuration +public class LogConfig { + /** + * ItemReader定义,用来读取数据 + * 1,使用FlatFileItemReader读取文件 + * 2,使用FlatFileItemReader的setResource方法设置csv文件的路径 + * 3,对此对cvs文件的数据和领域模型类做对应映射 + * + * @return FlatFileItemReader + */ + @Bean(name = "logReader") + @StepScope + public FlatFileItemReader reader(@Value("#{jobParameters['input.file.name']}") String pathToFile) { + FlatFileItemReader reader = new FlatFileItemReader<>(); +// reader.setResource(new ClassPathResource(pathToFile)); + reader.setResource(new FileSystemResource(pathToFile)); + reader.setLineMapper(new DefaultLineMapper() { + { + setLineTokenizer(new DelimitedLineTokenizer("|") { + { + setNames(new String[]{ + "logid", "msg", "logtime" + }); + } + }); + setFieldSetMapper(new BeanWrapperFieldSetMapper() {{ + setTargetType(Log.class); + }}); + } + }); + // 如果包含header,需要忽略掉 + reader.setLinesToSkip(1); + return reader; + } + + /** + * ItemProcessor定义,用来处理数据 + * + * @return + */ + @Bean(name = "logProcessor") + public ItemProcessor processor() { + //使用我们自定义的ItemProcessor的实现CsvItemProcessor + ValidatingItemProcessor processor = new ValidatingItemProcessor() { + @Override + public Log process(Log item) throws ValidationException { + /* + * 需要执行super.process(item)才会调用自定义校验器 + */ + super.process(item); + /* + * 对数据进行简单的处理和转换 todo + */ + return item; + } + }; + //为processor指定校验器为CsvBeanValidator() + processor.setValidator(csvBeanValidator()); + return processor; + } + + /** + * ItemWriter定义,用来输出数据 + * spring能让容器中已有的Bean以参数的形式注入,Spring Boot已经为我们定义了dataSource + * + * @param dataSource + * @return + */ + @Bean(name = "logWriter") + public ItemWriter writer(DruidDataSource dataSource) { + JdbcBatchItemWriter writer = new JdbcBatchItemWriter<>(); + //我们使用JDBC批处理的JdbcBatchItemWriter来写数据到数据库 + writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<>()); + String sql = "insert into z_test_Log (logid, msg, logtime) values(:logid, :msg, :logtime)"; + //在此设置要执行批处理的SQL语句 + writer.setSql(sql); + writer.setDataSource(dataSource); + return writer; + } + + /** + * Job定义,我们要实际执行的任务,包含一个或多个Step + * + * @param jobBuilderFactory + * @param s1 + * @return + */ + @Bean(name = "zlogJob") + public Job zlogJob(JobBuilderFactory jobBuilderFactory, @Qualifier("logStep1") Step s1) { + return jobBuilderFactory.get("zlogJob") + .incrementer(new RunIdIncrementer()) + .flow(s1)//为Job指定Step + .end() + .listener(new MyJobListener())//绑定监听器csvJobListener + .build(); + } + + /** + * step步骤,包含ItemReader,ItemProcessor和ItemWriter + * + * @param stepBuilderFactory + * @param reader + * @param writer + * @param processor + * @return + */ + @Bean(name = "logStep1") + public Step logStep1(StepBuilderFactory stepBuilderFactory, + @Qualifier("logReader") ItemReader reader, + @Qualifier("logWriter") ItemWriter writer, + @Qualifier("logProcessor") ItemProcessor processor) { + return stepBuilderFactory + .get("logStep1") + .chunk(5000)//批处理每次提交5000条数据 + .reader(reader)//给step绑定reader + .processor(processor)//给step绑定processor + .writer(writer)//给step绑定writer + .faultTolerant() + .retry(Exception.class) // 重试 + .noRetry(ParseException.class) + .retryLimit(1) //每条记录重试一次 + .skip(Exception.class) + .skipLimit(200) //一共允许跳过200次异常 +// .taskExecutor(new SimpleAsyncTaskExecutor()) //设置每个Job通过并发方式执行,一般来讲一个Job就让它串行完成的好 +// .throttleLimit(10) //并发任务数为 10,默认为4 + .build(); + } + + @Bean + public Validator csvBeanValidator() { + return new MyBeanValidator<>(); + } +} + + + + diff --git a/springboot-batch/src/main/java/com/enzhico/trans/service/CsvService.java b/springboot-batch/src/main/java/com/enzhico/trans/service/CsvService.java new file mode 100644 index 0000000..3b96039 --- /dev/null +++ b/springboot-batch/src/main/java/com/enzhico/trans/service/CsvService.java @@ -0,0 +1,85 @@ +package com.enzhico.trans.service; + +import com.enzhico.trans.config.properties.CommonProperties; +import com.enzhico.trans.modules.common.anno.TableName; +import com.enzhico.trans.modules.common.vo.BscCanton; +import com.enzhico.trans.modules.common.vo.BscExeOffice; +import com.enzhico.trans.modules.common.vo.BscOfficeExeItem; +import com.enzhico.trans.modules.common.vo.BscTollItem; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.batch.core.Job; +import org.springframework.batch.core.JobParameters; +import org.springframework.batch.core.JobParametersBuilder; +import org.springframework.batch.core.launch.JobLauncher; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; + +@Service +public class CsvService { + private Logger logger = LoggerFactory.getLogger(this.getClass()); + + @Resource + private CommonProperties p; + @Resource + private JobLauncher jobLauncher; + @Resource + @Qualifier("commonJob") + private Job commonJob; + private static final String KEY_JOB_NAME = "input.job.name"; + private static final String KEY_FILE_NAME = "input.file.name"; + private static final String KEY_VO_NAME = "input.vo.name"; + private static final String KEY_COLUMNS = "input.columns"; + private static final String KEY_SQL = "input.sql"; + + /** + * 导入数据库数据 + * @throws Exception ex + */ + public void importTables() throws Exception { + runTask(BscCanton.class); + runTask(BscOfficeExeItem.class); + runTask(BscExeOffice.class); + runTask(BscTollItem.class); + } + + /** + * 根据类名反射运行相应的任务 + * + * @param c 定义的Bean类 + */ + public void runTask(Class c) throws Exception { + TableName a = (TableName) c.getAnnotation(TableName.class); + String tableName = a.value(); + Field[] fields = c.getDeclaredFields(); + List fieldNames = new ArrayList<>(); + List paramNames = new ArrayList<>(); + for (Field f : fields) { + fieldNames.add(f.getName()); + paramNames.add(":" + f.getName()); + } + String columnsStr = String.join(",", fieldNames); + String paramsStr = String.join(",", paramNames); + String csvFileName; + if (p.getLocation() == 1) { + csvFileName = p.getCsvDir() + tableName + ".csv"; + } else { + csvFileName = tableName + ".csv"; + } + JobParameters jobParameters1 = new JobParametersBuilder() + .addLong("time", System.currentTimeMillis()) + .addString(KEY_JOB_NAME, tableName) + .addString(KEY_FILE_NAME, csvFileName) + .addString(KEY_VO_NAME, c.getCanonicalName()) + .addString(KEY_COLUMNS, String.join(",", fieldNames)) + .addString(KEY_SQL, "insert into " + tableName + " (" + columnsStr + ")" + " values(" + paramsStr + ")") + .toJobParameters(); + jobLauncher.run(commonJob, jobParameters1); + } + +} diff --git a/springboot-batch/src/main/java/com/enzhico/trans/start/StartRunner.java b/springboot-batch/src/main/java/com/enzhico/trans/start/StartRunner.java new file mode 100644 index 0000000..daa1631 --- /dev/null +++ b/springboot-batch/src/main/java/com/enzhico/trans/start/StartRunner.java @@ -0,0 +1,30 @@ +package com.enzhico.trans.start; + +import com.enzhico.trans.service.CsvService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.CommandLineRunner; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * 内网服务启动器 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/27 + */ +@Component +public class StartRunner implements CommandLineRunner { + private Logger logger = LoggerFactory.getLogger(this.getClass()); + @Resource + private CsvService csvService; + + @Override + public void run(String... args) throws Exception { + logger.info("导入数据主进程启动啦啦啦..."); + csvService.importTables(); + logger.info("导入数据主进程完成啦啦啦..."); + } +} diff --git a/springboot-batch/src/main/resources/application.yml b/springboot-batch/src/main/resources/application.yml new file mode 100644 index 0000000..fd3cc8b --- /dev/null +++ b/springboot-batch/src/main/resources/application.yml @@ -0,0 +1,90 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## + +################### 自定义配置 ################### +common: + csvVtoll: /var/csv/ + csvCanton: /var/csv/ + csvExeOffice: /var/csv/ + csvApp: /var/csv/ + csvLog: /var/csv/ + +################### spring配置 ################### +spring: + profiles: + active: test + batch: + job: + enabled: false + initializer: + enabled: false + +################### mybatis-plus配置 ################### +mybatis-plus: + mapper-locations: classpath*:com/enzhico/trans/dao/repository/mapping/*.xml + typeAliasesPackage: > + com.enzhico.trans.dao.entity + global-config: + id-type: 1 # 0:数据库ID自增 1:用户输入id 2:全局唯一id(IdWorker) 3:全局唯一ID(uuid) + db-column-underline: false + refresh-mapper: true + configuration: + jdbcTypeForNull: NULL + map-underscore-to-camel-case: true + cache-enabled: true #配置的缓存的全局开关 + lazyLoadingEnabled: true #延时加载的开关 + multipleResultSetsEnabled: true #开启的话,延时加载一个属性时会加载该对象全部属性,否则按需加载属性 + +logging: + level: + org.springframework.web.servlet: ERROR + +--- + +##################################################################### +######################## 开发环境profile ########################## +##################################################################### +spring: + profiles: dev + datasource: + driver-class-name: oracle.jdbc.driver.OracleDriver + url: jdbc:oracle:thin:@111.230.194.170:1521:orcl11g + username: adm_real + password: adm_real + +common: + location: 1 + csvDir: E:/ + +logging: + level: + ROOT: INFO + com: + enzhico: DEBUG + file: /var/logs/batch.log + +--- + +##################################################################### +######################## 测试环境profile ########################## +##################################################################### +spring: + profiles: test + datasource: + driver-class-name: oracle.jdbc.driver.OracleDriver + url: jdbc:oracle:thin:@127.0.0.1:1521:orcl11g + username: adm_123 + password: adm_123 + +common: + csvDir: /var/csv/ + location: 2 + +logging: + level: + ROOT: INFO + com: + enzhico: DEBUG + file: /var/logs/batch.log + diff --git a/springboot-batch/src/main/resources/sql/schema-drop-oracle10g.sql b/springboot-batch/src/main/resources/sql/schema-drop-oracle10g.sql new file mode 100644 index 0000000..8911820 --- /dev/null +++ b/springboot-batch/src/main/resources/sql/schema-drop-oracle10g.sql @@ -0,0 +1,12 @@ +-- Autogenerated: do not edit this file + +DROP TABLE BATCH_STEP_EXECUTION_CONTEXT ; +DROP TABLE BATCH_JOB_EXECUTION_CONTEXT ; +DROP TABLE BATCH_STEP_EXECUTION ; +DROP TABLE BATCH_JOB_EXECUTION_PARAMS ; +DROP TABLE BATCH_JOB_EXECUTION ; +DROP TABLE BATCH_JOB_INSTANCE ; + +DROP SEQUENCE BATCH_STEP_EXECUTION_SEQ ; +DROP SEQUENCE BATCH_JOB_EXECUTION_SEQ ; +DROP SEQUENCE BATCH_JOB_SEQ ; diff --git a/springboot-batch/src/main/resources/sql/schema-oracle10g.sql b/springboot-batch/src/main/resources/sql/schema-oracle10g.sql new file mode 100644 index 0000000..1f848bd --- /dev/null +++ b/springboot-batch/src/main/resources/sql/schema-oracle10g.sql @@ -0,0 +1,81 @@ +-- Autogenerated: do not edit this file + +CREATE TABLE BATCH_JOB_INSTANCE ( + JOB_INSTANCE_ID NUMBER(19,0) NOT NULL PRIMARY KEY , + VERSION NUMBER(19,0) , + JOB_NAME VARCHAR2(100) NOT NULL, + JOB_KEY VARCHAR2(32) NOT NULL, + constraint JOB_INST_UN unique (JOB_NAME, JOB_KEY) +) ; + +CREATE TABLE BATCH_JOB_EXECUTION ( + JOB_EXECUTION_ID NUMBER(19,0) NOT NULL PRIMARY KEY , + VERSION NUMBER(19,0) , + JOB_INSTANCE_ID NUMBER(19,0) NOT NULL, + CREATE_TIME TIMESTAMP NOT NULL, + START_TIME TIMESTAMP DEFAULT NULL , + END_TIME TIMESTAMP DEFAULT NULL , + STATUS VARCHAR2(10) , + EXIT_CODE VARCHAR2(3600) , + EXIT_MESSAGE VARCHAR2(3600) , + LAST_UPDATED TIMESTAMP, + JOB_CONFIGURATION_LOCATION VARCHAR(2500) NULL, + constraint JOB_INST_EXEC_FK foreign key (JOB_INSTANCE_ID) + references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID) +) ; + +CREATE TABLE BATCH_JOB_EXECUTION_PARAMS ( + JOB_EXECUTION_ID NUMBER(19,0) NOT NULL , + TYPE_CD VARCHAR2(6) NOT NULL , + KEY_NAME VARCHAR2(200) NOT NULL , + STRING_VAL VARCHAR2(3000) , + DATE_VAL TIMESTAMP DEFAULT NULL , + LONG_VAL NUMBER(19,0) , + DOUBLE_VAL NUMBER , + IDENTIFYING CHAR(1) NOT NULL , + constraint JOB_EXEC_PARAMS_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE TABLE BATCH_STEP_EXECUTION ( + STEP_EXECUTION_ID NUMBER(19,0) NOT NULL PRIMARY KEY , + VERSION NUMBER(19,0) NOT NULL, + STEP_NAME VARCHAR2(100) NOT NULL, + JOB_EXECUTION_ID NUMBER(19,0) NOT NULL, + START_TIME TIMESTAMP NOT NULL , + END_TIME TIMESTAMP DEFAULT NULL , + STATUS VARCHAR2(10) , + COMMIT_COUNT NUMBER(19,0) , + READ_COUNT NUMBER(19,0) , + FILTER_COUNT NUMBER(19,0) , + WRITE_COUNT NUMBER(19,0) , + READ_SKIP_COUNT NUMBER(19,0) , + WRITE_SKIP_COUNT NUMBER(19,0) , + PROCESS_SKIP_COUNT NUMBER(19,0) , + ROLLBACK_COUNT NUMBER(19,0) , + EXIT_CODE VARCHAR2(3600) , + EXIT_MESSAGE VARCHAR2(3600) , + LAST_UPDATED TIMESTAMP, + constraint JOB_EXEC_STEP_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE TABLE BATCH_STEP_EXECUTION_CONTEXT ( + STEP_EXECUTION_ID NUMBER(19,0) NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR2(3600) NOT NULL, + SERIALIZED_CONTEXT CLOB , + constraint STEP_EXEC_CTX_FK foreign key (STEP_EXECUTION_ID) + references BATCH_STEP_EXECUTION(STEP_EXECUTION_ID) +) ; + +CREATE TABLE BATCH_JOB_EXECUTION_CONTEXT ( + JOB_EXECUTION_ID NUMBER(19,0) NOT NULL PRIMARY KEY, + SHORT_CONTEXT VARCHAR2(3600) NOT NULL, + SERIALIZED_CONTEXT CLOB , + constraint JOB_EXEC_CTX_FK foreign key (JOB_EXECUTION_ID) + references BATCH_JOB_EXECUTION(JOB_EXECUTION_ID) +) ; + +CREATE SEQUENCE BATCH_STEP_EXECUTION_SEQ START WITH 0 MINVALUE 0 MAXVALUE 9223372036854775807 NOCYCLE; +CREATE SEQUENCE BATCH_JOB_EXECUTION_SEQ START WITH 0 MINVALUE 0 MAXVALUE 9223372036854775807 NOCYCLE; +CREATE SEQUENCE BATCH_JOB_SEQ START WITH 0 MINVALUE 0 MAXVALUE 9223372036854775807 NOCYCLE; diff --git a/springboot-batch/src/test/java/com/enzhico/service/BatchServiceTest.java b/springboot-batch/src/test/java/com/enzhico/service/BatchServiceTest.java new file mode 100644 index 0000000..ec1aa56 --- /dev/null +++ b/springboot-batch/src/test/java/com/enzhico/service/BatchServiceTest.java @@ -0,0 +1,222 @@ +package com.enzhico.service; + +import com.enzhico.trans.Application; +import com.enzhico.trans.config.properties.CommonProperties; +import com.enzhico.trans.modules.common.anno.TableName; +import com.enzhico.trans.modules.common.vo.*; +import com.enzhico.trans.service.CsvService; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.batch.core.Job; +import org.springframework.batch.core.JobParameters; +import org.springframework.batch.core.JobParametersBuilder; +import org.springframework.batch.core.launch.JobLauncher; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import javax.annotation.Resource; +import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + + +/** + * BatchServiceTest + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/2 + */ +@RunWith(SpringRunner.class) +@SpringBootTest(classes = Application.class) +public class BatchServiceTest { + private Logger logger = LoggerFactory.getLogger(this.getClass()); + @Autowired + private CommonProperties p; + @Autowired + private JobLauncher jobLauncher; + + @Autowired + @Qualifier("commonJob") + private Job commonJob; + + @Autowired + @Qualifier("vtollJob") + private Job vtollJob; + + @Autowired + @Qualifier("cantonJob") + private Job cantonJob; + + @Autowired + @Qualifier("zappJob") + private Job zappJob; + + @Autowired + @Qualifier("zlogJob") + private Job zlogJob; + + @Resource + private CsvService csvService; + + private static final String KEY_JOB_NAME = "input.job.name"; + private static final String KEY_FILE_NAME = "input.file.name"; + private static final String KEY_VO_NAME = "input.vo.name"; + private static final String KEY_COLUMNS = "input.columns"; + private static final String KEY_SQL = "input.sql"; + + @Test + public void testBudgetVtoll() throws Exception { + JobParameters jobParameters = new JobParametersBuilder() + .addLong("time", System.currentTimeMillis()) + .addString("input.file.name", p.getCsvVtoll()) + .toJobParameters(); + jobLauncher.run(vtollJob, jobParameters); + logger.info("Main线程执行完成"); + while (true) { + Thread.sleep(2000000L); + } + } + @Test + public void testCanton() throws Exception { + JobParameters jobParameters = new JobParametersBuilder() + .addLong("time", System.currentTimeMillis()) + .addString("input.file.name", p.getCsvCanton()) + .toJobParameters(); + jobLauncher.run(cantonJob, jobParameters); + logger.info("Main线程执行完成"); + + while (true) { + Thread.sleep(2000000L); + } + } + + /** + * 测试一个配置类,可同时运行多个任务 + * @throws Exception 异常 + */ + @Test + public void testCommonJobs() throws Exception { + JobParameters jobParameters1 = new JobParametersBuilder() + .addLong("time",System.currentTimeMillis()) + .addString(KEY_JOB_NAME, "App") + .addString(KEY_FILE_NAME, p.getCsvApp()) + .addString(KEY_VO_NAME, "com.enzhico.trans.modules.zapp.App") + .addString(KEY_COLUMNS, String.join(",", new String[]{ + "appid", "zname", "flag" + })) + .addString(KEY_SQL, "insert into z_test_App (appid, zname, flag) values(:appid, :zname, :flag)") + .toJobParameters(); + jobLauncher.run(commonJob, jobParameters1); + + JobParameters jobParameters2 = new JobParametersBuilder() + .addLong("time",System.currentTimeMillis()) + .addString(KEY_JOB_NAME, "Log") + .addString(KEY_FILE_NAME, p.getCsvLog()) + .addString(KEY_VO_NAME, "com.enzhico.trans.modules.zlog.Log") + .addString(KEY_COLUMNS, String.join(",", new String[]{ + "logid", "msg", "logtime" + })) + .addString(KEY_SQL, "insert into z_test_Log (logid, msg, logtime) values(:logid, :msg, :logtime)") + .toJobParameters(); + jobLauncher.run(commonJob, jobParameters2); + + logger.info("Main线程执行完成"); + + while (true) { + Thread.sleep(2000000L); + } + } + + /** + * 一起测试4个CSV文件导入 + * @throws Exception 异常 + */ + @Test + public void testImportCsv4() throws Exception { + JobParameters jobParameters1 = new JobParametersBuilder() + .addLong("time",System.currentTimeMillis()) + .addString(KEY_JOB_NAME, "BscExeOffice") + .addString(KEY_FILE_NAME, p.getCsvExeOffice()) + .addString(KEY_VO_NAME, "com.enzhico.trans.modules.common.vo.BscExeOffice") + .addString(KEY_COLUMNS, String.join(",", new String[]{ + "id","cantonid","code","name","memcode","supdeptid","comdeptid","contactman","tel","mobil","email","bgofficeid","infomobil","infoman","logpass","startdate","stopdate","status","memo","auditer","audittime","isaudit","edittime","platform_id","isprintbill" + })) + .addString(KEY_SQL, "insert into NT_BSC_EXEOFFICE (F_ID,F_CANTONID,F_CODE,F_NAME,F_MEMCODE,F_SUPDEPTID,F_COMDEPTID,F_CONTACTMAN,F_TEL,F_MOBIL,F_EMAIL,F_BGOFFICEID,F_INFOMOBIL,F_INFOMAN,F_LOGPASS,F_STARTDATE,F_STOPDATE,F_STATUS,F_MEMO,F_AUDITER,F_AUDITTIME,F_ISAUDIT,F_EDITTIME,F_PLATFORM_ID,F_ISPRINTBILL)" + + " values(:id, :cantonid, :code, :name, :memcode, :supdeptid, :comdeptid, :contactman, :tel, :mobil, :email, :bgofficeid, :infomobil, :infoman, :logpass, :startdate, :stopdate, :status, :memo, :auditer, :audittime, :isaudit, :edittime, :platform_id, :isprintbill)") + .toJobParameters(); + jobLauncher.run(commonJob, jobParameters1); + +// JobParameters jobParameters2 = new JobParametersBuilder() +// .addLong("time",System.currentTimeMillis()) +// .addString(KEY_JOB_NAME, "Log") +// .addString(KEY_FILE_NAME, p.getCsvLog()) +// .addString(KEY_VO_NAME, "com.enzhico.trans.modules.zlog.Log") +// .addString(KEY_COLUMNS, String.join(",", new String[]{ +// "logid", "msg", "logtime" +// })) +// .addString(KEY_SQL, "insert into z_test_Log (logid, msg, logtime) values(:logid, :msg, :logtime)") +// .toJobParameters(); +// jobLauncher.run(commonJob, jobParameters2); + + logger.info("Main线程执行完成"); + + while (true) { + Thread.sleep(2000000L); + } + } + + /** + CREATE TABLE Z_TEST_APP ( + appid INT, + zname VARCHAR2 (20), + flag VARCHAR2 (2), + CONSTRAINT app_pk PRIMARY KEY (appid) + ); + + CREATE TABLE Z_TEST_LOG ( + logid INT, + msg VARCHAR2 (20), + logtime VARCHAR2 (8), + CONSTRAINT log_pk PRIMARY KEY (logid) + ); + * @throws Exception + */ + @Test + public void testTwoJobs() throws Exception { + JobParameters jobParameters1 = new JobParametersBuilder() + .addLong("time", System.currentTimeMillis()) + .addString("input.file.name", p.getCsvApp()) + .toJobParameters(); + jobLauncher.run(zappJob, jobParameters1); + + JobParameters jobParameters2 = new JobParametersBuilder() + .addLong("time", System.currentTimeMillis()) + .addString("input.file.name", p.getCsvLog()) + .toJobParameters(); + jobLauncher.run(zlogJob, jobParameters2); + + logger.info("Main线程执行完成"); + while (true) { + Thread.sleep(2000000L); + } + } + + @Test + public void testRunSimple() throws Exception { + csvService.runTask(BscCanton.class); + csvService.runTask(BscOfficeExeItem.class); + csvService.runTask(BscExeOffice.class); + csvService.runTask(BscTollItem.class); + while (true) { + Thread.sleep(200000L); + } + } +} diff --git a/springboot-batch/src/test/java/com/enzhico/service/SimpleTest.java b/springboot-batch/src/test/java/com/enzhico/service/SimpleTest.java new file mode 100644 index 0000000..5849329 --- /dev/null +++ b/springboot-batch/src/test/java/com/enzhico/service/SimpleTest.java @@ -0,0 +1,28 @@ +package com.enzhico.service; + +import org.junit.Test; + +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Date; +import java.util.Locale; + +/** + * SimpleTest + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/5 + */ +public class SimpleTest { + @Test + public void test() throws Exception { + System.out.println(Arrays.toString(new String[]{"11", "22"})); + System.out.println(String.join(",", new String[]{"11", "22"})); + + String d = "08-12月-17 05.38.07.812000 下午"; + Locale locale = Locale.CHINA; + Date dd = new SimpleDateFormat("dd-M月-y hh.mm.ss.S a", locale).parse(d); + System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(dd)); + } +} diff --git a/springboot-batch/temp.txt b/springboot-batch/temp.txt new file mode 100644 index 0000000..64ecfec --- /dev/null +++ b/springboot-batch/temp.txt @@ -0,0 +1 @@ +530000_00741,530000,00741,云南省城市建设档案学会,,,,,,,,,,,,20100805,21001231,0,,,,1,24-8月 -16 08.55.05.628000 下午,,0 \ No newline at end of file diff --git a/springboot-cache/.gitignore b/springboot-cache/.gitignore new file mode 100644 index 0000000..1e3c5bb --- /dev/null +++ b/springboot-cache/.gitignore @@ -0,0 +1,14 @@ +# 此为注释– 将被Git 忽略 +# /结尾表示是目录,忽略目录和目录下的所有件 +# /开头表示根目录,否则是.gitignore的相对目录 +# !开头表示反选 +.idea/ +target/ +*.iml +*.ipr +*.iws +*.log +.svn/ +.project +rebel.xml +.rebel-remote.xml.* diff --git a/springboot-cache/LICENSE b/springboot-cache/LICENSE new file mode 100644 index 0000000..83cd47d --- /dev/null +++ b/springboot-cache/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2018 Xiong Neng + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/springboot-cache/README.md b/springboot-cache/README.md new file mode 100644 index 0000000..df3a70d --- /dev/null +++ b/springboot-cache/README.md @@ -0,0 +1,9 @@ +## SpringBoot Cache 演示项目 + +基于注解的声明式缓存 + +## 许可证 + +Copyright (c) 2018 Xiong Neng + +基于 MIT 协议发布: diff --git a/springboot-cache/pom.xml b/springboot-cache/pom.xml new file mode 100644 index 0000000..da69b93 --- /dev/null +++ b/springboot-cache/pom.xml @@ -0,0 +1,116 @@ + + + 4.0.0 + + com.enzhico + springboot-cache + 1.0.0-SNAPSHOT + jar + + springboot-cache + SpringBoot Transaction演示 + + + org.springframework.boot + spring-boot-starter-parent + 1.5.9.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + 1.1.2 + 8.0.7-dmr + 2.1.8 + 1.0.5 + + + + + org.springframework.boot + spring-boot-starter-data-redis + + + org.springframework.boot + spring-boot-starter-test + + + com.vaadin.external.google + android-json + + + + + org.springframework.boot + spring-boot-starter-jdbc + + + mysql + mysql-connector-java + ${mysql-connector.version} + runtime + + + com.alibaba + druid + ${druid.version} + + + + com.baomidou + mybatis-plus + ${mybatis-plus.version} + + + com.baomidou + mybatisplus-spring-boot-starter + ${mybatisplus-spring-boot-starter.version} + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.6.1 + + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.20 + + true + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + + + src/main/resources + + + src/main/java + + **/*.xml + + + + + + diff --git a/springboot-cache/run.sh b/springboot-cache/run.sh new file mode 100644 index 0000000..955efb1 --- /dev/null +++ b/springboot-cache/run.sh @@ -0,0 +1,72 @@ +#!/bin/bash +# 项目自动更新脚本 +# 先clone相应的分支下来: +# git clone ssh://git@120.24.173.142:7999/xxx.git +# 远程调试启动: +# nohup java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -Xms512m -Xmx1024m -jar -Dspring.profiles.active=${profile} ${jarfile} >/dev/null 2>&1 & + +function start { + profile="$1" + echo "启动环境profile=${profile}" + jarfile=$(ls target/*.jar) + if [[ "$?" == "0" ]]; then + stop $profile $jarfile + fi + branch=$(git branch |awk '{print $2}') + git pull origin ${branch} + echo "更新完代码开始重新打包" + mvn clean && mvn clean && mvn package -DskipTests=true + if [[ "$?" != "0" ]]; then + echo "编译出错,退出!" + exit 1 + fi + echo "nohup java -Xms512m -Xmx1024m -jar -Dspring.profiles.active=${profile} ${jarfile} >/dev/null 2>&1 &" + nohup java -Xms512m -Xmx1024m -jar -Dspring.profiles.active=${profile} ${jarfile} >/dev/null 2>&1 & + echo "启动应用中,请查看日志文件..." +} + +function stop { + profile="$1" + jarfile="$2" + ps aux | grep "${jarfile}" | grep "spring.profiles.active=${profile}" | grep -v grep > /dev/null + if [[ "$?" == "0" ]]; then + echo "该应用还在跑,我先停了它" + pid=$(ps aux | grep "${jarfile}" | grep "spring.profiles.active=${profile}" | grep -v grep |awk '{print $2}') + if [[ "$pid" != "" ]]; then + kill -9 $pid + fi + echo "停止应用成功..." + fi +} + +if [[ "$1" == "start" ]]; then + if [[ "$#" < 2 ]]; then + echo "请输入正确参数:./epay.sh start {profile}" + exit 1 + fi + profile="$2" + if [[ "$profile" != "dev" && "$profile" != "test" && "$profile" != "show" && "$profile" != "production" ]]; then + echo "参数错误,请输入正确的profile参数,使用方法:" + echo "./epay.sh start {profile} ==> 启动应用,{profile}取值:dev|test|show|production" + exit 1 + fi + start "${profile}" +elif [[ "$1" == "stop" ]]; then + if [[ "$#" < 2 ]]; then + echo "请输入正确参数:./epay.sh stop {profile}" + exit 1 + fi + profile="$2" + if [[ "$profile" != "dev" && "$profile" != "test" && "$profile" != "show" && "$profile" != "production" ]]; then + echo "参数错误,请输入正确的profile参数,使用方法:" + echo "./epay.sh stop {profile} ==> 停止应用,{profile}取值:dev|test|show|production" + exit 1 + fi + jarfile=$(ls target/*.jar) + stop $profile $jarfile +else + echo "参数错误,使用方法:{}参数是必填的,[]参数可选" + echo "./epay.sh start {profile} ==> 启动应用,{profile}取值:dev|test|show|production" + echo "./epay.sh stop {profile} ==> 停止应用,{profile}取值:dev|test|show|production" + exit 1 +fi diff --git a/springboot-cache/src/main/java/com/enzhico/trans/Application.java b/springboot-cache/src/main/java/com/enzhico/trans/Application.java new file mode 100644 index 0000000..77de9df --- /dev/null +++ b/springboot-cache/src/main/java/com/enzhico/trans/Application.java @@ -0,0 +1,12 @@ +package com.enzhico.trans; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } + +} diff --git a/springboot-cache/src/main/java/com/enzhico/trans/config/DruidProperties.java b/springboot-cache/src/main/java/com/enzhico/trans/config/DruidProperties.java new file mode 100644 index 0000000..31e1bf8 --- /dev/null +++ b/springboot-cache/src/main/java/com/enzhico/trans/config/DruidProperties.java @@ -0,0 +1,249 @@ +package com.enzhico.trans.config; + +import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.util.JdbcConstants; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +import java.sql.SQLException; + +/** + *

                    数据库数据源配置

                    + *

                    说明:这个类中包含了许多默认配置,若这些配置符合您的情况,您可以不用管,若不符合,建议不要修改本类,建议直接在"application.yml"中配置即可

                    + * + * @author xiongneng + * @since 2017-05-21 11:18 + */ +@Component +@ConfigurationProperties(prefix = "spring.datasource") +public class DruidProperties { + + private String url; + + private String username; + + private String password; + + private String driverClassName = "com.mysql.cj.jdbc.Driver"; + + private Integer initialSize = 10; + + private Integer minIdle = 3; + + private Integer maxActive = 60; + + private Integer maxWait = 60000; + + private Boolean removeAbandoned = true; + + private Integer removeAbandonedTimeout = 180; + + private Integer timeBetweenEvictionRunsMillis = 60000; + + private Integer minEvictableIdleTimeMillis = 300000; + + private String validationQuery = "SELECT 'x'"; + + private Boolean testWhileIdle = true; + + private Boolean testOnBorrow = false; + + private Boolean testOnReturn = false; + + private Boolean poolPreparedStatements = true; + + private Integer maxPoolPreparedStatementPerConnectionSize = 50; + + private String filters = "stat"; + + public void config(DruidDataSource dataSource) { + dataSource.setDbType(JdbcConstants.MYSQL); + dataSource.setUrl(url); + dataSource.setUsername(username); + dataSource.setPassword(password); + dataSource.setDriverClassName(driverClassName); + dataSource.setInitialSize(initialSize); // 定义初始连接数 + dataSource.setMinIdle(minIdle); // 最小空闲 + dataSource.setMaxActive(maxActive); // 定义最大连接数 + dataSource.setMaxWait(maxWait); // 获取连接等待超时的时间 + dataSource.setRemoveAbandoned(removeAbandoned); // 超过时间限制是否回收 + dataSource.setRemoveAbandonedTimeout(removeAbandonedTimeout); // 超过时间限制多长 + + // 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + dataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); + // 配置一个连接在池中最小生存的时间,单位是毫秒 + dataSource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); + // 用来检测连接是否有效的sql,要求是一个查询语句 + dataSource.setValidationQuery(validationQuery); + // 申请连接的时候检测 + dataSource.setTestWhileIdle(testWhileIdle); + // 申请连接时执行validationQuery检测连接是否有效,配置为true会降低性能 + dataSource.setTestOnBorrow(testOnBorrow); + // 归还连接时执行validationQuery检测连接是否有效,配置为true会降低性能 + dataSource.setTestOnReturn(testOnReturn); + // 打开PSCache,并且指定每个连接上PSCache的大小 + dataSource.setPoolPreparedStatements(poolPreparedStatements); + dataSource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize); + // 属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有: + // 监控统计用的filter:stat + // 日志用的filter:log4j + // 防御SQL注入的filter:wall + try { + dataSource.setFilters(filters); + } catch (SQLException e) { + e.printStackTrace(); + } + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getDriverClassName() { + return driverClassName; + } + + public void setDriverClassName(String driverClassName) { + this.driverClassName = driverClassName; + } + + public Integer getInitialSize() { + return initialSize; + } + + public void setInitialSize(Integer initialSize) { + this.initialSize = initialSize; + } + + public Integer getMinIdle() { + return minIdle; + } + + public void setMinIdle(Integer minIdle) { + this.minIdle = minIdle; + } + + public Integer getMaxActive() { + return maxActive; + } + + public void setMaxActive(Integer maxActive) { + this.maxActive = maxActive; + } + + public Integer getMaxWait() { + return maxWait; + } + + public void setMaxWait(Integer maxWait) { + this.maxWait = maxWait; + } + + public Integer getTimeBetweenEvictionRunsMillis() { + return timeBetweenEvictionRunsMillis; + } + + public void setTimeBetweenEvictionRunsMillis(Integer timeBetweenEvictionRunsMillis) { + this.timeBetweenEvictionRunsMillis = timeBetweenEvictionRunsMillis; + } + + public Integer getMinEvictableIdleTimeMillis() { + return minEvictableIdleTimeMillis; + } + + public void setMinEvictableIdleTimeMillis(Integer minEvictableIdleTimeMillis) { + this.minEvictableIdleTimeMillis = minEvictableIdleTimeMillis; + } + + public String getValidationQuery() { + return validationQuery; + } + + public void setValidationQuery(String validationQuery) { + this.validationQuery = validationQuery; + } + + public Boolean getTestWhileIdle() { + return testWhileIdle; + } + + public void setTestWhileIdle(Boolean testWhileIdle) { + this.testWhileIdle = testWhileIdle; + } + + public Boolean getTestOnBorrow() { + return testOnBorrow; + } + + public void setTestOnBorrow(Boolean testOnBorrow) { + this.testOnBorrow = testOnBorrow; + } + + public Boolean getTestOnReturn() { + return testOnReturn; + } + + public void setTestOnReturn(Boolean testOnReturn) { + this.testOnReturn = testOnReturn; + } + + public Boolean getPoolPreparedStatements() { + return poolPreparedStatements; + } + + public void setPoolPreparedStatements(Boolean poolPreparedStatements) { + this.poolPreparedStatements = poolPreparedStatements; + } + + public Integer getMaxPoolPreparedStatementPerConnectionSize() { + return maxPoolPreparedStatementPerConnectionSize; + } + + public void setMaxPoolPreparedStatementPerConnectionSize(Integer maxPoolPreparedStatementPerConnectionSize) { + this.maxPoolPreparedStatementPerConnectionSize = maxPoolPreparedStatementPerConnectionSize; + } + + public String getFilters() { + return filters; + } + + public void setFilters(String filters) { + this.filters = filters; + } + + public Boolean getRemoveAbandoned() { + return removeAbandoned; + } + + public void setRemoveAbandoned(Boolean removeAbandoned) { + this.removeAbandoned = removeAbandoned; + } + + public Integer getRemoveAbandonedTimeout() { + return removeAbandonedTimeout; + } + + public void setRemoveAbandonedTimeout(Integer removeAbandonedTimeout) { + this.removeAbandonedTimeout = removeAbandonedTimeout; + } +} \ No newline at end of file diff --git a/springboot-cache/src/main/java/com/enzhico/trans/config/MybatisPlusConfig.java b/springboot-cache/src/main/java/com/enzhico/trans/config/MybatisPlusConfig.java new file mode 100644 index 0000000..036728b --- /dev/null +++ b/springboot-cache/src/main/java/com/enzhico/trans/config/MybatisPlusConfig.java @@ -0,0 +1,45 @@ +package com.enzhico.trans.config; + +import com.alibaba.druid.pool.DruidDataSource; +import com.baomidou.mybatisplus.plugins.PaginationInterceptor; +import com.enzhico.trans.config.DruidProperties; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import javax.annotation.Resource; + +/** + * MybatisPlus配置 + * + * @author xiongneng + * @since 2017/5/20 21:58 + */ +@Configuration +@EnableTransactionManagement(order = 2) +@MapperScan(basePackages = {"com.enzhico.trans.dao.repository"}) +public class MybatisPlusConfig { + + @Resource + private DruidProperties druidProperties; + + /** + * 单数据源连接池配置 + */ + @Bean + public DruidDataSource singleDatasource() { + DruidDataSource dataSource = new DruidDataSource(); + druidProperties.config(dataSource); + return dataSource; + } + + /** + * mybatis-plus分页插件 + */ + @Bean + public PaginationInterceptor paginationInterceptor() { + return new PaginationInterceptor(); + } +} diff --git a/springboot-cache/src/main/java/com/enzhico/trans/config/RedisCacheConfig.java b/springboot-cache/src/main/java/com/enzhico/trans/config/RedisCacheConfig.java new file mode 100644 index 0000000..b4c2c8c --- /dev/null +++ b/springboot-cache/src/main/java/com/enzhico/trans/config/RedisCacheConfig.java @@ -0,0 +1,51 @@ +package com.enzhico.trans.config; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.cache.interceptor.KeyGenerator; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.cache.RedisCacheManager; +import org.springframework.stereotype.Component; +import org.springframework.transaction.annotation.EnableTransactionManagement; + +import java.lang.reflect.Method; +import java.util.Arrays; + +/** + * RedisCacheConfig + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/2 + */ +@Configuration +@EnableCaching +public class RedisCacheConfig { + private Logger logger = LoggerFactory.getLogger(this.getClass()); + + /** + * 重新配置RedisCacheManager + */ + @Autowired + public void configRedisCacheManger(RedisCacheManager rd) { + rd.setDefaultExpiration(100L); + } + + /** + * 自定义缓存key的生成类实现 + */ + @Bean(name = "myKeyGenerator") + public KeyGenerator myKeyGenerator() { + return new KeyGenerator() { + @Override + public Object generate(Object o, Method method, Object... params) { + logger.info("自定义缓存,使用第一参数作为缓存key,params = " + Arrays.toString(params)); + // 仅仅用于测试,实际不可能这么写 + return params[0]; + } + }; + } +} diff --git a/springboot-cache/src/main/java/com/enzhico/trans/dao/entity/User.java b/springboot-cache/src/main/java/com/enzhico/trans/dao/entity/User.java new file mode 100644 index 0000000..2e5c34c --- /dev/null +++ b/springboot-cache/src/main/java/com/enzhico/trans/dao/entity/User.java @@ -0,0 +1,59 @@ +package com.enzhico.trans.dao.entity; + +import com.baomidou.mybatisplus.activerecord.Model; +import com.baomidou.mybatisplus.annotations.TableId; +import com.baomidou.mybatisplus.annotations.TableName; +import com.baomidou.mybatisplus.enums.IdType; + +import java.io.Serializable; + +@TableName(value = "t_user") +public class User extends Model { + /** + * 主键ID + */ + @TableId(value="id", type= IdType.INPUT) + private Integer id; + + private String username; + + private String password; + + public User() { + } + + public User(Integer id, String username, String password) { + this.id = id; + this.username = username; + this.password = password; + } + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + @Override + protected Serializable pkVal() { + return this.id; + } +} diff --git a/springboot-cache/src/main/java/com/enzhico/trans/dao/repository/UserMapper.java b/springboot-cache/src/main/java/com/enzhico/trans/dao/repository/UserMapper.java new file mode 100644 index 0000000..a7800de --- /dev/null +++ b/springboot-cache/src/main/java/com/enzhico/trans/dao/repository/UserMapper.java @@ -0,0 +1,7 @@ +package com.enzhico.trans.dao.repository; + +import com.baomidou.mybatisplus.mapper.BaseMapper; +import com.enzhico.trans.dao.entity.User; + +public interface UserMapper extends BaseMapper { +} diff --git a/springboot-cache/src/main/java/com/enzhico/trans/service/UserService.java b/springboot-cache/src/main/java/com/enzhico/trans/service/UserService.java new file mode 100644 index 0000000..ec0fc72 --- /dev/null +++ b/springboot-cache/src/main/java/com/enzhico/trans/service/UserService.java @@ -0,0 +1,103 @@ +package com.enzhico.trans.service; + +import com.enzhico.trans.dao.entity.User; +import com.enzhico.trans.dao.repository.UserMapper; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.cache.annotation.CacheConfig; +import org.springframework.cache.annotation.CacheEvict; +import org.springframework.cache.annotation.CachePut; +import org.springframework.cache.annotation.Cacheable; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +@Service +@CacheConfig(cacheNames = "users") +public class UserService { + private Logger logger = LoggerFactory.getLogger(this.getClass()); + @Resource + private UserMapper userMapper; + + /** + * cacheNames 设置缓存的值 + * key:指定缓存的key,这是指参数id值。 key可以使用spEl表达式 + * + * @param id + * @return + */ + @Cacheable(cacheNames = "user1", key = "#id") + public User getById(int id) { + logger.info("获取用户start..."); + return userMapper.selectById(id); + } + + /*** + * 如果设置sync=true, + * 如果缓存中没有数据,多个线程同时访问这个方法,则只有一个方法会执行到方法,其它方法需要等待 + * 如果缓存中已经有数据,则多个线程可以同时从缓存中获取数据 + * @param id + * @return + */ + @Cacheable(cacheNames = "user1", key = "#id", sync = true) + public User getById2(int id) { + logger.info("获取用户start..."); + return userMapper.selectById(id); + } + + /** + * 以上我们使用默认的keyGenerator,对应spring的SimpleKeyGenerator + * 如果你的使用很复杂,我们也可以自定义myKeyGenerator的生成key + *

                    + * key和keyGenerator是互斥,如果同时制定会出异常 + * The key and keyGenerator parameters are mutually exclusive and an operation specifying both will result in an exception. + * + * @param id + * @return + */ + @Cacheable(cacheNames = "user1", keyGenerator = "myKeyGenerator") + public User queryUserById(int id) { + logger.info("queryUserById,id={}", id); + return userMapper.selectById(id); + } + + /** + * 每次执行都会执行方法,同时使用新的返回值的替换缓存中的值 + * + * @param user + */ + @CachePut(cacheNames = "user1", key = "#user.id") + public void createUser(User user) { + logger.info("创建用户start..."); + userMapper.insert(user); + } + + /** + * 每次执行都会执行方法,同时使用新的返回值的替换缓存中的值 + * + * @param user + */ + @CachePut(cacheNames = "user1", key = "#user.id") + public void updateUser(User user) { + logger.info("更新用户start..."); + userMapper.updateById(user); + } + + /** + * 对符合key条件的记录从缓存中book1移除 + */ + @CacheEvict(cacheNames = "user1", key = "#id") + public void deleteById(int id) { + logger.info("删除用户start..."); + userMapper.deleteById(id); + } + + /** + * allEntries = true: 清空user1里的所有缓存 + */ + @CacheEvict(cacheNames="user1", allEntries=true) + public void clearUser1All(){ + logger.info("clearAll"); + } + +} diff --git a/springboot-cache/src/main/resources/application.yml b/springboot-cache/src/main/resources/application.yml new file mode 100644 index 0000000..eb585e2 --- /dev/null +++ b/springboot-cache/src/main/resources/application.yml @@ -0,0 +1,67 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## + +################### 自定义项目配置 ################### +enzhico: + kaptcha-open: true #是否开启登录时验证码 (true/false) + session-open: false #是否开启session验证 (true/false) + +################### 项目启动端口 ################### +server.port: 8092 + +################### spring配置 ################### +spring: + profiles: + active: dev + datasource: + url: jdbc:mysql://123.207.66.156:3306/test?useSSL=false&autoReconnect=true&tinyInt1isBit=false&useUnicode=true&characterEncoding=utf8 + username: root + password: _EnZhi123 + +################### mybatis-plus配置 ################### +mybatis-plus: + mapper-locations: classpath*:com/enzhico/trans/dao/repository/mapping/*.xml + typeAliasesPackage: > + com.enzhico.trans.dao.entity + global-config: + id-type: 0 # 0:数据库ID自增 1:用户输入id 2:全局唯一id(IdWorker) 3:全局唯一ID(uuid) + db-column-underline: false + refresh-mapper: true + configuration: + map-underscore-to-camel-case: true + cache-enabled: true #配置的缓存的全局开关 + lazyLoadingEnabled: true #延时加载的开关 + multipleResultSetsEnabled: true #开启的话,延时加载一个属性时会加载该对象全部属性,否则按需加载属性 + +logging: + level: + org.springframework.web.servlet: ERROR + +--- + +##################################################################### +######################## 开发环境profile ########################## +##################################################################### +spring: + profiles: dev + cache: + type: REDIS + redis: + host: 123.207.66.156 + port: 6379 + timeout: 0 + database: 0 + pool: + max-active: 100 + max-wait: -1 + max-idle: 8 + min-idle: 0 + +logging: + level: + ROOT: INFO + com: + enzhico: DEBUG + file: E:/logs/trans.log + diff --git a/springboot-cache/src/test/java/com/enzhico/service/UserServiceTest.java b/springboot-cache/src/test/java/com/enzhico/service/UserServiceTest.java new file mode 100644 index 0000000..e620411 --- /dev/null +++ b/springboot-cache/src/test/java/com/enzhico/service/UserServiceTest.java @@ -0,0 +1,48 @@ +package com.enzhico.service; + +import com.enzhico.trans.Application; +import com.enzhico.trans.dao.entity.User; +import com.enzhico.trans.service.UserService; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.Random; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; + + +/** + * UserServiceTest + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/2 + */ +@RunWith(SpringRunner.class) +@SpringBootTest(classes = Application.class) +public class UserServiceTest { + @Autowired + private UserService userService; + @Test + public void testCache() { + int id = new Random().nextInt(100); + User user = new User(id, "admin", "admin"); + userService.createUser(user); + User user1 = userService.getById(id); // 第1次访问 + assertEquals(user1.getPassword(), "admin"); + User user2 = userService.getById(id); // 第2次访问 + assertEquals(user2.getPassword(), "admin"); + User user3 = userService.queryUserById(id); // 第3次访问,使用自定义的KeyGenerator + assertEquals(user3.getPassword(), "admin"); + user.setPassword("123456"); + userService.updateUser(user); + User user4 = userService.getById(id); // 第4次访问 + assertEquals(user4.getPassword(), "123456"); + userService.deleteById(id); + assertNull(userService.getById(id)); + } +} diff --git a/springboot-echarts/.gitignore b/springboot-echarts/.gitignore new file mode 100644 index 0000000..b71e0c4 --- /dev/null +++ b/springboot-echarts/.gitignore @@ -0,0 +1,17 @@ +# 此为注释– 将被Git 忽略 +# /结尾表示是目录,忽略目录和目录下的所有件 +# /开头表示根目录,否则是.gitignore的相对目录 +# !开头表示反选 +.idea/ +target/ +*.iml +*.ipr +*.iws +*.log +.svn/ +.project +rebel.xml +.rebel-remote.xml.* +swagger.json +swagger.adoc + diff --git a/springboot-echarts/LICENSE b/springboot-echarts/LICENSE new file mode 100644 index 0000000..83cd47d --- /dev/null +++ b/springboot-echarts/LICENSE @@ -0,0 +1,20 @@ +The MIT License (MIT) + +Copyright (c) 2018 Xiong Neng + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of +the Software, and to permit persons to whom the Software is furnished to do so, +subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS +FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR +COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN +CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/springboot-echarts/README.md b/springboot-echarts/README.md new file mode 100644 index 0000000..d61c2d3 --- /dev/null +++ b/springboot-echarts/README.md @@ -0,0 +1,32 @@ +## Echarts + WebSocket实现图片生成 + +大致的过程是这样 + +对于每一种图表类型,开放一个数据请求接口,通过POST请求接受图表数据,然后push到客户端去, +客户端接受到请求后渲染echarts图表,并且会将BASE64格式图片数据再次提交给另外一个图片保存接口进行实际的保存。 + +对于需要生成图片形式的客户端,先打开一个浏览器连上服务器,另外写一个HTTPClient程序通过POST调用图片保存接口即可。 + +## 使用案例 + +使用JMH做微基准测试的时候,通常需要可视化显示测试结果,这时候可将文本形式的测试结果上传,自动生成非常漂亮的性能测试报告图表。 + +其他想要可视化数据保存图片的场景,都可以这样实现。 + +## 改进方案 + +通过配合PhantomJS来实现无浏览器的自动图片生成。 + +经过测试PhantomJS打开页面后可以连上socket服务器,但是10秒后自动关闭了。 + +尝试采用页面js轮询方式,1秒轮询一次,有数据的时候就导出图片。 + +结果导出图片太大了,不知道怎么回事,另外轮询方案始终不是很好。 + +最后还是老老实实使用websocket方案,自己手动打开这个网页吧。 + +## 许可证 + +Copyright (c) 2018 Xiong Neng + +基于 MIT 协议发布: diff --git a/springboot-echarts/pom.xml b/springboot-echarts/pom.xml new file mode 100644 index 0000000..26bda03 --- /dev/null +++ b/springboot-echarts/pom.xml @@ -0,0 +1,218 @@ + + + 4.0.0 + + com.enzhico + springboot-echarts + 1.0.0-SNAPSHOT + jar + + springboot-echarts + 通过接口实现Echarts图片保存 + + + org.springframework.boot + spring-boot-starter-parent + 1.5.9.RELEASE + + + + + UTF-8 + UTF-8 + 1.8 + 4.1.19.Final + 3.0.7.RELEASE + 2.2.2 + 1.20 + + + + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + org.springframework.boot + spring-boot-starter-jetty + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + org.apache.commons + commons-lang3 + 3.7 + + + commons-io + commons-io + 2.5 + + + commons-codec + commons-codec + 1.11 + + + junit + junit + 4.12 + test + + + org.hamcrest + hamcrest-all + 1.3 + test + + + + + com.corundumstudio.socketio + netty-socketio + 1.7.13 + + + io.netty + netty-buffer + ${netty.version} + + + io.netty + netty-codec + ${netty.version} + + + io.netty + netty-codec-http + ${netty.version} + + + io.netty + netty-common + ${netty.version} + + + io.netty + netty-handler + ${netty.version} + + + io.netty + netty-resolver + ${netty.version} + + + io.netty + netty-transport + ${netty.version} + + + io.netty + netty-transport-native-epoll + ${netty.version} + + + io.netty + netty-transport-native-unix-common + ${netty.version} + + + io.socket + socket.io-client + 1.0.0 + + + + + org.openjdk.jmh + jmh-core + ${jmh.version} + + + org.openjdk.jmh + jmh-generator-annprocess + ${jmh.version} + provided + + + + + net.sf.json-lib + json-lib + 2.4 + jdk15 + + + com.google.code.gson + gson + 2.8.2 + + + com.alibaba + fastjson + 1.2.46 + + + com.fasterxml.jackson.core + jackson-databind + 2.9.4 + + + com.fasterxml.jackson.core + jackson-annotations + 2.9.4 + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 3.6.1 + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-surefire-plugin + 2.20 + + true + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + src/main/resources + + + src/main/java + + **/*.xml + + + + + + \ No newline at end of file diff --git a/springboot-echarts/run.sh b/springboot-echarts/run.sh new file mode 100644 index 0000000..955efb1 --- /dev/null +++ b/springboot-echarts/run.sh @@ -0,0 +1,72 @@ +#!/bin/bash +# 项目自动更新脚本 +# 先clone相应的分支下来: +# git clone ssh://git@120.24.173.142:7999/xxx.git +# 远程调试启动: +# nohup java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -Xms512m -Xmx1024m -jar -Dspring.profiles.active=${profile} ${jarfile} >/dev/null 2>&1 & + +function start { + profile="$1" + echo "启动环境profile=${profile}" + jarfile=$(ls target/*.jar) + if [[ "$?" == "0" ]]; then + stop $profile $jarfile + fi + branch=$(git branch |awk '{print $2}') + git pull origin ${branch} + echo "更新完代码开始重新打包" + mvn clean && mvn clean && mvn package -DskipTests=true + if [[ "$?" != "0" ]]; then + echo "编译出错,退出!" + exit 1 + fi + echo "nohup java -Xms512m -Xmx1024m -jar -Dspring.profiles.active=${profile} ${jarfile} >/dev/null 2>&1 &" + nohup java -Xms512m -Xmx1024m -jar -Dspring.profiles.active=${profile} ${jarfile} >/dev/null 2>&1 & + echo "启动应用中,请查看日志文件..." +} + +function stop { + profile="$1" + jarfile="$2" + ps aux | grep "${jarfile}" | grep "spring.profiles.active=${profile}" | grep -v grep > /dev/null + if [[ "$?" == "0" ]]; then + echo "该应用还在跑,我先停了它" + pid=$(ps aux | grep "${jarfile}" | grep "spring.profiles.active=${profile}" | grep -v grep |awk '{print $2}') + if [[ "$pid" != "" ]]; then + kill -9 $pid + fi + echo "停止应用成功..." + fi +} + +if [[ "$1" == "start" ]]; then + if [[ "$#" < 2 ]]; then + echo "请输入正确参数:./epay.sh start {profile}" + exit 1 + fi + profile="$2" + if [[ "$profile" != "dev" && "$profile" != "test" && "$profile" != "show" && "$profile" != "production" ]]; then + echo "参数错误,请输入正确的profile参数,使用方法:" + echo "./epay.sh start {profile} ==> 启动应用,{profile}取值:dev|test|show|production" + exit 1 + fi + start "${profile}" +elif [[ "$1" == "stop" ]]; then + if [[ "$#" < 2 ]]; then + echo "请输入正确参数:./epay.sh stop {profile}" + exit 1 + fi + profile="$2" + if [[ "$profile" != "dev" && "$profile" != "test" && "$profile" != "show" && "$profile" != "production" ]]; then + echo "参数错误,请输入正确的profile参数,使用方法:" + echo "./epay.sh stop {profile} ==> 停止应用,{profile}取值:dev|test|show|production" + exit 1 + fi + jarfile=$(ls target/*.jar) + stop $profile $jarfile +else + echo "参数错误,使用方法:{}参数是必填的,[]参数可选" + echo "./epay.sh start {profile} ==> 启动应用,{profile}取值:dev|test|show|production" + echo "./epay.sh stop {profile} ==> 停止应用,{profile}取值:dev|test|show|production" + exit 1 +fi diff --git a/springboot-echarts/src/main/java/com/enzhico/benchmark/common/ResultExporter.java b/springboot-echarts/src/main/java/com/enzhico/benchmark/common/ResultExporter.java new file mode 100644 index 0000000..0c959c4 --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/benchmark/common/ResultExporter.java @@ -0,0 +1,57 @@ +package com.enzhico.benchmark.common; + +import org.openjdk.jmh.infra.BenchmarkParams; +import org.openjdk.jmh.results.BenchmarkResult; +import org.openjdk.jmh.results.Result; +import org.openjdk.jmh.results.RunResult; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; + +import static com.enzhico.echarts.common.util.ExportPngUtil.generateOption; +import static com.enzhico.echarts.common.util.ExportPngUtil.postOption; + +/** + * 将基准测试结果导出图片 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/24 + */ +public class ResultExporter { + + public static void exportResult(String titleStr, Collection results, + String paramKey, String xunit) throws Exception { + // 几个测试对象 + List objects = new ArrayList<>(); + // 测试维度,输入值n + List dimensions = new ArrayList<>(); + // 有几个测试对象,就有几组测试数据,每组测试数据中对应几个维度的结果 + List> allData = new ArrayList<>(); + List temp = new ArrayList<>(); + for (RunResult runResult : results) { + BenchmarkResult benchmarkResult = runResult.getAggregatedResult(); + Result r = benchmarkResult.getPrimaryResult(); + BenchmarkParams params = runResult.getParams(); + if (!objects.contains(r.getLabel())) { + objects.add(r.getLabel()); + if (!temp.isEmpty()) { + allData.add(temp); + temp = new ArrayList<>(); + } + } + temp.add(Double.parseDouble(String.format("%.2f", r.getScore()))); + // 测试维度 + if (!dimensions.contains("n=" + params.getParam(paramKey))) { + dimensions.add("n=" + params.getParam(paramKey)); + } + } + // 最后一组测试数据别忘记加进去了 + allData.add(temp); + + String optionStr = generateOption(titleStr, objects, dimensions, allData, xunit); + // POST到接口上 + postOption(optionStr, "http://localhost:9075/api/v1/data"); + } +} diff --git a/springboot-echarts/src/main/java/com/enzhico/benchmark/first/FirstBenchmark.java b/springboot-echarts/src/main/java/com/enzhico/benchmark/first/FirstBenchmark.java new file mode 100644 index 0000000..021200d --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/benchmark/first/FirstBenchmark.java @@ -0,0 +1,43 @@ +package com.enzhico.benchmark.first; + +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.RunnerException; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +import java.util.concurrent.TimeUnit; + + +/** + * FirstBenchmark + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/24 + */ +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.MICROSECONDS) +@State(Scope.Thread) +public class FirstBenchmark { + + @Benchmark + public int sleepAWhile() { + try { + Thread.sleep(500); + } catch (InterruptedException e) { + // ignore + } + return 0; + } + + public static void main(String[] args) throws RunnerException { + Options opt = new OptionsBuilder() + .include(FirstBenchmark.class.getSimpleName()) + .forks(1) + .warmupIterations(5) + .measurementIterations(5) + .build(); + new Runner(opt).run(); + } +} diff --git a/springboot-echarts/src/main/java/com/enzhico/benchmark/json/JsonDeserializeBenchmark.java b/springboot-echarts/src/main/java/com/enzhico/benchmark/json/JsonDeserializeBenchmark.java new file mode 100644 index 0000000..9b6a72b --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/benchmark/json/JsonDeserializeBenchmark.java @@ -0,0 +1,84 @@ +package com.enzhico.benchmark.json; + +import com.enzhico.benchmark.common.ResultExporter; +import com.enzhico.benchmark.json.model.FullName; +import com.enzhico.benchmark.json.model.Person; +import com.enzhico.benchmark.json.util.FastJsonUtil; +import com.enzhico.benchmark.json.util.GsonUtil; +import com.enzhico.benchmark.json.util.JacksonUtil; +import com.enzhico.benchmark.json.util.JsonLibUtil; +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.results.RunResult; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +import java.util.*; +import java.util.concurrent.TimeUnit; + +/** + * Json反序列化基准测试 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/24 + */ +@BenchmarkMode(Mode.SingleShotTime) +@OutputTimeUnit(TimeUnit.SECONDS) +@State(Scope.Benchmark) +public class JsonDeserializeBenchmark { + /** + * 反序列化次数参数 + */ + @Param({"1000", "10000", "100000"}) + private int count; + + private String jsonStr; + + public static void main(String[] args) throws Exception { + Options opt = new OptionsBuilder() + .include(JsonDeserializeBenchmark.class.getSimpleName()) + .forks(1) + .warmupIterations(0) + .build(); + Collection results = new Runner(opt).run(); + ResultExporter.exportResult("JSON反序列化性能", results, "count", "秒"); + } + + @Benchmark + public void JsonLib() { + for (int i = 0; i < count; i++) { + JsonLibUtil.json2Bean(jsonStr, Person.class); + } + } + + @Benchmark + public void Gson() { + for (int i = 0; i < count; i++) { + GsonUtil.json2Bean(jsonStr, Person.class); + } + } + + @Benchmark + public void FastJson() { + for (int i = 0; i < count; i++) { + FastJsonUtil.json2Bean(jsonStr, Person.class); + } + } + + @Benchmark + public void Jackson() { + for (int i = 0; i < count; i++) { + JacksonUtil.json2Bean(jsonStr, Person.class); + } + } + + @Setup + public void prepare() { + jsonStr="{\"name\":\"邵同学\",\"fullName\":{\"firstName\":\"zjj_first\",\"middleName\":\"zjj_middle\",\"lastName\":\"zjj_last\"},\"age\":24,\"birthday\":null,\"hobbies\":[\"篮球\",\"游泳\",\"coding\"],\"clothes\":{\"shoes\":\"安踏\",\"trousers\":\"adidas\",\"coat\":\"Nike\"},\"friends\":[{\"name\":\"小明\",\"fullName\":{\"firstName\":\"xxx_first\",\"middleName\":\"xxx_middle\",\"lastName\":\"xxx_last\"},\"age\":24,\"birthday\":null,\"hobbies\":[\"篮球\",\"游泳\",\"coding\"],\"clothes\":{\"shoes\":\"安踏\",\"trousers\":\"adidas\",\"coat\":\"Nike\"},\"friends\":null},{\"name\":\"Tony\",\"fullName\":{\"firstName\":\"xxx_first\",\"middleName\":\"xxx_middle\",\"lastName\":\"xxx_last\"},\"age\":24,\"birthday\":null,\"hobbies\":[\"篮球\",\"游泳\",\"coding\"],\"clothes\":{\"shoes\":\"安踏\",\"trousers\":\"adidas\",\"coat\":\"Nike\"},\"friends\":null},{\"name\":\"陈小二\",\"fullName\":{\"firstName\":\"xxx_first\",\"middleName\":\"xxx_middle\",\"lastName\":\"xxx_last\"},\"age\":24,\"birthday\":null,\"hobbies\":[\"篮球\",\"游泳\",\"coding\"],\"clothes\":{\"shoes\":\"安踏\",\"trousers\":\"adidas\",\"coat\":\"Nike\"},\"friends\":null}]}"; + } + + @TearDown + public void shutdown() { + } +} diff --git a/springboot-echarts/src/main/java/com/enzhico/benchmark/json/JsonSerializeBenchmark.java b/springboot-echarts/src/main/java/com/enzhico/benchmark/json/JsonSerializeBenchmark.java new file mode 100644 index 0000000..2b71331 --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/benchmark/json/JsonSerializeBenchmark.java @@ -0,0 +1,116 @@ +package com.enzhico.benchmark.json; + +import com.enzhico.benchmark.common.ResultExporter; +import com.enzhico.benchmark.json.model.FullName; +import com.enzhico.benchmark.json.model.Person; +import com.enzhico.benchmark.json.util.FastJsonUtil; +import com.enzhico.benchmark.json.util.GsonUtil; +import com.enzhico.benchmark.json.util.JacksonUtil; +import com.enzhico.benchmark.json.util.JsonLibUtil; +import com.enzhico.benchmark.sum.calc.impl.MultithreadCalculator; +import com.enzhico.benchmark.sum.calc.impl.SinglethreadCalculator; +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.infra.BenchmarkParams; +import org.openjdk.jmh.results.BenchmarkResult; +import org.openjdk.jmh.results.Result; +import org.openjdk.jmh.results.RunResult; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +import java.util.*; +import java.util.concurrent.TimeUnit; +import java.util.stream.IntStream; + +import static com.enzhico.echarts.common.util.ExportPngUtil.generateOption; +import static com.enzhico.echarts.common.util.ExportPngUtil.postOption; + +/** + * Json序列化基准测试 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/24 + */ +@BenchmarkMode(Mode.SingleShotTime) +@OutputTimeUnit(TimeUnit.SECONDS) +@State(Scope.Benchmark) +public class JsonSerializeBenchmark { + /** + * 序列化次数参数 + */ + @Param({"1000", "10000", "100000"}) + private int count; + + private Person p; + + public static void main(String[] args) throws Exception { + Options opt = new OptionsBuilder() + .include(JsonSerializeBenchmark.class.getSimpleName()) + .forks(1) + .warmupIterations(0) + .build(); + Collection results = new Runner(opt).run(); + ResultExporter.exportResult("JSON序列化性能", results, "count", "秒"); + } + + @Benchmark + public void JsonLib() { + for (int i = 0; i < count; i++) { + JsonLibUtil.bean2Json(p); + } + } + + @Benchmark + public void Gson() { + for (int i = 0; i < count; i++) { + GsonUtil.bean2Json(p); + } + } + + @Benchmark + public void FastJson() { + for (int i = 0; i < count; i++) { + FastJsonUtil.bean2Json(p); + } + } + + @Benchmark + public void Jackson() { + for (int i = 0; i < count; i++) { + JacksonUtil.bean2Json(p); + } + } + + @Setup + public void prepare() { + List friends=new ArrayList(); + friends.add(createAPerson("小明",null)); + friends.add(createAPerson("Tony",null)); + friends.add(createAPerson("陈小二",null)); + p=createAPerson("邵同学",friends); + } + + @TearDown + public void shutdown() { + } + + private Person createAPerson(String name,List friends) { + Person newPerson=new Person(); + newPerson.setName(name); + newPerson.setFullName(new FullName("zjj_first", "zjj_middle", "zjj_last")); + newPerson.setAge(24); + List hobbies=new ArrayList(); + hobbies.add("篮球"); + hobbies.add("游泳"); + hobbies.add("coding"); + newPerson.setHobbies(hobbies); + Map clothes=new HashMap(); + clothes.put("coat", "Nike"); + clothes.put("trousers", "adidas"); + clothes.put("shoes", "安踏"); + newPerson.setClothes(clothes); + newPerson.setFriends(friends); + return newPerson; + } +} diff --git a/springboot-echarts/src/main/java/com/enzhico/benchmark/json/model/FullName.java b/springboot-echarts/src/main/java/com/enzhico/benchmark/json/model/FullName.java new file mode 100644 index 0000000..f52a011 --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/benchmark/json/model/FullName.java @@ -0,0 +1,53 @@ +package com.enzhico.benchmark.json.model; + +/** + * FullName + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/24 + */ +public class FullName { + private String firstName; + private String middleName; + private String lastName; + + public FullName() { + } + + public FullName(String firstName, String middleName, String lastName) { + this.firstName = firstName; + this.middleName = middleName; + this.lastName = lastName; + } + + public String getFirstName() { + return firstName; + } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public String getMiddleName() { + return middleName; + } + + public void setMiddleName(String middleName) { + this.middleName = middleName; + } + + public String getLastName() { + return lastName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + @Override + public String toString() { + return "[firstName=" + firstName + ", middleName=" + + middleName + ", lastName=" + lastName + "]"; + } +} diff --git a/springboot-echarts/src/main/java/com/enzhico/benchmark/json/model/Person.java b/springboot-echarts/src/main/java/com/enzhico/benchmark/json/model/Person.java new file mode 100644 index 0000000..1651b16 --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/benchmark/json/model/Person.java @@ -0,0 +1,93 @@ +package com.enzhico.benchmark.json.model; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +/** + * Person + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/24 + */ +public class Person { + private String name; + private FullName fullName; + private int age; + private Date birthday; + private List hobbies; + private Map clothes; + private List friends; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public FullName getFullName() { + return fullName; + } + + public void setFullName(FullName fullName) { + this.fullName = fullName; + } + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public Date getBirthday() { + return birthday; + } + + public void setBirthday(Date birthday) { + this.birthday = birthday; + } + + public List getHobbies() { + return hobbies; + } + + public void setHobbies(List hobbies) { + this.hobbies = hobbies; + } + + public Map getClothes() { + return clothes; + } + + public void setClothes(Map clothes) { + this.clothes = clothes; + } + + public List getFriends() { + return friends; + } + + public void setFriends(List friends) { + this.friends = friends; + } + + @Override + public String toString() { + StringBuilder str = new StringBuilder("Person [name=" + name + ", fullName=" + fullName + ", age=" + + age + ", birthday=" + birthday + ", hobbies=" + hobbies + + ", clothes=" + clothes + "]\n"); + if (friends != null) { + str.append("Friends:\n"); + for (Person f : friends) { + str.append("\t").append(f); + } + } + return str.toString(); + } + +} diff --git a/springboot-echarts/src/main/java/com/enzhico/benchmark/json/util/FastJsonUtil.java b/springboot-echarts/src/main/java/com/enzhico/benchmark/json/util/FastJsonUtil.java new file mode 100644 index 0000000..8cac792 --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/benchmark/json/util/FastJsonUtil.java @@ -0,0 +1,20 @@ +package com.enzhico.benchmark.json.util; + +import com.alibaba.fastjson.JSON; + +/** + * FastJsonUtil + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/24 + */ +public class FastJsonUtil { + public static String bean2Json(Object obj) { + return JSON.toJSONString(obj); + } + + public static T json2Bean(String jsonStr, Class objClass) { + return JSON.parseObject(jsonStr, objClass); + } +} diff --git a/springboot-echarts/src/main/java/com/enzhico/benchmark/json/util/GsonUtil.java b/springboot-echarts/src/main/java/com/enzhico/benchmark/json/util/GsonUtil.java new file mode 100644 index 0000000..86f32c6 --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/benchmark/json/util/GsonUtil.java @@ -0,0 +1,33 @@ +package com.enzhico.benchmark.json.util; + +/** + * GsonUtil + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/24 + */ + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonElement; +import com.google.gson.JsonParser; + +public class GsonUtil { + private static Gson gson = new GsonBuilder().create(); + + public static String bean2Json(Object obj) { + return gson.toJson(obj); + } + + public static T json2Bean(String jsonStr, Class objClass) { + return gson.fromJson(jsonStr, objClass); + } + + public static String jsonFormatter(String uglyJsonStr) { + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + JsonParser jp = new JsonParser(); + JsonElement je = jp.parse(uglyJsonStr); + return gson.toJson(je); + } +} diff --git a/springboot-echarts/src/main/java/com/enzhico/benchmark/json/util/JacksonUtil.java b/springboot-echarts/src/main/java/com/enzhico/benchmark/json/util/JacksonUtil.java new file mode 100644 index 0000000..3cc048c --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/benchmark/json/util/JacksonUtil.java @@ -0,0 +1,35 @@ +package com.enzhico.benchmark.json.util; + +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.io.IOException; + +/** + * JacksonUtil + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/24 + */ +public class JacksonUtil { + private static ObjectMapper mapper = new ObjectMapper(); + + public static String bean2Json(Object obj) { + try { + return mapper.writeValueAsString(obj); + } catch (JsonProcessingException e) { + e.printStackTrace(); + return null; + } + } + + public static T json2Bean(String jsonStr, Class objClass) { + try { + return mapper.readValue(jsonStr, objClass); + } catch (IOException e) { + e.printStackTrace(); + return null; + } + } +} diff --git a/springboot-echarts/src/main/java/com/enzhico/benchmark/json/util/JsonLibUtil.java b/springboot-echarts/src/main/java/com/enzhico/benchmark/json/util/JsonLibUtil.java new file mode 100644 index 0000000..0528668 --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/benchmark/json/util/JsonLibUtil.java @@ -0,0 +1,25 @@ +package com.enzhico.benchmark.json.util; + +import net.sf.json.JSONObject; + +/** + * JsonLibUtil + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/24 + */ + +public class JsonLibUtil { + + public static String bean2Json(Object obj) { + JSONObject jsonObject = JSONObject.fromObject(obj); + return jsonObject.toString(); + } + + @SuppressWarnings("unchecked") + public static T json2Bean(String jsonStr, Class objClass) { + return (T) JSONObject.toBean(JSONObject.fromObject(jsonStr), objClass); + } + +} diff --git a/springboot-echarts/src/main/java/com/enzhico/benchmark/string/StringBuilderBenchmark.java b/springboot-echarts/src/main/java/com/enzhico/benchmark/string/StringBuilderBenchmark.java new file mode 100644 index 0000000..6b97b4e --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/benchmark/string/StringBuilderBenchmark.java @@ -0,0 +1,55 @@ +package com.enzhico.benchmark.string; + +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.RunnerException; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +import java.util.concurrent.TimeUnit; + +/** + * 比较字符串直接相加和StringBuilder的效率 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/25 + */ +@BenchmarkMode(Mode.Throughput) +@Warmup(iterations = 3) +@Measurement(iterations = 10, time = 5, timeUnit = TimeUnit.SECONDS) +@Threads(8) +@Fork(2) +@OutputTimeUnit(TimeUnit.MILLISECONDS) +public class StringBuilderBenchmark { + + @Benchmark + public void testStringAdd() { + String a = ""; + for (int i = 0; i < 10; i++) { + a += i; + } + print(a); + } + + @Benchmark + public void testStringBuilderAdd() { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < 10; i++) { + sb.append(i); + } + print(sb.toString()); + } + + private void print(String a) { + } + + + public static void main(String[] args) throws RunnerException { + Options options = new OptionsBuilder() + .include(StringBuilderBenchmark.class.getSimpleName()) + .output("E:/Benchmark.log") + .build(); + new Runner(options).run(); + } +} diff --git a/springboot-echarts/src/main/java/com/enzhico/benchmark/sum/SecondBenchmark.java b/springboot-echarts/src/main/java/com/enzhico/benchmark/sum/SecondBenchmark.java new file mode 100644 index 0000000..cefbdb5 --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/benchmark/sum/SecondBenchmark.java @@ -0,0 +1,68 @@ +package com.enzhico.benchmark.sum; + +import com.enzhico.benchmark.common.ResultExporter; +import com.enzhico.benchmark.sum.calc.Calculator; +import com.enzhico.benchmark.sum.calc.impl.MultithreadCalculator; +import com.enzhico.benchmark.sum.calc.impl.SinglethreadCalculator; +import org.openjdk.jmh.annotations.*; +import org.openjdk.jmh.results.RunResult; +import org.openjdk.jmh.runner.Runner; +import org.openjdk.jmh.runner.options.Options; +import org.openjdk.jmh.runner.options.OptionsBuilder; + +import java.util.Collection; +import java.util.concurrent.TimeUnit; +import java.util.stream.IntStream; + +/** + * SecondBenchmark + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/24 + */ +@BenchmarkMode(Mode.AverageTime) +@OutputTimeUnit(TimeUnit.MICROSECONDS) +@State(Scope.Benchmark) +public class SecondBenchmark { + @Param({"10000", "100000", "1000000"}) + private int length; + + private int[] numbers; + private Calculator singleThreadCalc; + private Calculator multiThreadCalc; + + public static void main(String[] args) throws Exception { + Options opt = new OptionsBuilder() + .include(SecondBenchmark.class.getSimpleName()) + .forks(1) + .warmupIterations(5) + .measurementIterations(2) + .build(); + Collection results = new Runner(opt).run(); + ResultExporter.exportResult("单线程与多线程求和性能", results, "length", "微秒"); + } + + @Benchmark + public long singleThreadBench() { + return singleThreadCalc.sum(numbers); + } + + @Benchmark + public long multiThreadBench() { + return multiThreadCalc.sum(numbers); + } + + @Setup + public void prepare() { + numbers = IntStream.rangeClosed(1, length).toArray(); + singleThreadCalc = new SinglethreadCalculator(); + multiThreadCalc = new MultithreadCalculator(Runtime.getRuntime().availableProcessors()); + } + + @TearDown + public void shutdown() { + singleThreadCalc.shutdown(); + multiThreadCalc.shutdown(); + } +} diff --git a/springboot-echarts/src/main/java/com/enzhico/benchmark/sum/calc/Calculator.java b/springboot-echarts/src/main/java/com/enzhico/benchmark/sum/calc/Calculator.java new file mode 100644 index 0000000..6b57d14 --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/benchmark/sum/calc/Calculator.java @@ -0,0 +1,23 @@ +package com.enzhico.benchmark.sum.calc; + +/** + * Calculator + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/24 + */ +public interface Calculator { + /** + * calculate sum of an integer array + * + * @param numbers + * @return + */ + public long sum(int[] numbers); + + /** + * shutdown pool or reclaim any related resources + */ + public void shutdown(); +} diff --git a/springboot-echarts/src/main/java/com/enzhico/benchmark/sum/calc/impl/MultithreadCalculator.java b/springboot-echarts/src/main/java/com/enzhico/benchmark/sum/calc/impl/MultithreadCalculator.java new file mode 100644 index 0000000..c637332 --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/benchmark/sum/calc/impl/MultithreadCalculator.java @@ -0,0 +1,81 @@ +package com.enzhico.benchmark.sum.calc.impl; + +import com.enzhico.benchmark.sum.calc.Calculator; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.Callable; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +/** + * MultithreadCalculator + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/24 + */ +public class MultithreadCalculator implements Calculator { + private final int nThreads; + private final ExecutorService pool; + + public MultithreadCalculator(int nThreads) { + this.nThreads = nThreads; + this.pool = Executors.newFixedThreadPool(nThreads); + } + + private class SumTask implements Callable { + private int[] numbers; + private int from; + private int to; + + public SumTask(int[] numbers, int from, int to) { + this.numbers = numbers; + this.from = from; + this.to = to; + } + + public Long call() throws Exception { + long total = 0L; + for (int i = from; i < to; i++) { + total += numbers[i]; + } + return total; + } + } + + public long sum(int[] numbers) { + int chunk = numbers.length / nThreads; + + int from, to; + List tasks = new ArrayList(); + for (int i = 1; i <= nThreads; i++) { + if (i == nThreads) { + from = (i - 1) * chunk; + to = numbers.length; + } else { + from = (i - 1) * chunk; + to = i * chunk; + } + tasks.add(new SumTask(numbers, from, to)); + } + + try { + List> futures = pool.invokeAll(tasks); + long total = 0L; + for (Future future : futures) { + total += future.get(); + } + return total; + } catch (Exception e) { + // ignore + return 0; + } + } + + @Override + public void shutdown() { + pool.shutdown(); + } +} diff --git a/springboot-echarts/src/main/java/com/enzhico/benchmark/sum/calc/impl/SinglethreadCalculator.java b/springboot-echarts/src/main/java/com/enzhico/benchmark/sum/calc/impl/SinglethreadCalculator.java new file mode 100644 index 0000000..1cf84a7 --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/benchmark/sum/calc/impl/SinglethreadCalculator.java @@ -0,0 +1,25 @@ +package com.enzhico.benchmark.sum.calc.impl; + +import com.enzhico.benchmark.sum.calc.Calculator; + +/** + * SinglethreadCalculator + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/24 + */ +public class SinglethreadCalculator implements Calculator { + public long sum(int[] numbers) { + long total = 0L; + for (int i : numbers) { + total += i; + } + return total; + } + + @Override + public void shutdown() { + // nothing to do + } +} diff --git a/springboot-echarts/src/main/java/com/enzhico/echarts/Application.java b/springboot-echarts/src/main/java/com/enzhico/echarts/Application.java new file mode 100644 index 0000000..cd7741b --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/echarts/Application.java @@ -0,0 +1,11 @@ +package com.enzhico.echarts; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application { + public static void main(String[] args) { + SpringApplication.run(Application.class, args); + } +} diff --git a/springboot-echarts/src/main/java/com/enzhico/echarts/api/PublicController.java b/springboot-echarts/src/main/java/com/enzhico/echarts/api/PublicController.java new file mode 100644 index 0000000..cac1df3 --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/echarts/api/PublicController.java @@ -0,0 +1,146 @@ +package com.enzhico.echarts.api; + +import com.corundumstudio.socketio.AckRequest; +import com.corundumstudio.socketio.SocketIOClient; +import com.corundumstudio.socketio.annotation.OnEvent; +import com.enzhico.echarts.api.model.BaseResponse; +import com.enzhico.echarts.api.model.EchartsData; +import com.enzhico.echarts.api.model.PicRequest; +import com.enzhico.echarts.service.ApiService; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.apache.commons.io.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.nio.charset.Charset; + +/** + * 对外API接口类 + */ +@RestController +@RequestMapping(value = "/api/v1") +public class PublicController { + + @Resource + private ApiService apiService; + + private static final Logger _logger = LoggerFactory.getLogger(PublicController.class); + + /** + * 数据上传接口,body直接接受字符串,不要转 + * @return 结果 + * + { + "title": { + "text": "天气预报" + }, + "tooltip": { + "trigger": "axis", + "axisPointer": { + "type": "shadow" + } + }, + "legend": { + "data": ["City Alpha", "City Beta", "City Gamma"] + }, + "grid": { + "left": 100 + }, + "toolbox": { + "show": false, + "feature": { + "saveAsImage": {} + } + }, + "xAxis": { + "type": "value", + "name": "Days" + }, + "yAxis": { + "type": "category", + "inverse": false, + "data": ["Sunny", "Cloudy", "Showers"], + "axisLabel": { + "margin": 20 + } + }, + "series": [ + { + "name": "City Alpha", + "type": "bar", + "label": { + "normal": { + "show": true, + "textBorderWidth": 2 + } + }, + "data": [165, 170, 30] + }, + { + "name": "City Beta", + "type": "bar", + "label": { + "normal": { + "show": true, + "textBorderWidth": 2 + } + }, + "data": [150, 105, 110] + }, + { + "name": "City Gamma", + "type": "bar", + "label": { + "normal": { + "show": true, + "textBorderWidth": 2 + } + }, + "data": [220, 82, 63] + } + ] + } + */ + @RequestMapping(value = "/data", method = RequestMethod.POST) + public ResponseEntity doJoin(HttpServletRequest request) throws Exception { + _logger.info("数据上传消息push接口 start...."); + String jsonBody = IOUtils.toString(request.getInputStream(), Charset.forName("UTF-8")); + EchartsData echartsData = new EchartsData("", jsonBody); + String jsonString = new ObjectMapper().writeValueAsString(echartsData); + apiService.pushMsg("notify", jsonString); + BaseResponse result = new BaseResponse<>(true, "数据上传消息push成功", null); + return new ResponseEntity<>(result, HttpStatus.OK); + } + +// @RequestMapping(value = "/ask", method = RequestMethod.POST) +// public ResponseEntity doAsk() { +// ResponseEntity result; +// String jsonString = apiService.popJson(); +// if (jsonString == null) { +// result = new ResponseEntity<>(new BaseResponse<>(false, "轮询没有查到数据", null), HttpStatus.OK); +// } else { +// _logger.info("轮询后查询到数据"); +// result = new ResponseEntity<>(new BaseResponse<>(true, "轮询后查询到数据", jsonString), HttpStatus.OK); +// } +// return result; +// } +// +// /** +// * 保存客户端传来的图片数据 +// * +// * @param picInfo 图片BASE64 +// */ +// @RequestMapping(value = "/savePic", method = RequestMethod.POST) +// public ResponseEntity onSavePic(@RequestParam("picInfo") String picInfo) { +// _logger.info("保存客户端传来的图片数据 start"); +// String r = apiService.saveBase64Pic(picInfo); +// _logger.info("保存客户端传来的图片 = {}", r); +// return new ResponseEntity<>(new BaseResponse<>(true, "图片保存成功", null), HttpStatus.OK); +// } +} diff --git a/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/BaseResponse.java b/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/BaseResponse.java new file mode 100644 index 0000000..6400b8e --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/BaseResponse.java @@ -0,0 +1,60 @@ +package com.enzhico.echarts.api.model; + +/** + * API接口的基础返回类 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/7 + */ +public class BaseResponse { + /** + * 是否成功 + */ + private boolean success; + + /** + * 说明 + */ + private String msg; + + /** + * 返回数据 + */ + private T data; + + public BaseResponse() { + + } + + public BaseResponse(boolean success, String msg, T data) { + this.success = success; + this.msg = msg; + this.data = data; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + + public String getMsg() { + return msg; + } + + public void setMsg(String msg) { + this.msg = msg; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } + +} diff --git a/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/EchartsData.java b/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/EchartsData.java new file mode 100644 index 0000000..f23a97c --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/EchartsData.java @@ -0,0 +1,43 @@ +package com.enzhico.echarts.api.model; + +/** + * EchartsData + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/8 + */ +public class EchartsData { + /** + * 图表类型 + */ + private String msgType; + /** + * 图表数据 + */ + private String option; + + public EchartsData() { + } + + public EchartsData(String msgType, String option) { + this.msgType = msgType; + this.option = option; + } + + public String getMsgType() { + return msgType; + } + + public void setMsgType(String msgType) { + this.msgType = msgType; + } + + public String getOption() { + return option; + } + + public void setOption(String option) { + this.option = option; + } +} diff --git a/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/PicRequest.java b/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/PicRequest.java new file mode 100644 index 0000000..69ddc87 --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/PicRequest.java @@ -0,0 +1,23 @@ +package com.enzhico.echarts.api.model; + +/** + * PicRequest + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/8 + */ +public class PicRequest { + /** + * Base64格式的图片 + */ + private String picInfo; + + public String getPicInfo() { + return picInfo; + } + + public void setPicInfo(String picInfo) { + this.picInfo = picInfo; + } +} diff --git a/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/AxisPointer.java b/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/AxisPointer.java new file mode 100644 index 0000000..4b05f15 --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/AxisPointer.java @@ -0,0 +1,27 @@ +package com.enzhico.echarts.api.model.jmh; + +/** + * AxisPointer + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/9 + */ +public class AxisPointer { + public AxisPointer() { + } + + public AxisPointer(String type) { + this.type = type; + } + + private String type; + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } +} diff --git a/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/Feature.java b/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/Feature.java new file mode 100644 index 0000000..152a082 --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/Feature.java @@ -0,0 +1,27 @@ +package com.enzhico.echarts.api.model.jmh; + +/** + * Feature + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/9 + */ +public class Feature { + private SaveAsImage saveAsImage; + + public Feature() { + } + + public Feature(SaveAsImage saveAsImage) { + this.saveAsImage = saveAsImage; + } + + public SaveAsImage getSaveAsImage() { + return saveAsImage; + } + + public void setSaveAsImage(SaveAsImage saveAsImage) { + this.saveAsImage = saveAsImage; + } +} diff --git a/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/Grid.java b/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/Grid.java new file mode 100644 index 0000000..adbbf81 --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/Grid.java @@ -0,0 +1,29 @@ +package com.enzhico.echarts.api.model.jmh; + +/** + * Grid + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/9 + */ +public class Grid { + + private Integer left; + + public Grid(Integer left) { + this.left = left; + } + + public Grid() { + } + + public Integer getLeft() { + return left; + } + + public void setLeft(Integer left) { + this.left = left; + } + +} diff --git a/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/Label.java b/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/Label.java new file mode 100644 index 0000000..166f3a2 --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/Label.java @@ -0,0 +1,27 @@ +package com.enzhico.echarts.api.model.jmh; + +/** + * Label + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/9 + */ +public class Label { + private Normal normal; + + public Label() { + } + + public Label(Normal normal) { + this.normal = normal; + } + + public Normal getNormal() { + return normal; + } + + public void setNormal(Normal normal) { + this.normal = normal; + } +} diff --git a/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/Legend.java b/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/Legend.java new file mode 100644 index 0000000..54766c8 --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/Legend.java @@ -0,0 +1,29 @@ +package com.enzhico.echarts.api.model.jmh; + +import java.util.List; + +/** + * Legend + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/9 + */ +public class Legend { + private List data; + + public Legend() { + } + + public Legend(List data) { + this.data = data; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } +} diff --git a/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/Normal.java b/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/Normal.java new file mode 100644 index 0000000..fb7d99d --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/Normal.java @@ -0,0 +1,37 @@ +package com.enzhico.echarts.api.model.jmh; + +/** + * Normal + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/9 + */ +public class Normal { + private boolean show; + private Integer textBorderWidth; + + public Normal() { + } + + public Normal(boolean show, Integer textBorderWidth) { + this.show = show; + this.textBorderWidth = textBorderWidth; + } + + public boolean isShow() { + return show; + } + + public void setShow(boolean show) { + this.show = show; + } + + public Integer getTextBorderWidth() { + return textBorderWidth; + } + + public void setTextBorderWidth(Integer textBorderWidth) { + this.textBorderWidth = textBorderWidth; + } +} diff --git a/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/Option.java b/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/Option.java new file mode 100644 index 0000000..267937c --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/Option.java @@ -0,0 +1,85 @@ +package com.enzhico.echarts.api.model.jmh; + +import java.util.List; + +/** + * 汇总Option + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/9 + */ +public class Option { + private Title title; + private Tooltip tooltip; + private Legend legend; + private Grid grid; + private Toolbox toolbox; + private XAxis xAxis; + private YAxis yAxis; + private List series; + + public Title getTitle() { + return title; + } + + public void setTitle(Title title) { + this.title = title; + } + + public Tooltip getTooltip() { + return tooltip; + } + + public void setTooltip(Tooltip tooltip) { + this.tooltip = tooltip; + } + + public Legend getLegend() { + return legend; + } + + public void setLegend(Legend legend) { + this.legend = legend; + } + + public Grid getGrid() { + return grid; + } + + public void setGrid(Grid grid) { + this.grid = grid; + } + + public Toolbox getToolbox() { + return toolbox; + } + + public void setToolbox(Toolbox toolbox) { + this.toolbox = toolbox; + } + + public XAxis getxAxis() { + return xAxis; + } + + public void setxAxis(XAxis xAxis) { + this.xAxis = xAxis; + } + + public YAxis getyAxis() { + return yAxis; + } + + public void setyAxis(YAxis yAxis) { + this.yAxis = yAxis; + } + + public List getSeries() { + return series; + } + + public void setSeries(List series) { + this.series = series; + } +} diff --git a/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/SaveAsImage.java b/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/SaveAsImage.java new file mode 100644 index 0000000..c5a924a --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/SaveAsImage.java @@ -0,0 +1,27 @@ +package com.enzhico.echarts.api.model.jmh; + +/** + * SaveAsImage + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/10 + */ +public class SaveAsImage { + private String type; + + public SaveAsImage() { + } + + public SaveAsImage(String type) { + this.type = type; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } +} diff --git a/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/Serie.java b/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/Serie.java new file mode 100644 index 0000000..ca48d3d --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/Serie.java @@ -0,0 +1,49 @@ +package com.enzhico.echarts.api.model.jmh; + +import java.util.List; + +/** + * Serie + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/9 + */ +public class Serie { + private String name; + private String type; + private List data; + private Label label; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public Label getLabel() { + return label; + } + + public void setLabel(Label label) { + this.label = label; + } +} diff --git a/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/Title.java b/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/Title.java new file mode 100644 index 0000000..9b1226b --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/Title.java @@ -0,0 +1,20 @@ +package com.enzhico.echarts.api.model.jmh; + +/** + * Title + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/9 + */ +public class Title { + private String text; + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } +} diff --git a/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/Toolbox.java b/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/Toolbox.java new file mode 100644 index 0000000..ffdcf54 --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/Toolbox.java @@ -0,0 +1,37 @@ +package com.enzhico.echarts.api.model.jmh; + +/** + * Toolbox + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/9 + */ +public class Toolbox { + private boolean show; + private Feature feature; + + public Toolbox() { + } + + public Toolbox(boolean show, Feature feature) { + this.show = show; + this.feature = feature; + } + + public boolean isShow() { + return show; + } + + public void setShow(boolean show) { + this.show = show; + } + + public Feature getFeature() { + return feature; + } + + public void setFeature(Feature feature) { + this.feature = feature; + } +} diff --git a/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/Tooltip.java b/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/Tooltip.java new file mode 100644 index 0000000..78af234 --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/Tooltip.java @@ -0,0 +1,37 @@ +package com.enzhico.echarts.api.model.jmh; + +/** + * Tooltip + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/9 + */ +public class Tooltip { + private String trigger; + private AxisPointer axisPointer; + + public Tooltip() { + } + + public Tooltip(String trigger, AxisPointer axisPointer) { + this.trigger = trigger; + this.axisPointer = axisPointer; + } + + public String getTrigger() { + return trigger; + } + + public void setTrigger(String trigger) { + this.trigger = trigger; + } + + public AxisPointer getAxisPointer() { + return axisPointer; + } + + public void setAxisPointer(AxisPointer axisPointer) { + this.axisPointer = axisPointer; + } +} diff --git a/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/XAxis.java b/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/XAxis.java new file mode 100644 index 0000000..1173252 --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/XAxis.java @@ -0,0 +1,38 @@ +package com.enzhico.echarts.api.model.jmh; + +/** + * XAxis + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/9 + */ +public class XAxis { + private String type; + private String name; + + public XAxis() { + } + + public XAxis(String type, String name) { + this.type = type; + this.name = name; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + +} diff --git a/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/YAxis.java b/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/YAxis.java new file mode 100644 index 0000000..81a4195 --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/YAxis.java @@ -0,0 +1,59 @@ +package com.enzhico.echarts.api.model.jmh; + +import java.util.List; + +/** + * YAxis + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/9 + */ +public class YAxis { + private String type; + private boolean inverse; + private List data; + private YAxisLabel axisLabel; + + public YAxis() { + } + + public YAxis(String type, boolean inverse, List data, YAxisLabel axisLabel) { + this.type = type; + this.inverse = inverse; + this.data = data; + this.axisLabel = axisLabel; + } + + public String getType() { + return type; + } + + public void setType(String type) { + this.type = type; + } + + public boolean isInverse() { + return inverse; + } + + public void setInverse(boolean inverse) { + this.inverse = inverse; + } + + public List getData() { + return data; + } + + public void setData(List data) { + this.data = data; + } + + public YAxisLabel getAxisLabel() { + return axisLabel; + } + + public void setAxisLabel(YAxisLabel axisLabel) { + this.axisLabel = axisLabel; + } +} diff --git a/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/YAxisLabel.java b/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/YAxisLabel.java new file mode 100644 index 0000000..20bd4dd --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/echarts/api/model/jmh/YAxisLabel.java @@ -0,0 +1,27 @@ +package com.enzhico.echarts.api.model.jmh; + +/** + * YAxisLabel + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/9 + */ +public class YAxisLabel { + private Integer margin; + + public YAxisLabel() { + } + + public YAxisLabel(Integer margin) { + this.margin = margin; + } + + public Integer getMargin() { + return margin; + } + + public void setMargin(Integer margin) { + this.margin = margin; + } +} diff --git a/springboot-echarts/src/main/java/com/enzhico/echarts/common/ServerRunner.java b/springboot-echarts/src/main/java/com/enzhico/echarts/common/ServerRunner.java new file mode 100644 index 0000000..ea0cddb --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/echarts/common/ServerRunner.java @@ -0,0 +1,58 @@ +package com.enzhico.echarts.common; + +import com.corundumstudio.socketio.SocketIOServer; +import com.enzhico.echarts.config.properties.MyProperties; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.CommandLineRunner; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.io.IOException; + +/** + * SpringBoot启动之后执行 + * + * @author XiongNeng + * @version 1.0 + * @since 2017/7/31 + */ +@Component +@Order(1) +public class ServerRunner implements CommandLineRunner { + private final Logger logger = LoggerFactory.getLogger(this.getClass()); + private final SocketIOServer server; + // 下载地址,版本2.1.1:https://bitbucket.org/ariya/phantomjs/downloads/ + private static final String PHANTOM_PATH = "phantomjs"; + @Resource + private MyProperties p; + + @Autowired + public ServerRunner(SocketIOServer server) { + this.server = server; + } + + @Override + public void run(String... args) { + logger.info("ServerRunner 开始启动啦..."); + server.start(); + logger.info("SocketServer 启动成功!"); + logger.info("点击打开首页: http://localhost:9075"); + // 启动socker服务器后,通过phantomjs启动浏览器网页客户端 +// openHtml(p.getLoadJs()); +// logger.info("Phantomjs 启动成功!"); + } + +// private void openHtml(String loadJs) { +// String cmdStr = PHANTOM_PATH + " " + loadJs + " " + "http://localhost:9075"; +// logger.info("cmdStr=" + cmdStr); +// Runtime rt = Runtime.getRuntime(); +// try { +// rt.exec(cmdStr); +// } catch (IOException e) { +// logger.error("执行phantomjs的指令失败!PhantomJs详情参考这里:http://phantomjs.org", e); +// } +// } +} diff --git a/springboot-echarts/src/main/java/com/enzhico/echarts/common/constants/MsgType.java b/springboot-echarts/src/main/java/com/enzhico/echarts/common/constants/MsgType.java new file mode 100644 index 0000000..48614d9 --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/echarts/common/constants/MsgType.java @@ -0,0 +1,13 @@ +package com.enzhico.echarts.common.constants; + +/** + * 消息类型 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/8 + */ +public class MsgType { + public static final String TYPE1 = "type1"; + public static final String TYPE2 = "type2"; +} diff --git a/springboot-echarts/src/main/java/com/enzhico/echarts/common/util/CommonUtil.java b/springboot-echarts/src/main/java/com/enzhico/echarts/common/util/CommonUtil.java new file mode 100644 index 0000000..bf273bf --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/echarts/common/util/CommonUtil.java @@ -0,0 +1,41 @@ +package com.enzhico.echarts.common.util; + +/** + * 常用工具类,字符串、数字相关 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/15 + */ +public class CommonUtil { + /** + * 检查某版本是否比现在版本更大些 + * + * @param version 某版本 + * @param nowVersion 现在使用的版本 + * @return 是否版本数更大 + */ + public static boolean isNewer(String version, String nowVersion) { + try { + String[] versions = version.split("\\."); + String[] nowVersions = nowVersion.split("\\."); + + if (versions.length != nowVersions.length) { + return false; + } + int sum = 0; + for (String v : versions) { + sum += sum * 10 + Integer.valueOf(v); + } + + int nowSum = 0; + for (String nv : nowVersions) { + nowSum += nowSum * 10 + Integer.valueOf(nv); + } + + return sum > nowSum; + } catch (NumberFormatException e) { + return false; + } + } +} diff --git a/springboot-echarts/src/main/java/com/enzhico/echarts/common/util/ExportPngUtil.java b/springboot-echarts/src/main/java/com/enzhico/echarts/common/util/ExportPngUtil.java new file mode 100644 index 0000000..48d7546 --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/echarts/common/util/ExportPngUtil.java @@ -0,0 +1,85 @@ +package com.enzhico.echarts.common.util; + +import com.enzhico.echarts.api.model.jmh.*; +import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.ObjectMapper; +import okhttp3.*; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +/** + * ExportPngUtil + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/24 + */ +public class ExportPngUtil { + + public static void postOption(String optionStr, String url) throws Exception { + final MediaType TEXT = MediaType.parse("application/text; charset=utf-8"); + OkHttpClient client = new OkHttpClient(); + RequestBody body = RequestBody.create(TEXT, optionStr); + Request request = new Request.Builder() + .url(url) + .post(body) + .build(); + Response response = client.newCall(request).execute(); + if (response.isSuccessful()) { + System.out.println(response.body().string()); + } else { + throw new IOException("Unexpected code " + response); + } + } + + public static String generateOption(String titleStr, List objects, List dimensions, + List> allData, String xunit) { + Option option = new Option(); + // "title" + Title title = new Title(); + title.setText(titleStr); + // "tooltip" + Tooltip tooltip = new Tooltip("axis", new AxisPointer("shadow")); + // "legend" + Legend legend = new Legend(objects); + // "grid" + Grid grid = new Grid(100); + // "toolbox" + Toolbox toolbox = new Toolbox(false, new Feature(new SaveAsImage("png"))); + // "xAxis" + XAxis xAxis = new XAxis("value", xunit); + // "yAxis" + YAxis yAxis = new YAxis("category", false, dimensions, new YAxisLabel(20)); + // "series" + List series = new ArrayList<>(); + for (int i = 0; i < allData.size(); i++) { + Serie serie = new Serie(); + serie.setName(objects.get(i)); + serie.setType("bar"); + serie.setLabel(new Label(new Normal(true, 2))); + serie.setData(allData.get(i)); + series.add(serie); + } + + // 开始设置option + option.setTitle(title); + option.setTooltip(tooltip); + option.setLegend(legend); + option.setGrid(grid); + option.setToolbox(toolbox); + option.setxAxis(xAxis); + option.setyAxis(yAxis); + option.setSeries(series); + + String jsonString = null; + try { + jsonString = new ObjectMapper().writeValueAsString(option); + } catch (JsonProcessingException e) { + e.printStackTrace(); + } + return jsonString; + } + +} diff --git a/springboot-echarts/src/main/java/com/enzhico/echarts/config/NettySocketConfig.java b/springboot-echarts/src/main/java/com/enzhico/echarts/config/NettySocketConfig.java new file mode 100644 index 0000000..77b1c5a --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/echarts/config/NettySocketConfig.java @@ -0,0 +1,55 @@ +package com.enzhico.echarts.config; + +import com.corundumstudio.socketio.SocketIOServer; +import com.corundumstudio.socketio.annotation.SpringAnnotationScanner; +import com.enzhico.echarts.config.properties.MyProperties; +import com.enzhico.echarts.service.ApiService; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.annotation.Resource; + +/** + * NettySocketConfig + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/19 + */ +@Configuration +public class NettySocketConfig { + + @Resource + private MyProperties myProperties; + + @Resource + private ApiService apiService; + + private static final Logger logger = LoggerFactory.getLogger(NettySocketConfig.class); + + @Bean + public SocketIOServer socketIOServer() { + /* + * 创建Socket,并设置监听端口 + */ + com.corundumstudio.socketio.Configuration config = new com.corundumstudio.socketio.Configuration(); + // 设置主机名,默认是0.0.0.0 + // config.setHostname("localhost"); + // 设置监听端口 + config.setPort(myProperties.getSocketPort()); + // 协议升级超时时间(毫秒),默认10000。HTTP握手升级为ws协议超时时间 + config.setUpgradeTimeout(10000); + // Ping消息间隔(毫秒),默认25000。客户端向服务器发送一条心跳消息间隔 + config.setPingInterval(myProperties.getPingInterval()); + // Ping消息超时时间(毫秒),默认60000,这个时间间隔内没有接收到心跳消息就会发送超时事件 + config.setPingTimeout(myProperties.getPingTimeout()); + return new SocketIOServer(config); + } + + @Bean + public SpringAnnotationScanner springAnnotationScanner(SocketIOServer socketServer) { + return new SpringAnnotationScanner(socketServer); + } +} diff --git a/springboot-echarts/src/main/java/com/enzhico/echarts/config/properties/MyProperties.java b/springboot-echarts/src/main/java/com/enzhico/echarts/config/properties/MyProperties.java new file mode 100644 index 0000000..b30c0ab --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/echarts/config/properties/MyProperties.java @@ -0,0 +1,88 @@ +package com.enzhico.echarts.config.properties; + +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + + +/** + * 本项目自定义配置 + * + * @author xiongneng + * @since 2018/01/06 21:09 + */ +@Component +@ConfigurationProperties(prefix = "enzhico") +public class MyProperties { + /** + * socket端口 + */ + private Integer socketPort; + /** + * Ping消息间隔(毫秒) + */ + private Integer pingInterval; + /** + * Ping消息超时时间(毫秒) + */ + private Integer pingTimeout; + /** + * 图片保存路径 + */ + private String imageDir; + /** + * Phantomjs加载文件 + */ + private String loadJs; + /** + * 打开的HTMl文件 + */ + private String indexHtml; + + public Integer getSocketPort() { + return socketPort; + } + + public void setSocketPort(Integer socketPort) { + this.socketPort = socketPort; + } + + public Integer getPingInterval() { + return pingInterval; + } + + public void setPingInterval(Integer pingInterval) { + this.pingInterval = pingInterval; + } + + public Integer getPingTimeout() { + return pingTimeout; + } + + public void setPingTimeout(Integer pingTimeout) { + this.pingTimeout = pingTimeout; + } + + public String getImageDir() { + return imageDir; + } + + public void setImageDir(String imageDir) { + this.imageDir = imageDir; + } + + public String getLoadJs() { + return loadJs; + } + + public void setLoadJs(String loadJs) { + this.loadJs = loadJs; + } + + public String getIndexHtml() { + return indexHtml; + } + + public void setIndexHtml(String indexHtml) { + this.indexHtml = indexHtml; + } +} diff --git a/springboot-echarts/src/main/java/com/enzhico/echarts/controller/IndexController.java b/springboot-echarts/src/main/java/com/enzhico/echarts/controller/IndexController.java new file mode 100644 index 0000000..8ab7139 --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/echarts/controller/IndexController.java @@ -0,0 +1,22 @@ +package com.enzhico.echarts.controller; + +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; + +/** + * IndexController + * + * @author XiongNeng + * @version 1.0 + * @since 2018/2/24 + */ +@Controller +public class IndexController { + /** + * 首页 + */ + @RequestMapping(value = "/") + public String index() { + return "index"; + } +} diff --git a/springboot-echarts/src/main/java/com/enzhico/echarts/handler/MessageEventHandler.java b/springboot-echarts/src/main/java/com/enzhico/echarts/handler/MessageEventHandler.java new file mode 100644 index 0000000..8afc95e --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/echarts/handler/MessageEventHandler.java @@ -0,0 +1,93 @@ +package com.enzhico.echarts.handler; + +import com.corundumstudio.socketio.AckRequest; +import com.corundumstudio.socketio.SocketIOClient; +import com.corundumstudio.socketio.SocketIOServer; +import com.corundumstudio.socketio.annotation.OnConnect; +import com.corundumstudio.socketio.annotation.OnDisconnect; +import com.corundumstudio.socketio.annotation.OnEvent; +import com.enzhico.echarts.common.constants.MsgType; +import com.enzhico.echarts.config.properties.MyProperties; +import com.enzhico.echarts.service.ApiService; +import io.socket.client.Socket; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.FastDateFormat; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Date; + +/** + * 消息事件处理器 + * + * @author XiongNeng + * @version 1.0 + * @since 2018/1/19 + */ +@Component +public class MessageEventHandler { + @Resource + private MyProperties p; + private final SocketIOServer server; + private final ApiService apiService; + + private static final Logger logger = LoggerFactory.getLogger(MessageEventHandler.class); + + @Autowired + public MessageEventHandler(SocketIOServer server, ApiService apiService) { + this.server = server; + this.apiService = apiService; + } + + /** + * 添加connect事件,当客户端发起连接时调用 + * + * @param client 客户端 + */ + @OnConnect + public void onConnect(SocketIOClient client) { + if (client != null) { + final String sessionId = client.getSessionId().toString(); + logger.info("连接成功, sessionId=" + sessionId); + // 赶紧保存这个sessionID呀 + apiService.updateSessionId(sessionId); + } else { + logger.error("客户端为空"); + } + } + + /** + * 添加@OnDisconnect事件,客户端断开连接时调用,刷新客户端信息 + * + * @param client 客户端 + */ + @OnDisconnect + public void onDisconnect(SocketIOClient client) { + logger.info("客户端断开连接, sessionId=" + client.getSessionId().toString()); + client.disconnect(); + } + + /** + * 保存客户端传来的图片数据 + * + * @param client 客户端 + * @param ackRequest 回执消息 + * @param imgData Base64的图形数据 + */ + @OnEvent(value = "savePic") + public void onSavePic(SocketIOClient client, AckRequest ackRequest, String imgData) { + logger.info("保存客户端传来的图片数据 start, sessionId=" + client.getSessionId().toString()); + String r = apiService.saveBase64Pic(imgData); + logger.info("保存客户端传来的图片 = {}", r); + ackRequest.sendAckData("图片保存结果=" + r); + } + +} diff --git a/springboot-echarts/src/main/java/com/enzhico/echarts/service/ApiService.java b/springboot-echarts/src/main/java/com/enzhico/echarts/service/ApiService.java new file mode 100644 index 0000000..0cebe82 --- /dev/null +++ b/springboot-echarts/src/main/java/com/enzhico/echarts/service/ApiService.java @@ -0,0 +1,105 @@ +package com.enzhico.echarts.service; + +import com.corundumstudio.socketio.SocketIOClient; +import com.corundumstudio.socketio.SocketIOServer; +import com.enzhico.echarts.config.properties.MyProperties; +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.time.FastDateFormat; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.util.Date; +import java.util.UUID; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.concurrent.TimeUnit; + +/** + * 专门用来服务对外接口用Service + */ + +@Service +public class ApiService { + + private static final Logger logger = LoggerFactory.getLogger(ApiService.class); + /** + * 保存最后一个连接上来的sessionID + */ + private String sessionId; + + @Resource + private MyProperties p; + +// private LinkedBlockingQueue queue = new LinkedBlockingQueue<>(); + + @Resource + private SocketIOServer server; + + public synchronized void updateSessionId(String sid) { + sessionId = sid; + } + + /** + * 服务器主动推送消息 + * + * @param msgType 消息类型 + * @param jsonData echarts图表数据 + */ + public void pushMsg(String msgType, String jsonData) { + SocketIOClient targetClient = this.server.getClient(UUID.fromString(sessionId)); + if (targetClient == null) { + logger.error("sessionId=" + sessionId + "在server中获取不到client"); + } else { + targetClient.sendEvent(msgType, jsonData); + } +// queue.offer(jsonData); + } + +// public String popJson() { +// try { +// return queue.poll(100L, TimeUnit.MILLISECONDS); +// } catch (InterruptedException e) { +// e.printStackTrace(); +// return null; +// } +// } + + + /** + * 解析Base64位信息并输出到某个目录下面. + * + * @param base64Info base64串 + * @return 文件地址 + */ + public String saveBase64Pic(String base64Info) { + if (StringUtils.isEmpty(base64Info)) { + return ""; + } + // 数据中:data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABI4AAAEsCAYAAAClh/jbAAA ... 在"base64,"之后的才是图片信息 + String[] arr = base64Info.split("base64,"); + + // 将图片输出到系统某目录. + OutputStream out = null; + String now = FastDateFormat.getInstance("yyyyMMddHHmmss").format(new Date()); + String destFile = p.getImageDir() + now + ".png"; + try { + // 使用了Apache commons codec的包来解析Base64 + byte[] buffer = Base64.decodeBase64(arr[1]); + out = new FileOutputStream(destFile); + out.write(buffer); + } catch (IOException e) { + logger.error("解析Base64图片信息并保存到某目录下出错!", e); + return ""; + } finally { + IOUtils.closeQuietly(out); + } + return destFile; + } + +} diff --git a/springboot-echarts/src/main/resources/application.yml b/springboot-echarts/src/main/resources/application.yml new file mode 100644 index 0000000..90c34de --- /dev/null +++ b/springboot-echarts/src/main/resources/application.yml @@ -0,0 +1,70 @@ +########################################################## +################## 所有profile共有的配置 ################# +########################################################## + +################### 自定义项目配置 ################### +enzhico: + socket-port: 9076 #socket端口 + ping-interval: 60000 #Ping消息间隔(毫秒) + ping-timeout: 180000 #Ping消息超时时间(毫秒) + +################### 项目启动端口 ################### +server: + port: 9075 + jetty: + max-http-post-size: 20000000 + +################### spring配置 ################### +spring: + profiles: + active: dev + http: + multipart: + max-request-size: 100MB #最大请求大小 + max-file-size: 100MB #最大文件大小 + +logging: + level: + org.springframework.web.servlet: ERROR + +--- + +##################################################################### +######################## 开发环境profile ########################## +##################################################################### +spring: + profiles: dev + +enzhico: + image-dir: E:/pics/ + load-js: E:/pics/html/js/echarts-load.js + index-html: file:///E:/pics/html/index.html + +logging: + level: + ROOT: INFO + com: + enzhico: DEBUG + file: E:/logs/sb-ehcharts.log + +--- + +##################################################################### +######################## 测试环境profile ########################## +##################################################################### + +spring: + profiles: test + +enzhico: + image-dir: /var/pics/echarts/ + load-js: /usr/share/nginx/html/echarts/js/echarts-load.js + index-html: file:///usr/share/nginx/html/echarts/index.html + +logging: + level: + ROOT: INFO + com: + enzhico: DEBUG + file: /var/logs/sb-ehcharts.log + diff --git a/springboot-echarts/src/main/resources/public/favicon.ico b/springboot-echarts/src/main/resources/public/favicon.ico new file mode 100644 index 0000000..fe6cf7a Binary files /dev/null and b/springboot-echarts/src/main/resources/public/favicon.ico differ diff --git a/springboot-echarts/src/main/resources/public/static/css/bootstrap.css b/springboot-echarts/src/main/resources/public/static/css/bootstrap.css new file mode 100644 index 0000000..9695e32 --- /dev/null +++ b/springboot-echarts/src/main/resources/public/static/css/bootstrap.css @@ -0,0 +1,4983 @@ +/*! + * Bootstrap v2.0.4 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ + +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section { + display: block; +} + +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} + +audio:not([controls]) { + display: none; +} + +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} + +a:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +a:hover, +a:active { + outline: 0; +} + +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} + +sup { + top: -0.5em; +} + +sub { + bottom: -0.25em; +} + +img { + max-width: 100%; + vertical-align: middle; + border: 0; + -ms-interpolation-mode: bicubic; +} + +#map_canvas img { + max-width: none; +} + +button, +input, +select, +textarea { + margin: 0; + font-size: 100%; + vertical-align: middle; +} + +button, +input { + *overflow: visible; + line-height: normal; +} + +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} + +button, +input[type="button"], +input[type="reset"], +input[type="submit"] { + cursor: pointer; + -webkit-appearance: button; +} + +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} + +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} + +textarea { + overflow: auto; + vertical-align: top; +} + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 28px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; +} + +body { + margin: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + line-height: 18px; + color: #333333; + background-color: #ffffff; +} + +a { + color: #0088cc; + text-decoration: none; +} + +a:hover { + color: #005580; + text-decoration: underline; +} + +.row { + margin-left: -20px; + *zoom: 1; +} + +.row:before, +.row:after { + display: table; + content: ""; +} + +.row:after { + clear: both; +} + +[class*="span"] { + float: left; + margin-left: 20px; +} + +.container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.span12 { + width: 940px; +} + +.span11 { + width: 860px; +} + +.span10 { + width: 780px; +} + +.span9 { + width: 700px; +} + +.span8 { + width: 620px; +} + +.span7 { + width: 540px; +} + +.span6 { + width: 460px; +} + +.span5 { + width: 380px; +} + +.span4 { + width: 300px; +} + +.span3 { + width: 220px; +} + +.span2 { + width: 140px; +} + +.span1 { + width: 60px; +} + +.offset12 { + margin-left: 980px; +} + +.offset11 { + margin-left: 900px; +} + +.offset10 { + margin-left: 820px; +} + +.offset9 { + margin-left: 740px; +} + +.offset8 { + margin-left: 660px; +} + +.offset7 { + margin-left: 580px; +} + +.offset6 { + margin-left: 500px; +} + +.offset5 { + margin-left: 420px; +} + +.offset4 { + margin-left: 340px; +} + +.offset3 { + margin-left: 260px; +} + +.offset2 { + margin-left: 180px; +} + +.offset1 { + margin-left: 100px; +} + +.row-fluid { + width: 100%; + *zoom: 1; +} + +.row-fluid:before, +.row-fluid:after { + display: table; + content: ""; +} + +.row-fluid:after { + clear: both; +} + +.row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 28px; + margin-left: 2.127659574%; + *margin-left: 2.0744680846382977%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; +} + +.row-fluid [class*="span"]:first-child { + margin-left: 0; +} + +.row-fluid .span12 { + width: 99.99999998999999%; + *width: 99.94680850063828%; +} + +.row-fluid .span11 { + width: 91.489361693%; + *width: 91.4361702036383%; +} + +.row-fluid .span10 { + width: 82.97872339599999%; + *width: 82.92553190663828%; +} + +.row-fluid .span9 { + width: 74.468085099%; + *width: 74.4148936096383%; +} + +.row-fluid .span8 { + width: 65.95744680199999%; + *width: 65.90425531263828%; +} + +.row-fluid .span7 { + width: 57.446808505%; + *width: 57.3936170156383%; +} + +.row-fluid .span6 { + width: 48.93617020799999%; + *width: 48.88297871863829%; +} + +.row-fluid .span5 { + width: 40.425531911%; + *width: 40.3723404216383%; +} + +.row-fluid .span4 { + width: 31.914893614%; + *width: 31.8617021246383%; +} + +.row-fluid .span3 { + width: 23.404255317%; + *width: 23.3510638276383%; +} + +.row-fluid .span2 { + width: 14.89361702%; + *width: 14.8404255306383%; +} + +.row-fluid .span1 { + width: 6.382978723%; + *width: 6.329787233638298%; +} + +.container { + margin-right: auto; + margin-left: auto; + *zoom: 1; +} + +.container:before, +.container:after { + display: table; + content: ""; +} + +.container:after { + clear: both; +} + +.container-fluid { + padding-right: 20px; + padding-left: 20px; + *zoom: 1; +} + +.container-fluid:before, +.container-fluid:after { + display: table; + content: ""; +} + +.container-fluid:after { + clear: both; +} + +p { + margin: 0 0 9px; +} + +p small { + font-size: 11px; + color: #999999; +} + +.lead { + margin-bottom: 18px; + font-size: 20px; + font-weight: 200; + line-height: 27px; +} + +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 0; + font-family: inherit; + font-weight: bold; + color: inherit; + text-rendering: optimizelegibility; +} + +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small { + font-weight: normal; + color: #999999; +} + +h1 { + font-size: 30px; + line-height: 36px; +} + +h1 small { + font-size: 18px; +} + +h2 { + font-size: 24px; + line-height: 36px; +} + +h2 small { + font-size: 18px; +} + +h3 { + font-size: 18px; + line-height: 27px; +} + +h3 small { + font-size: 14px; +} + +h4, +h5, +h6 { + line-height: 18px; +} + +h4 { + font-size: 14px; +} + +h4 small { + font-size: 12px; +} + +h5 { + font-size: 12px; +} + +h6 { + font-size: 11px; + color: #999999; + text-transform: uppercase; +} + +.page-header { + padding-bottom: 17px; + margin: 18px 0; + border-bottom: 1px solid #eeeeee; +} + +.page-header h1 { + line-height: 1; +} + +ul, +ol { + padding: 0; + margin: 0 0 9px 25px; +} + +ul ul, +ul ol, +ol ol, +ol ul { + margin-bottom: 0; +} + +ul { + list-style: disc; +} + +ol { + list-style: decimal; +} + +li { + line-height: 18px; +} + +ul.unstyled, +ol.unstyled { + margin-left: 0; + list-style: none; +} + +dl { + margin-bottom: 18px; +} + +dt, +dd { + line-height: 18px; +} + +dt { + font-weight: bold; + line-height: 17px; +} + +dd { + margin-left: 9px; +} + +.dl-horizontal dt { + float: left; + width: 120px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; +} + +.dl-horizontal dd { + margin-left: 130px; +} + +hr { + margin: 18px 0; + border: 0; + border-top: 1px solid #eeeeee; + border-bottom: 1px solid #ffffff; +} + +strong { + font-weight: bold; +} + +em { + font-style: italic; +} + +.muted { + color: #999999; +} + +abbr[title] { + cursor: help; + border-bottom: 1px dotted #999999; +} + +abbr.initialism { + font-size: 90%; + text-transform: uppercase; +} + +blockquote { + padding: 0 0 0 15px; + margin: 0 0 18px; + border-left: 5px solid #eeeeee; +} + +blockquote p { + margin-bottom: 0; + font-size: 16px; + font-weight: 300; + line-height: 22.5px; +} + +blockquote small { + display: block; + line-height: 18px; + color: #999999; +} + +blockquote small:before { + content: '\2014 \00A0'; +} + +blockquote.pull-right { + float: right; + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; +} + +blockquote.pull-right p, +blockquote.pull-right small { + text-align: right; +} + +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} + +address { + display: block; + margin-bottom: 18px; + font-style: normal; + line-height: 18px; +} + +small { + font-size: 100%; +} + +cite { + font-style: normal; +} + +code, +pre { + padding: 0 3px 2px; + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + font-size: 12px; + color: #333333; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +code { + padding: 2px 4px; + color: #d14; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; +} + +pre { + display: block; + padding: 8.5px; + margin: 0 0 9px; + font-size: 12.025px; + line-height: 18px; + word-break: break-all; + word-wrap: break-word; + white-space: pre; + white-space: pre-wrap; + background-color: #f5f5f5; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +pre.prettyprint { + margin-bottom: 18px; +} + +pre code { + padding: 0; + color: inherit; + background-color: transparent; + border: 0; +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} + +form { + margin: 0 0 18px; +} + +fieldset { + padding: 0; + margin: 0; + border: 0; +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 27px; + font-size: 19.5px; + line-height: 36px; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} + +legend small { + font-size: 13.5px; + color: #999999; +} + +label, +input, +button, +select, +textarea { + font-size: 13px; + font-weight: normal; + line-height: 18px; +} + +input, +button, +select, +textarea { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +label { + display: block; + margin-bottom: 5px; +} + +select, +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + display: inline-block; + height: 18px; + padding: 4px; + margin-bottom: 9px; + font-size: 13px; + line-height: 18px; + color: #555555; +} + +input, +textarea { + width: 210px; +} + +textarea { + height: auto; +} + +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + background-color: #ffffff; + border: 1px solid #cccccc; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear 0.2s, box-shadow linear 0.2s; + -moz-transition: border linear 0.2s, box-shadow linear 0.2s; + -ms-transition: border linear 0.2s, box-shadow linear 0.2s; + -o-transition: border linear 0.2s, box-shadow linear 0.2s; + transition: border linear 0.2s, box-shadow linear 0.2s; +} + +textarea:focus, +input[type="text"]:focus, +input[type="password"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="date"]:focus, +input[type="month"]:focus, +input[type="time"]:focus, +input[type="week"]:focus, +input[type="number"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="search"]:focus, +input[type="tel"]:focus, +input[type="color"]:focus, +.uneditable-input:focus { + border-color: rgba(82, 168, 236, 0.8); + outline: 0; + outline: thin dotted \9; + /* IE6-9 */ + + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6); +} + +input[type="radio"], +input[type="checkbox"] { + margin: 3px 0; + *margin-top: 0; + /* IE7 */ + + line-height: normal; + cursor: pointer; +} + +input[type="submit"], +input[type="reset"], +input[type="button"], +input[type="radio"], +input[type="checkbox"] { + width: auto; +} + +.uneditable-textarea { + width: auto; + height: auto; +} + +select, +input[type="file"] { + height: 28px; + /* In IE7, the height of the select element cannot be changed by height, only font-size */ + + *margin-top: 4px; + /* For IE7, add top margin to align select with labels */ + + line-height: 28px; +} + +select { + width: 220px; + border: 1px solid #bbb; +} + +select[multiple], +select[size] { + height: auto; +} + +select:focus, +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.radio, +.checkbox { + min-height: 18px; + padding-left: 18px; +} + +.radio input[type="radio"], +.checkbox input[type="checkbox"] { + float: left; + margin-left: -18px; +} + +.controls > .radio:first-child, +.controls > .checkbox:first-child { + padding-top: 5px; +} + +.radio.inline, +.checkbox.inline { + display: inline-block; + padding-top: 5px; + margin-bottom: 0; + vertical-align: middle; +} + +.radio.inline + .radio.inline, +.checkbox.inline + .checkbox.inline { + margin-left: 10px; +} + +.input-mini { + width: 60px; +} + +.input-small { + width: 90px; +} + +.input-medium { + width: 150px; +} + +.input-large { + width: 210px; +} + +.input-xlarge { + width: 270px; +} + +.input-xxlarge { + width: 530px; +} + +input[class*="span"], +select[class*="span"], +textarea[class*="span"], +.uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"] { + float: none; + margin-left: 0; +} + +.input-append input[class*="span"], +.input-append .uneditable-input[class*="span"], +.input-prepend input[class*="span"], +.input-prepend .uneditable-input[class*="span"], +.row-fluid .input-prepend [class*="span"], +.row-fluid .input-append [class*="span"] { + display: inline-block; +} + +input, +textarea, +.uneditable-input { + margin-left: 0; +} + +input.span12, +textarea.span12, +.uneditable-input.span12 { + width: 930px; +} + +input.span11, +textarea.span11, +.uneditable-input.span11 { + width: 850px; +} + +input.span10, +textarea.span10, +.uneditable-input.span10 { + width: 770px; +} + +input.span9, +textarea.span9, +.uneditable-input.span9 { + width: 690px; +} + +input.span8, +textarea.span8, +.uneditable-input.span8 { + width: 610px; +} + +input.span7, +textarea.span7, +.uneditable-input.span7 { + width: 530px; +} + +input.span6, +textarea.span6, +.uneditable-input.span6 { + width: 450px; +} + +input.span5, +textarea.span5, +.uneditable-input.span5 { + width: 370px; +} + +input.span4, +textarea.span4, +.uneditable-input.span4 { + width: 290px; +} + +input.span3, +textarea.span3, +.uneditable-input.span3 { + width: 210px; +} + +input.span2, +textarea.span2, +.uneditable-input.span2 { + width: 130px; +} + +input.span1, +textarea.span1, +.uneditable-input.span1 { + width: 50px; +} + +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + cursor: not-allowed; + background-color: #eeeeee; + border-color: #ddd; +} + +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"][readonly], +input[type="checkbox"][readonly] { + background-color: transparent; +} + +.control-group.warning > label, +.control-group.warning .help-block, +.control-group.warning .help-inline { + color: #c09853; +} + +.control-group.warning .checkbox, +.control-group.warning .radio, +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + color: #c09853; + border-color: #c09853; +} + +.control-group.warning .checkbox:focus, +.control-group.warning .radio:focus, +.control-group.warning input:focus, +.control-group.warning select:focus, +.control-group.warning textarea:focus { + border-color: #a47e3c; + -webkit-box-shadow: 0 0 6px #dbc59e; + -moz-box-shadow: 0 0 6px #dbc59e; + box-shadow: 0 0 6px #dbc59e; +} + +.control-group.warning .input-prepend .add-on, +.control-group.warning .input-append .add-on { + color: #c09853; + background-color: #fcf8e3; + border-color: #c09853; +} + +.control-group.error > label, +.control-group.error .help-block, +.control-group.error .help-inline { + color: #b94a48; +} + +.control-group.error .checkbox, +.control-group.error .radio, +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + color: #b94a48; + border-color: #b94a48; +} + +.control-group.error .checkbox:focus, +.control-group.error .radio:focus, +.control-group.error input:focus, +.control-group.error select:focus, +.control-group.error textarea:focus { + border-color: #953b39; + -webkit-box-shadow: 0 0 6px #d59392; + -moz-box-shadow: 0 0 6px #d59392; + box-shadow: 0 0 6px #d59392; +} + +.control-group.error .input-prepend .add-on, +.control-group.error .input-append .add-on { + color: #b94a48; + background-color: #f2dede; + border-color: #b94a48; +} + +.control-group.success > label, +.control-group.success .help-block, +.control-group.success .help-inline { + color: #468847; +} + +.control-group.success .checkbox, +.control-group.success .radio, +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + color: #468847; + border-color: #468847; +} + +.control-group.success .checkbox:focus, +.control-group.success .radio:focus, +.control-group.success input:focus, +.control-group.success select:focus, +.control-group.success textarea:focus { + border-color: #356635; + -webkit-box-shadow: 0 0 6px #7aba7b; + -moz-box-shadow: 0 0 6px #7aba7b; + box-shadow: 0 0 6px #7aba7b; +} + +.control-group.success .input-prepend .add-on, +.control-group.success .input-append .add-on { + color: #468847; + background-color: #dff0d8; + border-color: #468847; +} + +input:focus:required:invalid, +textarea:focus:required:invalid, +select:focus:required:invalid { + color: #b94a48; + border-color: #ee5f5b; +} + +input:focus:required:invalid:focus, +textarea:focus:required:invalid:focus, +select:focus:required:invalid:focus { + border-color: #e9322d; + -webkit-box-shadow: 0 0 6px #f8b9b7; + -moz-box-shadow: 0 0 6px #f8b9b7; + box-shadow: 0 0 6px #f8b9b7; +} + +.form-actions { + padding: 17px 20px 18px; + margin-top: 18px; + margin-bottom: 18px; + background-color: #f5f5f5; + border-top: 1px solid #e5e5e5; + *zoom: 1; +} + +.form-actions:before, +.form-actions:after { + display: table; + content: ""; +} + +.form-actions:after { + clear: both; +} + +.uneditable-input { + overflow: hidden; + white-space: nowrap; + cursor: not-allowed; + background-color: #ffffff; + border-color: #eee; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); +} + +:-moz-placeholder { + color: #999999; +} + +:-ms-input-placeholder { + color: #999999; +} + +::-webkit-input-placeholder { + color: #999999; +} + +.help-block, +.help-inline { + color: #555555; +} + +.help-block { + display: block; + margin-bottom: 9px; +} + +.help-inline { + display: inline-block; + *display: inline; + padding-left: 5px; + vertical-align: middle; + *zoom: 1; +} + +.input-prepend, +.input-append { + margin-bottom: 5px; +} + +.input-prepend input, +.input-append input, +.input-prepend select, +.input-append select, +.input-prepend .uneditable-input, +.input-append .uneditable-input { + position: relative; + margin-bottom: 0; + *margin-left: 0; + vertical-align: middle; + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} + +.input-prepend input:focus, +.input-append input:focus, +.input-prepend select:focus, +.input-append select:focus, +.input-prepend .uneditable-input:focus, +.input-append .uneditable-input:focus { + z-index: 2; +} + +.input-prepend .uneditable-input, +.input-append .uneditable-input { + border-left-color: #ccc; +} + +.input-prepend .add-on, +.input-append .add-on { + display: inline-block; + width: auto; + height: 18px; + min-width: 16px; + padding: 4px 5px; + font-weight: normal; + line-height: 18px; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + vertical-align: middle; + background-color: #eeeeee; + border: 1px solid #ccc; +} + +.input-prepend .add-on, +.input-append .add-on, +.input-prepend .btn, +.input-append .btn { + margin-left: -1px; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-prepend .active, +.input-append .active { + background-color: #a9dba9; + border-color: #46a546; +} + +.input-prepend .add-on, +.input-prepend .btn { + margin-right: -1px; +} + +.input-prepend .add-on:first-child, +.input-prepend .btn:first-child { + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} + +.input-append input, +.input-append select, +.input-append .uneditable-input { + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} + +.input-append .uneditable-input { + border-right-color: #ccc; + border-left-color: #eee; +} + +.input-append .add-on:last-child, +.input-append .btn:last-child { + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} + +.input-prepend.input-append input, +.input-prepend.input-append select, +.input-prepend.input-append .uneditable-input { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.input-prepend.input-append .add-on:first-child, +.input-prepend.input-append .btn:first-child { + margin-right: -1px; + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} + +.input-prepend.input-append .add-on:last-child, +.input-prepend.input-append .btn:last-child { + margin-left: -1px; + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} + +.search-query { + padding-right: 14px; + padding-right: 4px \9; + padding-left: 14px; + padding-left: 4px \9; + /* IE7-8 doesn't have border-radius, so don't indent the padding */ + + margin-bottom: 0; + -webkit-border-radius: 14px; + -moz-border-radius: 14px; + border-radius: 14px; +} + +.form-search input, +.form-inline input, +.form-horizontal input, +.form-search textarea, +.form-inline textarea, +.form-horizontal textarea, +.form-search select, +.form-inline select, +.form-horizontal select, +.form-search .help-inline, +.form-inline .help-inline, +.form-horizontal .help-inline, +.form-search .uneditable-input, +.form-inline .uneditable-input, +.form-horizontal .uneditable-input, +.form-search .input-prepend, +.form-inline .input-prepend, +.form-horizontal .input-prepend, +.form-search .input-append, +.form-inline .input-append, +.form-horizontal .input-append { + display: inline-block; + *display: inline; + margin-bottom: 0; + *zoom: 1; +} + +.form-search .hide, +.form-inline .hide, +.form-horizontal .hide { + display: none; +} + +.form-search label, +.form-inline label { + display: inline-block; +} + +.form-search .input-append, +.form-inline .input-append, +.form-search .input-prepend, +.form-inline .input-prepend { + margin-bottom: 0; +} + +.form-search .radio, +.form-search .checkbox, +.form-inline .radio, +.form-inline .checkbox { + padding-left: 0; + margin-bottom: 0; + vertical-align: middle; +} + +.form-search .radio input[type="radio"], +.form-search .checkbox input[type="checkbox"], +.form-inline .radio input[type="radio"], +.form-inline .checkbox input[type="checkbox"] { + float: left; + margin-right: 3px; + margin-left: 0; +} + +.control-group { + margin-bottom: 9px; +} + +legend + .control-group { + margin-top: 18px; + -webkit-margin-top-collapse: separate; +} + +.form-horizontal .control-group { + margin-bottom: 18px; + *zoom: 1; +} + +.form-horizontal .control-group:before, +.form-horizontal .control-group:after { + display: table; + content: ""; +} + +.form-horizontal .control-group:after { + clear: both; +} + +.form-horizontal .control-label { + float: left; + width: 140px; + padding-top: 5px; + text-align: right; +} + +.form-horizontal .controls { + *display: inline-block; + *padding-left: 20px; + margin-left: 160px; + *margin-left: 0; +} + +.form-horizontal .controls:first-child { + *padding-left: 160px; +} + +.form-horizontal .help-block { + margin-top: 9px; + margin-bottom: 0; +} + +.form-horizontal .form-actions { + padding-left: 160px; +} + +table { + max-width: 100%; + background-color: transparent; + border-collapse: collapse; + border-spacing: 0; +} + +.table { + width: 100%; + margin-bottom: 18px; +} + +.table th, +.table td { + padding: 8px; + line-height: 18px; + text-align: left; + vertical-align: top; + border-top: 1px solid #dddddd; +} + +.table th { + font-weight: bold; +} + +.table thead th { + vertical-align: bottom; +} + +.table caption + thead tr:first-child th, +.table caption + thead tr:first-child td, +.table colgroup + thead tr:first-child th, +.table colgroup + thead tr:first-child td, +.table thead:first-child tr:first-child th, +.table thead:first-child tr:first-child td { + border-top: 0; +} + +.table tbody + tbody { + border-top: 2px solid #dddddd; +} + +.table-condensed th, +.table-condensed td { + padding: 4px 5px; +} + +.table-bordered { + border: 1px solid #dddddd; + border-collapse: separate; + *border-collapse: collapsed; + border-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.table-bordered th, +.table-bordered td { + border-left: 1px solid #dddddd; +} + +.table-bordered caption + thead tr:first-child th, +.table-bordered caption + tbody tr:first-child th, +.table-bordered caption + tbody tr:first-child td, +.table-bordered colgroup + thead tr:first-child th, +.table-bordered colgroup + tbody tr:first-child th, +.table-bordered colgroup + tbody tr:first-child td, +.table-bordered thead:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child td { + border-top: 0; +} + +.table-bordered thead:first-child tr:first-child th:first-child, +.table-bordered tbody:first-child tr:first-child td:first-child { + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; +} + +.table-bordered thead:first-child tr:first-child th:last-child, +.table-bordered tbody:first-child tr:first-child td:last-child { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; +} + +.table-bordered thead:last-child tr:last-child th:first-child, +.table-bordered tbody:last-child tr:last-child td:first-child { + -webkit-border-radius: 0 0 0 4px; + -moz-border-radius: 0 0 0 4px; + border-radius: 0 0 0 4px; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; +} + +.table-bordered thead:last-child tr:last-child th:last-child, +.table-bordered tbody:last-child tr:last-child td:last-child { + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; +} + +.table-striped tbody tr:nth-child(odd) td, +.table-striped tbody tr:nth-child(odd) th { + background-color: #f9f9f9; +} + +.table tbody tr:hover td, +.table tbody tr:hover th { + background-color: #f5f5f5; +} + +table .span1 { + float: none; + width: 44px; + margin-left: 0; +} + +table .span2 { + float: none; + width: 124px; + margin-left: 0; +} + +table .span3 { + float: none; + width: 204px; + margin-left: 0; +} + +table .span4 { + float: none; + width: 284px; + margin-left: 0; +} + +table .span5 { + float: none; + width: 364px; + margin-left: 0; +} + +table .span6 { + float: none; + width: 444px; + margin-left: 0; +} + +table .span7 { + float: none; + width: 524px; + margin-left: 0; +} + +table .span8 { + float: none; + width: 604px; + margin-left: 0; +} + +table .span9 { + float: none; + width: 684px; + margin-left: 0; +} + +table .span10 { + float: none; + width: 764px; + margin-left: 0; +} + +table .span11 { + float: none; + width: 844px; + margin-left: 0; +} + +table .span12 { + float: none; + width: 924px; + margin-left: 0; +} + +table .span13 { + float: none; + width: 1004px; + margin-left: 0; +} + +table .span14 { + float: none; + width: 1084px; + margin-left: 0; +} + +table .span15 { + float: none; + width: 1164px; + margin-left: 0; +} + +table .span16 { + float: none; + width: 1244px; + margin-left: 0; +} + +table .span17 { + float: none; + width: 1324px; + margin-left: 0; +} + +table .span18 { + float: none; + width: 1404px; + margin-left: 0; +} + +table .span19 { + float: none; + width: 1484px; + margin-left: 0; +} + +table .span20 { + float: none; + width: 1564px; + margin-left: 0; +} + +table .span21 { + float: none; + width: 1644px; + margin-left: 0; +} + +table .span22 { + float: none; + width: 1724px; + margin-left: 0; +} + +table .span23 { + float: none; + width: 1804px; + margin-left: 0; +} + +table .span24 { + float: none; + width: 1884px; + margin-left: 0; +} + +[class^="icon-"], +[class*=" icon-"] { + display: inline-block; + width: 14px; + height: 14px; + *margin-right: .3em; + line-height: 14px; + vertical-align: text-top; + background-image: url("../img/glyphicons-halflings.png"); + background-position: 14px 14px; + background-repeat: no-repeat; +} + +[class^="icon-"]:last-child, +[class*=" icon-"]:last-child { + *margin-left: 0; +} + +.icon-white { + background-image: url("../img/glyphicons-halflings-white.png"); +} + +.icon-glass { + background-position: 0 0; +} + +.icon-music { + background-position: -24px 0; +} + +.icon-search { + background-position: -48px 0; +} + +.icon-envelope { + background-position: -72px 0; +} + +.icon-heart { + background-position: -96px 0; +} + +.icon-star { + background-position: -120px 0; +} + +.icon-star-empty { + background-position: -144px 0; +} + +.icon-user { + background-position: -168px 0; +} + +.icon-film { + background-position: -192px 0; +} + +.icon-th-large { + background-position: -216px 0; +} + +.icon-th { + background-position: -240px 0; +} + +.icon-th-list { + background-position: -264px 0; +} + +.icon-ok { + background-position: -288px 0; +} + +.icon-remove { + background-position: -312px 0; +} + +.icon-zoom-in { + background-position: -336px 0; +} + +.icon-zoom-out { + background-position: -360px 0; +} + +.icon-off { + background-position: -384px 0; +} + +.icon-signal { + background-position: -408px 0; +} + +.icon-cog { + background-position: -432px 0; +} + +.icon-trash { + background-position: -456px 0; +} + +.icon-home { + background-position: 0 -24px; +} + +.icon-file { + background-position: -24px -24px; +} + +.icon-time { + background-position: -48px -24px; +} + +.icon-road { + background-position: -72px -24px; +} + +.icon-download-alt { + background-position: -96px -24px; +} + +.icon-download { + background-position: -120px -24px; +} + +.icon-upload { + background-position: -144px -24px; +} + +.icon-inbox { + background-position: -168px -24px; +} + +.icon-play-circle { + background-position: -192px -24px; +} + +.icon-repeat { + background-position: -216px -24px; +} + +.icon-refresh { + background-position: -240px -24px; +} + +.icon-list-alt { + background-position: -264px -24px; +} + +.icon-lock { + background-position: -287px -24px; +} + +.icon-flag { + background-position: -312px -24px; +} + +.icon-headphones { + background-position: -336px -24px; +} + +.icon-volume-off { + background-position: -360px -24px; +} + +.icon-volume-down { + background-position: -384px -24px; +} + +.icon-volume-up { + background-position: -408px -24px; +} + +.icon-qrcode { + background-position: -432px -24px; +} + +.icon-barcode { + background-position: -456px -24px; +} + +.icon-tag { + background-position: 0 -48px; +} + +.icon-tags { + background-position: -25px -48px; +} + +.icon-book { + background-position: -48px -48px; +} + +.icon-bookmark { + background-position: -72px -48px; +} + +.icon-print { + background-position: -96px -48px; +} + +.icon-camera { + background-position: -120px -48px; +} + +.icon-font { + background-position: -144px -48px; +} + +.icon-bold { + background-position: -167px -48px; +} + +.icon-italic { + background-position: -192px -48px; +} + +.icon-text-height { + background-position: -216px -48px; +} + +.icon-text-width { + background-position: -240px -48px; +} + +.icon-align-left { + background-position: -264px -48px; +} + +.icon-align-center { + background-position: -288px -48px; +} + +.icon-align-right { + background-position: -312px -48px; +} + +.icon-align-justify { + background-position: -336px -48px; +} + +.icon-list { + background-position: -360px -48px; +} + +.icon-indent-left { + background-position: -384px -48px; +} + +.icon-indent-right { + background-position: -408px -48px; +} + +.icon-facetime-video { + background-position: -432px -48px; +} + +.icon-picture { + background-position: -456px -48px; +} + +.icon-pencil { + background-position: 0 -72px; +} + +.icon-map-marker { + background-position: -24px -72px; +} + +.icon-adjust { + background-position: -48px -72px; +} + +.icon-tint { + background-position: -72px -72px; +} + +.icon-edit { + background-position: -96px -72px; +} + +.icon-share { + background-position: -120px -72px; +} + +.icon-check { + background-position: -144px -72px; +} + +.icon-move { + background-position: -168px -72px; +} + +.icon-step-backward { + background-position: -192px -72px; +} + +.icon-fast-backward { + background-position: -216px -72px; +} + +.icon-backward { + background-position: -240px -72px; +} + +.icon-play { + background-position: -264px -72px; +} + +.icon-pause { + background-position: -288px -72px; +} + +.icon-stop { + background-position: -312px -72px; +} + +.icon-forward { + background-position: -336px -72px; +} + +.icon-fast-forward { + background-position: -360px -72px; +} + +.icon-step-forward { + background-position: -384px -72px; +} + +.icon-eject { + background-position: -408px -72px; +} + +.icon-chevron-left { + background-position: -432px -72px; +} + +.icon-chevron-right { + background-position: -456px -72px; +} + +.icon-plus-sign { + background-position: 0 -96px; +} + +.icon-minus-sign { + background-position: -24px -96px; +} + +.icon-remove-sign { + background-position: -48px -96px; +} + +.icon-ok-sign { + background-position: -72px -96px; +} + +.icon-question-sign { + background-position: -96px -96px; +} + +.icon-info-sign { + background-position: -120px -96px; +} + +.icon-screenshot { + background-position: -144px -96px; +} + +.icon-remove-circle { + background-position: -168px -96px; +} + +.icon-ok-circle { + background-position: -192px -96px; +} + +.icon-ban-circle { + background-position: -216px -96px; +} + +.icon-arrow-left { + background-position: -240px -96px; +} + +.icon-arrow-right { + background-position: -264px -96px; +} + +.icon-arrow-up { + background-position: -289px -96px; +} + +.icon-arrow-down { + background-position: -312px -96px; +} + +.icon-share-alt { + background-position: -336px -96px; +} + +.icon-resize-full { + background-position: -360px -96px; +} + +.icon-resize-small { + background-position: -384px -96px; +} + +.icon-plus { + background-position: -408px -96px; +} + +.icon-minus { + background-position: -433px -96px; +} + +.icon-asterisk { + background-position: -456px -96px; +} + +.icon-exclamation-sign { + background-position: 0 -120px; +} + +.icon-gift { + background-position: -24px -120px; +} + +.icon-leaf { + background-position: -48px -120px; +} + +.icon-fire { + background-position: -72px -120px; +} + +.icon-eye-open { + background-position: -96px -120px; +} + +.icon-eye-close { + background-position: -120px -120px; +} + +.icon-warning-sign { + background-position: -144px -120px; +} + +.icon-plane { + background-position: -168px -120px; +} + +.icon-calendar { + background-position: -192px -120px; +} + +.icon-random { + background-position: -216px -120px; +} + +.icon-comment { + background-position: -240px -120px; +} + +.icon-magnet { + background-position: -264px -120px; +} + +.icon-chevron-up { + background-position: -288px -120px; +} + +.icon-chevron-down { + background-position: -313px -119px; +} + +.icon-retweet { + background-position: -336px -120px; +} + +.icon-shopping-cart { + background-position: -360px -120px; +} + +.icon-folder-close { + background-position: -384px -120px; +} + +.icon-folder-open { + background-position: -408px -120px; +} + +.icon-resize-vertical { + background-position: -432px -119px; +} + +.icon-resize-horizontal { + background-position: -456px -118px; +} + +.icon-hdd { + background-position: 0 -144px; +} + +.icon-bullhorn { + background-position: -24px -144px; +} + +.icon-bell { + background-position: -48px -144px; +} + +.icon-certificate { + background-position: -72px -144px; +} + +.icon-thumbs-up { + background-position: -96px -144px; +} + +.icon-thumbs-down { + background-position: -120px -144px; +} + +.icon-hand-right { + background-position: -144px -144px; +} + +.icon-hand-left { + background-position: -168px -144px; +} + +.icon-hand-up { + background-position: -192px -144px; +} + +.icon-hand-down { + background-position: -216px -144px; +} + +.icon-circle-arrow-right { + background-position: -240px -144px; +} + +.icon-circle-arrow-left { + background-position: -264px -144px; +} + +.icon-circle-arrow-up { + background-position: -288px -144px; +} + +.icon-circle-arrow-down { + background-position: -312px -144px; +} + +.icon-globe { + background-position: -336px -144px; +} + +.icon-wrench { + background-position: -360px -144px; +} + +.icon-tasks { + background-position: -384px -144px; +} + +.icon-filter { + background-position: -408px -144px; +} + +.icon-briefcase { + background-position: -432px -144px; +} + +.icon-fullscreen { + background-position: -456px -144px; +} + +.dropup, +.dropdown { + position: relative; +} + +.dropdown-toggle { + *margin-bottom: -3px; +} + +.dropdown-toggle:active, +.open .dropdown-toggle { + outline: 0; +} + +.caret { + display: inline-block; + width: 0; + height: 0; + vertical-align: top; + border-top: 4px solid #000000; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + content: ""; + opacity: 0.3; + filter: alpha(opacity=30); +} + +.dropdown .caret { + margin-top: 8px; + margin-left: 2px; +} + +.dropdown:hover .caret, +.open .caret { + opacity: 1; + filter: alpha(opacity=100); +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 4px 0; + margin: 1px 0 0; + list-style: none; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} + +.dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.dropdown-menu .divider { + *width: 100%; + height: 1px; + margin: 8px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.dropdown-menu a { + display: block; + padding: 3px 15px; + clear: both; + font-weight: normal; + line-height: 18px; + color: #333333; + white-space: nowrap; +} + +.dropdown-menu li > a:hover, +.dropdown-menu .active > a, +.dropdown-menu .active > a:hover { + color: #ffffff; + text-decoration: none; + background-color: #0088cc; +} + +.open { + *z-index: 1000; +} + +.open > .dropdown-menu { + display: block; +} + +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} + +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid #000000; + content: "\2191"; +} + +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} + +.typeahead { + margin-top: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #eee; + border: 1px solid rgba(0, 0, 0, 0.05); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} + +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} + +.well-large { + padding: 24px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.well-small { + padding: 9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -moz-transition: opacity 0.15s linear; + -ms-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} + +.fade.in { + opacity: 1; +} + +.collapse { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + -moz-transition: height 0.35s ease; + -ms-transition: height 0.35s ease; + -o-transition: height 0.35s ease; + transition: height 0.35s ease; +} + +.collapse.in { + height: auto; +} + +.close { + float: right; + font-size: 20px; + font-weight: bold; + line-height: 18px; + color: #000000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} + +.close:hover { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.4; + filter: alpha(opacity=40); +} + +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} + +.btn { + display: inline-block; + *display: inline; + padding: 4px 10px 4px; + margin-bottom: 0; + *margin-left: .3em; + font-size: 13px; + line-height: 18px; + *line-height: 20px; + color: #333333; + text-align: center; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + vertical-align: middle; + cursor: pointer; + background-color: #f5f5f5; + *background-color: #e6e6e6; + background-image: -ms-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(top, #ffffff, #e6e6e6); + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-repeat: repeat-x; + border: 1px solid #cccccc; + *border: 0; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-bottom-color: #b3b3b3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn:hover, +.btn:active, +.btn.active, +.btn.disabled, +.btn[disabled] { + background-color: #e6e6e6; + *background-color: #d9d9d9; +} + +.btn:active, +.btn.active { + background-color: #cccccc \9; +} + +.btn:first-child { + *margin-left: 0; +} + +.btn:hover { + color: #333333; + text-decoration: none; + background-color: #e6e6e6; + *background-color: #d9d9d9; + /* Buttons in IE7 don't get borders, so darken on hover */ + + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -ms-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; +} + +.btn:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} + +.btn.active, +.btn:active { + background-color: #e6e6e6; + background-color: #d9d9d9 \9; + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn.disabled, +.btn[disabled] { + cursor: default; + background-color: #e6e6e6; + background-image: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} + +.btn-large { + padding: 9px 14px; + font-size: 15px; + line-height: normal; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.btn-large [class^="icon-"] { + margin-top: 1px; +} + +.btn-small { + padding: 5px 9px; + font-size: 11px; + line-height: 16px; +} + +.btn-small [class^="icon-"] { + margin-top: -1px; +} + +.btn-mini { + padding: 2px 6px; + font-size: 11px; + line-height: 14px; +} + +.btn-primary, +.btn-primary:hover, +.btn-warning, +.btn-warning:hover, +.btn-danger, +.btn-danger:hover, +.btn-success, +.btn-success:hover, +.btn-info, +.btn-info:hover, +.btn-inverse, +.btn-inverse:hover { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} + +.btn-primary.active, +.btn-warning.active, +.btn-danger.active, +.btn-success.active, +.btn-info.active, +.btn-inverse.active { + color: rgba(255, 255, 255, 0.75); +} + +.btn { + border-color: #ccc; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); +} + +.btn-primary { + background-color: #0074cc; + *background-color: #0055cc; + background-image: -ms-linear-gradient(top, #0088cc, #0055cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0055cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0055cc); + background-image: -o-linear-gradient(top, #0088cc, #0055cc); + background-image: -moz-linear-gradient(top, #0088cc, #0055cc); + background-image: linear-gradient(top, #0088cc, #0055cc); + background-repeat: repeat-x; + border-color: #0055cc #0055cc #003580; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#0088cc', endColorstr='#0055cc', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-primary:hover, +.btn-primary:active, +.btn-primary.active, +.btn-primary.disabled, +.btn-primary[disabled] { + background-color: #0055cc; + *background-color: #004ab3; +} + +.btn-primary:active, +.btn-primary.active { + background-color: #004099 \9; +} + +.btn-warning { + background-color: #faa732; + *background-color: #f89406; + background-image: -ms-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(top, #fbb450, #f89406); + background-repeat: repeat-x; + border-color: #f89406 #f89406 #ad6704; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-warning:hover, +.btn-warning:active, +.btn-warning.active, +.btn-warning.disabled, +.btn-warning[disabled] { + background-color: #f89406; + *background-color: #df8505; +} + +.btn-warning:active, +.btn-warning.active { + background-color: #c67605 \9; +} + +.btn-danger { + background-color: #da4f49; + *background-color: #bd362f; + background-image: -ms-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); + background-image: linear-gradient(top, #ee5f5b, #bd362f); + background-repeat: repeat-x; + border-color: #bd362f #bd362f #802420; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-danger:hover, +.btn-danger:active, +.btn-danger.active, +.btn-danger.disabled, +.btn-danger[disabled] { + background-color: #bd362f; + *background-color: #a9302a; +} + +.btn-danger:active, +.btn-danger.active { + background-color: #942a25 \9; +} + +.btn-success { + background-color: #5bb75b; + *background-color: #51a351; + background-image: -ms-linear-gradient(top, #62c462, #51a351); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); + background-image: -webkit-linear-gradient(top, #62c462, #51a351); + background-image: -o-linear-gradient(top, #62c462, #51a351); + background-image: -moz-linear-gradient(top, #62c462, #51a351); + background-image: linear-gradient(top, #62c462, #51a351); + background-repeat: repeat-x; + border-color: #51a351 #51a351 #387038; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-success:hover, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + background-color: #51a351; + *background-color: #499249; +} + +.btn-success:active, +.btn-success.active { + background-color: #408140 \9; +} + +.btn-info { + background-color: #49afcd; + *background-color: #2f96b4; + background-image: -ms-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); + background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); + background-image: linear-gradient(top, #5bc0de, #2f96b4); + background-repeat: repeat-x; + border-color: #2f96b4 #2f96b4 #1f6377; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-info:hover, +.btn-info:active, +.btn-info.active, +.btn-info.disabled, +.btn-info[disabled] { + background-color: #2f96b4; + *background-color: #2a85a0; +} + +.btn-info:active, +.btn-info.active { + background-color: #24748c \9; +} + +.btn-inverse { + background-color: #414141; + *background-color: #222222; + background-image: -ms-linear-gradient(top, #555555, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#555555), to(#222222)); + background-image: -webkit-linear-gradient(top, #555555, #222222); + background-image: -o-linear-gradient(top, #555555, #222222); + background-image: -moz-linear-gradient(top, #555555, #222222); + background-image: linear-gradient(top, #555555, #222222); + background-repeat: repeat-x; + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#555555', endColorstr='#222222', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); +} + +.btn-inverse:hover, +.btn-inverse:active, +.btn-inverse.active, +.btn-inverse.disabled, +.btn-inverse[disabled] { + background-color: #222222; + *background-color: #151515; +} + +.btn-inverse:active, +.btn-inverse.active { + background-color: #080808 \9; +} + +button.btn, +input[type="submit"].btn { + *padding-top: 2px; + *padding-bottom: 2px; +} + +button.btn::-moz-focus-inner, +input[type="submit"].btn::-moz-focus-inner { + padding: 0; + border: 0; +} + +button.btn.btn-large, +input[type="submit"].btn.btn-large { + *padding-top: 7px; + *padding-bottom: 7px; +} + +button.btn.btn-small, +input[type="submit"].btn.btn-small { + *padding-top: 3px; + *padding-bottom: 3px; +} + +button.btn.btn-mini, +input[type="submit"].btn.btn-mini { + *padding-top: 1px; + *padding-bottom: 1px; +} + +.btn-group { + position: relative; + *margin-left: .3em; + *zoom: 1; +} + +.btn-group:before, +.btn-group:after { + display: table; + content: ""; +} + +.btn-group:after { + clear: both; +} + +.btn-group:first-child { + *margin-left: 0; +} + +.btn-group + .btn-group { + margin-left: 5px; +} + +.btn-toolbar { + margin-top: 9px; + margin-bottom: 9px; +} + +.btn-toolbar .btn-group { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; +} + +.btn-group > .btn { + position: relative; + float: left; + margin-left: -1px; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.btn-group > .btn:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 4px; + border-bottom-left-radius: 4px; + -webkit-border-top-left-radius: 4px; + border-top-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + -moz-border-radius-topleft: 4px; +} + +.btn-group > .btn:last-child, +.btn-group > .dropdown-toggle { + -webkit-border-top-right-radius: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + border-bottom-right-radius: 4px; + -moz-border-radius-topright: 4px; + -moz-border-radius-bottomright: 4px; +} + +.btn-group > .btn.large:first-child { + margin-left: 0; + -webkit-border-bottom-left-radius: 6px; + border-bottom-left-radius: 6px; + -webkit-border-top-left-radius: 6px; + border-top-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + -moz-border-radius-topleft: 6px; +} + +.btn-group > .btn.large:last-child, +.btn-group > .large.dropdown-toggle { + -webkit-border-top-right-radius: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + border-bottom-right-radius: 6px; + -moz-border-radius-topright: 6px; + -moz-border-radius-bottomright: 6px; +} + +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active { + z-index: 2; +} + +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} + +.btn-group > .dropdown-toggle { + *padding-top: 4px; + padding-right: 8px; + *padding-bottom: 4px; + padding-left: 8px; + -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group > .btn-mini.dropdown-toggle { + padding-right: 5px; + padding-left: 5px; +} + +.btn-group > .btn-small.dropdown-toggle { + *padding-top: 4px; + *padding-bottom: 4px; +} + +.btn-group > .btn-large.dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} + +.btn-group.open .dropdown-toggle { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-group.open .btn.dropdown-toggle { + background-color: #e6e6e6; +} + +.btn-group.open .btn-primary.dropdown-toggle { + background-color: #0055cc; +} + +.btn-group.open .btn-warning.dropdown-toggle { + background-color: #f89406; +} + +.btn-group.open .btn-danger.dropdown-toggle { + background-color: #bd362f; +} + +.btn-group.open .btn-success.dropdown-toggle { + background-color: #51a351; +} + +.btn-group.open .btn-info.dropdown-toggle { + background-color: #2f96b4; +} + +.btn-group.open .btn-inverse.dropdown-toggle { + background-color: #222222; +} + +.btn .caret { + margin-top: 7px; + margin-left: 0; +} + +.btn:hover .caret, +.open.btn-group .caret { + opacity: 1; + filter: alpha(opacity=100); +} + +.btn-mini .caret { + margin-top: 5px; +} + +.btn-small .caret { + margin-top: 6px; +} + +.btn-large .caret { + margin-top: 6px; + border-top-width: 5px; + border-right-width: 5px; + border-left-width: 5px; +} + +.dropup .btn-large .caret { + border-top: 0; + border-bottom: 5px solid #000000; +} + +.btn-primary .caret, +.btn-warning .caret, +.btn-danger .caret, +.btn-info .caret, +.btn-success .caret, +.btn-inverse .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; + opacity: 0.75; + filter: alpha(opacity=75); +} + +.alert { + padding: 8px 35px 8px 14px; + margin-bottom: 18px; + color: #c09853; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + background-color: #fcf8e3; + border: 1px solid #fbeed5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.alert-heading { + color: inherit; +} + +.alert .close { + position: relative; + top: -2px; + right: -21px; + line-height: 18px; +} + +.alert-success { + color: #468847; + background-color: #dff0d8; + border-color: #d6e9c6; +} + +.alert-danger, +.alert-error { + color: #b94a48; + background-color: #f2dede; + border-color: #eed3d7; +} + +.alert-info { + color: #3a87ad; + background-color: #d9edf7; + border-color: #bce8f1; +} + +.alert-block { + padding-top: 14px; + padding-bottom: 14px; +} + +.alert-block > p, +.alert-block > ul { + margin-bottom: 0; +} + +.alert-block p + p { + margin-top: 5px; +} + +.nav { + margin-bottom: 18px; + margin-left: 0; + list-style: none; +} + +.nav > li > a { + display: block; +} + +.nav > li > a:hover { + text-decoration: none; + background-color: #eeeeee; +} + +.nav > .pull-right { + float: right; +} + +.nav .nav-header { + display: block; + padding: 3px 15px; + font-size: 11px; + font-weight: bold; + line-height: 18px; + color: #999999; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + text-transform: uppercase; +} + +.nav li + .nav-header { + margin-top: 9px; +} + +.nav-list { + padding-right: 15px; + padding-left: 15px; + margin-bottom: 0; +} + +.nav-list > li > a, +.nav-list .nav-header { + margin-right: -15px; + margin-left: -15px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} + +.nav-list > li > a { + padding: 3px 15px; +} + +.nav-list > .active > a, +.nav-list > .active > a:hover { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + background-color: #0088cc; +} + +.nav-list [class^="icon-"] { + margin-right: 2px; +} + +.nav-list .divider { + *width: 100%; + height: 1px; + margin: 8px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} + +.nav-tabs, +.nav-pills { + *zoom: 1; +} + +.nav-tabs:before, +.nav-pills:before, +.nav-tabs:after, +.nav-pills:after { + display: table; + content: ""; +} + +.nav-tabs:after, +.nav-pills:after { + clear: both; +} + +.nav-tabs > li, +.nav-pills > li { + float: left; +} + +.nav-tabs > li > a, +.nav-pills > li > a { + padding-right: 12px; + padding-left: 12px; + margin-right: 2px; + line-height: 14px; +} + +.nav-tabs { + border-bottom: 1px solid #ddd; +} + +.nav-tabs > li { + margin-bottom: -1px; +} + +.nav-tabs > li > a { + padding-top: 8px; + padding-bottom: 8px; + line-height: 18px; + border: 1px solid transparent; + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #dddddd; +} + +.nav-tabs > .active > a, +.nav-tabs > .active > a:hover { + color: #555555; + cursor: default; + background-color: #ffffff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} + +.nav-pills > li > a { + padding-top: 8px; + padding-bottom: 8px; + margin-top: 2px; + margin-bottom: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} + +.nav-pills > .active > a, +.nav-pills > .active > a:hover { + color: #ffffff; + background-color: #0088cc; +} + +.nav-stacked > li { + float: none; +} + +.nav-stacked > li > a { + margin-right: 0; +} + +.nav-tabs.nav-stacked { + border-bottom: 0; +} + +.nav-tabs.nav-stacked > li > a { + border: 1px solid #ddd; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.nav-tabs.nav-stacked > li:first-child > a { + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} + +.nav-tabs.nav-stacked > li:last-child > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.nav-tabs.nav-stacked > li > a:hover { + z-index: 2; + border-color: #ddd; +} + +.nav-pills.nav-stacked > li > a { + margin-bottom: 3px; +} + +.nav-pills.nav-stacked > li:last-child > a { + margin-bottom: 1px; +} + +.nav-tabs .dropdown-menu { + -webkit-border-radius: 0 0 5px 5px; + -moz-border-radius: 0 0 5px 5px; + border-radius: 0 0 5px 5px; +} + +.nav-pills .dropdown-menu { + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.nav-tabs .dropdown-toggle .caret, +.nav-pills .dropdown-toggle .caret { + margin-top: 6px; + border-top-color: #0088cc; + border-bottom-color: #0088cc; +} + +.nav-tabs .dropdown-toggle:hover .caret, +.nav-pills .dropdown-toggle:hover .caret { + border-top-color: #005580; + border-bottom-color: #005580; +} + +.nav-tabs .active .dropdown-toggle .caret, +.nav-pills .active .dropdown-toggle .caret { + border-top-color: #333333; + border-bottom-color: #333333; +} + +.nav > .dropdown.active > a:hover { + color: #000000; + cursor: pointer; +} + +.nav-tabs .open .dropdown-toggle, +.nav-pills .open .dropdown-toggle, +.nav > li.dropdown.open.active > a:hover { + color: #ffffff; + background-color: #999999; + border-color: #999999; +} + +.nav li.dropdown.open .caret, +.nav li.dropdown.open.active .caret, +.nav li.dropdown.open a:hover .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; + opacity: 1; + filter: alpha(opacity=100); +} + +.tabs-stacked .open > a:hover { + border-color: #999999; +} + +.tabbable { + *zoom: 1; +} + +.tabbable:before, +.tabbable:after { + display: table; + content: ""; +} + +.tabbable:after { + clear: both; +} + +.tab-content { + overflow: auto; +} + +.tabs-below > .nav-tabs, +.tabs-right > .nav-tabs, +.tabs-left > .nav-tabs { + border-bottom: 0; +} + +.tab-content > .tab-pane, +.pill-content > .pill-pane { + display: none; +} + +.tab-content > .active, +.pill-content > .active { + display: block; +} + +.tabs-below > .nav-tabs { + border-top: 1px solid #ddd; +} + +.tabs-below > .nav-tabs > li { + margin-top: -1px; + margin-bottom: 0; +} + +.tabs-below > .nav-tabs > li > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} + +.tabs-below > .nav-tabs > li > a:hover { + border-top-color: #ddd; + border-bottom-color: transparent; +} + +.tabs-below > .nav-tabs > .active > a, +.tabs-below > .nav-tabs > .active > a:hover { + border-color: transparent #ddd #ddd #ddd; +} + +.tabs-left > .nav-tabs > li, +.tabs-right > .nav-tabs > li { + float: none; +} + +.tabs-left > .nav-tabs > li > a, +.tabs-right > .nav-tabs > li > a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px; +} + +.tabs-left > .nav-tabs { + float: left; + margin-right: 19px; + border-right: 1px solid #ddd; +} + +.tabs-left > .nav-tabs > li > a { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} + +.tabs-left > .nav-tabs > li > a:hover { + border-color: #eeeeee #dddddd #eeeeee #eeeeee; +} + +.tabs-left > .nav-tabs .active > a, +.tabs-left > .nav-tabs .active > a:hover { + border-color: #ddd transparent #ddd #ddd; + *border-right-color: #ffffff; +} + +.tabs-right > .nav-tabs { + float: right; + margin-left: 19px; + border-left: 1px solid #ddd; +} + +.tabs-right > .nav-tabs > li > a { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} + +.tabs-right > .nav-tabs > li > a:hover { + border-color: #eeeeee #eeeeee #eeeeee #dddddd; +} + +.tabs-right > .nav-tabs .active > a, +.tabs-right > .nav-tabs .active > a:hover { + border-color: #ddd #ddd #ddd transparent; + *border-left-color: #ffffff; +} + +.navbar { + *position: relative; + *z-index: 2; + margin-bottom: 18px; + overflow: visible; +} + +.navbar-inner { + min-height: 40px; + padding-right: 20px; + padding-left: 20px; + background-color: #2c2c2c; + background-image: -moz-linear-gradient(top, #333333, #222222); + background-image: -ms-linear-gradient(top, #333333, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); + background-image: -webkit-linear-gradient(top, #333333, #222222); + background-image: -o-linear-gradient(top, #333333, #222222); + background-image: linear-gradient(top, #333333, #222222); + background-repeat: repeat-x; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1); +} + +.navbar .container { + width: auto; +} + +.nav-collapse.collapse { + height: auto; +} + +.navbar { + color: #999999; +} + +.navbar .brand:hover { + text-decoration: none; +} + +.navbar .brand { + display: block; + float: left; + padding: 8px 20px 12px; + margin-left: -20px; + font-size: 20px; + font-weight: 200; + line-height: 1; + color: #999999; +} + +.navbar .navbar-text { + margin-bottom: 0; + line-height: 40px; +} + +.navbar .navbar-link { + color: #999999; +} + +.navbar .navbar-link:hover { + color: #ffffff; +} + +.navbar .btn, +.navbar .btn-group { + margin-top: 5px; +} + +.navbar .btn-group .btn { + margin: 0; +} + +.navbar-form { + margin-bottom: 0; + *zoom: 1; +} + +.navbar-form:before, +.navbar-form:after { + display: table; + content: ""; +} + +.navbar-form:after { + clear: both; +} + +.navbar-form input, +.navbar-form select, +.navbar-form .radio, +.navbar-form .checkbox { + margin-top: 5px; +} + +.navbar-form input, +.navbar-form select { + display: inline-block; + margin-bottom: 0; +} + +.navbar-form input[type="image"], +.navbar-form input[type="checkbox"], +.navbar-form input[type="radio"] { + margin-top: 3px; +} + +.navbar-form .input-append, +.navbar-form .input-prepend { + margin-top: 6px; + white-space: nowrap; +} + +.navbar-form .input-append input, +.navbar-form .input-prepend input { + margin-top: 0; +} + +.navbar-search { + position: relative; + float: left; + margin-top: 6px; + margin-bottom: 0; +} + +.navbar-search .search-query { + padding: 4px 9px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 1; + color: #ffffff; + background-color: #626262; + border: 1px solid #151515; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15); + -webkit-transition: none; + -moz-transition: none; + -ms-transition: none; + -o-transition: none; + transition: none; +} + +.navbar-search .search-query:-moz-placeholder { + color: #cccccc; +} + +.navbar-search .search-query:-ms-input-placeholder { + color: #cccccc; +} + +.navbar-search .search-query::-webkit-input-placeholder { + color: #cccccc; +} + +.navbar-search .search-query:focus, +.navbar-search .search-query.focused { + padding: 5px 10px; + color: #333333; + text-shadow: 0 1px 0 #ffffff; + background-color: #ffffff; + border: 0; + outline: 0; + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); +} + +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; + margin-bottom: 0; +} + +.navbar-fixed-top .navbar-inner, +.navbar-fixed-bottom .navbar-inner { + padding-right: 0; + padding-left: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} + +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} + +.navbar-fixed-top { + top: 0; +} + +.navbar-fixed-bottom { + bottom: 0; +} + +.navbar .nav { + position: relative; + left: 0; + display: block; + float: left; + margin: 0 10px 0 0; +} + +.navbar .nav.pull-right { + float: right; +} + +.navbar .nav > li { + display: block; + float: left; +} + +.navbar .nav > li > a { + float: none; + padding: 9px 10px 11px; + line-height: 19px; + color: #999999; + text-decoration: none; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} + +.navbar .btn { + display: inline-block; + padding: 4px 10px 4px; + margin: 5px 5px 6px; + line-height: 18px; +} + +.navbar .btn-group { + padding: 5px 5px 6px; + margin: 0; +} + +.navbar .nav > li > a:hover { + color: #ffffff; + text-decoration: none; + background-color: transparent; +} + +.navbar .nav .active > a, +.navbar .nav .active > a:hover { + color: #ffffff; + text-decoration: none; + background-color: #222222; +} + +.navbar .divider-vertical { + width: 1px; + height: 40px; + margin: 0 9px; + overflow: hidden; + background-color: #222222; + border-right: 1px solid #333333; +} + +.navbar .nav.pull-right { + margin-right: 0; + margin-left: 10px; +} + +.navbar .btn-navbar { + display: none; + float: right; + padding: 7px 10px; + margin-right: 5px; + margin-left: 5px; + background-color: #2c2c2c; + *background-color: #222222; + background-image: -ms-linear-gradient(top, #333333, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222)); + background-image: -webkit-linear-gradient(top, #333333, #222222); + background-image: -o-linear-gradient(top, #333333, #222222); + background-image: linear-gradient(top, #333333, #222222); + background-image: -moz-linear-gradient(top, #333333, #222222); + background-repeat: repeat-x; + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0); + filter: progid:dximagetransform.microsoft.gradient(enabled=false); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075); +} + +.navbar .btn-navbar:hover, +.navbar .btn-navbar:active, +.navbar .btn-navbar.active, +.navbar .btn-navbar.disabled, +.navbar .btn-navbar[disabled] { + background-color: #222222; + *background-color: #151515; +} + +.navbar .btn-navbar:active, +.navbar .btn-navbar.active { + background-color: #080808 \9; +} + +.navbar .btn-navbar .icon-bar { + display: block; + width: 18px; + height: 2px; + background-color: #f5f5f5; + -webkit-border-radius: 1px; + -moz-border-radius: 1px; + border-radius: 1px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); +} + +.btn-navbar .icon-bar + .icon-bar { + margin-top: 3px; +} + +.navbar .dropdown-menu:before { + position: absolute; + top: -7px; + left: 9px; + display: inline-block; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-left: 7px solid transparent; + border-bottom-color: rgba(0, 0, 0, 0.2); + content: ''; +} + +.navbar .dropdown-menu:after { + position: absolute; + top: -6px; + left: 10px; + display: inline-block; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + border-left: 6px solid transparent; + content: ''; +} + +.navbar-fixed-bottom .dropdown-menu:before { + top: auto; + bottom: -7px; + border-top: 7px solid #ccc; + border-bottom: 0; + border-top-color: rgba(0, 0, 0, 0.2); +} + +.navbar-fixed-bottom .dropdown-menu:after { + top: auto; + bottom: -6px; + border-top: 6px solid #ffffff; + border-bottom: 0; +} + +.navbar .nav li.dropdown .dropdown-toggle .caret, +.navbar .nav li.dropdown.open .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} + +.navbar .nav li.dropdown.active .caret { + opacity: 1; + filter: alpha(opacity=100); +} + +.navbar .nav li.dropdown.open > .dropdown-toggle, +.navbar .nav li.dropdown.active > .dropdown-toggle, +.navbar .nav li.dropdown.open.active > .dropdown-toggle { + background-color: transparent; +} + +.navbar .nav li.dropdown.active > .dropdown-toggle:hover { + color: #ffffff; +} + +.navbar .pull-right .dropdown-menu, +.navbar .dropdown-menu.pull-right { + right: 0; + left: auto; +} + +.navbar .pull-right .dropdown-menu:before, +.navbar .dropdown-menu.pull-right:before { + right: 12px; + left: auto; +} + +.navbar .pull-right .dropdown-menu:after, +.navbar .dropdown-menu.pull-right:after { + right: 13px; + left: auto; +} + +.breadcrumb { + padding: 7px 14px; + margin: 0 0 18px; + list-style: none; + background-color: #fbfbfb; + background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5); + background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5)); + background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5); + background-image: -o-linear-gradient(top, #ffffff, #f5f5f5); + background-image: linear-gradient(top, #ffffff, #f5f5f5); + background-repeat: repeat-x; + border: 1px solid #ddd; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0); + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; +} + +.breadcrumb li { + display: inline-block; + *display: inline; + text-shadow: 0 1px 0 #ffffff; + *zoom: 1; +} + +.breadcrumb .divider { + padding: 0 5px; + color: #999999; +} + +.breadcrumb .active a { + color: #333333; +} + +.pagination { + height: 36px; + margin: 18px 0; +} + +.pagination ul { + display: inline-block; + *display: inline; + margin-bottom: 0; + margin-left: 0; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + *zoom: 1; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.pagination li { + display: inline; +} + +.pagination a { + float: left; + padding: 0 14px; + line-height: 34px; + text-decoration: none; + border: 1px solid #ddd; + border-left-width: 0; +} + +.pagination a:hover, +.pagination .active a { + background-color: #f5f5f5; +} + +.pagination .active a { + color: #999999; + cursor: default; +} + +.pagination .disabled span, +.pagination .disabled a, +.pagination .disabled a:hover { + color: #999999; + cursor: default; + background-color: transparent; +} + +.pagination li:first-child a { + border-left-width: 1px; + -webkit-border-radius: 3px 0 0 3px; + -moz-border-radius: 3px 0 0 3px; + border-radius: 3px 0 0 3px; +} + +.pagination li:last-child a { + -webkit-border-radius: 0 3px 3px 0; + -moz-border-radius: 0 3px 3px 0; + border-radius: 0 3px 3px 0; +} + +.pagination-centered { + text-align: center; +} + +.pagination-right { + text-align: right; +} + +.pager { + margin-bottom: 18px; + margin-left: 0; + text-align: center; + list-style: none; + *zoom: 1; +} + +.pager:before, +.pager:after { + display: table; + content: ""; +} + +.pager:after { + clear: both; +} + +.pager li { + display: inline; +} + +.pager a { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} + +.pager a:hover { + text-decoration: none; + background-color: #f5f5f5; +} + +.pager .next a { + float: right; +} + +.pager .previous a { + float: left; +} + +.pager .disabled a, +.pager .disabled a:hover { + color: #999999; + cursor: default; + background-color: #fff; +} + +.modal-open .dropdown-menu { + z-index: 2050; +} + +.modal-open .dropdown.open { + *z-index: 2050; +} + +.modal-open .popover { + z-index: 2060; +} + +.modal-open .tooltip { + z-index: 2070; +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} + +.modal-backdrop.fade { + opacity: 0; +} + +.modal-backdrop, +.modal-backdrop.fade.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.modal { + position: fixed; + top: 50%; + left: 50%; + z-index: 1050; + width: 560px; + margin: -250px 0 0 -280px; + overflow: auto; + background-color: #ffffff; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.3); + *border: 1px solid #999; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; +} + +.modal.fade { + top: -25%; + -webkit-transition: opacity 0.3s linear, top 0.3s ease-out; + -moz-transition: opacity 0.3s linear, top 0.3s ease-out; + -ms-transition: opacity 0.3s linear, top 0.3s ease-out; + -o-transition: opacity 0.3s linear, top 0.3s ease-out; + transition: opacity 0.3s linear, top 0.3s ease-out; +} + +.modal.fade.in { + top: 50%; +} + +.modal-header { + padding: 9px 15px; + border-bottom: 1px solid #eee; +} + +.modal-header .close { + margin-top: 2px; +} + +.modal-body { + max-height: 400px; + padding: 15px; + overflow-y: auto; +} + +.modal-form { + margin-bottom: 0; +} + +.modal-footer { + padding: 14px 15px 15px; + margin-bottom: 0; + text-align: right; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; + *zoom: 1; + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; +} + +.modal-footer:before, +.modal-footer:after { + display: table; + content: ""; +} + +.modal-footer:after { + clear: both; +} + +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} + +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} + +.tooltip { + position: absolute; + z-index: 1020; + display: block; + padding: 5px; + font-size: 11px; + opacity: 0; + filter: alpha(opacity=0); + visibility: visible; +} + +.tooltip.in { + opacity: 0.8; + filter: alpha(opacity=80); +} + +.tooltip.top { + margin-top: -2px; +} + +.tooltip.right { + margin-left: 2px; +} + +.tooltip.bottom { + margin-top: 2px; +} + +.tooltip.left { + margin-left: -2px; +} + +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-top: 5px solid #000000; + border-right: 5px solid transparent; + border-left: 5px solid transparent; +} + +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + border-left: 5px solid #000000; +} + +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-right: 5px solid transparent; + border-bottom: 5px solid #000000; + border-left: 5px solid transparent; +} + +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-top: 5px solid transparent; + border-right: 5px solid #000000; + border-bottom: 5px solid transparent; +} + +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + padding: 5px; +} + +.popover.top { + margin-top: -5px; +} + +.popover.right { + margin-left: 5px; +} + +.popover.bottom { + margin-top: 5px; +} + +.popover.left { + margin-left: -5px; +} + +.popover.top .arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-top: 5px solid #000000; + border-right: 5px solid transparent; + border-left: 5px solid transparent; +} + +.popover.right .arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-top: 5px solid transparent; + border-right: 5px solid #000000; + border-bottom: 5px solid transparent; +} + +.popover.bottom .arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-right: 5px solid transparent; + border-bottom: 5px solid #000000; + border-left: 5px solid transparent; +} + +.popover.left .arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-top: 5px solid transparent; + border-bottom: 5px solid transparent; + border-left: 5px solid #000000; +} + +.popover .arrow { + position: absolute; + width: 0; + height: 0; +} + +.popover-inner { + width: 280px; + padding: 3px; + overflow: hidden; + background: #000000; + background: rgba(0, 0, 0, 0.8); + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); +} + +.popover-title { + padding: 9px 15px; + line-height: 1; + background-color: #f5f5f5; + border-bottom: 1px solid #eee; + -webkit-border-radius: 3px 3px 0 0; + -moz-border-radius: 3px 3px 0 0; + border-radius: 3px 3px 0 0; +} + +.popover-content { + padding: 14px; + background-color: #ffffff; + -webkit-border-radius: 0 0 3px 3px; + -moz-border-radius: 0 0 3px 3px; + border-radius: 0 0 3px 3px; + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; +} + +.popover-content p, +.popover-content ul, +.popover-content ol { + margin-bottom: 0; +} + +.thumbnails { + margin-left: -20px; + list-style: none; + *zoom: 1; +} + +.thumbnails:before, +.thumbnails:after { + display: table; + content: ""; +} + +.thumbnails:after { + clear: both; +} + +.row-fluid .thumbnails { + margin-left: 0; +} + +.thumbnails > li { + float: left; + margin-bottom: 18px; + margin-left: 20px; +} + +.thumbnail { + display: block; + padding: 4px; + line-height: 1; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075); +} + +a.thumbnail:hover { + border-color: #0088cc; + -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); +} + +.thumbnail > img { + display: block; + max-width: 100%; + margin-right: auto; + margin-left: auto; +} + +.thumbnail .caption { + padding: 9px; +} + +.label, +.badge { + font-size: 10.998px; + font-weight: bold; + line-height: 14px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + white-space: nowrap; + vertical-align: baseline; + background-color: #999999; +} + +.label { + padding: 1px 4px 2px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} + +.badge { + padding: 1px 9px 2px; + -webkit-border-radius: 9px; + -moz-border-radius: 9px; + border-radius: 9px; +} + +a.label:hover, +a.badge:hover { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} + +.label-important, +.badge-important { + background-color: #b94a48; +} + +.label-important[href], +.badge-important[href] { + background-color: #953b39; +} + +.label-warning, +.badge-warning { + background-color: #f89406; +} + +.label-warning[href], +.badge-warning[href] { + background-color: #c67605; +} + +.label-success, +.badge-success { + background-color: #468847; +} + +.label-success[href], +.badge-success[href] { + background-color: #356635; +} + +.label-info, +.badge-info { + background-color: #3a87ad; +} + +.label-info[href], +.badge-info[href] { + background-color: #2d6987; +} + +.label-inverse, +.badge-inverse { + background-color: #333333; +} + +.label-inverse[href], +.badge-inverse[href] { + background-color: #1a1a1a; +} + +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-moz-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-ms-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +@-o-keyframes progress-bar-stripes { + from { + background-position: 0 0; + } + to { + background-position: 40px 0; + } +} + +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} + +.progress { + height: 18px; + margin-bottom: 18px; + overflow: hidden; + background-color: #f7f7f7; + background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -ms-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); + background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: linear-gradient(top, #f5f5f5, #f9f9f9); + background-repeat: repeat-x; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0); + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); +} + +.progress .bar { + width: 0; + height: 18px; + font-size: 12px; + color: #ffffff; + text-align: center; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e90d2; + background-image: -moz-linear-gradient(top, #149bdf, #0480be); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); + background-image: -webkit-linear-gradient(top, #149bdf, #0480be); + background-image: -o-linear-gradient(top, #149bdf, #0480be); + background-image: linear-gradient(top, #149bdf, #0480be); + background-image: -ms-linear-gradient(top, #149bdf, #0480be); + background-repeat: repeat-x; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0); + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + -ms-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: width 0.6s ease; + -moz-transition: width 0.6s ease; + -ms-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} + +.progress-striped .bar { + background-color: #149bdf; + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + -moz-background-size: 40px 40px; + -o-background-size: 40px 40px; + background-size: 40px 40px; +} + +.progress.active .bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -moz-animation: progress-bar-stripes 2s linear infinite; + -ms-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} + +.progress-danger .bar { + background-color: #dd514c; + background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); + background-image: linear-gradient(top, #ee5f5b, #c43c35); + background-repeat: repeat-x; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0); +} + +.progress-danger.progress-striped .bar { + background-color: #ee5f5b; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-success .bar { + background-color: #5eb95e; + background-image: -moz-linear-gradient(top, #62c462, #57a957); + background-image: -ms-linear-gradient(top, #62c462, #57a957); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); + background-image: -webkit-linear-gradient(top, #62c462, #57a957); + background-image: -o-linear-gradient(top, #62c462, #57a957); + background-image: linear-gradient(top, #62c462, #57a957); + background-repeat: repeat-x; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0); +} + +.progress-success.progress-striped .bar { + background-color: #62c462; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-info .bar { + background-color: #4bb1cf; + background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); + background-image: -ms-linear-gradient(top, #5bc0de, #339bb9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); + background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); + background-image: -o-linear-gradient(top, #5bc0de, #339bb9); + background-image: linear-gradient(top, #5bc0de, #339bb9); + background-repeat: repeat-x; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0); +} + +.progress-info.progress-striped .bar { + background-color: #5bc0de; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.progress-warning .bar { + background-color: #faa732; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -ms-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(top, #fbb450, #f89406); + background-repeat: repeat-x; + filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0); +} + +.progress-warning.progress-striped .bar { + background-color: #fbb450; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -ms-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} + +.accordion { + margin-bottom: 18px; +} + +.accordion-group { + margin-bottom: 2px; + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} + +.accordion-heading { + border-bottom: 0; +} + +.accordion-heading .accordion-toggle { + display: block; + padding: 8px 15px; +} + +.accordion-toggle { + cursor: pointer; +} + +.accordion-inner { + padding: 9px 15px; + border-top: 1px solid #e5e5e5; +} + +.carousel { + position: relative; + margin-bottom: 18px; + line-height: 1; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} + +.carousel .item { + position: relative; + display: none; + -webkit-transition: 0.6s ease-in-out left; + -moz-transition: 0.6s ease-in-out left; + -ms-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} + +.carousel .item > img { + display: block; + line-height: 1; +} + +.carousel .active, +.carousel .next, +.carousel .prev { + display: block; +} + +.carousel .active { + left: 0; +} + +.carousel .next, +.carousel .prev { + position: absolute; + top: 0; + width: 100%; +} + +.carousel .next { + left: 100%; +} + +.carousel .prev { + left: -100%; +} + +.carousel .next.left, +.carousel .prev.right { + left: 0; +} + +.carousel .active.left { + left: -100%; +} + +.carousel .active.right { + left: 100%; +} + +.carousel-control { + position: absolute; + top: 40%; + left: 15px; + width: 40px; + height: 40px; + margin-top: -20px; + font-size: 60px; + font-weight: 100; + line-height: 30px; + color: #ffffff; + text-align: center; + background: #222222; + border: 3px solid #ffffff; + -webkit-border-radius: 23px; + -moz-border-radius: 23px; + border-radius: 23px; + opacity: 0.5; + filter: alpha(opacity=50); +} + +.carousel-control.right { + right: 15px; + left: auto; +} + +.carousel-control:hover { + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} + +.carousel-caption { + position: absolute; + right: 0; + bottom: 0; + left: 0; + padding: 10px 15px 5px; + background: #333333; + background: rgba(0, 0, 0, 0.75); +} + +.carousel-caption h4, +.carousel-caption p { + color: #ffffff; +} + +.hero-unit { + padding: 60px; + margin-bottom: 30px; + background-color: #eeeeee; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} + +.hero-unit h1 { + margin-bottom: 0; + font-size: 60px; + line-height: 1; + letter-spacing: -1px; + color: inherit; +} + +.hero-unit p { + font-size: 18px; + font-weight: 200; + line-height: 27px; + color: inherit; +} + +.pull-right { + float: right; +} + +.pull-left { + float: left; +} + +.hide { + display: none; +} + +.show { + display: block; +} + +.invisible { + visibility: hidden; +} diff --git a/springboot-echarts/src/main/resources/public/static/js/echarts-load.js b/springboot-echarts/src/main/resources/public/static/js/echarts-load.js new file mode 100644 index 0000000..bd17739 --- /dev/null +++ b/springboot-echarts/src/main/resources/public/static/js/echarts-load.js @@ -0,0 +1,43 @@ +var system = require('system'); +var page = require('webpage').create(); + +// 获取第二个参数(即请求地址url). +var url = system.args[1]; +console.log('url:' + url); + +// 显示控制台日志. +page.onConsoleMessage = function (msg, lineNum, sourceId) { + console.log('console message ----> ' + msg); +}; +page.onLoadStarted = function () { + console.log("load started"); +}; + +page.onLoadFinished = function () { + console.log("load finished"); +}; +page.onUrlChanged = function () { + console.log("onUrlChanged"); +}; + +//打开给定url的页面. +var start = new Date().getTime(); + +page.open(url, function (status) { + if (status === 'success') { + console.log('echarts页面加载完成,加载耗时:' + (new Date().getTime() - start) + ' ms'); + // // 处理页面 + // var pic_url = page.evaluate(function() { + // // DOM操作 + // return document.getElementById('cp_image').getAttribute('src'); + // }); + // 由于echarts动画效果,延迟500毫秒确保图片渲染完毕再调用下载图片方法. + // setTimeout(function () { + // page.evaluate(function () { + // console.log("调用了echarts的下载图片功能."); + // }); + // }, 500); + } else { + console.log("页面加载失败 Page failed to load!"); + } +}); \ No newline at end of file diff --git a/springboot-echarts/src/main/resources/public/static/js/echarts.common.min.js b/springboot-echarts/src/main/resources/public/static/js/echarts.common.min.js new file mode 100644 index 0000000..42b6da5 --- /dev/null +++ b/springboot-echarts/src/main/resources/public/static/js/echarts.common.min.js @@ -0,0 +1 @@ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e(t.echarts={})}(this,function(t){"use strict";function e(t,e){"createCanvas"===t&&(np=null),tp[t]=e}function n(t){if(null==t||"object"!=typeof t)return t;var e=t,i=jf.call(t);if("[object Array]"===i){if(!z(t)){e=[];for(var r=0,o=t.length;rxp||t<-xp}function ft(t){this._target=t.target,this._life=t.life||1e3,this._delay=t.delay||0,this._initialized=!1,this.loop=null!=t.loop&&t.loop,this.gap=t.gap||0,this.easing=t.easing||"Linear",this.onframe=t.onframe,this.ondestroy=t.ondestroy,this.onrestart=t.onrestart,this._pausedTime=0,this._paused=!1}function pt(t){return(t=Math.round(t))<0?0:t>255?255:t}function gt(t){return(t=Math.round(t))<0?0:t>360?360:t}function mt(t){return t<0?0:t>1?1:t}function vt(t){return pt(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100*255:parseInt(t,10))}function yt(t){return mt(t.length&&"%"===t.charAt(t.length-1)?parseFloat(t)/100:parseFloat(t))}function xt(t,e,n){return n<0?n+=1:n>1&&(n-=1),6*n<1?t+(e-t)*n*6:2*n<1?e:3*n<2?t+(e-t)*(2/3-n)*6:t}function _t(t,e,n){return t+(e-t)*n}function wt(t,e,n,i,r){return t[0]=e,t[1]=n,t[2]=i,t[3]=r,t}function bt(t,e){return t[0]=e[0],t[1]=e[1],t[2]=e[2],t[3]=e[3],t}function St(t,e){Pp&&bt(Pp,e),Pp=kp.put(t,Pp||e.slice())}function Mt(t,e){if(t){e=e||[];var n=kp.get(t);if(n)return bt(e,n);var i=(t+="").replace(/ /g,"").toLowerCase();if(i in Dp)return bt(e,Dp[i]),St(t,e),e;if("#"!==i.charAt(0)){var r=i.indexOf("("),o=i.indexOf(")");if(-1!==r&&o+1===i.length){var a=i.substr(0,r),s=i.substr(r+1,o-(r+1)).split(","),l=1;switch(a){case"rgba":if(4!==s.length)return void wt(e,0,0,0,1);l=yt(s.pop());case"rgb":return 3!==s.length?void wt(e,0,0,0,1):(wt(e,vt(s[0]),vt(s[1]),vt(s[2]),l),St(t,e),e);case"hsla":return 4!==s.length?void wt(e,0,0,0,1):(s[3]=yt(s[3]),It(s,e),St(t,e),e);case"hsl":return 3!==s.length?void wt(e,0,0,0,1):(It(s,e),St(t,e),e);default:return}}wt(e,0,0,0,1)}else{if(4===i.length)return(h=parseInt(i.substr(1),16))>=0&&h<=4095?(wt(e,(3840&h)>>4|(3840&h)>>8,240&h|(240&h)>>4,15&h|(15&h)<<4,1),St(t,e),e):void wt(e,0,0,0,1);if(7===i.length){var h=parseInt(i.substr(1),16);return h>=0&&h<=16777215?(wt(e,(16711680&h)>>16,(65280&h)>>8,255&h,1),St(t,e),e):void wt(e,0,0,0,1)}}}}function It(t,e){var n=(parseFloat(t[0])%360+360)%360/360,i=yt(t[1]),r=yt(t[2]),o=r<=.5?r*(i+1):r+i-r*i,a=2*r-o;return e=e||[],wt(e,pt(255*xt(a,o,n+1/3)),pt(255*xt(a,o,n)),pt(255*xt(a,o,n-1/3)),1),4===t.length&&(e[3]=t[3]),e}function Tt(t){if(t){var e,n,i=t[0]/255,r=t[1]/255,o=t[2]/255,a=Math.min(i,r,o),s=Math.max(i,r,o),l=s-a,h=(s+a)/2;if(0===l)e=0,n=0;else{n=h<.5?l/(s+a):l/(2-s-a);var u=((s-i)/6+l/2)/l,c=((s-r)/6+l/2)/l,d=((s-o)/6+l/2)/l;i===s?e=d-c:r===s?e=1/3+u-d:o===s&&(e=2/3+c-u),e<0&&(e+=1),e>1&&(e-=1)}var f=[360*e,n,h];return null!=t[3]&&f.push(t[3]),f}}function Ct(t,e){var n=Mt(t);if(n){for(var i=0;i<3;i++)n[i]=e<0?n[i]*(1-e)|0:(255-n[i])*e+n[i]|0;return Lt(n,4===n.length?"rgba":"rgb")}}function At(t){var e=Mt(t);if(e)return((1<<24)+(e[0]<<16)+(e[1]<<8)+ +e[2]).toString(16).slice(1)}function Dt(t,e,n){if(e&&e.length&&t>=0&&t<=1){n=n||[];var i=t*(e.length-1),r=Math.floor(i),o=Math.ceil(i),a=e[r],s=e[o],l=i-r;return n[0]=pt(_t(a[0],s[0],l)),n[1]=pt(_t(a[1],s[1],l)),n[2]=pt(_t(a[2],s[2],l)),n[3]=mt(_t(a[3],s[3],l)),n}}function kt(t,e,n){if(e&&e.length&&t>=0&&t<=1){var i=t*(e.length-1),r=Math.floor(i),o=Math.ceil(i),a=Mt(e[r]),s=Mt(e[o]),l=i-r,h=Lt([pt(_t(a[0],s[0],l)),pt(_t(a[1],s[1],l)),pt(_t(a[2],s[2],l)),mt(_t(a[3],s[3],l))],"rgba");return n?{color:h,leftIndex:r,rightIndex:o,value:i}:h}}function Pt(t,e){if((t=Mt(t))&&null!=e)return t[3]=mt(e),Lt(t,"rgba")}function Lt(t,e){if(t&&t.length){var n=t[0]+","+t[1]+","+t[2];return"rgba"!==e&&"hsva"!==e&&"hsla"!==e||(n+=","+t[3]),e+"("+n+")"}}function Ot(t,e){return t[e]}function zt(t,e,n){t[e]=n}function Et(t,e,n){return(e-t)*n+t}function Rt(t,e,n){return n>.5?e:t}function Nt(t,e,n,i,r){var o=t.length;if(1==r)for(s=0;sr)t.length=r;else for(a=i;a=0&&!(m[n]<=e);n--);n=Math.min(n,h-2)}else{for(n=k;ne);n++);n=Math.min(n-1,h-2)}k=n,P=e;var i=m[n+1]-m[n];if(0!==i)if(I=(e-m[n])/i,l)if(C=v[n],T=v[0===n?n:n-1],A=v[n>h-2?h-1:n+1],D=v[n>h-3?h-1:n+2],d)Ft(T,C,A,D,I,I*I,I*I*I,a(t,r),g);else{if(f)o=Ft(T,C,A,D,I,I*I,I*I*I,L,1),o=Wt(L);else{if(p)return Rt(C,A,I);o=Gt(T,C,A,D,I,I*I,I*I*I)}s(t,r,o)}else if(d)Nt(v[n],v[n+1],I,a(t,r),g);else{var o;if(f)Nt(v[n],v[n+1],I,L,1),o=Wt(L);else{if(p)return Rt(v[n],v[n+1],I);o=Et(v[n],v[n+1],I)}s(t,r,o)}},ondestroy:n});return e&&"spline"!==e&&(O.easing=e),O}}}function Xt(t,e,n,i){n<0&&(t+=n,n=-n),i<0&&(e+=i,i=-i),this.x=t,this.y=e,this.width=n,this.height=i}function jt(t){for(var e=0;t>=jp;)e|=1&t,t>>=1;return t+e}function Yt(t,e,n,i){var r=e+1;if(r===n)return 1;if(i(t[r++],t[e])<0){for(;r=0;)r++;return r-e}function qt(t,e,n){for(n--;e>>1])<0?l=o:s=o+1;var h=i-s;switch(h){case 3:t[s+3]=t[s+2];case 2:t[s+2]=t[s+1];case 1:t[s+1]=t[s];break;default:for(;h>0;)t[s+h]=t[s+h-1],h--}t[s]=a}}function Kt(t,e,n,i,r,o){var a=0,s=0,l=1;if(o(t,e[n+r])>0){for(s=i-r;l0;)a=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s),a+=r,l+=r}else{for(s=r+1;ls&&(l=s);var h=a;a=r-l,l=r-h}for(a++;a>>1);o(t,e[n+u])>0?a=u+1:l=u}return l}function Qt(t,e,n,i,r,o){var a=0,s=0,l=1;if(o(t,e[n+r])<0){for(s=r+1;ls&&(l=s);var h=a;a=r-l,l=r-h}else{for(s=i-r;l=0;)a=l,(l=1+(l<<1))<=0&&(l=s);l>s&&(l=s),a+=r,l+=r}for(a++;a>>1);o(t,e[n+u])<0?l=u:a=u+1}return l}function Jt(t,e){function n(n){var s=o[n],h=a[n],u=o[n+1],c=a[n+1];a[n]=h+c,n===l-3&&(o[n+1]=o[n+2],a[n+1]=a[n+2]),l--;var d=Qt(t[u],t,s,h,0,e);s+=d,0!==(h-=d)&&0!==(c=Kt(t[s+h-1],t,u,c,c-1,e))&&(h<=c?i(s,h,u,c):r(s,h,u,c))}function i(n,i,r,o){var a=0;for(a=0;a=Yp||f>=Yp);if(p)break;g<0&&(g=0),g+=2}if((s=g)<1&&(s=1),1===i){for(a=0;a=0;a--)t[f+a]=t[d+a];if(0===i){v=!0;break}}if(t[c--]=h[u--],1==--o){v=!0;break}if(0!=(m=o-Kt(t[l],h,0,o,o-1,e))){for(o-=m,f=(c-=m)+1,d=(u-=m)+1,a=0;a=Yp||m>=Yp);if(v)break;p<0&&(p=0),p+=2}if((s=p)<1&&(s=1),1===o){for(f=(c-=i)+1,d=(l-=i)+1,a=i-1;a>=0;a--)t[f+a]=t[d+a];t[c]=h[u]}else{if(0===o)throw new Error;for(d=c-(o-1),a=0;a=0;a--)t[f+a]=t[d+a];t[c]=h[u]}else for(d=c-(o-1),a=0;a1;){var t=l-2;if(t>=1&&a[t-1]<=a[t]+a[t+1]||t>=2&&a[t-2]<=a[t]+a[t-1])a[t-1]a[t+1])break;n(t)}},this.forceMergeRuns=function(){for(;l>1;){var t=l-2;t>0&&a[t-1]s&&(l=s),$t(t,n,n+l,n+o,e),o=l}a.pushRun(n,o),a.mergeRuns(),r-=o,n+=o}while(0!==r);a.forceMergeRuns()}}function ee(t,e){return t.zlevel===e.zlevel?t.z===e.z?t.z2-e.z2:t.z-e.z:t.zlevel-e.zlevel}function ne(t,e,n){var i=null==e.x?0:e.x,r=null==e.x2?1:e.x2,o=null==e.y?0:e.y,a=null==e.y2?0:e.y2;return e.global||(i=i*n.width+n.x,r=r*n.width+n.x,o=o*n.height+n.y,a=a*n.height+n.y),t.createLinearGradient(i,o,r,a)}function ie(t,e,n){var i=n.width,r=n.height,o=Math.min(i,r),a=null==e.x?.5:e.x,s=null==e.y?.5:e.y,l=null==e.r?.5:e.r;return e.global||(a=a*i+n.x,s=s*r+n.y,l*=o),t.createRadialGradient(a,s,0,a,s,l)}function re(){return!1}function oe(t,e,n){var i=ep(),r=e.getWidth(),o=e.getHeight(),a=i.style;return a&&(a.position="absolute",a.left=0,a.top=0,a.width=r+"px",a.height=o+"px",i.setAttribute("data-zr-dom-id",t)),i.width=r*n,i.height=o*n,i}function ae(t){if("string"==typeof t){var e=ag.get(t);return e&&e.image}return t}function se(t,e,n,i,r){if(t){if("string"==typeof t){if(e&&e.__zrImageSrc===t||!n)return e;var o=ag.get(t),a={hostEl:n,cb:i,cbPayload:r};return o?!he(e=o.image)&&o.pending.push(a):(!e&&(e=new Image),e.onload=le,ag.put(t,e.__cachedImgObj={image:e,pending:[a]}),e.src=e.__zrImageSrc=t),e}return t}return e}function le(){var t=this.__cachedImgObj;this.onload=this.__cachedImgObj=null;for(var e=0;ehg&&(lg=0,sg={}),lg++,sg[n]=r,r}function ce(t,e,n,i,r,o,a){return o?fe(t,e,n,i,r,o,a):de(t,e,n,i,r,a)}function de(t,e,n,i,r,o){var a=Se(t,e,r,o),s=ue(t,e);r&&(s+=r[1]+r[3]);var l=a.outerHeight,h=new Xt(pe(0,s,n),ge(0,l,i),s,l);return h.lineHeight=a.lineHeight,h}function fe(t,e,n,i,r,o,a){var s=Me(t,{rich:o,truncate:a,font:e,textAlign:n,textPadding:r}),l=s.outerWidth,h=s.outerHeight;return new Xt(pe(0,l,n),ge(0,h,i),l,h)}function pe(t,e,n){return"right"===n?t-=e:"center"===n&&(t-=e/2),t}function ge(t,e,n){return"middle"===n?t-=e/2:"bottom"===n&&(t-=e),t}function me(t,e,n){var i=e.x,r=e.y,o=e.height,a=e.width,s=o/2,l="left",h="top";switch(t){case"left":i-=n,r+=s,l="right",h="middle";break;case"right":i+=n+a,r+=s,h="middle";break;case"top":i+=a/2,r-=n,l="center",h="bottom";break;case"bottom":i+=a/2,r+=o+n,l="center";break;case"inside":i+=a/2,r+=s,l="center",h="middle";break;case"insideLeft":i+=n,r+=s,h="middle";break;case"insideRight":i+=a-n,r+=s,l="right",h="middle";break;case"insideTop":i+=a/2,r+=n,l="center";break;case"insideBottom":i+=a/2,r+=o-n,l="center",h="bottom";break;case"insideTopLeft":i+=n,r+=n;break;case"insideTopRight":i+=a-n,r+=n,l="right";break;case"insideBottomLeft":i+=n,r+=o-n,h="bottom";break;case"insideBottomRight":i+=a-n,r+=o-n,l="right",h="bottom"}return{x:i,y:r,textAlign:l,textVerticalAlign:h}}function ve(t,e,n,i,r){if(!e)return"";var o=(t+"").split("\n");r=ye(e,n,i,r);for(var a=0,s=o.length;a=a;l++)s-=a;var h=ue(n);return h>s&&(n="",h=0),s=t-h,i.ellipsis=n,i.ellipsisWidth=h,i.contentWidth=s,i.containerWidth=t,i}function xe(t,e){var n=e.containerWidth,i=e.font,r=e.contentWidth;if(!n)return"";var o=ue(t,i);if(o<=n)return t;for(var a=0;;a++){if(o<=r||a>=e.maxIterations){t+=e.ellipsis;break}var s=0===a?_e(t,r,e.ascCharWidth,e.cnCharWidth):o>0?Math.floor(t.length*r/o):0;o=ue(t=t.substr(0,s),i)}return""===t&&(t=e.placeholder),t}function _e(t,e,n,i){for(var r=0,o=0,a=t.length;ol)t="",o=[];else if(null!=h)for(var u=ye(h-(n?n[1]+n[3]:0),e,i.ellipsis,{minChar:i.minChar,placeholder:i.placeholder}),c=0,d=o.length;cr&&Ie(n,t.substring(r,o)),Ie(n,i[2],i[1]),r=ug.lastIndex}rf)return{lines:[],width:0,height:0};P.textWidth=ue(P.text,_);var b=y.textWidth,S=null==b||"auto"===b;if("string"==typeof b&&"%"===b.charAt(b.length-1))P.percentWidth=b,h.push(P),b=0;else{if(S){b=P.textWidth;var M=y.textBackgroundColor,I=M&&M.image;I&&he(I=ae(I))&&(b=Math.max(b,I.width*w/I.height))}var T=x?x[1]+x[3]:0;b+=T;var D=null!=d?d-m:null;null!=D&&Dl&&(n*=l/(c=n+i),i*=l/c),r+o>l&&(r*=l/(c=r+o),o*=l/c),i+r>h&&(i*=h/(c=i+r),r*=h/c),n+o>h&&(n*=h/(c=n+o),o*=h/c),t.moveTo(a+n,s),t.lineTo(a+l-i,s),0!==i&&t.quadraticCurveTo(a+l,s,a+l,s+i),t.lineTo(a+l,s+h-r),0!==r&&t.quadraticCurveTo(a+l,s+h,a+l-r,s+h),t.lineTo(a+o,s+h),0!==o&&t.quadraticCurveTo(a,s+h,a,s+h-o),t.lineTo(a,s+n),0!==n&&t.quadraticCurveTo(a,s,a+n,s)}function Ae(t){return De(t),d(t.rich,De),t}function De(t){if(t){t.font=Te(t);var e=t.textAlign;"middle"===e&&(e="center"),t.textAlign=null==e||fg[e]?e:"left";var n=t.textVerticalAlign||t.textBaseline;"center"===n&&(n="middle"),t.textVerticalAlign=null==n||pg[n]?n:"top",t.textPadding&&(t.textPadding=k(t.textPadding))}}function ke(t,e,n,i,r){i.rich?Le(t,e,n,i,r):Pe(t,e,n,i,r)}function Pe(t,e,n,i,r){var o=Fe(e,"font",i.font||cg),a=i.textPadding,s=t.__textCotentBlock;s&&!t.__dirty||(s=t.__textCotentBlock=Se(n,o,a,i.truncate));var l=s.outerHeight,h=s.lines,u=s.lineHeight,c=Ve(l,i,r),d=c.baseX,f=c.baseY,p=c.textAlign,g=c.textVerticalAlign;ze(e,i,r,d,f);var m=ge(f,l,g),v=d,y=m,x=Re(i);if(x||a){var _=ue(n,o);a&&(_+=a[1]+a[3]);var w=pe(d,_,p);x&&Ne(t,e,i,w,m,_,l),a&&(v=Ze(d,p,a),y+=a[0])}Fe(e,"textAlign",p||"left"),Fe(e,"textBaseline","middle"),Fe(e,"shadowBlur",i.textShadowBlur||0),Fe(e,"shadowColor",i.textShadowColor||"transparent"),Fe(e,"shadowOffsetX",i.textShadowOffsetX||0),Fe(e,"shadowOffsetY",i.textShadowOffsetY||0),y+=u/2;var b=i.textStrokeWidth,S=Ge(i.textStroke,b),M=He(i.textFill);S&&(Fe(e,"lineWidth",b),Fe(e,"strokeStyle",S)),M&&Fe(e,"fillStyle",M);for(var I=0;I=0&&"right"===(_=b[D]).textAlign;)Ee(t,e,_,i,M,v,A,"right"),I-=_.width,A-=_.width,D--;for(C+=(o-(C-m)-(y-A)-I)/2;T<=D;)Ee(t,e,_=b[T],i,M,v,C+_.width/2,"center"),C+=_.width,T++;v+=M}}function ze(t,e,n,i,r){if(n&&e.textRotation){var o=e.textOrigin;"center"===o?(i=n.width/2+n.x,r=n.height/2+n.y):o&&(i=o[0]+n.x,r=o[1]+n.y),t.translate(i,r),t.rotate(-e.textRotation),t.translate(-i,-r)}}function Ee(t,e,n,i,r,o,a,s){var l=i.rich[n.styleName]||{},h=n.textVerticalAlign,u=o+r/2;"top"===h?u=o+n.height/2:"bottom"===h&&(u=o+r-n.height/2),!n.isLineHolder&&Re(l)&&Ne(t,e,l,"right"===s?a-n.width:"center"===s?a-n.width/2:a,u-n.height/2,n.width,n.height);var c=n.textPadding;c&&(a=Ze(a,s,c),u-=n.height/2-c[2]-n.textHeight/2),Fe(e,"shadowBlur",A(l.textShadowBlur,i.textShadowBlur,0)),Fe(e,"shadowColor",l.textShadowColor||i.textShadowColor||"transparent"),Fe(e,"shadowOffsetX",A(l.textShadowOffsetX,i.textShadowOffsetX,0)),Fe(e,"shadowOffsetY",A(l.textShadowOffsetY,i.textShadowOffsetY,0)),Fe(e,"textAlign",s),Fe(e,"textBaseline","middle"),Fe(e,"font",n.font||cg);var d=Ge(l.textStroke||i.textStroke,p),f=He(l.textFill||i.textFill),p=C(l.textStrokeWidth,i.textStrokeWidth);d&&(Fe(e,"lineWidth",p),Fe(e,"strokeStyle",d),e.strokeText(n.text,a,u)),f&&(Fe(e,"fillStyle",f),e.fillText(n.text,a,u))}function Re(t){return t.textBackgroundColor||t.textBorderWidth&&t.textBorderColor}function Ne(t,e,n,i,r,o,a){var s=n.textBackgroundColor,l=n.textBorderWidth,h=n.textBorderColor,u=_(s);if(Fe(e,"shadowBlur",n.textBoxShadowBlur||0),Fe(e,"shadowColor",n.textBoxShadowColor||"transparent"),Fe(e,"shadowOffsetX",n.textBoxShadowOffsetX||0),Fe(e,"shadowOffsetY",n.textBoxShadowOffsetY||0),u||l&&h){e.beginPath();var c=n.textBorderRadius;c?Ce(e,{x:i,y:r,width:o,height:a,r:c}):e.rect(i,r,o,a),e.closePath()}if(u)Fe(e,"fillStyle",s),e.fill();else if(w(s)){var d=s.image;(d=se(d,null,t,Be,s))&&he(d)&&e.drawImage(d,i,r,o,a)}l&&h&&(Fe(e,"lineWidth",l),Fe(e,"strokeStyle",h),e.stroke())}function Be(t,e){e.image=t}function Ve(t,e,n){var i=e.x||0,r=e.y||0,o=e.textAlign,a=e.textVerticalAlign;if(n){var s=e.textPosition;if(s instanceof Array)i=n.x+We(s[0],n.width),r=n.y+We(s[1],n.height);else{var l=me(s,n,e.textDistance);i=l.x,r=l.y,o=o||l.textAlign,a=a||l.textVerticalAlign}var h=e.textOffset;h&&(i+=h[0],r+=h[1])}return{baseX:i,baseY:r,textAlign:o,textVerticalAlign:a}}function Fe(t,e,n){return t[e]=Kp(t,e,n),t[e]}function Ge(t,e){return null==t||e<=0||"transparent"===t||"none"===t?null:t.image||t.colorStops?"#000":t}function He(t){return null==t||"none"===t?null:t.image||t.colorStops?"#000":t}function We(t,e){return"string"==typeof t?t.lastIndexOf("%")>=0?parseFloat(t)/100*e:parseFloat(t):t}function Ze(t,e,n){return"right"===e?t-n[1]:"center"===e?t+n[3]/2-n[1]/2:t+n[3]}function Ue(t,e){return null!=t&&(t||e.textBackgroundColor||e.textBorderWidth&&e.textBorderColor||e.textPadding)}function Xe(t){t=t||{},Hp.call(this,t);for(var e in t)t.hasOwnProperty(e)&&"style"!==e&&(this[e]=t[e]);this.style=new Jp(t.style,this),this._rect=null,this.__clipPaths=[]}function je(t){Xe.call(this,t)}function Ye(t){return parseInt(t,10)}function qe(t){return!!t&&(!!t.__builtin__||"function"==typeof t.resize&&"function"==typeof t.refresh)}function $e(t,e,n){return vg.copy(t.getBoundingRect()),t.transform&&vg.applyTransform(t.transform),yg.width=e,yg.height=n,!vg.intersect(yg)}function Ke(t,e){if(t==e)return!1;if(!t||!e||t.length!==e.length)return!0;for(var n=0;n=0){var r="touchend"!=i?e.targetTouches[0]:e.changedTouches[0];r&&en(t,r,e,n)}else en(t,e,e,n),e.zrDelta=e.wheelDelta?e.wheelDelta/120:-(e.detail||0)/3;var o=e.button;return null==e.which&&void 0!==o&&wg.test(e.type)&&(e.which=1&o?1:2&o?3:4&o?2:0),e}function on(t,e,n){_g?t.addEventListener(e,n):t.attachEvent("on"+e,n)}function an(t,e,n){_g?t.removeEventListener(e,n):t.detachEvent("on"+e,n)}function sn(t){return t.which>1}function ln(t){var e=t[1][0]-t[0][0],n=t[1][1]-t[0][1];return Math.sqrt(e*e+n*n)}function hn(t){return[(t[0][0]+t[1][0])/2,(t[0][1]+t[1][1])/2]}function un(t){return"mousewheel"===t&&Zf.browser.firefox?"DOMMouseScroll":t}function cn(t,e,n){var i=t._gestureMgr;"start"===n&&i.clear();var r=i.recognize(e,t.handler.findHover(e.zrX,e.zrY,null).target,t.dom);if("end"===n&&i.clear(),r){var o=r.type;e.gestureEvent=o,t.handler.dispatchToElement({target:r.target},o,r.event)}}function dn(t){t._touching=!0,clearTimeout(t._touchTimer),t._touchTimer=setTimeout(function(){t._touching=!1},700)}function fn(t){var e=t.pointerType;return"pen"===e||"touch"===e}function pn(t){function e(t,e){return function(){if(!e._touching)return t.apply(e,arguments)}}d(Cg,function(e){t._handlers[e]=m(kg[e],t)}),d(Dg,function(e){t._handlers[e]=m(kg[e],t)}),d(Tg,function(n){t._handlers[n]=e(kg[n],t)})}function gn(t){function e(e,n){d(e,function(e){on(t,un(e),n._handlers[e])},n)}dp.call(this),this.dom=t,this._touching=!1,this._touchTimer,this._gestureMgr=new Mg,this._handlers={},pn(this),Zf.pointerEventsSupported?e(Dg,this):(Zf.touchEventsSupported&&e(Cg,this),e(Tg,this))}function mn(t,e){var n=new Eg(Hf(),t,e);return zg[n.id]=n,n}function vn(t,e){Og[t]=e}function yn(t){delete zg[t]}function xn(t){return t instanceof Array?t:null==t?[]:[t]}function _n(t,e,n){if(t){t[e]=t[e]||{},t.emphasis=t.emphasis||{},t.emphasis[e]=t.emphasis[e]||{};for(var i=0,r=n.length;i=n.length&&n.push({option:t})}}),n}function Mn(t){var e=R();Ng(t,function(t,n){var i=t.exist;i&&e.set(i.id,t)}),Ng(t,function(t,n){var i=t.option;P(!i||null==i.id||!e.get(i.id)||e.get(i.id)===t,"id duplicates: "+(i&&i.id)),i&&null!=i.id&&e.set(i.id,t),!t.keyInfo&&(t.keyInfo={})}),Ng(t,function(t,n){var i=t.exist,r=t.option,o=t.keyInfo;if(Bg(r)){if(o.name=null!=r.name?r.name+"":i?i.name:Fg,i)o.id=i.id;else if(null!=r.id)o.id=r.id+"";else{var a=0;do{o.id="\0"+o.name+"\0"+a++}while(e.get(o.id))}e.set(o.id,t)}})}function In(t){return Bg(t)&&t.id&&0===(t.id+"").indexOf("\0_ec_\0")}function Tn(t,e){return null!=e.dataIndexInside?e.dataIndexInside:null!=e.dataIndex?y(e.dataIndex)?f(e.dataIndex,function(e){return t.indexOfRawIndex(e)}):t.indexOfRawIndex(e.dataIndex):null!=e.name?y(e.name)?f(e.name,function(e){return t.indexOfName(e)}):t.indexOfName(e.name):void 0}function Cn(){var t="__\0ec_inner_"+Hg+++"_"+Math.random().toFixed(5);return function(e){return e[t]||(e[t]={})}}function An(t,e,n){if(_(e)){var i={};i[e+"Index"]=0,e=i}var r=n&&n.defaultMainType;!r||Dn(e,r+"Index")||Dn(e,r+"Id")||Dn(e,r+"Name")||(e[r+"Index"]=0);var o={};return Ng(e,function(i,r){var i=e[r];if("dataIndex"!==r&&"dataIndexInside"!==r){var a=r.match(/^(\w+)(Index|Id|Name)$/)||[],s=a[1],h=(a[2]||"").toLowerCase();if(!(!s||!h||null==i||"index"===h&&"none"===i||n&&n.includeMainTypes&&l(n.includeMainTypes,s)<0)){var u={mainType:s};"index"===h&&"all"===i||(u[h]=i);var c=t.queryComponents(u);o[s+"Models"]=c,o[s+"Model"]=c[0]}}else o[r]=i}),o}function Dn(t,e){return t&&t.hasOwnProperty(e)}function kn(t,e,n){t.setAttribute?t.setAttribute(e,n):t[e]=n}function Pn(t,e){return t.getAttribute?t.getAttribute(e):t[e]}function Ln(t){var e={main:"",sub:""};return t&&(t=t.split(Wg),e.main=t[0]||"",e.sub=t[1]||""),e}function On(t){P(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(t),'componentType "'+t+'" illegal')}function zn(t,e){t.$constructor=t,t.extend=function(t){var e=this,n=function(){t.$constructor?t.$constructor.apply(this,arguments):e.apply(this,arguments)};return o(n.prototype,t),n.extend=this.extend,n.superCall=Rn,n.superApply=Nn,h(n,this),n.superClass=e,n}}function En(t){var e=["__\0is_clz",Ug++,Math.random().toFixed(3)].join("_");t.prototype[e]=!0,t.isInstance=function(t){return!(!t||!t[e])}}function Rn(t,e){var n=D(arguments,2);return this.superClass.prototype[e].apply(t,n)}function Nn(t,e,n){return this.superClass.prototype[e].apply(t,n)}function Bn(t,e){function n(t){var e=i[t.main];return e&&e[Zg]||((e=i[t.main]={})[Zg]=!0),e}e=e||{};var i={};if(t.registerClass=function(t,e){return e&&(On(e),(e=Ln(e)).sub?e.sub!==Zg&&(n(e)[e.sub]=t):i[e.main]=t),t},t.getClass=function(t,e,n){var r=i[t];if(r&&r[Zg]&&(r=e?r[e]:null),n&&!r)throw new Error(e?"Component "+t+"."+(e||"")+" not exists. Load it first.":t+".type should be specified.");return r},t.getClassesByMainType=function(t){t=Ln(t);var e=[],n=i[t.main];return n&&n[Zg]?d(n,function(t,n){n!==Zg&&e.push(t)}):e.push(n),e},t.hasClass=function(t){return t=Ln(t),!!i[t.main]},t.getAllClassMainTypes=function(){var t=[];return d(i,function(e,n){t.push(n)}),t},t.hasSubTypes=function(t){t=Ln(t);var e=i[t.main];return e&&e[Zg]},t.parseClassType=Ln,e.registerWhenExtend){var r=t.extend;r&&(t.extend=function(e){var n=r.call(this,e);return t.registerClass(n,e.type)})}return t}function Vn(t){return t>-Jg&&tJg||t<-Jg}function Gn(t,e,n,i,r){var o=1-r;return o*o*(o*t+3*r*e)+r*r*(r*i+3*o*n)}function Hn(t,e,n,i,r){var o=1-r;return 3*(((e-t)*o+2*(n-e)*r)*o+(i-n)*r*r)}function Wn(t,e,n,i,r,o){var a=i+3*(e-n)-t,s=3*(n-2*e+t),l=3*(e-t),h=t-r,u=s*s-3*a*l,c=s*l-9*a*h,d=l*l-3*s*h,f=0;if(Vn(u)&&Vn(c))Vn(s)?o[0]=0:(M=-l/s)>=0&&M<=1&&(o[f++]=M);else{var p=c*c-4*u*d;if(Vn(p)){var g=c/u,m=-g/2;(M=-s/a+g)>=0&&M<=1&&(o[f++]=M),m>=0&&m<=1&&(o[f++]=m)}else if(p>0){var v=Qg(p),y=u*s+1.5*a*(-c+v),x=u*s+1.5*a*(-c-v);(M=(-s-((y=y<0?-Kg(-y,nm):Kg(y,nm))+(x=x<0?-Kg(-x,nm):Kg(x,nm))))/(3*a))>=0&&M<=1&&(o[f++]=M)}else{var _=(2*u*s-3*a*c)/(2*Qg(u*u*u)),w=Math.acos(_)/3,b=Qg(u),S=Math.cos(w),M=(-s-2*b*S)/(3*a),m=(-s+b*(S+em*Math.sin(w)))/(3*a),I=(-s+b*(S-em*Math.sin(w)))/(3*a);M>=0&&M<=1&&(o[f++]=M),m>=0&&m<=1&&(o[f++]=m),I>=0&&I<=1&&(o[f++]=I)}}return f}function Zn(t,e,n,i,r){var o=6*n-12*e+6*t,a=9*e+3*i-3*t-9*n,s=3*e-3*t,l=0;if(Vn(a))Fn(o)&&(c=-s/o)>=0&&c<=1&&(r[l++]=c);else{var h=o*o-4*a*s;if(Vn(h))r[0]=-o/(2*a);else if(h>0){var u=Qg(h),c=(-o+u)/(2*a),d=(-o-u)/(2*a);c>=0&&c<=1&&(r[l++]=c),d>=0&&d<=1&&(r[l++]=d)}}return l}function Un(t,e,n,i,r,o){var a=(e-t)*r+t,s=(n-e)*r+e,l=(i-n)*r+n,h=(s-a)*r+a,u=(l-s)*r+s,c=(u-h)*r+h;o[0]=t,o[1]=a,o[2]=h,o[3]=c,o[4]=c,o[5]=u,o[6]=l,o[7]=i}function Xn(t,e,n,i,r,o,a,s,l,h,u){var c,d,f,p,g,m=.005,v=1/0;im[0]=l,im[1]=h;for(var y=0;y<1;y+=.05)rm[0]=Gn(t,n,r,a,y),rm[1]=Gn(e,i,o,s,y),(p=hp(im,rm))=0&&p=0&&c<=1&&(r[l++]=c);else{var h=a*a-4*o*s;if(Vn(h))(c=-a/(2*o))>=0&&c<=1&&(r[l++]=c);else if(h>0){var u=Qg(h),c=(-a+u)/(2*o),d=(-a-u)/(2*o);c>=0&&c<=1&&(r[l++]=c),d>=0&&d<=1&&(r[l++]=d)}}return l}function $n(t,e,n){var i=t+n-2*e;return 0===i?.5:(t-e)/i}function Kn(t,e,n,i,r){var o=(e-t)*i+t,a=(n-e)*i+e,s=(a-o)*i+o;r[0]=t,r[1]=o,r[2]=s,r[3]=s,r[4]=a,r[5]=n}function Qn(t,e,n,i,r,o,a,s,l){var h,u=.005,c=1/0;im[0]=a,im[1]=s;for(var d=0;d<1;d+=.05)rm[0]=jn(t,n,r,d),rm[1]=jn(e,i,o,d),(m=hp(im,rm))=0&&m1e-4)return s[0]=t-n,s[1]=e-i,l[0]=t+n,void(l[1]=e+i);if(cm[0]=hm(r)*n+t,cm[1]=lm(r)*i+e,dm[0]=hm(o)*n+t,dm[1]=lm(o)*i+e,h(s,cm,dm),u(l,cm,dm),(r%=um)<0&&(r+=um),(o%=um)<0&&(o+=um),r>o&&!a?o+=um:rr&&(fm[0]=hm(f)*n+t,fm[1]=lm(f)*i+e,h(s,fm,s),u(l,fm,l))}function ri(t,e,n,i,r,o,a){if(0===r)return!1;var s=r,l=0,h=t;if(a>e+s&&a>i+s||at+s&&o>n+s||oe+c&&u>i+c&&u>o+c&&u>s+c||ut+c&&h>n+c&&h>r+c&&h>a+c||he+h&&l>i+h&&l>o+h||lt+h&&s>n+h&&s>r+h||sn||u+hr&&(r+=km);var d=Math.atan2(l,s);return d<0&&(d+=km),d>=i&&d<=r||d+km>=i&&d+km<=r}function hi(t,e,n,i,r,o){if(o>e&&o>i||or?a:0}function ui(t,e){return Math.abs(t-e)e&&h>i&&h>o&&h>s||h1&&ci(),c=Gn(e,i,o,s,Em[0]),p>1&&(d=Gn(e,i,o,s,Em[1]))),2==p?me&&s>i&&s>o||s=0&&h<=1){for(var u=0,c=jn(e,i,o,h),d=0;dn||s<-n)return 0;h=Math.sqrt(n*n-s*s);zm[0]=-h,zm[1]=h;var l=Math.abs(i-r);if(l<1e-4)return 0;if(l%Lm<1e-4){i=0,r=Lm;p=o?1:-1;return a>=zm[0]+t&&a<=zm[1]+t?p:0}if(o){var h=i;i=si(r),r=si(h)}else i=si(i),r=si(r);i>r&&(r+=Lm);for(var u=0,c=0;c<2;c++){var d=zm[c];if(d+t>a){var f=Math.atan2(s,d),p=o?1:-1;f<0&&(f=Lm+f),(f>=i&&f<=r||f+Lm>=i&&f+Lm<=r)&&(f>Math.PI/2&&f<1.5*Math.PI&&(p=-p),u+=p)}}return u}function gi(t,e,n,i,r){for(var o=0,a=0,s=0,l=0,h=0,u=0;u1&&(n||(o+=hi(a,s,l,h,i,r))),1==u&&(l=a=t[u],h=s=t[u+1]),c){case Pm.M:a=l=t[u++],s=h=t[u++];break;case Pm.L:if(n){if(ri(a,s,t[u],t[u+1],e,i,r))return!0}else o+=hi(a,s,t[u],t[u+1],i,r)||0;a=t[u++],s=t[u++];break;case Pm.C:if(n){if(oi(a,s,t[u++],t[u++],t[u++],t[u++],t[u],t[u+1],e,i,r))return!0}else o+=di(a,s,t[u++],t[u++],t[u++],t[u++],t[u],t[u+1],i,r)||0;a=t[u++],s=t[u++];break;case Pm.Q:if(n){if(ai(a,s,t[u++],t[u++],t[u],t[u+1],e,i,r))return!0}else o+=fi(a,s,t[u++],t[u++],t[u],t[u+1],i,r)||0;a=t[u++],s=t[u++];break;case Pm.A:var d=t[u++],f=t[u++],p=t[u++],g=t[u++],m=t[u++],v=t[u++],y=(t[u++],1-t[u++]),x=Math.cos(m)*p+d,_=Math.sin(m)*g+f;u>1?o+=hi(a,s,x,_,i,r):(l=x,h=_);var w=(i-d)*g/p+d;if(n){if(li(d,f,g,m,m+v,y,e,w,r))return!0}else o+=pi(d,f,g,m,m+v,y,w,r);a=Math.cos(m+v)*p+d,s=Math.sin(m+v)*g+f;break;case Pm.R:l=a=t[u++],h=s=t[u++];var x=l+t[u++],_=h+t[u++];if(n){if(ri(l,h,x,h,e,i,r)||ri(x,h,x,_,e,i,r)||ri(x,_,l,_,e,i,r)||ri(l,_,l,h,e,i,r))return!0}else o+=hi(x,h,x,_,i,r),o+=hi(l,_,l,h,i,r);break;case Pm.Z:if(n){if(ri(a,s,l,h,e,i,r))return!0}else o+=hi(a,s,l,h,i,r);a=l,s=h}}return n||ui(s,h)||(o+=hi(a,s,l,h,i,r)||0),0!==o}function mi(t,e,n){return gi(t,0,!1,e,n)}function vi(t,e,n,i){return gi(t,e,!0,n,i)}function yi(t){Xe.call(this,t),this.path=null}function xi(t,e,n,i,r,o,a,s,l,h,u){var c=l*(Ym/180),d=jm(c)*(t-n)/2+Xm(c)*(e-i)/2,f=-1*Xm(c)*(t-n)/2+jm(c)*(e-i)/2,p=d*d/(a*a)+f*f/(s*s);p>1&&(a*=Um(p),s*=Um(p));var g=(r===o?-1:1)*Um((a*a*(s*s)-a*a*(f*f)-s*s*(d*d))/(a*a*(f*f)+s*s*(d*d)))||0,m=g*a*f/s,v=g*-s*d/a,y=(t+n)/2+jm(c)*m-Xm(c)*v,x=(e+i)/2+Xm(c)*m+jm(c)*v,_=Km([1,0],[(d-m)/a,(f-v)/s]),w=[(d-m)/a,(f-v)/s],b=[(-1*d-m)/a,(-1*f-v)/s],S=Km(w,b);$m(w,b)<=-1&&(S=Ym),$m(w,b)>=1&&(S=0),0===o&&S>0&&(S-=2*Ym),1===o&&S<0&&(S+=2*Ym),u.addData(h,y,x,a,s,_,S,c,o)}function _i(t){if(!t)return[];var e,n=t.replace(/-/g," -").replace(/ /g," ").replace(/ /g,",").replace(/,,/g,",");for(e=0;e0&&""===f[0]&&f.shift();for(var p=0;p=2){if(r&&"spline"!==r){var o=ov(i,r,n,e.smoothConstraint);t.moveTo(i[0][0],i[0][1]);for(var a=i.length,s=0;s<(n?a:a-1);s++){var l=o[2*s],h=o[2*s+1],u=i[(s+1)%a];t.bezierCurveTo(l[0],l[1],h[0],h[1],u[0],u[1])}}else{"spline"===r&&(i=rv(i,n)),t.moveTo(i[0][0],i[0][1]);for(var s=1,c=i.length;s=0)&&(i={textFill:null,textStroke:t.textStroke,textStrokeWidth:t.textStrokeWidth},t.textFill="#fff",null==t.textStroke&&(t.textStroke=n.autoColor,null==t.textStrokeWidth&&(t.textStrokeWidth=2))),i}function nr(t){var e=t.insideRollback;e&&(t.textFill=e.textFill,t.textStroke=e.textStroke,t.textStrokeWidth=e.textStrokeWidth)}function ir(t,e){var n=e||e.getModel("textStyle");return L([t.fontStyle||n&&n.getShallow("fontStyle")||"",t.fontWeight||n&&n.getShallow("fontWeight")||"",(t.fontSize||n&&n.getShallow("fontSize")||12)+"px",t.fontFamily||n&&n.getShallow("fontFamily")||"sans-serif"].join(" "))}function rr(t,e,n,i,r,o){if("function"==typeof r&&(o=r,r=null),i&&i.isAnimationEnabled()){var a=t?"Update":"",s=i.getShallow("animationDuration"+a),l=i.getShallow("animationEasing"+a),h=i.getShallow("animationDelay"+a);"function"==typeof h&&(h=h(r,i.getAnimationDelayParams?i.getAnimationDelayParams(e,r):null)),"function"==typeof s&&(s=s(r)),s>0?e.animateTo(n,s,h||0,l,o,!!o):(e.stopAnimation(),e.attr(n),o&&o())}else e.stopAnimation(),e.attr(n),o&&o()}function or(t,e,n,i,r){rr(!0,t,e,n,i,r)}function ar(t,e,n,i,r){rr(!1,t,e,n,i,r)}function sr(t,e){for(var n=ot([]);t&&t!==e;)st(n,t.getLocalTransform(),n),t=t.parent;return n}function lr(t,e,n){return e&&!c(e)&&(e=_p.getLocalTransform(e)),n&&(e=ct([],e)),$([],t,e)}function hr(t,e,n){var i=0===e[4]||0===e[5]||0===e[0]?1:Math.abs(2*e[4]/e[0]),r=0===e[4]||0===e[5]||0===e[2]?1:Math.abs(2*e[4]/e[2]),o=["left"===t?-i:"right"===t?i:0,"top"===t?-r:"bottom"===t?r:0];return o=lr(o,e,n),Math.abs(o[0])>Math.abs(o[1])?o[0]>0?"right":"left":o[1]>0?"bottom":"top"}function ur(t,e,n,i){function r(t){var e={position:F(t.position),rotation:t.rotation};return t.shape&&(e.shape=o({},t.shape)),e}if(t&&e){var a=function(t){var e={};return t.traverse(function(t){!t.isGroup&&t.anid&&(e[t.anid]=t)}),e}(t);e.traverse(function(t){if(!t.isGroup&&t.anid){var e=a[t.anid];if(e){var i=r(t);t.attr(r(e)),or(t,i,n,t.dataIndex)}}})}}function cr(t,e){return f(t,function(t){var n=t[0];n=xv(n,e.x),n=_v(n,e.x+e.width);var i=t[1];return i=xv(i,e.y),i=_v(i,e.y+e.height),[n,i]})}function dr(t,e,n){var i=(e=o({rectHover:!0},e)).style={strokeNoScale:!0};if(n=n||{x:-1,y:-1,width:2,height:2},t)return 0===t.indexOf("image://")?(i.image=t.slice(8),a(i,n),new je(e)):Di(t.replace("path://",""),e,n,"center")}function fr(t,e,n){this.parentModel=e,this.ecModel=n,this.option=t}function pr(t,e,n){for(var i=0;i0){if(t<=e[0])return n[0];if(t>=e[1])return n[1]}else{if(t>=e[0])return n[0];if(t<=e[1])return n[1]}else{if(t===e[0])return n[0];if(t===e[1])return n[1]}return(t-e[0])/r*o+n[0]}function xr(t,e){switch(t){case"center":case"middle":t="50%";break;case"left":case"top":t="0%";break;case"right":case"bottom":t="100%"}return"string"==typeof t?vr(t).match(/%$/)?parseFloat(t)/100*e:parseFloat(t):null==t?NaN:+t}function _r(t,e,n){return null==e&&(e=10),e=Math.min(Math.max(0,e),20),t=(+t).toFixed(e),n?t:+t}function wr(t){return t.sort(function(t,e){return t-e}),t}function br(t){if(t=+t,isNaN(t))return 0;for(var e=1,n=0;Math.round(t*e)/e!==t;)e*=10,n++;return n}function Sr(t){var e=t.toString(),n=e.indexOf("e");if(n>0){var i=+e.slice(n+1);return i<0?-i:0}var r=e.indexOf(".");return r<0?0:e.length-1-r}function Mr(t,e){var n=Math.log,i=Math.LN10,r=Math.floor(n(t[1]-t[0])/i),o=Math.round(n(Math.abs(e[1]-e[0]))/i),a=Math.min(Math.max(-r+o,0),20);return isFinite(a)?a:20}function Ir(t,e,n){if(!t[e])return 0;var i=p(t,function(t,e){return t+(isNaN(e)?0:e)},0);if(0===i)return 0;for(var r=Math.pow(10,n),o=f(t,function(t){return(isNaN(t)?0:t)/i*r*100}),a=100*r,s=f(o,function(t){return Math.floor(t)}),l=p(s,function(t,e){return t+e},0),h=f(o,function(t,e){return t-s[e]});lu&&(u=h[d],c=d);++s[c],h[c]=0,++l}return s[e]/r}function Tr(t){var e=2*Math.PI;return(t%e+e)%e}function Cr(t){return t>-kv&&t=-20?+t.toFixed(i<0?-i:0):t}function Lr(t){return isNaN(t)?"-":(t=(t+"").split("."))[0].replace(/(\d{1,3})(?=(?:\d{3})+(?!\d))/g,"$1,")+(t.length>1?"."+t[1]:"")}function Or(t,e){return t=(t||"").toLowerCase().replace(/-(.)/g,function(t,e){return e.toUpperCase()}),e&&t&&(t=t.charAt(0).toUpperCase()+t.slice(1)),t}function zr(t){return String(t).replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'")}function Er(t,e,n){y(e)||(e=[e]);var i=e.length;if(!i)return"";for(var r=e[0].$vars||[],o=0;o':'':""}function Nr(t,e,n){"week"!==t&&"month"!==t&&"quarter"!==t&&"half-year"!==t&&"year"!==t||(t="MM-dd\nyyyy");var i=Ar(e),r=n?"UTC":"",o=i["get"+r+"FullYear"](),a=i["get"+r+"Month"]()+1,s=i["get"+r+"Date"](),l=i["get"+r+"Hours"](),h=i["get"+r+"Minutes"](),u=i["get"+r+"Seconds"]();return t=t.replace("MM",Rv(a)).replace("M",a).replace("yyyy",o).replace("yy",o%100).replace("dd",Rv(s)).replace("d",s).replace("hh",Rv(l)).replace("h",l).replace("mm",Rv(h)).replace("m",h).replace("ss",Rv(u)).replace("s",u)}function Br(t){return t?t.charAt(0).toUpperCase()+t.substr(1):t}function Vr(t,e,n,i,r){var o=0,a=0;null==i&&(i=1/0),null==r&&(r=1/0);var s=0;e.eachChild(function(l,h){var u,c,d=l.position,f=l.getBoundingRect(),p=e.childAt(h+1),g=p&&p.getBoundingRect();if("horizontal"===t){var m=f.width+(g?-g.x+f.x:0);(u=o+m)>i||l.newline?(o=0,u=m,a+=s+n,s=f.height):s=Math.max(s,f.height)}else{var v=f.height+(g?-g.y+f.y:0);(c=a+v)>r||l.newline?(o+=s+n,a=0,c=v,s=f.width):s=Math.max(s,f.width)}l.newline||(d[0]=o,d[1]=a,"horizontal"===t?o=u+n:a=c+n)})}function Fr(t,e,n){n=Ov(n||0);var i=e.width,r=e.height,o=xr(t.left,i),a=xr(t.top,r),s=xr(t.right,i),l=xr(t.bottom,r),h=xr(t.width,i),u=xr(t.height,r),c=n[2]+n[0],d=n[1]+n[3],f=t.aspect;switch(isNaN(h)&&(h=i-s-d-o),isNaN(u)&&(u=r-l-c-a),null!=f&&(isNaN(h)&&isNaN(u)&&(f>i/r?h=.8*i:u=.8*r),isNaN(h)&&(h=f*u),isNaN(u)&&(u=h/f)),isNaN(o)&&(o=i-s-h-d),isNaN(a)&&(a=r-l-u-c),t.left||t.right){case"center":o=i/2-h/2-n[3];break;case"right":o=i-h-d}switch(t.top||t.bottom){case"middle":case"center":a=r/2-u/2-n[0];break;case"bottom":a=r-u-c}o=o||0,a=a||0,isNaN(h)&&(h=i-d-o-(s||0)),isNaN(u)&&(u=r-c-a-(l||0));var p=new Xt(o+n[3],a+n[0],h,u);return p.margin=n,p}function Gr(t,e,n,i,r){var o=!r||!r.hv||r.hv[0],s=!r||!r.hv||r.hv[1],l=r&&r.boundingMode||"all";if(o||s){var h;if("raw"===l)h="group"===t.type?new Xt(0,0,+e.width||0,+e.height||0):t.getBoundingRect();else if(h=t.getBoundingRect(),t.needLocalTransform()){var u=t.getLocalTransform();(h=h.clone()).applyTransform(u)}e=Fr(a({width:h.width,height:h.height},e),n,i);var c=t.position,d=o?e.x-h.x:0,f=s?e.y-h.y:0;t.attr("position","raw"===l?[d,f]:[c[0]+d,c[1]+f])}}function Hr(t,e,n){function i(n,i){var a={},l=0,h={},u=0;if(Fv(n,function(e){h[e]=t[e]}),Fv(n,function(t){r(e,t)&&(a[t]=h[t]=e[t]),o(a,t)&&l++,o(h,t)&&u++}),s[i])return o(e,n[1])?h[n[2]]=null:o(e,n[2])&&(h[n[1]]=null),h;if(2!==u&&l){if(l>=2)return a;for(var c=0;ce)return t[i];return t[n-1]}function Xr(t){var e=t.get("coordinateSystem"),n={coordSysName:e,coordSysDims:[],axisMap:R(),categoryAxisMap:R()},i=Kv[e];if(i)return i(t,n,n.axisMap,n.categoryAxisMap),n}function jr(t){return"category"===t.get("type")}function Yr(t){this.fromDataset=t.fromDataset,this.data=t.data||(t.sourceFormat===ey?{}:[]),this.sourceFormat=t.sourceFormat||ny,this.seriesLayoutBy=t.seriesLayoutBy||ry,this.dimensionsDefine=t.dimensionsDefine,this.encodeDefine=t.encodeDefine&&R(t.encodeDefine),this.startIndex=t.startIndex||0,this.dimensionsDetectCount=t.dimensionsDetectCount}function qr(t){var e=t.option.source,n=ny;if(S(e))n=iy;else if(y(e))for(var i=0,r=e.length;i=e:"max"===n?t<=e:t===e}function wo(t,e){return t.join(",")===e.join(",")}function bo(t,e){cy(e=e||{},function(e,n){if(null!=e){var i=t[n];if(Xv.hasClass(n)){e=xn(e);var r=Sn(i=xn(i),e);t[n]=fy(r,function(t){return t.option&&t.exist?py(t.exist,t.option,!0):t.exist||t.option})}else t[n]=py(i,e,!0)}})}function So(t){var e=t&&t.itemStyle;if(e)for(var n=0,r=yy.length;ne.outputData.count()&&e.model.getRawData().cloneShallow(e.outputData)}function Ko(t,e){d(t.CHANGABLE_METHODS,function(n){t.wrapMethod(n,v(Qo,e))})}function Qo(t){var e=Jo(t);e&&e.setOutputEnd(this.count())}function Jo(t){var e=(t.ecModel||{}).scheduler,n=e&&e.getPipeline(t.uid);if(n){var i=n.currentTask;if(i){var r=i.agentStubMap;r&&(i=r.get(t.uid))}return i}}function ta(){this.group=new Xp,this.uid=mr("viewChart"),this.renderTask=Wo({plan:ia,reset:ra}),this.renderTask.context={view:this}}function ea(t,e){if(t&&(t.trigger(e),"group"===t.type))for(var n=0;n=0?i():c=setTimeout(i,-o),h=r};return d.clear=function(){c&&(clearTimeout(c),c=null)},d.debounceNextCall=function(t){l=t},d}function sa(t,e,n,i){var r=t[e];if(r){var o=r[By]||r,a=r[Fy];if(r[Vy]!==n||a!==i){if(null==n||!i)return t[e]=o;(r=t[e]=aa(o,n,"debounce"===i))[By]=o,r[Fy]=i,r[Vy]=n}return r}}function la(t,e){var n=t[e];n&&n[By]&&(t[e]=n[By])}function ha(t,e){this.ecInstance=t,this.api=e,this.unfinished,this._stageTaskMap=R()}function ua(t,e,n,i,r){function o(t,e){return t.setDirty&&(!t.dirtyMap||t.dirtyMap.get(e.__pipeline.id))}r=r||{};var a;d(e,function(e,s){if(!r.visualType||r.visualType===e.visualType){var l=t._stageTaskMap.get(e.uid),h=l.seriesTaskMap,u=l.overallTask;if(u){var c,d=u.agentStubMap;d.each(function(t){o(r,t)&&(t.dirty(),c=!0)}),c&&u.dirty(),Xy(u,i);var f=t.getPerformArgs(u,r.block);d.each(function(t){t.perform(f)}),a|=u.perform(f)}else h&&h.each(function(s,l){o(r,s)&&s.dirty();var h=t.getPerformArgs(s,r.block);h.skip=!e.performRawSeries&&n.isSeriesFiltered(s.context.model),Xy(s,i),a|=s.perform(h)})}}),t.unfinished|=a}function ca(t,e,n,i,r){function o(n){var o=n.uid,s=a.get(o)||a.set(o,Wo({plan:va,reset:ya,count:_a}));s.context={model:n,ecModel:i,api:r,useClearVisual:e.isVisual&&!e.isLayout,plan:e.plan,reset:e.reset,scheduler:t},wa(t,n,s)}var a=n.seriesTaskMap||(n.seriesTaskMap=R()),s=e.seriesType,l=e.getTargetSeries;e.createOnAllSeries?i.eachRawSeries(o):s?i.eachRawSeriesByType(s,o):l&&l(i,r).each(o);var h=t._pipelineMap;a.each(function(t,e){h.get(e)||(t.dispose(),a.removeKey(e))})}function da(t,e,n,i,r){function o(e){var n=e.uid,i=s.get(n)||s.set(n,Wo({reset:pa,onDirty:ma}));i.context={model:e,overallProgress:u,isOverallFilter:c},i.agent=a,i.__block=u,wa(t,e,i)}var a=n.overallTask=n.overallTask||Wo({reset:fa});a.context={ecModel:i,api:r,overallReset:e.overallReset,scheduler:t};var s=a.agentStubMap=a.agentStubMap||R(),l=e.seriesType,h=e.getTargetSeries,u=!0,c=e.isOverallFilter;l?i.eachRawSeriesByType(l,o):h?h(i,r).each(o):(u=!1,d(i.getSeries(),o));var f=t._pipelineMap;s.each(function(t,e){f.get(e)||(t.dispose(),s.removeKey(e))})}function fa(t){t.overallReset(t.ecModel,t.api,t.payload)}function pa(t,e){return t.overallProgress&&ga}function ga(){this.agent.dirty(),this.getDownstream().dirty()}function ma(){this.agent&&this.agent.dirty()}function va(t){return t.plan&&t.plan(t.model,t.ecModel,t.api,t.payload)}function ya(t){if(t.useClearVisual&&t.data.clearAllVisual(),(t.resetDefines=xn(t.reset(t.model,t.ecModel,t.api,t.payload))).length)return xa}function xa(t,e){for(var n=e.data,i=e.resetDefines,r=0;re.get("hoverLayerThreshold")&&!Zf.node&&n.traverse(function(t){t.isGroup||(t.useHoverLayer=!0)})}function Wa(t,e){var n=t.get("blendMode")||null;e.group.traverse(function(t){t.isGroup||t.style.blend!==n&&t.setStyle("blend",n),t.eachPendingDisplayable&&t.eachPendingDisplayable(function(t){t.setStyle("blend",n)})})}function Za(t,e){var n=t.get("z"),i=t.get("zlevel");e.group.traverse(function(t){"group"!==t.type&&(null!=n&&(t.z=n),null!=i&&(t.zlevel=i))})}function Ua(t){var e=t._coordSysMgr;return o(new go(t),{getCoordinateSystems:m(e.getCoordinateSystems,e),getComponentByElement:function(e){for(;e;){var n=e.__ecComponentInfo;if(null!=n)return t._model.getComponent(n.mainType,n.index);e=e.parent}}})}function Xa(t){function e(t,e){for(var i=0;i65535?e:n}function ps(t){var e=t.constructor;return e===Array?t.slice():new e(t)}function gs(t,e){d(Vx.concat(e.__wrappedMethods||[]),function(n){e.hasOwnProperty(n)&&(t[n]=e[n])}),t.__wrappedMethods=e.__wrappedMethods}function ms(t){return t}function vs(t){return t=0?this._indices[t]:-1}function ys(t,e){var n=t._idList[e];return null==n&&(n=t._getIdFromStore(e)),null==n&&(n=Nx+e),n}function xs(t){return y(t)||(t=[t]),t}function _s(t,e){var n=t.dimensions,i=new Fx(f(n,t.getDimensionInfo,t),t.hostModel);gs(i,t);for(var r=i._storage={},o=t._storage,a=0;a=0?ws(o[s]):o[s])}return i}function ws(t){for(var e=new Array(t.length),n=0;ni&&(a=r.interval=i);var s=r.intervalPrecision=zs(a);return Rs(r.niceTickExtent=[jx(Math.ceil(t[0]/a)*a,s),jx(Math.floor(t[1]/a)*a,s)],t),r}function zs(t){return Sr(t)+2}function Es(t,e,n){t[e]=Math.max(Math.min(t[e],n[1]),n[0])}function Rs(t,e){!isFinite(t[0])&&(t[0]=e[0]),!isFinite(t[1])&&(t[1]=e[1]),Es(t,0,e),Es(t,1,e),t[0]>t[1]&&(t[0]=t[1])}function Ns(t,e,n,i){var r=[];if(!t)return r;e[0]1e4)return[];return e[1]>(r.length?r[r.length-1]:n[1])&&r.push(e[1]),r}function Bs(t){return t.get("stack")||$x+t.seriesIndex}function Vs(t){return t.dim+t.index}function Fs(t,e){return Gs(f(t,function(t){var e=t.getData(),n=t.coordinateSystem.getBaseAxis(),i=n.getExtent(),r="category"===n.type?n.getBandWidth():Math.abs(i[1]-i[0])/e.count();return{bandWidth:r,barWidth:xr(t.get("barWidth"),r),barMaxWidth:xr(t.get("barMaxWidth"),r),barGap:t.get("barGap"),barCategoryGap:t.get("barCategoryGap"),axisKey:Vs(n),stackId:Bs(t)}}),e)}function Gs(t,e){var n={};d(t,function(t,e){var i=t.axisKey,r=t.bandWidth,o=n[i]||{bandWidth:r,remainedWidth:r,autoWidthCount:0,categoryGap:"20%",gap:"30%",stacks:{}},a=o.stacks;n[i]=o;var s=t.stackId;a[s]||o.autoWidthCount++,a[s]=a[s]||{width:0,maxWidth:0};var l=t.barWidth;l&&!a[s].width&&(a[s].width=l,l=Math.min(o.remainedWidth,l),o.remainedWidth-=l);var h=t.barMaxWidth;h&&(a[s].maxWidth=h);var u=t.barGap;null!=u&&(o.gap=u);var c=t.barCategoryGap;null!=c&&(o.categoryGap=c)});var i={};return d(n,function(t,e){i[e]={};var n=t.stacks,r=t.bandWidth,o=xr(t.categoryGap,r),a=xr(t.gap,1),s=t.remainedWidth,l=t.autoWidthCount,h=(s-o)/(l+(l-1)*a);h=Math.max(h,0),d(n,function(t,e){var n=t.maxWidth;n&&n0&&s>0&&!l&&(a=0),a<0&&s<0&&!h&&(s=0));var c=e.ecModel;if(c){var d=g(c.getSeriesByType("bar"),function(t){return t.getBaseAxis()===e.axis}).length>0;if(("time"===o||"interval"===o)&&d){var f=Zs(a,s,e);a=f.min,s=f.max}}return[a,s]}function Zs(t,e,n){var i=n.ecModel,r=n.axis.getExtent(),o=r[1]-r[0],a=Fs(g(i.getSeriesByType("bar"),function(t){return!i.isSeriesFiltered(t)&&t.coordinateSystem&&"cartesian2d"===t.coordinateSystem.type}))[n.axis.dim+n.axis.index];if(void 0===a)return{min:t,max:e};var s=1/0;d(a,function(t){s=Math.min(t.offset,s)});var l=-1/0;d(a,function(t){l=Math.max(t.offset+t.width,l)});var h=Math.abs(s)+l,u=e-t,c=u/(1-(s+l)/o)-u;return e+=c*(l/h),t-=c*(s/h),{min:t,max:e}}function Us(t,e){var n=Ws(t,e),i=null!=e.getMin(),r=null!=e.getMax(),o=e.get("splitNumber");"log"===t.type&&(t.base=e.get("logBase"));var a=t.type;t.setExtent(n[0],n[1]),t.niceExtent({splitNumber:o,fixMin:i,fixMax:r,minInterval:"interval"===a||"time"===a?e.get("minInterval"):null,maxInterval:"interval"===a||"time"===a?e.get("maxInterval"):null});var s=e.get("interval");null!=s&&t.setInterval&&t.setInterval(s)}function Xs(t,e){if(e=e||t.get("type"))switch(e){case"category":return new Xx(t.getOrdinalMeta?t.getOrdinalMeta():t.getCategories(),[1/0,-1/0]);case"value":return new qx;default:return(Ds.getClass(e)||qx).create(t)}}function js(t,e,n,i,r){var o,a=0,s=0,l=(i-r)/180*Math.PI,h=1;e.length>40&&(h=Math.floor(e.length/40));for(var u=0;u1?h:(a+1)*h-1}function Ys(t,e){var n=t.scale,i=n.getTicksLabels(),r=n.getTicks();return"string"==typeof e?(e=function(t){return function(e){return t.replace("{value}",null!=e?e:"")}}(e),f(i,e)):"function"==typeof e?f(r,function(n,i){return e(qs(t,n),i)},this):i}function qs(t,e){return"category"===t.type?t.scale.getLabel(e):e}function $s(t,e){if("image"!==this.type){var n=this.style,i=this.shape;i&&"line"===i.symbolType?n.stroke=t:this.__isEmptyBrush?(n.stroke=t,n.fill=e||"#fff"):(n.fill&&(n.fill=t),n.stroke&&(n.stroke=t)),this.dirty(!1)}}function Ks(t,e,n,i,r,o,a){var s=0===t.indexOf("empty");s&&(t=t.substr(5,1).toLowerCase()+t.substr(6));var l;return l=0===t.indexOf("image://")?ki(t.slice(8),new Xt(e,n,i,r),a?"center":"cover"):0===t.indexOf("path://")?Di(t.slice(7),{},new Xt(e,n,i,r),a?"center":"cover"):new x_({shape:{symbolType:t,x:e,y:n,width:i,height:r}}),l.__isEmptyBrush=s,l.setColor=$s,l.setColor(o),l}function Qs(t,e){return Math.abs(t-e)>1^-(1&s),l=l>>1^-(1&l),r=s+=r,o=l+=o,i.push([s/n,l/n])}return i}function il(t,e){var n=(t[1]-t[0])/e/2;t[0]+=n,t[1]-=n}function rl(t,e){var n=t.mapDimension("defaultedLabel",!0),i=n.length;if(1===i)return Go(t,e,n[0]);if(i){for(var r=[],o=0;o=0?1:-1}function fl(t,e,n){for(var i,r=t.getBaseAxis(),o=t.getOtherAxis(r),a=r.onZero?0:o.scale.getExtent()[0],s=o.dim,l="x"===s||"radius"===s?1:0,h=e.stackedOn,u=e.get(s,n);h&&dl(h.get(s,n))===dl(u);){i=h;break}var c=[];return c[l]=e.get(r.dim,n),c[1-l]=i?i.get(s,n,!0):a,t.dataToPoint(c)}function pl(t,e){var n=[];return e.diff(t).add(function(t){n.push({cmd:"+",idx:t})}).update(function(t,e){n.push({cmd:"=",idx:e,idx1:t})}).remove(function(t){n.push({cmd:"-",idx:t})}).execute(),n}function gl(t){return isNaN(t[0])||isNaN(t[1])}function ml(t,e,n,i,r,o,a,s,l,h,u){for(var c=0,d=n,f=0;f=r||d<0)break;if(gl(p)){if(u){d+=o;continue}break}if(d===n)t[o>0?"moveTo":"lineTo"](p[0],p[1]),B_(F_,p);else if(l>0){var g=d+o,m=e[g];if(u)for(;m&&gl(e[g]);)m=e[g+=o];var v=.5,y=e[c];if(!(m=e[g])||gl(m))B_(G_,p);else{gl(m)&&!u&&(m=p),W(V_,m,y);var x,_;if("x"===h||"y"===h){var w="x"===h?0:1;x=Math.abs(p[w]-y[w]),_=Math.abs(p[w]-m[w])}else x=lp(p,y),_=lp(p,m);N_(G_,p,V_,-l*(1-(v=_/(_+x))))}E_(F_,F_,s),R_(F_,F_,a),E_(G_,G_,s),R_(G_,G_,a),t.bezierCurveTo(F_[0],F_[1],G_[0],G_[1],p[0],p[1]),N_(F_,p,V_,l*v)}else t.lineTo(p[0],p[1]);c=d,d+=o}return f}function vl(t,e){var n=[1/0,1/0],i=[-1/0,-1/0];if(e)for(var r=0;ri[0]&&(i[0]=o[0]),o[1]>i[1]&&(i[1]=o[1])}return{min:e?n:i,max:e?i:n}}function yl(t,e){if(t.length===e.length){for(var n=0;ne[0]?1:-1;e[0]+=i*n,e[1]-=i*n}return e}function wl(t){return t>=0?1:-1}function bl(t,e,n,i){var r=e.getBaseAxis(),o=e.getOtherAxis(r),a=0,s=o.scale.getExtent();"start"===i?a=s[0]:"end"===i?a=s[1]:(s=o.scale.getExtent())[0]>0?a=s[0]:s[1]<0&&(a=s[1]);var l=o.dim,h="x"===l||"radius"===l?1:0,u=n.mapDimension(l);return n.mapArray(u?[u]:[],function(t,i){for(var o,s=n.stackedOn;s&&wl(s.get(u,i))===wl(t);){o=s;break}var l=[];return l[h]=n.get(r.dim,i),l[1-h]=o?o.get(u,i,!0):a,e.dataToPoint(l)},!0)}function Sl(t,e,n){var i=_l(t.getAxis("x")),r=_l(t.getAxis("y")),o=t.getBaseAxis().isHorizontal(),a=Math.min(i[0],i[1]),s=Math.min(r[0],r[1]),l=Math.max(i[0],i[1])-a,h=Math.max(r[0],r[1])-s,u=n.get("lineStyle.width")||2,c=n.get("clipOverflow")?u/2:Math.max(l,h);o?(s-=c,h+=2*c):(a-=c,l+=2*c);var d=new lv({shape:{x:a,y:s,width:l,height:h}});return e&&(d.shape[o?"width":"height"]=0,ar(d,{shape:{width:l,height:h}},n)),d}function Ml(t,e,n){var i=t.getAngleAxis(),r=t.getRadiusAxis().getExtent(),o=i.getExtent(),a=Math.PI/180,s=new nv({shape:{cx:t.cx,cy:t.cy,r0:r[0],r:r[1],startAngle:-o[0]*a,endAngle:-o[1]*a,clockwise:i.inverse}});return e&&(s.shape.endAngle=-o[0]*a,ar(s,{shape:{endAngle:-o[1]*a}},n)),s}function Il(t,e,n){return"polar"===t.type?Ml(t,e,n):Sl(t,e,n)}function Tl(t,e,n){for(var i=e.getBaseAxis(),r="x"===i.dim||"radius"===i.dim?0:1,o=[],a=0;a=0;r--)if(n[r].dimension<2){i=n[r];break}if(i&&"cartesian2d"===e.type){var o=i.dimension,a=t.dimensions[o],s=e.getAxis(a),l=f(i.stops,function(t){return{coord:s.toGlobalCoord(s.dataToCoord(t.value)),color:t.color}}),h=l.length,u=i.outerColors.slice();h&&l[0].coord>l[h-1].coord&&(l.reverse(),u.reverse());var c=l[0].coord-10,p=l[h-1].coord+10,g=p-c;if(g<.001)return"transparent";d(l,function(t){t.offset=(t.coord-c)/g}),l.push({offset:h?l[h-1].offset:.5,color:u[1]||"transparent"}),l.unshift({offset:h?l[0].offset:.5,color:u[0]||"transparent"});var m=new gv(0,0,0,0,l,!0);return m[a]=c,m[a+"2"]=p,m}}}function Al(t){return this._axes[t]}function Dl(t){Y_.call(this,t)}function kl(t,e){return e.type||(e.data?"category":"value")}function Pl(t,e,n){return t.getCoordSysModel()===e}function Ll(t,e){var n=e*Math.PI/180,i=t.plain(),r=i.width,o=i.height,a=r*Math.cos(n)+o*Math.sin(n),s=r*Math.sin(n)+o*Math.cos(n);return new Xt(i.x,i.y,a,s)}function Ol(t){var e,n=t.model,i=n.get("axisLabel.show")?n.getFormattedLabels():[],r=n.getModel("axisLabel"),o=1,a=i.length;a>40&&(o=Math.ceil(a/40));for(var s=0;si[1],l="start"===e&&!s||"start"!==e&&s;return Cr(a-sw/2)?(o=l?"bottom":"top",r="center"):Cr(a-1.5*sw)?(o=l?"top":"bottom",r="center"):(o="middle",r=a<1.5*sw&&a>sw/2?l?"left":"right":l?"right":"left"),{rotation:a,textAlign:r,textVerticalAlign:o}}function Hl(t){var e=t.get("tooltip");return t.get("silent")||!(t.get("triggerEvent")||e&&e.show)}function Wl(t,e,n){var i=t.get("axisLabel.showMinLabel"),r=t.get("axisLabel.showMaxLabel");e=e||[],n=n||[];var o=e[0],a=e[1],s=e[e.length-1],l=e[e.length-2],h=n[0],u=n[1],c=n[n.length-1],d=n[n.length-2];!1===i?(Zl(o),Zl(h)):Ul(o,a)&&(i?(Zl(a),Zl(u)):(Zl(o),Zl(h))),!1===r?(Zl(s),Zl(c)):Ul(l,s)&&(r?(Zl(l),Zl(d)):(Zl(s),Zl(c)))}function Zl(t){t&&(t.ignore=!0)}function Ul(t,e,n){var i=t&&t.getBoundingRect().clone(),r=e&&e.getBoundingRect().clone();if(i&&r){var o=ot([]);return ht(o,o,-t.rotation),i.applyTransform(st([],o,t.getLocalTransform())),r.applyTransform(st([],o,e.getLocalTransform())),i.intersect(r)}}function Xl(t){return"middle"===t||"center"===t}function jl(t,e,n){var i=e.axis;if(e.get("axisTick.show")&&!i.scale.isBlank()){for(var r=e.getModel("axisTick"),o=r.getModel("lineStyle"),s=r.get("length"),l=dw(r,n.labelInterval),h=i.getTicksCoords(r.get("alignWithLabel")),u=i.scale.getTicks(),c=e.get("axisLabel.showMinLabel"),d=e.get("axisLabel.showMaxLabel"),f=[],p=[],g=t._transform,m=[],v=h.length,y=0;y=0||t===e}function eh(t){var e=nh(t);if(e){var n=e.axisPointerModel,i=e.axis.scale,r=n.option,o=n.get("status"),a=n.get("value");null!=a&&(a=i.parse(a));var s=rh(n);null==o&&(r.status=s?"show":"hide");var l=i.getExtent().slice();l[0]>l[1]&&l.reverse(),(null==a||a>l[1])&&(a=l[1]),a0?"bottom":"top":r.width>0?"left":"right";l||hh(t.style,d,i,h,o,n,p),Yi(t,d)}function ph(t,e){var n=t.get(Mw)||0;return Math.min(n,Math.abs(e.width),Math.abs(e.height))}function gh(t,e,n,i){var r=e.getData(),o=this.dataIndex,a=r.getName(o),s=e.get("selectedOffset");i.dispatchAction({type:"pieToggleSelect",from:t,name:a,seriesId:e.id}),r.each(function(t){mh(r.getItemGraphicEl(t),r.getItemLayout(t),e.isSelected(r.getName(t)),s,n)})}function mh(t,e,n,i,r){var o=(e.startAngle+e.endAngle)/2,a=Math.cos(o),s=Math.sin(o),l=n?i:0,h=[a*l,s*l];r?t.animate().when(200,{position:h}).start("bounceOut"):t.attr("position",h)}function vh(t,e){function n(){o.ignore=o.hoverIgnore,a.ignore=a.hoverIgnore}function i(){o.ignore=o.normalIgnore,a.ignore=a.normalIgnore}Xp.call(this);var r=new nv({z2:2}),o=new sv,a=new Qm;this.add(r),this.add(o),this.add(a),this.updateData(t,e,!0),this.on("emphasis",n).on("normal",i).on("mouseover",n).on("mouseout",i)}function yh(t,e,n,i,r,o,a){function s(e,n){for(var i=e;i>=0&&(t[i].y-=n,!(i>0&&t[i].y>t[i-1].y+t[i-1].height));i--);}function l(t,e,n,i,r,o){for(var a=e?Number.MAX_VALUE:0,s=0,l=t.length;s=a&&(d=a-10),!e&&d<=a&&(d=a+10),t[s].x=n+d*o,a=d}}t.sort(function(t,e){return t.y-e.y});for(var h,u=0,c=t.length,d=[],f=[],p=0;pe&&o+1t[o].y+t[o].height)return void s(o,i/2);s(n-1,i/2)}(p,c,-h),u=t[p].y+t[p].height;a-u<0&&s(c-1,u-a);for(p=0;p=n?f.push(t[p]):d.push(t[p]);l(d,!1,e,n,i,r),l(f,!0,e,n,i,r)}function xh(t,e,n,i,r,o){for(var a=[],s=[],l=0;l=0&&s<0)&&(a=p,s=f,r=h,o.length=0),Bw(u,function(t){o.push({seriesIndex:e.seriesIndex,dataIndexInside:t,dataIndex:e.getData().getRawIndex(t)})}))}}),{payloadBatch:o,snapToValue:r}}function kh(t,e,n,i){t[e.key]={value:n,payloadBatch:i}}function Ph(t,e,n,i){var r=n.payloadBatch,o=e.axis,a=o.model,s=e.axisPointerModel;if(e.triggerTooltip&&r.length){var l=e.coordSys.model,h=oh(l),u=t.map[h];u||(u=t.map[h]={coordSysId:l.id,coordSysIndex:l.componentIndex,coordSysType:l.type,coordSysMainType:l.mainType,dataByAxis:[]},t.list.push(u)),u.dataByAxis.push({axisDim:o.dim,axisIndex:a.componentIndex,axisType:a.type,axisId:a.id,value:i,valueLabelOpt:{precision:s.get("label.precision"),formatter:s.get("label.formatter")},seriesDataIndices:r.slice()})}}function Lh(t,e,n){var i=n.axesInfo=[];Bw(e,function(e,n){var r=e.axisPointerModel.option,o=t[n];o?(!e.useHandle&&(r.status="show"),r.value=o.value,r.seriesDataIndices=(o.payloadBatch||[]).slice()):!e.useHandle&&(r.status="hide"),"show"===r.status&&i.push({axisDim:e.axis.dim,axisIndex:e.axis.model.componentIndex,value:r.value})})}function Oh(t,e,n,i){if(!Nh(e)&&t.list.length){var r=((t.list[0].dataByAxis[0]||{}).seriesDataIndices||[])[0]||{};i({type:"showTip",escapeConnect:!0,x:e[0],y:e[1],tooltipOption:n.tooltipOption,position:n.position,dataIndexInside:r.dataIndexInside,dataIndex:r.dataIndex,seriesIndex:r.seriesIndex,dataByCoordSys:t.list})}else i({type:"hideTip"})}function zh(t,e,n){var i=n.getZr(),r=Fw(i).axisPointerLastHighlights||{},o=Fw(i).axisPointerLastHighlights={};Bw(t,function(t,e){var n=t.axisPointerModel.option;"show"===n.status&&Bw(n.seriesDataIndices,function(t){var e=t.seriesIndex+" | "+t.dataIndex;o[e]=t})});var a=[],s=[];d(r,function(t,e){!o[e]&&s.push(t)}),d(o,function(t,e){!r[e]&&a.push(t)}),s.length&&n.dispatchAction({type:"downplay",escapeConnect:!0,batch:s}),a.length&&n.dispatchAction({type:"highlight",escapeConnect:!0,batch:a})}function Eh(t,e){for(var n=0;n<(t||[]).length;n++){var i=t[n];if(e.axis.dim===i.axisDim&&e.axis.model.componentIndex===i.axisIndex)return i}}function Rh(t){var e=t.axis.model,n={},i=n.axisDim=t.axis.dim;return n.axisIndex=n[i+"AxisIndex"]=e.componentIndex,n.axisName=n[i+"AxisName"]=e.name,n.axisId=n[i+"AxisId"]=e.id,n}function Nh(t){return!t||null==t[0]||isNaN(t[0])||null==t[1]||isNaN(t[1])}function Bh(t,e,n){if(!Zf.node){var i=e.getZr();Gw(i).records||(Gw(i).records={}),Vh(i,e),(Gw(i).records[t]||(Gw(i).records[t]={})).handler=n}}function Vh(t,e){function n(n,i){t.on(n,function(n){var r=Wh(e);Hw(Gw(t).records,function(t){t&&i(t,n,r.dispatchAction)}),Fh(r.pendings,e)})}Gw(t).initialized||(Gw(t).initialized=!0,n("click",v(Hh,"click")),n("mousemove",v(Hh,"mousemove")),n("globalout",Gh))}function Fh(t,e){var n,i=t.showTip.length,r=t.hideTip.length;i?n=t.showTip[i-1]:r&&(n=t.hideTip[r-1]),n&&(n.dispatchAction=null,e.dispatchAction(n))}function Gh(t,e,n){t.handler("leave",null,n)}function Hh(t,e,n,i){e.handler(t,n,i)}function Wh(t){var e={showTip:[],hideTip:[]},n=function(i){var r=e[i.type];r?r.push(i):(i.dispatchAction=n,t.dispatchAction(i))};return{dispatchAction:n,pendings:e}}function Zh(t,e){if(!Zf.node){var n=e.getZr();(Gw(n).records||{})[t]&&(Gw(n).records[t]=null)}}function Uh(){}function Xh(t,e,n,i){jh(Zw(n).lastProp,i)||(Zw(n).lastProp=i,e?or(n,i,t):(n.stopAnimation(),n.attr(i)))}function jh(t,e){if(w(t)&&w(e)){var n=!0;return d(e,function(e,i){n=n&&jh(t[i],e)}),!!n}return t===e}function Yh(t,e){t[e.get("label.show")?"show":"hide"]()}function qh(t){return{position:t.position.slice(),rotation:t.rotation||0}}function $h(t,e,n){var i=e.get("z"),r=e.get("zlevel");t&&t.traverse(function(t){"group"!==t.type&&(null!=i&&(t.z=i),null!=r&&(t.zlevel=r),t.silent=n)})}function Kh(t){var e,n=t.get("type"),i=t.getModel(n+"Style");return"line"===n?(e=i.getLineStyle()).fill=null:"shadow"===n&&((e=i.getAreaStyle()).stroke=null),e}function Qh(t,e,n,i,r){var o=tu(n.get("value"),e.axis,e.ecModel,n.get("seriesDataIndices"),{precision:n.get("label.precision"),formatter:n.get("label.formatter")}),a=n.getModel("label"),s=Ov(a.get("padding")||0),l=a.getFont(),h=ce(o,l),u=r.position,c=h.width+s[1]+s[3],d=h.height+s[0]+s[2],f=r.align;"right"===f&&(u[0]-=c),"center"===f&&(u[0]-=c/2);var p=r.verticalAlign;"bottom"===p&&(u[1]-=d),"middle"===p&&(u[1]-=d/2),Jh(u,c,d,i);var g=a.get("backgroundColor");g&&"auto"!==g||(g=e.get("axisLine.lineStyle.color")),t.label={shape:{x:0,y:0,width:c,height:d,r:a.get("borderRadius")},position:u.slice(),style:{text:o,textFont:l,textFill:a.getTextColor(),textPosition:"inside",fill:g,stroke:a.get("borderColor")||"transparent",lineWidth:a.get("borderWidth")||0,shadowBlur:a.get("shadowBlur"),shadowColor:a.get("shadowColor"),shadowOffsetX:a.get("shadowOffsetX"),shadowOffsetY:a.get("shadowOffsetY")},z2:10}}function Jh(t,e,n,i){var r=i.getWidth(),o=i.getHeight();t[0]=Math.min(t[0]+e,r)-e,t[1]=Math.min(t[1]+n,o)-n,t[0]=Math.max(t[0],0),t[1]=Math.max(t[1],0)}function tu(t,e,n,i,r){var o=e.scale.getLabel(t,{precision:r.precision}),a=r.formatter;if(a){var s={value:qs(e,t),seriesData:[]};d(i,function(t){var e=n.getSeriesByIndex(t.seriesIndex),i=t.dataIndexInside,r=e&&e.getDataParams(i);r&&s.seriesData.push(r)}),_(a)?o=a.replace("{value}",o):x(a)&&(o=a(s))}return o}function eu(t,e,n){var i=rt();return ht(i,i,n.rotation),lt(i,i,n.position),lr([t.dataToCoord(e),(n.labelOffset||0)+(n.labelDirection||1)*(n.labelMargin||0)],i)}function nu(t,e,n,i,r,o){var a=lw.innerTextLayout(n.rotation,0,n.labelDirection);n.labelMargin=r.get("label.margin"),Qh(e,i,r,o,{position:eu(i.axis,t,n),align:a.textAlign,verticalAlign:a.textVerticalAlign})}function iu(t,e,n){return n=n||0,{x1:t[n],y1:t[1-n],x2:e[n],y2:e[1-n]}}function ru(t,e,n){return n=n||0,{x:t[n],y:t[1-n],width:e[n],height:e[1-n]}}function ou(t,e){var n={};return n[e.dim+"AxisIndex"]=e.index,t.getCartesian(n)}function au(t){return"x"===t.dim?0:1}function su(t){var e="left "+t+"s cubic-bezier(0.23, 1, 0.32, 1),top "+t+"s cubic-bezier(0.23, 1, 0.32, 1)";return f(Kw,function(t){return t+"transition:"+e}).join(";")}function lu(t){var e=[],n=t.get("fontSize"),i=t.getTextColor();return i&&e.push("color:"+i),e.push("font:"+t.getFont()),n&&e.push("line-height:"+Math.round(3*n/2)+"px"),qw(["decoration","align"],function(n){var i=t.get(n);i&&e.push("text-"+n+":"+i)}),e.join(";")}function hu(t){var e=[],n=t.get("transitionDuration"),i=t.get("backgroundColor"),r=t.getModel("textStyle"),o=t.get("padding");return n&&e.push(su(n)),i&&(Zf.canvasSupported?e.push("background-Color:"+i):(e.push("background-Color:#"+At(i)),e.push("filter:alpha(opacity=70)"))),qw(["width","color","radius"],function(n){var i="border-"+n,r=$w(i),o=t.get(r);null!=o&&e.push(i+":"+o+("color"===n?"":"px"))}),e.push(lu(r)),null!=o&&e.push("padding:"+Ov(o).join("px ")+"px"),e.join(";")+";"}function uu(t,e){if(Zf.wxa)return null;var n=document.createElement("div"),i=this._zr=e.getZr();this.el=n,this._x=e.getWidth()/2,this._y=e.getHeight()/2,t.appendChild(n),this._container=t,this._show=!1,this._hideTimeout;var r=this;n.onmouseenter=function(){r._enterable&&(clearTimeout(r._hideTimeout),r._show=!0),r._inContent=!0},n.onmousemove=function(e){if(e=e||window.event,!r._enterable){var n=i.handler;rn(t,e,!0),n.dispatch("mousemove",e)}},n.onmouseleave=function(){r._enterable&&r._show&&r.hideLater(r._hideDelay),r._inContent=!1}}function cu(t){for(var e=t.pop();t.length;){var n=t.pop();n&&(fr.isInstance(n)&&(n=n.get("tooltip",!0)),"string"==typeof n&&(n={formatter:n}),e=new fr(n,e,e.ecModel))}return e}function du(t,e){return t.dispatchAction||m(e.dispatchAction,e)}function fu(t,e,n,i,r,o,a){var s=gu(n),l=s.width,h=s.height;return null!=o&&(t+l+o>i?t-=l+o:t+=o),null!=a&&(e+h+a>r?e-=h+a:e+=a),[t,e]}function pu(t,e,n,i,r){var o=gu(n),a=o.width,s=o.height;return t=Math.min(t+a,i)-a,e=Math.min(e+s,r)-s,t=Math.max(t,0),e=Math.max(e,0),[t,e]}function gu(t){var e=t.clientWidth,n=t.clientHeight;if(document.defaultView&&document.defaultView.getComputedStyle){var i=document.defaultView.getComputedStyle(t);i&&(e+=parseInt(i.paddingLeft,10)+parseInt(i.paddingRight,10)+parseInt(i.borderLeftWidth,10)+parseInt(i.borderRightWidth,10),n+=parseInt(i.paddingTop,10)+parseInt(i.paddingBottom,10)+parseInt(i.borderTopWidth,10)+parseInt(i.borderBottomWidth,10))}return{width:e,height:n}}function mu(t,e,n){var i=n[0],r=n[1],o=0,a=0,s=e.width,l=e.height;switch(t){case"inside":o=e.x+s/2-i/2,a=e.y+l/2-r/2;break;case"top":o=e.x+s/2-i/2,a=e.y-r-5;break;case"bottom":o=e.x+s/2-i/2,a=e.y+l+5;break;case"left":o=e.x-i-5,a=e.y+l/2-r/2;break;case"right":o=e.x+s+5,a=e.y+l/2-r/2}return[o,a]}function vu(t){return"center"===t||"middle"===t}function yu(t,e,n){var i,r={},o="toggleSelected"===t;return n.eachComponent("legend",function(n){o&&null!=i?n[i?"select":"unSelect"](e.name):(n[t](e.name),i=n.isSelected(e.name)),d(n.getData(),function(t){var e=t.get("name");if("\n"!==e&&""!==e){var i=n.isSelected(e);r.hasOwnProperty(e)?r[e]=r[e]&&i:r[e]=i}})}),{name:e.name,selected:r}}function xu(t,e,n){var i=e.getBoxLayoutParams(),r=e.get("padding"),o={width:n.getWidth(),height:n.getHeight()},a=Fr(i,o,r);Wv(e.get("orient"),t,e.get("itemGap"),a.width,a.height),Gr(t,i,o,r)}function _u(t,e){var n=Ov(e.get("padding")),i=e.getItemStyle(["color","opacity"]);return i.fill=e.get("backgroundColor"),t=new lv({shape:{x:t.x-n[3],y:t.y-n[0],width:t.width+n[1]+n[3],height:t.height+n[0]+n[2],r:e.get("borderRadius")},style:i,silent:!0,z2:-1})}function wu(t,e){e.dispatchAction({type:"legendToggleSelect",name:t})}function bu(t,e,n){var i=n.getZr().storage.getDisplayList()[0];i&&i.useHoverLayer||t.get("legendHoverLink")&&n.dispatchAction({type:"highlight",seriesName:t.name,name:e})}function Su(t,e,n){var i=n.getZr().storage.getDisplayList()[0];i&&i.useHoverLayer||t.get("legendHoverLink")&&n.dispatchAction({type:"downplay",seriesName:t.name,name:e})}function Mu(t,e,n){var i=[1,1];i[t.getOrient().index]=0,Hr(e,n,{type:"box",ignoreSize:i})}function Iu(t){_n(t,"label",["show"])}function Tu(t){return!(isNaN(parseFloat(t.x))&&isNaN(parseFloat(t.y)))}function Cu(t){return!isNaN(parseFloat(t.x))&&!isNaN(parseFloat(t.y))}function Au(t,e,n){var i=-1;do{i=Math.max(br(t.get(e,n)),i),t=t.stackedOn}while(t);return i}function Du(t,e,n,i,r,o){var a=[],s=Eu(e,i,t),l=e.indicesOfNearest(i,s,!0)[0];a[r]=e.get(n,l,!0),a[o]=e.get(i,l,!0);var h=Au(e,i,l);return(h=Math.min(h,20))>=0&&(a[o]=+a[o].toFixed(h)),a}function ku(t,e){var i=t.getData(),r=t.coordinateSystem;if(e&&!Cu(e)&&!y(e.coord)&&r){var o=r.dimensions,a=Pu(e,i,r,t);if((e=n(e)).type&&vb[e.type]&&a.baseAxis&&a.valueAxis){var s=gb(o,a.baseAxis.dim),l=gb(o,a.valueAxis.dim);e.coord=vb[e.type](i,a.baseDataDim,a.valueDataDim,s,l),e.value=e.coord[l]}else{for(var h=[null!=e.xAxis?e.xAxis:e.radiusAxis,null!=e.yAxis?e.yAxis:e.angleAxis],u=0;u<2;u++)vb[h[u]]&&(h[u]=Eu(i,i.mapDimension(o[u]),h[u]));e.coord=h}}return e}function Pu(t,e,n,i){var r={};return null!=t.valueIndex||null!=t.valueDim?(r.valueDataDim=null!=t.valueIndex?e.getDimension(t.valueIndex):t.valueDim,r.valueAxis=n.getAxis(Lu(i,r.valueDataDim)),r.baseAxis=n.getOtherAxis(r.valueAxis),r.baseDataDim=e.mapDimension(r.baseAxis.dim)):(r.baseAxis=i.getBaseAxis(),r.valueAxis=n.getOtherAxis(r.baseAxis),r.baseDataDim=e.mapDimension(r.baseAxis.dim),r.valueDataDim=e.mapDimension(r.valueAxis.dim)),r}function Lu(t,e){var n=t.getData(),i=n.dimensions;e=n.getDimension(e);for(var r=0;r=0}function sc(t,e,n){function i(t,e){return l(e.nodes,t)>=0}function r(t,i){var r=!1;return e(function(e){d(n(t,e)||[],function(t){i.records[e.name][t]&&(r=!0)})}),r}function o(t,i){i.nodes.push(t),e(function(e){d(n(t,e)||[],function(t){i.records[e.name][t]=!0})})}return function(n){var a={nodes:[],records:{}};if(e(function(t){a.records[t.name]={}}),!n)return a;o(n,a);var s;do{s=!1,t(function(t){!i(t,a)&&r(t,a)&&(o(t,a),s=!0)})}while(s);return a}}function lc(t,e,n){var i=[1/0,-1/0];return kb(n,function(t){var n=t.getData();n&&kb(n.mapDimension(e,!0),function(t){var e=n.getApproximateExtent(t);e[0]i[1]&&(i[1]=e[1])})}),i[1]0?0:NaN);var a=n.getMax(!0);return null!=a&&"dataMax"!==a&&"function"!=typeof a?e[1]=a:r&&(e[1]=o>0?o-1:NaN),n.get("scale",!0)||(e[0]>0&&(e[0]=0),e[1]<0&&(e[1]=0)),e}function uc(t,e){var n=t.getAxisModel(),i=t._percentWindow,r=t._valueWindow;if(i){var o=Mr(r,[0,500]);o=Math.min(o,20);var a=e||0===i[0]&&100===i[1];n.setRange(a?null:+r[0].toFixed(o),a?null:+r[1].toFixed(o))}}function cc(t){var e=t._minMaxSpan={},n=t._dataZoomModel;kb(["min","max"],function(i){e[i+"Span"]=n.get(i+"Span");var r=n.get(i+"ValueSpan");if(null!=r&&(e[i+"ValueSpan"]=r,null!=(r=t.getAxisModel().axis.scale.parse(r)))){var o=t._dataExtent;e[i+"Span"]=yr(o[0]+r,o,[0,100],!0)}})}function dc(t){var e={};return Ob(["start","end","startValue","endValue","throttle"],function(n){t.hasOwnProperty(n)&&(e[n]=t[n])}),e}function fc(t,e){var n=t._rangePropMode,i=t.get("rangeMode");Ob([["start","startValue"],["end","endValue"]],function(t,r){var o=null!=e[t[0]],a=null!=e[t[1]];o&&!a?n[r]="percent":!o&&a?n[r]="value":i?n[r]=i[r]:o&&(n[r]="percent")})}function pc(t,e){var n=t[e]-t[1-e];return{span:Math.abs(n),sign:n>0?-1:n<0?1:e?-1:1}}function gc(t,e){return Math.min(e[1],Math.max(e[0],t))}function mc(t){return{x:"y",y:"x",radius:"angle",angle:"radius"}[t]}function vc(t){return"vertical"===t?"ns-resize":"ew-resize"}function yc(t,e,n){wc(t)[e]=n}function xc(t,e,n){var i=wc(t);i[e]===n&&(i[e]=null)}function _c(t,e){return!!wc(t)[e]}function wc(t){return t[jb]||(t[jb]={})}function bc(t){this.pointerChecker,this._zr=t,this._opt={};var e=m,i=e(Sc,this),r=e(Mc,this),o=e(Ic,this),s=e(Tc,this),l=e(Cc,this);dp.call(this),this.setPointerChecker=function(t){this.pointerChecker=t},this.enable=function(e,h){this.disable(),this._opt=a(n(h)||{},{zoomOnMouseWheel:!0,moveOnMouseMove:!0,preventDefaultMouseMove:!0}),null==e&&(e=!0),!0!==e&&"move"!==e&&"pan"!==e||(t.on("mousedown",i),t.on("mousemove",r),t.on("mouseup",o)),!0!==e&&"scale"!==e&&"zoom"!==e||(t.on("mousewheel",s),t.on("pinch",l))},this.disable=function(){t.off("mousedown",i),t.off("mousemove",r),t.off("mouseup",o),t.off("mousewheel",s),t.off("pinch",l)},this.dispose=this.disable,this.isDragging=function(){return this._dragging},this.isPinching=function(){return this._pinching}}function Sc(t){if(!(sn(t)||t.target&&t.target.draggable)){var e=t.offsetX,n=t.offsetY;this.pointerChecker&&this.pointerChecker(t,e,n)&&(this._x=e,this._y=n,this._dragging=!0)}}function Mc(t){if(!sn(t)&&Dc(this,"moveOnMouseMove",t)&&this._dragging&&"pinch"!==t.gestureEvent&&!_c(this._zr,"globalPan")){var e=t.offsetX,n=t.offsetY,i=this._x,r=this._y,o=e-i,a=n-r;this._x=e,this._y=n,this._opt.preventDefaultMouseMove&&bg(t.event),this.trigger("pan",o,a,i,r,e,n)}}function Ic(t){sn(t)||(this._dragging=!1)}function Tc(t){if(Dc(this,"zoomOnMouseWheel",t)&&0!==t.wheelDelta){var e=t.wheelDelta>0?1.1:1/1.1;Ac.call(this,t,e,t.offsetX,t.offsetY)}}function Cc(t){if(!_c(this._zr,"globalPan")){var e=t.pinchScale>1?1.1:1/1.1;Ac.call(this,t,e,t.pinchX,t.pinchY)}}function Ac(t,e,n,i){this.pointerChecker&&this.pointerChecker(t,n,i)&&(bg(t.event),this.trigger("zoom",e,n,i))}function Dc(t,e,n){var i=t._opt[e];return i&&(!_(i)||n.event[i+"Key"])}function kc(t,e){var n=zc(t),i=e.dataZoomId,r=e.coordId;d(n,function(t,n){var o=t.dataZoomInfos;o[i]&&l(e.allCoordIds,r)<0&&(delete o[i],t.count--)}),Rc(n);var o=n[r];o||((o=n[r]={coordId:r,dataZoomInfos:{},count:0}).controller=Ec(t,o),o.dispatchAction=v(Fc,t)),!o.dataZoomInfos[i]&&o.count++,o.dataZoomInfos[i]=e;var a=Gc(o.dataZoomInfos);o.controller.enable(a.controlType,a.opt),o.controller.setPointerChecker(e.containsPoint),sa(o,"dispatchAction",e.throttleRate,"fixRate")}function Pc(t,e){var n=zc(t);d(n,function(t){t.controller.dispose();var n=t.dataZoomInfos;n[e]&&(delete n[e],t.count--)}),Rc(n)}function Lc(t,e){if(t&&"dataZoom"===t.type&&t.batch)for(var n=0,i=t.batch.length;ni["type_"+e]&&(e=r),o(n,t.roamControllerOpt)}),{controlType:e,opt:n}}function Hc(t,e){Jb[t]=e}function Wc(t){return Jb[t]}function Zc(t){return 0===t.indexOf("my")}function Uc(t){this.model=t}function Xc(t){this.model=t}function jc(t){var e={},n=[],i=[];return t.eachRawSeries(function(t){var r=t.coordinateSystem;if(!r||"cartesian2d"!==r.type&&"polar"!==r.type)n.push(t);else{var o=r.getBaseAxis();if("category"===o.type){var a=o.dim+"_"+o.index;e[a]||(e[a]={categoryAxis:o,valueAxis:r.getOtherAxis(o),series:[]},i.push({axisDim:o.dim,axisIndex:o.index})),e[a].series.push(t)}else n.push(t)}}),{seriesGroupByCategoryAxis:e,other:n,meta:i}}function Yc(t){var e=[];return d(t,function(t,n){var i=t.categoryAxis,r=t.valueAxis.dim,o=[" "].concat(f(t.series,function(t){return t.name})),a=[i.model.getCategories()];d(t.series,function(t){a.push(t.getRawData().mapArray(r,function(t){return t}))});for(var s=[o.join(lS)],l=0;l=0)return!0}function Jc(t){for(var e=t.split(/\n+/g),n=[],i=f(Kc(e.shift()).split(hS),function(t){return{name:t,data:[]}}),r=0;rvS}function yd(t){var e=t.length-1;return e<0&&(e=0),[t[0],t[e]]}function xd(t,e,n,i){var r=new Xp;return r.add(new lv({name:"main",style:Sd(n),silent:!0,draggable:!0,cursor:"move",drift:uS(t,e,r,"nswe"),ondragend:uS(md,e,{isEnd:!0})})),cS(i,function(n){r.add(new lv({name:n,style:{opacity:0},draggable:!0,silent:!0,invisible:!0,drift:uS(t,e,r,n),ondragend:uS(md,e,{isEnd:!0})}))}),r}function _d(t,e,n,i){var r=i.brushStyle.lineWidth||0,o=pS(r,yS),a=n[0][0],s=n[1][0],l=a-r/2,h=s-r/2,u=n[0][1],c=n[1][1],d=u-o+r/2,f=c-o+r/2,p=u-a,g=c-s,m=p+r,v=g+r;bd(t,e,"main",a,s,p,g),i.transformable&&(bd(t,e,"w",l,h,o,v),bd(t,e,"e",d,h,o,v),bd(t,e,"n",l,h,m,o),bd(t,e,"s",l,f,m,o),bd(t,e,"nw",l,h,o,o),bd(t,e,"ne",d,h,o,o),bd(t,e,"sw",l,f,o,o),bd(t,e,"se",d,f,o,o))}function wd(t,e){var n=e.__brushOption,i=n.transformable,r=e.childAt(0);r.useStyle(Sd(n)),r.attr({silent:!i,cursor:i?"move":"default"}),cS(["w","e","n","s","se","sw","ne","nw"],function(n){var r=e.childOfName(n),o=Td(t,n);r&&r.attr({silent:!i,invisible:!i,cursor:i?wS[o]+"-resize":null})})}function bd(t,e,n,i,r,o,a){var s=e.childOfName(n);s&&s.setShape(Pd(kd(t,e,[[i,r],[i+o,r+a]])))}function Sd(t){return a({strokeNoScale:!0},t.brushStyle)}function Md(t,e,n,i){var r=[fS(t,n),fS(e,i)],o=[pS(t,n),pS(e,i)];return[[r[0],o[0]],[r[1],o[1]]]}function Id(t){return sr(t.group)}function Td(t,e){if(e.length>1)return("e"===(i=[Td(t,(e=e.split(""))[0]),Td(t,e[1])])[0]||"w"===i[0])&&i.reverse(),i.join("");var n={left:"w",right:"e",top:"n",bottom:"s"},i=hr({w:"left",e:"right",n:"top",s:"bottom"}[e],Id(t));return n[i]}function Cd(t,e,n,i,r,o,a,s){var l=i.__brushOption,h=t(l.range),u=Dd(n,o,a);cS(r.split(""),function(t){var e=_S[t];h[e[0]][e[1]]+=u[e[0]]}),l.range=e(Md(h[0][0],h[1][0],h[0][1],h[1][1])),cd(n,i),md(n,{isEnd:!1})}function Ad(t,e,n,i,r){var o=e.__brushOption.range,a=Dd(t,n,i);cS(o,function(t){t[0]+=a[0],t[1]+=a[1]}),cd(t,e),md(t,{isEnd:!1})}function Dd(t,e,n){var i=t.group,r=i.transformCoordToLocal(e,n),o=i.transformCoordToLocal(0,0);return[r[0]-o[0],r[1]-o[1]]}function kd(t,e,i){var r=pd(t,e);return r&&!0!==r?r.clipPath(i,t._transform):n(i)}function Pd(t){var e=fS(t[0][0],t[1][0]),n=fS(t[0][1],t[1][1]);return{x:e,y:n,width:pS(t[0][0],t[1][0])-e,height:pS(t[0][1],t[1][1])-n}}function Ld(t,e,n){if(t._brushType){var i=t._zr,r=t._covers,o=fd(t,e,n);if(!t._dragging)for(var a=0;a=0)&&t(o,i,r)})}function Ud(t){return t[0]>t[1]&&t.reverse(),t}function Xd(t,e){return An(t,e,{includeMainTypes:PS})}function jd(t,e,n,i){var r=n.getAxis(["x","y"][t]),o=Ud(f([0,1],function(t){return e?r.coordToData(r.toLocalCoord(i[t])):r.toGlobalCoord(r.dataToCoord(i[t]))})),a=[];return a[t]=o,a[1-t]=[NaN,NaN],{values:o,xyMinMax:a}}function Yd(t,e,n,i){return[e[0]-i[t]*n[0],e[1]-i[t]*n[1]]}function qd(t,e){var n=$d(t),i=$d(e),r=[n[0]/i[0],n[1]/i[1]];return isNaN(r[0])&&(r[0]=1),isNaN(r[1])&&(r[1]=1),r}function $d(t){return t?[t[0][1]-t[0][0],t[1][1]-t[1][0]]:[NaN,NaN]}function Kd(t,e){var n=ef(t);BS(e,function(e,i){for(var r=n.length-1;r>=0&&!n[r][i];r--);if(r<0){var o=t.queryComponents({mainType:"dataZoom",subType:"select",id:i})[0];if(o){var a=o.getPercentRange();n[0][i]={dataZoomId:i,start:a[0],end:a[1]}}}}),n.push(e)}function Qd(t){var e=ef(t),n=e[e.length-1];e.length>1&&e.pop();var i={};return BS(n,function(t,n){for(var r=e.length-1;r>=0;r--)if(t=e[r][n]){i[n]=t;break}}),i}function Jd(t){t[VS]=null}function tf(t){return ef(t).length}function ef(t){var e=t[VS];return e||(e=t[VS]=[{}]),e}function nf(t,e,n){(this._brushController=new rd(n.getZr())).on("brush",m(this._onBrush,this)).mount(),this._isZoomActive}function rf(t){var e={};return d(["xAxisIndex","yAxisIndex"],function(n){e[n]=t[n],null==e[n]&&(e[n]="all"),(!1===e[n]||"none"===e[n])&&(e[n]=[])}),e}function of(t,e){t.setIconStatus("back",tf(e)>1?"emphasis":"normal")}function af(t,e,n,i,r){var o=n._isZoomActive;i&&"takeGlobalCursor"===i.type&&(o="dataZoomSelect"===i.key&&i.dataZoomSelectActive),n._isZoomActive=o,t.setIconStatus("zoom",o?"emphasis":"normal");var a=new Zd(rf(t.option),e,{include:["grid"]});n._brushController.setPanels(a.makePanelOpts(r,function(t){return t.xAxisDeclared&&!t.yAxisDeclared?"lineX":!t.xAxisDeclared&&t.yAxisDeclared?"lineY":"rect"})).enableBrush(!!o&&{brushType:"auto",brushStyle:{lineWidth:0,fill:"rgba(0,0,0,0.2)"}})}function sf(t){this.model=t}function lf(t){return XS(t)}function hf(){if(!qS&&$S){qS=!0;var t=$S.styleSheets;t.length<31?$S.createStyleSheet().addRule(".zrvml","behavior:url(#default#VML)"):t[0].addRule(".zrvml","behavior:url(#default#VML)")}}function uf(t){return parseInt(t,10)}function cf(t,e){hf(),this.root=t,this.storage=e;var n=document.createElement("div"),i=document.createElement("div");n.style.cssText="display:inline-block;overflow:hidden;position:relative;width:300px;height:150px;",i.style.cssText="position:absolute;left:0;top:0;",t.appendChild(n),this._vmlRoot=i,this._vmlViewport=n,this.resize();var r=e.delFromStorage,o=e.addToStorage;e.delFromStorage=function(t){r.call(e,t),t&&t.onRemove&&t.onRemove(i)},e.addToStorage=function(t){t.onAdd&&t.onAdd(i),o.call(e,t)},this._firstPaint=!0}function df(t){return function(){Fp('In IE8.0 VML mode painter not support method "'+t+'"')}}function ff(t){return document.createElementNS(kM,t)}function pf(t){return zM(1e4*t)/1e4}function gf(t){return t-FM}function mf(t,e){var n=e?t.textFill:t.fill;return null!=n&&n!==OM}function vf(t,e){var n=e?t.textStroke:t.stroke;return null!=n&&n!==OM}function yf(t,e){e&&xf(t,"transform","matrix("+LM.call(e,",")+")")}function xf(t,e,n){(!n||"linear"!==n.type&&"radial"!==n.type)&&t.setAttribute(e,n)}function _f(t,e,n){t.setAttributeNS("http://www.w3.org/1999/xlink",e,n)}function wf(t,e,n){if(mf(e,n)){var i=n?e.textFill:e.fill;i="transparent"===i?OM:i,"none"!==t.getAttribute("clip-path")&&i===OM&&(i="rgba(0, 0, 0, 0.002)"),xf(t,"fill",i),xf(t,"fill-opacity",e.opacity)}else xf(t,"fill",OM);if(vf(e,n)){var r=n?e.textStroke:e.stroke;xf(t,"stroke",r="transparent"===r?OM:r),xf(t,"stroke-width",(n?e.textStrokeWidth:e.lineWidth)/(!n&&e.strokeNoScale?e.host.getLineScale():1)),xf(t,"paint-order",n?"stroke":"fill"),xf(t,"stroke-opacity",e.opacity),e.lineDash?(xf(t,"stroke-dasharray",e.lineDash.join(",")),xf(t,"stroke-dashoffset",zM(e.lineDashOffset||0))):xf(t,"stroke-dasharray",""),e.lineCap&&xf(t,"stroke-linecap",e.lineCap),e.lineJoin&&xf(t,"stroke-linejoin",e.lineJoin),e.miterLimit&&xf(t,"stroke-miterlimit",e.miterLimit)}else xf(t,"stroke",OM)}function bf(t){for(var e=[],n=t.data,i=t.len(),r=0;r=BM||!gf(g)&&(d>-NM&&d<0||d>NM)==!!p;var y=pf(s+h*RM(c)),x=pf(l+u*EM(c));m&&(d=p?BM-1e-4:1e-4-BM,v=!0,9===r&&e.push("M",y,x));var _=pf(s+h*RM(c+d)),w=pf(l+u*EM(c+d));e.push("A",pf(h),pf(u),zM(f*VM),+v,+p,_,w);break;case PM.Z:o="Z";break;case PM.R:var _=pf(n[r++]),w=pf(n[r++]),b=pf(n[r++]),S=pf(n[r++]);e.push("M",_,w,"L",_+b,w,"L",_+b,w+S,"L",_,w+S,"L",_,w)}o&&e.push(o);for(var M=0;M=11)}}(navigator.userAgent),Uf={"[object Function]":1,"[object RegExp]":1,"[object Date]":1,"[object Error]":1,"[object CanvasGradient]":1,"[object CanvasPattern]":1,"[object Image]":1,"[object Canvas]":1},Xf={"[object Int8Array]":1,"[object Uint8Array]":1,"[object Uint8ClampedArray]":1,"[object Int16Array]":1,"[object Uint16Array]":1,"[object Int32Array]":1,"[object Uint32Array]":1,"[object Float32Array]":1,"[object Float64Array]":1},jf=Object.prototype.toString,Yf=Array.prototype,qf=Yf.forEach,$f=Yf.filter,Kf=Yf.slice,Qf=Yf.map,Jf=Yf.reduce,tp={},ep=function(){return tp.createCanvas()};tp.createCanvas=function(){return document.createElement("canvas")};var np,ip="__ec_primitive__";E.prototype={constructor:E,get:function(t){return this.hasOwnProperty(t)?this[t]:null},set:function(t,e){return this[t]=e},each:function(t,e){void 0!==e&&(t=m(t,e));for(var n in this)this.hasOwnProperty(n)&&t(this[n],n)},removeKey:function(t){delete this[t]}};var rp=(Object.freeze||Object)({$override:e,clone:n,merge:i,mergeAll:r,extend:o,defaults:a,createCanvas:ep,getContext:s,indexOf:l,inherits:h,mixin:u,isArrayLike:c,each:d,map:f,reduce:p,filter:g,find:function(t,e,n){if(t&&e)for(var i=0,r=t.length;i3&&(e=cp.call(e,1));for(var i=this._$handlers[t],r=i.length,o=0;o4&&(e=cp.call(e,1,e.length-1));for(var i=e[e.length-1],r=this._$handlers[t],o=r.length,a=0;a=0;o--){var a;if(i[o]!==n&&!i[o].ignore&&(a=it(i[o],t,e))&&(!r.topTarget&&(r.topTarget=i[o]),a!==fp)){r.target=i[o];break}}return r}},d(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],function(t){gp.prototype[t]=function(e){var n=this.findHover(e.zrX,e.zrY),i=n.target;if("mousedown"===t)this._downEl=i,this._downPoint=[e.zrX,e.zrY],this._upEl=i;else if("mouseup"===t)this._upEl=i;else if("click"===t){if(this._downEl!==this._upEl||!this._downPoint||lp(this._downPoint,[e.zrX,e.zrY])>4)return;this._downPoint=null}this.dispatchToElement(n,t,e)}}),u(gp,dp),u(gp,J);var mp="undefined"==typeof Float32Array?Array:Float32Array,vp=(Object.freeze||Object)({create:rt,identity:ot,copy:at,mul:st,translate:lt,rotate:ht,scale:ut,invert:ct,clone:function(t){var e=rt();return at(e,t),e}}),yp=ot,xp=5e-5,_p=function(t){(t=t||{}).position||(this.position=[0,0]),null==t.rotation&&(this.rotation=0),t.scale||(this.scale=[1,1]),this.origin=this.origin||null},wp=_p.prototype;wp.transform=null,wp.needLocalTransform=function(){return dt(this.rotation)||dt(this.position[0])||dt(this.position[1])||dt(this.scale[0]-1)||dt(this.scale[1]-1)},wp.updateTransform=function(){var t=this.parent,e=t&&t.transform,n=this.needLocalTransform(),i=this.transform;n||e?(i=i||rt(),n?this.getLocalTransform(i):yp(i),e&&(n?st(i,t.transform,i):at(i,t.transform)),this.transform=i,this.invTransform=this.invTransform||rt(),ct(this.invTransform,i)):i&&yp(i)},wp.getLocalTransform=function(t){return _p.getLocalTransform(this,t)},wp.setTransform=function(t){var e=this.transform,n=t.dpr||1;e?t.setTransform(n*e[0],n*e[1],n*e[2],n*e[3],n*e[4],n*e[5]):t.setTransform(n,0,0,n,0,0)},wp.restoreTransform=function(t){var e=t.dpr||1;t.setTransform(e,0,0,e,0,0)};var bp=[];wp.decomposeTransform=function(){if(this.transform){var t=this.parent,e=this.transform;t&&t.transform&&(st(bp,t.invTransform,e),e=bp);var n=e[0]*e[0]+e[1]*e[1],i=e[2]*e[2]+e[3]*e[3],r=this.position,o=this.scale;dt(n-1)&&(n=Math.sqrt(n)),dt(i-1)&&(i=Math.sqrt(i)),e[0]<0&&(n=-n),e[3]<0&&(i=-i),r[0]=e[4],r[1]=e[5],o[0]=n,o[1]=i,this.rotation=Math.atan2(-e[1]/i,e[0]/n)}},wp.getGlobalScale=function(){var t=this.transform;if(!t)return[1,1];var e=Math.sqrt(t[0]*t[0]+t[1]*t[1]),n=Math.sqrt(t[2]*t[2]+t[3]*t[3]);return t[0]<0&&(e=-e),t[3]<0&&(n=-n),[e,n]},wp.transformCoordToLocal=function(t,e){var n=[t,e],i=this.invTransform;return i&&$(n,n,i),n},wp.transformCoordToGlobal=function(t,e){var n=[t,e],i=this.transform;return i&&$(n,n,i),n},_p.getLocalTransform=function(t,e){yp(e=e||[]);var n=t.origin,i=t.scale||[1,1],r=t.rotation||0,o=t.position||[0,0];return n&&(e[4]-=n[0],e[5]-=n[1]),ut(e,e,i),r&&ht(e,e,r),n&&(e[4]+=n[0],e[5]+=n[1]),e[4]+=o[0],e[5]+=o[1],e};var Sp={linear:function(t){return t},quadraticIn:function(t){return t*t},quadraticOut:function(t){return t*(2-t)},quadraticInOut:function(t){return(t*=2)<1?.5*t*t:-.5*(--t*(t-2)-1)},cubicIn:function(t){return t*t*t},cubicOut:function(t){return--t*t*t+1},cubicInOut:function(t){return(t*=2)<1?.5*t*t*t:.5*((t-=2)*t*t+2)},quarticIn:function(t){return t*t*t*t},quarticOut:function(t){return 1- --t*t*t*t},quarticInOut:function(t){return(t*=2)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2)},quinticIn:function(t){return t*t*t*t*t},quinticOut:function(t){return--t*t*t*t*t+1},quinticInOut:function(t){return(t*=2)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2)},sinusoidalIn:function(t){return 1-Math.cos(t*Math.PI/2)},sinusoidalOut:function(t){return Math.sin(t*Math.PI/2)},sinusoidalInOut:function(t){return.5*(1-Math.cos(Math.PI*t))},exponentialIn:function(t){return 0===t?0:Math.pow(1024,t-1)},exponentialOut:function(t){return 1===t?1:1-Math.pow(2,-10*t)},exponentialInOut:function(t){return 0===t?0:1===t?1:(t*=2)<1?.5*Math.pow(1024,t-1):.5*(2-Math.pow(2,-10*(t-1)))},circularIn:function(t){return 1-Math.sqrt(1-t*t)},circularOut:function(t){return Math.sqrt(1- --t*t)},circularInOut:function(t){return(t*=2)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},elasticIn:function(t){var e,n=.1;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=.1):e=.4*Math.asin(1/n)/(2*Math.PI),-n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/.4))},elasticOut:function(t){var e,n=.1;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=.1):e=.4*Math.asin(1/n)/(2*Math.PI),n*Math.pow(2,-10*t)*Math.sin((t-e)*(2*Math.PI)/.4)+1)},elasticInOut:function(t){var e,n=.1;return 0===t?0:1===t?1:(!n||n<1?(n=1,e=.1):e=.4*Math.asin(1/n)/(2*Math.PI),(t*=2)<1?n*Math.pow(2,10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/.4)*-.5:n*Math.pow(2,-10*(t-=1))*Math.sin((t-e)*(2*Math.PI)/.4)*.5+1)},backIn:function(t){var e=1.70158;return t*t*((e+1)*t-e)},backOut:function(t){var e=1.70158;return--t*t*((e+1)*t+e)+1},backInOut:function(t){var e=2.5949095;return(t*=2)<1?t*t*((e+1)*t-e)*.5:.5*((t-=2)*t*((e+1)*t+e)+2)},bounceIn:function(t){return 1-Sp.bounceOut(1-t)},bounceOut:function(t){return t<1/2.75?7.5625*t*t:t<2/2.75?7.5625*(t-=1.5/2.75)*t+.75:t<2.5/2.75?7.5625*(t-=2.25/2.75)*t+.9375:7.5625*(t-=2.625/2.75)*t+.984375},bounceInOut:function(t){return t<.5?.5*Sp.bounceIn(2*t):.5*Sp.bounceOut(2*t-1)+.5}};ft.prototype={constructor:ft,step:function(t,e){if(this._initialized||(this._startTime=t+this._delay,this._initialized=!0),this._paused)this._pausedTime+=e;else{var n=(t-this._startTime-this._pausedTime)/this._life;if(!(n<0)){n=Math.min(n,1);var i=this.easing,r="string"==typeof i?Sp[i]:i,o="function"==typeof r?r(n):n;return this.fire("frame",o),1==n?this.loop?(this.restart(t),"restart"):(this._needsRemove=!0,"destroy"):null}}},restart:function(t){var e=(t-this._startTime-this._pausedTime)%this._life;this._startTime=t-e+this.gap,this._pausedTime=0,this._needsRemove=!1},fire:function(t,e){this[t="on"+t]&&this[t](this._target,e)},pause:function(){this._paused=!0},resume:function(){this._paused=!1}};var Mp=function(){this.head=null,this.tail=null,this._len=0},Ip=Mp.prototype;Ip.insert=function(t){var e=new Tp(t);return this.insertEntry(e),e},Ip.insertEntry=function(t){this.head?(this.tail.next=t,t.prev=this.tail,t.next=null,this.tail=t):this.head=this.tail=t,this._len++},Ip.remove=function(t){var e=t.prev,n=t.next;e?e.next=n:this.head=n,n?n.prev=e:this.tail=e,t.next=t.prev=null,this._len--},Ip.len=function(){return this._len},Ip.clear=function(){this.head=this.tail=null,this._len=0};var Tp=function(t){this.value=t,this.next,this.prev},Cp=function(t){this._list=new Mp,this._map={},this._maxSize=t||10,this._lastRemovedEntry=null},Ap=Cp.prototype;Ap.put=function(t,e){var n=this._list,i=this._map,r=null;if(null==i[t]){var o=n.len(),a=this._lastRemovedEntry;if(o>=this._maxSize&&o>0){var s=n.head;n.remove(s),delete i[s.key],r=s.value,this._lastRemovedEntry=s}a?a.value=e:a=new Tp(e),a.key=t,n.insertEntry(a),i[t]=a}return r},Ap.get=function(t){var e=this._map[t],n=this._list;if(null!=e)return e!==n.tail&&(n.remove(e),n.insertEntry(e)),e.value},Ap.clear=function(){this._list.clear(),this._map={}};var Dp={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]},kp=new Cp(20),Pp=null,Lp=Dt,Op=kt,zp=(Object.freeze||Object)({parse:Mt,lift:Ct,toHex:At,fastLerp:Dt,fastMapToColor:Lp,lerp:kt,mapToColor:Op,modifyHSL:function(t,e,n,i){if(t=Mt(t))return t=Tt(t),null!=e&&(t[0]=gt(e)),null!=n&&(t[1]=yt(n)),null!=i&&(t[2]=yt(i)),Lt(It(t),"rgba")},modifyAlpha:Pt,stringify:Lt}),Ep=Array.prototype.slice,Rp=function(t,e,n,i){this._tracks={},this._target=t,this._loop=e||!1,this._getter=n||Ot,this._setter=i||zt,this._clipCount=0,this._delay=0,this._doneList=[],this._onframeList=[],this._clipList=[]};Rp.prototype={when:function(t,e){var n=this._tracks;for(var i in e)if(e.hasOwnProperty(i)){if(!n[i]){n[i]=[];var r=this._getter(this._target,i);if(null==r)continue;0!==t&&n[i].push({time:0,value:Ht(r)})}n[i].push({time:t,value:e[i]})}return this},during:function(t){return this._onframeList.push(t),this},pause:function(){for(var t=0;t0&&this.animate(t,!1).when(null==i?500:i,o).delay(r||0),this}};var Hp=function(t){_p.call(this,t),dp.call(this,t),Gp.call(this,t),this.id=t.id||Hf()};Hp.prototype={type:"element",name:"",__zr:null,ignore:!1,clipPath:null,isGroup:!1,drift:function(t,e){switch(this.draggable){case"horizontal":e=0;break;case"vertical":t=0}var n=this.transform;n||(n=this.transform=[1,0,0,1,0,0]),n[4]+=t,n[5]+=e,this.decomposeTransform(),this.dirty(!1)},beforeUpdate:function(){},afterUpdate:function(){},update:function(){this.updateTransform()},traverse:function(t,e){},attrKV:function(t,e){if("position"===t||"scale"===t||"origin"===t){if(e){var n=this[t];n||(n=this[t]=[]),n[0]=e[0],n[1]=e[1]}}else this[t]=e},hide:function(){this.ignore=!0,this.__zr&&this.__zr.refresh()},show:function(){this.ignore=!1,this.__zr&&this.__zr.refresh()},attr:function(t,e){if("string"==typeof t)this.attrKV(t,e);else if(w(t))for(var n in t)t.hasOwnProperty(n)&&this.attrKV(n,t[n]);return this.dirty(!1),this},setClipPath:function(t){var e=this.__zr;e&&t.addSelfToZr(e),this.clipPath&&this.clipPath!==t&&this.removeClipPath(),this.clipPath=t,t.__zr=e,t.__clipTarget=this,this.dirty(!1)},removeClipPath:function(){var t=this.clipPath;t&&(t.__zr&&t.removeSelfFromZr(t.__zr),t.__zr=null,t.__clipTarget=null,this.clipPath=null,this.dirty(!1))},addSelfToZr:function(t){this.__zr=t;var e=this.animators;if(e)for(var n=0;n=n.x&&t<=n.x+n.width&&e>=n.y&&e<=n.y+n.height},clone:function(){return new Xt(this.x,this.y,this.width,this.height)},copy:function(t){this.x=t.x,this.y=t.y,this.width=t.width,this.height=t.height},plain:function(){return{x:this.x,y:this.y,width:this.width,height:this.height}}},Xt.create=function(t){return new Xt(t.x,t.y,t.width,t.height)};var Xp=function(t){t=t||{},Hp.call(this,t);for(var e in t)t.hasOwnProperty(e)&&(this[e]=t[e]);this._children=[],this.__storage=null,this.__dirty=!0};Xp.prototype={constructor:Xp,isGroup:!0,type:"group",silent:!1,children:function(){return this._children.slice()},childAt:function(t){return this._children[t]},childOfName:function(t){for(var e=this._children,n=0;n=0&&(n.splice(i,0,t),this._doAdd(t))}return this},_doAdd:function(t){t.parent&&t.parent.remove(t),t.parent=this;var e=this.__storage,n=this.__zr;e&&e!==t.__storage&&(e.addToStorage(t),t instanceof Xp&&t.addChildrenToStorage(e)),n&&n.refresh()},remove:function(t){var e=this.__zr,n=this.__storage,i=this._children,r=l(i,t);return r<0?this:(i.splice(r,1),t.parent=null,n&&(n.delFromStorage(t),t instanceof Xp&&t.delChildrenFromStorage(n)),e&&e.refresh(),this)},removeAll:function(){var t,e,n=this._children,i=this.__storage;for(e=0;e=0&&(this.delFromStorage(t),this._roots.splice(r,1),t instanceof Xp&&t.delChildrenFromStorage(this))}},addToStorage:function(t){return t&&(t.__storage=this,t.dirty(!1)),this},delFromStorage:function(t){return t&&(t.__storage=null),this},dispose:function(){this._renderList=this._roots=null},displayableSortFunc:ee};var $p={shadowBlur:1,shadowOffsetX:1,shadowOffsetY:1,textShadowBlur:1,textShadowOffsetX:1,textShadowOffsetY:1,textBoxShadowBlur:1,textBoxShadowOffsetX:1,textBoxShadowOffsetY:1},Kp=function(t,e,n){return $p.hasOwnProperty(e)?n*=t.dpr:n},Qp=[["shadowBlur",0],["shadowOffsetX",0],["shadowOffsetY",0],["shadowColor","#000"],["lineCap","butt"],["lineJoin","miter"],["miterLimit",10]],Jp=function(t,e){this.extendFrom(t,!1),this.host=e};Jp.prototype={constructor:Jp,host:null,fill:"#000",stroke:null,opacity:1,lineDash:null,lineDashOffset:0,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,lineWidth:1,strokeNoScale:!1,text:null,font:null,textFont:null,fontStyle:null,fontWeight:null,fontSize:null,fontFamily:null,textTag:null,textFill:"#000",textStroke:null,textWidth:null,textHeight:null,textStrokeWidth:0,textLineHeight:null,textPosition:"inside",textRect:null,textOffset:null,textAlign:null,textVerticalAlign:null,textDistance:5,textShadowColor:"transparent",textShadowBlur:0,textShadowOffsetX:0,textShadowOffsetY:0,textBoxShadowColor:"transparent",textBoxShadowBlur:0,textBoxShadowOffsetX:0,textBoxShadowOffsetY:0,transformText:!1,textRotation:0,textOrigin:null,textBackgroundColor:null,textBorderColor:null,textBorderWidth:0,textBorderRadius:0,textPadding:null,rich:null,truncate:null,blend:null,bind:function(t,e,n){for(var i=this,r=n&&n.style,o=!r,a=0;a0},extendFrom:function(t,e){if(t)for(var n in t)!t.hasOwnProperty(n)||!0!==e&&(!1===e?this.hasOwnProperty(n):null==t[n])||(this[n]=t[n])},set:function(t,e){"string"==typeof t?this[t]=e:this.extendFrom(t,!0)},clone:function(){var t=new this.constructor;return t.extendFrom(this,!0),t},getGradient:function(t,e,n){for(var i=("radial"===e.type?ie:ne)(t,e,n),r=e.colorStops,o=0;o=0&&n.splice(i,1),t.__hoverMir=null},clearHover:function(t){for(var e=this._hoverElements,n=0;n15)break}s.__drawIndex=g,s.__drawIndex0&&t>i[0]){for(a=0;at);a++);o=n[i[a]]}if(i.splice(a+1,0,t),n[t]=e,!e.virtual)if(o){var l=o.dom;l.nextSibling?s.insertBefore(e.dom,l.nextSibling):s.appendChild(e.dom)}else s.firstChild?s.insertBefore(e.dom,s.firstChild):s.appendChild(e.dom)}else Fp("Layer of zlevel "+t+" is not valid")},eachLayer:function(t,e){var n,i,r=this._zlevelList;for(i=0;i0?.01:0),this._needsManuallyCompositing),o.__builtin__||Fp("ZLevel "+s+" has been used by unkown layer "+o.id),o!==n&&(o.__used=!0,o.__startIndex!==r&&(o.__dirty=!0),o.__startIndex=r,o.incremental?o.__drawIndex=-1:o.__drawIndex=r,e(r),n=o),a.__dirty&&(o.__dirty=!0,o.incremental&&o.__drawIndex<0&&(o.__drawIndex=r))}e(r),this.eachBuiltinLayer(function(t,e){!t.__used&&t.getElementCount()>0&&(t.__dirty=!0,t.__startIndex=t.__endIndex=t.__drawIndex=0),t.__dirty&&t.__drawIndex<0&&(t.__drawIndex=t.__startIndex)})},clear:function(){return this.eachBuiltinLayer(this._clearLayer),this},_clearLayer:function(t){t.clear()},configLayer:function(t,e){if(e){var n=this._layerConfig;n[t]?i(n[t],e,!0):n[t]=e;for(var r=0;r=0&&this._clips.splice(e,1)},removeAnimator:function(t){for(var e=t.getClips(),n=0;n1&&i&&i.length>1){var o=ln(i)/ln(r);!isFinite(o)&&(o=1),e.pinchScale=o;var a=hn(i);return e.pinchX=a[0],e.pinchY=a[1],{type:"pinch",target:t[0].target,event:e}}}}},Tg=["click","dblclick","mousewheel","mouseout","mouseup","mousedown","mousemove","contextmenu"],Cg=["touchstart","touchend","touchmove"],Ag={pointerdown:1,pointerup:1,pointermove:1,pointerout:1},Dg=f(Tg,function(t){var e=t.replace("mouse","pointer");return Ag[e]?e:t}),kg={mousemove:function(t){t=rn(this.dom,t),this.trigger("mousemove",t)},mouseout:function(t){var e=(t=rn(this.dom,t)).toElement||t.relatedTarget;if(e!=this.dom)for(;e&&9!=e.nodeType;){if(e===this.dom)return;e=e.parentNode}this.trigger("mouseout",t)},touchstart:function(t){(t=rn(this.dom,t)).zrByTouch=!0,this._lastTouchMoment=new Date,cn(this,t,"start"),kg.mousemove.call(this,t),kg.mousedown.call(this,t),dn(this)},touchmove:function(t){(t=rn(this.dom,t)).zrByTouch=!0,cn(this,t,"change"),kg.mousemove.call(this,t),dn(this)},touchend:function(t){(t=rn(this.dom,t)).zrByTouch=!0,cn(this,t,"end"),kg.mouseup.call(this,t),+new Date-this._lastTouchMoment<300&&kg.click.call(this,t),dn(this)},pointerdown:function(t){kg.mousedown.call(this,t)},pointermove:function(t){fn(t)||kg.mousemove.call(this,t)},pointerup:function(t){kg.mouseup.call(this,t)},pointerout:function(t){fn(t)||kg.mouseout.call(this,t)}};d(["click","mousedown","mouseup","mousewheel","dblclick","contextmenu"],function(t){kg[t]=function(e){e=rn(this.dom,e),this.trigger(t,e)}});var Pg=gn.prototype;Pg.dispose=function(){for(var t=Tg.concat(Cg),e=0;e=0||i&&l(i,a)<0)){var s=e.getShallow(a);null!=s&&(r[t[o][0]]=s)}}return r}},jg=Xg([["lineWidth","width"],["stroke","color"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]),Yg={getLineStyle:function(t){var e=jg(this,t),n=this.getLineDash(e.lineWidth);return n&&(e.lineDash=n),e},getLineDash:function(t){null==t&&(t=1);var e=this.get("type"),n=Math.max(t,2),i=4*t;return"solid"===e||null==e?null:"dashed"===e?[i,i]:[n,n]}},qg=Xg([["fill","color"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["opacity"],["shadowColor"]]),$g={getAreaStyle:function(t,e){return qg(this,t,e)}},Kg=Math.pow,Qg=Math.sqrt,Jg=1e-8,tm=1e-4,em=Qg(3),nm=1/3,im=B(),rm=B(),om=B(),am=Math.min,sm=Math.max,lm=Math.sin,hm=Math.cos,um=2*Math.PI,cm=B(),dm=B(),fm=B(),pm=[],gm=[],mm={M:1,L:2,C:3,Q:4,A:5,Z:6,R:7},vm=[],ym=[],xm=[],_m=[],wm=Math.min,bm=Math.max,Sm=Math.cos,Mm=Math.sin,Im=Math.sqrt,Tm=Math.abs,Cm="undefined"!=typeof Float32Array,Am=function(t){this._saveData=!t,this._saveData&&(this.data=[]),this._ctx=null};Am.prototype={constructor:Am,_xi:0,_yi:0,_x0:0,_y0:0,_ux:0,_uy:0,_len:0,_lineDash:null,_dashOffset:0,_dashIdx:0,_dashSum:0,setScale:function(t,e){this._ux=Tm(1/Bp/t)||0,this._uy=Tm(1/Bp/e)||0},getContext:function(){return this._ctx},beginPath:function(t){return this._ctx=t,t&&t.beginPath(),t&&(this.dpr=t.dpr),this._saveData&&(this._len=0),this._lineDash&&(this._lineDash=null,this._dashOffset=0),this},moveTo:function(t,e){return this.addData(mm.M,t,e),this._ctx&&this._ctx.moveTo(t,e),this._x0=t,this._y0=e,this._xi=t,this._yi=e,this},lineTo:function(t,e){var n=Tm(t-this._xi)>this._ux||Tm(e-this._yi)>this._uy||this._len<5;return this.addData(mm.L,t,e),this._ctx&&n&&(this._needsDash()?this._dashedLineTo(t,e):this._ctx.lineTo(t,e)),n&&(this._xi=t,this._yi=e),this},bezierCurveTo:function(t,e,n,i,r,o){return this.addData(mm.C,t,e,n,i,r,o),this._ctx&&(this._needsDash()?this._dashedBezierTo(t,e,n,i,r,o):this._ctx.bezierCurveTo(t,e,n,i,r,o)),this._xi=r,this._yi=o,this},quadraticCurveTo:function(t,e,n,i){return this.addData(mm.Q,t,e,n,i),this._ctx&&(this._needsDash()?this._dashedQuadraticTo(t,e,n,i):this._ctx.quadraticCurveTo(t,e,n,i)),this._xi=n,this._yi=i,this},arc:function(t,e,n,i,r,o){return this.addData(mm.A,t,e,n,n,i,r-i,0,o?0:1),this._ctx&&this._ctx.arc(t,e,n,i,r,o),this._xi=Sm(r)*n+t,this._yi=Mm(r)*n+t,this},arcTo:function(t,e,n,i,r){return this._ctx&&this._ctx.arcTo(t,e,n,i,r),this},rect:function(t,e,n,i){return this._ctx&&this._ctx.rect(t,e,n,i),this.addData(mm.R,t,e,n,i),this},closePath:function(){this.addData(mm.Z);var t=this._ctx,e=this._x0,n=this._y0;return t&&(this._needsDash()&&this._dashedLineTo(e,n),t.closePath()),this._xi=e,this._yi=n,this},fill:function(t){t&&t.fill(),this.toStatic()},stroke:function(t){t&&t.stroke(),this.toStatic()},setLineDash:function(t){if(t instanceof Array){this._lineDash=t,this._dashIdx=0;for(var e=0,n=0;ne.length&&(this._expandData(),e=this.data);for(var n=0;n0&&f<=t||u<0&&f>=t||0==u&&(c>0&&p<=e||c<0&&p>=e);)f+=u*(n=a[i=this._dashIdx]),p+=c*n,this._dashIdx=(i+1)%g,u>0&&fl||c>0&&ph||s[i%2?"moveTo":"lineTo"](u>=0?wm(f,t):bm(f,t),c>=0?wm(p,e):bm(p,e));u=f-t,c=p-e,this._dashOffset=-Im(u*u+c*c)},_dashedBezierTo:function(t,e,n,i,r,o){var a,s,l,h,u,c=this._dashSum,d=this._dashOffset,f=this._lineDash,p=this._ctx,g=this._xi,m=this._yi,v=Gn,y=0,x=this._dashIdx,_=f.length,w=0;for(d<0&&(d=c+d),d%=c,a=0;a<1;a+=.1)s=v(g,t,n,r,a+.1)-v(g,t,n,r,a),l=v(m,e,i,o,a+.1)-v(m,e,i,o,a),y+=Im(s*s+l*l);for(;x<_&&!((w+=f[x])>d);x++);for(a=(w-d)/y;a<=1;)h=v(g,t,n,r,a),u=v(m,e,i,o,a),x%2?p.moveTo(h,u):p.lineTo(h,u),a+=f[x]/y,x=(x+1)%_;x%2!=0&&p.lineTo(r,o),s=r-h,l=o-u,this._dashOffset=-Im(s*s+l*l)},_dashedQuadraticTo:function(t,e,n,i){var r=n,o=i;n=(n+2*t)/3,i=(i+2*e)/3,t=(this._xi+2*t)/3,e=(this._yi+2*e)/3,this._dashedBezierTo(t,e,n,i,r,o)},toStatic:function(){var t=this.data;t instanceof Array&&(t.length=this._len,Cm&&(this.data=new Float32Array(t)))},getBoundingRect:function(){vm[0]=vm[1]=xm[0]=xm[1]=Number.MAX_VALUE,ym[0]=ym[1]=_m[0]=_m[1]=-Number.MAX_VALUE;for(var t=this.data,e=0,n=0,i=0,r=0,o=0;ol||Tm(a-r)>h||c===u-1)&&(t.lineTo(o,a),i=o,r=a);break;case mm.C:t.bezierCurveTo(s[c++],s[c++],s[c++],s[c++],s[c++],s[c++]),i=s[c-2],r=s[c-1];break;case mm.Q:t.quadraticCurveTo(s[c++],s[c++],s[c++],s[c++]),i=s[c-2],r=s[c-1];break;case mm.A:var f=s[c++],p=s[c++],g=s[c++],m=s[c++],v=s[c++],y=s[c++],x=s[c++],_=s[c++],w=g>m?g:m,b=g>m?1:g/m,S=g>m?m/g:1,M=v+y;Math.abs(g-m)>.001?(t.translate(f,p),t.rotate(x),t.scale(b,S),t.arc(0,0,w,v,M,1-_),t.scale(1/b,1/S),t.rotate(-x),t.translate(-f,-p)):t.arc(f,p,w,v,M,1-_),1==c&&(e=Sm(v)*g+f,n=Mm(v)*m+p),i=Sm(M)*g+f,r=Mm(M)*m+p;break;case mm.R:e=i=s[c],n=r=s[c+1],t.rect(s[c++],s[c++],s[c++],s[c++]);break;case mm.Z:t.closePath(),i=e,r=n}}}},Am.CMD=mm;var Dm=2*Math.PI,km=2*Math.PI,Pm=Am.CMD,Lm=2*Math.PI,Om=1e-4,zm=[-1,-1,-1],Em=[-1,-1],Rm=ig.prototype.getCanvasPattern,Nm=Math.abs,Bm=new Am(!0);yi.prototype={constructor:yi,type:"path",__dirtyPath:!0,strokeContainThreshold:5,brush:function(t,e){var n=this.style,i=this.path||Bm,r=n.hasStroke(),o=n.hasFill(),a=n.fill,s=n.stroke,l=o&&!!a.colorStops,h=r&&!!s.colorStops,u=o&&!!a.image,c=r&&!!s.image;if(n.bind(t,this,e),this.setTransform(t),this.__dirty){var d;l&&(d=d||this.getBoundingRect(),this._fillGradient=n.getGradient(t,a,d)),h&&(d=d||this.getBoundingRect(),this._strokeGradient=n.getGradient(t,s,d))}l?t.fillStyle=this._fillGradient:u&&(t.fillStyle=Rm.call(a,t)),h?t.strokeStyle=this._strokeGradient:c&&(t.strokeStyle=Rm.call(s,t));var f=n.lineDash,p=n.lineDashOffset,g=!!t.setLineDash,m=this.getGlobalScale();i.setScale(m[0],m[1]),this.__dirtyPath||f&&!g&&r?(i.beginPath(t),f&&!g&&(i.setLineDash(f),i.setLineDashOffset(p)),this.buildPath(i,this.shape,!1),this.path&&(this.__dirtyPath=!1)):(t.beginPath(),this.path.rebuildPath(t)),o&&i.fill(t),f&&g&&(t.setLineDash(f),t.lineDashOffset=p),r&&i.stroke(t),f&&g&&t.setLineDash([]),null!=n.text&&(this.restoreTransform(t),this.drawRectText(t,this.getBoundingRect()))},buildPath:function(t,e,n){},createPathProxy:function(){this.path=new Am},getBoundingRect:function(){var t=this._rect,e=this.style,n=!t;if(n){var i=this.path;i||(i=this.path=new Am),this.__dirtyPath&&(i.beginPath(),this.buildPath(i,this.shape,!1)),t=i.getBoundingRect()}if(this._rect=t,e.hasStroke()){var r=this._rectWithStroke||(this._rectWithStroke=t.clone());if(this.__dirty||n){r.copy(t);var o=e.lineWidth,a=e.strokeNoScale?this.getLineScale():1;e.hasFill()||(o=Math.max(o,this.strokeContainThreshold||4)),a>1e-10&&(r.width+=o/a,r.height+=o/a,r.x-=o/a/2,r.y-=o/a/2)}return r}return t},contain:function(t,e){var n=this.transformCoordToLocal(t,e),i=this.getBoundingRect(),r=this.style;if(t=n[0],e=n[1],i.contain(t,e)){var o=this.path.data;if(r.hasStroke()){var a=r.lineWidth,s=r.strokeNoScale?this.getLineScale():1;if(s>1e-10&&(r.hasFill()||(a=Math.max(a,this.strokeContainThreshold)),vi(o,a/s,t,e)))return!0}if(r.hasFill())return mi(o,t,e)}return!1},dirty:function(t){null==t&&(t=!0),t&&(this.__dirtyPath=t,this._rect=null),this.__dirty=!0,this.__zr&&this.__zr.refresh(),this.__clipTarget&&this.__clipTarget.dirty()},animateShape:function(t){return this.animate("shape",t)},attrKV:function(t,e){"shape"===t?(this.setShape(e),this.__dirtyPath=!0,this._rect=null):Xe.prototype.attrKV.call(this,t,e)},setShape:function(t,e){var n=this.shape;if(n){if(w(t))for(var i in t)t.hasOwnProperty(i)&&(n[i]=t[i]);else n[t]=e;this.dirty(!0)}return this},getLineScale:function(){var t=this.transform;return t&&Nm(t[0]-1)>1e-10&&Nm(t[3]-1)>1e-10?Math.sqrt(Nm(t[0]*t[3]-t[2]*t[1])):1}},yi.extend=function(t){var e=function(e){yi.call(this,e),t.style&&this.style.extendFrom(t.style,!1);var n=t.shape;if(n){this.shape=this.shape||{};var i=this.shape;for(var r in n)!i.hasOwnProperty(r)&&n.hasOwnProperty(r)&&(i[r]=n[r])}t.init&&t.init.call(this,e)};h(e,yi);for(var n in t)"style"!==n&&"shape"!==n&&(e.prototype[n]=t[n]);return e},h(yi,Xe);var Vm=Am.CMD,Fm=[[],[],[]],Gm=Math.sqrt,Hm=Math.atan2,Wm=function(t,e){var n,i,r,o,a,s,l=t.data,h=Vm.M,u=Vm.C,c=Vm.L,d=Vm.R,f=Vm.A,p=Vm.Q;for(r=0,o=0;r=11?function(){var e,n=this.__clipPaths,i=this.style;if(n)for(var r=0;rn-2?n-1:c+1],h=t[c>n-3?n-1:c+2]);var p=d*d,g=d*p;i.push([Mi(s[0],f[0],l[0],h[0],d,p,g),Mi(s[1],f[1],l[1],h[1],d,p,g)])}return i},ov=function(t,e,n,i){var r,o,a,s,l=[],h=[],u=[],c=[];if(i){a=[1/0,1/0],s=[-1/0,-1/0];for(var d=0,f=t.length;d=n&&o>=r)return{x:n,y:r,width:i-n,height:o-r}},createIcon:dr,Group:Xp,Image:je,Text:Qm,Circle:Jm,Sector:nv,Ring:iv,Polygon:av,Polyline:sv,Rect:lv,Line:hv,BezierCurve:cv,Arc:dv,IncrementalDisplayable:Ci,CompoundPath:fv,LinearGradient:gv,RadialGradient:mv,BoundingRect:Xt}),Sv=["textStyle","color"],Mv={getTextColor:function(t){var e=this.ecModel;return this.getShallow("color")||(!t&&e?e.get(Sv):null)},getFont:function(){return ir({fontStyle:this.getShallow("fontStyle"),fontWeight:this.getShallow("fontWeight"),fontSize:this.getShallow("fontSize"),fontFamily:this.getShallow("fontFamily")},this.ecModel)},getTextRect:function(t){return ce(t,this.getFont(),this.getShallow("align"),this.getShallow("verticalAlign")||this.getShallow("baseline"),this.getShallow("padding"),this.getShallow("rich"),this.getShallow("truncateText"))}},Iv=Xg([["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"],["textPosition"],["textAlign"]]),Tv={getItemStyle:function(t,e){var n=Iv(this,t,e),i=this.getBorderLineDash();return i&&(n.lineDash=i),n},getBorderLineDash:function(){var t=this.get("borderType");return"solid"===t||null==t?null:"dashed"===t?[5,5]:[1,1]}},Cv=u,Av=Cn();fr.prototype={constructor:fr,init:null,mergeOption:function(t){i(this.option,t,!0)},get:function(t,e){return null==t?this.option:pr(this.option,this.parsePath(t),!e&&gr(this,t))},getShallow:function(t,e){var n=this.option,i=null==n?n:n[t],r=!e&&gr(this,t);return null==i&&r&&(i=r.getShallow(t)),i},getModel:function(t,e){var n,i=null==t?this.option:pr(this.option,t=this.parsePath(t));return e=e||(n=gr(this,t))&&n.getModel(t),new fr(i,e,this.ecModel)},isEmpty:function(){return null==this.option},restoreData:function(){},clone:function(){return new(0,this.constructor)(n(this.option))},setReadOnly:function(t){},parsePath:function(t){return"string"==typeof t&&(t=t.split(".")),t},customizeGetParent:function(t){Av(this).getParent=t},isAnimationEnabled:function(){if(!Zf.node){if(null!=this.option.animation)return!!this.option.animation;if(this.parentModel)return this.parentModel.isAnimationEnabled()}}},zn(fr),En(fr),Cv(fr,Yg),Cv(fr,$g),Cv(fr,Mv),Cv(fr,Tv);var Dv=0,kv=1e-4,Pv=/^(?:(\d{4})(?:[-\/](\d{1,2})(?:[-\/](\d{1,2})(?:[T ](\d{1,2})(?::(\d\d)(?::(\d\d)(?:[.,](\d+))?)?)?(Z|[\+\-]\d\d:?\d\d)?)?)?)?)?$/,Lv=(Object.freeze||Object)({linearMap:yr,parsePercent:xr,round:_r,asc:wr,getPrecision:br,getPrecisionSafe:Sr,getPixelPrecision:Mr,getPercentWithPrecision:Ir,MAX_SAFE_INTEGER:9007199254740991,remRadian:Tr,isRadianAroundZero:Cr,parseDate:Ar,quantity:Dr,nice:Pr,reformIntervals:function(t){function e(t,n,i){return t.interval[i]=0}}),Ov=k,zv=["a","b","c","d","e","f","g"],Ev=function(t,e){return"{"+t+(null==e?"":e)+"}"},Rv=function(t){return t<10?"0"+t:t},Nv=ve,Bv=ce,Vv=(Object.freeze||Object)({addCommas:Lr,toCamelCase:Or,normalizeCssArray:Ov,encodeHTML:zr,formatTpl:Er,formatTplSimple:function(t,e,n){return d(e,function(e,i){t=t.replace("{"+i+"}",n?zr(e):e)}),t},getTooltipMarker:Rr,formatTime:Nr,capitalFirst:Br,truncateText:Nv,getTextRect:Bv}),Fv=d,Gv=["left","right","top","bottom","width","height"],Hv=[["width","left","right"],["height","top","bottom"]],Wv=Vr,Zv=(v(Vr,"vertical"),v(Vr,"horizontal"),{getBoxLayoutParams:function(){return{left:this.get("left"),top:this.get("top"),right:this.get("right"),bottom:this.get("bottom"),width:this.get("width"),height:this.get("height")}}}),Uv=Cn(),Xv=fr.extend({type:"component",id:"",name:"",mainType:"",subType:"",componentIndex:0,defaultOption:null,ecModel:null,dependentModels:[],uid:null,layoutMode:null,$constructor:function(t,e,n,i){fr.call(this,t,e,n,i),this.uid=mr("ec_cpt_model")},init:function(t,e,n,i){this.mergeDefaultAndTheme(t,n)},mergeDefaultAndTheme:function(t,e){var n=this.layoutMode,r=n?Wr(t):{};i(t,e.getTheme().get(this.mainType)),i(t,this.getDefaultOption()),n&&Hr(t,r,n)},mergeOption:function(t,e){i(this.option,t,!0);var n=this.layoutMode;n&&Hr(this.option,t,n)},optionUpdated:function(t,e){},getDefaultOption:function(){var t=Uv(this);if(!t.defaultOption){for(var e=[],n=this.constructor;n;){var r=n.prototype.defaultOption;r&&e.push(r),n=n.superClass}for(var o={},a=e.length-1;a>=0;a--)o=i(o,e[a],!0);t.defaultOption=o}return t.defaultOption},getReferringComponents:function(t){return this.ecModel.queryComponents({mainType:t,index:this.get(t+"Index",!0),id:this.get(t+"Id",!0)})}});Bn(Xv,{registerWhenExtend:!0}),function(t){var e={};t.registerSubTypeDefaulter=function(t,n){t=Ln(t),e[t.main]=n},t.determineSubType=function(n,i){var r=i.type;if(!r){var o=Ln(n).main;t.hasSubTypes(n)&&e[o]&&(r=e[o](i))}return r}}(Xv),function(t,e){function n(t){var n={},o=[];return d(t,function(a){var s=i(n,a),h=r(s.originalDeps=e(a),t);s.entryCount=h.length,0===s.entryCount&&o.push(a),d(h,function(t){l(s.predecessor,t)<0&&s.predecessor.push(t);var e=i(n,t);l(e.successor,t)<0&&e.successor.push(a)})}),{graph:n,noEntryList:o}}function i(t,e){return t[e]||(t[e]={predecessor:[],successor:[]}),t[e]}function r(t,e){var n=[];return d(t,function(t){l(e,t)>=0&&n.push(t)}),n}t.topologicalTravel=function(t,e,i,r){function o(t){s[t].entryCount--,0===s[t].entryCount&&l.push(t)}if(t.length){var a=n(e),s=a.graph,l=a.noEntryList,h={};for(d(t,function(t){h[t]=!0});l.length;){var u=l.pop(),c=s[u],f=!!h[u];f&&(i.call(r,u,c.originalDeps.slice()),delete h[u]),d(c.successor,f?function(t){h[t]=!0,o(t)}:o)}d(h,function(){throw new Error("Circle dependency may exists")})}}}(Xv,function(t){var e=[];return d(Xv.getClassesByMainType(t),function(t){e=e.concat(t.prototype.dependencies||[])}),e=f(e,function(t){return Ln(t).main}),"dataset"!==t&&l(e,"dataset")<=0&&e.unshift("dataset"),e}),u(Xv,Zv);var jv="";"undefined"!=typeof navigator&&(jv=navigator.platform||"");var Yv={color:["#c23531","#2f4554","#61a0a8","#d48265","#91c7ae","#749f83","#ca8622","#bda29a","#6e7074","#546570","#c4ccd3"],gradientColor:["#f6efa6","#d88273","#bf444c"],textStyle:{fontFamily:jv.match(/^Win/)?"Microsoft YaHei":"sans-serif",fontSize:12,fontStyle:"normal",fontWeight:"normal"},blendMode:null,animation:"auto",animationDuration:1e3,animationDurationUpdate:300,animationEasing:"exponentialOut",animationEasingUpdate:"cubicOut",animationThreshold:2e3,progressiveThreshold:3e3,progressive:400,hoverLayerThreshold:3e3,useUTC:!1},qv=Cn(),$v={clearColorPalette:function(){qv(this).colorIdx=0,qv(this).colorNameMap={}},getColorFromPalette:function(t,e,n){var i=qv(e=e||this),r=i.colorIdx||0,o=i.colorNameMap=i.colorNameMap||{};if(o.hasOwnProperty(t))return o[t];var a=xn(this.get("color",!0)),s=this.get("colorLayer",!0),l=null!=n&&s?Ur(s,n):a;if((l=l||a)&&l.length){var h=l[r];return t&&(o[t]=h),i.colorIdx=(r+1)%l.length,h}}},Kv={cartesian2d:function(t,e,n,i){var r=t.getReferringComponents("xAxis")[0],o=t.getReferringComponents("yAxis")[0];e.coordSysDims=["x","y"],n.set("x",r),n.set("y",o),jr(r)&&(i.set("x",r),e.firstCategoryDimIndex=0),jr(o)&&(i.set("y",o),e.firstCategoryDimIndex=1)},singleAxis:function(t,e,n,i){var r=t.getReferringComponents("singleAxis")[0];e.coordSysDims=["single"],n.set("single",r),jr(r)&&(i.set("single",r),e.firstCategoryDimIndex=0)},polar:function(t,e,n,i){var r=t.getReferringComponents("polar")[0],o=r.findAxisModel("radiusAxis"),a=r.findAxisModel("angleAxis");e.coordSysDims=["radius","angle"],n.set("radius",o),n.set("angle",a),jr(o)&&(i.set("radius",o),e.firstCategoryDimIndex=0),jr(a)&&(i.set("angle",a),e.firstCategoryDimIndex=1)},geo:function(t,e,n,i){e.coordSysDims=["lng","lat"]},parallel:function(t,e,n,i){var r=t.ecModel,o=r.getComponent("parallel",t.get("parallelIndex")),a=e.coordSysDims=o.dimensions.slice();d(o.parallelAxisIndex,function(t,o){var s=r.getComponent("parallelAxis",t),l=a[o];n.set(l,s),jr(s)&&null==e.firstCategoryDimIndex&&(i.set(l,s),e.firstCategoryDimIndex=o)})}},Qv="original",Jv="arrayRows",ty="objectRows",ey="keyedColumns",ny="unknown",iy="typedArray",ry="column",oy="row";Yr.seriesDataToSource=function(t){return new Yr({data:t,sourceFormat:S(t)?iy:Qv,fromDataset:!1})},En(Yr);var ay=Cn(),sy="\0_ec_inner",ly=fr.extend({constructor:ly,init:function(t,e,n,i){n=n||{},this.option=null,this._theme=new fr(n),this._optionManager=i},setOption:function(t,e){P(!(sy in t),"please use chart.getOption()"),this._optionManager.setOption(t,e),this.resetOption(null)},resetOption:function(t){var e=!1,n=this._optionManager;if(!t||"recreate"===t){var i=n.mountOption("recreate"===t);this.option&&"recreate"!==t?(this.restoreData(),this.mergeOption(i)):ho.call(this,i),e=!0}if("timeline"!==t&&"media"!==t||this.restoreData(),!t||"recreate"===t||"timeline"===t){var r=n.getTimelineOption(this);r&&(this.mergeOption(r),e=!0)}if(!t||"recreate"===t||"media"===t){var o=n.getMediaOption(this,this._api);o.length&&d(o,function(t){this.mergeOption(t,e=!0)},this)}return e},mergeOption:function(t){var e=this.option,r=this._componentsMap,a=[];Kr(this),d(t,function(t,r){null!=t&&(Xv.hasClass(r)?r&&a.push(r):e[r]=null==e[r]?n(t):i(e[r],t,!0))}),Xv.topologicalTravel(a,Xv.getAllClassMainTypes(),function(n,i){var a=xn(t[n]),s=Sn(r.get(n),a);Mn(s),d(s,function(t,e){var i=t.option;w(i)&&(t.keyInfo.mainType=n,t.keyInfo.subType=co(n,i,t.exist))});var l=uo(r,i);e[n]=[],r.set(n,[]),d(s,function(t,i){var a=t.exist,s=t.option;if(P(w(s)||a,"Empty component definition"),s){var h=Xv.getClass(n,t.keyInfo.subType,!0);if(a&&a instanceof h)a.name=t.keyInfo.name,a.mergeOption(s,this),a.optionUpdated(s,!1);else{var u=o({dependentModels:l,componentIndex:i},t.keyInfo);o(a=new h(s,this,this,u),u),a.init(s,this,this,u),a.optionUpdated(null,!0)}}else a.mergeOption({},this),a.optionUpdated({},!1);r.get(n)[i]=a,e[n][i]=a.option},this),"series"===n&&fo(this,r.get("series"))},this),this._seriesIndicesMap=R(this._seriesIndices=this._seriesIndices||[])},getOption:function(){var t=n(this.option);return d(t,function(e,n){if(Xv.hasClass(n)){for(var i=(e=xn(e)).length-1;i>=0;i--)In(e[i])&&e.splice(i,1);t[n]=e}}),delete t[sy],t},getTheme:function(){return this._theme},getComponent:function(t,e){var n=this._componentsMap.get(t);if(n)return n[e||0]},queryComponents:function(t){var e=t.mainType;if(!e)return[];var n=t.index,i=t.id,r=t.name,o=this._componentsMap.get(e);if(!o||!o.length)return[];var a;if(null!=n)y(n)||(n=[n]),a=g(f(n,function(t){return o[t]}),function(t){return!!t});else if(null!=i){var s=y(i);a=g(o,function(t){return s&&l(i,t.id)>=0||!s&&t.id===i})}else if(null!=r){var h=y(r);a=g(o,function(t){return h&&l(r,t.name)>=0||!h&&t.name===r})}else a=o.slice();return po(a,t)},findComponents:function(t){var e=t.query,n=t.mainType,i=function(t){var e=n+"Index",i=n+"Id",r=n+"Name";return!t||null==t[e]&&null==t[i]&&null==t[r]?null:{mainType:n,index:t[e],id:t[i],name:t[r]}}(e);return function(e){return t.filter?g(e,t.filter):e}(po(i?this.queryComponents(i):this._componentsMap.get(n),t))},eachComponent:function(t,e,n){var i=this._componentsMap;"function"==typeof t?(n=e,e=t,i.each(function(t,i){d(t,function(t,r){e.call(n,i,t,r)})})):_(t)?d(i.get(t),e,n):w(t)&&d(this.findComponents(t),e,n)},getSeriesByName:function(t){return g(this._componentsMap.get("series"),function(e){return e.name===t})},getSeriesByIndex:function(t){return this._componentsMap.get("series")[t]},getSeriesByType:function(t){return g(this._componentsMap.get("series"),function(e){return e.subType===t})},getSeries:function(){return this._componentsMap.get("series").slice()},getSeriesCount:function(){return this._componentsMap.get("series").length},eachSeries:function(t,e){d(this._seriesIndices,function(n){var i=this._componentsMap.get("series")[n];t.call(e,i,n)},this)},eachRawSeries:function(t,e){d(this._componentsMap.get("series"),t,e)},eachSeriesByType:function(t,e,n){d(this._seriesIndices,function(i){var r=this._componentsMap.get("series")[i];r.subType===t&&e.call(n,r,i)},this)},eachRawSeriesByType:function(t,e,n){return d(this.getSeriesByType(t),e,n)},isSeriesFiltered:function(t){return null==this._seriesIndicesMap.get(t.componentIndex)},getCurrentSeriesIndices:function(){return(this._seriesIndices||[]).slice()},filterSeries:function(t,e){fo(this,g(this._componentsMap.get("series"),t,e))},restoreData:function(t){var e=this._componentsMap;fo(this,e.get("series"));var n=[];e.each(function(t,e){n.push(e)}),Xv.topologicalTravel(n,Xv.getAllClassMainTypes(),function(n,i){d(e.get(n),function(e){("series"!==n||!so(e,t))&&e.restoreData()})})}});u(ly,$v);var hy=["getDom","getZr","getWidth","getHeight","getDevicePixelRatio","dispatchAction","isDisposed","on","off","getDataURL","getConnectedDataURL","getModel","getOption","getViewOfComponentModel","getViewOfSeriesModel"],uy={};mo.prototype={constructor:mo,create:function(t,e){var n=[];d(uy,function(i,r){var o=i.create(t,e);n=n.concat(o||[])}),this._coordinateSystems=n},update:function(t,e){d(this._coordinateSystems,function(n){n.update&&n.update(t,e)})},getCoordinateSystems:function(){return this._coordinateSystems.slice()}},mo.register=function(t,e){uy[t]=e},mo.get=function(t){return uy[t]};var cy=d,dy=n,fy=f,py=i,gy=/^(min|max)?(.+)$/;vo.prototype={constructor:vo,setOption:function(t,e){t&&d(xn(t.series),function(t){t&&t.data&&S(t.data)&&O(t.data)}),t=dy(t,!0);var n=this._optionBackup,i=yo.call(this,t,e,!n);this._newBaseOption=i.baseOption,n?(bo(n.baseOption,i.baseOption),i.timelineOptions.length&&(n.timelineOptions=i.timelineOptions),i.mediaList.length&&(n.mediaList=i.mediaList),i.mediaDefault&&(n.mediaDefault=i.mediaDefault)):this._optionBackup=i},mountOption:function(t){var e=this._optionBackup;return this._timelineOptions=fy(e.timelineOptions,dy),this._mediaList=fy(e.mediaList,dy),this._mediaDefault=dy(e.mediaDefault),this._currentMediaIndices=[],dy(t?e.baseOption:this._newBaseOption)},getTimelineOption:function(t){var e,n=this._timelineOptions;if(n.length){var i=t.getComponent("timeline");i&&(e=dy(n[i.getCurrentIndex()],!0))}return e},getMediaOption:function(t){var e=this._api.getWidth(),n=this._api.getHeight(),i=this._mediaList,r=this._mediaDefault,o=[],a=[];if(!i.length&&!r)return a;for(var s=0,l=i.length;s1||l&&!a?function(n){function i(t,n){var i=r.getDimensionInfo(n);if(i&&!1!==i.otherDims.tooltip){var o=i.type,l=Rr({color:h,type:"subItem"}),u=(a?l+zr(i.displayName||"-")+": ":"")+zr("ordinal"===o?t+"":"time"===o?e?"":Nr("yyyy/MM/dd hh:mm:ss",t):Lr(t));u&&s.push(u)}}var a=p(n,function(t,e,n){var i=r.getDimensionInfo(n);return t|=i&&!1!==i.tooltip&&null!=i.displayName},0),s=[];return o.length?d(o,function(e){i(Go(r,t,e),e)}):d(n,i),(a?"
                    ":"")+s.join(a?"
                    ":", ")}(s):i(a?Go(r,t,o[0]):l?s[0]:s),c=Rr(h),f=r.getName(t),g=this.name;return g===Fg&&(g=""),g=g?zr(g)+(e?": ":"
                    "):"",e?c+g+u:g+c+(f?zr(f)+": "+u:u)},isAnimationEnabled:function(){if(Zf.node)return!1;var t=this.getShallow("animation");return t&&this.getData().count()>this.getShallow("animationThreshold")&&(t=!1),t},restoreData:function(){this.dataTask.dirty()},getColorFromPalette:function(t,e,n){var i=this.ecModel,r=$v.getColorFromPalette.call(this,t,e,n);return r||(r=i.getColorFromPalette(t,e,n)),r},coordDimToDataDim:function(t){return this.getRawData().mapDimension(t,!0)},getProgressive:function(){return this.get("progressive")},getProgressiveThreshold:function(){return this.get("progressiveThreshold")},getAxisTooltipData:null,getTooltipPosition:null,pipeTask:null,preventIncremental:null,pipelineContext:null});u(Py,Ay),u(Py,$v);var Ly=function(){this.group=new Xp,this.uid=mr("viewComponent")};Ly.prototype={constructor:Ly,init:function(t,e){},render:function(t,e,n,i){},dispose:function(){}};var Oy=Ly.prototype;Oy.updateView=Oy.updateLayout=Oy.updateVisual=function(t,e,n,i){},zn(Ly),Bn(Ly,{registerWhenExtend:!0});var zy=function(){var t=Cn();return function(e){var n=t(e),i=e.pipelineContext,r=n.large,o=n.incrementalRender,a=n.large=i.large,s=n.incrementalRender=i.incrementalRender;return(r^a||o^s)&&"reset"}},Ey=Cn(),Ry=zy();ta.prototype={type:"chart",init:function(t,e){},render:function(t,e,n,i){},highlight:function(t,e,n,i){na(t.getData(),i,"emphasis")},downplay:function(t,e,n,i){na(t.getData(),i,"normal")},remove:function(t,e){this.group.removeAll()},dispose:function(){},incrementalPrepareRender:null,incrementalRender:null,updateTransform:null};var Ny=ta.prototype;Ny.updateView=Ny.updateLayout=Ny.updateVisual=function(t,e,n,i){this.render(t,e,n,i)},zn(ta),Bn(ta,{registerWhenExtend:!0}),ta.markUpdateMethod=function(t,e){Ey(t).updateMethod=e};var By="\0__throttleOriginMethod",Vy="\0__throttleRate",Fy="\0__throttleType",Gy={createOnAllSeries:!0,performRawSeries:!0,reset:function(t,e){var n=t.getData(),i=(t.visualColorAccessPath||"itemStyle.color").split("."),r=t.get(i)||t.getColorFromPalette(t.get("name"),null,e.getSeriesCount());if(n.setVisual("color",r),!e.isSeriesFiltered(t)){"function"!=typeof r||r instanceof pv||n.each(function(e){n.setItemVisual(e,"color",r(t.getDataParams(e)))});return{dataEach:n.hasItemOption?function(t,e){var n=t.getItemModel(e).get(i,!0);null!=n&&t.setItemVisual(e,"color",n)}:null}}}},Hy={toolbox:{brush:{title:{rect:"矩形选择",polygon:"圈选",lineX:"横向选择",lineY:"纵向选择",keep:"保持选择",clear:"清除选择"}},dataView:{title:"数据视图",lang:["数据视图","关闭","刷新"]},dataZoom:{title:{zoom:"区域缩放",back:"区域缩放还原"}},magicType:{title:{line:"切换为折线图",bar:"切换为柱状图",stack:"切换为堆叠",tiled:"切换为平铺"}},restore:{title:"还原"},saveAsImage:{title:"保存为图片",lang:["右键另存为图片"]}},series:{typeNames:{pie:"饼图",bar:"柱状图",line:"折线图",scatter:"散点图",effectScatter:"涟漪散点图",radar:"雷达图",tree:"树图",treemap:"矩形树图",boxplot:"箱型图",candlestick:"K线图",k:"K线图",heatmap:"热力图",map:"地图",parallel:"平行坐标图",lines:"线图",graph:"关系图",sankey:"桑基图",funnel:"漏斗图",gauge:"仪表盘图",pictorialBar:"象形柱图",themeRiver:"主题河流图",sunburst:"旭日图"}},aria:{general:{withTitle:"这是一个关于“{title}”的图表。",withoutTitle:"这是一个图表,"},series:{single:{prefix:"",withName:"图表类型是{seriesType},表示{seriesName}。",withoutName:"图表类型是{seriesType}。"},multiple:{prefix:"它由{seriesCount}个图表系列组成。",withName:"第{seriesId}个系列是一个表示{seriesName}的{seriesType},",withoutName:"第{seriesId}个系列是一个{seriesType},",separator:{middle:";",end:"。"}}},data:{allData:"其数据是——",partialData:"其中,前{displayCnt}项是——",withName:"{name}的数据是{value}",withoutName:"{value}",separator:{middle:",",end:""}}}},Wy=function(t,e){function n(t,e){if("string"!=typeof t)return t;var n=t;return d(e,function(t,e){n=n.replace(new RegExp("\\{\\s*"+e+"\\s*\\}","g"),t)}),n}function i(t){var e=o.get(t);if(null==e){for(var n=t.split("."),i=Hy.aria,r=0;r1?"series.multiple.prefix":"series.single.prefix"),{seriesCount:a}),e.eachSeries(function(t,e){if(e1?"multiple":"single")+".";o=n(o=i(s?h+"withName":h+"withoutName"),{seriesId:t.seriesIndex,seriesName:t.get("name"),seriesType:r(t.subType)});var c=t.getData();window.data=c,c.count()>l?o+=n(i("data.partialData"),{displayCnt:l}):o+=i("data.allData");for(var d=[],p=0;pn.bockIndex?n.step:null}}},Uy.getPipeline=function(t){return this._pipelineMap.get(t)},Uy.updateStreamModes=function(t,e){var n=this._pipelineMap.get(t.uid),i=t.getData().count(),r=n.progressiveEnabled&&e.incrementalPrepareRender&&i>=n.threshold,o=t.get("large")&&i>=t.get("largeThreshold");t.pipelineContext=n.context={incrementalRender:r,large:o}},Uy.restorePipelines=function(t){var e=this,n=e._pipelineMap=R();t.eachSeries(function(t){var i=t.getProgressive(),r=t.uid;n.set(r,{id:r,head:null,tail:null,threshold:t.getProgressiveThreshold(),progressiveEnabled:i&&!(t.preventIncremental&&t.preventIncremental()),bockIndex:-1,step:i||700,count:0}),wa(e,t,t.dataTask)})},Uy.prepareStageTasks=function(t,e){var n=this._stageTaskMap,i=this.ecInstance.getModel(),r=this.api;d(t,function(t){var e=n.get(t.uid)||n.set(t.uid,[]);t.reset&&ca(this,t,e,i,r),t.overallReset&&da(this,t,e,i,r)},this)},Uy.prepareView=function(t,e,n,i){var r=t.renderTask,o=r.context;o.model=e,o.ecModel=n,o.api=i,r.__block=!t.incrementalPrepareRender,wa(this,e,r)},Uy.performDataProcessorTasks=function(t,e,n){ua(this,t,e,n,{block:!0})},Uy.performVisualTasks=function(t,e,n,i){ua(this,t,e,n,i)},Uy.performSeriesTasks=function(t){var e;t.eachSeries(function(t){e|=t.dataTask.perform()}),this.unfinished|=e},Uy.plan=function(){this._pipelineMap.each(function(t){var e=t.tail;do{if(e.__block){t.bockIndex=e.__idxInPipeline;break}e=e.getUpstream()}while(e)})};var Xy=Uy.updatePayload=function(t,e){"remain"!==e&&(t.context.payload=e)};ha.wrapStageHandler=function(t,e){return x(t)&&(t={overallReset:t,seriesType:ba(t)}),t.uid=mr("stageHandler"),e&&(t.visualType=e),t};var jy,Yy={},qy={};Sa(Yy,ly),Sa(qy,go),Yy.eachSeriesByType=Yy.eachRawSeriesByType=function(t){jy=t},Yy.eachComponent=function(t){"series"===t.mainType&&t.subType&&(jy=t.subType)};var $y=["#37A2DA","#32C5E9","#67E0E3","#9FE6B8","#FFDB5C","#ff9f7f","#fb7293","#E062AE","#E690D1","#e7bcf3","#9d96f5","#8378EA","#96BFFF"],Ky={color:$y,colorLayer:[["#37A2DA","#ffd85c","#fd7b5f"],["#37A2DA","#67E0E3","#FFDB5C","#ff9f7f","#E062AE","#9d96f5"],["#37A2DA","#32C5E9","#9FE6B8","#FFDB5C","#ff9f7f","#fb7293","#e7bcf3","#8378EA","#96BFFF"],$y]},Qy=["#dd6b66","#759aa0","#e69d87","#8dc1a9","#ea7e53","#eedd78","#73a373","#73b9bc","#7289ab","#91ca8c","#f49f42"],Jy={color:Qy,backgroundColor:"#333",tooltip:{axisPointer:{lineStyle:{color:"#eee"},crossStyle:{color:"#eee"}}},legend:{textStyle:{color:"#eee"}},textStyle:{color:"#eee"},title:{textStyle:{color:"#eee"}},toolbox:{iconStyle:{normal:{borderColor:"#eee"}}},dataZoom:{textStyle:{color:"#eee"}},visualMap:{textStyle:{color:"#eee"}},timeline:{lineStyle:{color:"#eee"},itemStyle:{normal:{color:Qy[1]}},label:{normal:{textStyle:{color:"#eee"}}},controlStyle:{normal:{color:"#eee",borderColor:"#eee"}}},timeAxis:{axisLine:{lineStyle:{color:"#eee"}},axisTick:{lineStyle:{color:"#eee"}},axisLabel:{textStyle:{color:"#eee"}},splitLine:{lineStyle:{type:"dashed",color:"#aaa"}},splitArea:{areaStyle:{color:"#eee"}}},logAxis:{axisLine:{lineStyle:{color:"#eee"}},axisTick:{lineStyle:{color:"#eee"}},axisLabel:{textStyle:{color:"#eee"}},splitLine:{lineStyle:{type:"dashed",color:"#aaa"}},splitArea:{areaStyle:{color:"#eee"}}},valueAxis:{axisLine:{lineStyle:{color:"#eee"}},axisTick:{lineStyle:{color:"#eee"}},axisLabel:{textStyle:{color:"#eee"}},splitLine:{lineStyle:{type:"dashed",color:"#aaa"}},splitArea:{areaStyle:{color:"#eee"}}},categoryAxis:{axisLine:{lineStyle:{color:"#eee"}},axisTick:{lineStyle:{color:"#eee"}},axisLabel:{textStyle:{color:"#eee"}},splitLine:{lineStyle:{type:"dashed",color:"#aaa"}},splitArea:{areaStyle:{color:"#eee"}}},line:{symbol:"circle"},graph:{color:Qy},gauge:{title:{textStyle:{color:"#eee"}}},candlestick:{itemStyle:{normal:{color:"#FD1050",color0:"#0CF49B",borderColor:"#FD1050",borderColor0:"#0CF49B"}}}};Jy.categoryAxis.splitLine.show=!1;var tx=P,ex=d,nx=x,ix=w,rx=Xv.parseClassType,ox={zrender:"4.0.1"},ax=1e3,sx=1e3,lx=3e3,hx={PROCESSOR:{FILTER:ax,STATISTIC:5e3},VISUAL:{LAYOUT:sx,GLOBAL:2e3,CHART:lx,COMPONENT:4e3,BRUSH:5e3}},ux="__flagInMainProcess",cx="__optionUpdated",dx=/^[a-zA-Z0-9_]+$/;Ia.prototype.on=Ma("on"),Ia.prototype.off=Ma("off"),Ia.prototype.one=Ma("one"),u(Ia,dp);var fx=Ta.prototype;fx._onframe=function(){if(!this._disposed){var t=this._scheduler;if(this[cx]){var e=this[cx].silent;this[ux]=!0,Aa(this),px.update.call(this),this[ux]=!1,this[cx]=!1,Oa.call(this,e),za.call(this,e)}else if(t.unfinished){var n=1,i=this._model;this._api;t.unfinished=!1;do{var r=+new Date;t.performSeriesTasks(i),t.performDataProcessorTasks(yx,i),Pa(this,i),t.performVisualTasks(bx,i),Fa(this,this._model,0,"remain"),n-=+new Date-r}while(n>0&&t.unfinished);t.unfinished||(this._zr&&this._zr.flush(),this.trigger("finished"))}}},fx.getDom=function(){return this._dom},fx.getZr=function(){return this._zr},fx.setOption=function(t,e,n){var i;if(ix(e)&&(n=e.lazyUpdate,i=e.silent,e=e.notMerge),this[ux]=!0,!this._model||e){var r=new vo(this._api),o=this._theme,a=this._model=new ly(null,null,o,r);a.scheduler=this._scheduler,a.init(null,null,o,r)}this._model.setOption(t,xx),n?(this[cx]={silent:i},this[ux]=!1):(Aa(this),px.update.call(this),this._zr.flush(),this[cx]=!1,this[ux]=!1,Oa.call(this,i),za.call(this,i))},fx.setTheme=function(){console.log("ECharts#setTheme() is DEPRECATED in ECharts 3.0")},fx.getModel=function(){return this._model},fx.getOption=function(){return this._model&&this._model.getOption()},fx.getWidth=function(){return this._zr.getWidth()},fx.getHeight=function(){return this._zr.getHeight()},fx.getDevicePixelRatio=function(){return this._zr.painter.dpr||window.devicePixelRatio||1},fx.getRenderedCanvas=function(t){if(Zf.canvasSupported){(t=t||{}).pixelRatio=t.pixelRatio||1,t.backgroundColor=t.backgroundColor||this._model.get("backgroundColor");var e=this._zr;return d(e.storage.getDisplayList(),function(t){t.stopAnimation(!0)}),e.painter.getRenderedCanvas(t)}},fx.getSvgDataUrl=function(){if(Zf.svgSupported){var t=this._zr;return d(t.storage.getDisplayList(),function(t){t.stopAnimation(!0)}),t.painter.pathToSvg()}},fx.getDataURL=function(t){var e=(t=t||{}).excludeComponents,n=this._model,i=[],r=this;ex(e,function(t){n.eachComponent({mainType:t},function(t){var e=r._componentsMap[t.__viewId];e.group.ignore||(i.push(e),e.group.ignore=!0)})});var o="svg"===this._zr.painter.getType()?this.getSvgDataUrl():this.getRenderedCanvas(t).toDataURL("image/"+(t&&t.type||"png"));return ex(i,function(t){t.group.ignore=!1}),o},fx.getConnectedDataURL=function(t){if(Zf.canvasSupported){var e=this.group,i=Math.min,r=Math.max;if(Tx[e]){var o=1/0,a=1/0,s=-1/0,l=-1/0,h=[],u=t&&t.pixelRatio||1;d(Ix,function(u,c){if(u.group===e){var d=u.getRenderedCanvas(n(t)),f=u.getDom().getBoundingClientRect();o=i(f.left,o),a=i(f.top,a),s=r(f.right,s),l=r(f.bottom,l),h.push({dom:d,left:f.left,top:f.top})}});var c=(s*=u)-(o*=u),f=(l*=u)-(a*=u),p=ep();p.width=c,p.height=f;var g=mn(p);return ex(h,function(t){var e=new je({style:{x:t.left*u-o,y:t.top*u-a,image:t.dom}});g.add(e)}),g.refreshImmediately(),p.toDataURL("image/"+(t&&t.type||"png"))}return this.getDataURL(t)}},fx.convertToPixel=v(Ca,"convertToPixel"),fx.convertFromPixel=v(Ca,"convertFromPixel"),fx.containPixel=function(t,e){var n;return t=An(this._model,t),d(t,function(t,i){i.indexOf("Models")>=0&&d(t,function(t){var r=t.coordinateSystem;if(r&&r.containPoint)n|=!!r.containPoint(e);else if("seriesModels"===i){var o=this._chartsMap[t.__viewId];o&&o.containPoint&&(n|=o.containPoint(e,t))}},this)},this),!!n},fx.getVisual=function(t,e){var n=(t=An(this._model,t,{defaultMainType:"series"})).seriesModel.getData(),i=t.hasOwnProperty("dataIndexInside")?t.dataIndexInside:t.hasOwnProperty("dataIndex")?n.indexOfRawIndex(t.dataIndex):null;return null!=i?n.getItemVisual(i,e):n.getVisual(e)},fx.getViewOfComponentModel=function(t){return this._componentsMap[t.__viewId]},fx.getViewOfSeriesModel=function(t){return this._chartsMap[t.__viewId]};var px={prepareAndUpdate:function(t){Aa(this),px.update.call(this,t)},update:function(t){var e=this._model,n=this._api,i=this._zr,r=this._coordSysMgr,o=this._scheduler;if(e){e.restoreData(t),o.performSeriesTasks(e),r.create(e,n),o.performDataProcessorTasks(yx,e,t),Pa(this,e),Ra(e),r.update(e,n),Na(e),o.performVisualTasks(bx,e,t),Ba(this,e,n,t);var a=e.get("backgroundColor")||"transparent",s=i.painter;if(s.isSingleCanvas&&s.isSingleCanvas())i.configLayer(0,{clearColor:a});else{if(!Zf.canvasSupported){var l=Mt(a);a=Lt(l,"rgb"),0===l[3]&&(a="transparent")}a.colorStops||a.image?(i.configLayer(0,{clearColor:a}),this.__hasGradientOrPatternBg=!0,this._dom.style.background="transparent"):(this.__hasGradientOrPatternBg&&i.configLayer(0,{clearColor:null}),this.__hasGradientOrPatternBg=!1,this._dom.style.background=a)}Ga(e,n)}},updateTransform:function(t){var e=this._model,n=this,i=this._api;if(e){var r=[];e.eachComponent(function(o,a){var s=n.getViewOfComponentModel(a);if(s&&s.__alive)if(s.updateTransform){var l=s.updateTransform(a,e,i,t);l&&l.update&&r.push(s)}else r.push(s)});var o=R();e.eachSeries(function(r){var a=n._chartsMap[r.__viewId];if(a.updateTransform){var s=a.updateTransform(r,e,i,t);s&&s.update&&o.set(r.uid,1)}else o.set(r.uid,1)}),Na(e),this._scheduler.performVisualTasks(bx,e,t,{setDirty:!0,dirtyMap:o}),Fa(n,e,0,t,o),Ga(e,this._api)}},updateView:function(t){var e=this._model;e&&(ta.markUpdateMethod(t,"updateView"),Na(e),this._scheduler.performVisualTasks(bx,e,t,{setDirty:!0}),Ba(this,this._model,this._api,t),Ga(e,this._api))},updateVisual:function(t){px.update.call(this,t)},updateLayout:function(t){px.update.call(this,t)}};fx.resize=function(t){this._zr.resize(t);var e=this._model;this._loadingFX&&this._loadingFX.resize(),e&&ka(this,e.resetOption("media"),t&&t.silent)},fx.showLoading=function(t,e){if(ix(t)&&(e=t,t=""),t=t||"default",this.hideLoading(),Mx[t]){var n=Mx[t](this._api,e),i=this._zr;this._loadingFX=n,i.add(n)}},fx.hideLoading=function(){this._loadingFX&&this._zr.remove(this._loadingFX),this._loadingFX=null},fx.makeActionFromEvent=function(t){var e=o({},t);return e.type=vx[t.type],e},fx.dispatchAction=function(t,e){ix(e)||(e={silent:!!e}),mx[t.type]&&this._model&&(this[ux]?this._pendingActions.push(t):(La.call(this,t,e.silent),e.flush?this._zr.flush(!0):!1!==e.flush&&Zf.browser.weChat&&this._throttledZrFlush(),Oa.call(this,e.silent),za.call(this,e.silent)))},fx.appendData=function(t){var e=t.seriesIndex;this.getModel().getSeriesByIndex(e).appendData(t),this._scheduler.unfinished=!0},fx.on=Ma("on"),fx.off=Ma("off"),fx.one=Ma("one");var gx=["click","dblclick","mouseover","mouseout","mousemove","mousedown","mouseup","globalout","contextmenu"];fx._initEvents=function(){ex(gx,function(t){this._zr.on(t,function(e){var n,i=this.getModel(),r=e.target;if("globalout"===t)n={};else if(r&&null!=r.dataIndex){var a=r.dataModel||i.getSeriesByIndex(r.seriesIndex);n=a&&a.getDataParams(r.dataIndex,r.dataType)||{}}else r&&r.eventData&&(n=o({},r.eventData));n&&(n.event=e,n.type=t,this.trigger(t,n))},this)},this),ex(vx,function(t,e){this._messageCenter.on(e,function(t){this.trigger(e,t)},this)},this)},fx.isDisposed=function(){return this._disposed},fx.clear=function(){this.setOption({series:[]},!0)},fx.dispose=function(){if(!this._disposed){this._disposed=!0,kn(this.getDom(),Dx,"");var t=this._api,e=this._model;ex(this._componentsViews,function(n){n.dispose(e,t)}),ex(this._chartsViews,function(n){n.dispose(e,t)}),this._zr.dispose(),delete Ix[this.id]}},u(Ta,dp);var mx={},vx={},yx=[],xx=[],_x=[],bx=[],Sx={},Mx={},Ix={},Tx={},Cx=new Date-0,Ax=new Date-0,Dx="_echarts_instance_",kx={},Px=ja;ts(2e3,Gy),$a(by),ns("default",function(t,e){a(e=e||{},{text:"loading",color:"#c23531",textColor:"#000",maskColor:"rgba(255, 255, 255, 0.8)",zlevel:0});var n=new lv({style:{fill:e.maskColor},zlevel:e.zlevel,z:1e4}),i=new dv({shape:{startAngle:-Zy/2,endAngle:-Zy/2+.1,r:10},style:{stroke:e.color,lineCap:"round",lineWidth:5},zlevel:e.zlevel,z:10001}),r=new lv({style:{fill:"none",text:e.text,textPosition:"right",textDistance:10,textFill:e.textColor},zlevel:e.zlevel,z:10001});i.animateShape(!0).when(1e3,{endAngle:3*Zy/2}).start("circularInOut"),i.animateShape(!0).when(1e3,{startAngle:3*Zy/2}).delay(300).start("circularInOut");var o=new Xp;return o.add(i),o.add(r),o.add(n),o.resize=function(){var e=t.getWidth()/2,o=t.getHeight()/2;i.setShape({cx:e,cy:o});var a=i.shape.r;r.setShape({x:e-a,y:o-a,width:2*a,height:2*a}),n.setShape({x:0,y:0,width:t.getWidth(),height:t.getHeight()})},o.resize(),o}),Qa({type:"highlight",event:"highlight",update:"highlight"},N),Qa({type:"downplay",event:"downplay",update:"downplay"},N),qa("light",Ky),qa("dark",Jy);var Lx={};ls.prototype={constructor:ls,add:function(t){return this._add=t,this},update:function(t){return this._update=t,this},remove:function(t){return this._remove=t,this},execute:function(){var t=this._old,e=this._new,n={},i=[],r=[];for(hs(t,{},i,"_oldKeyGetter",this),hs(e,n,r,"_newKeyGetter",this),o=0;o=e)){for(var n,i=this._chunkSize,r=this._rawData,o=this._storage,a=this.dimensions,s=this._dimensionInfos,l=this._nameList,h=this._idList,u=this._rawExtent,c=this._nameRepeatCount={},d=this._chunkCount,f=d-1,p=0;pu[I][1]&&(u[I][1]=C)}if(!r.pure){var A=l[_];w&&!A&&(null!=n?A=this._getNameFromStore(_):null!=w.name&&(l[_]=A=w.name));var D=null==w?null:w.id;null==D&&null!=A&&(c[A]=c[A]||0,D=A,c[A]>0&&(D+="__ec__"+c[A]),c[A]++),null!=D&&(h[_]=D)}}!r.persistent&&r.clean&&r.clean(),this._rawCount=this._count=e,this._extent={}}},Gx._getNameFromStore=function(t){var e=this._nameDimIdx;if(null!=e){var n=this._chunkSize,i=Math.floor(t/n),r=t%n,o=this.dimensions[e],a=this._dimensionInfos[o].ordinalMeta;if(a)return a.categories[t];var s=this._storage[o][i];return s&&s[r]}},Gx._getIdFromStore=function(t){var e=this._idDimIdx;if(null!=e){var n=this._chunkSize,i=Math.floor(t/n),r=t%n,o=this.dimensions[e],a=this._dimensionInfos[o].ordinalMeta;if(a)return a.categories[t];var s=this._storage[o][i];return s&&s[r]}},Gx.count=function(){return this._count},Gx.getIndices=function(){if(this._indices)return new(t=this._indices.constructor)(this._indices.buffer,0,this._count);for(var t=fs(this),e=new t(this.count()),n=0;n=0&&e=0&&h>0||a<=0&&h<0)&&(a+=h),l=l.stackedOn}}return a},Gx._getFast=function(t,e){var n=Math.floor(e/this._chunkSize),i=e%this._chunkSize;return this._storage[t][n][i]},Gx.getValues=function(t,e,n){var i=[];y(t)||(n=e,e=t,t=this.dimensions);for(var r=0,o=t.length;rl&&(l=u)}return r=[s,l],this._extent[a]=r,r},Gx.getApproximateExtent=function(t,e){return t=this.getDimension(t),this._approximateExtent[t]||this.getDataExtent(t,e)},Gx.setApproximateExtent=function(t,e,n){e=this.getDimension(e),this._approximateExtent[e]=t.slice()},Gx.isStacked=function(t){var e=this._dimensionInfos[t];return e&&e.stackable&&this.stackedOn},Gx.getSum=function(t,e){var n=0;if(this._storage[t])for(var i=0,r=this.count();i=this._rawCount||t<0)return-1;var e=this._indices,n=e[t];if(null!=n&&nt))return o;r=o-1}}return-1},Gx.indicesOfNearest=function(t,e,n,i){var r=[];if(!this._storage[t])return r;null==i&&(i=1/0);for(var o=Number.MAX_VALUE,a=-1,s=0,l=this.count();s=0&&a<0)&&(o=u,a=h,r.length=0),r.push(s))}return r},Gx.getRawIndex=ms,Gx.getRawDataItem=function(t){if(this._rawData.persistent)return this._rawData.getItem(this.getRawIndex(t));for(var e=[],n=0;n=h&&b<=u&&(a[s++]=d),d++;c=!0}else if(2===r){for(var f=this._storage[l],y=this._storage[n[1]],x=t[n[1]][0],_=t[n[1]][1],p=0;p=h&&b<=u&&S>=x&&S<=_&&(a[s++]=d),d++}c=!0}}if(!c)if(1===r){e=e||this.isStacked(l);for(v=0;v=h&&b<=u&&(a[s++]=I)}}else for(v=0;vt[T][1])&&(M=!1)}M&&(a[s++]=this.getRawIndex(v))}return sh-f&&(s=h-f,a.length=s);for(var p=0;p=e[0]&&t<=e[1]},Ds.prototype.normalize=function(t){var e=this._extent;return e[1]===e[0]?.5:(t-e[0])/(e[1]-e[0])},Ds.prototype.scale=function(t){var e=this._extent;return t*(e[1]-e[0])+e[0]},Ds.prototype.unionExtent=function(t){var e=this._extent;t[0]e[1]&&(e[1]=t[1])},Ds.prototype.unionExtentFromData=function(t,e){this.unionExtent(t.getApproximateExtent(e,!0))},Ds.prototype.getExtent=function(){return this._extent.slice()},Ds.prototype.setExtent=function(t,e){var n=this._extent;isNaN(t)||(n[0]=t),isNaN(e)||(n[1]=e)},Ds.prototype.getTicksLabels=function(){for(var t=[],e=this.getTicks(),n=0;ne[1]&&(e[1]=t[1]),qx.prototype.setExtent.call(this,e[0],e[1])},getInterval:function(){return this._interval},setInterval:function(t){this._interval=t,this._niceExtent=this._extent.slice(),this._intervalPrecision=zs(t)},getTicks:function(){return Ns(this._interval,this._extent,this._niceExtent,this._intervalPrecision)},getTicksLabels:function(){for(var t=[],e=this.getTicks(),n=0;n>>1;t[r][1]n&&(o=n);var a=n_.length,s=t_(n_,o,0,a),l=n_[Math.min(s,a-1)],h=l[1];"year"===l[0]&&(h*=Pr(r/h/t,!0));var u=this.getSetting("useUTC")?0:60*new Date(+i[0]||+i[1]).getTimezoneOffset()*1e3,c=[Math.round(Qx((i[0]-u)/h)*h+u),Math.round(Jx((i[1]-u)/h)*h+u)];Rs(c,i),this._stepLvl=l,this._interval=h,this._niceExtent=c},parse:function(t){return+Ar(t)}});d(["contain","normalize"],function(t){e_.prototype[t]=function(e){return Kx[t].call(this,this.parse(e))}});var n_=[["hh:mm:ss",1e3],["hh:mm:ss",5e3],["hh:mm:ss",1e4],["hh:mm:ss",15e3],["hh:mm:ss",3e4],["hh:mm\nMM-dd",6e4],["hh:mm\nMM-dd",3e5],["hh:mm\nMM-dd",6e5],["hh:mm\nMM-dd",9e5],["hh:mm\nMM-dd",18e5],["hh:mm\nMM-dd",36e5],["hh:mm\nMM-dd",72e5],["hh:mm\nMM-dd",216e5],["hh:mm\nMM-dd",432e5],["MM-dd\nyyyy",864e5],["MM-dd\nyyyy",1728e5],["MM-dd\nyyyy",2592e5],["MM-dd\nyyyy",3456e5],["MM-dd\nyyyy",432e6],["MM-dd\nyyyy",5184e5],["week",6048e5],["MM-dd\nyyyy",864e6],["week",12096e5],["week",18144e5],["month",26784e5],["week",36288e5],["month",53568e5],["week",36288e5],["quarter",8208e6],["month",107136e5],["month",13392e6],["half-year",16416e6],["month",214272e5],["month",26784e6],["year",32832e6]];e_.create=function(t){return new e_({useUTC:t.ecModel.get("useUTC")})};var i_=Ds.prototype,r_=qx.prototype,o_=Sr,a_=_r,s_=Math.floor,l_=Math.ceil,h_=Math.pow,u_=Math.log,c_=Ds.extend({type:"log",base:10,$constructor:function(){Ds.apply(this,arguments),this._originalScale=new qx},getTicks:function(){var t=this._originalScale,e=this._extent,n=t.getExtent();return f(r_.getTicks.call(this),function(i){var r=_r(h_(this.base,i));return r=i===e[0]&&t.__fixMin?Hs(r,n[0]):r,r=i===e[1]&&t.__fixMax?Hs(r,n[1]):r},this)},getLabel:r_.getLabel,scale:function(t){return t=i_.scale.call(this,t),h_(this.base,t)},setExtent:function(t,e){var n=this.base;t=u_(t)/u_(n),e=u_(e)/u_(n),r_.setExtent.call(this,t,e)},getExtent:function(){var t=this.base,e=i_.getExtent.call(this);e[0]=h_(t,e[0]),e[1]=h_(t,e[1]);var n=this._originalScale,i=n.getExtent();return n.__fixMin&&(e[0]=Hs(e[0],i[0])),n.__fixMax&&(e[1]=Hs(e[1],i[1])),e},unionExtent:function(t){this._originalScale.unionExtent(t);var e=this.base;t[0]=u_(t[0])/u_(e),t[1]=u_(t[1])/u_(e),i_.unionExtent.call(this,t)},unionExtentFromData:function(t,e){this.unionExtent(t.getApproximateExtent(e,!0,function(t){return t>0}))},niceTicks:function(t){t=t||10;var e=this._extent,n=e[1]-e[0];if(!(n===1/0||n<=0)){var i=Dr(n);for(t/n*i<=.5&&(i*=10);!isNaN(i)&&Math.abs(i)<1&&Math.abs(i)>0;)i*=10;var r=[_r(l_(e[0]/i)*i),_r(s_(e[1]/i)*i)];this._interval=i,this._niceExtent=r}},niceExtent:function(t){r_.niceExtent.call(this,t);var e=this._originalScale;e.__fixMin=t.fixMin,e.__fixMax=t.fixMax}});d(["contain","normalize"],function(t){c_.prototype[t]=function(e){return e=u_(e)/u_(this.base),i_[t].call(this,e)}}),c_.create=function(){return new c_};var d_={getFormattedLabels:function(){return Ys(this.axis,this.get("axisLabel.formatter"))},getMin:function(t){var e=this.option,n=t||null==e.rangeStart?e.min:e.rangeStart;return this.axis&&null!=n&&"dataMin"!==n&&"function"!=typeof n&&!I(n)&&(n=this.axis.scale.parse(n)),n},getMax:function(t){var e=this.option,n=t||null==e.rangeEnd?e.max:e.rangeEnd;return this.axis&&null!=n&&"dataMax"!==n&&"function"!=typeof n&&!I(n)&&(n=this.axis.scale.parse(n)),n},getNeedCrossZero:function(){var t=this.option;return null==t.rangeStart&&null==t.rangeEnd&&!t.scale},getCoordSysModel:N,setRange:function(t,e){this.option.rangeStart=t,this.option.rangeEnd=e},resetRange:function(){this.option.rangeStart=this.option.rangeEnd=null}},f_=Ai({type:"triangle",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=e.width/2,o=e.height/2;t.moveTo(n,i-o),t.lineTo(n+r,i+o),t.lineTo(n-r,i+o),t.closePath()}}),p_=Ai({type:"diamond",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(t,e){var n=e.cx,i=e.cy,r=e.width/2,o=e.height/2;t.moveTo(n,i-o),t.lineTo(n+r,i),t.lineTo(n,i+o),t.lineTo(n-r,i),t.closePath()}}),g_=Ai({type:"pin",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var n=e.x,i=e.y,r=e.width/5*3,o=Math.max(r,e.height),a=r/2,s=a*a/(o-a),l=i-o+a+s,h=Math.asin(s/a),u=Math.cos(h)*a,c=Math.sin(h),d=Math.cos(h),f=.6*a,p=.7*a;t.moveTo(n-u,l+s),t.arc(n,l,a,Math.PI-h,2*Math.PI+h),t.bezierCurveTo(n+u-c*f,l+s+d*f,n,i-p,n,i),t.bezierCurveTo(n,i-p,n-u+c*f,l+s+d*f,n-u,l+s),t.closePath()}}),m_=Ai({type:"arrow",shape:{x:0,y:0,width:0,height:0},buildPath:function(t,e){var n=e.height,i=e.width,r=e.x,o=e.y,a=i/3*2;t.moveTo(r,o),t.lineTo(r+a,o+n),t.lineTo(r,o+n/4*3),t.lineTo(r-a,o+n),t.lineTo(r,o),t.closePath()}}),v_={line:function(t,e,n,i,r){r.x1=t,r.y1=e+i/2,r.x2=t+n,r.y2=e+i/2},rect:function(t,e,n,i,r){r.x=t,r.y=e,r.width=n,r.height=i},roundRect:function(t,e,n,i,r){r.x=t,r.y=e,r.width=n,r.height=i,r.r=Math.min(n,i)/4},square:function(t,e,n,i,r){var o=Math.min(n,i);r.x=t,r.y=e,r.width=o,r.height=o},circle:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.r=Math.min(n,i)/2},diamond:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.width=n,r.height=i},pin:function(t,e,n,i,r){r.x=t+n/2,r.y=e+i/2,r.width=n,r.height=i},arrow:function(t,e,n,i,r){r.x=t+n/2,r.y=e+i/2,r.width=n,r.height=i},triangle:function(t,e,n,i,r){r.cx=t+n/2,r.cy=e+i/2,r.width=n,r.height=i}},y_={};d({line:hv,rect:lv,roundRect:lv,square:lv,circle:Jm,diamond:p_,pin:g_,arrow:m_,triangle:f_},function(t,e){y_[e]=new t});var x_=Ai({type:"symbol",shape:{symbolType:"",x:0,y:0,width:0,height:0},beforeBrush:function(){var t=this.style;"pin"===this.shape.symbolType&&"inside"===t.textPosition&&(t.textPosition=["50%","40%"],t.textAlign="center",t.textVerticalAlign="middle")},buildPath:function(t,e,n){var i=e.symbolType,r=y_[i];"none"!==e.symbolType&&(r||(r=y_[i="rect"]),v_[i](e.x,e.y,e.width,e.height,r.shape),r.buildPath(t,r.shape,n))}}),__=(Object.freeze||Object)({createList:function(t){return Is(t.getSource(),t)},getLayoutRect:Fr,createScale:function(t,e){var n=e;fr.isInstance(e)||u(n=new fr(e),d_);var i=Xs(n);return i.setExtent(t[0],t[1]),Us(i,n),i},mixinAxisModelCommonMethods:function(t){u(t,d_)},completeDimensions:bs,createDimensions:Wx,createSymbol:Ks}),w_=1e-8;tl.prototype={constructor:tl,properties:null,getBoundingRect:function(){var t=this._rect;if(t)return t;for(var e=Number.MAX_VALUE,n=[e,e],i=[-e,-e],r=[],o=[],a=this.geometries,s=0;s0}),function(t){var e=t.properties,n=t.geometry,i=n.coordinates,r=[];"Polygon"===n.type&&r.push({type:"polygon",exterior:i[0],interiors:i.slice(1)}),"MultiPolygon"===n.type&&d(i,function(t){t[0]&&r.push({type:"polygon",exterior:t[0],interiors:t.slice(1)})});var o=new tl(e.name,r,e.cp);return o.properties=e,o})},S_=yr,M_=[0,1],I_=function(t,e,n){this.dim=t,this.scale=e,this._extent=n||[0,0],this.inverse=!1,this.onBand=!1,this._labelInterval};I_.prototype={constructor:I_,contain:function(t){var e=this._extent,n=Math.min(e[0],e[1]),i=Math.max(e[0],e[1]);return t>=n&&t<=i},containData:function(t){return this.contain(this.dataToCoord(t))},getExtent:function(){return this._extent.slice()},getPixelPrecision:function(t){return Mr(t||this.scale.getExtent(),this._extent)},setExtent:function(t,e){var n=this._extent;n[0]=t,n[1]=e},dataToCoord:function(t,e){var n=this._extent,i=this.scale;return t=i.normalize(t),this.onBand&&"ordinal"===i.type&&il(n=n.slice(),i.count()),S_(t,M_,n,e)},coordToData:function(t,e){var n=this._extent,i=this.scale;this.onBand&&"ordinal"===i.type&&il(n=n.slice(),i.count());var r=S_(t,n,M_,e);return this.scale.scale(r)},pointToData:function(t,e){},getTicksCoords:function(t){if(this.onBand&&!t){for(var e=this.getBands(),n=[],i=0;i0&&gl(n[r-1]);r--);for(;i0&&gl(n[o-1]);o--);for(;r=0){var a=r.getItemGraphicEl(o);if(!a){var s=r.getItemLayout(o);if(!s)return;(a=new sl(r,o)).position=s,a.setZ(t.get("zlevel"),t.get("z")),a.ignore=isNaN(s[0])||isNaN(s[1]),a.__temp=!0,r.setItemGraphicEl(o,a),a.stopSymbolAnimation(!0),this.group.add(a)}a.highlight()}else ta.prototype.highlight.call(this,t,e,n,i)},downplay:function(t,e,n,i){var r=t.getData(),o=Tn(r,i);if(null!=o&&o>=0){var a=r.getItemGraphicEl(o);a&&(a.__temp?(r.setItemGraphicEl(o,null),this.group.remove(a)):a.downplay())}else ta.prototype.downplay.call(this,t,e,n,i)},_newPolyline:function(t){var e=this._polyline;return e&&this._lineGroup.remove(e),e=new H_({shape:{points:t},silent:!0,z2:10}),this._lineGroup.add(e),this._polyline=e,e},_newPolygon:function(t,e){var n=this._polygon;return n&&this._lineGroup.remove(n),n=new W_({shape:{points:t,stackedOnPoints:e},silent:!0}),this._lineGroup.add(n),this._polygon=n,n},_getSymbolIgnoreFunc:function(t,e){var n=e.getAxesByScale("ordinal")[0];if(n&&n.isLabelIgnored)return m(n.isLabelIgnored,n)},_updateAnimation:function(t,e,n,i,r){var o=this._polyline,a=this._polygon,s=t.hostModel,l=z_(this._data,t,this._stackedOnPoints,e,this._coordSys,n),h=l.current,u=l.stackedOnCurrent,c=l.next,d=l.stackedOnNext;r&&(h=Tl(l.current,n,r),u=Tl(l.stackedOnCurrent,n,r),c=Tl(l.next,n,r),d=Tl(l.stackedOnNext,n,r)),o.shape.__points=l.current,o.shape.points=h,or(o,{shape:{points:c}},s),a&&(a.setShape({points:h,stackedOnPoints:u}),or(a,{shape:{points:c,stackedOnPoints:d}},s));for(var f=[],p=l.status,g=0;ge&&(e=t[n]);return e},min:function(t){for(var e=1/0,n=0;ne[1]&&e.reverse(),e},getOtherAxis:function(){this.grid.getOtherAxis()},isLabelIgnored:function(t){if("category"===this.type){var e=this.getLabelInterval();return"function"==typeof e&&!e(t,this.scale.getLabel(t))||t%(e+1)}},pointToData:function(t,e){return this.coordToData(this.toLocalCoord(t["x"===this.dim?0:1]),e)},toLocalCoord:null,toGlobalCoord:null},h(q_,I_);var $_={show:!0,zlevel:0,z:0,inverse:!1,name:"",nameLocation:"end",nameRotate:null,nameTruncate:{maxWidth:null,ellipsis:"...",placeholder:"."},nameTextStyle:{},nameGap:15,silent:!1,triggerEvent:!1,tooltip:{show:!1},axisPointer:{},axisLine:{show:!0,onZero:!0,onZeroAxisIndex:null,lineStyle:{color:"#333",width:1,type:"solid"},symbol:["none","none"],symbolSize:[10,15]},axisTick:{show:!0,inside:!1,length:5,lineStyle:{width:1}},axisLabel:{show:!0,inside:!1,rotate:0,showMinLabel:null,showMaxLabel:null,margin:8,fontSize:12},splitLine:{show:!0,lineStyle:{color:["#ccc"],width:1,type:"solid"}},splitArea:{show:!1,areaStyle:{color:["rgba(250,250,250,0.3)","rgba(200,200,200,0.3)"]}}},K_={};K_.categoryAxis=i({boundaryGap:!0,deduplication:null,splitLine:{show:!1},axisTick:{alignWithLabel:!1,interval:"auto"},axisLabel:{interval:"auto"}},$_),K_.valueAxis=i({boundaryGap:[0,0],splitNumber:5},$_),K_.timeAxis=a({scale:!0,min:"dataMin",max:"dataMax"},K_.valueAxis),K_.logAxis=a({scale:!0,logBase:10},K_.valueAxis);var Q_=["value","category","time","log"],J_=function(t,e,n,o){d(Q_,function(a){e.extend({type:t+"Axis."+a,mergeDefaultAndTheme:function(e,r){var o=this.layoutMode,s=o?Wr(e):{};i(e,r.getTheme().get(a+"Axis")),i(e,this.getDefaultOption()),e.type=n(t,e),o&&Hr(e,s,o)},optionUpdated:function(){"category"===this.option.type&&(this.__ordinalMeta=ks.createByAxisModel(this))},getCategories:function(){if("category"===this.option.type)return this.__ordinalMeta.categories},getOrdinalMeta:function(){return this.__ordinalMeta},defaultOption:r([{},K_[a+"Axis"],o],!0)})}),Xv.registerSubTypeDefaulter(t+"Axis",v(n,t))},tw=Xv.extend({type:"cartesian2dAxis",axis:null,init:function(){tw.superApply(this,"init",arguments),this.resetRange()},mergeOption:function(){tw.superApply(this,"mergeOption",arguments),this.resetRange()},restoreData:function(){tw.superApply(this,"restoreData",arguments),this.resetRange()},getCoordSysModel:function(){return this.ecModel.queryComponents({mainType:"grid",index:this.option.gridIndex,id:this.option.gridId})[0]}});i(tw.prototype,d_);var ew={offset:0};J_("x",tw,kl,ew),J_("y",tw,kl,ew),Xv.extend({type:"grid",dependencies:["xAxis","yAxis"],layoutMode:"box",coordinateSystem:null,defaultOption:{show:!1,zlevel:0,z:0,left:"10%",top:60,right:"10%",bottom:60,containLabel:!1,backgroundColor:"rgba(0,0,0,0)",borderWidth:1,borderColor:"#ccc"}});var nw=d,iw=function(t){var e=t.scale.getExtent(),n=e[0],i=e[1];return!(n>0&&i>0||n<0&&i<0)},rw=Us,ow=zl.prototype;ow.type="grid",ow.axisPointerEnabled=!0,ow.getRect=function(){return this._rect},ow.update=function(t,e){var n=this._axesMap;this._updateScale(t,this.model),nw(n.x,function(t){rw(t.scale,t.model)}),nw(n.y,function(t){rw(t.scale,t.model)}),nw(n.x,function(t){El(n,"y",t)}),nw(n.y,function(t){El(n,"x",t)}),this.resize(this.model,e)},ow.resize=function(t,e,n){function i(){nw(o,function(t){var e=t.isHorizontal(),n=e?[0,r.width]:[0,r.height],i=t.inverse?1:0;t.setExtent(n[i],n[1-i]),Nl(t,e?r.x:r.y)})}var r=Fr(t.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()});this._rect=r;var o=this._axesList;i(),!n&&t.get("containLabel")&&(nw(o,function(t){if(!t.model.get("axisLabel.inside")){var e=Ol(t);if(e){var n=t.isHorizontal()?"height":"width",i=t.model.get("axisLabel.margin");r[n]-=e[n]+i,"top"===t.position?r.y+=e.height+i:"left"===t.position&&(r.x+=e.width+i)}}}),i())},ow.getAxis=function(t,e){var n=this._axesMap[t];if(null!=n){if(null==e)for(var i in n)if(n.hasOwnProperty(i))return n[i];return n[e]}},ow.getAxes=function(){return this._axesList.slice()},ow.getCartesian=function(t,e){if(null!=t&&null!=e){var n="x"+t+"y"+e;return this._coordsMap[n]}w(t)&&(e=t.yAxisIndex,t=t.xAxisIndex);for(var i=0,r=this._coordsList;ih[1]?-1:1,c=["start"===r?h[0]-u*l:"end"===r?h[1]+u*l:(h[0]+h[1])/2,Xl(r)?t.labelOffset+a*l:0],d=e.get("nameRotate");null!=d&&(d=d*sw/180);var f;Xl(r)?i=uw(t.rotation,null!=d?d:t.rotation,a):(i=Gl(t,r,d||0,h),null!=(f=t.axisNameAvailableWidth)&&(f=Math.abs(f/Math.sin(i.rotation)),!isFinite(f)&&(f=null)));var p=s.getFont(),g=e.get("nameTruncate",!0)||{},m=g.ellipsis,v=T(t.nameTruncateMaxWidth,g.maxWidth,f),y=null!=m&&null!=v?Nv(n,v,p,m,{minChar:2,placeholder:g.placeholder}):n,x=e.get("tooltip",!0),_=e.mainType,w={componentType:_,name:n,$vars:["name"]};w[_+"Index"]=e.componentIndex;var b=new Qm({anid:"name",__fullText:n,__truncatedText:y,position:c,rotation:i.rotation,silent:Hl(e),z2:1,tooltip:x&&x.show?o({content:n,formatter:function(){return n},formatterParams:w},x):null});$i(b.style,s,{text:y,textFont:p,textFill:s.getTextColor()||e.get("axisLine.lineStyle.color"),textAlign:i.textAlign,textVerticalAlign:i.textVerticalAlign}),e.get("triggerEvent")&&(b.eventData=Fl(e),b.eventData.targetType="axisName",b.eventData.name=n),this._dumbGroup.add(b),b.updateTransform(),this.group.add(b),b.decomposeTransform()}}},uw=lw.innerTextLayout=function(t,e,n){var i,r,o=Tr(e-t);return Cr(o)?(r=n>0?"top":"bottom",i="center"):Cr(o-sw)?(r=n>0?"bottom":"top",i="center"):(r="middle",i=o>0&&o0?"right":"left":n>0?"left":"right"),{rotation:o,textAlign:i,textVerticalAlign:r}},cw=lw.ifIgnoreOnTick=function(t,e,n,i,r,o){if(0===e&&r||e===i-1&&o)return!1;var a,s=t.scale;return"ordinal"===s.type&&("function"==typeof n?(a=s.getTicks()[e],!n(a,s.getLabel(a))):e%(n+1))},dw=lw.getInterval=function(t,e){var n=t.get("interval");return null!=n&&"auto"!=n||(n=e),n},fw=d,pw=v,gw=rs({type:"axis",_axisPointer:null,axisPointerClass:null,render:function(t,e,n,i){this.axisPointerClass&&eh(t),gw.superApply(this,"render",arguments),ah(this,t,0,n,0,!0)},updateAxisPointer:function(t,e,n,i,r){ah(this,t,0,n,0,!1)},remove:function(t,e){var n=this._axisPointer;n&&n.remove(e),gw.superApply(this,"remove",arguments)},dispose:function(t,e){sh(this,e),gw.superApply(this,"dispose",arguments)}}),mw=[];gw.registerAxisPointerClass=function(t,e){mw[t]=e},gw.getAxisPointerClass=function(t){return t&&mw[t]};var vw=lw.ifIgnoreOnTick,yw=lw.getInterval,xw=["axisLine","axisTickLabel","axisName"],_w=["splitArea","splitLine"],ww=gw.extend({type:"cartesianAxis",axisPointerClass:"CartesianAxisPointer",render:function(t,e,n,i){this.group.removeAll();var r=this._axisGroup;if(this._axisGroup=new Xp,this.group.add(this._axisGroup),t.get("show")){var o=t.getCoordSysModel(),a=lh(o,t),s=new lw(t,a);d(xw,s.add,s),this._axisGroup.add(s.getGroup()),d(_w,function(e){t.get(e+".show")&&this["_"+e](t,o,a.labelInterval)},this),ur(r,this._axisGroup,t),ww.superCall(this,"render",t,e,n,i)}},_splitLine:function(t,e,n){var i=t.axis;if(!i.scale.isBlank()){var r=t.getModel("splitLine"),o=r.getModel("lineStyle"),s=o.get("color"),l=yw(r,n);s=y(s)?s:[s];for(var h=e.coordinateSystem.getRect(),u=i.isHorizontal(),c=0,d=i.getTicksCoords(),f=i.scale.getTicks(),p=t.get("axisLabel.showMinLabel"),g=t.get("axisLabel.showMaxLabel"),m=[],v=[],x=o.getLineStyle(),_=0;_1){var c;"string"==typeof r?c=X_[r]:"function"==typeof r&&(c=r),c&&t.setData(i.downSample(s.dim,1/u,c,j_))}}}}}("line")),Py.extend({type:"series.__base_bar__",getInitialData:function(t,e){return Is(this.getSource(),this)},getMarkerPosition:function(t){var e=this.coordinateSystem;if(e){var n=e.dataToPoint(e.clampData(t)),i=this.getData(),r=i.getLayout("offset"),o=i.getLayout("size");return n[e.getBaseAxis().isHorizontal()?0:1]+=r+o/2,n}return[NaN,NaN]},defaultOption:{zlevel:0,z:2,coordinateSystem:"cartesian2d",legendHoverLink:!0,barMinHeight:0,barMinAngle:0,itemStyle:{},emphasis:{}}}).extend({type:"series.bar",dependencies:["grid","polar"],brushSelector:"rect"});var bw=Xg([["fill","color"],["stroke","borderColor"],["lineWidth","borderWidth"],["stroke","barBorderColor"],["lineWidth","barBorderWidth"],["opacity"],["shadowBlur"],["shadowOffsetX"],["shadowOffsetY"],["shadowColor"]]),Sw={getBarItemStyle:function(t){var e=bw(this,t);if(this.getBorderLineDash){var n=this.getBorderLineDash();n&&(e.lineDash=n)}return e}},Mw=["itemStyle","barBorderWidth"];o(fr.prototype,Sw),as({type:"bar",render:function(t,e,n){var i=t.get("coordinateSystem");return"cartesian2d"!==i&&"polar"!==i||this._render(t,e,n),this.group},dispose:N,_render:function(t,e,n){var i,r=this.group,o=t.getData(),a=this._data,s=t.coordinateSystem,l=s.getBaseAxis();"cartesian2d"===s.type?i=l.isHorizontal():"polar"===s.type&&(i="angle"===l.dim);var h=t.isAnimationEnabled()?t:null;o.diff(a).add(function(e){if(o.hasValue(e)){var n=o.getItemModel(e),a=Tw[s.type](o,e,n),l=Iw[s.type](o,e,n,a,i,h);o.setItemGraphicEl(e,l),r.add(l),fh(l,o,e,n,a,t,i,"polar"===s.type)}}).update(function(e,n){var l=a.getItemGraphicEl(n);if(o.hasValue(e)){var u=o.getItemModel(e),c=Tw[s.type](o,e,u);l?or(l,{shape:c},h,e):l=Iw[s.type](o,e,u,c,i,h,!0),o.setItemGraphicEl(e,l),r.add(l),fh(l,o,e,u,c,t,i,"polar"===s.type)}else r.remove(l)}).remove(function(t){var e=a.getItemGraphicEl(t);"cartesian2d"===s.type?e&&ch(t,h,e):e&&dh(t,h,e)}).execute(),this._data=o},remove:function(t,e){var n=this.group,i=this._data;t.get("animation")?i&&i.eachItemGraphicEl(function(e){"sector"===e.type?dh(e.dataIndex,t,e):ch(e.dataIndex,t,e)}):n.removeAll()}});var Iw={cartesian2d:function(t,e,n,i,r,a,s){var l=new lv({shape:o({},i)});if(a){var h=l.shape,u=r?"height":"width",c={};h[u]=0,c[u]=i[u],bv[s?"updateProps":"initProps"](l,{shape:c},a,e)}return l},polar:function(t,e,n,i,r,a,s){var l=new nv({shape:o({},i)});if(a){var h=l.shape,u=r?"r":"endAngle",c={};h[u]=r?0:i.startAngle,c[u]=i[u],bv[s?"updateProps":"initProps"](l,{shape:c},a,e)}return l}},Tw={cartesian2d:function(t,e,n){var i=t.getItemLayout(e),r=ph(n,i),o=i.width>0?1:-1,a=i.height>0?1:-1;return{x:i.x+o*r/2,y:i.y+a*r/2,width:i.width-o*r,height:i.height-a*r}},polar:function(t,e,n){var i=t.getItemLayout(e);return{cx:i.cx,cy:i.cy,r0:i.r0,r:i.r,startAngle:i.startAngle,endAngle:i.endAngle}}};Ja(v(function(t,e,n){var i=Fs(g(e.getSeriesByType(t),function(t){return!e.isSeriesFiltered(t)&&t.coordinateSystem&&"cartesian2d"===t.coordinateSystem.type})),r={},o={};e.eachSeriesByType(t,function(t){if("cartesian2d"===t.coordinateSystem.type){var e=t.getData(),n=t.coordinateSystem,a=n.getBaseAxis(),s=Bs(t),l=i[Vs(a)][s],h=l.offset,u=l.width,c=n.getOtherAxis(a),d=t.get("barMinHeight")||0,f=a.onZero?c.toGlobalCoord(c.dataToCoord(0)):c.getGlobalExtent()[0],p=[e.mapDimension("x"),e.mapDimension("y")],g=e.mapArray(p,function(t,e){return n.dataToPoint([t,e])},!0);r[s]=r[s]||[],o[s]=o[s]||[],e.setLayout({offset:h,size:u}),e.each(e.mapDimension(c.dim),function(t,n){if(!isNaN(t)){r[s][n]||(r[s][n]={p:f,n:f},o[s][n]={p:f,n:f});var i,a,l,p,m=t>=0?"p":"n",v=g[n],y=r[s][n][m],x=o[s][n][m];c.isHorizontal()?(i=y,a=v[1]+h,l=v[0]-x,p=u,o[s][n][m]+=l,Math.abs(l)0&&"scale"!==h){var d=r.getItemLayout(0),f=Math.max(n.getWidth(),n.getHeight())/2,p=m(a.removeClipPath,a);a.setClipPath(this._createClipPath(d.cx,d.cy,f,d.startAngle,d.clockwise,p,t))}this._data=r}},dispose:function(){},_createClipPath:function(t,e,n,i,r,o,a){var s=new nv({shape:{cx:t,cy:e,r0:0,r:n,startAngle:i,endAngle:i,clockwise:r}});return ar(s,{shape:{endAngle:i+(r?1:-1)*Math.PI*2}},a,o),s},containPoint:function(t,e){var n=e.getData().getItemLayout(0);if(n){var i=t[0]-n.cx,r=t[1]-n.cy,o=Math.sqrt(i*i+r*r);return o<=n.r&&o>=n.r0}}});var Pw=function(t,e,n,i){var r,o,a=t.getData(),s=[],l=!1;a.each(function(n){var i,h,u,c,d=a.getItemLayout(n),f=a.getItemModel(n),p=f.getModel("label"),g=p.get("position")||f.get("emphasis.label.position"),m=f.getModel("labelLine"),v=m.get("length"),y=m.get("length2"),x=(d.startAngle+d.endAngle)/2,_=Math.cos(x),w=Math.sin(x);r=d.cx,o=d.cy;var b="inside"===g||"inner"===g;if("center"===g)i=d.cx,h=d.cy,c="center";else{var S=(b?(d.r+d.r0)/2*_:d.r*_)+r,M=(b?(d.r+d.r0)/2*w:d.r*w)+o;if(i=S+3*_,h=M+3*w,!b){var I=S+_*(v+e-d.r),T=M+w*(v+e-d.r),C=I+(_<0?-1:1)*y,A=T;i=C+(_<0?-5:5),h=A,u=[[S,M],[I,T],[C,A]]}c=b?"center":_>0?"left":"right"}var D=p.getFont(),k=p.get("rotate")?_<0?-x+Math.PI:-x:0,P=ce(t.getFormattedLabel(n,"normal")||a.getName(n),D,c,"top");l=!!k,d.label={x:i,y:h,position:g,height:P.height,len:v,len2:y,linePoints:u,textAlign:c,verticalAlign:"middle",rotation:k,inside:b},b||s.push(d.label)}),!l&&t.get("avoidLabelOverlap")&&xh(s,r,o,e,n,i)},Lw=2*Math.PI,Ow=Math.PI/180;!function(t,e){d(e,function(e){e.update="updateView",Qa(e,function(n,i){var r={};return i.eachComponent({mainType:"series",subType:t,query:n},function(t){t[e.method]&&t[e.method](n.name,n.dataIndex);var i=t.getData();i.each(function(e){var n=i.getName(e);r[n]=t.isSelected(n)||!1})}),{name:n.name,selected:r}})})}("pie",[{type:"pieToggleSelect",event:"pieselectchanged",method:"toggleSelected"},{type:"pieSelect",event:"pieselected",method:"select"},{type:"pieUnSelect",event:"pieunselected",method:"unSelect"}]),ts(function(t){return{getTargetSeries:function(e){var n={},i=R();return e.eachSeriesByType(t,function(t){t.__paletteScope=n,i.set(t.uid,t)}),i},reset:function(t,e){var n=t.getRawData(),i={},r=t.getData();r.each(function(t){var e=r.getRawIndex(t);i[e]=t}),n.each(function(e){var o=i[e],a=null!=o&&r.getItemVisual(o,"color",!0);if(a)n.setItemVisual(e,"color",a);else{var s=n.getItemModel(e).get("itemStyle.color")||t.getColorFromPalette(n.getName(e),t.__paletteScope,n.count());n.setItemVisual(e,"color",s),null!=o&&r.setItemVisual(o,"color",s)}})}}}("pie")),Ja(v(function(t,e,n,i){e.eachSeriesByType(t,function(t){var e=t.getData(),i=e.mapDimension("value"),r=t.get("center"),o=t.get("radius");y(o)||(o=[0,o]),y(r)||(r=[r,r]);var a=n.getWidth(),s=n.getHeight(),l=Math.min(a,s),h=xr(r[0],a),u=xr(r[1],s),c=xr(o[0],l/2),d=xr(o[1],l/2),f=-t.get("startAngle")*Ow,p=t.get("minAngle")*Ow,g=0;e.each(i,function(t){!isNaN(t)&&g++});var m=e.getSum(i),v=Math.PI/(m||g)*2,x=t.get("clockwise"),_=t.get("roseType"),w=t.get("stillShowZeroSum"),b=e.getDataExtent(i);b[0]=0;var S=Lw,M=0,I=f,T=x?1:-1;if(e.each(i,function(t,n){var i;if(isNaN(t))e.setItemLayout(n,{angle:NaN,startAngle:NaN,endAngle:NaN,clockwise:x,cx:h,cy:u,r0:c,r:_?NaN:d});else{(i="area"!==_?0===m&&w?v:t*v:Lw/g)=0;s--){var l=2*s,h=i[l]-o/2,u=i[l+1]-a/2;if(t>=h&&e>=u&&t<=h+o&&e<=u+a)return s}return-1}}),Ew=_h.prototype;Ew.isPersistent=function(){return!this._incremental},Ew.updateData=function(t){this.group.removeAll();var e=new zw({rectHover:!0,cursor:"default"});e.setShape({points:t.getLayout("symbolPoints")}),this._setCommon(e,t),this.group.add(e),this._incremental=null},Ew.updateLayout=function(t){if(!this._incremental){var e=t.getLayout("symbolPoints");this.group.eachChild(function(t){if(null!=t.startIndex){var n=2*(t.endIndex-t.startIndex),i=4*t.startIndex*2;e=new Float32Array(e.buffer,i,n)}t.setShape("points",e)})}},Ew.incrementalPrepareUpdate=function(t){this.group.removeAll(),this._clearIncremental(),t.count()>2e6?(this._incremental||(this._incremental=new Ci({silent:!0})),this.group.add(this._incremental)):this._incremental=null},Ew.incrementalUpdate=function(t,e){var n;this._incremental?(n=new zw,this._incremental.addDisplayable(n,!0)):((n=new zw({rectHover:!0,cursor:"default",startIndex:t.start,endIndex:t.end})).incremental=!0,this.group.add(n)),n.setShape({points:e.getLayout("symbolPoints")}),this._setCommon(n,e,!!this._incremental)},Ew._setCommon=function(t,e,n){var i=e.hostModel,r=e.getVisual("symbolSize");t.setShape("size",r instanceof Array?r:[r,r]),t.symbolProxy=Ks(e.getVisual("symbol"),0,0,0,0),t.setColor=t.symbolProxy.setColor;var o=t.shape.size[0]<4;t.useStyle(i.getModel("itemStyle").getItemStyle(o?["color","shadowBlur","shadowColor"]:["color"]));var a=e.getVisual("color");a&&t.setColor(a),n||(t.seriesIndex=i.seriesIndex,t.on("mousemove",function(e){t.dataIndex=null;var n=t.findDataIndex(e.offsetX,e.offsetY);n>=0&&(t.dataIndex=n+(t.startIndex||0))}))},Ew.remove=function(){this._clearIncremental(),this._incremental=null,this.group.removeAll()},Ew._clearIncremental=function(){var t=this._incremental;t&&t.clearDisplaybles()},as({type:"scatter",render:function(t,e,n){var i=t.getData();this._updateSymbolDraw(i,t).updateData(i),this._finished=!0},incrementalPrepareRender:function(t,e,n){var i=t.getData();this._updateSymbolDraw(i,t).incrementalPrepareUpdate(i),this._finished=!1},incrementalRender:function(t,e,n){this._symbolDraw.incrementalUpdate(t,e.getData()),this._finished=t.end===e.getData().count()},updateTransform:function(t,e,n){var i=t.getData();if(this.group.dirty(),!this._finished||i.count()>1e4||!this._symbolDraw.isPersistent())return{update:!0};var r=U_().reset(t);r.progress&&r.progress({start:0,end:i.count()},i),this._symbolDraw.updateLayout(i)},_updateSymbolDraw:function(t,e){var n=this._symbolDraw,i=e.pipelineContext.large;return n&&i===this._isLargeDraw||(n&&n.remove(),n=this._symbolDraw=i?new _h:new hl,this._isLargeDraw=i,this.group.removeAll()),this.group.add(n.group),n},remove:function(t,e){this._symbolDraw&&this._symbolDraw.remove(!0),this._symbolDraw=null},dispose:function(){}}),ts(Z_("scatter","circle")),Ja(U_("scatter")),$a(function(t){var e=t.graphic;y(e)?e[0]&&e[0].elements?t.graphic=[t.graphic[0]]:t.graphic=[{elements:e}]:e&&!e.elements&&(t.graphic=[{elements:[e]}])});var Rw=is({type:"graphic",defaultOption:{elements:[],parentId:null},_elOptionsToUpdate:null,mergeOption:function(t){var e=this.option.elements;this.option.elements=null,Rw.superApply(this,"mergeOption",arguments),this.option.elements=e},optionUpdated:function(t,e){var n=this.option,i=(e?n:t).elements,r=n.elements=e?[]:n.elements,o=[];this._flatten(i,o);var a=Sn(r,o);Mn(a);var s=this._elOptionsToUpdate=[];d(a,function(t,e){var n=t.option;n&&(s.push(n),Ih(t,n),Th(r,e,n),Ch(r[e],n))},this);for(var l=r.length-1;l>=0;l--)null==r[l]?r.splice(l,1):delete r[l].$action},_flatten:function(t,e,n){d(t,function(t){if(t){n&&(t.parentOption=n),e.push(t);var i=t.children;"group"===t.type&&i&&this._flatten(i,e,t),delete t.children}},this)},useElOptionsToUpdate:function(){var t=this._elOptionsToUpdate;return this._elOptionsToUpdate=null,t}});rs({type:"graphic",init:function(t,e){this._elMap=R(),this._lastGraphicModel},render:function(t,e,n){t!==this._lastGraphicModel&&this._clear(),this._lastGraphicModel=t,this._updateElements(t,n),this._relocate(t,n)},_updateElements:function(t,e){var n=t.useElOptionsToUpdate();if(n){var i=this._elMap,r=this.group;d(n,function(t){var e=t.$action,n=t.id,o=i.get(n),a=t.parentId,s=null!=a?i.get(a):r;if("text"===t.type){var l=t.style;t.hv&&t.hv[1]&&(l.textVerticalAlign=l.textBaseline=null),!l.hasOwnProperty("textFill")&&l.fill&&(l.textFill=l.fill),!l.hasOwnProperty("textStroke")&&l.stroke&&(l.textStroke=l.stroke)}var h=Sh(t);e&&"merge"!==e?"replace"===e?(bh(o,i),wh(n,s,h,i)):"remove"===e&&bh(o,i):o?o.attr(h):wh(n,s,h,i);var u=i.get(n);u&&(u.__ecGraphicWidth=t.width,u.__ecGraphicHeight=t.height)})}},_relocate:function(t,e){for(var n=t.option.elements,i=this.group,r=this._elMap,o=n.length-1;o>=0;o--){var a=n[o],s=r.get(a.id);if(s){var l=s.parent;Gr(s,a,l===i?{width:e.getWidth(),height:e.getHeight()}:{width:l.__ecGraphicWidth||0,height:l.__ecGraphicHeight||0},null,{hv:a.hv,boundingMode:a.bounding})}}},_clear:function(){var t=this._elMap;t.each(function(e){bh(e,t)}),this._elMap=R()},dispose:function(){this._clear()}});var Nw=function(t,e){var n,i=[],r=t.seriesIndex;if(null==r||!(n=e.getSeriesByIndex(r)))return{point:[]};var o=n.getData(),a=Tn(o,t);if(null==a||a<0||y(a))return{point:[]};var s=o.getItemGraphicEl(a),l=n.coordinateSystem;if(n.getTooltipPosition)i=n.getTooltipPosition(a)||[];else if(l&&l.dataToPoint)i=l.dataToPoint(o.getValues(f(l.dimensions,function(t){return o.mapDimension(t)}),a,!0))||[];else if(s){var h=s.getBoundingRect().clone();h.applyTransform(s.transform),i=[h.x+h.width/2,h.y+h.height/2]}return{point:i,el:s}},Bw=d,Vw=v,Fw=Cn(),Gw=(is({type:"axisPointer",coordSysAxesInfo:null,defaultOption:{show:"auto",triggerOn:null,zlevel:0,z:50,type:"line",snap:!1,triggerTooltip:!0,value:null,status:null,link:[],animation:null,animationDurationUpdate:200,lineStyle:{color:"#aaa",width:1,type:"solid"},shadowStyle:{color:"rgba(150,150,150,0.3)"},label:{show:!0,formatter:null,precision:"auto",margin:3,color:"#fff",padding:[5,7,5,7],backgroundColor:"auto",borderColor:null,borderWidth:0,shadowBlur:3,shadowColor:"#aaa"},handle:{show:!1,icon:"M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z",size:45,margin:50,color:"#333",shadowBlur:3,shadowColor:"#aaa",shadowOffsetX:0,shadowOffsetY:2,throttle:40}}}),Cn()),Hw=d,Ww=rs({type:"axisPointer",render:function(t,e,n){var i=e.getComponent("tooltip"),r=t.get("triggerOn")||i&&i.get("triggerOn")||"mousemove|click";Bh("axisPointer",n,function(t,e,n){"none"!==r&&("leave"===t||r.indexOf(t)>=0)&&n({type:"updateAxisPointer",currTrigger:t,x:e&&e.offsetX,y:e&&e.offsetY})})},remove:function(t,e){Zh(e.getZr(),"axisPointer"),Ww.superApply(this._model,"remove",arguments)},dispose:function(t,e){Zh("axisPointer",e),Ww.superApply(this._model,"dispose",arguments)}}),Zw=Cn(),Uw=n,Xw=m;(Uh.prototype={_group:null,_lastGraphicKey:null,_handle:null,_dragging:!1,_lastValue:null,_lastStatus:null,_payloadInfo:null,animationThreshold:15,render:function(t,e,n,i){var r=e.get("value"),o=e.get("status");if(this._axisModel=t,this._axisPointerModel=e,this._api=n,i||this._lastValue!==r||this._lastStatus!==o){this._lastValue=r,this._lastStatus=o;var a=this._group,s=this._handle;if(!o||"hide"===o)return a&&a.hide(),void(s&&s.hide());a&&a.show(),s&&s.show();var l={};this.makeElOption(l,r,t,e,n);var h=l.graphicKey;h!==this._lastGraphicKey&&this.clear(n),this._lastGraphicKey=h;var u=this._moveAnimation=this.determineAnimation(t,e);if(a){var c=v(Xh,e,u);this.updatePointerEl(a,l,c,e),this.updateLabelEl(a,l,c,e)}else a=this._group=new Xp,this.createPointerEl(a,l,t,e),this.createLabelEl(a,l,t,e),n.getZr().add(a);$h(a,e,!0),this._renderHandle(r)}},remove:function(t){this.clear(t)},dispose:function(t){this.clear(t)},determineAnimation:function(t,e){var n=e.get("animation"),i=t.axis,r="category"===i.type,o=e.get("snap");if(!o&&!r)return!1;if("auto"===n||null==n){var a=this.animationThreshold;if(r&&i.getBandWidth()>a)return!0;if(o){var s=nh(t).seriesDataCount,l=i.getExtent();return Math.abs(l[0]-l[1])/s>a}return!1}return!0===n},makeElOption:function(t,e,n,i,r){},createPointerEl:function(t,e,n,i){var r=e.pointer;if(r){var o=Zw(t).pointerEl=new bv[r.type](Uw(e.pointer));t.add(o)}},createLabelEl:function(t,e,n,i){if(e.label){var r=Zw(t).labelEl=new lv(Uw(e.label));t.add(r),Yh(r,i)}},updatePointerEl:function(t,e,n){var i=Zw(t).pointerEl;i&&(i.setStyle(e.pointer.style),n(i,{shape:e.pointer.shape}))},updateLabelEl:function(t,e,n,i){var r=Zw(t).labelEl;r&&(r.setStyle(e.label.style),n(r,{shape:e.label.shape,position:e.label.position}),Yh(r,i))},_renderHandle:function(t){if(!this._dragging&&this.updateHandleTransform){var e=this._axisPointerModel,n=this._api.getZr(),i=this._handle,r=e.getModel("handle"),o=e.get("status");if(!r.get("show")||!o||"hide"===o)return i&&n.remove(i),void(this._handle=null);var a;this._handle||(a=!0,i=this._handle=dr(r.get("icon"),{cursor:"move",draggable:!0,onmousemove:function(t){bg(t.event)},onmousedown:Xw(this._onHandleDragMove,this,0,0),drift:Xw(this._onHandleDragMove,this),ondragend:Xw(this._onHandleDragEnd,this)}),n.add(i)),$h(i,e,!1);var s=["color","borderColor","borderWidth","opacity","shadowColor","shadowBlur","shadowOffsetX","shadowOffsetY"];i.setStyle(r.getItemStyle(null,s));var l=r.get("size");y(l)||(l=[l,l]),i.attr("scale",[l[0]/2,l[1]/2]),sa(this,"_doDispatchAxisPointer",r.get("throttle")||0,"fixRate"),this._moveHandleToValue(t,a)}},_moveHandleToValue:function(t,e){Xh(this._axisPointerModel,!e&&this._moveAnimation,this._handle,qh(this.getHandleTransform(t,this._axisModel,this._axisPointerModel)))},_onHandleDragMove:function(t,e){var n=this._handle;if(n){this._dragging=!0;var i=this.updateHandleTransform(qh(n),[t,e],this._axisModel,this._axisPointerModel);this._payloadInfo=i,n.stopAnimation(),n.attr(qh(i)),Zw(n).lastProp=null,this._doDispatchAxisPointer()}},_doDispatchAxisPointer:function(){if(this._handle){var t=this._payloadInfo,e=this._axisModel;this._api.dispatchAction({type:"updateAxisPointer",x:t.cursorPoint[0],y:t.cursorPoint[1],tooltipOption:t.tooltipOption,axesInfo:[{axisDim:e.axis.dim,axisIndex:e.componentIndex}]})}},_onHandleDragEnd:function(t){if(this._dragging=!1,this._handle){var e=this._axisPointerModel.get("value");this._moveHandleToValue(e),this._api.dispatchAction({type:"hideTip"})}},getHandleTransform:null,updateHandleTransform:null,clear:function(t){this._lastValue=null,this._lastStatus=null;var e=t.getZr(),n=this._group,i=this._handle;e&&n&&(this._lastGraphicKey=null,n&&e.remove(n),i&&e.remove(i),this._group=null,this._handle=null,this._payloadInfo=null)},doClear:function(){},buildLabel:function(t,e,n){return n=n||0,{x:t[n],y:t[1-n],width:e[n],height:e[1-n]}}}).constructor=Uh,zn(Uh);var jw=Uh.extend({makeElOption:function(t,e,n,i,r){var o=n.axis,a=o.grid,s=i.get("type"),l=ou(a,o).getOtherAxis(o).getGlobalExtent(),h=o.toGlobalCoord(o.dataToCoord(e,!0));if(s&&"none"!==s){var u=Kh(i),c=Yw[s](o,h,l,u);c.style=u,t.graphicKey=c.type,t.pointer=c}nu(e,t,lh(a.model,n),n,i,r)},getHandleTransform:function(t,e,n){var i=lh(e.axis.grid.model,e,{labelInside:!1});return i.labelMargin=n.get("handle.margin"),{position:eu(e.axis,t,i),rotation:i.rotation+(i.labelDirection<0?Math.PI:0)}},updateHandleTransform:function(t,e,n,i){var r=n.axis,o=r.grid,a=r.getGlobalExtent(!0),s=ou(o,r).getOtherAxis(r).getGlobalExtent(),l="x"===r.dim?0:1,h=t.position;h[l]+=e[l],h[l]=Math.min(a[1],h[l]),h[l]=Math.max(a[0],h[l]);var u=(s[1]+s[0])/2,c=[u,u];c[l]=h[l];var d=[{verticalAlign:"middle"},{align:"center"}];return{position:h,rotation:t.rotation,cursorPoint:c,tooltipOption:d[l]}}}),Yw={line:function(t,e,n,i){var r=iu([e,n[0]],[e,n[1]],au(t));return Oi({shape:r,style:i}),{type:"Line",shape:r}},shadow:function(t,e,n,i){var r=t.getBandWidth(),o=n[1]-n[0];return{type:"Rect",shape:ru([e-r/2,n[0]],[r,o],au(t))}}};gw.registerAxisPointerClass("CartesianAxisPointer",jw),$a(function(t){if(t){(!t.axisPointer||0===t.axisPointer.length)&&(t.axisPointer={});var e=t.axisPointer.link;e&&!y(e)&&(t.axisPointer.link=[e])}}),Ka(hx.PROCESSOR.STATISTIC,function(t,e){t.getComponent("axisPointer").coordSysAxesInfo=ql(t,e)}),Qa({type:"updateAxisPointer",event:"updateAxisPointer",update:":updateAxisPointer"},function(t,e,n){var i=t.currTrigger,r=[t.x,t.y],o=t,a=t.dispatchAction||m(n.dispatchAction,n),s=e.getComponent("axisPointer").coordSysAxesInfo;if(s){Nh(r)&&(r=Nw({seriesIndex:o.seriesIndex,dataIndex:o.dataIndex},e).point);var l=Nh(r),h=o.axesInfo,u=s.axesInfo,c="leave"===i||Nh(r),d={},f={},p={list:[],map:{}},g={showPointer:Vw(kh,f),showTooltip:Vw(Ph,p)};Bw(s.coordSysMap,function(t,e){var n=l||t.containPoint(r);Bw(s.coordSysAxesInfo[e],function(t,e){var i=t.axis,o=Eh(h,t);if(!c&&n&&(!h||o)){var a=o&&o.value;null!=a||l||(a=i.pointToData(r)),null!=a&&Ah(t,a,g,!1,d)}})});var v={};return Bw(u,function(t,e){var n=t.linkGroup;n&&!f[e]&&Bw(n.axesInfo,function(e,i){var r=f[i];if(e!==t&&r){var o=r.value;n.mapper&&(o=t.axis.scale.parse(n.mapper(o,Rh(e),Rh(t)))),v[t.key]=o}})}),Bw(v,function(t,e){Ah(u[e],t,g,!0,d)}),Lh(f,u,d),Oh(p,r,t,a),zh(u,0,n),d}}),is({type:"tooltip",dependencies:["axisPointer"],defaultOption:{zlevel:0,z:8,show:!0,showContent:!0,trigger:"item",triggerOn:"mousemove|click",alwaysShowContent:!1,displayMode:"single",confine:!1,showDelay:0,hideDelay:100,transitionDuration:.4,enterable:!1,backgroundColor:"rgba(50,50,50,0.7)",borderColor:"#333",borderRadius:4,borderWidth:0,padding:5,extraCssText:"",axisPointer:{type:"line",axis:"auto",animation:"auto",animationDurationUpdate:200,animationEasingUpdate:"exponentialOut",crossStyle:{color:"#999",width:1,type:"dashed",textStyle:{}}},textStyle:{color:"#fff",fontSize:14}}});var qw=d,$w=Or,Kw=["","-webkit-","-moz-","-o-"];uu.prototype={constructor:uu,_enterable:!0,update:function(){var t=this._container,e=t.currentStyle||document.defaultView.getComputedStyle(t),n=t.style;"absolute"!==n.position&&"absolute"!==e.position&&(n.position="relative")},show:function(t){clearTimeout(this._hideTimeout);var e=this.el;e.style.cssText="position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;"+hu(t)+";left:"+this._x+"px;top:"+this._y+"px;"+(t.get("extraCssText")||""),e.style.display=e.innerHTML?"block":"none",this._show=!0},setContent:function(t){this.el.innerHTML=null==t?"":t},setEnterable:function(t){this._enterable=t},getSize:function(){var t=this.el;return[t.clientWidth,t.clientHeight]},moveTo:function(t,e){var n,i=this._zr;i&&i.painter&&(n=i.painter.getViewportRootOffset())&&(t+=n.offsetLeft,e+=n.offsetTop);var r=this.el.style;r.left=t+"px",r.top=e+"px",this._x=t,this._y=e},hide:function(){this.el.style.display="none",this._show=!1},hideLater:function(t){!this._show||this._inContent&&this._enterable||(t?(this._hideDelay=t,this._show=!1,this._hideTimeout=setTimeout(m(this.hide,this),t)):this.hide())},isShow:function(){return this._show}};var Qw=m,Jw=d,tb=xr,eb=new lv({shape:{x:-1,y:-1,width:2,height:2}});rs({type:"tooltip",init:function(t,e){if(!Zf.node){var n=new uu(e.getDom(),e);this._tooltipContent=n}},render:function(t,e,n){if(!Zf.node&&!Zf.wxa){this.group.removeAll(),this._tooltipModel=t,this._ecModel=e,this._api=n,this._lastDataByCoordSys=null,this._alwaysShowContent=t.get("alwaysShowContent");var i=this._tooltipContent;i.update(),i.setEnterable(t.get("enterable")),this._initGlobalListener(),this._keepShow()}},_initGlobalListener:function(){var t=this._tooltipModel.get("triggerOn");Bh("itemTooltip",this._api,Qw(function(e,n,i){"none"!==t&&(t.indexOf(e)>=0?this._tryShow(n,i):"leave"===e&&this._hide(i))},this))},_keepShow:function(){var t=this._tooltipModel,e=this._ecModel,n=this._api;if(null!=this._lastX&&null!=this._lastY&&"none"!==t.get("triggerOn")){var i=this;clearTimeout(this._refreshUpdateTimeout),this._refreshUpdateTimeout=setTimeout(function(){i.manuallyShowTip(t,e,n,{x:i._lastX,y:i._lastY})})}},manuallyShowTip:function(t,e,n,i){if(i.from!==this.uid&&!Zf.node){var r=du(i,n);this._ticket="";var o=i.dataByCoordSys;if(i.tooltip&&null!=i.x&&null!=i.y){var a=eb;a.position=[i.x,i.y],a.update(),a.tooltip=i.tooltip,this._tryShow({offsetX:i.x,offsetY:i.y,target:a},r)}else if(o)this._tryShow({offsetX:i.x,offsetY:i.y,position:i.position,event:{},dataByCoordSys:i.dataByCoordSys,tooltipOption:i.tooltipOption},r);else if(null!=i.seriesIndex){if(this._manuallyAxisShowTip(t,e,n,i))return;var s=Nw(i,e),l=s.point[0],h=s.point[1];null!=l&&null!=h&&this._tryShow({offsetX:l,offsetY:h,position:i.position,target:s.el,event:{}},r)}else null!=i.x&&null!=i.y&&(n.dispatchAction({type:"updateAxisPointer",x:i.x,y:i.y}),this._tryShow({offsetX:i.x,offsetY:i.y,position:i.position,target:n.getZr().findHover(i.x,i.y).target,event:{}},r))}},manuallyHideTip:function(t,e,n,i){var r=this._tooltipContent;!this._alwaysShowContent&&this._tooltipModel&&r.hideLater(this._tooltipModel.get("hideDelay")),this._lastX=this._lastY=null,i.from!==this.uid&&this._hide(du(i,n))},_manuallyAxisShowTip:function(t,e,n,i){var r=i.seriesIndex,o=i.dataIndex,a=e.getComponent("axisPointer").coordSysAxesInfo;if(null!=r&&null!=o&&null!=a){var s=e.getSeriesByIndex(r);if(s&&"axis"===(t=cu([s.getData().getItemModel(o),s,(s.coordinateSystem||{}).model,t])).get("trigger"))return n.dispatchAction({type:"updateAxisPointer",seriesIndex:r,dataIndex:o,position:i.position}),!0}},_tryShow:function(t,e){var n=t.target;if(this._tooltipModel){this._lastX=t.offsetX,this._lastY=t.offsetY;var i=t.dataByCoordSys;i&&i.length?this._showAxisTooltip(i,t):n&&null!=n.dataIndex?(this._lastDataByCoordSys=null,this._showSeriesItemTooltip(t,n,e)):n&&n.tooltip?(this._lastDataByCoordSys=null,this._showComponentItemTooltip(t,n,e)):(this._lastDataByCoordSys=null,this._hide(e))}},_showOrMove:function(t,e){var n=t.get("showDelay");e=m(e,this),clearTimeout(this._showTimout),n>0?this._showTimout=setTimeout(e,n):e()},_showAxisTooltip:function(t,e){var n=this._ecModel,i=this._tooltipModel,r=[e.offsetX,e.offsetY],o=[],a=[],s=cu([e.tooltipOption,i]);Jw(t,function(t){Jw(t.dataByAxis,function(t){var e=n.getComponent(t.axisDim+"Axis",t.axisIndex),i=t.value,r=[];if(e&&null!=i){var s=tu(i,e.axis,n,t.seriesDataIndices,t.valueLabelOpt);d(t.seriesDataIndices,function(o){var l=n.getSeriesByIndex(o.seriesIndex),h=o.dataIndexInside,u=l&&l.getDataParams(h);u.axisDim=t.axisDim,u.axisIndex=t.axisIndex,u.axisType=t.axisType,u.axisId=t.axisId,u.axisValue=qs(e.axis,i),u.axisValueLabel=s,u&&(a.push(u),r.push(l.formatTooltip(h,!0)))});var l=s;o.push((l?zr(l)+"
                    ":"")+r.join("
                    "))}})},this),o.reverse(),o=o.join("

                    ");var l=e.position;this._showOrMove(s,function(){this._updateContentNotChangedOnAxis(t)?this._updatePosition(s,l,r[0],r[1],this._tooltipContent,a):this._showTooltipContent(s,o,a,Math.random(),r[0],r[1],l)})},_showSeriesItemTooltip:function(t,e,n){var i=this._ecModel,r=e.seriesIndex,o=i.getSeriesByIndex(r),a=e.dataModel||o,s=e.dataIndex,l=e.dataType,h=a.getData(),u=cu([h.getItemModel(s),a,o&&(o.coordinateSystem||{}).model,this._tooltipModel]),c=u.get("trigger");if(null==c||"item"===c){var d=a.getDataParams(s,l),f=a.formatTooltip(s,!1,l),p="item_"+a.name+"_"+s;this._showOrMove(u,function(){this._showTooltipContent(u,f,d,p,t.offsetX,t.offsetY,t.position,t.target)}),n({type:"showTip",dataIndexInside:s,dataIndex:h.getRawIndex(s),seriesIndex:r,from:this.uid})}},_showComponentItemTooltip:function(t,e,n){var i=e.tooltip;if("string"==typeof i){var r=i;i={content:r,formatter:r}}var o=new fr(i,this._tooltipModel,this._ecModel),a=o.get("content"),s=Math.random();this._showOrMove(o,function(){this._showTooltipContent(o,a,o.get("formatterParams")||{},s,t.offsetX,t.offsetY,t.position,e)}),n({type:"showTip",from:this.uid})},_showTooltipContent:function(t,e,n,i,r,o,a,s){if(this._ticket="",t.get("showContent")&&t.get("show")){var l=this._tooltipContent,h=t.get("formatter");a=a||t.get("position");var u=e;if(h&&"string"==typeof h)u=Er(h,n,!0);else if("function"==typeof h){var c=Qw(function(e,i){e===this._ticket&&(l.setContent(i),this._updatePosition(t,a,r,o,l,n,s))},this);this._ticket=i,u=h(n,i,c)}l.setContent(u),l.show(t),this._updatePosition(t,a,r,o,l,n,s)}},_updatePosition:function(t,e,n,i,r,o,a){var s=this._api.getWidth(),l=this._api.getHeight();e=e||t.get("position");var h=r.getSize(),u=t.get("align"),c=t.get("verticalAlign"),d=a&&a.getBoundingRect().clone();if(a&&d.applyTransform(a.transform),"function"==typeof e&&(e=e([n,i],o,r.el,d,{viewSize:[s,l],contentSize:h.slice()})),y(e))n=tb(e[0],s),i=tb(e[1],l);else if(w(e)){e.width=h[0],e.height=h[1];var f=Fr(e,{width:s,height:l});n=f.x,i=f.y,u=null,c=null}else"string"==typeof e&&a?(n=(p=mu(e,d,h))[0],i=p[1]):(n=(p=fu(n,i,r.el,s,l,u?null:20,c?null:20))[0],i=p[1]);if(u&&(n-=vu(u)?h[0]/2:"right"===u?h[0]:0),c&&(i-=vu(c)?h[1]/2:"bottom"===c?h[1]:0),t.get("confine")){var p=pu(n,i,r.el,s,l);n=p[0],i=p[1]}r.moveTo(n,i)},_updateContentNotChangedOnAxis:function(t){var e=this._lastDataByCoordSys,n=!!e&&e.length===t.length;return n&&Jw(e,function(e,i){var r=e.dataByAxis||{},o=(t[i]||{}).dataByAxis||[];(n&=r.length===o.length)&&Jw(r,function(t,e){var i=o[e]||{},r=t.seriesDataIndices||[],a=i.seriesDataIndices||[];(n&=t.value===i.value&&t.axisType===i.axisType&&t.axisId===i.axisId&&r.length===a.length)&&Jw(r,function(t,e){var i=a[e];n&=t.seriesIndex===i.seriesIndex&&t.dataIndex===i.dataIndex})})}),this._lastDataByCoordSys=t,!!n},_hide:function(t){this._lastDataByCoordSys=null,t({type:"hideTip",from:this.uid})},dispose:function(t,e){Zf.node||(this._tooltipContent.hide(),Zh("itemTooltip",e))}}),Qa({type:"showTip",event:"showTip",update:"tooltip:manuallyShowTip"},function(){}),Qa({type:"hideTip",event:"hideTip",update:"tooltip:manuallyHideTip"},function(){});var nb=is({type:"legend.plain",dependencies:["series"],layoutMode:{type:"box",ignoreSize:!0},init:function(t,e,n){this.mergeDefaultAndTheme(t,n),t.selected=t.selected||{}},mergeOption:function(t){nb.superCall(this,"mergeOption",t)},optionUpdated:function(){this._updateData(this.ecModel);var t=this._data;if(t[0]&&"single"===this.get("selectedMode")){for(var e=!1,n=0;n=0},defaultOption:{zlevel:0,z:4,show:!0,orient:"horizontal",left:"center",top:0,align:"auto",backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderRadius:0,borderWidth:0,padding:5,itemGap:10,itemWidth:25,itemHeight:14,inactiveColor:"#ccc",textStyle:{color:"#333"},selectedMode:!0,tooltip:{show:!1}}});Qa("legendToggleSelect","legendselectchanged",v(yu,"toggleSelected")),Qa("legendSelect","legendselected",v(yu,"select")),Qa("legendUnSelect","legendunselected",v(yu,"unSelect"));var ib=v,rb=d,ob=Xp,ab=rs({type:"legend.plain",newlineDisabled:!1,init:function(){this.group.add(this._contentGroup=new ob),this._backgroundEl},getContentGroup:function(){return this._contentGroup},render:function(t,e,n){if(this.resetInner(),t.get("show",!0)){var i=t.get("align");i&&"auto"!==i||(i="right"===t.get("left")&&"vertical"===t.get("orient")?"right":"left"),this.renderInner(i,t,e,n);var r=t.getBoxLayoutParams(),o={width:n.getWidth(),height:n.getHeight()},s=t.get("padding"),l=Fr(r,o,s),h=this.layoutInner(t,i,l),u=Fr(a({width:h.width,height:h.height},r),o,s);this.group.attr("position",[u.x-h.x,u.y-h.y]),this.group.add(this._backgroundEl=_u(h,t))}},resetInner:function(){this.getContentGroup().removeAll(),this._backgroundEl&&this.group.remove(this._backgroundEl)},renderInner:function(t,e,n,i){var r=this.getContentGroup(),o=R(),a=e.get("selectedMode");rb(e.getData(),function(s,l){var h=s.get("name");if(this.newlineDisabled||""!==h&&"\n"!==h){var u=n.getSeriesByName(h)[0];if(!o.get(h))if(u){var c=u.getData(),d=c.getVisual("color");"function"==typeof d&&(d=d(u.getDataParams(0)));var f=c.getVisual("legendSymbol")||"roundRect",p=c.getVisual("symbol");this._createItem(h,l,s,e,f,p,t,d,a).on("click",ib(wu,h,i)).on("mouseover",ib(bu,u,null,i)).on("mouseout",ib(Su,u,null,i)),o.set(h,!0)}else n.eachRawSeries(function(n){if(!o.get(h)&&n.legendDataProvider){var r=n.legendDataProvider(),u=r.indexOfName(h);if(u<0)return;var c=r.getItemVisual(u,"color");this._createItem(h,l,s,e,"roundRect",null,t,c,a).on("click",ib(wu,h,i)).on("mouseover",ib(bu,n,h,i)).on("mouseout",ib(Su,n,h,i)),o.set(h,!0)}},this)}else r.add(new ob({newline:!0}))},this)},_createItem:function(t,e,n,i,r,a,s,l,h){var u=i.get("itemWidth"),c=i.get("itemHeight"),d=i.get("inactiveColor"),f=i.isSelected(t),p=new ob,g=n.getModel("textStyle"),m=n.get("icon"),v=n.getModel("tooltip"),y=v.parentModel;if(r=m||r,p.add(Ks(r,0,0,u,c,f?l:d,!0)),!m&&a&&(a!==r||"none"==a)){var x=.8*c;"none"===a&&(a="circle"),p.add(Ks(a,(u-x)/2,(c-x)/2,x,x,f?l:d))}var _="left"===s?u+5:-5,w=s,b=i.get("formatter"),S=t;"string"==typeof b&&b?S=b.replace("{name}",null!=t?t:""):"function"==typeof b&&(S=b(t)),p.add(new Qm({style:$i({},g,{text:S,x:_,y:c/2,textFill:f?g.getTextColor():d,textAlign:w,textVerticalAlign:"middle"})}));var M=new lv({shape:p.getBoundingRect(),invisible:!0,tooltip:v.get("show")?o({content:t,formatter:y.get("formatter",!0)||function(){return t},formatterParams:{componentType:"legend",legendIndex:i.componentIndex,name:t,$vars:["name"]}},v.option):null});return p.add(M),p.eachChild(function(t){t.silent=!0}),M.silent=!h,this.getContentGroup().add(p),Yi(p),p.__legendDataIndex=e,p},layoutInner:function(t,e,n){var i=this.getContentGroup();Wv(t.get("orient"),i,t.get("itemGap"),n.width,n.height);var r=i.getBoundingRect();return i.attr("position",[-r.x,-r.y]),this.group.getBoundingRect()}});Ka(function(t){var e=t.findComponents({mainType:"legend"});e&&e.length&&t.filterSeries(function(t){for(var n=0;nn[s],f=[-u.x,-u.y];f[a]=i.position[a];var p=[0,0],g=[-c.x,-c.y],m=C(t.get("pageButtonGap",!0),t.get("itemGap",!0));d&&("end"===t.get("pageButtonPosition",!0)?g[a]+=n[s]-c[s]:p[a]+=c[s]+m),g[1-a]+=u[l]/2-c[l]/2,i.attr("position",f),r.attr("position",p),o.attr("position",g);var v=this.group.getBoundingRect();if((v={x:0,y:0})[s]=d?n[s]:u[s],v[l]=Math.max(u[l],c[l]),v[h]=Math.min(0,c[h]+g[1-a]),r.__rectSize=n[s],d){var y={x:0,y:0};y[s]=Math.max(n[s]-c[s]-m,0),y[l]=v[l],r.setClipPath(new lv({shape:y})),r.__rectSize=y[s]}else o.eachChild(function(t){t.attr({invisible:!0,silent:!0})});var x=this._getPageInfo(t);return null!=x.pageIndex&&or(i,{position:x.contentPosition},!!d&&t),this._updatePageInfoView(t,x),v},_pageGo:function(t,e,n){var i=this._getPageInfo(e)[t];null!=i&&n.dispatchAction({type:"legendScroll",scrollDataIndex:i,legendId:e.id})},_updatePageInfoView:function(t,e){var n=this._controllerGroup;d(["pagePrev","pageNext"],function(i){var r=null!=e[i+"DataIndex"],o=n.childOfName(i);o&&(o.setStyle("fill",r?t.get("pageIconColor",!0):t.get("pageIconInactiveColor",!0)),o.cursor=r?"pointer":"default")});var i=n.childOfName("pageText"),r=t.get("pageFormatter"),o=e.pageIndex,a=null!=o?o+1:0,s=e.pageCount;i&&r&&i.setStyle("text",_(r)?r.replace("{current}",a).replace("{total}",s):r({current:a,total:s}))},_getPageInfo:function(t){function e(t){var e=t.getBoundingRect().clone();return e[f]+=t.position[u],e}var n,i,r,o,a=t.get("scrollDataIndex",!0),s=this.getContentGroup(),l=s.getBoundingRect(),h=this._containerGroup.__rectSize,u=t.getOrient().index,c=hb[u],d=hb[1-u],f=ub[u],p=s.position.slice();this._showController?s.eachChild(function(t){t.__legendDataIndex===a&&(o=t)}):o=s.childAt(0);var g=h?Math.ceil(l[c]/h):0;if(o){var m=o.getBoundingRect(),v=o.position[u]+m[f];p[u]=-v-l[f],n=Math.floor(g*(v+m[f]+h/2)/l[c]),n=l[c]&&g?Math.max(0,Math.min(g-1,n)):-1;var y={x:0,y:0};y[c]=h,y[d]=l[d],y[f]=-p[u]-l[f];var x,_=s.children();if(s.eachChild(function(t,n){var i=e(t);i.intersect(y)&&(null==x&&(x=n),r=t.__legendDataIndex),n===_.length-1&&i[f]+i[c]<=y[f]+y[c]&&(r=null)}),null!=x){var w=e(_[x]);if(y[f]=w[f]+w[c]-y[c],x<=0&&w[f]>=y[f])i=null;else{for(;x>0&&e(_[x-1]).intersect(y);)x--;i=_[x].__legendDataIndex}}}return{contentPosition:p,pageIndex:n,pageCount:g,pagePrevDataIndex:i,pageNextDataIndex:r}}});Qa("legendScroll","legendscroll",function(t,e){var n=t.scrollDataIndex;null!=n&&e.eachComponent({mainType:"legend",subType:"scroll",query:t},function(t){t.setScrollDataIndex(n)})}),is({type:"title",layoutMode:{type:"box",ignoreSize:!0},defaultOption:{zlevel:0,z:6,show:!0,text:"",target:"blank",subtext:"",subtarget:"blank",left:0,top:0,backgroundColor:"rgba(0,0,0,0)",borderColor:"#ccc",borderWidth:0,padding:5,itemGap:10,textStyle:{fontSize:18,fontWeight:"bolder",color:"#333"},subtextStyle:{color:"#aaa"}}}),rs({type:"title",render:function(t,e,n){if(this.group.removeAll(),t.get("show")){var i=this.group,r=t.getModel("textStyle"),o=t.getModel("subtextStyle"),a=t.get("textAlign"),s=t.get("textBaseline"),l=new Qm({style:$i({},r,{text:t.get("text"),textFill:r.getTextColor()},{disableBox:!0}),z2:10}),h=l.getBoundingRect(),u=t.get("subtext"),c=new Qm({style:$i({},o,{text:u,textFill:o.getTextColor(),y:h.height+t.get("itemGap"),textVerticalAlign:"top"},{disableBox:!0}),z2:10}),d=t.get("link"),f=t.get("sublink");l.silent=!d,c.silent=!f,d&&l.on("click",function(){window.open(d,"_"+t.get("target"))}),f&&c.on("click",function(){window.open(f,"_"+t.get("subtarget"))}),i.add(l),u&&i.add(c);var p=i.getBoundingRect(),g=t.getBoxLayoutParams();g.width=p.width,g.height=p.height;var m=Fr(g,{width:n.getWidth(),height:n.getHeight()},t.get("padding"));a||("middle"===(a=t.get("left")||t.get("right"))&&(a="center"),"right"===a?m.x+=m.width:"center"===a&&(m.x+=m.width/2)),s||("center"===(s=t.get("top")||t.get("bottom"))&&(s="middle"),"bottom"===s?m.y+=m.height:"middle"===s&&(m.y+=m.height/2),s=s||"top"),i.attr("position",[m.x,m.y]);var v={textAlign:a,textVerticalAlign:s};l.setStyle(v),c.setStyle(v),p=i.getBoundingRect();var y=m.margin,x=t.getItemStyle(["color","opacity"]);x.fill=t.get("backgroundColor");var _=new lv({shape:{x:p.x-y[3],y:p.y-y[0],width:p.width+y[1]+y[3],height:p.height+y[0]+y[2],r:t.get("borderRadius")},style:x,silent:!0});zi(_),i.add(_)}}});var db=Lr,fb=zr,pb=is({type:"marker",dependencies:["series","grid","polar","geo"],init:function(t,e,n,i){this.mergeDefaultAndTheme(t,n),this.mergeOption(t,n,i.createdBySelf,!0)},isAnimationEnabled:function(){if(Zf.node)return!1;var t=this.__hostSeries;return this.getShallow("animation")&&t&&t.isAnimationEnabled()},mergeOption:function(t,e,n,i){var r=this.constructor,a=this.mainType+"Model";n||e.eachSeries(function(t){var n=t.get(this.mainType),s=t[a];n&&n.data?(s?s.mergeOption(n,e,!0):(i&&Iu(n),d(n.data,function(t){t instanceof Array?(Iu(t[0]),Iu(t[1])):Iu(t)}),o(s=new r(n,this,e),{mainType:this.mainType,seriesIndex:t.seriesIndex,name:t.name,createdBySelf:!0}),s.__hostSeries=t),t[a]=s):t[a]=null},this)},formatTooltip:function(t){var e=this.getData(),n=this.getRawValue(t),i=y(n)?f(n,db).join(", "):db(n),r=e.getName(t),o=fb(this.name);return(null!=n||r)&&(o+="
                    "),r&&(o+=fb(r),null!=n&&(o+=" : ")),null!=n&&(o+=fb(i)),o},getData:function(){return this._data},setData:function(t){this._data=t}});u(pb,Ay),pb.extend({type:"markPoint",defaultOption:{zlevel:0,z:5,symbol:"pin",symbolSize:50,tooltip:{trigger:"item"},label:{show:!0,position:"inside"},itemStyle:{borderWidth:2},emphasis:{label:{show:!0}}}});var gb=l,mb=v,vb={min:mb(Du,"min"),max:mb(Du,"max"),average:mb(Du,"average")},yb=rs({type:"marker",init:function(){this.markerGroupMap=R()},render:function(t,e,n){var i=this.markerGroupMap;i.each(function(t){t.__keep=!1});var r=this.type+"Model";e.eachSeries(function(t){var i=t[r];i&&this.renderSeries(t,i,e,n)},this),i.each(function(t){!t.__keep&&this.group.remove(t.group)},this)},renderSeries:function(){}});yb.extend({type:"markPoint",updateTransform:function(t,e,n){e.eachSeries(function(t){var e=t.markPointModel;e&&(Ru(e.getData(),t,n),this.markerGroupMap.get(t.id).updateLayout(e))},this)},renderSeries:function(t,e,n,i){var r=t.coordinateSystem,o=t.id,a=t.getData(),s=this.markerGroupMap,l=s.get(o)||s.set(o,new hl),h=Nu(r,t,e);e.setData(h),Ru(e.getData(),t,i),h.each(function(t){var n=h.getItemModel(t),i=n.getShallow("symbolSize");"function"==typeof i&&(i=i(e.getRawValue(t),e.getDataParams(t))),h.setItemVisual(t,{symbolSize:i,color:n.get("itemStyle.color")||a.getVisual("color"),symbol:n.getShallow("symbol")})}),l.updateData(h),this.group.add(l.group),h.eachItemGraphicEl(function(t){t.traverse(function(t){t.dataModel=e})}),l.__keep=!0,l.group.silent=e.get("silent")||t.get("silent")}}),$a(function(t){t.markPoint=t.markPoint||{}}),pb.extend({type:"markLine",defaultOption:{zlevel:0,z:5,symbol:["circle","arrow"],symbolSize:[8,16],precision:2,tooltip:{trigger:"item"},label:{show:!0,position:"end"},lineStyle:{type:"dashed"},emphasis:{label:{show:!0},lineStyle:{width:3}},animationEasing:"linear"}});var xb=hv.prototype,_b=cv.prototype,wb=Ai({type:"ec-line",style:{stroke:"#000",fill:null},shape:{x1:0,y1:0,x2:0,y2:0,percent:1,cpx1:null,cpy1:null},buildPath:function(t,e){(Bu(e)?xb:_b).buildPath(t,e)},pointAt:function(t){return Bu(this.shape)?xb.pointAt.call(this,t):_b.pointAt.call(this,t)},tangentAt:function(t){var e=this.shape,n=Bu(e)?[e.x2-e.x1,e.y2-e.y1]:_b.tangentAt.call(this,t);return j(n,n)}}),bb=["fromSymbol","toSymbol"],Sb=Wu.prototype;Sb.beforeUpdate=function(){var t=this,e=t.childOfName("fromSymbol"),n=t.childOfName("toSymbol"),i=t.childOfName("label");if(e||n||!i.ignore){for(var r=1,o=this.parent;o;)o.scale&&(r/=o.scale[0]),o=o.parent;var a=t.childOfName("line");if(this.__dirty||a.__dirty){var s=a.shape.percent,l=a.pointAt(0),h=a.pointAt(s),u=W([],h,l);if(j(u,u),e&&(e.attr("position",l),c=a.tangentAt(0),e.attr("rotation",Math.PI/2-Math.atan2(c[1],c[0])),e.attr("scale",[r*s,r*s])),n){n.attr("position",h);var c=a.tangentAt(1);n.attr("rotation",-Math.PI/2-Math.atan2(c[1],c[0])),n.attr("scale",[r*s,r*s])}if(!i.ignore){i.attr("position",h);var d,f,p,g=5*r;if("end"===i.__position)d=[u[0]*g+h[0],u[1]*g+h[1]],f=u[0]>.8?"left":u[0]<-.8?"right":"center",p=u[1]>.8?"top":u[1]<-.8?"bottom":"middle";else if("middle"===i.__position){var m=s/2,v=[(c=a.tangentAt(m))[1],-c[0]],y=a.pointAt(m);v[1]>0&&(v[0]=-v[0],v[1]=-v[1]),d=[y[0]+v[0]*g,y[1]+v[1]*g],f="center",p="bottom";var x=-Math.atan2(c[1],c[0]);h[0].8?"right":u[0]<-.8?"left":"center",p=u[1]>.8?"bottom":u[1]<-.8?"top":"middle";i.attr({style:{textVerticalAlign:i.__verticalAlign||p,textAlign:i.__textAlign||f},position:d,scale:[r,r]})}}}},Sb._createLine=function(t,e,n){var i=t.hostModel,r=Gu(t.getItemLayout(e));r.shape.percent=0,ar(r,{shape:{percent:1}},i,e),this.add(r);var o=new Qm({name:"label"});this.add(o),d(bb,function(n){var i=Fu(n,t,e);this.add(i),this[Vu(n)]=t.getItemVisual(e,n)},this),this._updateCommonStl(t,e,n)},Sb.updateData=function(t,e,n){var i=t.hostModel,r=this.childOfName("line"),o=t.getItemLayout(e),a={shape:{}};Hu(a.shape,o),or(r,a,i,e),d(bb,function(n){var i=t.getItemVisual(e,n),r=Vu(n);if(this[r]!==i){this.remove(this.childOfName(n));var o=Fu(n,t,e);this.add(o)}this[r]=i},this),this._updateCommonStl(t,e,n)},Sb._updateCommonStl=function(t,e,n){var i=t.hostModel,r=this.childOfName("line"),o=n&&n.lineStyle,s=n&&n.hoverLineStyle,l=n&&n.labelModel,h=n&&n.hoverLabelModel;if(!n||t.hasItemOption){var u=t.getItemModel(e);o=u.getModel("lineStyle").getLineStyle(),s=u.getModel("emphasis.lineStyle").getLineStyle(),l=u.getModel("label"),h=u.getModel("emphasis.label")}var c=t.getItemVisual(e,"color"),f=A(t.getItemVisual(e,"opacity"),o.opacity,1);r.useStyle(a({strokeNoScale:!0,fill:"none",stroke:c,opacity:f},o)),r.hoverStyle=s,d(bb,function(t){var e=this.childOfName(t);e&&(e.setColor(c),e.setStyle({opacity:f}))},this);var p,g,m,v=l.getShallow("show"),y=h.getShallow("show"),x=this.childOfName("label");if(v||y){if(p=c||"#000",null==(g=i.getFormattedLabel(e,"normal",t.dataType))){var _=i.getRawValue(e);g=null==_?t.getName(e):isFinite(_)?_r(_):_}m=C(i.getFormattedLabel(e,"emphasis",t.dataType),g)}if(v){var w=$i(x.style,l,{text:g},{autoColor:p});x.__textAlign=w.textAlign,x.__verticalAlign=w.textVerticalAlign,x.__position=l.get("position")||"middle"}else x.setStyle("text",null);x.hoverStyle=y?{text:m,textFill:h.getTextColor(!0),fontStyle:h.getShallow("fontStyle"),fontWeight:h.getShallow("fontWeight"),fontSize:h.getShallow("fontSize"),fontFamily:h.getShallow("fontFamily")}:{text:null},x.ignore=!v&&!y,Yi(this)},Sb.highlight=function(){this.trigger("emphasis")},Sb.downplay=function(){this.trigger("normal")},Sb.updateLayout=function(t,e){this.setLinePoints(t.getItemLayout(e))},Sb.setLinePoints=function(t){var e=this.childOfName("line");Hu(e.shape,t),e.dirty()},h(Wu,Xp);var Mb=Zu.prototype;Mb.isPersistent=function(){return!0},Mb.updateData=function(t){var e=this,n=e.group,i=e._lineData;e._lineData=t,i||n.removeAll();var r=ju(t);t.diff(i).add(function(n){Uu(e,t,n,r)}).update(function(n,o){Xu(e,i,t,o,n,r)}).remove(function(t){n.remove(i.getItemGraphicEl(t))}).execute()},Mb.updateLayout=function(){var t=this._lineData;t.eachItemGraphicEl(function(e,n){e.updateLayout(t,n)},this)},Mb.incrementalPrepareUpdate=function(t){this._seriesScope=ju(t),this._lineData=null,this.group.removeAll()},Mb.incrementalUpdate=function(t,e){for(var n=t.start;n=0&&"number"==typeof u&&(u=+u.toFixed(Math.min(m,20))),p.coord[d]=g.coord[d]=u,a=[p,g,{type:l,valueIndex:a.valueIndex,value:u}]}return a=[ku(t,a[0]),ku(t,a[1]),o({},a[2])],a[2].type=a[2].type||"",i(a[2],a[0]),i(a[2],a[1]),a};yb.extend({type:"markLine",updateTransform:function(t,e,n){e.eachSeries(function(t){var e=t.markLineModel;if(e){var i=e.getData(),r=e.__from,o=e.__to;r.each(function(e){Ju(r,e,!0,t,n),Ju(o,e,!1,t,n)}),i.each(function(t){i.setItemLayout(t,[r.getItemLayout(t),o.getItemLayout(t)])}),this.markerGroupMap.get(t.id).updateLayout()}},this)},renderSeries:function(t,e,n,i){function r(e,n,r){var o=e.getItemModel(n);Ju(e,n,r,t,i),e.setItemVisual(n,{symbolSize:o.get("symbolSize")||g[r?0:1],symbol:o.get("symbol",!0)||p[r?0:1],color:o.get("itemStyle.color")||s.getVisual("color")})}var o=t.coordinateSystem,a=t.id,s=t.getData(),l=this.markerGroupMap,h=l.get(a)||l.set(a,new Zu);this.group.add(h.group);var u=tc(o,t,e),c=u.from,d=u.to,f=u.line;e.__from=c,e.__to=d,e.setData(f);var p=e.get("symbol"),g=e.get("symbolSize");y(p)||(p=[p,p]),"number"==typeof g&&(g=[g,g]),u.from.each(function(t){r(c,t,!0),r(d,t,!1)}),f.each(function(t){var e=f.getItemModel(t).get("lineStyle.color");f.setItemVisual(t,{color:e||c.getItemVisual(t,"color")}),f.setItemLayout(t,[c.getItemLayout(t),d.getItemLayout(t)]),f.setItemVisual(t,{fromSymbolSize:c.getItemVisual(t,"symbolSize"),fromSymbol:c.getItemVisual(t,"symbol"),toSymbolSize:d.getItemVisual(t,"symbolSize"),toSymbol:d.getItemVisual(t,"symbol")})}),h.updateData(f),u.line.eachItemGraphicEl(function(t,n){t.traverse(function(t){t.dataModel=e})}),h.__keep=!0,h.group.silent=e.get("silent")||t.get("silent")}}),$a(function(t){t.markLine=t.markLine||{}}),pb.extend({type:"markArea",defaultOption:{zlevel:0,z:1,tooltip:{trigger:"item"},animation:!1,label:{show:!0,position:"top"},itemStyle:{borderWidth:0},emphasis:{label:{show:!0,position:"top"}}}});var Tb=function(t,e,n,i){var o=ku(t,i[0]),a=ku(t,i[1]),s=T,l=o.coord,h=a.coord;l[0]=s(l[0],-1/0),l[1]=s(l[1],-1/0),h[0]=s(h[0],1/0),h[1]=s(h[1],1/0);var u=r([{},o,a]);return u.coord=[o.coord,a.coord],u.x0=o.x,u.y0=o.y,u.x1=a.x,u.y1=a.y,u},Cb=[["x0","y0"],["x1","y0"],["x1","y1"],["x0","y1"]];yb.extend({type:"markArea",updateTransform:function(t,e,n){e.eachSeries(function(t){var e=t.markAreaModel;if(e){var i=e.getData();i.each(function(e){var r=f(Cb,function(r){return rc(i,e,r,t,n)});i.setItemLayout(e,r),i.getItemGraphicEl(e).setShape("points",r)})}},this)},renderSeries:function(t,e,n,i){var r=t.coordinateSystem,o=t.name,s=t.getData(),l=this.markerGroupMap,h=l.get(o)||l.set(o,{group:new Xp});this.group.add(h.group),h.__keep=!0;var u=oc(r,t,e);e.setData(u),u.each(function(e){u.setItemLayout(e,f(Cb,function(n){return rc(u,e,n,t,i)})),u.setItemVisual(e,{color:s.getVisual("color")})}),u.diff(h.__data).add(function(t){var e=new av({shape:{points:u.getItemLayout(t)}});u.setItemGraphicEl(t,e),h.group.add(e)}).update(function(t,n){var i=h.__data.getItemGraphicEl(n);or(i,{shape:{points:u.getItemLayout(t)}},e,t),h.group.add(i),u.setItemGraphicEl(t,i)}).remove(function(t){var e=h.__data.getItemGraphicEl(t);h.group.remove(e)}).execute(),u.eachItemGraphicEl(function(t,n){var i=u.getItemModel(n),r=i.getModel("label"),o=i.getModel("emphasis.label"),s=u.getItemVisual(n,"color");t.useStyle(a(i.getModel("itemStyle").getItemStyle(),{fill:Pt(s,.4),stroke:s})),t.hoverStyle=i.getModel("emphasis.itemStyle").getItemStyle(),qi(t.style,t.hoverStyle,r,o,{labelFetcher:e,labelDataIndex:n,defaultText:u.getName(n)||"",isRectText:!0,autoColor:s}),Yi(t,{}),t.dataModel=e}),h.__data=u,h.group.silent=e.get("silent")||t.get("silent")}}),$a(function(t){t.markArea=t.markArea||{}}),Xv.registerSubTypeDefaulter("dataZoom",function(){return"slider"});var Ab=["cartesian2d","polar","singleAxis"],Db=function(t,e){var n=f(t=t.slice(),Br),i=f(e=(e||[]).slice(),Br);return function(r,o){d(t,function(t,a){for(var s={name:t,capital:n[a]},l=0;l=a[0]&&t<=a[1]}if(t===this._dataZoomModel){var i=this._dimName,r=this.getTargetSeriesModels(),o=t.get("filterMode"),a=this._valueWindow;if("none"!==o){var s=this.getOtherAxisModel();t.get("$fromToolbox")&&s&&s.hasSeriesStacked&&(o="empty"),kb(r,function(t){var e=t.getData(),r=e.mapDimension(i,!0);"weakFilter"===o?e.filterSelf(function(t){for(var n,i,o,s=0;sa[1];if(h&&!u&&!c)return!0;h&&(o=!0),u&&(n=!0),c&&(i=!0)}return o&&n&&i}):kb(r,function(i){if("empty"===o)t.setData(e.map(i,function(t){return n(t)?t:NaN}));else{var r={};r[i]=a,e.selectRange(r)}}),kb(r,function(t){e.setApproximateExtent(a,t)})})}}}};var Ob=d,zb=Db,Eb=is({type:"dataZoom",dependencies:["xAxis","yAxis","zAxis","radiusAxis","angleAxis","singleAxis","series"],defaultOption:{zlevel:0,z:4,orient:null,xAxisIndex:null,yAxisIndex:null,filterMode:"filter",throttle:null,start:0,end:100,startValue:null,endValue:null,minSpan:null,maxSpan:null,minValueSpan:null,maxValueSpan:null,rangeMode:null},init:function(t,e,n){this._dataIntervalByAxis={},this._dataInfo={},this._axisProxies={},this.textStyleModel,this._autoThrottle=!0,this._rangePropMode=["percent","percent"];var i=dc(t);this.mergeDefaultAndTheme(t,n),this.doInit(i)},mergeOption:function(t){var e=dc(t);i(this.option,t,!0),this.doInit(e)},doInit:function(t){var e=this.option;Zf.canvasSupported||(e.realtime=!1),this._setDefaultThrottle(t),fc(this,t),Ob([["start","startValue"],["end","endValue"]],function(t,n){"value"===this._rangePropMode[n]&&(e[t[0]]=null)},this),this.textStyleModel=this.getModel("textStyle"),this._resetTarget(),this._giveAxisProxies()},_giveAxisProxies:function(){var t=this._axisProxies;this.eachTargetAxis(function(e,n,i,r){var o=this.dependentModels[e.axis][n],a=o.__dzAxisProxy||(o.__dzAxisProxy=new Lb(e.name,n,this,r));t[e.name+"_"+n]=a},this)},_resetTarget:function(){var t=this.option,e=this._judgeAutoMode();zb(function(e){var n=e.axisIndex;t[n]=xn(t[n])},this),"axisIndex"===e?this._autoSetAxisIndex():"orient"===e&&this._autoSetOrient()},_judgeAutoMode:function(){var t=this.option,e=!1;zb(function(n){null!=t[n.axisIndex]&&(e=!0)},this);var n=t.orient;return null==n&&e?"orient":e?void 0:(null==n&&(t.orient="horizontal"),"axisIndex")},_autoSetAxisIndex:function(){var t=!0,e=this.get("orient",!0),n=this.option,i=this.dependentModels;if(t){var r="vertical"===e?"y":"x";i[r+"Axis"].length?(n[r+"AxisIndex"]=[0],t=!1):Ob(i.singleAxis,function(i){t&&i.get("orient",!0)===e&&(n.singleAxisIndex=[i.componentIndex],t=!1)})}t&&zb(function(e){if(t){var i=[],r=this.dependentModels[e.axis];if(r.length&&!i.length)for(var o=0,a=r.length;o0?100:20}},getFirstTargetAxisModel:function(){var t;return zb(function(e){if(null==t){var n=this.get(e.axisIndex);n.length&&(t=this.dependentModels[e.axis][n[0]])}},this),t},eachTargetAxis:function(t,e){var n=this.ecModel;zb(function(i){Ob(this.get(i.axisIndex),function(r){t.call(e,i,r,this,n)},this)},this)},getAxisProxy:function(t,e){return this._axisProxies[t+"_"+e]},getAxisModel:function(t,e){var n=this.getAxisProxy(t,e);return n&&n.getAxisModel()},setRawRange:function(t,e){var n=this.option;Ob([["start","startValue"],["end","endValue"]],function(e){null==t[e[0]]&&null==t[e[1]]||(n[e[0]]=t[e[0]],n[e[1]]=t[e[1]])},this),!e&&fc(this,t)},getPercentRange:function(){var t=this.findRepresentativeAxisProxy();if(t)return t.getDataPercentWindow()},getValueRange:function(t,e){if(null!=t||null!=e)return this.getAxisProxy(t,e).getDataValueWindow();var n=this.findRepresentativeAxisProxy();return n?n.getDataValueWindow():void 0},findRepresentativeAxisProxy:function(t){if(t)return t.__dzAxisProxy;var e=this._axisProxies;for(var n in e)if(e.hasOwnProperty(n)&&e[n].hostedBy(this))return e[n];for(var n in e)if(e.hasOwnProperty(n)&&!e[n].hostedBy(this))return e[n]},getRangePropMode:function(){return this._rangePropMode.slice()}}),Rb=Ly.extend({type:"dataZoom",render:function(t,e,n,i){this.dataZoomModel=t,this.ecModel=e,this.api=n},getTargetCoordInfo:function(){function t(t,e,n,i){for(var r,o=0;oo&&(e[1-i]=e[i]+u.sign*o),e}),Bb=lv,Vb=yr,Fb=wr,Gb=m,Hb=d,Wb="horizontal",Zb=5,Ub=["line","bar","candlestick","scatter"],Xb=Rb.extend({type:"dataZoom.slider",init:function(t,e){this._displayables={},this._orient,this._range,this._handleEnds,this._size,this._handleWidth,this._handleHeight,this._location,this._dragging,this._dataShadowInfo,this.api=e},render:function(t,e,n,i){Xb.superApply(this,"render",arguments),sa(this,"_dispatchZoomAction",this.dataZoomModel.get("throttle"),"fixRate"),this._orient=t.get("orient"),!1!==this.dataZoomModel.get("show")?(i&&"dataZoom"===i.type&&i.from===this.uid||this._buildView(),this._updateView()):this.group.removeAll()},remove:function(){Xb.superApply(this,"remove",arguments),la(this,"_dispatchZoomAction")},dispose:function(){Xb.superApply(this,"dispose",arguments),la(this,"_dispatchZoomAction")},_buildView:function(){var t=this.group;t.removeAll(),this._resetLocation(),this._resetInterval();var e=this._displayables.barGroup=new Xp;this._renderBackground(),this._renderHandle(),this._renderDataShadow(),t.add(e),this._positionGroup()},_resetLocation:function(){var t=this.dataZoomModel,e=this.api,n=this._findCoordRect(),i={width:e.getWidth(),height:e.getHeight()},r=this._orient===Wb?{right:i.width-n.x-n.width,top:i.height-30-7,width:n.width,height:30}:{right:7,top:n.y,width:30,height:n.height},o=Wr(t.option);d(["right","top","width","height"],function(t){"ph"===o[t]&&(o[t]=r[t])});var a=Fr(o,i,t.padding);this._location={x:a.x,y:a.y},this._size=[a.width,a.height],"vertical"===this._orient&&this._size.reverse()},_positionGroup:function(){var t=this.group,e=this._location,n=this._orient,i=this.dataZoomModel.getFirstTargetAxisModel(),r=i&&i.get("inverse"),o=this._displayables.barGroup,a=(this._dataShadowInfo||{}).otherAxisInverse;o.attr(n!==Wb||r?n===Wb&&r?{scale:a?[-1,1]:[-1,-1]}:"vertical"!==n||r?{scale:a?[-1,-1]:[-1,1],rotation:Math.PI/2}:{scale:a?[1,-1]:[1,1],rotation:Math.PI/2}:{scale:a?[1,1]:[1,-1]});var s=t.getBoundingRect([o]);t.attr("position",[e.x-s.x,e.y-s.y])},_getViewExtent:function(){return[0,this._size[0]]},_renderBackground:function(){var t=this.dataZoomModel,e=this._size,n=this._displayables.barGroup;n.add(new Bb({silent:!0,shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:t.get("backgroundColor")},z2:-40})),n.add(new Bb({shape:{x:0,y:0,width:e[0],height:e[1]},style:{fill:"transparent"},z2:0,onclick:m(this._onClickPanelClick,this)}))},_renderDataShadow:function(){var t=this._dataShadowInfo=this._prepareDataShadowInfo();if(t){var e=this._size,n=t.series,i=n.getRawData(),r=n.getShadowDim?n.getShadowDim():t.otherDim;if(null!=r){var o=i.getDataExtent(r),s=.3*(o[1]-o[0]);o=[o[0]-s,o[1]+s];var l,h=[0,e[1]],u=[0,e[0]],c=[[e[0],0],[0,0]],d=[],f=u[1]/(i.count()-1),p=0,g=Math.round(i.count()/e[0]);i.each([r],function(t,e){if(g>0&&e%g)p+=f;else{var n=null==t||isNaN(t)||""===t,i=n?0:Vb(t,o,h,!0);n&&!l&&e?(c.push([c[c.length-1][0],0]),d.push([d[d.length-1][0],0])):!n&&l&&(c.push([p,0]),d.push([p,0])),c.push([p,i]),d.push([p,i]),p+=f,l=n}});var m=this.dataZoomModel;this._displayables.barGroup.add(new av({shape:{points:c},style:a({fill:m.get("dataBackgroundColor")},m.getModel("dataBackground.areaStyle").getAreaStyle()),silent:!0,z2:-20})),this._displayables.barGroup.add(new sv({shape:{points:d},style:m.getModel("dataBackground.lineStyle").getLineStyle(),silent:!0,z2:-19}))}}},_prepareDataShadowInfo:function(){var t=this.dataZoomModel,e=t.get("showDataShadow");if(!1!==e){var n,i=this.ecModel;return t.eachTargetAxis(function(r,o){d(t.getAxisProxy(r.name,o).getTargetSeriesModels(),function(t){if(!(n||!0!==e&&l(Ub,t.get("type"))<0)){var a,s=i.getComponent(r.axis,o).axis,h=mc(r.name),u=t.coordinateSystem;null!=h&&u.getOtherAxis&&(a=u.getOtherAxis(s).inverse),h=t.getData().mapDimension(h),n={thisAxis:s,series:t,thisDim:r.name,otherDim:h,otherAxisInverse:a}}},this)},this),n}},_renderHandle:function(){var t=this._displayables,e=t.handles=[],n=t.handleLabels=[],i=this._displayables.barGroup,r=this._size,o=this.dataZoomModel;i.add(t.filler=new Bb({draggable:!0,cursor:vc(this._orient),drift:Gb(this._onDragMove,this,"all"),onmousemove:function(t){bg(t.event)},ondragstart:Gb(this._showDataInfo,this,!0),ondragend:Gb(this._onDragEnd,this),onmouseover:Gb(this._showDataInfo,this,!0),onmouseout:Gb(this._showDataInfo,this,!1),style:{fill:o.get("fillerColor"),textPosition:"inside"}})),i.add(new Bb(zi({silent:!0,shape:{x:0,y:0,width:r[0],height:r[1]},style:{stroke:o.get("dataBackgroundColor")||o.get("borderColor"),lineWidth:1,fill:"rgba(0,0,0,0)"}}))),Hb([0,1],function(t){var r=dr(o.get("handleIcon"),{cursor:vc(this._orient),draggable:!0,drift:Gb(this._onDragMove,this,t),onmousemove:function(t){bg(t.event)},ondragend:Gb(this._onDragEnd,this),onmouseover:Gb(this._showDataInfo,this,!0),onmouseout:Gb(this._showDataInfo,this,!1)},{x:-1,y:0,width:2,height:2}),a=r.getBoundingRect();this._handleHeight=xr(o.get("handleSize"),this._size[1]),this._handleWidth=a.width/a.height*this._handleHeight,r.setStyle(o.getModel("handleStyle").getItemStyle());var s=o.get("handleColor");null!=s&&(r.style.fill=s),i.add(e[t]=r);var l=o.textStyleModel;this.group.add(n[t]=new Qm({silent:!0,invisible:!0,style:{x:0,y:0,text:"",textVerticalAlign:"middle",textAlign:"center",textFill:l.getTextColor(),textFont:l.getFont()},z2:10}))},this)},_resetInterval:function(){var t=this._range=this.dataZoomModel.getPercentRange(),e=this._getViewExtent();this._handleEnds=[Vb(t[0],[0,100],e,!0),Vb(t[1],[0,100],e,!0)]},_updateInterval:function(t,e){var n=this.dataZoomModel,i=this._handleEnds,r=this._getViewExtent(),o=n.findRepresentativeAxisProxy().getMinMaxSpan(),a=[0,100];Nb(e,i,r,n.get("zoomLock")?"all":t,null!=o.minSpan?Vb(o.minSpan,a,r,!0):null,null!=o.maxSpan?Vb(o.maxSpan,a,r,!0):null),this._range=Fb([Vb(i[0],r,a,!0),Vb(i[1],r,a,!0)])},_updateView:function(t){var e=this._displayables,n=this._handleEnds,i=Fb(n.slice()),r=this._size;Hb([0,1],function(t){var i=e.handles[t],o=this._handleHeight;i.attr({scale:[o/2,o/2],position:[n[t],r[1]/2-o/2]})},this),e.filler.setShape({x:i[0],y:0,width:i[1]-i[0],height:r[1]}),this._updateDataInfo(t)},_updateDataInfo:function(t){function e(t){var e=sr(i.handles[t].parent,this.group),n=hr(0===t?"right":"left",e),s=this._handleWidth/2+Zb,l=lr([c[t]+(0===t?-s:s),this._size[1]/2],e);r[t].setStyle({x:l[0],y:l[1],textVerticalAlign:o===Wb?"middle":n,textAlign:o===Wb?n:"center",text:a[t]})}var n=this.dataZoomModel,i=this._displayables,r=i.handleLabels,o=this._orient,a=["",""];if(n.get("showDetail")){var s=n.findRepresentativeAxisProxy();if(s){var l=s.getAxisModel().axis,h=this._range,u=t?s.calculateDataWindow({start:h[0],end:h[1]}).valueWindow:s.getDataValueWindow();a=[this._formatLabel(u[0],l),this._formatLabel(u[1],l)]}}var c=Fb(this._handleEnds.slice());e.call(this,0),e.call(this,1)},_formatLabel:function(t,e){var n=this.dataZoomModel,i=n.get("labelFormatter"),r=n.get("labelPrecision");null!=r&&"auto"!==r||(r=e.getPixelPrecision());var o=null==t||isNaN(t)?"":"category"===e.type||"time"===e.type?e.scale.getLabel(Math.round(t)):t.toFixed(Math.min(r,20));return x(i)?i(t,o):_(i)?i.replace("{value}",o):o},_showDataInfo:function(t){t=this._dragging||t;var e=this._displayables.handleLabels;e[0].attr("invisible",!t),e[1].attr("invisible",!t)},_onDragMove:function(t,e,n){this._dragging=!0;var i=lr([e,n],this._displayables.barGroup.getLocalTransform(),!0);this._updateInterval(t,i[0]);var r=this.dataZoomModel.get("realtime");this._updateView(!r),r&&this._dispatchZoomAction()},_onDragEnd:function(){this._dragging=!1,this._showDataInfo(!1),!this.dataZoomModel.get("realtime")&&this._dispatchZoomAction()},_onClickPanelClick:function(t){var e=this._size,n=this._displayables.barGroup.transformCoordToLocal(t.offsetX,t.offsetY);if(!(n[0]<0||n[0]>e[0]||n[1]<0||n[1]>e[1])){var i=this._handleEnds,r=(i[0]+i[1])/2;this._updateInterval("all",n[0]-r),this._updateView(),this._dispatchZoomAction()}},_dispatchZoomAction:function(){var t=this._range;this.api.dispatchAction({type:"dataZoom",from:this.uid,dataZoomId:this.dataZoomModel.id,start:t[0],end:t[1]})},_findCoordRect:function(){var t;if(Hb(this.getTargetCoordInfo(),function(e){if(!t&&e.length){var n=e[0].model.coordinateSystem;t=n.getRect&&n.getRect()}}),!t){var e=this.api.getWidth(),n=this.api.getHeight();t={x:.2*e,y:.2*n,width:.6*e,height:.6*n}}return t}});Eb.extend({type:"dataZoom.inside",defaultOption:{disabled:!1,zoomLock:!1,zoomOnMouseWheel:!0,moveOnMouseMove:!0,preventDefaultMouseMove:!0}});var jb="\0_ec_interaction_mutex";Qa({type:"takeGlobalCursor",event:"globalCursorTaken",update:"update"},function(){}),u(bc,dp);var Yb=v,qb="\0_ec_dataZoom_roams",$b=m,Kb=Rb.extend({type:"dataZoom.inside",init:function(t,e){this._range},render:function(t,e,n,i){Kb.superApply(this,"render",arguments),Lc(i,t.id)&&(this._range=t.getPercentRange()),d(this.getTargetCoordInfo(),function(e,i){var r=f(e,function(t){return Oc(t.model)});d(e,function(e){var o=e.model,a=t.option;kc(n,{coordId:Oc(o),allCoordIds:r,containsPoint:function(t,e,n){return o.coordinateSystem.containPoint([e,n])},dataZoomId:t.id,throttleRate:t.get("throttle",!0),panGetRange:$b(this._onPan,this,e,i),zoomGetRange:$b(this._onZoom,this,e,i),zoomLock:a.zoomLock,disabled:a.disabled,roamControllerOpt:{zoomOnMouseWheel:a.zoomOnMouseWheel,moveOnMouseMove:a.moveOnMouseMove,preventDefaultMouseMove:a.preventDefaultMouseMove}})},this)},this)},dispose:function(){Pc(this.api,this.dataZoomModel.id),Kb.superApply(this,"dispose",arguments),this._range=null},_onPan:function(t,e,n,i,r,o,a,s,l){var h=this._range.slice(),u=t.axisModels[0];if(u){var c=Qb[e]([o,a],[s,l],u,n,t),d=c.signal*(h[1]-h[0])*c.pixel/c.pixelLength;return Nb(d,h,[0,100],"all"),this._range=h}},_onZoom:function(t,e,n,i,r,o){var a=this._range.slice(),s=t.axisModels[0];if(s){var l=Qb[e](null,[r,o],s,n,t),h=(l.signal>0?l.pixelStart+l.pixelLength-l.pixel:l.pixel-l.pixelStart)/l.pixelLength*(a[1]-a[0])+a[0];i=Math.max(1/i,0),a[0]=(a[0]-h)*i+h,a[1]=(a[1]-h)*i+h;var u=this.dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan();return Nb(0,a,[0,100],0,u.minSpan,u.maxSpan),this._range=a}}}),Qb={grid:function(t,e,n,i,r){var o=n.axis,a={},s=r.model.coordinateSystem.getRect();return t=t||[0,0],"x"===o.dim?(a.pixel=e[0]-t[0],a.pixelLength=s.width,a.pixelStart=s.x,a.signal=o.inverse?1:-1):(a.pixel=e[1]-t[1],a.pixelLength=s.height,a.pixelStart=s.y,a.signal=o.inverse?-1:1),a},polar:function(t,e,n,i,r){var o=n.axis,a={},s=r.model.coordinateSystem,l=s.getRadiusAxis().getExtent(),h=s.getAngleAxis().getExtent();return t=t?s.pointToCoord(t):[0,0],e=s.pointToCoord(e),"radiusAxis"===n.mainType?(a.pixel=e[0]-t[0],a.pixelLength=l[1]-l[0],a.pixelStart=l[0],a.signal=o.inverse?1:-1):(a.pixel=e[1]-t[1],a.pixelLength=h[1]-h[0],a.pixelStart=h[0],a.signal=o.inverse?-1:1),a},singleAxis:function(t,e,n,i,r){var o=n.axis,a=r.model.coordinateSystem.getRect(),s={};return t=t||[0,0],"horizontal"===o.orient?(s.pixel=e[0]-t[0],s.pixelLength=a.width,s.pixelStart=a.x,s.signal=o.inverse?1:-1):(s.pixel=e[1]-t[1],s.pixelLength=a.height,s.pixelStart=a.y,s.signal=o.inverse?-1:1),s}};Ka({getTargetSeries:function(t){var e=R();return t.eachComponent("dataZoom",function(t){t.eachTargetAxis(function(t,n,i){d(i.getAxisProxy(t.name,n).getTargetSeriesModels(),function(t){e.set(t.uid,t)})})}),e},isOverallFilter:!0,overallReset:function(t,e){t.eachComponent("dataZoom",function(t){t.eachTargetAxis(function(t,n,i){i.getAxisProxy(t.name,n).reset(i,e)}),t.eachTargetAxis(function(t,n,i){i.getAxisProxy(t.name,n).filterData(i,e)})}),t.eachComponent("dataZoom",function(t){var e=t.findRepresentativeAxisProxy(),n=e.getDataPercentWindow(),i=e.getDataValueWindow();t.setRawRange({start:n[0],end:n[1],startValue:i[0],endValue:i[1]},!0)})}}),Qa("dataZoom",function(t,e){var n=sc(m(e.eachComponent,e,"dataZoom"),Db,function(t,e){return t.get(e.axisIndex)}),i=[];e.eachComponent({mainType:"dataZoom",query:t},function(t,e){i.push.apply(i,n(t).nodes)}),d(i,function(e,n){e.setRawRange({start:t.start,end:t.end,startValue:t.startValue,endValue:t.endValue})})});var Jb={},tS=is({type:"toolbox",layoutMode:{type:"box",ignoreSize:!0},mergeDefaultAndTheme:function(t){tS.superApply(this,"mergeDefaultAndTheme",arguments),d(this.option.feature,function(t,e){var n=Wc(e);n&&i(t,n.defaultOption)})},defaultOption:{show:!0,z:6,zlevel:0,orient:"horizontal",left:"right",top:"top",backgroundColor:"transparent",borderColor:"#ccc",borderRadius:0,borderWidth:0,padding:5,itemSize:15,itemGap:8,showTitle:!0,iconStyle:{borderColor:"#666",color:"none"},emphasis:{iconStyle:{borderColor:"#3E98C5"}}}});rs({type:"toolbox",render:function(t,e,n,i){function r(r,a){var s,c=u[r],d=u[a],f=new fr(l[c],t,t.ecModel);if(c&&!d){if(Zc(c))s={model:f,onclick:f.option.onclick,featureName:c};else{var p=Wc(c);if(!p)return;s=new p(f,e,n)}h[c]=s}else{if(!(s=h[d]))return;s.model=f,s.ecModel=e,s.api=n}c||!d?f.get("show")&&!s.unusable?(o(f,s,c),f.setIconStatus=function(t,e){var n=this.option,i=this.iconPaths;n.iconStatus=n.iconStatus||{},n.iconStatus[t]=e,i[t]&&i[t].trigger(e)},s.render&&s.render(f,e,n,i)):s.remove&&s.remove(e,n):s.dispose&&s.dispose(e,n)}function o(i,r,o){var l=i.getModel("iconStyle"),h=i.getModel("emphasis.iconStyle"),u=r.getIcons?r.getIcons():i.get("icon"),c=i.get("title")||{};if("string"==typeof u){var f=u,p=c;c={},(u={})[o]=f,c[o]=p}var g=i.iconPaths={};d(u,function(o,u){var d=dr(o,{},{x:-s/2,y:-s/2,width:s,height:s});d.setStyle(l.getItemStyle()),d.hoverStyle=h.getItemStyle(),Yi(d),t.get("showTitle")&&(d.__title=c[u],d.on("mouseover",function(){var t=h.getItemStyle();d.setStyle({text:c[u],textPosition:t.textPosition||"bottom",textFill:t.fill||t.stroke||"#000",textAlign:t.textAlign||"center"})}).on("mouseout",function(){d.setStyle({textFill:null})})),d.trigger(i.get("iconStatus."+u)||"normal"),a.add(d),d.on("click",m(r.onclick,r,e,n,u)),g[u]=d})}var a=this.group;if(a.removeAll(),t.get("show")){var s=+t.get("itemSize"),l=t.get("feature")||{},h=this._features||(this._features={}),u=[];d(l,function(t,e){u.push(e)}),new ls(this._featureNames||[],u).add(r).update(r).remove(v(r,null)).execute(),this._featureNames=u,xu(a,t,n),a.add(_u(a.getBoundingRect(),t)),a.eachChild(function(t){var e=t.__title,i=t.hoverStyle;if(i&&e){var r=ce(e,Te(i)),o=t.position[0]+a.position[0],l=!1;t.position[1]+a.position[1]+s+r.height>n.getHeight()&&(i.textPosition="top",l=!0);var h=l?-5-r.height:s+8;o+r.width/2>n.getWidth()?(i.textPosition=["100%",h],i.textAlign="right"):o-r.width/2<0&&(i.textPosition=[0,h],i.textAlign="left")}})}},updateView:function(t,e,n,i){d(this._features,function(t){t.updateView&&t.updateView(t.model,e,n,i)})},remove:function(t,e){d(this._features,function(n){n.remove&&n.remove(t,e)}),this.group.removeAll()},dispose:function(t,e){d(this._features,function(n){n.dispose&&n.dispose(t,e)})}});var eS=Hy.toolbox.saveAsImage;Uc.defaultOption={show:!0,icon:"M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0",title:eS.title,type:"png",name:"",excludeComponents:["toolbox"],pixelRatio:1,lang:eS.lang.slice()},Uc.prototype.unusable=!Zf.canvasSupported,Uc.prototype.onclick=function(t,e){var n=this.model,i=n.get("name")||t.get("title.0.text")||"echarts",r=document.createElement("a"),o=n.get("type",!0)||"png";r.download=i+"."+o,r.target="_blank";var a=e.getConnectedDataURL({type:o,backgroundColor:n.get("backgroundColor",!0)||t.get("backgroundColor")||"#fff",excludeComponents:n.get("excludeComponents"),pixelRatio:n.get("pixelRatio")});if(r.href=a,"function"!=typeof MouseEvent||Zf.browser.ie||Zf.browser.edge)if(window.navigator.msSaveOrOpenBlob){for(var s=atob(a.split(",")[1]),l=s.length,h=new Uint8Array(l);l--;)h[l]=s.charCodeAt(l);var u=new Blob([h]);window.navigator.msSaveOrOpenBlob(u,i+"."+o)}else{var c=n.get("lang"),d='';window.open().document.write(d)}else{var f=new MouseEvent("click",{view:window,bubbles:!0,cancelable:!1});r.dispatchEvent(f)}},Hc("saveAsImage",Uc);var nS=Hy.toolbox.magicType;Xc.defaultOption={show:!0,type:[],icon:{line:"M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4",bar:"M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7",stack:"M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z",tiled:"M2.3,2.2h22.8V25H2.3V2.2z M35,2.2h22.8V25H35V2.2zM2.3,35h22.8v22.8H2.3V35z M35,35h22.8v22.8H35V35z"},title:n(nS.title),option:{},seriesIndex:{}};var iS=Xc.prototype;iS.getIcons=function(){var t=this.model,e=t.get("icon"),n={};return d(t.get("type"),function(t){e[t]&&(n[t]=e[t])}),n};var rS={line:function(t,e,n,r){if("bar"===t)return i({id:e,type:"line",data:n.get("data"),stack:n.get("stack"),markPoint:n.get("markPoint"),markLine:n.get("markLine")},r.get("option.line")||{},!0)},bar:function(t,e,n,r){if("line"===t)return i({id:e,type:"bar",data:n.get("data"),stack:n.get("stack"),markPoint:n.get("markPoint"),markLine:n.get("markLine")},r.get("option.bar")||{},!0)},stack:function(t,e,n,r){if("line"===t||"bar"===t)return i({id:e,stack:"__ec_magicType_stack__"},r.get("option.stack")||{},!0)},tiled:function(t,e,n,r){if("line"===t||"bar"===t)return i({id:e,stack:""},r.get("option.tiled")||{},!0)}},oS=[["line","bar"],["stack","tiled"]];iS.onclick=function(t,e,n){var i=this.model,r=i.get("seriesIndex."+n);if(rS[n]){var o={series:[]};d(oS,function(t){l(t,n)>=0&&d(t,function(t){i.setIconStatus(t,"normal")})}),i.setIconStatus(n,"emphasis"),t.eachComponent({mainType:"series",query:null==r?null:{seriesIndex:r}},function(e){var r=e.subType,s=e.id,l=rS[n](r,s,e,i);l&&(a(l,e.option),o.series.push(l));var h=e.coordinateSystem;if(h&&"cartesian2d"===h.type&&("line"===n||"bar"===n)){var u=h.getAxesByScale("ordinal")[0];if(u){var c=u.dim+"Axis",d=t.queryComponents({mainType:c,index:e.get(name+"Index"),id:e.get(name+"Id")})[0].componentIndex;o[c]=o[c]||[];for(var f=0;f<=d;f++)o[c][d]=o[c][d]||{};o[c][d].boundaryGap="bar"===n}}}),e.dispatchAction({type:"changeMagicType",currentType:n,newOption:o})}},Qa({type:"changeMagicType",event:"magicTypeChanged",update:"prepareAndUpdate"},function(t,e){e.mergeOption(t.newOption)}),Hc("magicType",Xc);var aS=Hy.toolbox.dataView,sS=new Array(60).join("-"),lS="\t",hS=new RegExp("["+lS+"]+","g");nd.defaultOption={show:!0,readOnly:!1,optionToContent:null,contentToOption:null,icon:"M17.5,17.3H33 M17.5,17.3H33 M45.4,29.5h-28 M11.5,2v56H51V14.8L38.4,2H11.5z M38.4,2.2v12.7H51 M45.4,41.7h-28",title:n(aS.title),lang:n(aS.lang),backgroundColor:"#fff",textColor:"#000",textareaColor:"#fff",textareaBorderColor:"#333",buttonColor:"#c23531",buttonTextColor:"#fff"},nd.prototype.onclick=function(t,e){function n(){i.removeChild(o),x._dom=null}var i=e.getDom(),r=this.model;this._dom&&i.removeChild(this._dom);var o=document.createElement("div");o.style.cssText="position:absolute;left:5px;top:5px;bottom:5px;right:5px;",o.style.backgroundColor=r.get("backgroundColor")||"#fff";var a=document.createElement("h4"),s=r.get("lang")||[];a.innerHTML=s[0]||r.get("title"),a.style.cssText="margin: 10px 20px;",a.style.color=r.get("textColor");var l=document.createElement("div"),h=document.createElement("textarea");l.style.cssText="display:block;width:100%;overflow:auto;";var u=r.get("optionToContent"),c=r.get("contentToOption"),d=$c(t);if("function"==typeof u){var f=u(e.getOption());"string"==typeof f?l.innerHTML=f:M(f)&&l.appendChild(f)}else l.appendChild(h),h.readOnly=r.get("readOnly"),h.style.cssText="width:100%;height:100%;font-family:monospace;font-size:14px;line-height:1.6rem;",h.style.color=r.get("textColor"),h.style.borderColor=r.get("textareaBorderColor"),h.style.backgroundColor=r.get("textareaColor"),h.value=d.value;var p=d.meta,g=document.createElement("div");g.style.cssText="position:absolute;bottom:0;left:0;right:0;";var m="float:right;margin-right:20px;border:none;cursor:pointer;padding:2px 5px;font-size:12px;border-radius:3px",v=document.createElement("div"),y=document.createElement("div");m+=";background-color:"+r.get("buttonColor"),m+=";color:"+r.get("buttonTextColor");var x=this;on(v,"click",n),on(y,"click",function(){var t;try{t="function"==typeof c?c(l,e.getOption()):ed(h.value,p)}catch(t){throw n(),new Error("Data view format error "+t)}t&&e.dispatchAction({type:"changeDataView",newOption:t}),n()}),v.innerHTML=s[1],y.innerHTML=s[2],y.style.cssText=m,v.style.cssText=m,!r.get("readOnly")&&g.appendChild(y),g.appendChild(v),on(h,"keydown",function(t){if(9===(t.keyCode||t.which)){var e=this.value,n=this.selectionStart,i=this.selectionEnd;this.value=e.substring(0,n)+lS+e.substring(i),this.selectionStart=this.selectionEnd=n+1,bg(t)}}),o.appendChild(a),o.appendChild(l),o.appendChild(g),l.style.height=i.clientHeight-80+"px",i.appendChild(o),this._dom=o},nd.prototype.remove=function(t,e){this._dom&&e.getDom().removeChild(this._dom)},nd.prototype.dispose=function(t,e){this.remove(t,e)},Hc("dataView",nd),Qa({type:"changeDataView",event:"dataViewChanged",update:"prepareAndUpdate"},function(t,e){var n=[];d(t.newOption.series,function(t){var i=e.getSeriesByName(t.name)[0];if(i){var r=i.get("data");n.push({name:t.name,data:id(t.data,r)})}else n.push(o({type:"scatter"},t))}),e.mergeOption(a({series:n},t.newOption))});var uS=v,cS=d,dS=f,fS=Math.min,pS=Math.max,gS=Math.pow,mS=1e4,vS=6,yS=6,xS="globalPan",_S={w:[0,0],e:[0,1],n:[1,0],s:[1,1]},wS={w:"ew",e:"ew",n:"ns",s:"ns",ne:"nesw",sw:"nesw",nw:"nwse",se:"nwse"},bS={brushStyle:{lineWidth:2,stroke:"rgba(0,0,0,0.3)",fill:"rgba(0,0,0,0.1)"},transformable:!0,brushMode:"single",removeOnClick:!1},SS=0;rd.prototype={constructor:rd,enableBrush:function(t){return this._brushType&&ad(this),t.brushType&&od(this,t),this},setPanels:function(t){if(t&&t.length){var e=this._panels={};d(t,function(t){e[t.panelId]=n(t)})}else this._panels=null;return this},mount:function(t){t=t||{},this._enableGlobalPan=t.enableGlobalPan;var e=this.group;return this._zr.add(e),e.attr({position:t.position||[0,0],rotation:t.rotation||0,scale:t.scale||[1,1]}),this._transform=e.getLocalTransform(),this},eachCover:function(t,e){cS(this._covers,t,e)},updateCovers:function(t){function e(t,e){return(null!=t.id?t.id:o+e)+"-"+t.brushType}function r(e,n){var i=t[e];if(null!=n&&a[n]===h)s[e]=a[n];else{var r=s[e]=null!=n?(a[n].__brushOption=i,a[n]):ld(l,sd(l,i));cd(l,r)}}t=f(t,function(t){return i(n(bS),t,!0)});var o="\0-brush-index-",a=this._covers,s=this._covers=[],l=this,h=this._creatingCover;return new ls(a,t,function(t,n){return e(t.__brushOption,n)},e).add(r).update(r).remove(function(t){a[t]!==h&&l.group.remove(a[t])}).execute(),this},unmount:function(){return this.enableBrush(!1),gd(this),this._zr.remove(this.group),this},dispose:function(){this.unmount(),this.off()}},u(rd,dp);var MS={mousedown:function(t){if(this._dragging)Nd.call(this,t);else if(!t.target||!t.target.draggable){Od(t);var e=this.group.transformCoordToLocal(t.offsetX,t.offsetY);this._creatingCover=null,(this._creatingPanel=fd(this,t,e))&&(this._dragging=!0,this._track=[e.slice()])}},mousemove:function(t){var e=this.group.transformCoordToLocal(t.offsetX,t.offsetY);if(Ld(this,t,e),this._dragging){Od(t);var n=Ed(this,t,e,!1);n&&md(this,n)}},mouseup:Nd},IS={lineX:Bd(0),lineY:Bd(1),rect:{createCover:function(t,e){return xd(uS(Cd,function(t){return t},function(t){return t}),t,e,["w","e","n","s","se","sw","ne","nw"])},getCreatingRange:function(t){var e=yd(t);return Md(e[1][0],e[1][1],e[0][0],e[0][1])},updateCoverShape:function(t,e,n,i){_d(t,e,n,i)},updateCommon:wd,contain:zd},polygon:{createCover:function(t,e){var n=new Xp;return n.add(new sv({name:"main",style:Sd(e),silent:!0})),n},getCreatingRange:function(t){return t},endCreating:function(t,e){e.remove(e.childAt(0)),e.add(new av({name:"main",draggable:!0,drift:uS(Ad,t,e),ondragend:uS(md,t,{isEnd:!0})}))},updateCoverShape:function(t,e,n,i){e.childAt(0).setShape({points:kd(t,e,n)})},updateCommon:wd,contain:zd}},TS={axisPointer:1,tooltip:1,brush:1},CS=d,AS=l,DS=v,kS=["dataToPoint","pointToData"],PS=["grid","xAxis","yAxis","geo","graph","polar","radiusAxis","angleAxis","bmap"],LS=Zd.prototype;LS.setOutputRanges=function(t,e){this.matchOutputRanges(t,e,function(t,e,n){if((t.coordRanges||(t.coordRanges=[])).push(e),!t.coordRange){t.coordRange=e;var i=RS[t.brushType](0,n,e);t.__rangeOffset={offset:NS[t.brushType](i.values,t.range,[1,1]),xyMinMax:i.xyMinMax}}})},LS.matchOutputRanges=function(t,e,n){CS(t,function(t){var i=this.findTargetInfo(t,e);i&&!0!==i&&d(i.coordSyses,function(i){var r=RS[t.brushType](1,i,t.range);n(t,r.values,i,e)})},this)},LS.setInputRanges=function(t,e){CS(t,function(t){var n=this.findTargetInfo(t,e);if(t.range=t.range||[],n&&!0!==n){t.panelId=n.panelId;var i=RS[t.brushType](0,n.coordSys,t.coordRange),r=t.__rangeOffset;t.range=r?NS[t.brushType](i.values,r.offset,qd(i.xyMinMax,r.xyMinMax)):i.values}},this)},LS.makePanelOpts=function(t,e){return f(this._targetInfoList,function(n){var i=n.getPanelRect();return{panelId:n.panelId,defaultBrushType:e&&e(n),clipPath:Fd(i),isTargetByCursor:Hd(i,t,n.coordSysModel),getLinearBrushOtherExtent:Gd(i)}})},LS.controlSeries=function(t,e,n){var i=this.findTargetInfo(t,n);return!0===i||i&&AS(i.coordSyses,e.coordinateSystem)>=0},LS.findTargetInfo=function(t,e){for(var n=this._targetInfoList,i=Xd(e,t),r=0;r=0||AS(i,t.getAxis("y").model)>=0)&&o.push(t)}),e.push({panelId:"grid--"+t.id,gridModel:t,coordSysModel:t,coordSys:o[0],coordSyses:o,getPanelRect:ES.grid,xAxisDeclared:a[t.id],yAxisDeclared:s[t.id]})}))},geo:function(t,e){CS(t.geoModels,function(t){var n=t.coordinateSystem;e.push({panelId:"geo--"+t.id,geoModel:t,coordSysModel:t,coordSys:n,coordSyses:[n],getPanelRect:ES.geo})})}},zS=[function(t,e){var n=t.xAxisModel,i=t.yAxisModel,r=t.gridModel;return!r&&n&&(r=n.axis.grid.model),!r&&i&&(r=i.axis.grid.model),r&&r===e.gridModel},function(t,e){var n=t.geoModel;return n&&n===e.geoModel}],ES={grid:function(){return this.coordSys.grid.getRect().clone()},geo:function(){var t=this.coordSys,e=t.getBoundingRect().clone();return e.applyTransform(sr(t)),e}},RS={lineX:DS(jd,0),lineY:DS(jd,1),rect:function(t,e,n){var i=e[kS[t]]([n[0][0],n[1][0]]),r=e[kS[t]]([n[0][1],n[1][1]]),o=[Ud([i[0],r[0]]),Ud([i[1],r[1]])];return{values:o,xyMinMax:o}},polygon:function(t,e,n){var i=[[1/0,-1/0],[1/0,-1/0]];return{values:f(n,function(n){var r=e[kS[t]](n);return i[0][0]=Math.min(i[0][0],r[0]),i[1][0]=Math.min(i[1][0],r[1]),i[0][1]=Math.max(i[0][1],r[0]),i[1][1]=Math.max(i[1][1],r[1]),r}),xyMinMax:i}}},NS={lineX:DS(Yd,0),lineY:DS(Yd,1),rect:function(t,e,n){return[[t[0][0]-n[0]*e[0][0],t[0][1]-n[0]*e[0][1]],[t[1][0]-n[1]*e[1][0],t[1][1]-n[1]*e[1][1]]]},polygon:function(t,e,n){return f(t,function(t,i){return[t[0]-n[0]*e[i][0],t[1]-n[1]*e[i][1]]})}},BS=d,VS="\0_ec_hist_store";Eb.extend({type:"dataZoom.select"}),Rb.extend({type:"dataZoom.select"});var FS=Hy.toolbox.dataZoom,GS=d,HS="\0_ec_\0toolbox-dataZoom_";nf.defaultOption={show:!0,icon:{zoom:"M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1",back:"M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26"},title:n(FS.title)};var WS=nf.prototype;WS.render=function(t,e,n,i){this.model=t,this.ecModel=e,this.api=n,af(t,e,this,i,n),of(t,e)},WS.onclick=function(t,e,n){ZS[n].call(this)},WS.remove=function(t,e){this._brushController.unmount()},WS.dispose=function(t,e){this._brushController.dispose()};var ZS={zoom:function(){var t=!this._isZoomActive;this.api.dispatchAction({type:"takeGlobalCursor",key:"dataZoomSelect",dataZoomSelectActive:t})},back:function(){this._dispatchZoomAction(Qd(this.ecModel))}};WS._onBrush=function(t,e){function n(t,e,n){var a=e.getAxis(t),s=a.model,l=i(t,s,o),h=l.findRepresentativeAxisProxy(s).getMinMaxSpan();null==h.minValueSpan&&null==h.maxValueSpan||(n=Nb(0,n.slice(),a.scale.getExtent(),0,h.minValueSpan,h.maxValueSpan)),l&&(r[l.id]={dataZoomId:l.id,startValue:n[0],endValue:n[1]})}function i(t,e,n){var i;return n.eachComponent({mainType:"dataZoom",subType:"select"},function(n){n.getAxisModel(t,e.componentIndex)&&(i=n)}),i}if(e.isEnd&&t.length){var r={},o=this.ecModel;this._brushController.updateCovers([]),new Zd(rf(this.model.option),o,{include:["grid"]}).matchOutputRanges(t,o,function(t,e,i){if("cartesian2d"===i.type){var r=t.brushType;"rect"===r?(n("x",i,e[0]),n("y",i,e[1])):n({lineX:"x",lineY:"y"}[r],i,e)}}),Kd(o,r),this._dispatchZoomAction(r)}},WS._dispatchZoomAction=function(t){var e=[];GS(t,function(t,i){e.push(n(t))}),e.length&&this.api.dispatchAction({type:"dataZoom",from:this.uid,batch:e})},Hc("dataZoom",nf),$a(function(t){function e(t,e){if(e){var r=t+"Index",o=e[r];null==o||"all"==o||y(o)||(o=!1===o||"none"===o?[]:[o]),n(t,function(e,n){if(null==o||"all"==o||-1!==l(o,n)){var a={type:"select",$fromToolbox:!0,id:HS+t+n};a[r]=n,i.push(a)}})}}function n(e,n){var i=t[e];y(i)||(i=i?[i]:[]),GS(i,n)}if(t){var i=t.dataZoom||(t.dataZoom=[]);y(i)||(t.dataZoom=i=[i]);var r=t.toolbox;if(r&&(y(r)&&(r=r[0]),r&&r.feature)){var o=r.feature.dataZoom;e("xAxis",o),e("yAxis",o)}}});var US=Hy.toolbox.restore;sf.defaultOption={show:!0,icon:"M3.8,33.4 M47,18.9h9.8V8.7 M56.3,20.1 C52.1,9,40.5,0.6,26.8,2.1C12.6,3.7,1.6,16.2,2.1,30.6 M13,41.1H3.1v10.2 M3.7,39.9c4.2,11.1,15.8,19.5,29.5,18 c14.2-1.6,25.2-14.1,24.7-28.5",title:US.title},sf.prototype.onclick=function(t,e,n){Jd(t),e.dispatchAction({type:"restore",from:this.uid})},Hc("restore",sf),Qa({type:"restore",event:"restore",update:"prepareAndUpdate"},function(t,e){e.resetOption("recreate")});var XS,jS="urn:schemas-microsoft-com:vml",YS="undefined"==typeof window?null:window,qS=!1,$S=YS&&YS.document;if($S&&!Zf.canvasSupported)try{!$S.namespaces.zrvml&&$S.namespaces.add("zrvml",jS),XS=function(t){return $S.createElement("')}}catch(t){XS=function(t){return $S.createElement("<"+t+' xmlns="'+jS+'" class="zrvml">')}}var KS=Am.CMD,QS=Math.round,JS=Math.sqrt,tM=Math.abs,eM=Math.cos,nM=Math.sin,iM=Math.max;if(!Zf.canvasSupported){var rM=21600,oM=rM/2,aM=function(t){t.style.cssText="position:absolute;left:0;top:0;width:1px;height:1px;",t.coordsize=rM+","+rM,t.coordorigin="0,0"},sM=function(t){return String(t).replace(/&/g,"&").replace(/"/g,""")},lM=function(t,e,n){return"rgb("+[t,e,n].join(",")+")"},hM=function(t,e){e&&t&&e.parentNode!==t&&t.appendChild(e)},uM=function(t,e){e&&t&&e.parentNode===t&&t.removeChild(e)},cM=function(t,e,n){return 1e5*(parseFloat(t)||0)+1e3*(parseFloat(e)||0)+n},dM=function(t,e){return"string"==typeof t?t.lastIndexOf("%")>=0?parseFloat(t)/100*e:parseFloat(t):t},fM=function(t,e,n){var i=Mt(e);n=+n,isNaN(n)&&(n=1),i&&(t.color=lM(i[0],i[1],i[2]),t.opacity=n*i[3])},pM=function(t){var e=Mt(t);return[lM(e[0],e[1],e[2]),e[3]]},gM=function(t,e,n){var i=e.fill;if(null!=i)if(i instanceof pv){var r,o=0,a=[0,0],s=0,l=1,h=n.getBoundingRect(),u=h.width,c=h.height;if("linear"===i.type){r="gradient";var d=n.transform,f=[i.x*u,i.y*c],p=[i.x2*u,i.y2*c];d&&($(f,f,d),$(p,p,d));var g=p[0]-f[0],m=p[1]-f[1];(o=180*Math.atan2(g,m)/Math.PI)<0&&(o+=360),o<1e-6&&(o=0)}else{r="gradientradial";var f=[i.x*u,i.y*c],d=n.transform,v=n.scale,y=u,x=c;a=[(f[0]-h.x)/y,(f[1]-h.y)/x],d&&$(f,f,d),y/=v[0]*rM,x/=v[1]*rM;var _=iM(y,x);s=0/_,l=2*i.r/_-s}var w=i.colorStops.slice();w.sort(function(t,e){return t.offset-e.offset});for(var b=w.length,S=[],M=[],I=0;I=2){var A=S[0][0],D=S[1][0],k=S[0][1]*e.opacity,P=S[1][1]*e.opacity;t.type=r,t.method="none",t.focus="100%",t.angle=o,t.color=A,t.color2=D,t.colors=M.join(","),t.opacity=P,t.opacity2=k}"radial"===r&&(t.focusposition=a.join(","))}else fM(t,i,e.opacity)},mM=function(t,e){null!=e.lineDash&&(t.dashstyle=e.lineDash.join(" ")),null==e.stroke||e.stroke instanceof pv||fM(t,e.stroke,e.opacity)},vM=function(t,e,n,i){var r="fill"==e,o=t.getElementsByTagName(e)[0];null!=n[e]&&"none"!==n[e]&&(r||!r&&n.lineWidth)?(t[r?"filled":"stroked"]="true",n[e]instanceof pv&&uM(t,o),o||(o=lf(e)),r?gM(o,n,i):mM(o,n),hM(t,o)):(t[r?"filled":"stroked"]="false",uM(t,o))},yM=[[],[],[]],xM=function(t,e){var n,i,r,o,a,s,l=KS.M,h=KS.C,u=KS.L,c=KS.A,d=KS.Q,f=[],p=t.data,g=t.len();for(o=0;o.01?O&&(z+=.0125):Math.abs(E-A)<1e-4?O&&zC?x-=.0125:x+=.0125:O&&EA?y+=.0125:y-=.0125),f.push(R,QS(((C-D)*M+b)*rM-oM),",",QS(((A-k)*I+S)*rM-oM),",",QS(((C+D)*M+b)*rM-oM),",",QS(((A+k)*I+S)*rM-oM),",",QS((z*M+b)*rM-oM),",",QS((E*I+S)*rM-oM),",",QS((y*M+b)*rM-oM),",",QS((x*I+S)*rM-oM)),a=y,s=x;break;case KS.R:var N=yM[0],B=yM[1];N[0]=p[o++],N[1]=p[o++],B[0]=N[0]+p[o++],B[1]=N[1]+p[o++],e&&($(N,N,e),$(B,B,e)),N[0]=QS(N[0]*rM-oM),B[0]=QS(B[0]*rM-oM),N[1]=QS(N[1]*rM-oM),B[1]=QS(B[1]*rM-oM),f.push(" m ",N[0],",",N[1]," l ",B[0],",",N[1]," l ",B[0],",",B[1]," l ",N[0],",",B[1]);break;case KS.Z:f.push(" x ")}if(n>0){f.push(i);for(var V=0;V100&&(SM=0,bM={});var n,i=MM.style;try{i.font=t,n=i.fontFamily.split(",")[0]}catch(t){}e={style:i.fontStyle||"normal",variant:i.fontVariant||"normal",weight:i.fontWeight||"normal",size:0|parseFloat(i.fontSize||12),family:n||"Microsoft YaHei"},bM[t]=e,SM++}return e};!function(t,e){dg[t]=e}("measureText",function(t,e){var n=$S;wM||((wM=n.createElement("div")).style.cssText="position:absolute;top:-20000px;left:0;padding:0;margin:0;border:none;white-space:pre;",$S.body.appendChild(wM));try{wM.style.font=e}catch(t){}return wM.innerHTML="",wM.appendChild(n.createTextNode(t)),{width:wM.offsetWidth}});for(var TM=new Xt,CM=[mg,Xe,je,yi,Qm],AM=0;AM=r&&h+1>=o){for(var u=[],c=0;c=r&&c+1>=o)return If(0,s.components);l[n]=s}else l[n]=void 0}a++}();if(d)return d}},pushComponent:function(t,e,n){var i=t[t.length-1];i&&i.added===e&&i.removed===n?t[t.length-1]={count:i.count+1,added:e,removed:n}:t.push({count:1,added:e,removed:n})},extractCommon:function(t,e,n,i){for(var r=e.length,o=n.length,a=t.newPos,s=a-i,l=0;a+1=0;--i)if(e[i]===t)return!0;return!1}),n):null:n[0]},Cf.prototype.update=function(t,e){if(t){var n=this.getDefs(!1);if(t[this._domName]&&n.contains(t[this._domName]))"function"==typeof e&&e(t);else{var i=this.add(t);i&&(t[this._domName]=i)}}},Cf.prototype.addDom=function(t){this.getDefs(!0).appendChild(t)},Cf.prototype.removeDom=function(t){var e=this.getDefs(!1);e&&t[this._domName]&&(e.removeChild(t[this._domName]),t[this._domName]=null)},Cf.prototype.getDoms=function(){var t=this.getDefs(!1);if(!t)return[];var e=[];return d(this._tagNames,function(n){var i=t.getElementsByTagName(n);e=e.concat([].slice.call(i))}),e},Cf.prototype.markAllUnused=function(){var t=this;d(this.getDoms(),function(e){e[t._markLabel]="0"})},Cf.prototype.markUsed=function(t){t&&(t[this._markLabel]="1")},Cf.prototype.removeUnused=function(){var t=this.getDefs(!1);if(t){var e=this;d(this.getDoms(),function(n){"1"!==n[e._markLabel]&&t.removeChild(n)})}},Cf.prototype.getSvgProxy=function(t){return t instanceof yi?GM:t instanceof je?HM:t instanceof Qm?WM:GM},Cf.prototype.getTextSvgElement=function(t){return t.__textSvgEl},Cf.prototype.getSvgElement=function(t){return t.__svgEl},h(Af,Cf),Af.prototype.addWithoutUpdate=function(t,e){if(e&&e.style){var n=this;d(["fill","stroke"],function(i){if(e.style[i]&&("linear"===e.style[i].type||"radial"===e.style[i].type)){var r,o=e.style[i],a=n.getDefs(!0);o._dom?(r=o._dom,a.contains(o._dom)||n.addDom(r)):r=n.add(o),n.markUsed(e);var s=r.getAttribute("id");t.setAttribute(i,"url(#"+s+")")}})}},Af.prototype.add=function(t){var e;if("linear"===t.type)e=this.createElement("linearGradient");else{if("radial"!==t.type)return Fp("Illegal gradient type."),null;e=this.createElement("radialGradient")}return t.id=t.id||this.nextId++,e.setAttribute("id","zr"+this._zrId+"-gradient-"+t.id),this.updateDom(t,e),this.addDom(e),e},Af.prototype.update=function(t){var e=this;Cf.prototype.update.call(this,t,function(){var n=t.type,i=t._dom.tagName;"linear"===n&&"linearGradient"===i||"radial"===n&&"radialGradient"===i?e.updateDom(t,t._dom):(e.removeDom(t),e.add(t))})},Af.prototype.updateDom=function(t,e){if("linear"===t.type)e.setAttribute("x1",t.x),e.setAttribute("y1",t.y),e.setAttribute("x2",t.x2),e.setAttribute("y2",t.y2);else{if("radial"!==t.type)return void Fp("Illegal gradient type.");e.setAttribute("cx",t.x),e.setAttribute("cy",t.y),e.setAttribute("r",t.r)}t.global?e.setAttribute("gradientUnits","userSpaceOnUse"):e.setAttribute("gradientUnits","objectBoundingBox"),e.innerHTML="";for(var n=t.colorStops,i=0,r=n.length;i0){var i,r,o=this.getDefs(!0),a=e[0],s=n?"_textDom":"_dom";a[s]?(r=a[s].getAttribute("id"),i=a[s],o.contains(i)||o.appendChild(i)):(r="zr"+this._zrId+"-clip-"+this.nextId,++this.nextId,(i=this.createElement("clipPath")).setAttribute("id",r),o.appendChild(i),a[s]=i);var l=this.getSvgProxy(a);if(a.transform&&a.parent.invTransform&&!n){var h=Array.prototype.slice.call(a.transform);st(a.transform,a.parent.invTransform,a.transform),l.brush(a),a.transform=h}else l.brush(a);var u=this.getSvgElement(a);i.innerHTML="",i.appendChild(u.cloneNode()),t.setAttribute("clip-path","url(#"+r+")"),e.length>1&&this.updateDom(i,e.slice(1),n)}else t&&t.setAttribute("clip-path","none")},Df.prototype.markUsed=function(t){var e=this;t.__clipPaths&&t.__clipPaths.length>0&&d(t.__clipPaths,function(t){t._dom&&Cf.prototype.markUsed.call(e,t._dom),t._textDom&&Cf.prototype.markUsed.call(e,t._textDom)})},h(kf,Cf),kf.prototype.addWithoutUpdate=function(t,e){if(e&&Pf(e.style)){var n,i=e.style;i._shadowDom?(n=i._shadowDom,this.getDefs(!0).contains(i._shadowDom)||this.addDom(n)):n=this.add(e),this.markUsed(e);var r=n.getAttribute("id");t.style.filter="url(#"+r+")"}},kf.prototype.add=function(t){var e=this.createElement("filter"),n=t.style;return n._shadowDomId=n._shadowDomId||this.nextId++,e.setAttribute("id","zr"+this._zrId+"-shadow-"+n._shadowDomId),this.updateDom(t,e),this.addDom(e),e},kf.prototype.update=function(t,e){var n=e.style;if(Pf(n)){var i=this;Cf.prototype.update.call(this,e,function(t){i.updateDom(e,t._shadowDom)})}else this.remove(t,n)},kf.prototype.remove=function(t,e){null!=e._shadowDomId&&(this.removeDom(e),t.style.filter="")},kf.prototype.updateDom=function(t,e){var n=e.getElementsByTagName("feDropShadow");n=0===n.length?this.createElement("feDropShadow"):n[0];var i,r,o,a,s=t.style,l=t.scale?t.scale[0]||1:1,h=t.scale?t.scale[1]||1:1;if(s.shadowBlur||s.shadowOffsetX||s.shadowOffsetY)i=s.shadowOffsetX||0,r=s.shadowOffsetY||0,o=s.shadowBlur,a=s.shadowColor;else{if(!s.textShadowBlur)return void this.removeDom(e,s);i=s.textShadowOffsetX||0,r=s.textShadowOffsetY||0,o=s.textShadowBlur,a=s.textShadowColor}n.setAttribute("dx",i/l),n.setAttribute("dy",r/h),n.setAttribute("flood-color",a);var u=o/2/l+" "+o/2/h;n.setAttribute("stdDeviation",u),e.setAttribute("x","-100%"),e.setAttribute("y","-100%"),e.setAttribute("width",Math.ceil(o/2*200)+"%"),e.setAttribute("height",Math.ceil(o/2*200)+"%"),e.appendChild(n),s._shadowDom=e},kf.prototype.markUsed=function(t){var e=t.style;e&&e._shadowDom&&Cf.prototype.markUsed.call(this,e._shadowDom)};var YM=function(t,e,n,i){this.root=t,this.storage=e,this._opts=n=o({},n||{});var r=ff("svg");r.setAttribute("xmlns","http://www.w3.org/2000/svg"),r.setAttribute("version","1.1"),r.setAttribute("baseProfile","full"),r.style.cssText="user-select:none;position:absolute;left:0;top:0;",this.gradientManager=new Af(i,r),this.clipPathManager=new Df(i,r),this.shadowManager=new kf(i,r);var a=document.createElement("div");a.style.cssText="overflow:hidden;position:relative",this._svgRoot=r,this._viewport=a,t.appendChild(a),a.appendChild(r),this.resize(n.width,n.height),this._visibleList=[]};YM.prototype={constructor:YM,getType:function(){return"svg"},getViewportRoot:function(){return this._viewport},getViewportRootOffset:function(){var t=this.getViewportRoot();if(t)return{offsetLeft:t.offsetLeft||0,offsetTop:t.offsetTop||0}},refresh:function(){var t=this.storage.getDisplayList(!0);this._paintList(t)},_paintList:function(t){this.gradientManager.markAllUnused(),this.clipPathManager.markAllUnused(),this.shadowManager.markAllUnused();var e,n=this._svgRoot,i=this._visibleList,r=t.length,o=[];for(e=0;e=0;--i)if(e[i]===t)return!0;return!1}),n):null:n[0]},resize:function(t,e){var n=this._viewport;n.style.display="none";var i=this._opts;if(null!=t&&(i.width=t),null!=e&&(i.height=e),t=this._getSize(0),e=this._getSize(1),n.style.display="",this._width!==t||this._height!==e){this._width=t,this._height=e;var r=n.style;r.width=t+"px",r.height=e+"px";var o=this._svgRoot;o.setAttribute("width",t),o.setAttribute("height",e)}},getWidth:function(){return this._width},getHeight:function(){return this._height},_getSize:function(t){var e=this._opts,n=["width","height"][t],i=["clientWidth","clientHeight"][t],r=["paddingLeft","paddingTop"][t],o=["paddingRight","paddingBottom"][t];if(null!=e[n]&&"auto"!==e[n])return parseFloat(e[n]);var a=this.root,s=document.defaultView.getComputedStyle(a);return(a[i]||Lf(s[n])||Lf(a.style[n]))-(Lf(s[r])||0)-(Lf(s[o])||0)|0},dispose:function(){this.root.innerHTML="",this._svgRoot=this._viewport=this.storage=null},clear:function(){this._viewport&&this.root.removeChild(this._viewport)},pathToSvg:function(){this.refresh();var t=this._svgRoot.outerHTML;return"data:img/svg+xml;utf-8,"+unescape(t)}},d(["getLayer","insertLayer","eachLayer","eachBuiltinLayer","eachOtherLayer","getLayers","modLayer","delLayer","clearLayer","toDataURL","pathToImage"],function(t){YM.prototype[t]=Ff(t)}),vn("svg",YM),t.version="4.0.2",t.dependencies=ox,t.PRIORITY=hx,t.init=function(t,e,n){var i=Ya(t);if(i)return i;var r=new Ta(t,e,n);return r.id="ec_"+Cx++,Ix[r.id]=r,kn(t,Dx,r.id),Xa(r),r},t.connect=function(t){if(y(t)){var e=t;t=null,ex(e,function(e){null!=e.group&&(t=e.group)}),t=t||"g_"+Ax++,ex(e,function(e){e.group=t})}return Tx[t]=!0,t},t.disConnect=ja,t.disconnect=Px,t.dispose=function(t){"string"==typeof t?t=Ix[t]:t instanceof Ta||(t=Ya(t)),t instanceof Ta&&!t.isDisposed()&&t.dispose()},t.getInstanceByDom=Ya,t.getInstanceById=function(t){return Ix[t]},t.registerTheme=qa,t.registerPreprocessor=$a,t.registerProcessor=Ka,t.registerPostUpdate=function(t){_x.push(t)},t.registerAction=Qa,t.registerCoordinateSystem=function(t,e){mo.register(t,e)},t.getCoordinateSystemDimensions=function(t){var e=mo.get(t);if(e)return e.getDimensionsInfo?e.getDimensionsInfo():e.dimensions.slice()},t.registerLayout=Ja,t.registerVisual=ts,t.registerLoading=ns,t.extendComponentModel=is,t.extendComponentView=rs,t.extendSeriesModel=os,t.extendChartView=as,t.setCanvasCreator=function(t){e("createCanvas",t)},t.registerMap=function(t,e,n){e.geoJson&&!e.features&&(n=e.specialAreas,e=e.geoJson),"string"==typeof e&&(e="undefined"!=typeof JSON&&JSON.parse?JSON.parse(e):new Function("return ("+e+");")()),kx[t]={geoJson:e,specialAreas:n}},t.getMap=function(t){return kx[t]},t.dataTool=Lx,t.zrender=Rg,t.graphic=bv,t.number=Lv,t.format=Vv,t.throttle=aa,t.helper=__,t.matrix=vp,t.vector=up,t.color=zp,t.parseGeoJSON=b_,t.parseGeoJson=T_,t.util=C_,t.List=Fx,t.Model=fr,t.Axis=I_,t.env=Zf}); diff --git a/springboot-echarts/src/main/resources/public/static/js/jquery-1.10.1.min.js b/springboot-echarts/src/main/resources/public/static/js/jquery-1.10.1.min.js new file mode 100644 index 0000000..4009433 --- /dev/null +++ b/springboot-echarts/src/main/resources/public/static/js/jquery-1.10.1.min.js @@ -0,0 +1,6 @@ +/*! jQuery v1.10.1 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license +//@ sourceMappingURL=jquery-1.10.1.min.map +*/ +(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.1",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=lt(),k=lt(),E=lt(),S=!1,A=function(){return 0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=bt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+xt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return At(e.replace(z,"$1"),t,n,i)}function st(e){return K.test(e+"")}function lt(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function ut(e){return e[b]=!0,e}function ct(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function pt(e,t,n){e=e.split("|");var r,i=e.length,a=n?null:t;while(i--)(r=o.attrHandle[e[i]])&&r!==t||(o.attrHandle[e[i]]=a)}function ft(e,t){var n=e.getAttributeNode(t);return n&&n.specified?n.value:e[t]===!0?t.toLowerCase():null}function dt(e,t){return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}function ht(e){return"input"===e.nodeName.toLowerCase()?e.defaultValue:t}function gt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function mt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function yt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function vt(e){return ut(function(t){return t=+t,ut(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.parentWindow;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.frameElement&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ct(function(e){return e.innerHTML="",pt("type|href|height|width",dt,"#"===e.firstChild.getAttribute("href")),pt(B,ft,null==e.getAttribute("disabled")),e.className="i",!e.getAttribute("className")}),r.input=ct(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")}),pt("value",ht,r.attributes&&r.input),r.getElementsByTagName=ct(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ct(function(e){return e.innerHTML="

                    ",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ct(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}: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},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=st(n.querySelectorAll))&&(ct(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ct(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=st(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ct(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=st(d.contains)||d.compareDocumentPosition?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},r.sortDetached=ct(function(e){return 1&e.compareDocumentPosition(n.createElement("div"))}),A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return gt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?gt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:ut,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===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]||at.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]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=bt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?ut(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ut(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?ut(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ut(function(e){return function(t){return at(e,t).length>0}}),contains:ut(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:ut(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:vt(function(){return[0]}),last:vt(function(e,t){return[t-1]}),eq:vt(function(e,t,n){return[0>n?n+t:n]}),even:vt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:vt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:vt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:vt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=mt(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=yt(n);function bt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function xt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function wt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function Tt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function Ct(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function Nt(e,t,n,r,i,o){return r&&!r[b]&&(r=Nt(r)),i&&!i[b]&&(i=Nt(i,o)),ut(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||St(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:Ct(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=Ct(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=Ct(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function kt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=wt(function(e){return e===t},s,!0),p=wt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[wt(Tt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return Nt(l>1&&Tt(f),l>1&&xt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&kt(e.slice(l,r)),i>r&&kt(e=e.slice(r)),i>r&&xt(e))}f.push(n)}return Tt(f)}function Et(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=Ct(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?ut(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=bt(e)),n=t.length;while(n--)o=kt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Et(i,r))}return o};function St(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function At(e,t,n,i){var a,s,u,c,p,f=bt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&xt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}o.pseudos.nth=o.pseudos.eq;function jt(){}jt.prototype=o.filters=o.pseudos,o.setFilters=new jt,r.sortStable=b.split("").sort(A).join("")===b,p(),[0,0].sort(A),r.detectDuplicates=S,x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!l||i&&!u||(n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="
                    a",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="
                    t
                    ",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="
                    ",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null) +}),n=s=l=u=r=o=null,t}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=x(this),l=t,u=e.match(T)||[];while(o=u[a++])l=r?l:!s.hasClass(o),s[l?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/\s*$/g,At={option:[1,""],legend:[1,"
                    ","
                    "],area:[1,"",""],param:[1,"",""],thead:[1,"","
                    "],tr:[2,"","
                    "],col:[2,"","
                    "],td:[3,"","
                    "],_default:x.support.htmlSerialize?[0,"",""]:[1,"X
                    ","
                    "]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?""!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle); + u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x("