diff --git a/.classpath b/.classpath index 8041ee8..4c6d0b4 100644 --- a/.classpath +++ b/.classpath @@ -17,15 +17,15 @@ - + - - + + diff --git a/.project b/.project index 4d3d0ff..b459db5 100644 --- a/.project +++ b/.project @@ -47,8 +47,8 @@ - com.genuitec.eclipse.springframework.springnature org.eclipse.m2e.core.maven2Nature + com.genuitec.eclipse.springframework.springnature org.eclipse.wst.common.project.facet.core.nature org.eclipse.jdt.core.javanature org.eclipse.wst.common.modulecore.ModuleCoreNature diff --git a/.settings/com.genuitec.eclipse.core.prefs b/.settings/com.genuitec.eclipse.core.prefs new file mode 100644 index 0000000..cf29e83 --- /dev/null +++ b/.settings/com.genuitec.eclipse.core.prefs @@ -0,0 +1,3 @@ +eclipse.preferences.version=1 +validator.Checked=src/main/webapp/WEB-INF/view/admin/pageSplit.jsp +validator.Unchecked= diff --git a/.springBeans b/.springBeans new file mode 100644 index 0000000..095bc93 --- /dev/null +++ b/.springBeans @@ -0,0 +1,15 @@ + + + 1 + + + + + + + src/main/resources/spring/spring.xml + src/main/resources/spring/spring-mvc.xml + + + + diff --git a/README.md b/README.md index 3fd52aa..1730db6 100644 --- a/README.md +++ b/README.md @@ -1,82 +1,3 @@ # 简介 -这是个简单的教务系统网站,并且结合了图书订购功能,希望这个小DEMO能对大家学习有帮助 - -# 使用技术 - -IoC容器:spring - -web框架:springmvc - -orm框架:mybatis - -安全框架:shiro - -数据源:dbcp2 - -日志: sl4j - -Json: Gson - -前端框架:Bootstrap - -# 修改 - -# 起步: - -1.初始化项目 - -1)下载Mysql,创建一个数据库名字为giit,导入create.sql与populate.sql,直接运行其中sql即可 - -2)下载Tomcat - -3)使用Intellij Idea导入项目,之后配置项目启动方式,使用刚才下载好的Tomcat - -4)运行 - -![image](https://pic4.zhimg.com/v2-87231f2eb533cdab3d3e04c7a89457af_b.png) - -# 使用简介: - -1.权限介绍: - -根据导入的populate.sql,运行网站初始时会存在四个权限角色: - -1).管理员,账号为admin - -2).学生,账号为student - -3).教师,账号为teache - -4).供应商,账号为supplier - -*密码均为123456* - -# 功能介绍: -## 1.基本信息功能: -其中可以设置一些基本的学校信息,也就是数据库中的实体-关系,之后就可以基于这些基本的关系信息进行更加复杂的功能,例如选课后可以记录多少学生选择了这门课程,只会教师提交图书后计算图书总数可以通过其中的关系得到 - -1)系部信息 - -2)专业信息 - -3)班级信息 - -4)课程信息 - -5)学生管理 - -![image](https://pic1.zhimg.com/v2-44688d7a989ae25d9db6767a50a208f8_b.png) - - -## 2.图书管理功能: -1)教师上传图书 - -2)秘书审批图书 - -3)查看已审核图书 - -![image](https://pic3.zhimg.com/v2-3ff2f0da17e8609f85da3b61671cf0de_b.png) - -# 数据库表结构: -![image](http://7xi78h.com1.z0.glb.clouddn.com/db.png) +无 diff --git a/pom.xml b/pom.xml index 49e749a..12b298a 100644 --- a/pom.xml +++ b/pom.xml @@ -11,11 +11,18 @@ http://maven.apache.org - 4.3.7.RELEASE + 4.1.5.RELEASE 1.4.0-RC2 + 3.15 + 2.8.7 + 5.22.0 + + Activiti + https://maven.alfresco.com/nexus/content/groups/public/ + maven-net-cn Maven China Mirror @@ -41,6 +48,60 @@ hamcrest-core 1.3 + + + + + + + org.apache.poi + poi + ${poi.version} + + + org.apache.poi + poi-excelant + ${poi.version} + + + org.apache.poi + poi-ooxml + ${poi.version} + + + org.apache.poi + poi-ooxml-schemas + ${poi.version} + + + org.apache.poi + poi-scratchpad + ${poi.version} + @@ -102,6 +163,16 @@ + + org.springframework + spring-context + ${spring.version} + + + org.springframework + spring-orm + ${spring.version} + org.springframework spring-context-support @@ -175,16 +246,22 @@ jcl-over-slf4j 1.7.12 + + + com.github.pagehelper + pagehelper + 4.1.6 + + + com.github.jsqlparser + jsqlparser + 0.9.6 + - - org.bgee.log4jdbc-log4j2 - log4jdbc-log4j2-jdbc4.1 - 1.16 - org.slf4j slf4j-api @@ -195,11 +272,6 @@ log4j 1.2.17 - - org.apache.logging.log4j - log4j-core - 2.3 - org.slf4j slf4j-log4j12 @@ -233,11 +305,6 @@ - - commons-collections - commons-collections - 3.2.2 - commons-lang commons-lang @@ -255,6 +322,11 @@ gson 2.6 + + com.alibaba + fastjson + 1.2.8 + @@ -263,7 +335,33 @@ 1.3.1 + + + org.apache.commons + commons-lang3 + 3.3.2 + + + com.enterprisedt + edtFTPj + 1.5.3 + + + org.codehaus.mojo + animal-sniffer-annotations + 1.15 + + + com.google.code.findbugs + jsr305 + 3.0.1 + + + com.google.errorprone + error_prone_annotations + 2.0.19 + diff --git a/src/main/java/com/entity/Agent.java b/src/main/java/com/entity/Agent.java new file mode 100644 index 0000000..d7dcca8 --- /dev/null +++ b/src/main/java/com/entity/Agent.java @@ -0,0 +1,116 @@ +package com.entity; + +import java.io.Serializable; +import java.util.List; + +import org.apache.commons.lang.StringUtils; + +import com.entity.enumeration.AgentLevel; +import com.google.common.collect.Lists; + +public class Agent implements Serializable{ + private static final long serialVersionUID = 4678225051291399613L; + private Long id; + private String openid; + private AgentLevel level; + private String agentName; + private List userIds; + private String userIdsStr; + private String area; + + private volatile String usernames; + + public Agent() { + super(); + } + + public Agent(AgentLevel level, String agentName, String area, String openid) { + super(); + this.level = level; + this.agentName = agentName; + this.area = area; + this.openid = openid; + } + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public AgentLevel getLevel() { + return level; + } + + public void setLevel(AgentLevel level) { + this.level = level; + } + + public String getOpenid() { + return openid; + } + + public void setOpenid(String openid) { + this.openid = openid; + } + + public String getAgentName() { + return agentName; + } + + public void setAgentName(String agentName) { + this.agentName = agentName; + } + + public List getUserIds() { + return userIds; + } + + public void setUserIds(List userIds) { + this.userIds = userIds; + StringBuffer buff = new StringBuffer(); + for(String id : userIds) { + buff.append(id).append(','); + } + this.userIdsStr = buff.toString(); + } + + public String getUserIdsStr() { + return userIdsStr; + } + + public void setUserIdsStr(String userIdsStr) { + this.userIdsStr = userIdsStr; + this.userIds = Lists.newArrayList(); + if(!StringUtils.isEmpty(userIdsStr)) { + String[] ids = userIdsStr.split(","); + for(String id : ids) { + this.userIds.add(id); + } + } + } + + public String getArea() { + return area; + } + + public void setArea(String area) { + this.area = area; + } + + public String getUsernames() { + return usernames; + } + + public void setUsernames(String usernames) { + this.usernames = usernames; + } + + @Override + public String toString() { + return "Agent [id=" + id + ", level=" + level + ", agentName=" + + agentName + ", userIds=" + userIds + ", area=" + area + "]"; + } +} diff --git a/src/main/java/com/entity/Area.java b/src/main/java/com/entity/Area.java new file mode 100644 index 0000000..6d46248 --- /dev/null +++ b/src/main/java/com/entity/Area.java @@ -0,0 +1,25 @@ +package com.entity; + +import java.io.Serializable; + +public class Area implements Serializable { + private static final long serialVersionUID = 8852738152430122859L; + private Long id; + private String area; + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + public String getArea() { + return area; + } + public void setArea(String area) { + this.area = area; + } + @Override + public String toString() { + return "Area [id=" + id + ", area=" + area + "]"; + } +} diff --git a/src/main/java/com/entity/Car.java b/src/main/java/com/entity/Car.java index 8f9c783..e85a764 100644 --- a/src/main/java/com/entity/Car.java +++ b/src/main/java/com/entity/Car.java @@ -20,6 +20,19 @@ public class Car implements Serializable{ @NotEmpty private Integer weight; + public Car() { + super(); + } + public Car(String carId,Boolean isSale, Integer high, + Integer length, Integer wide, Integer weight) { + super(); + this.isSale = isSale; + this.carId = carId; + this.high = high; + this.length = length; + this.wide = wide; + this.weight = weight; + } public Long getId() { return id; } diff --git a/src/main/java/com/entity/FileInfo.java b/src/main/java/com/entity/FileInfo.java new file mode 100644 index 0000000..ccc03fe --- /dev/null +++ b/src/main/java/com/entity/FileInfo.java @@ -0,0 +1,78 @@ +package com.entity; + +import java.io.Serializable; + +public class FileInfo implements Serializable { + private static final long serialVersionUID = 3517465238526255583L; + private Long id; + private String fileName; + private String filePath; + private String fileType; + private String originalFilename; + private String uuid; + private String uploadTime; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getFileName() { + return fileName; + } + + public void setFileName(String fileName) { + this.fileName = fileName; + } + + public String getFilePath() { + return filePath; + } + + public void setFilePath(String filePath) { + this.filePath = filePath; + } + + public String getUploadTime() { + return uploadTime; + } + + public void setUploadTime(String uploadTime) { + this.uploadTime = uploadTime; + } + + public String getFileType() { + return fileType; + } + + public void setFileType(String fileType) { + this.fileType = fileType; + } + + public String getOriginalFilename() { + return originalFilename; + } + + public void setOriginalFilename(String originalFilename) { + this.originalFilename = originalFilename; + } + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + @Override + public String toString() { + return "FileInfo [id=" + id + ", fileName=" + fileName + ", filePath=" + + filePath + ", uploadTime=" + uploadTime + ", fileType=" + + fileType + ", originalFilename=" + originalFilename + + ", uuid=" + uuid + "]"; + } +} diff --git a/src/main/java/com/entity/Order.java b/src/main/java/com/entity/Order.java new file mode 100644 index 0000000..7d2c4de --- /dev/null +++ b/src/main/java/com/entity/Order.java @@ -0,0 +1,81 @@ +package com.entity; + +import java.io.Serializable; +import java.util.Date; + +import com.entity.enumeration.OrderType; +import com.entity.enumeration.Status; + +public class Order implements Serializable{ + private static final long serialVersionUID = -2545303099330416597L; + private Long id; + private String openid; + private String carId; + private Integer carCnt; + private Double price; + private Status status; + private OrderType orderType; + private Date startTime; + private Date deliverTime; + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + public String getOpenid() { + return openid; + } + public void setOpenid(String openid) { + this.openid = openid; + } + public String getCarId() { + return carId; + } + public void setCarId(String carId) { + this.carId = carId; + } + public Integer getCarCnt() { + return carCnt; + } + public void setCarCnt(Integer carCnt) { + this.carCnt = carCnt; + } + public Double getPrice() { + return price; + } + public void setPrice(Double price) { + this.price = price; + } + public Status getStatus() { + return status; + } + public void setStatus(Status status) { + this.status = status; + } + public OrderType getOrderType() { + return orderType; + } + public void setOrderType(OrderType orderType) { + this.orderType = orderType; + } + public Date getStartTime() { + return startTime; + } + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + public Date getDeliverTime() { + return deliverTime; + } + public void setDeliverTime(Date deliverTime) { + this.deliverTime = deliverTime; + } + @Override + public String toString() { + return "Order [id=" + id + ", openid=" + openid + ", carId=" + carId + + ", carCnt=" + carCnt + ", price=" + price + ", status=" + + status + ", orderType=" + orderType + ", startTime=" + + startTime + ", deliverTime=" + deliverTime + "]"; + } +} diff --git a/src/main/java/com/entity/Procurement.java b/src/main/java/com/entity/Procurement.java new file mode 100644 index 0000000..20e46f6 --- /dev/null +++ b/src/main/java/com/entity/Procurement.java @@ -0,0 +1,130 @@ +package com.entity; + +import java.io.Serializable; +import java.util.Date; + +import org.hibernate.validator.constraints.NotEmpty; + +public class Procurement implements Serializable{ + private static final long serialVersionUID = 6534271072663770032L; + private Long id; + @NotEmpty + private String procureId; + @NotEmpty + private Integer inventory; + @NotEmpty + private Integer startInventory; + @NotEmpty + private Integer endInventory; + @NotEmpty + private Integer price; + @NotEmpty + private Integer startPrice; + @NotEmpty + private Integer endPrice; + @NotEmpty + private String procureTime; + @NotEmpty + private Date startTime; + @NotEmpty + private Date endTime; + + private String procureFilePath; + private String procureFileName; + + public String getProcureFilePath() { + return procureFilePath; + } + public void setProcureFilePath(String procureFilePath) { + this.procureFilePath = procureFilePath; + } + public String getProcureFileName() { + return procureFileName; + } + public void setProcureFileName(String procureFileName) { + this.procureFileName = procureFileName; + } + public Procurement() { + super(); + } + public Procurement(String carId,Boolean isSale, Integer high, + Integer length, Integer wide, Integer weight) { + super(); + this.procureId = procureId; + this.inventory = inventory; + this.price = price; + this.procureTime = procureTime; + } + public Integer getStartInventory() { + return startInventory; + } + public void setStartInventory(Integer startInventory) { + this.startInventory = startInventory; + } + public Integer getEndInventory() { + return endInventory; + } + public void setEndInventory(Integer endInventory) { + this.endInventory = endInventory; + } + public Integer getStartPrice() { + return startPrice; + } + public void setStartPrice(Integer startPrice) { + this.startPrice = startPrice; + } + public Integer getEndPrice() { + return endPrice; + } + public void setEndPrice(Integer endPrice) { + this.endPrice = endPrice; + } + + public Date getStartTime() { + return startTime; + } + public void setStartTime(Date startTime) { + this.startTime = startTime; + } + public Date getEndTime() { + return endTime; + } + public void setEndTime(Date endTime) { + this.endTime = endTime; + } + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + public String getProcureId() { + return procureId; + } + public void setProcureId(String procureId) { + this.procureId = procureId; + } + public Integer getInventory() { + return inventory; + } + public void setInventory(Integer inventory) { + this.inventory = inventory; + } + public Integer getPrice() { + return price; + } + public void setPrice(Integer price) { + this.price = price; + } + public String getProcureTime() { + return procureTime; + } + public void setProcureTime(String procureTime) { + this.procureTime = procureTime; + } + @Override + public String toString() { + return "Procurement [id=" + id + ", procureId=" + procureId + ", inventory=" + inventory + + ", price=" + price + ", procureTime=" + procureTime + "]"; + } +} diff --git a/src/main/java/com/entity/User.java b/src/main/java/com/entity/User.java index 797ef46..4092a5b 100644 --- a/src/main/java/com/entity/User.java +++ b/src/main/java/com/entity/User.java @@ -1,17 +1,13 @@ package com.entity; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import org.hibernate.validator.constraints.NotBlank; -import org.springframework.util.CollectionUtils; import org.springframework.util.StringUtils; -/** - * Created by c0de8ug on 16-2-9. - */ public class User { - String username; //用户名 @NotBlank String userId; @@ -20,6 +16,7 @@ public class User { String salt; private List roleIds; //拥有的角色列表 private String roleIdsStr; + private String roleDesc; private Boolean locked = Boolean.FALSE; @@ -55,7 +52,15 @@ public List getRoleIds() { return roleIds; } - public void setRoleIds(List roleIds) { + public String getRoleDesc() { + return roleDesc; + } + + public void setRoleDesc(String roleDesc) { + this.roleDesc = roleDesc; + } + + public void setRoleIds(List roleIds) { this.roleIds = roleIds; StringBuilder s = new StringBuilder(); int i = 0; @@ -82,7 +87,7 @@ public void setSalt(String salt) { } public String getCredentialsSalt() { - return username + salt; + return userId + salt; } public String[] getPasswords() { @@ -111,4 +116,13 @@ public void setRoleIdsStr(String roleIdsStr) { roleIds.add(Long.valueOf(roleIdStr)); } } + + @Override + public String toString() { + return "User [username=" + username + ", userId=" + userId + + ", password=" + password + ", passwords=" + + Arrays.toString(passwords) + ", salt=" + salt + ", roleIds=" + + roleIds + ", roleIdsStr=" + roleIdsStr + ", roleDesc=" + + roleDesc + ", locked=" + locked + "]"; + } } diff --git a/src/main/java/com/entity/Vendor.java b/src/main/java/com/entity/Vendor.java new file mode 100644 index 0000000..521cc54 --- /dev/null +++ b/src/main/java/com/entity/Vendor.java @@ -0,0 +1,77 @@ +package com.entity; + +import java.io.Serializable; + +public class Vendor implements Serializable { + private static final long serialVersionUID = -4471300730875048038L; + private Long id; + private String vendorName; + private String contact; + private String url; + private String address; + private String telephone; + private String phone; + private String email; + private Long attachId; + public Long getId() { + return id; + } + public void setId(Long id) { + this.id = id; + } + public String getVendorName() { + return vendorName; + } + public void setVendorName(String vendorName) { + this.vendorName = vendorName; + } + public String getContact() { + return contact; + } + public void setContact(String contact) { + this.contact = contact; + } + public String getUrl() { + return url; + } + public void setUrl(String url) { + this.url = url; + } + public String getAddress() { + return address; + } + public void setAddress(String address) { + this.address = address; + } + public String getTelephone() { + return telephone; + } + public void setTelephone(String telephone) { + this.telephone = telephone; + } + public String getPhone() { + return phone; + } + public void setPhone(String phone) { + this.phone = phone; + } + public Long getAttachId() { + return attachId; + } + public void setAttachId(Long attachId) { + this.attachId = attachId; + } + public String getEmail() { + return email; + } + public void setEmail(String email) { + this.email = email; + } + @Override + public String toString() { + return "Vendor [id=" + id + ", vendorName=" + vendorName + ", contact=" + + contact + ", url=" + url + ", address=" + address + + ", telephone=" + telephone + ", phone=" + phone + ", email=" + + email + ", attachId=" + attachId + "]"; + } +} diff --git a/src/main/java/com/entity/enumeration/AgentLevel.java b/src/main/java/com/entity/enumeration/AgentLevel.java new file mode 100644 index 0000000..2de0a37 --- /dev/null +++ b/src/main/java/com/entity/enumeration/AgentLevel.java @@ -0,0 +1,42 @@ +package com.entity.enumeration; + +import org.springframework.util.StringUtils; + +public enum AgentLevel { + VIP("VIP",0,Integer.MAX_VALUE),NORMAL("普通",0,2000),NOCARE("不关注",2000,5000); + private String name; + private Integer minPrice; + private Integer maxPrice; + AgentLevel(String name,Integer minPrice,Integer maxPrice) { + this.name = name; + this.minPrice=minPrice; + this.maxPrice=maxPrice; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + public Integer getMinPrice() { + return minPrice; + } + public void setMinPrice(Integer minPrice) { + this.minPrice = minPrice; + } + public Integer getMaxPrice() { + return maxPrice; + } + public void setMaxPrice(Integer maxPrice) { + this.maxPrice = maxPrice; + } + public static AgentLevel parse(String text) { + if(!StringUtils.isEmpty(text)) { + for(AgentLevel entry : AgentLevel.values()) { + if(entry.getName().equals(text)) + return entry; + } + } + return null; + } +} \ No newline at end of file diff --git a/src/main/java/com/entity/enumeration/OrderType.java b/src/main/java/com/entity/enumeration/OrderType.java new file mode 100644 index 0000000..571d74f --- /dev/null +++ b/src/main/java/com/entity/enumeration/OrderType.java @@ -0,0 +1,29 @@ +package com.entity.enumeration; + +import org.springframework.util.StringUtils; + + +public enum OrderType { + DISTRIBUTION("分销订单"),DISTRIBUTION_REJECTED("分销退货订单"),DISTRIBUTION_EXCHANGE("分销换货订单"); + + private String name; + OrderType(String name) { + this.name = name; + } + public String getName() { + return name; + } + public void setName(String name) { + this.name = name; + } + + public static AgentLevel parse(String text) { + if(!StringUtils.isEmpty(text)) { + for(AgentLevel entry : AgentLevel.values()) { + if(entry.getName().equals(text)) + return entry; + } + } + return null; + } +} \ No newline at end of file diff --git a/src/main/java/com/entity/enumeration/Status.java b/src/main/java/com/entity/enumeration/Status.java new file mode 100644 index 0000000..54dfc6d --- /dev/null +++ b/src/main/java/com/entity/enumeration/Status.java @@ -0,0 +1,6 @@ +package com.entity.enumeration; + + +public enum Status { + START,END,UNAUDIT,AUDIT,NON_PAYMENT,PAYMENT,NOT_DISTRIBUTION,DISTRIBUTION; +} \ No newline at end of file diff --git a/src/main/java/com/entity/vo/UserVo.java b/src/main/java/com/entity/vo/UserVo.java deleted file mode 100644 index a6ec348..0000000 --- a/src/main/java/com/entity/vo/UserVo.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.entity.vo; - -import com.entity.User; - -/** - * Created by c0de8ug on 16-2-21. - */ -public class UserVo extends User { - String roleIdsStr; - - @Override - public String getRoleIdsStr() { - return roleIdsStr; - } - - @Override - public void setRoleIdsStr(String roleIdsStr) { - this.roleIdsStr = roleIdsStr; - } -} diff --git a/src/main/java/com/realm/UserRealm.java b/src/main/java/com/realm/UserRealm.java index 27e724f..896e6a0 100644 --- a/src/main/java/com/realm/UserRealm.java +++ b/src/main/java/com/realm/UserRealm.java @@ -37,11 +37,11 @@ public class UserRealm extends AuthorizingRealm { @Override protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) { - String username = (String)principals.getPrimaryPrincipal(); + String userid = (String)principals.getPrimaryPrincipal(); SimpleAuthorizationInfo authorizationInfo = new SimpleAuthorizationInfo(); - authorizationInfo.setRoles(userBiz.findRoles(username)); - if("admin".equals(username)) { + authorizationInfo.setRoles(userBiz.findRoles(userid)); + if("admin".equals(userid)) { List list = resourceBiz.findAll(); Set set = Sets.newHashSet(); for(Resource r : list) { @@ -49,7 +49,7 @@ protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principal } authorizationInfo.setStringPermissions(set); } else { - authorizationInfo.setStringPermissions(userBiz.findPermissions(username)); + authorizationInfo.setStringPermissions(userBiz.findPermissions(userid)); } return authorizationInfo; } @@ -57,9 +57,9 @@ protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principal @Override protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) throws AuthenticationException { UsernamePasswordToken token = (UsernamePasswordToken) authcToken; - String username = token.getUsername(); + String userid = token.getUsername(); - User user = userBiz.findByUsername(username); + User user = userBiz.findById(userid); if(user == null) { throw new UnknownAccountException();//没找到帐号 diff --git a/src/main/java/com/system/controller/LoginController.java b/src/main/java/com/system/controller/LoginController.java index cc70b4d..a71e058 100644 --- a/src/main/java/com/system/controller/LoginController.java +++ b/src/main/java/com/system/controller/LoginController.java @@ -43,16 +43,6 @@ public String login(HttpServletRequest req, ModelMap modelMap, HttpSession sessi String principal = (String) subject.getPrincipal(); session.setAttribute("username", principal); return "/admin/main"; - /* switch (principal) { - case "admin": - return "/admin/main"; - case "teacher": - return "/teacher/main"; - case "student": - return "/student/main"; - case "supplier": - return "redirect:supplier.do/supplier.view"; - }*/ } return "forward:login.jsp"; diff --git a/src/main/java/com/system/controller/MainController.java b/src/main/java/com/system/controller/MainController.java index df61971..c461fe8 100644 --- a/src/main/java/com/system/controller/MainController.java +++ b/src/main/java/com/system/controller/MainController.java @@ -3,10 +3,6 @@ import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; -/** - * Created by c0de8ug on 16-2-16. - */ - @Controller @RequestMapping("main.do") public class MainController { @@ -15,14 +11,4 @@ public class MainController { public String adminMainView() { return "/admin/main"; } - - @RequestMapping("student") - public String studentMainView() { - return "/student/main"; - } - - @RequestMapping("teacher") - public String teacherMainView() { - return "/teacher/main"; - } } diff --git a/src/main/java/com/system/controller/ResourceController.java b/src/main/java/com/system/controller/ResourceController.java index 1e23175..765d330 100644 --- a/src/main/java/com/system/controller/ResourceController.java +++ b/src/main/java/com/system/controller/ResourceController.java @@ -1,49 +1,75 @@ package com.system.controller; +import java.util.List; + import org.apache.log4j.Logger; -import org.apache.shiro.authz.annotation.RequiresRoles; +import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.mvc.support.RedirectAttributes; +import com.entity.Resource; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; import com.system.service.ResourceBiz; -/** - * Created by c0de8ug on 16-2-21. - */ @Controller - @RequestMapping("/resource.do") public class ResourceController { Logger log = Logger.getLogger(ResourceController.class); @Autowired private ResourceBiz resourceBiz; - - @RequiresRoles("admin") + + @RequiresPermissions("resource:query") @RequestMapping("resource.view") public String resourceView(Model model) { - model.addAttribute("resourceList",resourceBiz.findAll()); + return "forward:/resource.do/resource.view/0/10"; + } + + @RequiresPermissions("resource:query") + @RequestMapping("resource.view/{pageNum}/{pageSize}") + public String resourceView(Model model,@PathVariable("pageNum") int pageNum, + @PathVariable("pageSize") int pageSize) { + PageHelper.startPage(pageNum, pageSize); + List resourceList = resourceBiz.findAll(); + PageInfo page = new PageInfo(resourceList); + model.addAttribute("resourceList",resourceList); + model.addAttribute("page",page); return "/admin/system/resource/resource"; } - @RequiresRoles("admin") + @RequiresPermissions("resource:add") @RequestMapping("resource_add.view") public String resourceAddView(Model model) { - model.addAttribute("resourceList", resourceBiz.findAll()); return "/admin/system/resource/resource_add"; } - - @RequiresRoles("admin") + + @RequiresPermissions("resource:add") @RequestMapping("add") public String add(com.entity.Resource resource, RedirectAttributes redirectAttributes) { resourceBiz.createResource(resource); return "redirect:/resource.do/resource.view"; } + + @RequiresPermissions("resource:update") + @RequestMapping("resource_update.view") + public String resourceUpdateView(Long id,Model model) { + model.addAttribute("resource", resourceBiz.findOne(id)); + return "/admin/system/resource/resource_update"; + } + + @RequiresPermissions("resource:update") + @RequestMapping("update") + public String update(com.entity.Resource resource, RedirectAttributes redirectAttributes) { + resourceBiz.updateResource(resource); + return "redirect:/resource.do/resource.view"; + } - @RequiresRoles("admin") + @RequiresPermissions("resource:delete") @RequestMapping("delete") public String delete(Long id, RedirectAttributes redirectAttributes) { resourceBiz.deleteResource(id); diff --git a/src/main/java/com/system/controller/RoleController.java b/src/main/java/com/system/controller/RoleController.java index a5d1d73..ca162fa 100644 --- a/src/main/java/com/system/controller/RoleController.java +++ b/src/main/java/com/system/controller/RoleController.java @@ -1,13 +1,18 @@ package com.system.controller; -import org.apache.shiro.authz.annotation.RequiresRoles; +import java.util.List; + +import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.mvc.support.RedirectAttributes; import com.entity.Role; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; import com.system.service.ResourceBiz; import com.system.service.RoleBiz; @@ -25,22 +30,33 @@ public class RoleController { @Autowired private ResourceBiz resourceBiz; - - @RequiresRoles("admin") + + @RequiresPermissions("role:query") @RequestMapping("role.view") public String roleView(Model model) { - model.addAttribute("roleList", roleBiz.findAll()); + return "forward:/role.do/role.view/0/10"; + } + + @RequiresPermissions("role:query") + @RequestMapping("role.view/{pageNum}/{pageSize}") + public String roleView(Model model,@PathVariable("pageNum") int pageNum, + @PathVariable("pageSize") int pageSize) { + PageHelper.startPage(pageNum, pageSize); + List list = roleBiz.findAll(); + PageInfo page = new PageInfo(list); + model.addAttribute("roleList",list); + model.addAttribute("page",page); return "/admin/system/role/role"; } - @RequiresRoles("admin") + @RequiresPermissions("role:add") @RequestMapping("role_add.view") public String roleAddView(Model model) { model.addAttribute("resourceList", resourceBiz.findAll()); return "/admin/system/role/role_add"; } - @RequiresRoles("admin") + @RequiresPermissions("role:update") @RequestMapping("role_update.view") public String roleUpdateView(Long id,Model model) { model.addAttribute("role", roleBiz.findOne(id)); @@ -48,67 +64,24 @@ public String roleUpdateView(Long id,Model model) { return "/admin/system/role/role_update"; } - @RequiresRoles("admin") + @RequiresPermissions("role:add") @RequestMapping("add") public String add(Role role, RedirectAttributes redirectAttributes) { roleBiz.createRole(role); return "redirect:/role.do/role.view"; } - @RequiresRoles("admin") + @RequiresPermissions("role:update") @RequestMapping("update") public String update(Role role, RedirectAttributes redirectAttributes) { roleBiz.updateRole(role); return "redirect:/role.do/role.view"; } - @RequiresRoles("admin") + @RequiresPermissions("role:delete") @RequestMapping("delete") public String delete(Long id, RedirectAttributes redirectAttributes) { roleBiz.deleteRole(id); return "redirect:/role.do/role.view"; } - -// -// @RequiresPermissions("role:create") -// @RequestMapping(value = "/create", method = RequestMethod.GET) -// public String showCreateForm(Model model) { -// setCommonData(model); -// model.addAttribute("role", new Role()); -// model.addAttribute("op", "新增"); -// return "role/edit"; -// } -// -// @RequiresPermissions("role:update") -// @RequestMapping(value = "/{id}/update", method = RequestMethod.GET) -// public String showUpdateForm(@PathVariable("id") Long id, Model model) { -// setCommonData(model); -// model.addAttribute("role", roleBiz.findOne(id)); -// model.addAttribute("op", "修改"); -// return "role/edit"; -// } -// -// @RequiresPermissions("role:update") -// @RequestMapping(value = "/{id}/update", method = RequestMethod.POST) -// public String update(Role role, RedirectAttributes redirectAttributes) { -// roleBiz.updateRole(role); -// redirectAttributes.addFlashAttribute("msg", "修改成功"); -// return "redirect:/role"; -// } -// -// @RequiresPermissions("role:delete") -// @RequestMapping(value = "/{id}/delete", method = RequestMethod.GET) -// public String showDeleteForm(@PathVariable("id") Long id, Model model) { -// setCommonData(model); -// model.addAttribute("role", roleBiz.findOne(id)); -// model.addAttribute("op", "删除"); -// return "role/edit"; -// } - - -// private void setCommonData(Model model) { -// model.addAttribute("resourceList", roleBiz.findAll()); -// } - - } diff --git a/src/main/java/com/system/controller/UserController.java b/src/main/java/com/system/controller/UserController.java index 4705d5f..3e70f6e 100644 --- a/src/main/java/com/system/controller/UserController.java +++ b/src/main/java/com/system/controller/UserController.java @@ -1,23 +1,22 @@ package com.system.controller; import java.lang.reflect.InvocationTargetException; +import java.util.List; -import org.apache.shiro.authz.annotation.RequiresRoles; +import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import com.entity.User; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; import com.system.service.RoleBiz; import com.system.service.UserBiz; -/** - * Created by c0de8ug on 16-2-9. - */ - @Controller -@RequiresRoles("admin") @RequestMapping("user.do") public class UserController { @@ -26,22 +25,33 @@ public class UserController { @Autowired private RoleBiz roleBiz; - - @RequiresRoles("admin") + + @RequiresPermissions("user:query") @RequestMapping("user.view") - public String userView(Model m) throws InvocationTargetException, IllegalAccessException { - m.addAttribute("userList", userBiz.findAll()); + public String userView(Model model) { + return "forward:/user.do/user.view/0/10"; + } + + @RequiresPermissions("user:query") + @RequestMapping("user.view/{pageNum}/{pageSize}") + public String userView(Model m,@PathVariable("pageNum") int pageNum, + @PathVariable("pageSize") int pageSize) throws InvocationTargetException, IllegalAccessException { + PageHelper.startPage(pageNum, pageSize); + List list = userBiz.findAll(); + PageInfo page = new PageInfo(list); + m.addAttribute("userList",list); + m.addAttribute("page",page); return "/admin/system/user/user"; } - @RequiresRoles("admin") + @RequiresPermissions("user:add") @RequestMapping("user_add.view") public String userAddView(Model m) { m.addAttribute("roleList", roleBiz.findAll()); return "/admin/system/user/user_add"; } - @RequiresRoles("admin") + @RequiresPermissions("user:add") @RequestMapping("findById") public String findById(String id, Model m) { m.addAttribute("user", userBiz.findById(id)); @@ -49,14 +59,14 @@ public String findById(String id, Model m) { return "/admin/system/user/user_update"; } - @RequiresRoles("admin") + @RequiresPermissions("user:update") @RequestMapping("update") public String update(User user) { userBiz.update(user); return "redirect:/user.do/user.view"; } - @RequiresRoles("admin") + @RequiresPermissions("user:add") @RequestMapping("add") public String add(User user) { @@ -64,7 +74,7 @@ public String add(User user) { return "redirect:/user.do/user.view"; } - @RequiresRoles("admin") + @RequiresPermissions("user:delete") @RequestMapping("delete") public String delete(String id) { userBiz.delete(id); diff --git a/src/main/java/com/system/dao/ResourceDao.java b/src/main/java/com/system/dao/ResourceDao.java index e223b0f..f1ce376 100644 --- a/src/main/java/com/system/dao/ResourceDao.java +++ b/src/main/java/com/system/dao/ResourceDao.java @@ -5,21 +5,15 @@ import com.entity.Resource; -/** - *

Resource: Zhang Kaitao - *

Date: 14-1-28 - *

Version: 1.0 - */ public interface ResourceDao { public void createResource(Resource resource); - public Resource updateResource(Resource resource); + public void updateResource(Resource resource); public void deleteResource(Long resourceId); Resource findOne(Long resourceId); List findAll(); - } diff --git a/src/main/java/com/system/dao/UserDao.java b/src/main/java/com/system/dao/UserDao.java index c8fbc04..e4e6c96 100644 --- a/src/main/java/com/system/dao/UserDao.java +++ b/src/main/java/com/system/dao/UserDao.java @@ -24,5 +24,5 @@ public interface UserDao { public void updatePassword(@Param("userId") String id, @Param("password") String password); - User findByUsername(String username); + public List findByRole(String role); } diff --git a/src/main/java/com/system/interceptor/BreadcrumbIntercepter.java b/src/main/java/com/system/interceptor/BreadcrumbIntercepter.java index 89189cd..799ccad 100644 --- a/src/main/java/com/system/interceptor/BreadcrumbIntercepter.java +++ b/src/main/java/com/system/interceptor/BreadcrumbIntercepter.java @@ -20,14 +20,11 @@ import com.google.common.collect.Lists; import com.system.model.Breadcrumb; -/** - * Created by c0de8ug on 16-2-14. - */ public class BreadcrumbIntercepter implements HandlerInterceptor { private Logger log = Logger.getLogger(BreadcrumbIntercepter.class); private Properties properties; //private Pattern p1 = Pattern.compile("[//\\a-zA-Z]+?(? breadcrumbs = (List)session.getAttribute("breadcrumbs"); Matcher matcher = pc.matcher(url); @@ -65,7 +62,7 @@ public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletRespo return true; } - if(url.matches("[//\\a-zA-Z]+?(?User: Zhang Kaitao - *

Date: 14-1-28 - *

Version: 1.0 - */ public interface ResourceBiz { public void createResource(Resource resource); - public Resource updateResource(Resource resource); + public void updateResource(Resource resource); public void deleteResource(Long resourceId); Resource findOne(Long resourceId); diff --git a/src/main/java/com/system/service/UserBiz.java b/src/main/java/com/system/service/UserBiz.java index 025d623..a498b52 100644 --- a/src/main/java/com/system/service/UserBiz.java +++ b/src/main/java/com/system/service/UserBiz.java @@ -1,18 +1,17 @@ package com.system.service; -import com.entity.User; -import com.entity.vo.UserVo; - import java.lang.reflect.InvocationTargetException; import java.util.List; import java.util.Set; +import com.entity.User; + /** * Created by c0de8ug on 16-2-9. */ public interface UserBiz { - public List findAll() throws InvocationTargetException, IllegalAccessException; + public List findAll() throws InvocationTargetException, IllegalAccessException; public User findById(String id); @@ -25,9 +24,9 @@ public interface UserBiz { public void changePassword(String userId, String newPassword); - public User findByUsername(String username); - public Set findRoles(String username); public Set findPermissions(String username); + + public List findByRole(String string); } diff --git a/src/main/java/com/system/service/impl/ResourceBizImpl.java b/src/main/java/com/system/service/impl/ResourceBizImpl.java index acba97e..9659a93 100644 --- a/src/main/java/com/system/service/impl/ResourceBizImpl.java +++ b/src/main/java/com/system/service/impl/ResourceBizImpl.java @@ -14,11 +14,6 @@ import com.system.dao.ResourceDao; import com.system.service.ResourceBiz; -/** - *

User: Zhang Kaitao - *

Date: 14-2-14 - *

Version: 1.0 - */ @Service public class ResourceBizImpl implements ResourceBiz { @@ -31,8 +26,8 @@ public void createResource(Resource resource) { } @Override - public Resource updateResource(Resource resource) { - return resourceDao.updateResource(resource); + public void updateResource(Resource resource) { + resourceDao.updateResource(resource); } @Override diff --git a/src/main/java/com/system/service/impl/UserBizImpl.java b/src/main/java/com/system/service/impl/UserBizImpl.java index 7d59d2b..95fb9e6 100644 --- a/src/main/java/com/system/service/impl/UserBizImpl.java +++ b/src/main/java/com/system/service/impl/UserBizImpl.java @@ -1,20 +1,17 @@ package com.system.service.impl; import java.lang.reflect.InvocationTargetException; -import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import java.util.Set; -import org.apache.commons.beanutils.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.entity.Role; import com.entity.User; -import com.entity.vo.UserVo; import com.system.dao.RoleDao; import com.system.dao.UserDao; import com.system.service.RoleBiz; @@ -40,11 +37,8 @@ public class UserBizImpl implements UserBiz { private RoleBiz roleBiz; @Override - public List findAll() throws InvocationTargetException, IllegalAccessException { - List userVoList = new ArrayList<>(); + public List findAll() throws InvocationTargetException, IllegalAccessException { List userList = userDao.findAll(); - - Iterator iterator = userList.iterator(); while (iterator.hasNext()) { @@ -52,9 +46,6 @@ public List findAll() throws InvocationTargetException, IllegalAccessExc User user = (User) iterator.next(); List roleIds = user.getRoleIds(); - UserVo userVo = new UserVo(); - BeanUtils.copyProperties(userVo, user); - if (roleIds != null) { int i = 0; int size = roleIds.size(); @@ -66,18 +57,18 @@ public List findAll() throws InvocationTargetException, IllegalAccessExc } Role role = roleDao.findOne(roleIds.get(i)); s.append(role.getDescription()); - userVo.setRoleIdsStr(s.toString()); + user.setRoleDesc(s.toString()); } - - - userVoList.add(userVo); - } - - return userVoList; + return userList; } @Override + public List findByRole(String role) { + return userDao.findByRole(role); + } + + @Override public User findById(String id) { return userDao.findById(id); } @@ -112,13 +103,8 @@ public void changePassword(String userId, String newPassword) { } @Override - public User findByUsername(String username) { - return userDao.findById(username); - } - - @Override - public Set findRoles(String username) { - User user = findByUsername(username); + public Set findRoles(String userid) { + User user = findById(userid); if (user == null) { return Collections.emptySet(); } @@ -126,8 +112,8 @@ public Set findRoles(String username) { } @Override - public Set findPermissions(String username) { - User user = findByUsername(username); + public Set findPermissions(String userid) { + User user = findById(userid); if (user == null) { return Collections.emptySet(); } diff --git a/src/main/java/com/util/Constant.java b/src/main/java/com/util/Constant.java new file mode 100644 index 0000000..6f54626 --- /dev/null +++ b/src/main/java/com/util/Constant.java @@ -0,0 +1,19 @@ +package com.util; + +/** + * 系统常量 + * + * @author wujuan + * + */ +public class Constant { + + public static final String MSG_ERROR = "-1"; + public static final String MSG_CONFLICT = "-2"; + public static final String MSG_OK = "0"; + + public static final String OK_SYS = "成功"; + public static final String ERROR_SYS = "系统错误"; + public static final String ERROR_ANALY = "json解析错误"; + +} diff --git a/src/main/java/com/util/FtpClient.java b/src/main/java/com/util/FtpClient.java new file mode 100644 index 0000000..662273d --- /dev/null +++ b/src/main/java/com/util/FtpClient.java @@ -0,0 +1,86 @@ +package com.util; + +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +import com.enterprisedt.net.ftp.FTPClient; +import com.enterprisedt.net.ftp.FTPConnectMode; +import com.enterprisedt.net.ftp.FTPException; +import com.enterprisedt.net.ftp.FTPTransferType; + +public class FtpClient { + private FTPClient ftpClient = null; + + public void connectServer(String server, String user, String password) throws IOException, FTPException { + if (ftpClient == null || !ftpClient.connected()) { + ftpClient = new FTPClient(); + ftpClient.setRemoteHost(server); + ftpClient.setTimeout(500000); + ftpClient.connect(); + ftpClient.login(user, password); + ftpClient.setConnectMode(FTPConnectMode.PASV); + ftpClient.setType(FTPTransferType.BINARY); + } + } + + public void changeDir(String path) { + if (path == null || path.equals("")) { + return; + } + String temp[] = path.split("/"); + for (int i = 0; i < temp.length; i++) { + try { + if (temp[i] == null || temp[i].equals("")) { + continue; + } + ftpClient.chdir(temp[i]); + } catch (FTPException fe) { + try { + ftpClient.mkdir(temp[i]); + ftpClient.chdir(temp[i]); + } catch (Exception e) { + + } + } catch (Exception ee) { + + } + } + } + + public void uploadFile(InputStream in, String filename) { + try { + ftpClient.put(in, filename); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void uploadFile(byte[] bytes, String filename) { + try { + ftpClient.put(bytes, filename); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void downLoad(OutputStream out, String filename) { + try { + ftpClient.get(out, filename); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public void close() { + try { + if (ftpClient != null && ftpClient.connected()) { + ftpClient.quit(); + ftpClient = null; + } + } catch (Exception e) { + e.printStackTrace(); + } + } + +} diff --git a/src/main/java/com/util/PasswordHelper.java b/src/main/java/com/util/PasswordHelper.java index b3da71b..06c41c4 100644 --- a/src/main/java/com/util/PasswordHelper.java +++ b/src/main/java/com/util/PasswordHelper.java @@ -32,6 +32,15 @@ public void setAlgorithmName(String algorithmName) { public void setHashIterations(int hashIterations) { this.hashIterations = hashIterations; } + + public static void main(String[] args) { + PasswordHelper ph = new PasswordHelper(); + User user = new User(); + user.setUserId("admin"); + user.setPassword("123456"); + ph.encryptPassword(user); + System.out.println(user); + } public void encryptPassword(User user) { diff --git a/src/main/java/com/util/ResultMapUtil.java b/src/main/java/com/util/ResultMapUtil.java new file mode 100644 index 0000000..12d6020 --- /dev/null +++ b/src/main/java/com/util/ResultMapUtil.java @@ -0,0 +1,40 @@ +package com.util; + +import java.util.Map; + +import org.apache.commons.lang.StringUtils; + +import com.google.common.collect.Maps; + +public class ResultMapUtil { + public static Map getSuccessMap() { + return getSuccessMap(null,null); + } + public static Map getSuccessMap(String msg) { + return getSuccessMap(msg,null); + } + public static Map getSuccessMap(Object obj) { + return getSuccessMap(null,obj); + } + public static Map getSuccessMap(String msg,Object obj) { + Map map = Maps.newHashMap(); + map.put("resultCode", Constant.MSG_OK); + map.put("resultMsg", Constant.OK_SYS); + if(!StringUtils.isEmpty(msg)) + map.put("resultMsg", msg); + if(obj!=null) + map.put("data", obj); + return map; + } + public static Map getFailMap() { + return getFailMap(null); + } + public static Map getFailMap(String msg) { + Map map = Maps.newHashMap(); + map.put("resultCode", Constant.MSG_ERROR); + map.put("resultMsg", Constant.ERROR_SYS); + if(!StringUtils.isEmpty(msg)) + map.put("resultMsg", msg); + return map; + } +} diff --git a/src/main/java/com/util/TaskJob.java b/src/main/java/com/util/TaskJob.java deleted file mode 100644 index f9612be..0000000 --- a/src/main/java/com/util/TaskJob.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.util; - -import org.springframework.scheduling.annotation.Scheduled; -import org.springframework.stereotype.Component; - -/** - * Created by c0de8ug on 16-2-15. - */ -//@Component -public class TaskJob { - //@Scheduled(cron = "0 0 0 1 * ?") - public void job() { - TermContainer.update(); - } -} diff --git a/src/main/java/com/util/Term.java b/src/main/java/com/util/Term.java deleted file mode 100644 index 9d24fea..0000000 --- a/src/main/java/com/util/Term.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.util; - - -/** - * Created by c0de8ug on 16-2-15. - */ -public class Term { - String val; - String text; - - public String getVal() { - return val; - } - - public void setVal(String val) { - this.val = val; - } - - public String getText() { - return text; - } - - public void setText(String text) { - this.text = text; - } -} diff --git a/src/main/java/com/util/TermContainer.java b/src/main/java/com/util/TermContainer.java deleted file mode 100644 index 2b8ca70..0000000 --- a/src/main/java/com/util/TermContainer.java +++ /dev/null @@ -1,83 +0,0 @@ -package com.util; - -import java.util.ArrayList; -import java.util.Date; -import java.util.GregorianCalendar; -import java.util.HashMap; -import java.util.List; - -import org.springframework.stereotype.Component; - -/** - * Created by c0de8ug on 16-2-15. - */ -@Component -public class TermContainer { - static List termList; - static Date beginTime; - static HashMap map = new HashMap<>(); - final static String lastTermStr = "上学期"; - final static String nextTermStr = "下学期"; - - String lastSemester = "2,3,4,5,6,7,8"; - String nextSemester = "1,9,10,11,12"; - - TermContainer() { - - - for (String temp : lastSemester.split(",")) { - map.put(temp, lastTermStr); - } - for (String temp : nextSemester.split(",")) { - map.put(temp, nextTermStr); - } - beginTime = new GregorianCalendar(2014,1,1).getTime(); - update(); - } - - public static void update() { - termList = new ArrayList<>(); - - Date today = new Date(); - - - int beginYear = beginTime.getYear(); - int todayYear = today.getYear(); - int count = todayYear - beginYear; - - if (map.get(String.valueOf(today.getMonth())).equals(nextTermStr)) { - Term term = new Term(); - term.setVal(todayYear + "2"); - term.setText(todayYear + nextTermStr); - termList.add(term); - } - Term term = new Term(); - term.setVal(todayYear + "1"); - term.setText(todayYear + lastTermStr); - termList.add(term); - - - for (int i = 0; i < count; i++) { - todayYear--; - term = new Term(); - term.setVal(todayYear + "2"); - term.setText(todayYear + nextTermStr); - termList.add(term); - term = new Term(); - term.setVal(todayYear + "1"); - term.setText(todayYear + lastTermStr); - termList.add(term); - - } - - } - - - public static String now() { - return termList.get(0).getVal(); - } - - public static List getTermList() { - return termList; - } -} diff --git a/src/main/java/com/vm/controller/AgentController.java b/src/main/java/com/vm/controller/AgentController.java new file mode 100644 index 0000000..e4aaa7a --- /dev/null +++ b/src/main/java/com/vm/controller/AgentController.java @@ -0,0 +1,164 @@ +package com.vm.controller; + +import java.beans.PropertyEditorSupport; +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.interceptor.TransactionAspectSupport; +import org.springframework.ui.Model; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.InitBinder; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.commons.CommonsMultipartFile; + +import com.entity.Agent; +import com.entity.enumeration.AgentLevel; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.system.service.UserBiz; +import com.util.ResultMapUtil; +import com.vm.service.AgentBiz; +import com.vm.service.AreaBiz; + +@Controller +@RequestMapping("agent.do") +public class AgentController { + private Logger log = Logger.getLogger(AgentController.class); + + @Autowired + private AgentBiz agentBiz; + @Autowired + private UserBiz userBiz; + @Autowired + private AreaBiz areaBiz; + + @InitBinder + protected void initBinder(WebDataBinder binder) { + binder.registerCustomEditor(AgentLevel.class, new PropertyEditorSupport(){ + @Override + public void setAsText(String text) throws IllegalArgumentException { + if(!StringUtils.isEmpty(text)) + this.setValue(AgentLevel.valueOf(text)); + } + @Override + public String getAsText() { + AgentLevel value = (AgentLevel)this.getValue(); + return value.name(); + } + }); + } + + @RequiresPermissions("agent:query") + @RequestMapping("agent.view") + public String agentView(Model model) { + return "forward:/agent.do/agent.view/0/10"; + } + + @RequiresPermissions("agent:query") + @RequestMapping("agent.view/{pageNum}/{pageSize}") + public String agentView(Agent agent,Model m,@PathVariable("pageNum") int pageNum, + @PathVariable("pageSize") int pageSize) { + PageHelper.startPage(pageNum, pageSize); + List list = agentBiz.find(agent); + PageInfo page = new PageInfo(list); + m.addAttribute("agentList", list); + m.addAttribute("page", page); + return "/vm/agent/agent"; + } + + @RequiresPermissions("agent:add") + @RequestMapping("agent_add.view") + public String agentAddView(Model m) { + m.addAttribute("agent", new Agent()); + m.addAttribute("agentLevel", AgentLevel.values()); + m.addAttribute("areaList", areaBiz.find(null)); + m.addAttribute("userList", userBiz.findByRole("agent")); + return "/vm/agent/agent_add"; + } + + @RequiresPermissions("agent:update") + @RequestMapping("agent_update.view") + public String agentUpdateView(Long id,Model m) { + m.addAttribute("agentLevel", AgentLevel.values()); + m.addAttribute("agent",agentBiz.findById(id)); + m.addAttribute("areaList", areaBiz.find(null)); + m.addAttribute("userList", userBiz.findByRole("agent")); + return "/vm/agent/agent_update"; + } + + @RequiresPermissions("agent:add") + @RequestMapping("add") + public String add(Agent agent) { + agentBiz.add(agent); + return "redirect:/agent.do/agent.view"; + } + + @RequiresPermissions("agent:update") + @RequestMapping("update") + public String update(Agent agent) { + agentBiz.update(agent); + return "redirect:/agent.do/agent.view"; + } + + @RequiresPermissions("agent:delete") + @RequestMapping("delete") + public String delete(Long id) { + agentBiz.delete(id); + return "redirect:/agent.do/agent.view"; + } + + + @SuppressWarnings("resource") + @RequiresPermissions("agent:import") + @RequestMapping("import") + @ResponseBody + @Transactional() + public Map imp(@RequestParam("file") CommonsMultipartFile file){ + Workbook wb = null; + try { + boolean isExcel2007 = file.getOriginalFilename().matches("^.+\\.(?i)(xlsx)$"); + if(isExcel2007) { + wb = new XSSFWorkbook(file.getInputStream()); + } else { + wb = new HSSFWorkbook(file.getInputStream()); + } + Sheet sheet = wb.getSheetAt(0); + int rowNum = sheet.getLastRowNum(); + for(int i=1;i<=rowNum;i++) { + Row row = sheet.getRow(i); + String level = row.getCell(0).getStringCellValue(); + AgentLevel agentLevel = AgentLevel.parse(level); + String agentName = row.getCell(1).getStringCellValue(); + if(StringUtils.isEmpty(agentName)) continue; + String area = row.getCell(2).getStringCellValue(); + String openid = row.getCell(3).getStringCellValue(); + Agent agent = new Agent(agentLevel,agentName,area,openid); + + agentBiz.add(agent); + } + } catch(NullPointerException e) { + log.error("上传文件解析失败",e); + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return ResultMapUtil.getFailMap("字段不允许为空"); + } catch (IOException e) { + log.error("上传文件解析失败",e); + return ResultMapUtil.getFailMap(); + } + return ResultMapUtil.getSuccessMap(); + } +} diff --git a/src/main/java/com/vm/controller/AreaController.java b/src/main/java/com/vm/controller/AreaController.java new file mode 100644 index 0000000..3a963dd --- /dev/null +++ b/src/main/java/com/vm/controller/AreaController.java @@ -0,0 +1,76 @@ +package com.vm.controller; + +import java.util.List; + +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; + +import com.entity.Area; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.vm.service.AreaBiz; + +@Controller +@RequestMapping("area.do") +public class AreaController { + + @Autowired + private AreaBiz areaBiz; + + @RequiresPermissions("area:query") + @RequestMapping("area.view") + public String areaView(Model model) { + return "forward:/area.do/area.view/0/10"; + } + + @RequiresPermissions("area:query") + @RequestMapping("area.view/{pageNum}/{pageSize}") + public String areaView(Area area,Model m,@PathVariable("pageNum") int pageNum, + @PathVariable("pageSize") int pageSize) { + PageHelper.startPage(pageNum, pageSize); + List list = areaBiz.find(area); + PageInfo page = new PageInfo(list); + m.addAttribute("areaList", list); + m.addAttribute("page", page); + return "/vm/area/area"; + } + + @RequiresPermissions("area:add") + @RequestMapping("area_add.view") + public String areaAddView(Model m) { + m.addAttribute("area", new Area()); + return "/vm/area/area_add"; + } + + @RequiresPermissions("area:update") + @RequestMapping("area_update.view") + public String areaUpdateView(Long id,Model m) { + m.addAttribute("area",areaBiz.findById(id)); + return "/vm/area/area_update"; + } + + @RequiresPermissions("area:add") + @RequestMapping("add") + public String add(Area area) { + areaBiz.add(area); + return "redirect:/area.do/area.view"; + } + + @RequiresPermissions("area:update") + @RequestMapping("update") + public String update(Area area) { + areaBiz.update(area); + return "redirect:/area.do/area.view"; + } + + @RequiresPermissions("area:delete") + @RequestMapping("delete") + public String delete(Long id) { + areaBiz.delete(id); + return "redirect:/area.do/area.view"; + } +} diff --git a/src/main/java/com/vm/controller/CarController.java b/src/main/java/com/vm/controller/CarController.java index b370350..253efce 100644 --- a/src/main/java/com/vm/controller/CarController.java +++ b/src/main/java/com/vm/controller/CarController.java @@ -1,14 +1,33 @@ package com.vm.controller; +import java.io.IOException; +import java.util.List; +import java.util.Map; + import org.apache.log4j.Logger; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.interceptor.TransactionAspectSupport; import org.springframework.ui.Model; +import org.springframework.util.StringUtils; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.commons.CommonsMultipartFile; import com.entity.Car; import com.entity.Standard; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.util.ResultMapUtil; import com.vm.service.CarBiz; import com.vm.service.StandardBiz; @@ -21,11 +40,22 @@ public class CarController { private CarBiz carBiz; @Autowired private StandardBiz standardBiz; - + @RequiresPermissions("car:query") @RequestMapping("car.view") - public String CarView(Car car,Model m) { - m.addAttribute("carList", carBiz.find(car)); + public String carView(Model model) { + return "forward:/car.do/car.view/0/10"; + } + + @RequiresPermissions("car:query") + @RequestMapping("car.view/{pageNum}/{pageSize}") + public String CarView(Car car,Model m,@PathVariable("pageNum") int pageNum, + @PathVariable("pageSize") int pageSize) { + PageHelper.startPage(pageNum, pageSize); + List list = carBiz.find(car); + PageInfo page = new PageInfo(list); + m.addAttribute("carList", list); + m.addAttribute("page", page); return "/vm/car/car"; } @@ -64,5 +94,45 @@ public String delete(Long id) { carBiz.delete(id); return "redirect:/car.do/car.view"; } + + @SuppressWarnings("resource") + @RequiresPermissions("car:import") + @RequestMapping("import") + @ResponseBody + @Transactional() + public Map imp(@RequestParam("file") CommonsMultipartFile file){ + Workbook wb = null; + try { + boolean isExcel2007 = file.getOriginalFilename().matches("^.+\\.(?i)(xlsx)$"); + if(isExcel2007) { + wb = new XSSFWorkbook(file.getInputStream()); + } else { + wb = new HSSFWorkbook(file.getInputStream()); + } + Sheet sheet = wb.getSheetAt(0); + int rowNum = sheet.getLastRowNum(); + for(int i=1;i<=rowNum;i++) { + Row row = sheet.getRow(i); + String carId = row.getCell(0).getStringCellValue(); + if(StringUtils.isEmpty(carId)) continue; + Boolean isSale = row.getCell(1).getBooleanCellValue(); + Integer high = (int) row.getCell(2).getNumericCellValue(); + Integer length = (int) row.getCell(3).getNumericCellValue(); + Integer wide = (int) row.getCell(4).getNumericCellValue(); + Integer weight = (int) row.getCell(5).getNumericCellValue(); + + Car car = new Car(carId,isSale,high,length,wide,weight); + carBiz.add(car); + } + } catch(NullPointerException e) { + log.error("上传文件解析失败",e); + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return ResultMapUtil.getFailMap("字段不允许为空"); + } catch (IOException e) { + log.error("上传文件解析失败",e); + return ResultMapUtil.getFailMap(); + } + return ResultMapUtil.getSuccessMap(); + } } diff --git a/src/main/java/com/vm/controller/OrderController.java b/src/main/java/com/vm/controller/OrderController.java new file mode 100644 index 0000000..f4902aa --- /dev/null +++ b/src/main/java/com/vm/controller/OrderController.java @@ -0,0 +1,173 @@ +package com.vm.controller; + +import java.beans.PropertyEditorSupport; +import java.io.IOException; +import java.util.List; +import java.util.Map; + +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.interceptor.TransactionAspectSupport; +import org.springframework.ui.Model; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.WebDataBinder; +import org.springframework.web.bind.annotation.InitBinder; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.multipart.commons.CommonsMultipartFile; + +import com.entity.Agent; +import com.entity.Car; +import com.entity.Order; +import com.entity.enumeration.OrderType; +import com.entity.enumeration.Status; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.util.ResultMapUtil; +import com.vm.service.AgentBiz; +import com.vm.service.CarBiz; +import com.vm.service.OrderBiz; + +@Controller +@RequestMapping("order.do") +public class OrderController { + private Logger log = Logger.getLogger(OrderController.class); + + @Autowired + private OrderBiz orderBiz; + @Autowired + private CarBiz carBiz; + @Autowired + private AgentBiz agentBiz; + + + @InitBinder + protected void initBinder(WebDataBinder binder) { + binder.registerCustomEditor(OrderType.class, new PropertyEditorSupport(){ + @Override + public void setAsText(String text) throws IllegalArgumentException { + if(!StringUtils.isEmpty(text)) + this.setValue(OrderType.valueOf(text)); + } + @Override + public String getAsText() { + OrderType value = (OrderType)this.getValue(); + return value.name(); + } + }); + } + + @RequiresPermissions("order:query") + @RequestMapping("order.view") + public String orderView(Model model) { + return "forward:/order.do/order.view/0/10"; + } + + @RequiresPermissions("order:query") + @RequestMapping("order.view/{pageNum}/{pageSize}") + public String orderView(Order order,Model m,@PathVariable("pageNum") int pageNum, + @PathVariable("pageSize") int pageSize) { + PageHelper.startPage(pageNum, pageSize); + List list = orderBiz.find(order); + PageInfo page = new PageInfo(list); + m.addAttribute("orderList", list); + m.addAttribute("page", page); + return "/vm/order/order"; + } + + @RequestMapping("external/order_add.view") + public String orderAddView(ModelMap m) { + String openid = (String) m.get("openid"); + String orderType = (String) m.get("orderType"); + if(StringUtils.isEmpty(openid)) { + openid = "test"; + m.put("openid", openid); + } + if(StringUtils.isEmpty(orderType)) { + orderType = OrderType.DISTRIBUTION.name(); + m.put("orderType", orderType); + } + Agent agent = agentBiz.findByOpenId(openid); + List carList = carBiz.findByLevel(agent.getLevel()); + m.put("carList", carList); + return "/vm/order/external_order_add"; + } + + @RequestMapping("external/add") + public String add(Order order) { + order.setStatus(Status.START); + orderBiz.add(order); + return "/vm/order/external_order_add_success"; + } + + @RequiresPermissions("order:update") + @RequestMapping("order_update.view") + public String orderUpdateView(Long id,Model m) { + m.addAttribute("order",orderBiz.findById(id)); + return "/vm/order/order_update"; + } + + + @RequiresPermissions("order:update") + @RequestMapping("update") + public String update(Order order) { + orderBiz.update(order); + return "redirect:/order.do/order.view"; + } + + @RequiresPermissions("order:delete") + @RequestMapping("delete") + public String delete(Long id) { + orderBiz.delete(id); + return "redirect:/order.do/order.view"; + } + + + @SuppressWarnings("resource") + @RequiresPermissions("order:import") + @RequestMapping("import") + @ResponseBody + @Transactional() + public Map imp(@RequestParam("file") CommonsMultipartFile file){ + Workbook wb = null; + try { + boolean isExcel2007 = file.getOriginalFilename().matches("^.+\\.(?i)(xlsx)$"); + if(isExcel2007) { + wb = new XSSFWorkbook(file.getInputStream()); + } else { + wb = new HSSFWorkbook(file.getInputStream()); + } + Sheet sheet = wb.getSheetAt(0); + int rowNum = sheet.getLastRowNum(); + for(int i=1;i<=rowNum;i++) { + Row row = sheet.getRow(i); + String level = row.getCell(0).getStringCellValue(); + String orderName = row.getCell(1).getStringCellValue(); + if(StringUtils.isEmpty(orderName)) continue; + String area = row.getCell(2).getStringCellValue(); + Order order = new Order(); + + orderBiz.add(order); + } + } catch(NullPointerException e) { + log.error("上传文件解析失败",e); + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return ResultMapUtil.getFailMap("字段不允许为空"); + } catch (IOException e) { + log.error("上传文件解析失败",e); + return ResultMapUtil.getFailMap(); + } + return ResultMapUtil.getSuccessMap(); + } +} diff --git a/src/main/java/com/vm/controller/ProcurementController.java b/src/main/java/com/vm/controller/ProcurementController.java new file mode 100644 index 0000000..5af951a --- /dev/null +++ b/src/main/java/com/vm/controller/ProcurementController.java @@ -0,0 +1,95 @@ +package com.vm.controller; + +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.log4j.Logger; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.entity.Procurement; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.vm.service.FileUploadBiz; +import com.vm.service.ProcurementBiz; + +@Controller +@RequestMapping("procurement.do") +public class ProcurementController { + private Logger log = Logger.getLogger(ProcurementController.class); + + @Autowired + private ProcurementBiz procBiz; + @Autowired + private FileUploadBiz fileUpload; + + @RequiresPermissions("procurement:query") + @RequestMapping("procurement.view") + public String ProcurementViewForword(Model model) { + return "forward:/procurement.do/procurement.view/0/10"; + } + + @RequiresPermissions("procurement:query") + @RequestMapping("procurement.view/{pageNum}/{pageSize}") + public String ProcurementView(Procurement procurement,Model m,@PathVariable("pageNum") int pageNum, + @PathVariable("pageSize") int pageSize) { + + PageHelper.startPage(pageNum, pageSize); + List list = procBiz.find(procurement); + PageInfo page = new PageInfo(list); + m.addAttribute("procurementList", list); + m.addAttribute("page", page); + return "/vm/procurement/procurement"; + } + + @RequiresPermissions("procurement:add") + @RequestMapping("procurement_add.view") + public String procurementAddView(Model m) { + + return "/vm/procurement/procurement_add"; + } + @RequiresPermissions("procurement:add") + @RequestMapping("add") + public String add(Procurement procurement) { + procBiz.add(procurement); + return "redirect:/procurement.do/procurement.view"; + } + + @RequiresPermissions("procurement:update") + @RequestMapping("procurement_update.view") + public String procurementUpdateView(Long id,Model m) { + m.addAttribute("procurement",procBiz.findById(id)); + return "/vm/procurement/procurement_update"; + } + + @RequiresPermissions("procurement:update") + @RequestMapping("update") + public String update(Procurement procurement) { + procBiz.update(procurement); + return "redirect:/procurement.do/procurement.view"; + } + + @RequiresPermissions("procurement:delete") + @RequestMapping("delete") + public String delete(Long id) { + procBiz.delete(id); + return "redirect:/procurement.do/procurement.view"; + } + + @RequiresPermissions("procurement:import") + @RequestMapping("import") + @ResponseBody + @Transactional() + public Map imp(HttpServletRequest request){ + + return fileUpload.fileUploadFile(request); + } +} diff --git a/src/main/java/com/vm/controller/StandardController.java b/src/main/java/com/vm/controller/StandardController.java index 206d764..dbe491a 100644 --- a/src/main/java/com/vm/controller/StandardController.java +++ b/src/main/java/com/vm/controller/StandardController.java @@ -1,12 +1,17 @@ package com.vm.controller; +import java.util.List; + import org.apache.shiro.authz.annotation.RequiresPermissions; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import com.entity.Standard; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; import com.vm.service.StandardBiz; @Controller @@ -15,11 +20,22 @@ public class StandardController { @Autowired private StandardBiz standardBiz; - + @RequiresPermissions("standard:query") @RequestMapping("standard.view") - public String standardView(Standard standard,Model m) { - m.addAttribute("standardList", standardBiz.find(standard)); + public String standardView(Model model) { + return "forward:/standard.do/standard.view/0/10"; + } + + @RequiresPermissions("standard:query") + @RequestMapping("standard.view/{pageNum}/{pageSize}") + public String standardView(Standard standard,Model m,@PathVariable("pageNum") int pageNum, + @PathVariable("pageSize") int pageSize) { + PageHelper.startPage(pageNum, pageSize); + List list = standardBiz.find(standard); + PageInfo page = new PageInfo(list); + m.addAttribute("standardList", list); + m.addAttribute("page", page); return "/vm/standard/standard"; } diff --git a/src/main/java/com/vm/controller/UploadController.java b/src/main/java/com/vm/controller/UploadController.java new file mode 100644 index 0000000..a6b877c --- /dev/null +++ b/src/main/java/com/vm/controller/UploadController.java @@ -0,0 +1,95 @@ +package com.vm.controller; + +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import com.entity.FileInfo; +import com.util.ResultMapUtil; +import com.vm.service.FileUploadBiz; + + +@Controller +@RequestMapping("upload.do") +public class UploadController { + private Logger log = Logger.getLogger(UploadController.class); + + @Autowired + private FileUploadBiz fileUpload; + + + /** + * 上传文件 + * + * @param request + * @return + */ + @RequestMapping("file") + @ResponseBody + public Map uploadFile(HttpServletRequest request) { + return fileUpload.fileUploadFile(request); + } + + /** + * 上传图片 + * + * @param request + * @return + */ + @RequestMapping("image") + @ResponseBody + public Map uploadImage(HttpServletRequest request) { + return fileUpload.fileUploadImage(request); + } + + /** + * 多文件上传 + * + * @param request + * @return + */ + @RequestMapping("multiple") + @ResponseBody + public Map uploadMultiple(HttpServletRequest request) { + return fileUpload.uploadMultiple(request); + } + + @RequestMapping("delete") + @ResponseBody + public Map delete(Long id) { + try { + fileUpload.delete(id); + } catch(Exception e) { + log.error("DeleteError",e); + return ResultMapUtil.getFailMap(); + } + return ResultMapUtil.getSuccessMap(); + } + + + @RequestMapping("query") + @ResponseBody + public Map query(Long id) { + FileInfo fileInfo = fileUpload.query(id); + return ResultMapUtil.getSuccessMap(fileInfo); + } + + @RequestMapping("queryByIds") + @ResponseBody + public Map query(String ids) { + try { + List list = fileUpload.query(ids); + return ResultMapUtil.getSuccessMap(list); + } catch(Exception e) { + log.error("QueryError",e); + return ResultMapUtil.getFailMap(); + } + } +} diff --git a/src/main/java/com/vm/controller/VendorController.java b/src/main/java/com/vm/controller/VendorController.java new file mode 100644 index 0000000..bc4de71 --- /dev/null +++ b/src/main/java/com/vm/controller/VendorController.java @@ -0,0 +1,76 @@ +package com.vm.controller; + +import java.util.List; + +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; + +import com.entity.Vendor; +import com.github.pagehelper.PageHelper; +import com.github.pagehelper.PageInfo; +import com.vm.service.VendorBiz; + +@Controller +@RequestMapping("vendor.do") +public class VendorController { + + @Autowired + private VendorBiz vendorBiz; + + @RequiresPermissions("vendor:query") + @RequestMapping("vendor.view") + public String vendorView(Model model) { + return "forward:/vendor.do/vendor.view/0/10"; + } + + @RequiresPermissions("vendor:query") + @RequestMapping("vendor.view/{pageNum}/{pageSize}") + public String vendorView(Vendor vendor,Model m,@PathVariable("pageNum") int pageNum, + @PathVariable("pageSize") int pageSize) { + PageHelper.startPage(pageNum, pageSize); + List list = vendorBiz.find(vendor); + PageInfo page = new PageInfo(list); + m.addAttribute("vendorList", list); + m.addAttribute("page", page); + return "/vm/vendor/vendor"; + } + + @RequiresPermissions("vendor:add") + @RequestMapping("vendor_add.view") + public String vendorAddView(Model m) { + m.addAttribute("vendor", new Vendor()); + return "/vm/vendor/vendor_add"; + } + + @RequiresPermissions("vendor:update") + @RequestMapping("vendor_update.view") + public String vendorUpdateView(Long id,Model m) { + m.addAttribute("vendor",vendorBiz.findById(id)); + return "/vm/vendor/vendor_update"; + } + + @RequiresPermissions("vendor:add") + @RequestMapping("add") + public String add(Vendor vendor) { + vendorBiz.add(vendor); + return "redirect:/vendor.do/vendor.view"; + } + + @RequiresPermissions("vendor:update") + @RequestMapping("update") + public String update(Vendor vendor) { + vendorBiz.update(vendor); + return "redirect:/vendor.do/vendor.view"; + } + + @RequiresPermissions("vendor:delete") + @RequestMapping("delete") + public String delete(Long id) { + vendorBiz.delete(id); + return "redirect:/vendor.do/vendor.view"; + } +} diff --git a/src/main/java/com/vm/dao/AgentDao.java b/src/main/java/com/vm/dao/AgentDao.java new file mode 100644 index 0000000..819f364 --- /dev/null +++ b/src/main/java/com/vm/dao/AgentDao.java @@ -0,0 +1,19 @@ +package com.vm.dao; + +import java.util.List; + +import com.entity.Agent; + +public interface AgentDao { + public List find(Agent agent); + + public Agent findById(Long id); + + public void add(Agent Agent); + + public void update(Agent agent); + + public void delete(Long id); + + public Agent findByOpenId(String id); +} diff --git a/src/main/java/com/vm/dao/AreaDao.java b/src/main/java/com/vm/dao/AreaDao.java new file mode 100644 index 0000000..1da5720 --- /dev/null +++ b/src/main/java/com/vm/dao/AreaDao.java @@ -0,0 +1,17 @@ +package com.vm.dao; + +import java.util.List; + +import com.entity.Area; + +public interface AreaDao { + public List find(Area area); + + public Area findById(Long id); + + public void add(Area area); + + public void update(Area area); + + public void delete(Long id); +} diff --git a/src/main/java/com/vm/dao/FileUploadDao.java b/src/main/java/com/vm/dao/FileUploadDao.java new file mode 100644 index 0000000..1298653 --- /dev/null +++ b/src/main/java/com/vm/dao/FileUploadDao.java @@ -0,0 +1,13 @@ +package com.vm.dao; + +import java.util.List; + +import com.entity.FileInfo; + +public interface FileUploadDao { + public void add(FileInfo fileInfo); + public void delete(Long id); + public FileInfo findById(Long id); + public List findAll(); + public List findByIds(List list); +} diff --git a/src/main/java/com/vm/dao/OrderDao.java b/src/main/java/com/vm/dao/OrderDao.java new file mode 100644 index 0000000..8c43bf7 --- /dev/null +++ b/src/main/java/com/vm/dao/OrderDao.java @@ -0,0 +1,18 @@ +package com.vm.dao; + +import java.util.List; + +import com.entity.Order; + +public interface OrderDao { + public List find(Order order); + + public Order findById(Long id); + + public void add(Order order); + + public void update(Order order); + + public void delete(Long id); + +} diff --git a/src/main/java/com/vm/dao/ProcurementDao.java b/src/main/java/com/vm/dao/ProcurementDao.java new file mode 100644 index 0000000..fde75df --- /dev/null +++ b/src/main/java/com/vm/dao/ProcurementDao.java @@ -0,0 +1,18 @@ +package com.vm.dao; + +import java.util.List; + +import com.entity.Procurement; + +public interface ProcurementDao { + public List find(Procurement procurement); + + public Procurement findById(Long id); + + public void add(Procurement procurement); + + public void update(Procurement procurement); + + public void delete(Long id); + +} diff --git a/src/main/java/com/vm/dao/VendorDao.java b/src/main/java/com/vm/dao/VendorDao.java new file mode 100644 index 0000000..a62b78c --- /dev/null +++ b/src/main/java/com/vm/dao/VendorDao.java @@ -0,0 +1,17 @@ +package com.vm.dao; + +import java.util.List; + +import com.entity.Vendor; + +public interface VendorDao { + public List find(Vendor vendor); + + public Vendor findById(Long id); + + public void add(Vendor vendor); + + public void update(Vendor vendor); + + public void delete(Long id); +} diff --git a/src/main/java/com/vm/service/AgentBiz.java b/src/main/java/com/vm/service/AgentBiz.java new file mode 100644 index 0000000..a4a065e --- /dev/null +++ b/src/main/java/com/vm/service/AgentBiz.java @@ -0,0 +1,19 @@ +package com.vm.service; + +import java.util.List; + +import com.entity.Agent; + +public interface AgentBiz { + public List find(Agent agent); + + public void add(Agent agent); + + public void update(Agent agent); + + public void delete(Long id); + + public Agent findById(Long id); + + public Agent findByOpenId(String id); +} diff --git a/src/main/java/com/vm/service/AreaBiz.java b/src/main/java/com/vm/service/AreaBiz.java new file mode 100644 index 0000000..276bf4b --- /dev/null +++ b/src/main/java/com/vm/service/AreaBiz.java @@ -0,0 +1,17 @@ +package com.vm.service; + +import java.util.List; + +import com.entity.Area; + +public interface AreaBiz { + public List find(Area area); + + public void add(Area area); + + public void update(Area area); + + public void delete(Long id); + + public Area findById(Long id); +} diff --git a/src/main/java/com/vm/service/CarBiz.java b/src/main/java/com/vm/service/CarBiz.java index 28a0905..484cd83 100644 --- a/src/main/java/com/vm/service/CarBiz.java +++ b/src/main/java/com/vm/service/CarBiz.java @@ -3,6 +3,7 @@ import java.util.List; import com.entity.Car; +import com.entity.enumeration.AgentLevel; public interface CarBiz { public List find(Car car); @@ -15,5 +16,5 @@ public interface CarBiz { public Car findById(Long id); - + public List findByLevel(AgentLevel level); } diff --git a/src/main/java/com/vm/service/FileUploadBiz.java b/src/main/java/com/vm/service/FileUploadBiz.java new file mode 100644 index 0000000..f370061 --- /dev/null +++ b/src/main/java/com/vm/service/FileUploadBiz.java @@ -0,0 +1,57 @@ +package com.vm.service; + +import java.util.List; +import java.util.Map; + +import javax.servlet.http.HttpServletRequest; + +import com.entity.FileInfo; + +public interface FileUploadBiz { + + /** + * 上传文件 + * + * @param request + * @param type + * @return + */ + public abstract Map fileUploadFile(HttpServletRequest request); + + /** + * 上传图片 + * + * @param request + * @param category + * @return + */ + public abstract Map fileUploadImage(HttpServletRequest request); + + /** + * 文件上传 + * + * @param tenantCode + * @param userAccount + * @param request + * @param type + * @return + */ + public abstract Map fileUpload(HttpServletRequest request, String allowTypes); + + /** + * 上传文件 + * + * @param request + * @param category + * @param type + * @return + */ + public abstract Map uploadMultiple(HttpServletRequest request); + + public abstract void delete(Long id); + + public abstract FileInfo query(Long id); + + public abstract List query(String ids); + +} \ No newline at end of file diff --git a/src/main/java/com/vm/service/OrderBiz.java b/src/main/java/com/vm/service/OrderBiz.java new file mode 100644 index 0000000..19e6226 --- /dev/null +++ b/src/main/java/com/vm/service/OrderBiz.java @@ -0,0 +1,19 @@ +package com.vm.service; + +import java.util.List; + +import com.entity.Order; + +public interface OrderBiz { + public List find(Order order); + + public void add(Order order); + + public void update(Order order); + + public void delete(Long id); + + public Order findById(Long id); + + +} diff --git a/src/main/java/com/vm/service/ProcurementBiz.java b/src/main/java/com/vm/service/ProcurementBiz.java new file mode 100644 index 0000000..3dd502a --- /dev/null +++ b/src/main/java/com/vm/service/ProcurementBiz.java @@ -0,0 +1,20 @@ +package com.vm.service; + +import java.util.List; + +import com.entity.Car; +import com.entity.Procurement; + +public interface ProcurementBiz { + public List find(Procurement procurement); + + public void add(Procurement procurement); + + public void update(Procurement procurement); + + public void delete(Long id); + + public Procurement findById(Long id); + + +} diff --git a/src/main/java/com/vm/service/VendorBiz.java b/src/main/java/com/vm/service/VendorBiz.java new file mode 100644 index 0000000..8d8cba6 --- /dev/null +++ b/src/main/java/com/vm/service/VendorBiz.java @@ -0,0 +1,17 @@ +package com.vm.service; + +import java.util.List; + +import com.entity.Vendor; + +public interface VendorBiz { + public List find(Vendor vendor); + + public void add(Vendor vendor); + + public void update(Vendor vendor); + + public void delete(Long id); + + public Vendor findById(Long vendor); +} diff --git a/src/main/java/com/vm/service/impl/AgentBizImpl.java b/src/main/java/com/vm/service/impl/AgentBizImpl.java new file mode 100644 index 0000000..2eeeb68 --- /dev/null +++ b/src/main/java/com/vm/service/impl/AgentBizImpl.java @@ -0,0 +1,59 @@ +package com.vm.service.impl; + +import java.util.List; + +import org.apache.commons.lang.StringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.entity.Agent; +import com.entity.User; +import com.system.dao.UserDao; +import com.vm.dao.AgentDao; +import com.vm.service.AgentBiz; + +@Service +public class AgentBizImpl implements AgentBiz { + @Autowired + private AgentDao AgentDao; + @Autowired + private UserDao userDao; + + public List find(Agent agent) { + List list = AgentDao.find(agent); + for(Agent entry : list) { + if(StringUtils.isEmpty(entry.getUserIdsStr())) continue; + StringBuffer buff = new StringBuffer(); + for(String uid : entry.getUserIds()) { + User user = userDao.findById(uid); + buff.append(user.getUsername()).append(','); + } + if(buff.length()!=0) buff.deleteCharAt(buff.length()-1); + entry.setUsernames(buff.toString()); + } + return list; + } + + @Override + public Agent findById(Long id) { + return AgentDao.findById(id); + } + + @Override + public Agent findByOpenId(String id) { + return AgentDao.findByOpenId(id); + } + + public void add(Agent agent) { + AgentDao.add(agent); + } + + public void update(Agent agent) { + AgentDao.update(agent); + } + + public void delete(Long AgentId) { + AgentDao.delete(AgentId); + } + +} diff --git a/src/main/java/com/vm/service/impl/AreaBizImpl.java b/src/main/java/com/vm/service/impl/AreaBizImpl.java new file mode 100644 index 0000000..5bded8e --- /dev/null +++ b/src/main/java/com/vm/service/impl/AreaBizImpl.java @@ -0,0 +1,38 @@ +package com.vm.service.impl; + +import java.util.List; + +import javax.annotation.Resource; + +import org.springframework.stereotype.Service; + +import com.entity.Area; +import com.vm.dao.AreaDao; +import com.vm.service.AreaBiz; + +@Service +public class AreaBizImpl implements AreaBiz { + @Resource + private AreaDao areaDao; + + public List find(Area area) { + return areaDao.find(area); + } + + @Override + public Area findById(Long id) { + return areaDao.findById(id); + } + + public void add(Area area) { + areaDao.add(area); + } + + public void update(Area area) { + areaDao.update(area); + } + + public void delete(Long areaId) { + areaDao.delete(areaId); + } +} diff --git a/src/main/java/com/vm/service/impl/CarBizImpl.java b/src/main/java/com/vm/service/impl/CarBizImpl.java index 94ad2ee..b0abb5f 100644 --- a/src/main/java/com/vm/service/impl/CarBizImpl.java +++ b/src/main/java/com/vm/service/impl/CarBizImpl.java @@ -7,6 +7,7 @@ import org.springframework.stereotype.Service; import com.entity.Car; +import com.entity.enumeration.AgentLevel; import com.vm.dao.CarDao; import com.vm.service.CarBiz; @@ -20,6 +21,12 @@ public List find(Car car) { } @Override + public List findByLevel(AgentLevel level) { + //TODO 根据客户等级查询车辆 + return carDao.find(new Car()); + } + + @Override public Car findById(Long id) { return carDao.findById(id); } diff --git a/src/main/java/com/vm/service/impl/FileUploadBizImpl.java b/src/main/java/com/vm/service/impl/FileUploadBizImpl.java new file mode 100644 index 0000000..4e2dd3d --- /dev/null +++ b/src/main/java/com/vm/service/impl/FileUploadBizImpl.java @@ -0,0 +1,270 @@ +package com.vm.service.impl; + +import java.io.IOException; +import java.net.URLEncoder; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Properties; +import java.util.UUID; + +import javax.annotation.PostConstruct; +import javax.servlet.http.HttpServletRequest; + +import org.apache.commons.lang3.StringUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; +import org.springframework.web.multipart.MultipartHttpServletRequest; +import org.springframework.web.multipart.commons.CommonsMultipartResolver; + +import com.enterprisedt.net.ftp.FTPException; +import com.entity.FileInfo; +import com.google.common.collect.Lists; +import com.util.FtpClient; +import com.util.ResultMapUtil; +import com.vm.dao.FileUploadDao; +import com.vm.service.FileUploadBiz; + +/** + * 多文件上传 + * + */ +@Service +public class FileUploadBizImpl implements FileUploadBiz { + + private String ip; + private String readurl; + private String rootDir; + private String username; + private String password; + private static String allowFileTypes; + private static String allowImageTypes; + private static final String CONFIG_FILE_NAME = "upload.properties"; + private Log logger = LogFactory.getLog(this.getClass()); + + @Autowired + private FileUploadDao fileUploadDao; + + @PostConstruct + private void init() { + Properties properties = new Properties(); + try { + properties.load(FileUploadBizImpl.class.getClassLoader() + .getResourceAsStream(CONFIG_FILE_NAME)); + allowFileTypes = properties.getProperty("allowFileTypes"); + allowFileTypes += allowFileTypes.toLowerCase(); + allowImageTypes = properties.getProperty("allowImageTypes"); + allowImageTypes += allowImageTypes.toLowerCase(); + this.ip = properties.getProperty("ftp.ip"); + this.username = properties.getProperty("ftp.username"); + this.password = properties.getProperty("ftp.password"); + this.readurl = properties.getProperty("ftp.readurl"); + this.rootDir = properties.getProperty("ftp.root"); + } catch (Exception e) { + logger.error("加载配置文件出错!" + e.getMessage()); + } + } + + /* (non-Javadoc) + * @see com.vm.service.impl.FileUploadBiz#fileUploadFile(javax.servlet.http.HttpServletRequest, com.entity.enumeration.FtpUploadType, java.lang.String) + */ + @Override + public Map fileUploadFile(HttpServletRequest request) { + return this.fileUpload(request, allowFileTypes); + } + + /* (non-Javadoc) + * @see com.vm.service.impl.FileUploadBiz#fileUploadImage(javax.servlet.http.HttpServletRequest, com.entity.enumeration.FtpUploadType, java.lang.String) + */ + @Override + public Map fileUploadImage(HttpServletRequest request) { + return this.fileUpload(request, allowImageTypes); + } + + /* (non-Javadoc) + * @see com.vm.service.impl.FileUploadBiz#fileUpload(javax.servlet.http.HttpServletRequest, com.entity.enumeration.FtpUploadType, java.lang.String, java.lang.String) + */ + @Override + public Map fileUpload(HttpServletRequest request, String allowTypes) { + Map msg = null; + try { + // 上传文件的解析器 + CommonsMultipartResolver mutiparRe = new CommonsMultipartResolver(); + if (mutiparRe.isMultipart(request)) { + MultipartHttpServletRequest mhr = (MultipartHttpServletRequest) request; + + Iterator it = mhr.getFileNames(); + if (it.hasNext()) { + MultipartFile mf = mhr.getFile(it.next()); + if (mf != null) { + String resFileName = mf.getOriginalFilename(); + String date = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); + String dateDir = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); + String fileName = rename(resFileName); + String fileType = fileName.substring(fileName.lastIndexOf(".") + 1); + String filePath = this.rootDir + "/" +dateDir; + + if (StringUtils.isEmpty(allowTypes) + || allowTypes.indexOf(fileType) > -1) { + FtpClient client = null; + try { + // 上传ftp + client = getFtpCilent(filePath); + fileName = URLEncoder.encode(fileName, "utf-8"); + client.uploadFile(mf.getInputStream(), fileName); + FileInfo file = new FileInfo(); + file.setFileName(fileName); + file.setFilePath(this.readurl + filePath + "/" + fileName); + file.setFileType(fileType); + file.setUploadTime(date); + file.setOriginalFilename(resFileName); + + fileUploadDao.add(file); + + msg = ResultMapUtil.getSuccessMap(file); + } catch (Exception e) { + msg = ResultMapUtil.getFailMap("上传失败:" + e.getMessage()); + logger.error("上传失败:" + e.getMessage()); + } finally { + if (client != null) + client.close(); + } + } else { + msg = ResultMapUtil.getFailMap("上传失败:非法的文件类型,目前只支持" + allowTypes + "类型"); + } + } else { + msg = ResultMapUtil.getFailMap("上传失败:无效文件"); + } + } else { + msg = ResultMapUtil.getFailMap("上传失败:无效文件"); + } + } else { + msg = ResultMapUtil.getFailMap("上传失败:请求类型错误"); + } + } catch (Exception e) { + msg = ResultMapUtil.getFailMap("上传失败:" + e.getMessage()); + logger.error("上传失败:", e); + } + return msg; + } + + @Override + public Map uploadMultiple(HttpServletRequest request) { + Map msg = null; + FtpClient client = null; + try { + // 上传文件的解析器 + CommonsMultipartResolver mutiparRe = new CommonsMultipartResolver(); + if (mutiparRe.isMultipart(request)) { + MultipartHttpServletRequest mhr = (MultipartHttpServletRequest) request; + + Iterator it = mhr.getFileNames(); + List fileInfo = new ArrayList(); + if(it.hasNext()){ + client = getFtpCilent(""); + while (it.hasNext()) { + FileInfo file = new FileInfo(); + try { + MultipartFile mf = mhr.getFile(it.next()); + if (mf != null) { + file.setUuid(mf.getName()); + String date = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date()); + String dateDir = new SimpleDateFormat("yyyy-MM-dd").format(new Date()); + String resFileName = mf.getOriginalFilename(); + String fileName = rename(resFileName); + String fileType = fileName.substring(fileName.lastIndexOf(".") + 1); + String filePath = this.rootDir + "/" +dateDir; + client.changeDir(filePath); + + fileName = URLEncoder.encode(fileName, "utf-8"); + if(StringUtils.isNotEmpty(fileName)){ + //解决中文无法访问的问题 + fileName = fileName.replace("%","-"); + } + + client.uploadFile(mf.getInputStream(), fileName); + file.setFileName(fileName); + file.setFilePath(this.readurl + filePath + "/" + fileName); + file.setFileType(fileType); + file.setUploadTime(date); + file.setOriginalFilename(resFileName); + + fileUploadDao.add(file); + + fileInfo.add(file); + } else { + msg = ResultMapUtil.getFailMap("上传失败:无效文件"); + } + } catch (Exception e) { + msg = ResultMapUtil.getFailMap("上传失败:无效文件"); + logger.error("上传失败:" + e.getMessage()); + } + } + msg = ResultMapUtil.getSuccessMap(fileInfo); + }else { + msg = ResultMapUtil.getFailMap("上传失败:无效文件"); + } + }else { + msg = ResultMapUtil.getFailMap("上传失败:请求类型错误"); + } + } catch (Exception e) { + msg = ResultMapUtil.getFailMap("上传失败:" + e.getMessage()); + logger.error("上传失败:", e); + }finally { + if (client != null) + client.close(); + } + return msg; + } + + @Override + public void delete(Long id) { + fileUploadDao.delete(id); + } + + @Override + public FileInfo query(Long id) { + return fileUploadDao.findById(id); + } + + @Override + public List query(String ids) { + if(StringUtils.isEmpty(ids)) { + return Lists.newArrayList(); + } + List list = Lists.newArrayList(); + for(String id : ids.split(",")) { + list.add(Long.parseLong(id)); + } + return fileUploadDao.findByIds(list); + } + + public FtpClient getFtpCilent(String filePath) throws IOException, FTPException { + FtpClient client = new FtpClient(); + client.connectServer(this.ip, this.username, this.password); + client.changeDir(filePath); + return client; + } + + public String rename(String name) { + String uustr = UUID.randomUUID().toString(); + if (name.indexOf(".") != -1) { + uustr += name.substring(name.lastIndexOf(".")); + } + return uustr; + } + + public static String getAllowFileTypes() { + return allowFileTypes; + } + + public static String getAllowImageTypes() { + return allowImageTypes; + } +} \ No newline at end of file diff --git a/src/main/java/com/vm/service/impl/OrderBizImpl.java b/src/main/java/com/vm/service/impl/OrderBizImpl.java new file mode 100644 index 0000000..b50673e --- /dev/null +++ b/src/main/java/com/vm/service/impl/OrderBizImpl.java @@ -0,0 +1,37 @@ +package com.vm.service.impl; + +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import com.entity.Order; +import com.vm.dao.OrderDao; +import com.vm.service.OrderBiz; + +@Service +public class OrderBizImpl implements OrderBiz { + @Autowired + private OrderDao orderDao; + + public List find(Order order) { + return orderDao.find(order); + } + + public Order findById(Long id) { + return orderDao.findById(id); + } + + public void add(Order order) { + orderDao.add(order); + } + + public void update(Order order) { + orderDao.update(order); + } + + public void delete(Long orderId) { + orderDao.delete(orderId); + } + +} diff --git a/src/main/java/com/vm/service/impl/ProcurementBizImpl.java b/src/main/java/com/vm/service/impl/ProcurementBizImpl.java new file mode 100644 index 0000000..39cc154 --- /dev/null +++ b/src/main/java/com/vm/service/impl/ProcurementBizImpl.java @@ -0,0 +1,39 @@ +package com.vm.service.impl; + +import java.util.List; + +import javax.annotation.Resource; + +import org.springframework.stereotype.Service; + +import com.entity.Procurement; +import com.vm.dao.ProcurementDao; +import com.vm.service.ProcurementBiz; + +@Service +public class ProcurementBizImpl implements ProcurementBiz { + @Resource + private ProcurementDao procDao; + + public List find(Procurement procurement) { + return procDao.find(procurement); + } + + @Override + public Procurement findById(Long id) { + return procDao.findById(id); + } + + public void add(Procurement procurement) { + procDao.add(procurement); + } + + public void update(Procurement procurement) { + procDao.update(procurement); + } + + public void delete(Long carId) { + procDao.delete(carId); + } + +} diff --git a/src/main/java/com/vm/service/impl/StandardBizImpl.java b/src/main/java/com/vm/service/impl/StandardBizImpl.java index 0cc5214..35fb640 100644 --- a/src/main/java/com/vm/service/impl/StandardBizImpl.java +++ b/src/main/java/com/vm/service/impl/StandardBizImpl.java @@ -10,10 +10,6 @@ import com.vm.dao.StandardDao; import com.vm.service.StandardBiz; -/** - * Created by c0de8ug on 16-2-11. - */ - @Service public class StandardBizImpl implements StandardBiz { @Resource diff --git a/src/main/java/com/vm/service/impl/VendorBizImpl.java b/src/main/java/com/vm/service/impl/VendorBizImpl.java new file mode 100644 index 0000000..6c76d35 --- /dev/null +++ b/src/main/java/com/vm/service/impl/VendorBizImpl.java @@ -0,0 +1,38 @@ +package com.vm.service.impl; + +import java.util.List; + +import javax.annotation.Resource; + +import org.springframework.stereotype.Service; + +import com.entity.Vendor; +import com.vm.dao.VendorDao; +import com.vm.service.VendorBiz; + +@Service +public class VendorBizImpl implements VendorBiz { + @Resource + private VendorDao vendorDao; + + public List find(Vendor vendor) { + return vendorDao.find(vendor); + } + + @Override + public Vendor findById(Long id) { + return vendorDao.findById(id); + } + + public void add(Vendor vendor) { + vendorDao.add(vendor); + } + + public void update(Vendor vendor) { + vendorDao.update(vendor); + } + + public void delete(Long vendorId) { + vendorDao.delete(vendorId); + } +} diff --git a/src/main/resources/breadcrumb-e-c.properties b/src/main/resources/breadcrumb-e-c.properties index 4c325c2..dd3439a 100644 --- a/src/main/resources/breadcrumb-e-c.properties +++ b/src/main/resources/breadcrumb-e-c.properties @@ -4,6 +4,10 @@ update=\u4FEE\u6539 delete=\u5220\u9664 login=\u9996\u9875 role=\u89D2\u8272 -resource=\u8D44\u6E90 +resource=\u6743\u9650 user=\u7528\u6237 standard=\u89C4\u683C +agent=\u4EE3\u7406\u5546 +procurement=\u91C7\u8D2D +vendor=\u5382\u5546 +area=\u533A\u57DF diff --git a/src/main/resources/db.properties b/src/main/resources/db.properties index 8bec0a8..38d320a 100644 --- a/src/main/resources/db.properties +++ b/src/main/resources/db.properties @@ -1,4 +1,8 @@ jdbc.driver=com.mysql.jdbc.Driver -jdbc.url=jdbc:mysql://localhost:3306/vehicle +#jdbc.url=jdbc:mysql://rm-uf6ggkftngujcn480o.mysql.rds.aliyuncs.com:3306/car_sale_sh +#jdbc.password=root_123 +#jdbc.username=root + +jdbc.url=jdbc:mysql://localhost:3306/vehicle?characterEncoding=utf8&useSSL=false jdbc.password=root -jdbc.username=root +jdbc.username=root \ No newline at end of file diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties index 370bc49..9a5d202 100644 --- a/src/main/resources/log4j.properties +++ b/src/main/resources/log4j.properties @@ -1,4 +1,4 @@ -log4j.rootLogger = info , stdout +log4j.rootLogger = debug , stdout ,consoleAppender ### output to the console ### log4j.appender.stdout = org.apache.log4j.ConsoleAppender @@ -6,6 +6,7 @@ log4j.appender.stdout.Target = System.out log4j.appender.stdout.layout = org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n +log4j.appender.consoleAppender.layout.ConversionPattern=ProcessDefinitionId=%X{mdcProcessDefinitionID} executionId=%X{mdcExecutionId} mdcProcessInstanceID=%X{mdcProcessInstanceID} mdcBusinessKey=%X{mdcBusinessKey} %m%n #mybatis log4j.logger.org.apache.ibatis=info diff --git a/src/main/resources/mapper/AgentDao.xml b/src/main/resources/mapper/AgentDao.xml new file mode 100644 index 0000000..4bc35e9 --- /dev/null +++ b/src/main/resources/mapper/AgentDao.xml @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + UPDATE agent + + + openid=#{openid}, + + + level=#{level}, + + + agent_name=#{agentName}, + + + area=#{area}, + + + user_ids=#{userIdsStr}, + + + WHERE id = #{id} + + + + INSERT INTO agent(openid,level,agent_name,user_ids,area) VALUES(#{openid},#{level},#{agentName},#{userIdsStr},#{area}) + + + + DELETE FROM agent WHERE id = #{id} + + \ No newline at end of file diff --git a/src/main/resources/mapper/AreaDao.xml b/src/main/resources/mapper/AreaDao.xml new file mode 100644 index 0000000..5d1ab34 --- /dev/null +++ b/src/main/resources/mapper/AreaDao.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + UPDATE area + + + area = #{area}, + + + WHERE id = #{id} + + + + INSERT INTO area(area) VALUES(#{area}) + + + + DELETE FROM area WHERE id = #{id} + + \ No newline at end of file diff --git a/src/main/resources/mapper/CarDao.xml b/src/main/resources/mapper/CarDao.xml index 30dc268..b7cec2a 100644 --- a/src/main/resources/mapper/CarDao.xml +++ b/src/main/resources/mapper/CarDao.xml @@ -19,14 +19,27 @@ + SELECT * FROM fileupload + + + + + + + + INSERT INTO fileupload(file_name,file_path,file_type,original_filename,uuid,upload_time) + VALUES(#{fileName},#{filePath},#{fileType},#{originalFilename},#{uuid},#{uploadTime}) + + + + DELETE FROM fileupload WHERE id = #{id} + + \ No newline at end of file diff --git a/src/main/resources/mapper/OrderDao.xml b/src/main/resources/mapper/OrderDao.xml new file mode 100644 index 0000000..2248e2d --- /dev/null +++ b/src/main/resources/mapper/OrderDao.xml @@ -0,0 +1,55 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + UPDATE `order` + + + openid=#{openid}, + + + WHERE id = #{id} + + + + INSERT INTO `order`(openid,car_Id,car_cnt,price,status,order_type,start_time) + VALUES(#{openid},#{carId},#{carCnt},#{price}, + #{status,typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler}, + #{orderType,typeHandler=org.apache.ibatis.type.EnumOrdinalTypeHandler}, + now()) + + + + DELETE FROM `order` WHERE id = #{id} + + \ No newline at end of file diff --git a/src/main/resources/mapper/UserDao.xml b/src/main/resources/mapper/UserDao.xml index 5ef1aac..1600d3c 100644 --- a/src/main/resources/mapper/UserDao.xml +++ b/src/main/resources/mapper/UserDao.xml @@ -8,6 +8,7 @@ + @@ -16,6 +17,11 @@ + @@ -49,6 +58,4 @@ DELETE FROM user WHERE user_id = #{value} - - \ No newline at end of file diff --git a/src/main/resources/mapper/VendorDao.xml b/src/main/resources/mapper/VendorDao.xml new file mode 100644 index 0000000..be8c3d3 --- /dev/null +++ b/src/main/resources/mapper/VendorDao.xml @@ -0,0 +1,74 @@ + + + + + + + + + + + + + + + + + + + + + + + + + UPDATE vendor + + + vendor_name = #{vendorName}, + + + contact = #{contact}, + + + url = #{url}, + + + address = #{address}, + + + telephone = #{telephone}, + + + phone = #{phone}, + + + email = #{email}, + + + attach_id = #{attachId}, + + + WHERE id = #{id} + + + + INSERT INTO vendor(vendor_name,contact,url,address,telephone,phone,email,attach_id) + VALUES(#{vendorName},#{contact},#{url},#{address},#{telephone},#{phone},#{email},#{attachId}) + + + + DELETE FROM vendor WHERE id = #{id} + + \ No newline at end of file diff --git a/src/main/resources/mapper/procurementDao.xml b/src/main/resources/mapper/procurementDao.xml new file mode 100644 index 0000000..8d12f7b --- /dev/null +++ b/src/main/resources/mapper/procurementDao.xml @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + + + + + + + + UPDATE procurement + + + procure_id=#{procureId}, + + + inventory=#{inventory}, + + + price=#{price}, + + + WHERE id = #{id} + + + + INSERT INTO procurement(procure_id,inventory,price,procure_time,create_time) VALUES(#{procureId},#{inventory},#{price},#{procureTime},now()) + + + + DELETE FROM procurement WHERE id = #{id} + + \ No newline at end of file diff --git a/src/main/resources/mybatis-config.xml b/src/main/resources/mybatis-config.xml deleted file mode 100644 index 744f726..0000000 --- a/src/main/resources/mybatis-config.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/src/main/resources/spring/mybatis-config.xml b/src/main/resources/spring/mybatis-config.xml new file mode 100644 index 0000000..fec7c5d --- /dev/null +++ b/src/main/resources/spring/mybatis-config.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/spring-mvc-shiro.xml b/src/main/resources/spring/spring-mvc-shiro.xml similarity index 98% rename from src/main/resources/spring-mvc-shiro.xml rename to src/main/resources/spring/spring-mvc-shiro.xml index 212e848..b62c891 100644 --- a/src/main/resources/spring-mvc-shiro.xml +++ b/src/main/resources/spring/spring-mvc-shiro.xml @@ -1,17 +1,17 @@ - - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/spring-mvc.xml b/src/main/resources/spring/spring-mvc.xml similarity index 69% rename from src/main/resources/spring-mvc.xml rename to src/main/resources/spring/spring-mvc.xml index 79a0001..1612b45 100644 --- a/src/main/resources/spring-mvc.xml +++ b/src/main/resources/spring/spring-mvc.xml @@ -26,13 +26,35 @@ + class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> + + + + + + + + + + + text/html;charset=UTF-8 + application/json;charset=UTF-8 + text/plain;charset=UTF-8 + + + + + @@ -46,6 +68,6 @@ - + \ No newline at end of file diff --git a/src/main/resources/spring-shiro.xml b/src/main/resources/spring/spring-shiro.xml similarity index 95% rename from src/main/resources/spring-shiro.xml rename to src/main/resources/spring/spring-shiro.xml index 9a4fe14..fde8ca3 100644 --- a/src/main/resources/spring-shiro.xml +++ b/src/main/resources/spring/spring-shiro.xml @@ -56,13 +56,15 @@ + /**/external/** = anon /**/import = anon /login.jsp = anon - /logout = logout /dist/** = anon /img/** = anon + /css/** = anon /js/** = anon /bower_components/** = anon + /logout = logout /** = authc diff --git a/src/main/resources/spring.xml b/src/main/resources/spring/spring.xml similarity index 93% rename from src/main/resources/spring.xml rename to src/main/resources/spring/spring.xml index 57c4cb5..46ff119 100644 --- a/src/main/resources/spring.xml +++ b/src/main/resources/spring/spring.xml @@ -42,7 +42,7 @@ - + @@ -67,5 +67,5 @@ - + \ No newline at end of file diff --git a/src/main/resources/upload.properties b/src/main/resources/upload.properties new file mode 100644 index 0000000..0c05479 --- /dev/null +++ b/src/main/resources/upload.properties @@ -0,0 +1,9 @@ +allowFileTypes=.TXT,.DOC,.DOCX,.XLS,.XLSX,.PDF,.GIF,.PNG,.JPG,.JPEG,.BMP +allowImageTypes=.GIF,.PNG,.JPG,.JPEG,.BMP +allowAnnexTypes=.TXT,.DOC,.DOCX,.XLS,.XLSX,.PDF,.GIF,.PNG,.JPG,.JPEG,.BMP +ftp.ip=114.55.150.82 +ftp.root=0 +ftp.username=ftpadmin +ftp.password=ftpadmin + +ftp.readurl=ftp\://114.55.150.82/ \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/tld/spring-form.tld b/src/main/webapp/WEB-INF/tld/spring-form.tld new file mode 100644 index 0000000..a6c39cc --- /dev/null +++ b/src/main/webapp/WEB-INF/tld/spring-form.tld @@ -0,0 +1,2469 @@ + + + + Spring Framework JSP Form Tag Library + 4.3 + form + http://www.springframework.org/tags/form + + + Renders an HTML 'form' tag and exposes a binding path to inner tags + for binding. + form + org.springframework.web.servlet.tags.form.FormTag + JSP + + HTML Standard Attribute + id + false + true + + + HTML Standard Attribute - added for backwards compatibility cases + name + false + true + + + Enable/disable HTML escaping of rendered values. + htmlEscape + false + true + + + Equivalent to "class" - HTML Optional Attribute + cssClass + false + true + + + Equivalent to "style" - HTML Optional Attribute + cssStyle + false + true + + + HTML Standard Attribute + lang + false + true + + + HTML Standard Attribute + title + false + true + + + HTML Standard Attribute + dir + false + true + + + HTML Event Attribute + onclick + false + true + + + HTML Event Attribute + ondblclick + false + true + + + HTML Event Attribute + onmousedown + false + true + + + HTML Event Attribute + onmouseup + false + true + + + HTML Event Attribute + onmouseover + false + true + + + HTML Event Attribute + onmousemove + false + true + + + HTML Event Attribute + onmouseout + false + true + + + HTML Event Attribute + onkeypress + false + true + + + HTML Event Attribute + onkeyup + false + true + + + HTML Event Attribute + onkeydown + false + true + + + Name of the model attribute under which the form object is exposed. + Defaults to 'command'. + modelAttribute + false + true + + + DEPRECATED: Use "modelAttribute" instead. + commandName + false + true + + + HTML Required Attribute + action + false + true + + + Action reference to be appended to the current servlet path + servletRelativeAction + false + true + + + HTML Optional Attribute + method + false + true + + + HTML Optional Attribute + target + false + true + + + HTML Optional Attribute + enctype + false + true + + + Specifies the list of character encodings for input data that is accepted + by the server processing this form. The value is a space- and/or comma-delimited list of + charset values. The client must interpret this list as an exclusive-or list, i.e. the + server is able to accept any single character encoding per entity received. + acceptCharset + false + true + + + HTML Event Attribute + onsubmit + false + true + + + HTML Event Attribute + onreset + false + true + + + Common Optional Attribute + autocomplete + false + true + + + The parameter name used for HTTP methods other then GET and POST. + Default is '_method'. + methodParam + false + true + + true + + + + Renders an HTML 'input' tag with type 'text' using the bound value. + input + org.springframework.web.servlet.tags.form.InputTag + empty + + Path to property for data binding + path + true + true + + + HTML Standard Attribute + id + false + true + + + Enable/disable HTML escaping of rendered values. + htmlEscape + false + true + + + Equivalent to "class" - HTML Optional Attribute + cssClass + false + true + + + Equivalent to "class" - HTML Optional Attribute. + Used when the bound field has errors. + cssErrorClass + false + true + + + Equivalent to "style" - HTML Optional Attribute + cssStyle + false + true + + + HTML Standard Attribute + lang + false + true + + + HTML Standard Attribute + title + false + true + + + HTML Standard Attribute + dir + false + true + + + HTML Standard Attribute + tabindex + false + true + + + HTML Optional Attribute. Setting the value of this attribute to 'true' + will disable the HTML element. + disabled + false + true + + + HTML Event Attribute + onclick + false + true + + + HTML Event Attribute + ondblclick + false + true + + + HTML Event Attribute + onmousedown + false + true + + + HTML Event Attribute + onmouseup + false + true + + + HTML Event Attribute + onmouseover + false + true + + + HTML Event Attribute + onmousemove + false + true + + + HTML Event Attribute + onmouseout + false + true + + + HTML Event Attribute + onkeypress + false + true + + + HTML Event Attribute + onkeyup + false + true + + + HTML Event Attribute + onkeydown + false + true + + + HTML Event Attribute + onfocus + false + true + + + HTML Event Attribute + onblur + false + true + + + HTML Event Attribute + onchange + false + true + + + HTML Standard Attribute + accesskey + false + true + + + HTML Optional Attribute + size + false + true + + + HTML Optional Attribute + maxlength + false + true + + + HTML Optional Attribute + alt + false + true + + + HTML Event Attribute + onselect + false + true + + + HTML Optional Attribute. Setting the value of this attribute to 'true' + will make the HTML element readonly. + readonly + false + true + + + Common Optional Attribute + autocomplete + false + true + + true + + + + Renders an HTML 'input' tag with type 'password' using the bound value. + password + org.springframework.web.servlet.tags.form.PasswordInputTag + empty + + Path to property for data binding + path + true + true + + + HTML Standard Attribute + id + false + true + + + Enable/disable HTML escaping of rendered values. + htmlEscape + false + true + + + Equivalent to "class" - HTML Optional Attribute + cssClass + false + true + + + Equivalent to "class" - HTML Optional Attribute. + Used when the bound field has errors. + cssErrorClass + false + true + + + Equivalent to "style" - HTML Optional Attribute + cssStyle + false + true + + + HTML Standard Attribute + lang + false + true + + + HTML Standard Attribute + title + false + true + + + HTML Standard Attribute + dir + false + true + + + HTML Standard Attribute + tabindex + false + true + + + HTML Optional Attribute. Setting the value of this attribute to 'true' + will disable the HTML element. + disabled + false + true + + + HTML Event Attribute + onclick + false + true + + + HTML Event Attribute + ondblclick + false + true + + + HTML Event Attribute + onmousedown + false + true + + + HTML Event Attribute + onmouseup + false + true + + + HTML Event Attribute + onmouseover + false + true + + + HTML Event Attribute + onmousemove + false + true + + + HTML Event Attribute + onmouseout + false + true + + + HTML Event Attribute + onkeypress + false + true + + + HTML Event Attribute + onkeyup + false + true + + + HTML Event Attribute + onkeydown + false + true + + + HTML Event Attribute + onfocus + false + true + + + HTML Event Attribute + onblur + false + true + + + HTML Event Attribute + onchange + false + true + + + HTML Standard Attribute + accesskey + false + true + + + HTML Optional Attribute + size + false + true + + + HTML Optional Attribute + maxlength + false + true + + + HTML Optional Attribute + alt + false + true + + + HTML Event Attribute + onselect + false + true + + + HTML Optional Attribute. Setting the value of this attribute to 'true' + will make the HTML element readonly. + readonly + false + true + + + Common Optional Attribute + autocomplete + false + true + + + Is the password value to be shown? Defaults to false. + showPassword + false + true + + true + + + + Renders an HTML 'input' tag with type 'hidden' using the bound value. + hidden + org.springframework.web.servlet.tags.form.HiddenInputTag + empty + + Path to property for data binding + path + true + true + + + HTML Standard Attribute + id + false + true + + + Enable/disable HTML escaping of rendered values. + htmlEscape + false + true + + + Equivalent to "class" - HTML Optional Attribute + cssClass + false + true + + + Equivalent to "class" - HTML Optional Attribute. + Used when the bound field has errors. + cssErrorClass + false + true + + + Equivalent to "style" - HTML Optional Attribute + cssStyle + false + true + + + HTML Standard Attribute + lang + false + true + + + HTML Standard Attribute + title + false + true + + + HTML Standard Attribute + dir + false + true + + + HTML Standard Attribute + tabindex + false + true + + + HTML Optional Attribute. Setting the value of this attribute to 'true' + will disable the HTML element. + disabled + false + true + + + HTML Event Attribute + onclick + false + true + + + HTML Event Attribute + ondblclick + false + true + + + HTML Event Attribute + onmousedown + false + true + + + HTML Event Attribute + onmouseup + false + true + + + HTML Event Attribute + onmouseover + false + true + + + HTML Event Attribute + onmousemove + false + true + + + HTML Event Attribute + onmouseout + false + true + + + HTML Event Attribute + onkeypress + false + true + + + HTML Event Attribute + onkeyup + false + true + + + HTML Event Attribute + onkeydown + false + true + + true + + + + Renders an HTML 'select' element. Supports data binding to the + selected option. + select + org.springframework.web.servlet.tags.form.SelectTag + JSP + + Path to property for data binding + path + true + true + + + HTML Standard Attribute + id + false + true + + + Enable/disable HTML escaping of rendered values. + htmlEscape + false + true + + + Equivalent to "class" - HTML Optional Attribute + cssClass + false + true + + + Equivalent to "class" - HTML Optional Attribute. + Used when the bound field has errors. + cssErrorClass + false + true + + + Equivalent to "style" - HTML Optional Attribute + cssStyle + false + true + + + HTML Standard Attribute + lang + false + true + + + HTML Standard Attribute + title + false + true + + + HTML Standard Attribute + dir + false + true + + + HTML Standard Attribute + tabindex + false + true + + + HTML Optional Attribute. Setting the value of this attribute to 'true' + will disable the HTML element. + disabled + false + true + + + HTML Event Attribute + onclick + false + true + + + HTML Event Attribute + ondblclick + false + true + + + HTML Event Attribute + onmousedown + false + true + + + HTML Event Attribute + onmouseup + false + true + + + HTML Event Attribute + onmouseover + false + true + + + HTML Event Attribute + onmousemove + false + true + + + HTML Event Attribute + onmouseout + false + true + + + HTML Event Attribute + onkeypress + false + true + + + HTML Event Attribute + onkeyup + false + true + + + HTML Event Attribute + onkeydown + false + true + + + HTML Event Attribute + onfocus + false + true + + + HTML Event Attribute + onblur + false + true + + + HTML Event Attribute + onchange + false + true + + + HTML Standard Attribute + accesskey + false + true + + + The Collection, Map or array of objects used to generate the + inner 'option' tags + items + false + true + + + Name of the property mapped to 'value' attribute of the + 'option' tag + itemValue + false + true + + + Name of the property mapped to the inner text of the + 'option' tag + itemLabel + false + true + + + HTML Optional Attribute + size + false + true + + + HTML Optional Attribute + multiple + false + true + + true + + + + Renders a single HTML 'option'. + Sets 'selected' as appropriate based on bound value. + option + org.springframework.web.servlet.tags.form.OptionTag + JSP + + The actual value bound to the 'value' attribute + value + java.lang.Object + + + The String representation of thr value bound to the 'value' + attribute, taking into consideration any PropertyEditor associated with + the enclosing 'select' tag. + displayValue + java.lang.String + + + HTML Standard Attribute + id + false + true + + + HTML Optional Attribute + value + true + true + + + HTML Optional Attribute + label + false + true + + + Enable/disable HTML escaping of rendered values. + htmlEscape + false + true + + + Equivalent to "class" - HTML Optional Attribute + cssClass + false + true + + + Equivalent to "class" - HTML Optional Attribute. + Used when the bound field has errors. + cssErrorClass + false + true + + + Equivalent to "style" - HTML Optional Attribute + cssStyle + false + true + + + HTML Standard Attribute + lang + false + true + + + HTML Standard Attribute + title + false + true + + + HTML Standard Attribute + dir + false + true + + + HTML Standard Attribute + tabindex + false + true + + + HTML Optional Attribute. Setting the value of this attribute to 'true' + will disable the HTML element. + disabled + false + true + + + HTML Event Attribute + onclick + false + true + + + HTML Event Attribute + ondblclick + false + true + + + HTML Event Attribute + onmousedown + false + true + + + HTML Event Attribute + onmouseup + false + true + + + HTML Event Attribute + onmouseover + false + true + + + HTML Event Attribute + onmousemove + false + true + + + HTML Event Attribute + onmouseout + false + true + + + HTML Event Attribute + onkeypress + false + true + + + HTML Event Attribute + onkeyup + false + true + + + HTML Event Attribute + onkeydown + false + true + + true + + + + Renders a list of HTML 'option' tags. Sets 'selected' as appropriate + based on bound value. + options + org.springframework.web.servlet.tags.form.OptionsTag + empty + + HTML Standard Attribute + id + false + true + + + The Collection, Map or array of objects used to generate the inner + 'option' tags. This attribute is required unless the containing select's property + for data binding is an Enum, in which case the enum's values are used. + items + false + true + + + Name of the property mapped to 'value' attribute of the 'option' tag + itemValue + false + true + + + Name of the property mapped to the inner text of the 'option' tag + itemLabel + false + true + + + Enable/disable HTML escaping of rendered values. + htmlEscape + false + true + + + Equivalent to "class" - HTML Optional Attribute + cssClass + false + true + + + Equivalent to "class" - HTML Optional Attribute. + Used when the bound field has errors. + cssErrorClass + false + true + + + Equivalent to "style" - HTML Optional Attribute + cssStyle + false + true + + + HTML Standard Attribute + lang + false + true + + + HTML Standard Attribute + title + false + true + + + HTML Standard Attribute + dir + false + true + + + HTML Standard Attribute + tabindex + false + true + + + HTML Optional Attribute. Setting the value of this attribute to 'true' + will disable the HTML element. + disabled + false + true + + + HTML Event Attribute + onclick + false + true + + + HTML Event Attribute + ondblclick + false + true + + + HTML Event Attribute + onmousedown + false + true + + + HTML Event Attribute + onmouseup + false + true + + + HTML Event Attribute + onmouseover + false + true + + + HTML Event Attribute + onmousemove + false + true + + + HTML Event Attribute + onmouseout + false + true + + + HTML Event Attribute + onkeypress + false + true + + + HTML Event Attribute + onkeyup + false + true + + + HTML Event Attribute + onkeydown + false + true + + true + + + + Renders an HTML 'input' tag with type 'radio'. + radiobutton + org.springframework.web.servlet.tags.form.RadioButtonTag + empty + + Path to property for data binding + path + true + true + + + HTML Standard Attribute + id + false + true + + + Enable/disable HTML escaping of rendered values. + htmlEscape + false + true + + + Equivalent to "class" - HTML Optional Attribute + cssClass + false + true + + + Equivalent to "class" - HTML Optional Attribute. + Used when the bound field has errors. + cssErrorClass + false + true + + + Equivalent to "style" - HTML Optional Attribute + cssStyle + false + true + + + HTML Standard Attribute + lang + false + true + + + HTML Standard Attribute + title + false + true + + + HTML Standard Attribute + dir + false + true + + + HTML Standard Attribute + tabindex + false + true + + + HTML Optional Attribute. Setting the value of this attribute to 'true' + will disable the HTML element. + disabled + false + true + + + HTML Event Attribute + onclick + false + true + + + HTML Event Attribute + ondblclick + false + true + + + HTML Event Attribute + onmousedown + false + true + + + HTML Event Attribute + onmouseup + false + true + + + HTML Event Attribute + onmouseover + false + true + + + HTML Event Attribute + onmousemove + false + true + + + HTML Event Attribute + onmouseout + false + true + + + HTML Event Attribute + onkeypress + false + true + + + HTML Event Attribute + onkeyup + false + true + + + HTML Event Attribute + onkeydown + false + true + + + HTML Event Attribute + onfocus + false + true + + + HTML Event Attribute + onblur + false + true + + + HTML Event Attribute + onchange + false + true + + + HTML Standard Attribute + accesskey + false + true + + + HTML Optional Attribute + value + false + true + + + Value to be displayed as part of the tag + label + false + true + + true + + + + Renders multiple HTML 'input' tags with type 'radio'. + radiobuttons + org.springframework.web.servlet.tags.form.RadioButtonsTag + empty + + Path to property for data binding + path + true + true + + + HTML Standard Attribute + id + false + true + + + Enable/disable HTML escaping of rendered values. + htmlEscape + false + true + + + Equivalent to "class" - HTML Optional Attribute + cssClass + false + true + + + Equivalent to "class" - HTML Optional Attribute. + Used when the bound field has errors. + cssErrorClass + false + true + + + Equivalent to "style" - HTML Optional Attribute + cssStyle + false + true + + + HTML Standard Attribute + lang + false + true + + + HTML Standard Attribute + title + false + true + + + HTML Standard Attribute + dir + false + true + + + HTML Standard Attribute + tabindex + false + true + + + HTML Optional Attribute. Setting the value of this attribute to 'true' + will disable the HTML element. + disabled + false + true + + + HTML Event Attribute + onclick + false + true + + + HTML Event Attribute + ondblclick + false + true + + + HTML Event Attribute + onmousedown + false + true + + + HTML Event Attribute + onmouseup + false + true + + + HTML Event Attribute + onmouseover + false + true + + + HTML Event Attribute + onmousemove + false + true + + + HTML Event Attribute + onmouseout + false + true + + + HTML Event Attribute + onkeypress + false + true + + + HTML Event Attribute + onkeyup + false + true + + + HTML Event Attribute + onkeydown + false + true + + + HTML Event Attribute + onfocus + false + true + + + HTML Event Attribute + onblur + false + true + + + HTML Event Attribute + onchange + false + true + + + HTML Standard Attribute + accesskey + false + true + + + The Collection, Map or array of objects used to generate the 'input' + tags with type 'radio'. This attribute is required unless the property for data + binding is an Enum, in which case the enum's values are used. + items + false + true + + + Name of the property mapped to 'value' attribute of the 'input' + tags with type 'radio' + itemValue + false + true + + + Value to be displayed as part of the 'input' tags with type + 'radio' + itemLabel + false + true + + + Delimiter to use between each 'input' tag with type 'radio'. + There is no delimiter by default. + delimiter + false + true + + + Specifies the HTML element that is used to enclose each 'input' + tag with type 'radio'. Defaults to 'span'. + element + false + true + + true + + + + Renders an HTML 'input' tag with type 'checkbox'. + checkbox + org.springframework.web.servlet.tags.form.CheckboxTag + empty + + Path to property for data binding + path + true + true + + + HTML Standard Attribute + id + false + true + + + Enable/disable HTML escaping of rendered values. + htmlEscape + false + true + + + Equivalent to "class" - HTML Optional Attribute + cssClass + false + true + + + Equivalent to "class" - HTML Optional Attribute. + Used when the bound field has errors. + cssErrorClass + false + true + + + Equivalent to "style" - HTML Optional Attribute + cssStyle + false + true + + + HTML Standard Attribute + lang + false + true + + + HTML Standard Attribute + title + false + true + + + HTML Standard Attribute + dir + false + true + + + HTML Standard Attribute + tabindex + false + true + + + HTML Optional Attribute. Setting the value of this attribute to 'true' + will disable the HTML element. + disabled + false + true + + + HTML Event Attribute + onclick + false + true + + + HTML Event Attribute + ondblclick + false + true + + + HTML Event Attribute + onmousedown + false + true + + + HTML Event Attribute + onmouseup + false + true + + + HTML Event Attribute + onmouseover + false + true + + + HTML Event Attribute + onmousemove + false + true + + + HTML Event Attribute + onmouseout + false + true + + + HTML Event Attribute + onkeypress + false + true + + + HTML Event Attribute + onkeyup + false + true + + + HTML Event Attribute + onkeydown + false + true + + + HTML Event Attribute + onfocus + false + true + + + HTML Event Attribute + onblur + false + true + + + HTML Event Attribute + onchange + false + true + + + HTML Standard Attribute + accesskey + false + true + + + HTML Optional Attribute + value + false + true + + + Value to be displayed as part of the tag + label + false + true + + true + + + + Renders multiple HTML 'input' tags with type 'checkbox'. + checkboxes + org.springframework.web.servlet.tags.form.CheckboxesTag + empty + + Path to property for data binding + path + true + true + + + HTML Standard Attribute + id + false + true + + + Enable/disable HTML escaping of rendered values. + htmlEscape + false + true + + + Equivalent to "class" - HTML Optional Attribute + cssClass + false + true + + + Equivalent to "class" - HTML Optional Attribute. + Used when the bound field has errors. + cssErrorClass + false + true + + + Equivalent to "style" - HTML Optional Attribute + cssStyle + false + true + + + HTML Standard Attribute + lang + false + true + + + HTML Standard Attribute + title + false + true + + + HTML Standard Attribute + dir + false + true + + + HTML Standard Attribute + tabindex + false + true + + + HTML Optional Attribute. Setting the value of this attribute to 'true' + will disable the HTML element. + disabled + false + true + + + HTML Event Attribute + onclick + false + true + + + HTML Event Attribute + ondblclick + false + true + + + HTML Event Attribute + onmousedown + false + true + + + HTML Event Attribute + onmouseup + false + true + + + HTML Event Attribute + onmouseover + false + true + + + HTML Event Attribute + onmousemove + false + true + + + HTML Event Attribute + onmouseout + false + true + + + HTML Event Attribute + onkeypress + false + true + + + HTML Event Attribute + onkeyup + false + true + + + HTML Event Attribute + onkeydown + false + true + + + HTML Event Attribute + onfocus + false + true + + + HTML Event Attribute + onblur + false + true + + + HTML Event Attribute + onchange + false + true + + + HTML Standard Attribute + accesskey + false + true + + + The Collection, Map or array of objects used to generate the + 'input' tags with type 'checkbox' + items + true + true + + + Name of the property mapped to 'value' attribute of the 'input' + tags with type 'checkbox' + itemValue + false + true + + + Value to be displayed as part of the 'input' tags with type + 'checkbox' + itemLabel + false + true + + + Delimiter to use between each 'input' tag with type 'checkbox'. + There is no delimiter by default. + delimiter + false + true + + + Specifies the HTML element that is used to enclose each 'input' + tag with type 'checkbox'. Defaults to 'span'. + element + false + true + + true + + + + Renders an HTML 'textarea'. + textarea + org.springframework.web.servlet.tags.form.TextareaTag + empty + + Path to property for data binding + path + true + true + + + HTML Standard Attribute + id + false + true + + + Enable/disable HTML escaping of rendered values. + htmlEscape + false + true + + + Equivalent to "class" - HTML Optional Attribute + cssClass + false + true + + + Equivalent to "class" - HTML Optional Attribute. + Used when the bound field has errors. + cssErrorClass + false + true + + + Equivalent to "style" - HTML Optional Attribute + cssStyle + false + true + + + HTML Standard Attribute + lang + false + true + + + HTML Standard Attribute + title + false + true + + + HTML Standard Attribute + dir + false + true + + + HTML Standard Attribute + tabindex + false + true + + + HTML Optional Attribute. Setting the value of this attribute to 'true' + will disable the HTML element. + disabled + false + true + + + HTML Event Attribute + onclick + false + true + + + HTML Event Attribute + ondblclick + false + true + + + HTML Event Attribute + onmousedown + false + true + + + HTML Event Attribute + onmouseup + false + true + + + HTML Event Attribute + onmouseover + false + true + + + HTML Event Attribute + onmousemove + false + true + + + HTML Event Attribute + onmouseout + false + true + + + HTML Event Attribute + onkeypress + false + true + + + HTML Event Attribute + onkeyup + false + true + + + HTML Event Attribute + onkeydown + false + true + + + HTML Event Attribute + onfocus + false + true + + + HTML Event Attribute + onblur + false + true + + + HTML Event Attribute + onchange + false + true + + + HTML Standard Attribute + accesskey + false + true + + + HTML Required Attribute + rows + false + true + + + HTML Required Attribute + cols + false + true + + + HTML Event Attribute + onselect + false + true + + + HTML Optional Attribute. Setting the value of this attribute to 'true' + will make the HTML element readonly. + readonly + false + true + + true + + + + Renders field errors in an HTML 'span' tag. + errors + org.springframework.web.servlet.tags.form.ErrorsTag + JSP + + messages + java.util.List + + + Path to errors object for data binding + path + false + true + + + HTML Standard Attribute + id + false + true + + + Enable/disable HTML escaping of rendered values. + htmlEscape + false + true + + + Delimiter for displaying multiple error messages. + Defaults to the HTML br tag. + delimiter + false + true + + + Equivalent to "class" - HTML Optional Attribute + cssClass + false + true + + + Equivalent to "style" - HTML Optional Attribute + cssStyle + false + true + + + HTML Standard Attribute + lang + false + true + + + HTML Standard Attribute + title + false + true + + + HTML Standard Attribute + dir + false + true + + + HTML Standard Attribute + tabindex + false + true + + + HTML Event Attribute + onclick + false + true + + + HTML Event Attribute + ondblclick + false + true + + + HTML Event Attribute + onmousedown + false + true + + + HTML Event Attribute + onmouseup + false + true + + + HTML Event Attribute + onmouseover + false + true + + + HTML Event Attribute + onmousemove + false + true + + + HTML Event Attribute + onmouseout + false + true + + + HTML Event Attribute + onkeypress + false + true + + + HTML Event Attribute + onkeyup + false + true + + + HTML Event Attribute + onkeydown + false + true + + + Specifies the HTML element that is used to render the enclosing errors. + element + false + true + + true + + + + Renders a form field label in an HTML 'label' tag. + label + org.springframework.web.servlet.tags.form.LabelTag + JSP + + Path to property for data binding + path + true + true + + + HTML Standard Attribute + id + false + true + + + Enable/disable HTML escaping of rendered values. + htmlEscape + false + true + + + HTML Standard Attribute + for + false + true + + + Equivalent to "class" - HTML Optional Attribute. + cssClass + false + true + + + Equivalent to "class" - HTML Optional Attribute. + Used only when errors are present. + cssErrorClass + false + true + + + Equivalent to "style" - HTML Optional Attribute + cssStyle + false + true + + + HTML Standard Attribute + lang + false + true + + + HTML Standard Attribute + title + false + true + + + HTML Standard Attribute + dir + false + true + + + HTML Standard Attribute + tabindex + false + true + + + HTML Event Attribute + onclick + false + true + + + HTML Event Attribute + ondblclick + false + true + + + HTML Event Attribute + onmousedown + false + true + + + HTML Event Attribute + onmouseup + false + true + + + HTML Event Attribute + onmouseover + false + true + + + HTML Event Attribute + onmousemove + false + true + + + HTML Event Attribute + onmouseout + false + true + + + HTML Event Attribute + onkeypress + false + true + + + HTML Event Attribute + onkeyup + false + true + + + HTML Event Attribute + onkeydown + false + true + + true + + + + Renders an HTML 'button' tag. + button + org.springframework.web.servlet.tags.form.ButtonTag + JSP + + HTML Standard Attribute + id + false + true + + + The name attribute for the HTML button tag + name + false + true + + + The value attribute for the HTML button tag + value + false + true + + + HTML Optional Attribute. Setting the value of this attribute to 'true' + will disable the HTML element. + disabled + false + true + + true + + + diff --git a/src/main/webapp/WEB-INF/tld/spring.tld b/src/main/webapp/WEB-INF/tld/spring.tld new file mode 100644 index 0000000..8c6a8ca --- /dev/null +++ b/src/main/webapp/WEB-INF/tld/spring.tld @@ -0,0 +1,467 @@ + + + + Spring Framework JSP Tag Library + 4.0 + spring + http://www.springframework.org/tags + + + Sets default HTML escape value for the current page. + Overrides a "defaultHtmlEscape" context-param in web.xml, if any. + htmlEscape + org.springframework.web.servlet.tags.HtmlEscapeTag + JSP + + Set the default value for HTML escaping, to be put + into the current PageContext. + defaultHtmlEscape + true + true + + + + + Escapes its enclosed body content, applying HTML escaping and/or JavaScript + escaping. The HTML escaping flag participates in a page-wide or application-wide setting + (i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml). + escapeBody + org.springframework.web.servlet.tags.EscapeBodyTag + JSP + + Set HTML escaping for this tag, as boolean value. Overrides the + default HTML escaping setting for the current page. + htmlEscape + false + true + + + Set JavaScript escaping for this tag, as boolean value. + Default is 'false'. + javaScriptEscape + false + true + + + + + Retrieves the message with the given code, or text if code isn't resolvable. + The HTML escaping flag participates in a page-wide or application-wide setting + (i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml). + message + org.springframework.web.servlet.tags.MessageTag + JSP + + A MessageSourceResolvable argument (direct or through JSP EL). + Fits nicely when used in conjunction with Spring's own validation error classes + which all implement the MessageSourceResolvable interface. For example, this + allows you to iterate over all of the errors in a form, passing each error + (using a runtime expression) as the value of this 'message' attribute, thus + effecting the easy display of such error messages. + message + false + true + + + The code (key) to use when looking up the message. + If code is not provided, the text attribute will be used. + code + false + true + + + Set optional message arguments for this tag, as a (comma-) + delimited String (each String argument can contain JSP EL), an Object array + (used as argument array), or a single Object (used as single argument). + You can additionally use nested spring:argument tags. + arguments + false + true + + + The separator character to be used for splitting the + arguments string value; defaults to a 'comma' (','). + argumentSeparator + false + true + + + Default text to output when a message for the given code + could not be found. If both text and code are not set, the tag will + output null. + text + false + true + + + The string to use when binding the result to the page, + request, session or application scope. If not specified, the result + gets outputted to the writer (i.e. typically directly to the JSP). + var + false + true + + + The scope to use when exporting the result to a variable. + This attribute is only used when var is also set. Possible values are + page, request, session and application. + scope + false + true + + + Set HTML escaping for this tag, as boolean value. + Overrides the default HTML escaping setting for the current page. + htmlEscape + false + true + + + Set JavaScript escaping for this tag, as boolean value. + Default is 'false'. + javaScriptEscape + false + true + + + + + Retrieves the theme message with the given code, or text if code isn't + resolvable. The HTML escaping flag participates in a page-wide or application-wide setting + (i.e. by HtmlEscapeTag or a "defaultHtmlEscape" context-param in web.xml). + theme + org.springframework.web.servlet.tags.ThemeTag + JSP + + A MessageSourceResolvable argument (direct or through JSP EL). + message + false + true + + + The code (key) to use when looking up the message. + If code is not provided, the text attribute will be used. + code + false + true + + + Set optional message arguments for this tag, as a (comma-) + delimited String (each String argument can contain JSP EL), an Object array + (used as argument array), or a single Object (used as single argument). + You can additionally use nested spring:argument tags. + arguments + false + true + + + The separator character to be used for splitting the + arguments string value; defaults to a 'comma' (','). + argumentSeparator + false + true + + + Default text to output when a message for the given code + could not be found. If both text and code are not set, the tag will + output null. + text + false + true + + + The string to use when binding the result to the page, + request, session or application scope. If not specified, the result + gets outputted to the writer (i.e. typically directly to the JSP). + var + false + true + + + The scope to use when exporting the result to a variable. + This attribute is only used when var is also set. Possible values are + page, request, session and application. + scope + false + true + + + Set HTML escaping for this tag, as boolean value. + Overrides the default HTML escaping setting for the current page. + htmlEscape + false + true + + + Set JavaScript escaping for this tag, as boolean value. + Default is 'false'. + javaScriptEscape + false + true + + + + + Argument tag based on the JSTL fmt:param tag. The purpose is to + support arguments inside the spring:message and spring:theme tags. + argument + org.springframework.web.servlet.tags.ArgumentTag + JSP + + The value of the argument. + value + false + true + java.lang.Object + + + + + Provides Errors instance in case of bind errors. The HTML escaping + flag participates in a page-wide or application-wide setting (i.e. by HtmlEscapeTag + or a "defaultHtmlEscape" context-param in web.xml). + hasBindErrors + org.springframework.web.servlet.tags.BindErrorsTag + JSP + + errors + org.springframework.validation.Errors + + + The name of the bean in the request, that needs to be + inspected for errors. If errors are available for this bean, they + will be bound under the 'errors' key. + name + true + true + + + Set HTML escaping for this tag, as boolean value. + Overrides the default HTML escaping setting for the current page. + htmlEscape + false + true + + + + + Sets a nested path to be used by the bind tag's path. + nestedPath + org.springframework.web.servlet.tags.NestedPathTag + JSP + + nestedPath + java.lang.String + + + Set the path that this tag should apply. E.g. 'customer' + to allow bind paths like 'address.street' rather than + 'customer.address.street'. + path + true + true + + + + + Provides BindStatus object for the given bind path. The HTML escaping + flag participates in a page-wide or application-wide setting (i.e. by HtmlEscapeTag + or a "defaultHtmlEscape" context-param in web.xml). + bind + org.springframework.web.servlet.tags.BindTag + JSP + + status + org.springframework.web.servlet.support.BindStatus + + + The path to the bean or bean property to bind status + information for. For instance account.name, company.address.zipCode + or just employee. The status object will exported to the page scope, + specifically for this bean or bean property. + path + true + true + + + Set whether to ignore a nested path, if any. + Default is to not ignore. + ignoreNestedPath + false + true + + + Set HTML escaping for this tag, as boolean value. Overrides + the default HTML escaping setting for the current page. + htmlEscape + false + true + + + + + Provides transformation of variables to Strings, using an appropriate + custom PropertyEditor from BindTag (can only be used inside BindTag). The HTML + escaping flag participates in a page-wide or application-wide setting (i.e. by + HtmlEscapeTag or a 'defaultHtmlEscape' context-param in web.xml). + transform + org.springframework.web.servlet.tags.TransformTag + JSP + + The value to transform. This is the actual object you want + to have transformed (for instance a Date). Using the PropertyEditor that + is currently in use by the 'spring:bind' tag. + value + true + true + + + The string to use when binding the result to the page, + request, session or application scope. If not specified, the result gets + outputted to the writer (i.e. typically directly to the JSP). + var + false + true + + + The scope to use when exported the result to a variable. + This attribute is only used when var is also set. Possible values are + page, request, session and application. + scope + false + true + + + Set HTML escaping for this tag, as boolean value. Overrides + the default HTML escaping setting for the current page. + htmlEscape + false + true + + + + + URL tag based on the JSTL c:url tag. This variant is fully + backwards compatible with the standard tag. Enhancements include support + for URL template parameters. + url + org.springframework.web.servlet.tags.UrlTag + JSP + + The URL to build. This value can include template place holders + that are replaced with the URL encoded value of the named parameter. Parameters + must be defined using the param tag inside the body of this tag. + value + true + true + + + Specifies a remote application context path. The default is the + current application context path. + context + false + true + + + The name of the variable to export the URL value to. + var + false + true + + + The scope for the var. 'application', 'session', 'request' and + 'page' scopes are supported. Defaults to page scope. This attribute has no + effect unless the var attribute is also defined. + scope + false + true + + + Set HTML escaping for this tag, as a boolean value. Overrides the + default HTML escaping setting for the current page. + htmlEscape + false + true + + + Set JavaScript escaping for this tag, as a boolean value. + Default is 'false'. + javaScriptEscape + false + true + + + + + Parameter tag based on the JSTL c:param tag. The sole purpose is to + support params inside the spring:url tag. + param + org.springframework.web.servlet.tags.ParamTag + JSP + + The name of the parameter. + name + true + true + + + The value of the parameter. + value + false + true + + + + + Evaluates a Spring expression (SpEL) and either prints the result + or assigns it to a variable. + eval + org.springframework.web.servlet.tags.EvalTag + JSP + + The expression to evaluate. + expression + true + true + + + The name of the variable to export the evaluation result to. + var + false + true + + + The scope for the var. 'application', 'session', 'request' and + 'page' scopes are supported. Defaults to page scope. This attribute has no + effect unless the var attribute is also defined. + scope + false + true + + + Set HTML escaping for this tag, as a boolean value. Overrides the + default HTML escaping setting for the current page. + htmlEscape + false + true + + + Set JavaScript escaping for this tag, as a boolean value. + Default is 'false'. + javaScriptEscape + false + true + + + + + Helps to prepare a URL to a Spring MVC controller method. + mvcUrl + org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder + org.springframework.web.servlet.mvc.method.annotation.MvcUriComponentsBuilder.MethodArgumentBuilder fromMappingName(java.lang.String) + + + diff --git a/src/main/webapp/WEB-INF/view/admin/batchUpload.jsp b/src/main/webapp/WEB-INF/view/admin/batchUpload.jsp new file mode 100644 index 0000000..b7227ec --- /dev/null +++ b/src/main/webapp/WEB-INF/view/admin/batchUpload.jsp @@ -0,0 +1,32 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + +

\ No newline at end of file diff --git a/src/main/webapp/WEB-INF/view/admin/bottom.jsp b/src/main/webapp/WEB-INF/view/admin/bottom.jsp index 954c032..bc74a8a 100644 --- a/src/main/webapp/WEB-INF/view/admin/bottom.jsp +++ b/src/main/webapp/WEB-INF/view/admin/bottom.jsp @@ -11,17 +11,20 @@ - + + + + diff --git a/src/main/webapp/breadcrumb.jsp b/src/main/webapp/WEB-INF/view/admin/breadcrumb.jsp similarity index 100% rename from src/main/webapp/breadcrumb.jsp rename to src/main/webapp/WEB-INF/view/admin/breadcrumb.jsp diff --git a/src/main/webapp/WEB-INF/view/admin/main.jsp b/src/main/webapp/WEB-INF/view/admin/main.jsp index a21c6de..fc34ce2 100644 --- a/src/main/webapp/WEB-INF/view/admin/main.jsp +++ b/src/main/webapp/WEB-INF/view/admin/main.jsp @@ -1,5 +1,7 @@ <%@ page contentType="text/html;charset=UTF-8" language="java"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> + +
@@ -109,3 +111,4 @@
+ diff --git a/src/main/webapp/WEB-INF/view/admin/nav.jsp b/src/main/webapp/WEB-INF/view/admin/nav.jsp index f609c1f..b6979b2 100644 --- a/src/main/webapp/WEB-INF/view/admin/nav.jsp +++ b/src/main/webapp/WEB-INF/view/admin/nav.jsp @@ -34,25 +34,20 @@ - + + + + + - - - -
- \ No newline at end of file + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/view/admin/pageSplit.jsp b/src/main/webapp/WEB-INF/view/admin/pageSplit.jsp new file mode 100644 index 0000000..690c0d7 --- /dev/null +++ b/src/main/webapp/WEB-INF/view/admin/pageSplit.jsp @@ -0,0 +1,40 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java"%> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> + + + diff --git a/src/main/webapp/WEB-INF/view/admin/system/resource/resource.jsp b/src/main/webapp/WEB-INF/view/admin/system/resource/resource.jsp index 057310b..afad3c5 100644 --- a/src/main/webapp/WEB-INF/view/admin/system/resource/resource.jsp +++ b/src/main/webapp/WEB-INF/view/admin/system/resource/resource.jsp @@ -5,7 +5,7 @@
- +

权限管理

@@ -20,6 +20,12 @@
+
+
+
+ 新增 +
+
@@ -34,6 +40,7 @@ @@ -41,9 +48,8 @@
${resource.name} ${resource.permission} + 修改 删除
- 添加权限 -
+ +
diff --git a/src/main/webapp/WEB-INF/view/admin/system/resource/resource_add.jsp b/src/main/webapp/WEB-INF/view/admin/system/resource/resource_add.jsp index a5dd721..a9bbc00 100644 --- a/src/main/webapp/WEB-INF/view/admin/system/resource/resource_add.jsp +++ b/src/main/webapp/WEB-INF/view/admin/system/resource/resource_add.jsp @@ -5,7 +5,7 @@
- +

权限管理

diff --git a/src/main/webapp/WEB-INF/view/admin/system/resource/resource_update.jsp b/src/main/webapp/WEB-INF/view/admin/system/resource/resource_update.jsp new file mode 100644 index 0000000..22784c3 --- /dev/null +++ b/src/main/webapp/WEB-INF/view/admin/system/resource/resource_update.jsp @@ -0,0 +1,51 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + +
+
+ +
+

权限管理

+
+
+
+
+
+
+
+ 权限信息 +
+ +
+
+
+ + + + + + + + +
+
+ +
+ +
+ +
+ +
+
+ + +
+ + + + diff --git a/src/main/webapp/WEB-INF/view/admin/system/role/role.jsp b/src/main/webapp/WEB-INF/view/admin/system/role/role.jsp index 1d12769..b5a0a2b 100644 --- a/src/main/webapp/WEB-INF/view/admin/system/role/role.jsp +++ b/src/main/webapp/WEB-INF/view/admin/system/role/role.jsp @@ -1,11 +1,10 @@ <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> -<%----%>
- +

角色管理

@@ -20,6 +19,13 @@
+
+
+
+ 新增 +
+
@@ -44,10 +50,10 @@
- 添加角色 -
+ + +
diff --git a/src/main/webapp/WEB-INF/view/admin/system/role/role_add.jsp b/src/main/webapp/WEB-INF/view/admin/system/role/role_add.jsp index 8624eba..e4de033 100644 --- a/src/main/webapp/WEB-INF/view/admin/system/role/role_add.jsp +++ b/src/main/webapp/WEB-INF/view/admin/system/role/role_add.jsp @@ -5,7 +5,7 @@
- +

用户管理

diff --git a/src/main/webapp/WEB-INF/view/admin/system/role/role_update.jsp b/src/main/webapp/WEB-INF/view/admin/system/role/role_update.jsp index 8606bc9..546f80b 100644 --- a/src/main/webapp/WEB-INF/view/admin/system/role/role_update.jsp +++ b/src/main/webapp/WEB-INF/view/admin/system/role/role_update.jsp @@ -6,7 +6,7 @@
- +

角色管理

diff --git a/src/main/webapp/WEB-INF/view/admin/system/user/user.jsp b/src/main/webapp/WEB-INF/view/admin/system/user/user.jsp index 119618e..1c7c440 100644 --- a/src/main/webapp/WEB-INF/view/admin/system/user/user.jsp +++ b/src/main/webapp/WEB-INF/view/admin/system/user/user.jsp @@ -5,7 +5,7 @@
- +

用户管理

@@ -20,9 +20,17 @@
+
+
+
+ 新增 +
+
+ @@ -33,8 +41,9 @@ + - +
登录名 用户名 密码 权限
${user.userId}${user.username} ${user.password}${user.roleIdsStr}${user.roleDesc} 修改  
- 添加用户 + +
diff --git a/src/main/webapp/WEB-INF/view/admin/system/user/user_add.jsp b/src/main/webapp/WEB-INF/view/admin/system/user/user_add.jsp index a15acd6..81d482c 100644 --- a/src/main/webapp/WEB-INF/view/admin/system/user/user_add.jsp +++ b/src/main/webapp/WEB-INF/view/admin/system/user/user_add.jsp @@ -5,7 +5,7 @@
- +

用户管理

@@ -21,8 +21,10 @@
- + + + diff --git a/src/main/webapp/WEB-INF/view/admin/system/user/user_update.jsp b/src/main/webapp/WEB-INF/view/admin/system/user/user_update.jsp index b4d0105..ca42f70 100644 --- a/src/main/webapp/WEB-INF/view/admin/system/user/user_update.jsp +++ b/src/main/webapp/WEB-INF/view/admin/system/user/user_update.jsp @@ -6,7 +6,7 @@
- +

用户管理

@@ -22,9 +22,10 @@
- + -

+ + diff --git a/src/main/webapp/WEB-INF/view/vm/agent/agent.jsp b/src/main/webapp/WEB-INF/view/vm/agent/agent.jsp new file mode 100644 index 0000000..a1d8105 --- /dev/null +++ b/src/main/webapp/WEB-INF/view/vm/agent/agent.jsp @@ -0,0 +1,106 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%> + + +
+
+ +
+
+
+
+
+
+ 代理商信息 +
+ +
+
+ + +
+ +
+
+ 新增 + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + + + +
级别名称绑定职员区域openid操作
${agent.level.getName()}${agent.agentName}${agent.usernames}${agent.area}${agent.openid} + 修改 + 删除 +
+ +
+
+ +
+ +
+ +
+ +
+
+ + +
+ + + diff --git a/src/main/webapp/WEB-INF/view/vm/agent/agent_add.jsp b/src/main/webapp/WEB-INF/view/vm/agent/agent_add.jsp new file mode 100644 index 0000000..57b6332 --- /dev/null +++ b/src/main/webapp/WEB-INF/view/vm/agent/agent_add.jsp @@ -0,0 +1,76 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> + + +
+
+ +
+

代理商管理

+
+
+
+
+
+
+
+ 代理商管理 +
+ +
+
+ +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + +
+
+ +
+ +
+ +
+ +
+
+ +
+ diff --git a/src/main/webapp/WEB-INF/view/vm/agent/agent_update.jsp b/src/main/webapp/WEB-INF/view/vm/agent/agent_update.jsp new file mode 100644 index 0000000..56ecf16 --- /dev/null +++ b/src/main/webapp/WEB-INF/view/vm/agent/agent_update.jsp @@ -0,0 +1,77 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> + + +
+
+ +
+

代理商管理

+
+
+
+
+
+
+
+ 代理商管理 +
+ +
+
+ + +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + +
+
+ +
+ +
+ +
+ +
+
+ +
+ diff --git a/src/main/webapp/WEB-INF/view/vm/area/area.jsp b/src/main/webapp/WEB-INF/view/vm/area/area.jsp new file mode 100644 index 0000000..2e9605b --- /dev/null +++ b/src/main/webapp/WEB-INF/view/vm/area/area.jsp @@ -0,0 +1,82 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%> + + +
+
+ +
+
+
+
+
+
+ 区域信息 +
+ +
+
+ + +
+ +
+ + + +
+ + + + + + + + + + + + + + + +
区域操作
${area.area} + 修改 + 删除 +
+ +
+
+ +
+ +
+ +
+ +
+
+ + +
+ + + diff --git a/src/main/webapp/WEB-INF/view/vm/area/area_add.jsp b/src/main/webapp/WEB-INF/view/vm/area/area_add.jsp new file mode 100644 index 0000000..9bdae1b --- /dev/null +++ b/src/main/webapp/WEB-INF/view/vm/area/area_add.jsp @@ -0,0 +1,47 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> + + +
+
+ +
+

区域管理

+
+
+
+
+
+
+
+ 区域管理 +
+ +
+
+ +
+ +
+ +
+
+ + +
+
+ +
+ +
+ +
+ +
+
+ +
+ diff --git a/src/main/webapp/WEB-INF/view/vm/area/area_update.jsp b/src/main/webapp/WEB-INF/view/vm/area/area_update.jsp new file mode 100644 index 0000000..9277654 --- /dev/null +++ b/src/main/webapp/WEB-INF/view/vm/area/area_update.jsp @@ -0,0 +1,48 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> + + +
+
+ +
+

区域管理

+
+
+
+
+
+
+
+ 区域管理 +
+ +
+
+ + +
+ +
+ +
+
+ + +
+
+ +
+ +
+ +
+ +
+
+ +
+ diff --git a/src/main/webapp/WEB-INF/view/vm/car/car.jsp b/src/main/webapp/WEB-INF/view/vm/car/car.jsp index 6b009d9..7ecd3c2 100644 --- a/src/main/webapp/WEB-INF/view/vm/car/car.jsp +++ b/src/main/webapp/WEB-INF/view/vm/car/car.jsp @@ -1,13 +1,11 @@ <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
- -
-

车辆管理

-
+
@@ -19,36 +17,61 @@
- <%-- -
查询条件
+ + +
+
- +
+ 新增 + +
+ + +
- --%> @@ -84,7 +107,9 @@
- 添加车辆 + +
+
diff --git a/src/main/webapp/WEB-INF/view/vm/car/car_add.jsp b/src/main/webapp/WEB-INF/view/vm/car/car_add.jsp index b4b6724..40e2f4b 100644 --- a/src/main/webapp/WEB-INF/view/vm/car/car_add.jsp +++ b/src/main/webapp/WEB-INF/view/vm/car/car_add.jsp @@ -4,7 +4,7 @@
- +

车辆管理

diff --git a/src/main/webapp/WEB-INF/view/vm/car/car_update.jsp b/src/main/webapp/WEB-INF/view/vm/car/car_update.jsp index 40da84f..3beaf10 100644 --- a/src/main/webapp/WEB-INF/view/vm/car/car_update.jsp +++ b/src/main/webapp/WEB-INF/view/vm/car/car_update.jsp @@ -5,7 +5,7 @@
- +

车辆管理

diff --git a/src/main/webapp/WEB-INF/view/vm/order/external_order_add.jsp b/src/main/webapp/WEB-INF/view/vm/order/external_order_add.jsp new file mode 100644 index 0000000..40da619 --- /dev/null +++ b/src/main/webapp/WEB-INF/view/vm/order/external_order_add.jsp @@ -0,0 +1,64 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + + + 代理商订单 + + + + + + + + +
+

订单申请

+ +
+ + +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+
+ +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/view/vm/order/external_order_add_success.jsp b/src/main/webapp/WEB-INF/view/vm/order/external_order_add_success.jsp new file mode 100644 index 0000000..70be05b --- /dev/null +++ b/src/main/webapp/WEB-INF/view/vm/order/external_order_add_success.jsp @@ -0,0 +1,32 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + + + + 代理商订单 + + + + + + + + +
+

订单申请成功

+
+ + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/view/vm/order/order.jsp b/src/main/webapp/WEB-INF/view/vm/order/order.jsp new file mode 100644 index 0000000..1b19b6a --- /dev/null +++ b/src/main/webapp/WEB-INF/view/vm/order/order.jsp @@ -0,0 +1,102 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%> + + +
+
+ +
+
+
+
+
+
+ 代理商信息 +
+ +
+
+ + +
+ +
+
+ 新增 + +
+ + +
+ + + + + + + + + + + + + + + + + + + + + +
级别名称绑定职员区域操作
${agent.level.getName()}${agent.agentName}${agent.usernames}${agent.area} + 修改 + 删除 +
+ +
+
+ +
+ +
+ +
+ +
+
+ + +
+ + + diff --git a/src/main/webapp/WEB-INF/view/vm/order/order_update.jsp b/src/main/webapp/WEB-INF/view/vm/order/order_update.jsp new file mode 100644 index 0000000..f1715fe --- /dev/null +++ b/src/main/webapp/WEB-INF/view/vm/order/order_update.jsp @@ -0,0 +1,71 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> + + +
+
+ +
+

代理商管理

+
+
+
+
+
+
+
+ 代理商管理 +
+ +
+
+ + +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+ + +
+
+ +
+ +
+ +
+ +
+
+ +
+ diff --git a/src/main/webapp/WEB-INF/view/vm/procurement/procurement.jsp b/src/main/webapp/WEB-INF/view/vm/procurement/procurement.jsp new file mode 100644 index 0000000..b338241 --- /dev/null +++ b/src/main/webapp/WEB-INF/view/vm/procurement/procurement.jsp @@ -0,0 +1,111 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + +
+
+ +
+
+
+
+
+
+ 采购管理 +
+ +
+
+
+ +
+ +
+
+ 新增 +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + +
采购单编号采购时间采购量采购价格操作
${procurement.procureId}${procurement.procureTime}${procurement.inventory}${procurement.price} + 修改 + 删除 +
+ +
+
+ +
+ +
+ +
+ +
+
+ + +
+ + + diff --git a/src/main/webapp/WEB-INF/view/vm/procurement/procurement_add.jsp b/src/main/webapp/WEB-INF/view/vm/procurement/procurement_add.jsp new file mode 100644 index 0000000..8da3f8d --- /dev/null +++ b/src/main/webapp/WEB-INF/view/vm/procurement/procurement_add.jsp @@ -0,0 +1,67 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> + + +
+
+ +
+

采购管理

+
+
+
+
+
+
+
+ 采购管理 +
+ +
+
+
+
+ +
+ + + +
+
+
+ +
+ +
+ +
+ +
+ +
+ +
+
+
+ +
+ + +
+
+ +
+ +
+ +
+ +
+
+ + +
+ diff --git a/src/main/webapp/WEB-INF/view/vm/procurement/procurement_update.jsp b/src/main/webapp/WEB-INF/view/vm/procurement/procurement_update.jsp new file mode 100644 index 0000000..ccbcb41 --- /dev/null +++ b/src/main/webapp/WEB-INF/view/vm/procurement/procurement_update.jsp @@ -0,0 +1,65 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> + + + +
+
+ +
+

采购管理

+
+
+
+
+
+
+
+ 采购管理 +
+ +
+
+
+ +
+ +
+ +
+
+
+ +
+ +
+ +
+ +
+ +
+ + +
+
+ + +
+
+ +
+ +
+ +
+ +
+
+ + +
+ diff --git a/src/main/webapp/WEB-INF/view/vm/standard/standard.jsp b/src/main/webapp/WEB-INF/view/vm/standard/standard.jsp index b2ab6a2..a9ac030 100644 --- a/src/main/webapp/WEB-INF/view/vm/standard/standard.jsp +++ b/src/main/webapp/WEB-INF/view/vm/standard/standard.jsp @@ -1,10 +1,11 @@ <%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
- +

规格管理

@@ -19,6 +20,31 @@
+ + +
+ +
+ + + +
@@ -39,7 +65,8 @@
- 添加规格 + +
diff --git a/src/main/webapp/WEB-INF/view/vm/standard/standard_add.jsp b/src/main/webapp/WEB-INF/view/vm/standard/standard_add.jsp index 718a644..b31ff16 100644 --- a/src/main/webapp/WEB-INF/view/vm/standard/standard_add.jsp +++ b/src/main/webapp/WEB-INF/view/vm/standard/standard_add.jsp @@ -4,7 +4,7 @@
- +

规格管理

diff --git a/src/main/webapp/WEB-INF/view/vm/standard/standard_update.jsp b/src/main/webapp/WEB-INF/view/vm/standard/standard_update.jsp index 64fc513..0d3189f 100644 --- a/src/main/webapp/WEB-INF/view/vm/standard/standard_update.jsp +++ b/src/main/webapp/WEB-INF/view/vm/standard/standard_update.jsp @@ -5,7 +5,7 @@
- +

规格管理

diff --git a/src/main/webapp/WEB-INF/view/vm/vendor/vendor.jsp b/src/main/webapp/WEB-INF/view/vm/vendor/vendor.jsp new file mode 100644 index 0000000..8233de5 --- /dev/null +++ b/src/main/webapp/WEB-INF/view/vm/vendor/vendor.jsp @@ -0,0 +1,102 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%> + + +
+
+ +
+
+
+
+
+
+ 厂商信息 +
+ +
+
+ + +
+ +
+ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
厂商负责人网站地址电话手机邮箱操作
${vendor.vendorName}${vendor.contact}点击跳转 + ${vendor.address}${vendor.telephone}${vendor.phone}${vendor.email} + 修改 + 删除 +
+ +
+
+ +
+ +
+ +
+ +
+
+ + +
+ + + diff --git a/src/main/webapp/WEB-INF/view/vm/vendor/vendor_add.jsp b/src/main/webapp/WEB-INF/view/vm/vendor/vendor_add.jsp new file mode 100644 index 0000000..3a1d168 --- /dev/null +++ b/src/main/webapp/WEB-INF/view/vm/vendor/vendor_add.jsp @@ -0,0 +1,98 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> + + +
+
+ +
+

厂商管理

+
+
+
+
+
+
+
+ 厂商管理 +
+ +
+
+ +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ + +
+
+ + +
+
+ +
+ +
+ +
+ +
+
+ +
+ + + \ No newline at end of file diff --git a/src/main/webapp/WEB-INF/view/vm/vendor/vendor_update.jsp b/src/main/webapp/WEB-INF/view/vm/vendor/vendor_update.jsp new file mode 100644 index 0000000..e496d78 --- /dev/null +++ b/src/main/webapp/WEB-INF/view/vm/vendor/vendor_update.jsp @@ -0,0 +1,99 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> +<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> +<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form" %> + + +
+
+ +
+

厂商管理

+
+
+
+
+
+
+
+ 厂商管理 +
+ +
+
+ + +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ + +
+
+ + +
+
+ +
+ +
+ +
+ +
+
+ +
+ + + diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml index 7844f93..0bdc465 100644 --- a/src/main/webapp/WEB-INF/web.xml +++ b/src/main/webapp/WEB-INF/web.xml @@ -11,7 +11,7 @@ contextConfigLocation - classpath:spring.xml + classpath:spring/spring.xml org.springframework.web.util.Log4jConfigListener @@ -25,6 +25,10 @@ default *.jpg + + default + *.xlsx + default *.lang @@ -37,6 +41,18 @@ default *.woff + + default + *.ttf + + + default + *.svg + + + default + *.eot + default *.woff2 @@ -49,6 +65,10 @@ default *.css + + default + *.less + default *.html @@ -65,11 +85,18 @@ default *.gif - - default - *.ttf - - + + + + + http://www.springframework.org/tags/form + tld/spring-form.tld + + + http://www.springframework.org/tags + tld/spring.tld + + @@ -108,7 +135,7 @@ org.springframework.web.servlet.DispatcherServlet contextConfigLocation - classpath:spring-mvc.xml + classpath:spring/spring-mvc.xml 1 diff --git a/src/main/webapp/bower_components/bootstrap/less/mixins/grid-framework.less b/src/main/webapp/bower_components/bootstrap/less/mixins/grid-framework.less index 8c23eed..f2a6925 100644 --- a/src/main/webapp/bower_components/bootstrap/less/mixins/grid-framework.less +++ b/src/main/webapp/bower_components/bootstrap/less/mixins/grid-framework.less @@ -45,7 +45,7 @@ .calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) { .col-@{class}-@{index} { - width: percentage((@index / @grid-columns)); + width: percentage((@index / @grid-columns))+1; } } .calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) { diff --git a/src/main/webapp/bower_components/sweetalert/sweetalert-dev.js b/src/main/webapp/bower_components/sweetalert/sweetalert-dev.js new file mode 100644 index 0000000..9198f2f --- /dev/null +++ b/src/main/webapp/bower_components/sweetalert/sweetalert-dev.js @@ -0,0 +1,1240 @@ +;(function(window, document, undefined) { + "use strict"; + + (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o call showInputError with errorMessage + */ +sweetAlert.showInputError = swal.showInputError = function (errorMessage) { + var modal = _sweetAlertInitialize$getModal$getOverlay$getInput$setFocusStyle$openModal$resetInput$fixVerticalPosition.getModal(); + + var $errorIcon = modal.querySelector('.sa-input-error'); + _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide$isDescendant$getTopMargin$fadeIn$fadeOut$fireClick$stopEventPropagation.addClass($errorIcon, 'show'); + + var $errorContainer = modal.querySelector('.sa-error-container'); + _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide$isDescendant$getTopMargin$fadeIn$fadeOut$fireClick$stopEventPropagation.addClass($errorContainer, 'show'); + + $errorContainer.querySelector('p').innerHTML = errorMessage; + + modal.querySelector('input').focus(); +}; + +/* + * Reset input error DOM elements + */ +sweetAlert.resetInputError = swal.resetInputError = function (event) { + // If press enter => ignore + if (event && event.keyCode === 13) { + return false; + } + + var $modal = _sweetAlertInitialize$getModal$getOverlay$getInput$setFocusStyle$openModal$resetInput$fixVerticalPosition.getModal(); + + var $errorIcon = $modal.querySelector('.sa-input-error'); + _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide$isDescendant$getTopMargin$fadeIn$fadeOut$fireClick$stopEventPropagation.removeClass($errorIcon, 'show'); + + var $errorContainer = $modal.querySelector('.sa-error-container'); + _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide$isDescendant$getTopMargin$fadeIn$fadeOut$fireClick$stopEventPropagation.removeClass($errorContainer, 'show'); +}; + +if (typeof window !== 'undefined') { + // The 'handle-click' module requires + // that 'sweetAlert' was set as global. + window.sweetAlert = window.swal = sweetAlert; +} else { + _extend$hexToRgb$isIE8$logStr$colorLuminance.logStr('SweetAlert is a frontend module!'); +} + +},{"./modules/default-params":2,"./modules/handle-click":3,"./modules/handle-dom":4,"./modules/handle-key":5,"./modules/handle-swal-dom":6,"./modules/set-params":8,"./modules/utils":9}],2:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); +var defaultParams = { + title: '', + text: '', + type: null, + allowOutsideClick: false, + showConfirmButton: true, + showCancelButton: false, + closeOnConfirm: true, + closeOnCancel: true, + confirmButtonText: 'OK', + confirmButtonColor: '#AEDEF4', + cancelButtonText: 'Cancel', + imageUrl: null, + imageSize: null, + timer: null, + customClass: '', + html: false, + animation: true, + allowEscapeKey: true, + inputType: 'text', + inputPlaceholder: '', + inputValue: '' +}; + +exports['default'] = defaultParams; +module.exports = exports['default']; + +},{}],3:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); + +var _colorLuminance = require('./utils'); + +var _getModal = require('./handle-swal-dom'); + +var _hasClass$isDescendant = require('./handle-dom'); + +/* + * User clicked on "Confirm"/"OK" or "Cancel" + */ +var handleButton = function handleButton(event, params, modal) { + var e = event || window.event; + var target = e.target || e.srcElement; + + var targetedConfirm = target.className.indexOf('confirm') !== -1; + var targetedOverlay = target.className.indexOf('sweet-overlay') !== -1; + var modalIsVisible = _hasClass$isDescendant.hasClass(modal, 'visible'); + var doneFunctionExists = params.doneFunction && modal.getAttribute('data-has-done-function') === 'true'; + + // Since the user can change the background-color of the confirm button programmatically, + // we must calculate what the color should be on hover/active + var normalColor, hoverColor, activeColor; + if (targetedConfirm && params.confirmButtonColor) { + normalColor = params.confirmButtonColor; + hoverColor = _colorLuminance.colorLuminance(normalColor, -0.04); + activeColor = _colorLuminance.colorLuminance(normalColor, -0.14); + } + + function shouldSetConfirmButtonColor(color) { + if (targetedConfirm && params.confirmButtonColor) { + target.style.backgroundColor = color; + } + } + + switch (e.type) { + case 'mouseover': + shouldSetConfirmButtonColor(hoverColor); + break; + + case 'mouseout': + shouldSetConfirmButtonColor(normalColor); + break; + + case 'mousedown': + shouldSetConfirmButtonColor(activeColor); + break; + + case 'mouseup': + shouldSetConfirmButtonColor(hoverColor); + break; + + case 'focus': + var $confirmButton = modal.querySelector('button.confirm'); + var $cancelButton = modal.querySelector('button.cancel'); + + if (targetedConfirm) { + $cancelButton.style.boxShadow = 'none'; + } else { + $confirmButton.style.boxShadow = 'none'; + } + break; + + case 'click': + var clickedOnModal = modal === target; + var clickedOnModalChild = _hasClass$isDescendant.isDescendant(modal, target); + + // Ignore click outside if allowOutsideClick is false + if (!clickedOnModal && !clickedOnModalChild && modalIsVisible && !params.allowOutsideClick) { + break; + } + + if (targetedConfirm && doneFunctionExists && modalIsVisible) { + handleConfirm(modal, params); + } else if (doneFunctionExists && modalIsVisible || targetedOverlay) { + handleCancel(modal, params); + } else if (_hasClass$isDescendant.isDescendant(modal, target) && target.tagName === 'BUTTON') { + sweetAlert.close(); + } + break; + } +}; + +/* + * User clicked on "Confirm"/"OK" + */ +var handleConfirm = function handleConfirm(modal, params) { + var callbackValue = true; + + if (_hasClass$isDescendant.hasClass(modal, 'show-input')) { + callbackValue = modal.querySelector('input').value; + + if (!callbackValue) { + callbackValue = ''; + } + } + + params.doneFunction(callbackValue); + + if (params.closeOnConfirm) { + sweetAlert.close(); + } +}; + +/* + * User clicked on "Cancel" + */ +var handleCancel = function handleCancel(modal, params) { + // Check if callback function expects a parameter (to track cancel actions) + var functionAsStr = String(params.doneFunction).replace(/\s/g, ''); + var functionHandlesCancel = functionAsStr.substring(0, 9) === 'function(' && functionAsStr.substring(9, 10) !== ')'; + + if (functionHandlesCancel) { + params.doneFunction(false); + } + + if (params.closeOnCancel) { + sweetAlert.close(); + } +}; + +exports['default'] = { + handleButton: handleButton, + handleConfirm: handleConfirm, + handleCancel: handleCancel +}; +module.exports = exports['default']; + +},{"./handle-dom":4,"./handle-swal-dom":6,"./utils":9}],4:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); +var hasClass = function hasClass(elem, className) { + return new RegExp(' ' + className + ' ').test(' ' + elem.className + ' '); +}; + +var addClass = function addClass(elem, className) { + if (!hasClass(elem, className)) { + elem.className += ' ' + className; + } +}; + +var removeClass = function removeClass(elem, className) { + var newClass = ' ' + elem.className.replace(/[\t\r\n]/g, ' ') + ' '; + if (hasClass(elem, className)) { + while (newClass.indexOf(' ' + className + ' ') >= 0) { + newClass = newClass.replace(' ' + className + ' ', ' '); + } + elem.className = newClass.replace(/^\s+|\s+$/g, ''); + } +}; + +var escapeHtml = function escapeHtml(str) { + var div = document.createElement('div'); + div.appendChild(document.createTextNode(str)); + return div.innerHTML; +}; + +var _show = function _show(elem) { + elem.style.opacity = ''; + elem.style.display = 'block'; +}; + +var show = function show(elems) { + if (elems && !elems.length) { + return _show(elems); + } + for (var i = 0; i < elems.length; ++i) { + _show(elems[i]); + } +}; + +var _hide = function _hide(elem) { + elem.style.opacity = ''; + elem.style.display = 'none'; +}; + +var hide = function hide(elems) { + if (elems && !elems.length) { + return _hide(elems); + } + for (var i = 0; i < elems.length; ++i) { + _hide(elems[i]); + } +}; + +var isDescendant = function isDescendant(parent, child) { + var node = child.parentNode; + while (node !== null) { + if (node === parent) { + return true; + } + node = node.parentNode; + } + return false; +}; + +var getTopMargin = function getTopMargin(elem) { + elem.style.left = '-9999px'; + elem.style.display = 'block'; + + var height = elem.clientHeight, + padding; + if (typeof getComputedStyle !== 'undefined') { + // IE 8 + padding = parseInt(getComputedStyle(elem).getPropertyValue('padding-top'), 10); + } else { + padding = parseInt(elem.currentStyle.padding); + } + + elem.style.left = ''; + elem.style.display = 'none'; + return '-' + parseInt((height + padding) / 2) + 'px'; +}; + +var fadeIn = function fadeIn(elem, interval) { + if (+elem.style.opacity < 1) { + interval = interval || 16; + elem.style.opacity = 0; + elem.style.display = 'block'; + var last = +new Date(); + var tick = (function (_tick) { + function tick() { + return _tick.apply(this, arguments); + } + + tick.toString = function () { + return _tick.toString(); + }; + + return tick; + })(function () { + elem.style.opacity = +elem.style.opacity + (new Date() - last) / 100; + last = +new Date(); + + if (+elem.style.opacity < 1) { + setTimeout(tick, interval); + } + }); + tick(); + } + elem.style.display = 'block'; //fallback IE8 +}; + +var fadeOut = function fadeOut(elem, interval) { + interval = interval || 16; + elem.style.opacity = 1; + var last = +new Date(); + var tick = (function (_tick2) { + function tick() { + return _tick2.apply(this, arguments); + } + + tick.toString = function () { + return _tick2.toString(); + }; + + return tick; + })(function () { + elem.style.opacity = +elem.style.opacity - (new Date() - last) / 100; + last = +new Date(); + + if (+elem.style.opacity > 0) { + setTimeout(tick, interval); + } else { + elem.style.display = 'none'; + } + }); + tick(); +}; + +var fireClick = function fireClick(node) { + // Taken from http://www.nonobtrusive.com/2011/11/29/programatically-fire-crossbrowser-click-event-with-javascript/ + // Then fixed for today's Chrome browser. + if (typeof MouseEvent === 'function') { + // Up-to-date approach + var mevt = new MouseEvent('click', { + view: window, + bubbles: false, + cancelable: true + }); + node.dispatchEvent(mevt); + } else if (document.createEvent) { + // Fallback + var evt = document.createEvent('MouseEvents'); + evt.initEvent('click', false, false); + node.dispatchEvent(evt); + } else if (document.createEventObject) { + node.fireEvent('onclick'); + } else if (typeof node.onclick === 'function') { + node.onclick(); + } +}; + +var stopEventPropagation = function stopEventPropagation(e) { + // In particular, make sure the space bar doesn't scroll the main window. + if (typeof e.stopPropagation === 'function') { + e.stopPropagation(); + e.preventDefault(); + } else if (window.event && window.event.hasOwnProperty('cancelBubble')) { + window.event.cancelBubble = true; + } +}; + +exports.hasClass = hasClass; +exports.addClass = addClass; +exports.removeClass = removeClass; +exports.escapeHtml = escapeHtml; +exports._show = _show; +exports.show = show; +exports._hide = _hide; +exports.hide = hide; +exports.isDescendant = isDescendant; +exports.getTopMargin = getTopMargin; +exports.fadeIn = fadeIn; +exports.fadeOut = fadeOut; +exports.fireClick = fireClick; +exports.stopEventPropagation = stopEventPropagation; + +},{}],5:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); + +var _stopEventPropagation$fireClick = require('./handle-dom'); + +var _setFocusStyle = require('./handle-swal-dom'); + +var handleKeyDown = function handleKeyDown(event, params, modal) { + var e = event || window.event; + var keyCode = e.keyCode || e.which; + + var $okButton = modal.querySelector('button.confirm'); + var $cancelButton = modal.querySelector('button.cancel'); + var $modalButtons = modal.querySelectorAll('button[tabindex]'); + + if ([9, 13, 32, 27].indexOf(keyCode) === -1) { + // Don't do work on keys we don't care about. + return; + } + + var $targetElement = e.target || e.srcElement; + + var btnIndex = -1; // Find the button - note, this is a nodelist, not an array. + for (var i = 0; i < $modalButtons.length; i++) { + if ($targetElement === $modalButtons[i]) { + btnIndex = i; + break; + } + } + + if (keyCode === 9) { + // TAB + if (btnIndex === -1) { + // No button focused. Jump to the confirm button. + $targetElement = $okButton; + } else { + // Cycle to the next button + if (btnIndex === $modalButtons.length - 1) { + $targetElement = $modalButtons[0]; + } else { + $targetElement = $modalButtons[btnIndex + 1]; + } + } + + _stopEventPropagation$fireClick.stopEventPropagation(e); + $targetElement.focus(); + + if (params.confirmButtonColor) { + _setFocusStyle.setFocusStyle($targetElement, params.confirmButtonColor); + } + } else { + if (keyCode === 13) { + if ($targetElement.tagName === 'INPUT') { + $targetElement = $okButton; + $okButton.focus(); + } + + if (btnIndex === -1) { + // ENTER/SPACE clicked outside of a button. + $targetElement = $okButton; + } else { + // Do nothing - let the browser handle it. + $targetElement = undefined; + } + } else if (keyCode === 27 && params.allowEscapeKey === true) { + $targetElement = $cancelButton; + _stopEventPropagation$fireClick.fireClick($targetElement, e); + } else { + // Fallback - let the browser handle it. + $targetElement = undefined; + } + } +}; + +exports['default'] = handleKeyDown; +module.exports = exports['default']; + +},{"./handle-dom":4,"./handle-swal-dom":6}],6:[function(require,module,exports){ +'use strict'; + +var _interopRequireWildcard = function (obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }; + +Object.defineProperty(exports, '__esModule', { + value: true +}); + +var _hexToRgb = require('./utils'); + +var _removeClass$getTopMargin$fadeIn$show$addClass = require('./handle-dom'); + +var _defaultParams = require('./default-params'); + +var _defaultParams2 = _interopRequireWildcard(_defaultParams); + +/* + * Add modal + overlay to DOM + */ + +var _injectedHTML = require('./injected-html'); + +var _injectedHTML2 = _interopRequireWildcard(_injectedHTML); + +var modalClass = '.sweet-alert'; +var overlayClass = '.sweet-overlay'; + +var sweetAlertInitialize = function sweetAlertInitialize() { + var sweetWrap = document.createElement('div'); + sweetWrap.innerHTML = _injectedHTML2['default']; + + // Append elements to body + while (sweetWrap.firstChild) { + document.body.appendChild(sweetWrap.firstChild); + } +}; + +/* + * Get DOM element of modal + */ +var getModal = (function (_getModal) { + function getModal() { + return _getModal.apply(this, arguments); + } + + getModal.toString = function () { + return _getModal.toString(); + }; + + return getModal; +})(function () { + var $modal = document.querySelector(modalClass); + + if (!$modal) { + sweetAlertInitialize(); + $modal = getModal(); + } + + return $modal; +}); + +/* + * Get DOM element of input (in modal) + */ +var getInput = function getInput() { + var $modal = getModal(); + if ($modal) { + return $modal.querySelector('input'); + } +}; + +/* + * Get DOM element of overlay + */ +var getOverlay = function getOverlay() { + return document.querySelector(overlayClass); +}; + +/* + * Add box-shadow style to button (depending on its chosen bg-color) + */ +var setFocusStyle = function setFocusStyle($button, bgColor) { + var rgbColor = _hexToRgb.hexToRgb(bgColor); + $button.style.boxShadow = '0 0 2px rgba(' + rgbColor + ', 0.8), inset 0 0 0 1px rgba(0, 0, 0, 0.05)'; +}; + +/* + * Animation when opening modal + */ +var openModal = function openModal(callback) { + var $modal = getModal(); + _removeClass$getTopMargin$fadeIn$show$addClass.fadeIn(getOverlay(), 10); + _removeClass$getTopMargin$fadeIn$show$addClass.show($modal); + _removeClass$getTopMargin$fadeIn$show$addClass.addClass($modal, 'showSweetAlert'); + _removeClass$getTopMargin$fadeIn$show$addClass.removeClass($modal, 'hideSweetAlert'); + + window.previousActiveElement = document.activeElement; + var $okButton = $modal.querySelector('button.confirm'); + $okButton.focus(); + + setTimeout(function () { + _removeClass$getTopMargin$fadeIn$show$addClass.addClass($modal, 'visible'); + }, 500); + + var timer = $modal.getAttribute('data-timer'); + + if (timer !== 'null' && timer !== '') { + var timerCallback = callback; + $modal.timeout = setTimeout(function () { + var doneFunctionExists = (timerCallback || null) && $modal.getAttribute('data-has-done-function') === 'true'; + if (doneFunctionExists) { + timerCallback(null); + } else { + sweetAlert.close(); + } + }, timer); + } +}; + +/* + * Reset the styling of the input + * (for example if errors have been shown) + */ +var resetInput = function resetInput() { + var $modal = getModal(); + var $input = getInput(); + + _removeClass$getTopMargin$fadeIn$show$addClass.removeClass($modal, 'show-input'); + $input.value = _defaultParams2['default'].inputValue; + $input.setAttribute('type', _defaultParams2['default'].inputType); + $input.setAttribute('placeholder', _defaultParams2['default'].inputPlaceholder); + + resetInputError(); +}; + +var resetInputError = function resetInputError(event) { + // If press enter => ignore + if (event && event.keyCode === 13) { + return false; + } + + var $modal = getModal(); + + var $errorIcon = $modal.querySelector('.sa-input-error'); + _removeClass$getTopMargin$fadeIn$show$addClass.removeClass($errorIcon, 'show'); + + var $errorContainer = $modal.querySelector('.sa-error-container'); + _removeClass$getTopMargin$fadeIn$show$addClass.removeClass($errorContainer, 'show'); +}; + +/* + * Set "margin-top"-property on modal based on its computed height + */ +var fixVerticalPosition = function fixVerticalPosition() { + var $modal = getModal(); + $modal.style.marginTop = _removeClass$getTopMargin$fadeIn$show$addClass.getTopMargin(getModal()); +}; + +exports.sweetAlertInitialize = sweetAlertInitialize; +exports.getModal = getModal; +exports.getOverlay = getOverlay; +exports.getInput = getInput; +exports.setFocusStyle = setFocusStyle; +exports.openModal = openModal; +exports.resetInput = resetInput; +exports.resetInputError = resetInputError; +exports.fixVerticalPosition = fixVerticalPosition; + +},{"./default-params":2,"./handle-dom":4,"./injected-html":7,"./utils":9}],7:[function(require,module,exports){ +"use strict"; + +Object.defineProperty(exports, "__esModule", { + value: true +}); +var injectedHTML = + +// Dark overlay +"
" + + +// Modal +"
" + + +// Error icon +"
\n \n \n \n \n
" + + +// Warning icon +"
\n \n \n
" + + +// Info icon +"
" + + +// Success icon +"
\n \n \n\n
\n
\n
" + "
" + + +// Title, text and input +"

Title

\n

Text

\n
\n \n
\n
" + + +// Input errors +"
\n
!
\n

Not valid!

\n
" + + +// Cancel and confirm buttons +"
\n \n \n
" + + +// End of modal +"
"; + +exports["default"] = injectedHTML; +module.exports = exports["default"]; + +},{}],8:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); + +var _isIE8 = require('./utils'); + +var _getModal$getInput$setFocusStyle = require('./handle-swal-dom'); + +var _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide = require('./handle-dom'); + +var alertTypes = ['error', 'warning', 'info', 'success', 'input', 'prompt']; + +/* + * Set type, text and actions on modal + */ +var setParameters = function setParameters(params) { + var modal = _getModal$getInput$setFocusStyle.getModal(); + + var $title = modal.querySelector('h2'); + var $text = modal.querySelector('p'); + var $cancelBtn = modal.querySelector('button.cancel'); + var $confirmBtn = modal.querySelector('button.confirm'); + + /* + * Title + */ + $title.innerHTML = params.html ? params.title : _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.escapeHtml(params.title).split('\n').join('
'); + + /* + * Text + */ + $text.innerHTML = params.html ? params.text : _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.escapeHtml(params.text || '').split('\n').join('
'); + if (params.text) _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.show($text); + + /* + * Custom class + */ + if (params.customClass) { + _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.addClass(modal, params.customClass); + modal.setAttribute('data-custom-class', params.customClass); + } else { + // Find previously set classes and remove them + var customClass = modal.getAttribute('data-custom-class'); + _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.removeClass(modal, customClass); + modal.setAttribute('data-custom-class', ''); + } + + /* + * Icon + */ + _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.hide(modal.querySelectorAll('.sa-icon')); + + if (params.type && !_isIE8.isIE8()) { + var _ret = (function () { + + var validType = false; + + for (var i = 0; i < alertTypes.length; i++) { + if (params.type === alertTypes[i]) { + validType = true; + break; + } + } + + if (!validType) { + logStr('Unknown alert type: ' + params.type); + return { + v: false + }; + } + + var typesWithIcons = ['success', 'error', 'warning', 'info']; + var $icon = undefined; + + if (typesWithIcons.indexOf(params.type) !== -1) { + $icon = modal.querySelector('.sa-icon.' + 'sa-' + params.type); + _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.show($icon); + } + + var $input = _getModal$getInput$setFocusStyle.getInput(); + + // Animate icon + switch (params.type) { + + case 'success': + _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.addClass($icon, 'animate'); + _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.addClass($icon.querySelector('.sa-tip'), 'animateSuccessTip'); + _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.addClass($icon.querySelector('.sa-long'), 'animateSuccessLong'); + break; + + case 'error': + _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.addClass($icon, 'animateErrorIcon'); + _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.addClass($icon.querySelector('.sa-x-mark'), 'animateXMark'); + break; + + case 'warning': + _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.addClass($icon, 'pulseWarning'); + _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.addClass($icon.querySelector('.sa-body'), 'pulseWarningIns'); + _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.addClass($icon.querySelector('.sa-dot'), 'pulseWarningIns'); + break; + + case 'input': + case 'prompt': + $input.setAttribute('type', params.inputType); + $input.value = params.inputValue; + $input.setAttribute('placeholder', params.inputPlaceholder); + _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.addClass(modal, 'show-input'); + setTimeout(function () { + $input.focus(); + $input.addEventListener('keyup', swal.resetInputError); + }, 400); + break; + } + })(); + + if (typeof _ret === 'object') { + return _ret.v; + } + } + + /* + * Custom image + */ + if (params.imageUrl) { + var $customIcon = modal.querySelector('.sa-icon.sa-custom'); + + $customIcon.style.backgroundImage = 'url(' + params.imageUrl + ')'; + _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.show($customIcon); + + var _imgWidth = 80; + var _imgHeight = 80; + + if (params.imageSize) { + var dimensions = params.imageSize.toString().split('x'); + var imgWidth = dimensions[0]; + var imgHeight = dimensions[1]; + + if (!imgWidth || !imgHeight) { + logStr('Parameter imageSize expects value with format WIDTHxHEIGHT, got ' + params.imageSize); + } else { + _imgWidth = imgWidth; + _imgHeight = imgHeight; + } + } + + $customIcon.setAttribute('style', $customIcon.getAttribute('style') + 'width:' + _imgWidth + 'px; height:' + _imgHeight + 'px'); + } + + /* + * Show cancel button? + */ + modal.setAttribute('data-has-cancel-button', params.showCancelButton); + if (params.showCancelButton) { + $cancelBtn.style.display = 'inline-block'; + } else { + _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.hide($cancelBtn); + } + + /* + * Show confirm button? + */ + modal.setAttribute('data-has-confirm-button', params.showConfirmButton); + if (params.showConfirmButton) { + $confirmBtn.style.display = 'inline-block'; + } else { + _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.hide($confirmBtn); + } + + /* + * Custom text on cancel/confirm buttons + */ + if (params.cancelButtonText) { + $cancelBtn.innerHTML = _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.escapeHtml(params.cancelButtonText); + } + if (params.confirmButtonText) { + $confirmBtn.innerHTML = _hasClass$addClass$removeClass$escapeHtml$_show$show$_hide$hide.escapeHtml(params.confirmButtonText); + } + + /* + * Custom color on confirm button + */ + if (params.confirmButtonColor) { + // Set confirm button to selected background color + $confirmBtn.style.backgroundColor = params.confirmButtonColor; + + // Set box-shadow to default focused button + _getModal$getInput$setFocusStyle.setFocusStyle($confirmBtn, params.confirmButtonColor); + } + + /* + * Allow outside click + */ + modal.setAttribute('data-allow-outside-click', params.allowOutsideClick); + + /* + * Callback function + */ + var hasDoneFunction = params.doneFunction ? true : false; + modal.setAttribute('data-has-done-function', hasDoneFunction); + + /* + * Animation + */ + if (!params.animation) { + modal.setAttribute('data-animation', 'none'); + } else if (typeof params.animation === 'string') { + modal.setAttribute('data-animation', params.animation); // Custom animation + } else { + modal.setAttribute('data-animation', 'pop'); + } + + /* + * Timer + */ + modal.setAttribute('data-timer', params.timer); +}; + +exports['default'] = setParameters; +module.exports = exports['default']; + +},{"./handle-dom":4,"./handle-swal-dom":6,"./utils":9}],9:[function(require,module,exports){ +'use strict'; + +Object.defineProperty(exports, '__esModule', { + value: true +}); +/* + * Allow user to pass their own params + */ +var extend = function extend(a, b) { + for (var key in b) { + if (b.hasOwnProperty(key)) { + a[key] = b[key]; + } + } + return a; +}; + +/* + * Convert HEX codes to RGB values (#000000 -> rgb(0,0,0)) + */ +var hexToRgb = function hexToRgb(hex) { + var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hex); + return result ? parseInt(result[1], 16) + ', ' + parseInt(result[2], 16) + ', ' + parseInt(result[3], 16) : null; +}; + +/* + * Check if the user is using Internet Explorer 8 (for fallbacks) + */ +var isIE8 = function isIE8() { + return window.attachEvent && !window.addEventListener; +}; + +/* + * IE compatible logging for developers + */ +var logStr = function logStr(string) { + if (window.console) { + // IE... + window.console.log('SweetAlert: ' + string); + } +}; + +/* + * Set hover, active and focus-states for buttons + * (source: http://www.sitepoint.com/javascript-generate-lighter-darker-color) + */ +var colorLuminance = function colorLuminance(hex, lum) { + // Validate hex string + hex = String(hex).replace(/[^0-9a-f]/gi, ''); + if (hex.length < 6) { + hex = hex[0] + hex[0] + hex[1] + hex[1] + hex[2] + hex[2]; + } + lum = lum || 0; + + // Convert to decimal and change luminosity + var rgb = '#'; + var c; + var i; + + for (i = 0; i < 3; i++) { + c = parseInt(hex.substr(i * 2, 2), 16); + c = Math.round(Math.min(Math.max(0, c + c * lum), 255)).toString(16); + rgb += ('00' + c).substr(c.length); + } + + return rgb; +}; + +exports.extend = extend; +exports.hexToRgb = hexToRgb; +exports.isIE8 = isIE8; +exports.logStr = logStr; +exports.colorLuminance = colorLuminance; + +},{}]},{},[1]) +//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCIvVXNlcnMvVHJpc3Rhbi9kZXYvU3dlZXRBbGVydC9kZXYvc3dlZXRhbGVydC5lczYuanMiLCIvVXNlcnMvVHJpc3Rhbi9kZXYvU3dlZXRBbGVydC9kZXYvbW9kdWxlcy9kZWZhdWx0LXBhcmFtcy5qcyIsIi9Vc2Vycy9UcmlzdGFuL2Rldi9Td2VldEFsZXJ0L2Rldi9tb2R1bGVzL2hhbmRsZS1jbGljay5qcyIsIi9Vc2Vycy9UcmlzdGFuL2Rldi9Td2VldEFsZXJ0L2Rldi9tb2R1bGVzL2hhbmRsZS1kb20uanMiLCIvVXNlcnMvVHJpc3Rhbi9kZXYvU3dlZXRBbGVydC9kZXYvbW9kdWxlcy9oYW5kbGUta2V5LmpzIiwiL1VzZXJzL1RyaXN0YW4vZGV2L1N3ZWV0QWxlcnQvZGV2L21vZHVsZXMvaGFuZGxlLXN3YWwtZG9tLmpzIiwiL1VzZXJzL1RyaXN0YW4vZGV2L1N3ZWV0QWxlcnQvZGV2L21vZHVsZXMvaW5qZWN0ZWQtaHRtbC5qcyIsIi9Vc2Vycy9UcmlzdGFuL2Rldi9Td2VldEFsZXJ0L2Rldi9tb2R1bGVzL3NldC1wYXJhbXMuanMiLCIvVXNlcnMvVHJpc3Rhbi9kZXYvU3dlZXRBbGVydC9kZXYvbW9kdWxlcy91dGlscy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7Ozs7Ozs7OztzSkNnQk8sc0JBQXNCOzs7Ozs7MkRBV3RCLGlCQUFpQjs7Ozs7O3dIQWNqQiwyQkFBMkI7Ozs7dURBSXdCLHdCQUF3Qjs7NkJBQ3hELHNCQUFzQjs7Ozs7OzZCQUl0QiwwQkFBMEI7Ozs7NkJBQzFCLHNCQUFzQjs7Ozs7Ozs7QUFNaEQsSUFBSSxxQkFBcUIsQ0FBQztBQUMxQixJQUFJLGlCQUFpQixDQUFDOzs7Ozs7QUFPdEIsSUFBSSxVQUFVLEVBQUUsSUFBSSxDQUFDOztBQUVyQixVQUFVLEdBQUcsSUFBSSxHQUFHLFlBQVc7QUFDN0IsTUFBSSxjQUFjLEdBQUcsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDOztBQUVsQywwSUE5RFUsUUFBUSxDQThEVCxRQUFRLENBQUMsSUFBSSxFQUFFLGdCQUFnQixDQUFDLENBQUM7QUFDMUMsNEdBaENBLFVBQVUsRUFnQ0UsQ0FBQzs7Ozs7OztBQU9iLFdBQVMsaUJBQWlCLENBQUMsR0FBRyxFQUFFO0FBQzlCLFFBQUksSUFBSSxHQUFHLGNBQWMsQ0FBQztBQUMxQixXQUFPLEFBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxLQUFLLFNBQVMsR0FBSywyQkFBYyxHQUFHLENBQUMsR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7R0FDcEU7O0FBRUQsTUFBSSxjQUFjLEtBQUssU0FBUyxFQUFFO0FBQ2hDLGlEQTNERixNQUFNLENBMkRHLDBDQUEwQyxDQUFDLENBQUM7QUFDbkQsV0FBTyxLQUFLLENBQUM7R0FDZDs7QUFFRCxNQUFJLE1BQU0sR0FBRyw2Q0FsRWIsTUFBTSxDQWtFYyxFQUFFLDZCQUFnQixDQUFDOztBQUV2QyxVQUFRLE9BQU8sY0FBYzs7O0FBRzNCLFNBQUssUUFBUTtBQUNYLFlBQU0sQ0FBQyxLQUFLLEdBQUcsY0FBYyxDQUFDO0FBQzlCLFlBQU0sQ0FBQyxJQUFJLEdBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztBQUNsQyxZQUFNLENBQUMsSUFBSSxHQUFJLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUM7QUFDbEMsWUFBTTs7QUFBQTtBQUdSLFNBQUssUUFBUTtBQUNYLFVBQUksY0FBYyxDQUFDLEtBQUssS0FBSyxTQUFTLEVBQUU7QUFDdEMscURBN0VOLE1BQU0sQ0E2RU8sMkJBQTJCLENBQUMsQ0FBQztBQUNwQyxlQUFPLEtBQUssQ0FBQztPQUNkOztBQUVELFlBQU0sQ0FBQyxLQUFLLEdBQUcsY0FBYyxDQUFDLEtBQUssQ0FBQzs7QUFFcEMsV0FBSyxJQUFJLFVBQVUsZ0NBQW1CO0FBQ3BDLGNBQU0sQ0FBQyxVQUFVLENBQUMsR0FBRyxpQkFBaUIsQ0FBQyxVQUFVLENBQUMsQ0FBQztPQUNwRDs7O0FBR0QsWUFBTSxDQUFDLGlCQUFpQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsR0FBRyxTQUFTLEdBQUcsMkJBQWMsaUJBQWlCLENBQUM7QUFDakcsWUFBTSxDQUFDLGlCQUFpQixHQUFHLGlCQUFpQixDQUFDLG1CQUFtQixDQUFDLENBQUM7OztBQUdsRSxZQUFNLENBQUMsWUFBWSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUM7O0FBRTNDLFlBQU07O0FBQUEsQUFFUjtBQUNFLG1EQWpHSixNQUFNLENBaUdLLGtFQUFrRSxHQUFHLE9BQU8sY0FBYyxDQUFDLENBQUM7QUFDbkcsYUFBTyxLQUFLLENBQUM7O0FBQUEsR0FFaEI7O0FBRUQsNkJBQWMsTUFBTSxDQUFDLENBQUM7QUFDdEIsNEdBeEZBLG1CQUFtQixFQXdGRSxDQUFDO0FBQ3RCLDRHQTNGQSxTQUFTLENBMkZDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDOzs7QUFHeEIsTUFBSSxLQUFLLEdBQUcsMEdBbEdaLFFBQVEsRUFrR2MsQ0FBQzs7Ozs7QUFNdkIsTUFBSSxRQUFRLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxDQUFDO0FBQ2hELE1BQUksWUFBWSxHQUFHLENBQUMsU0FBUyxFQUFFLGFBQWEsRUFBRSxZQUFZLEVBQUUsYUFBYSxFQUFFLFdBQVcsRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNuRyxNQUFJLGFBQWEsR0FBRyx1QkFBQyxDQUFDO1dBQUsseUNBL0ZwQixZQUFZLENBK0ZxQixDQUFDLEVBQUUsTUFBTSxFQUFFLEtBQUssQ0FBQztHQUFBLENBQUM7O0FBRTFELE9BQUssSUFBSSxRQUFRLEdBQUcsQ0FBQyxFQUFFLFFBQVEsR0FBRyxRQUFRLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxFQUFFO0FBQzdELFNBQUssSUFBSSxRQUFRLEdBQUcsQ0FBQyxFQUFFLFFBQVEsR0FBRyxZQUFZLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxFQUFFO0FBQ2pFLFVBQUksTUFBTSxHQUFHLFlBQVksQ0FBQyxRQUFRLENBQUMsQ0FBQztBQUNwQyxjQUFRLENBQUMsUUFBUSxDQUFDLENBQUMsTUFBTSxDQUFDLEdBQUcsYUFBYSxDQUFDO0tBQzVDO0dBQ0Y7OztBQUdELDRHQW5IQSxVQUFVLEVBbUhFLENBQUMsT0FBTyxHQUFHLGFBQWEsQ0FBQzs7QUFFckMsdUJBQXFCLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQzs7QUFFekMsTUFBSSxVQUFVLEdBQUcsb0JBQUMsQ0FBQztXQUFLLDJCQUFjLENBQUMsRUFBRSxNQUFNLEVBQUUsS0FBSyxDQUFDO0dBQUEsQ0FBQztBQUN4RCxRQUFNLENBQUMsU0FBUyxHQUFHLFVBQVUsQ0FBQzs7QUFFOUIsUUFBTSxDQUFDLE9BQU8sR0FBRyxZQUFZOztBQUUzQixjQUFVLENBQUMsWUFBWTs7O0FBR3JCLFVBQUksaUJBQWlCLEtBQUssU0FBUyxFQUFFO0FBQ25DLHlCQUFpQixDQUFDLEtBQUssRUFBRSxDQUFDO0FBQzFCLHlCQUFpQixHQUFHLFNBQVMsQ0FBQztPQUMvQjtLQUNGLEVBQUUsQ0FBQyxDQUFDLENBQUM7R0FDUCxDQUFDO0NBQ0gsQ0FBQzs7Ozs7O0FBUUYsVUFBVSxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVMsVUFBVSxFQUFFO0FBQy9ELE1BQUksQ0FBQyxVQUFVLEVBQUU7QUFDZixVQUFNLElBQUksS0FBSyxDQUFDLHdCQUF3QixDQUFDLENBQUM7R0FDM0M7QUFDRCxNQUFJLE9BQU8sVUFBVSxLQUFLLFFBQVEsRUFBRTtBQUNsQyxVQUFNLElBQUksS0FBSyxDQUFDLCtCQUErQixDQUFDLENBQUM7R0FDbEQ7O0FBRUQsK0NBbEtBLE1BQU0sNkJBa0tnQixVQUFVLENBQUMsQ0FBQztDQUNuQyxDQUFDOzs7OztBQU1GLFVBQVUsQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssR0FBRyxZQUFXO0FBQ3pDLE1BQUksS0FBSyxHQUFHLDBHQTlKWixRQUFRLEVBOEpjLENBQUM7O0FBRXZCLDBJQXJMUSxPQUFPLENBcUxQLDBHQS9KUixVQUFVLEVBK0pVLEVBQUUsQ0FBQyxDQUFDLENBQUM7QUFDekIsMElBdExRLE9BQU8sQ0FzTFAsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2xCLDBJQTVMb0IsV0FBVyxDQTRMbkIsS0FBSyxFQUFFLGdCQUFnQixDQUFDLENBQUM7QUFDckMsMElBN0xVLFFBQVEsQ0E2TFQsS0FBSyxFQUFFLGdCQUFnQixDQUFDLENBQUM7QUFDbEMsMElBOUxvQixXQUFXLENBOExuQixLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7Ozs7O0FBSzlCLE1BQUksWUFBWSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMscUJBQXFCLENBQUMsQ0FBQztBQUM5RCwwSUFwTW9CLFdBQVcsQ0FvTW5CLFlBQVksRUFBRSxTQUFTLENBQUMsQ0FBQztBQUNyQywwSUFyTW9CLFdBQVcsQ0FxTW5CLFlBQVksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEVBQUUsbUJBQW1CLENBQUMsQ0FBQztBQUN4RSwwSUF0TW9CLFdBQVcsQ0FzTW5CLFlBQVksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEVBQUUsb0JBQW9CLENBQUMsQ0FBQzs7QUFFMUUsTUFBSSxVQUFVLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDO0FBQzFELDBJQXpNb0IsV0FBVyxDQXlNbkIsVUFBVSxFQUFFLGtCQUFrQixDQUFDLENBQUM7QUFDNUMsMElBMU1vQixXQUFXLENBME1uQixVQUFVLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxFQUFFLGNBQWMsQ0FBQyxDQUFDOztBQUVwRSxNQUFJLFlBQVksR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLHFCQUFxQixDQUFDLENBQUM7QUFDOUQsMElBN01vQixXQUFXLENBNk1uQixZQUFZLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDMUMsMElBOU1vQixXQUFXLENBOE1uQixZQUFZLENBQUMsYUFBYSxDQUFDLFVBQVUsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLENBQUM7QUFDdkUsMElBL01vQixXQUFXLENBK01uQixZQUFZLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQyxFQUFFLGlCQUFpQixDQUFDLENBQUM7OztBQUd0RSxZQUFVLENBQUMsWUFBVztBQUNwQixRQUFJLFdBQVcsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDLENBQUM7QUFDMUQsNElBcE5rQixXQUFXLENBb05qQixLQUFLLEVBQUUsV0FBVyxDQUFDLENBQUM7R0FDakMsRUFBRSxHQUFHLENBQUMsQ0FBQzs7O0FBR1IsMElBeE5vQixXQUFXLENBd05uQixRQUFRLENBQUMsSUFBSSxFQUFFLGdCQUFnQixDQUFDLENBQUM7OztBQUc3QyxRQUFNLENBQUMsU0FBUyxHQUFHLHFCQUFxQixDQUFDO0FBQ3pDLE1BQUksTUFBTSxDQUFDLHFCQUFxQixFQUFFO0FBQ2hDLFVBQU0sQ0FBQyxxQkFBcUIsQ0FBQyxLQUFLLEVBQUUsQ0FBQztHQUN0QztBQUNELG1CQUFpQixHQUFHLFNBQVMsQ0FBQztBQUM5QixjQUFZLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDOztBQUU1QixTQUFPLElBQUksQ0FBQztDQUNiLENBQUM7Ozs7OztBQU9GLFVBQVUsQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDLGNBQWMsR0FBRyxVQUFTLFlBQVksRUFBRTtBQUN2RSxNQUFJLEtBQUssR0FBRywwR0FqTlosUUFBUSxFQWlOYyxDQUFDOztBQUV2QixNQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFDeEQsMElBOU9VLFFBQVEsQ0E4T1QsVUFBVSxFQUFFLE1BQU0sQ0FBQyxDQUFDOztBQUU3QixNQUFJLGVBQWUsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLHFCQUFxQixDQUFDLENBQUM7QUFDakUsMElBalBVLFFBQVEsQ0FpUFQsZUFBZSxFQUFFLE1BQU0sQ0FBQyxDQUFDOztBQUVsQyxpQkFBZSxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxTQUFTLEdBQUcsWUFBWSxDQUFDOztBQUU1RCxPQUFLLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssRUFBRSxDQUFDO0NBQ3RDLENBQUM7Ozs7O0FBTUYsVUFBVSxDQUFDLGVBQWUsR0FBRyxJQUFJLENBQUMsZUFBZSxHQUFHLFVBQVMsS0FBSyxFQUFFOztBQUVsRSxNQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsT0FBTyxLQUFLLEVBQUUsRUFBRTtBQUNqQyxXQUFPLEtBQUssQ0FBQztHQUNkOztBQUVELE1BQUksTUFBTSxHQUFHLDBHQXhPYixRQUFRLEVBd09lLENBQUM7O0FBRXhCLE1BQUksVUFBVSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUMsaUJBQWlCLENBQUMsQ0FBQztBQUN6RCwwSUFyUW9CLFdBQVcsQ0FxUW5CLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQzs7QUFFaEMsTUFBSSxlQUFlLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0FBQ2xFLDBJQXhRb0IsV0FBVyxDQXdRbkIsZUFBZSxFQUFFLE1BQU0sQ0FBQyxDQUFDO0NBQ3RDLENBQUM7O0FBRUYsSUFBSSxPQUFPLE1BQU0sS0FBSyxXQUFXLEVBQUU7OztBQUdqQyxRQUFNLENBQUMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEdBQUcsVUFBVSxDQUFDO0NBQzlDLE1BQU07QUFDTCwrQ0EvUEEsTUFBTSxDQStQQyxrQ0FBa0MsQ0FBQyxDQUFDO0NBQzVDOzs7Ozs7OztBQ3pSRCxJQUFJLGFBQWEsR0FBRztBQUNsQixPQUFLLEVBQUUsRUFBRTtBQUNULE1BQUksRUFBRSxFQUFFO0FBQ1IsTUFBSSxFQUFFLElBQUk7QUFDVixtQkFBaUIsRUFBRSxLQUFLO0FBQ3hCLG1CQUFpQixFQUFFLElBQUk7QUFDdkIsa0JBQWdCLEVBQUUsS0FBSztBQUN2QixnQkFBYyxFQUFFLElBQUk7QUFDcEIsZUFBYSxFQUFFLElBQUk7QUFDbkIsbUJBQWlCLEVBQUUsSUFBSTtBQUN2QixvQkFBa0IsRUFBRSxTQUFTO0FBQzdCLGtCQUFnQixFQUFFLFFBQVE7QUFDMUIsVUFBUSxFQUFFLElBQUk7QUFDZCxXQUFTLEVBQUUsSUFBSTtBQUNmLE9BQUssRUFBRSxJQUFJO0FBQ1gsYUFBVyxFQUFFLEVBQUU7QUFDZixNQUFJLEVBQUUsS0FBSztBQUNYLFdBQVMsRUFBRSxJQUFJO0FBQ2YsZ0JBQWMsRUFBRSxJQUFJO0FBQ3BCLFdBQVMsRUFBRSxNQUFNO0FBQ2pCLGtCQUFnQixFQUFFLEVBQUU7QUFDcEIsWUFBVSxFQUFFLEVBQUU7Q0FDZixDQUFDOztxQkFFYSxhQUFhOzs7Ozs7Ozs7OzhCQ3hCRyxTQUFTOzt3QkFDZixtQkFBbUI7O3FDQUNMLGNBQWM7Ozs7O0FBTXJELElBQUksWUFBWSxHQUFHLHNCQUFTLEtBQUssRUFBRSxNQUFNLEVBQUUsS0FBSyxFQUFFO0FBQ2hELE1BQUksQ0FBQyxHQUFHLEtBQUssSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDO0FBQzlCLE1BQUksTUFBTSxHQUFHLENBQUMsQ0FBQyxNQUFNLElBQUksQ0FBQyxDQUFDLFVBQVUsQ0FBQzs7QUFFdEMsTUFBSSxlQUFlLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDakUsTUFBSSxlQUFlLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUM7QUFDdkUsTUFBSSxjQUFjLEdBQUksdUJBWmYsUUFBUSxDQVlnQixLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDakQsTUFBSSxrQkFBa0IsR0FBSSxNQUFNLENBQUMsWUFBWSxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsd0JBQXdCLENBQUMsS0FBSyxNQUFNLEFBQUMsQ0FBQzs7OztBQUkxRyxNQUFJLFdBQVcsRUFBRSxVQUFVLEVBQUUsV0FBVyxDQUFDO0FBQ3pDLE1BQUksZUFBZSxJQUFJLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRTtBQUNoRCxlQUFXLEdBQUksTUFBTSxDQUFDLGtCQUFrQixDQUFDO0FBQ3pDLGNBQVUsR0FBSyxnQkF0QlYsY0FBYyxDQXNCVyxXQUFXLEVBQUUsQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUNsRCxlQUFXLEdBQUksZ0JBdkJWLGNBQWMsQ0F1QlcsV0FBVyxFQUFFLENBQUMsSUFBSSxDQUFDLENBQUM7R0FDbkQ7O0FBRUQsV0FBUywyQkFBMkIsQ0FBQyxLQUFLLEVBQUU7QUFDMUMsUUFBSSxlQUFlLElBQUksTUFBTSxDQUFDLGtCQUFrQixFQUFFO0FBQ2hELFlBQU0sQ0FBQyxLQUFLLENBQUMsZUFBZSxHQUFHLEtBQUssQ0FBQztLQUN0QztHQUNGOztBQUVELFVBQVEsQ0FBQyxDQUFDLElBQUk7QUFDWixTQUFLLFdBQVc7QUFDZCxpQ0FBMkIsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUN4QyxZQUFNOztBQUFBLEFBRVIsU0FBSyxVQUFVO0FBQ2IsaUNBQTJCLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDekMsWUFBTTs7QUFBQSxBQUVSLFNBQUssV0FBVztBQUNkLGlDQUEyQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0FBQ3pDLFlBQU07O0FBQUEsQUFFUixTQUFLLFNBQVM7QUFDWixpQ0FBMkIsQ0FBQyxVQUFVLENBQUMsQ0FBQztBQUN4QyxZQUFNOztBQUFBLEFBRVIsU0FBSyxPQUFPO0FBQ1YsVUFBSSxjQUFjLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQzNELFVBQUksYUFBYSxHQUFJLEtBQUssQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLENBQUM7O0FBRTFELFVBQUksZUFBZSxFQUFFO0FBQ25CLHFCQUFhLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUM7T0FDeEMsTUFBTTtBQUNMLHNCQUFjLENBQUMsS0FBSyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUM7T0FDekM7QUFDRCxZQUFNOztBQUFBLEFBRVIsU0FBSyxPQUFPO0FBQ1YsVUFBSSxjQUFjLEdBQUksS0FBSyxLQUFLLE1BQU0sQUFBQyxDQUFDO0FBQ3hDLFVBQUksbUJBQW1CLEdBQUcsdUJBNURiLFlBQVksQ0E0RGMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDOzs7QUFHdEQsVUFBSSxDQUFDLGNBQWMsSUFBSSxDQUFDLG1CQUFtQixJQUFJLGNBQWMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxpQkFBaUIsRUFBRTtBQUMxRixjQUFNO09BQ1A7O0FBRUQsVUFBSSxlQUFlLElBQUksa0JBQWtCLElBQUksY0FBYyxFQUFFO0FBQzNELHFCQUFhLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO09BQzlCLE1BQU0sSUFBSSxrQkFBa0IsSUFBSSxjQUFjLElBQUksZUFBZSxFQUFFO0FBQ2xFLG9CQUFZLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDO09BQzdCLE1BQU0sSUFBSSx1QkF2RUUsWUFBWSxDQXVFRCxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUksTUFBTSxDQUFDLE9BQU8sS0FBSyxRQUFRLEVBQUU7QUFDckUsa0JBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztPQUNwQjtBQUNELFlBQU07QUFBQSxHQUNUO0NBQ0YsQ0FBQzs7Ozs7QUFLRixJQUFJLGFBQWEsR0FBRyx1QkFBUyxLQUFLLEVBQUUsTUFBTSxFQUFFO0FBQzFDLE1BQUksYUFBYSxHQUFHLElBQUksQ0FBQzs7QUFFekIsTUFBSSx1QkFwRkcsUUFBUSxDQW9GRixLQUFLLEVBQUUsWUFBWSxDQUFDLEVBQUU7QUFDakMsaUJBQWEsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEtBQUssQ0FBQzs7QUFFbkQsUUFBSSxDQUFDLGFBQWEsRUFBRTtBQUNsQixtQkFBYSxHQUFHLEVBQUUsQ0FBQztLQUNwQjtHQUNGOztBQUVELFFBQU0sQ0FBQyxZQUFZLENBQUMsYUFBYSxDQUFDLENBQUM7O0FBRW5DLE1BQUksTUFBTSxDQUFDLGNBQWMsRUFBRTtBQUN6QixjQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7R0FDcEI7Q0FDRixDQUFDOzs7OztBQUtGLElBQUksWUFBWSxHQUFHLHNCQUFTLEtBQUssRUFBRSxNQUFNLEVBQUU7O0FBRXpDLE1BQUksYUFBYSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLENBQUMsT0FBTyxDQUFDLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztBQUNuRSxNQUFJLHFCQUFxQixHQUFHLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxLQUFLLFdBQVcsSUFBSSxhQUFhLENBQUMsU0FBUyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsS0FBSyxHQUFHLENBQUM7O0FBRXBILE1BQUkscUJBQXFCLEVBQUU7QUFDekIsVUFBTSxDQUFDLFlBQVksQ0FBQyxLQUFLLENBQUMsQ0FBQztHQUM1Qjs7QUFFRCxNQUFJLE1BQU0sQ0FBQyxhQUFhLEVBQUU7QUFDeEIsY0FBVSxDQUFDLEtBQUssRUFBRSxDQUFDO0dBQ3BCO0NBQ0YsQ0FBQzs7cUJBR2E7QUFDYixjQUFZLEVBQVosWUFBWTtBQUNaLGVBQWEsRUFBYixhQUFhO0FBQ2IsY0FBWSxFQUFaLFlBQVk7Q0FDYjs7Ozs7Ozs7O0FDM0hELElBQUksUUFBUSxHQUFHLGtCQUFTLElBQUksRUFBRSxTQUFTLEVBQUU7QUFDdkMsU0FBTyxJQUFJLE1BQU0sQ0FBQyxHQUFHLEdBQUcsU0FBUyxHQUFHLEdBQUcsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsR0FBRyxHQUFHLENBQUMsQ0FBQztDQUMzRSxDQUFDOztBQUVGLElBQUksUUFBUSxHQUFHLGtCQUFTLElBQUksRUFBRSxTQUFTLEVBQUU7QUFDdkMsTUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFDLEVBQUU7QUFDOUIsUUFBSSxDQUFDLFNBQVMsSUFBSSxHQUFHLEdBQUcsU0FBUyxDQUFDO0dBQ25DO0NBQ0YsQ0FBQzs7QUFFRixJQUFJLFdBQVcsR0FBRyxxQkFBUyxJQUFJLEVBQUUsU0FBUyxFQUFFO0FBQzFDLE1BQUksUUFBUSxHQUFHLEdBQUcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDO0FBQ3BFLE1BQUksUUFBUSxDQUFDLElBQUksRUFBRSxTQUFTLENBQUMsRUFBRTtBQUM3QixXQUFPLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLFNBQVMsR0FBRyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7QUFDbkQsY0FBUSxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsR0FBRyxHQUFHLFNBQVMsR0FBRyxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7S0FDekQ7QUFDRCxRQUFJLENBQUMsU0FBUyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsWUFBWSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0dBQ3JEO0NBQ0YsQ0FBQzs7QUFFRixJQUFJLFVBQVUsR0FBRyxvQkFBUyxHQUFHLEVBQUU7QUFDN0IsTUFBSSxHQUFHLEdBQUcsUUFBUSxDQUFDLGFBQWEsQ0FBQyxLQUFLLENBQUMsQ0FBQztBQUN4QyxLQUFHLENBQUMsV0FBVyxDQUFDLFFBQVEsQ0FBQyxjQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUM5QyxTQUFPLEdBQUcsQ0FBQyxTQUFTLENBQUM7Q0FDdEIsQ0FBQzs7QUFFRixJQUFJLEtBQUssR0FBRyxlQUFTLElBQUksRUFBRTtBQUN6QixNQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7QUFDeEIsTUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO0NBQzlCLENBQUM7O0FBRUYsSUFBSSxJQUFJLEdBQUcsY0FBUyxLQUFLLEVBQUU7QUFDekIsTUFBSSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO0FBQzFCLFdBQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0dBQ3JCO0FBQ0QsT0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7QUFDckMsU0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0dBQ2pCO0NBQ0YsQ0FBQzs7QUFFRixJQUFJLEtBQUssR0FBRyxlQUFTLElBQUksRUFBRTtBQUN6QixNQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxFQUFFLENBQUM7QUFDeEIsTUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO0NBQzdCLENBQUM7O0FBRUYsSUFBSSxJQUFJLEdBQUcsY0FBUyxLQUFLLEVBQUU7QUFDekIsTUFBSSxLQUFLLElBQUksQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFO0FBQzFCLFdBQU8sS0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDO0dBQ3JCO0FBQ0QsT0FBSyxJQUFJLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLEVBQUU7QUFDckMsU0FBSyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO0dBQ2pCO0NBQ0YsQ0FBQzs7QUFFRixJQUFJLFlBQVksR0FBRyxzQkFBUyxNQUFNLEVBQUUsS0FBSyxFQUFFO0FBQ3pDLE1BQUksSUFBSSxHQUFHLEtBQUssQ0FBQyxVQUFVLENBQUM7QUFDNUIsU0FBTyxJQUFJLEtBQUssSUFBSSxFQUFFO0FBQ3BCLFFBQUksSUFBSSxLQUFLLE1BQU0sRUFBRTtBQUNuQixhQUFPLElBQUksQ0FBQztLQUNiO0FBQ0QsUUFBSSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUM7R0FDeEI7QUFDRCxTQUFPLEtBQUssQ0FBQztDQUNkLENBQUM7O0FBRUYsSUFBSSxZQUFZLEdBQUcsc0JBQVMsSUFBSSxFQUFFO0FBQ2hDLE1BQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLFNBQVMsQ0FBQztBQUM1QixNQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7O0FBRTdCLE1BQUksTUFBTSxHQUFHLElBQUksQ0FBQyxZQUFZO01BQzFCLE9BQU8sQ0FBQztBQUNaLE1BQUksT0FBTyxnQkFBZ0IsS0FBSyxXQUFXLEVBQUU7O0FBQzNDLFdBQU8sR0FBRyxRQUFRLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7R0FDaEYsTUFBTTtBQUNMLFdBQU8sR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxPQUFPLENBQUMsQ0FBQztHQUMvQzs7QUFFRCxNQUFJLENBQUMsS0FBSyxDQUFDLElBQUksR0FBRyxFQUFFLENBQUM7QUFDckIsTUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO0FBQzVCLFNBQVEsR0FBRyxHQUFHLFFBQVEsQ0FBQyxDQUFDLE1BQU0sR0FBRyxPQUFPLENBQUEsR0FBSSxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUU7Q0FDeEQsQ0FBQzs7QUFFRixJQUFJLE1BQU0sR0FBRyxnQkFBUyxJQUFJLEVBQUUsUUFBUSxFQUFFO0FBQ3BDLE1BQUksQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxDQUFDLEVBQUU7QUFDM0IsWUFBUSxHQUFHLFFBQVEsSUFBSSxFQUFFLENBQUM7QUFDMUIsUUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsQ0FBQyxDQUFDO0FBQ3ZCLFFBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLE9BQU8sQ0FBQztBQUM3QixRQUFJLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7QUFDdkIsUUFBSSxJQUFJOzs7Ozs7Ozs7O09BQUcsWUFBVztBQUNwQixVQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUEsR0FBSSxHQUFHLENBQUM7QUFDckUsVUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQzs7QUFFbkIsVUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLENBQUMsRUFBRTtBQUMzQixrQkFBVSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztPQUM1QjtLQUNGLENBQUEsQ0FBQztBQUNGLFFBQUksRUFBRSxDQUFDO0dBQ1I7QUFDRCxNQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7Q0FDOUIsQ0FBQzs7QUFFRixJQUFJLE9BQU8sR0FBRyxpQkFBUyxJQUFJLEVBQUUsUUFBUSxFQUFFO0FBQ3JDLFVBQVEsR0FBRyxRQUFRLElBQUksRUFBRSxDQUFDO0FBQzFCLE1BQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQztBQUN2QixNQUFJLElBQUksR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7QUFDdkIsTUFBSSxJQUFJOzs7Ozs7Ozs7O0tBQUcsWUFBVztBQUNwQixRQUFJLENBQUMsS0FBSyxDQUFDLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsR0FBRyxJQUFJLENBQUEsR0FBSSxHQUFHLENBQUM7QUFDckUsUUFBSSxHQUFHLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQzs7QUFFbkIsUUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsT0FBTyxHQUFHLENBQUMsRUFBRTtBQUMzQixnQkFBVSxDQUFDLElBQUksRUFBRSxRQUFRLENBQUMsQ0FBQztLQUM1QixNQUFNO0FBQ0wsVUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO0tBQzdCO0dBQ0YsQ0FBQSxDQUFDO0FBQ0YsTUFBSSxFQUFFLENBQUM7Q0FDUixDQUFDOztBQUVGLElBQUksU0FBUyxHQUFHLG1CQUFTLElBQUksRUFBRTs7O0FBRzdCLE1BQUksT0FBTyxVQUFVLEtBQUssVUFBVSxFQUFFOztBQUVwQyxRQUFJLElBQUksR0FBRyxJQUFJLFVBQVUsQ0FBQyxPQUFPLEVBQUU7QUFDakMsVUFBSSxFQUFFLE1BQU07QUFDWixhQUFPLEVBQUUsS0FBSztBQUNkLGdCQUFVLEVBQUUsSUFBSTtLQUNqQixDQUFDLENBQUM7QUFDSCxRQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDO0dBQzFCLE1BQU0sSUFBSyxRQUFRLENBQUMsV0FBVyxFQUFHOztBQUVqQyxRQUFJLEdBQUcsR0FBRyxRQUFRLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxDQUFDO0FBQzlDLE9BQUcsQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsQ0FBQztBQUNyQyxRQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0dBQ3pCLE1BQU0sSUFBSSxRQUFRLENBQUMsaUJBQWlCLEVBQUU7QUFDckMsUUFBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBRTtHQUM1QixNQUFNLElBQUksT0FBTyxJQUFJLENBQUMsT0FBTyxLQUFLLFVBQVUsRUFBRztBQUM5QyxRQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7R0FDaEI7Q0FDRixDQUFDOztBQUVGLElBQUksb0JBQW9CLEdBQUcsOEJBQVMsQ0FBQyxFQUFFOztBQUVyQyxNQUFJLE9BQU8sQ0FBQyxDQUFDLGVBQWUsS0FBSyxVQUFVLEVBQUU7QUFDM0MsS0FBQyxDQUFDLGVBQWUsRUFBRSxDQUFDO0FBQ3BCLEtBQUMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztHQUNwQixNQUFNLElBQUksTUFBTSxDQUFDLEtBQUssSUFBSSxNQUFNLENBQUMsS0FBSyxDQUFDLGNBQWMsQ0FBQyxjQUFjLENBQUMsRUFBRTtBQUN0RSxVQUFNLENBQUMsS0FBSyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7R0FDbEM7Q0FDRixDQUFDOztRQUdBLFFBQVEsR0FBUixRQUFRO1FBQUUsUUFBUSxHQUFSLFFBQVE7UUFBRSxXQUFXLEdBQVgsV0FBVztRQUMvQixVQUFVLEdBQVYsVUFBVTtRQUNWLEtBQUssR0FBTCxLQUFLO1FBQUUsSUFBSSxHQUFKLElBQUk7UUFBRSxLQUFLLEdBQUwsS0FBSztRQUFFLElBQUksR0FBSixJQUFJO1FBQ3hCLFlBQVksR0FBWixZQUFZO1FBQ1osWUFBWSxHQUFaLFlBQVk7UUFDWixNQUFNLEdBQU4sTUFBTTtRQUFFLE9BQU8sR0FBUCxPQUFPO1FBQ2YsU0FBUyxHQUFULFNBQVM7UUFDVCxvQkFBb0IsR0FBcEIsb0JBQW9COzs7Ozs7Ozs7OENDL0owQixjQUFjOzs2QkFDaEMsbUJBQW1COztBQUdqRCxJQUFJLGFBQWEsR0FBRyx1QkFBUyxLQUFLLEVBQUUsTUFBTSxFQUFFLEtBQUssRUFBRTtBQUNqRCxNQUFJLENBQUMsR0FBRyxLQUFLLElBQUksTUFBTSxDQUFDLEtBQUssQ0FBQztBQUM5QixNQUFJLE9BQU8sR0FBRyxDQUFDLENBQUMsT0FBTyxJQUFJLENBQUMsQ0FBQyxLQUFLLENBQUM7O0FBRW5DLE1BQUksU0FBUyxHQUFPLEtBQUssQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUMxRCxNQUFJLGFBQWEsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQ3pELE1BQUksYUFBYSxHQUFHLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDOztBQUcvRCxNQUFJLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFOztBQUUzQyxXQUFPO0dBQ1I7O0FBRUQsTUFBSSxjQUFjLEdBQUcsQ0FBQyxDQUFDLE1BQU0sSUFBSSxDQUFDLENBQUMsVUFBVSxDQUFDOztBQUU5QyxNQUFJLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQztBQUNsQixPQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsYUFBYSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUM3QyxRQUFJLGNBQWMsS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDLEVBQUU7QUFDdkMsY0FBUSxHQUFHLENBQUMsQ0FBQztBQUNiLFlBQU07S0FDUDtHQUNGOztBQUVELE1BQUksT0FBTyxLQUFLLENBQUMsRUFBRTs7QUFFakIsUUFBSSxRQUFRLEtBQUssQ0FBQyxDQUFDLEVBQUU7O0FBRW5CLG9CQUFjLEdBQUcsU0FBUyxDQUFDO0tBQzVCLE1BQU07O0FBRUwsVUFBSSxRQUFRLEtBQUssYUFBYSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7QUFDekMsc0JBQWMsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDLENBQUM7T0FDbkMsTUFBTTtBQUNMLHNCQUFjLEdBQUcsYUFBYSxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQztPQUM5QztLQUNGOztBQUVELG9DQTFDSyxvQkFBb0IsQ0EwQ0osQ0FBQyxDQUFDLENBQUM7QUFDeEIsa0JBQWMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7QUFFdkIsUUFBSSxNQUFNLENBQUMsa0JBQWtCLEVBQUU7QUFDN0IscUJBN0NHLGFBQWEsQ0E2Q0YsY0FBYyxFQUFFLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0tBQzFEO0dBQ0YsTUFBTTtBQUNMLFFBQUksT0FBTyxLQUFLLEVBQUUsRUFBRTtBQUNsQixVQUFJLGNBQWMsQ0FBQyxPQUFPLEtBQUssT0FBTyxFQUFFO0FBQ3RDLHNCQUFjLEdBQUcsU0FBUyxDQUFDO0FBQzNCLGlCQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7T0FDbkI7O0FBRUQsVUFBSSxRQUFRLEtBQUssQ0FBQyxDQUFDLEVBQUU7O0FBRW5CLHNCQUFjLEdBQUcsU0FBUyxDQUFDO09BQzVCLE1BQU07O0FBRUwsc0JBQWMsR0FBRyxTQUFTLENBQUM7T0FDNUI7S0FDRixNQUFNLElBQUksT0FBTyxLQUFLLEVBQUUsSUFBSSxNQUFNLENBQUMsY0FBYyxLQUFLLElBQUksRUFBRTtBQUMzRCxvQkFBYyxHQUFHLGFBQWEsQ0FBQztBQUMvQixzQ0FoRXlCLFNBQVMsQ0FnRXhCLGNBQWMsRUFBRSxDQUFDLENBQUMsQ0FBQztLQUM5QixNQUFNOztBQUVMLG9CQUFjLEdBQUcsU0FBUyxDQUFDO0tBQzVCO0dBQ0Y7Q0FDRixDQUFDOztxQkFFYSxhQUFhOzs7Ozs7Ozs7Ozs7d0JDeEVILFNBQVM7OzZEQUNnQyxjQUFjOzs2QkFDdEQsa0JBQWtCOzs7Ozs7Ozs0QkFRbkIsaUJBQWlCOzs7O0FBTjFDLElBQUksVUFBVSxHQUFLLGNBQWMsQ0FBQztBQUNsQyxJQUFJLFlBQVksR0FBRyxnQkFBZ0IsQ0FBQzs7QUFPcEMsSUFBSSxvQkFBb0IsR0FBRyxnQ0FBVztBQUNwQyxNQUFJLFNBQVMsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO0FBQzlDLFdBQVMsQ0FBQyxTQUFTLDRCQUFlLENBQUM7OztBQUduQyxTQUFPLFNBQVMsQ0FBQyxVQUFVLEVBQUU7QUFDM0IsWUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxDQUFDO0dBQ2pEO0NBQ0YsQ0FBQzs7Ozs7QUFLRixJQUFJLFFBQVE7Ozs7Ozs7Ozs7R0FBRyxZQUFXO0FBQ3hCLE1BQUksTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7O0FBRWhELE1BQUksQ0FBQyxNQUFNLEVBQUU7QUFDWCx3QkFBb0IsRUFBRSxDQUFDO0FBQ3ZCLFVBQU0sR0FBRyxRQUFRLEVBQUUsQ0FBQztHQUNyQjs7QUFFRCxTQUFPLE1BQU0sQ0FBQztDQUNmLENBQUEsQ0FBQzs7Ozs7QUFLRixJQUFJLFFBQVEsR0FBRyxvQkFBVztBQUN4QixNQUFJLE1BQU0sR0FBRyxRQUFRLEVBQUUsQ0FBQztBQUN4QixNQUFJLE1BQU0sRUFBRTtBQUNWLFdBQU8sTUFBTSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsQ0FBQztHQUN0QztDQUNGLENBQUM7Ozs7O0FBS0YsSUFBSSxVQUFVLEdBQUcsc0JBQVc7QUFDMUIsU0FBTyxRQUFRLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxDQUFDO0NBQzdDLENBQUM7Ozs7O0FBS0YsSUFBSSxhQUFhLEdBQUcsdUJBQVMsT0FBTyxFQUFFLE9BQU8sRUFBRTtBQUM3QyxNQUFJLFFBQVEsR0FBRyxVQXpEUixRQUFRLENBeURTLE9BQU8sQ0FBQyxDQUFDO0FBQ2pDLFNBQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxHQUFHLGVBQWUsR0FBRyxRQUFRLEdBQUcsNkNBQTZDLENBQUM7Q0FDdEcsQ0FBQzs7Ozs7QUFLRixJQUFJLFNBQVMsR0FBRyxtQkFBUyxRQUFRLEVBQUU7QUFDakMsTUFBSSxNQUFNLEdBQUcsUUFBUSxFQUFFLENBQUM7QUFDeEIsaURBakVrQyxNQUFNLENBaUVqQyxVQUFVLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQztBQUN6QixpREFsRTBDLElBQUksQ0FrRXpDLE1BQU0sQ0FBQyxDQUFDO0FBQ2IsaURBbkVnRCxRQUFRLENBbUUvQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztBQUNuQyxpREFwRU8sV0FBVyxDQW9FTixNQUFNLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQzs7QUFFdEMsUUFBTSxDQUFDLHFCQUFxQixHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUM7QUFDdEQsTUFBSSxTQUFTLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0FBQ3ZELFdBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzs7QUFFbEIsWUFBVSxDQUFDLFlBQVk7QUFDckIsbURBM0U4QyxRQUFRLENBMkU3QyxNQUFNLEVBQUUsU0FBUyxDQUFDLENBQUM7R0FDN0IsRUFBRSxHQUFHLENBQUMsQ0FBQzs7QUFFUixNQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsWUFBWSxDQUFDLFlBQVksQ0FBQyxDQUFDOztBQUU5QyxNQUFJLEtBQUssS0FBSyxNQUFNLElBQUksS0FBSyxLQUFLLEVBQUUsRUFBRTtBQUNwQyxRQUFJLGFBQWEsR0FBRyxRQUFRLENBQUM7QUFDN0IsVUFBTSxDQUFDLE9BQU8sR0FBRyxVQUFVLENBQUMsWUFBVztBQUNyQyxVQUFJLGtCQUFrQixHQUFJLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQSxJQUFLLE1BQU0sQ0FBQyxZQUFZLENBQUMsd0JBQXdCLENBQUMsS0FBSyxNQUFNLEFBQUMsQ0FBQztBQUMvRyxVQUFJLGtCQUFrQixFQUFFO0FBQ3RCLHFCQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7T0FDckIsTUFDSTtBQUNILGtCQUFVLENBQUMsS0FBSyxFQUFFLENBQUM7T0FDcEI7S0FDRixFQUFFLEtBQUssQ0FBQyxDQUFDO0dBQ1g7Q0FDRixDQUFDOzs7Ozs7QUFNRixJQUFJLFVBQVUsR0FBRyxzQkFBVztBQUMxQixNQUFJLE1BQU0sR0FBRyxRQUFRLEVBQUUsQ0FBQztBQUN4QixNQUFJLE1BQU0sR0FBRyxRQUFRLEVBQUUsQ0FBQzs7QUFFeEIsaURBdEdPLFdBQVcsQ0FzR04sTUFBTSxFQUFFLFlBQVksQ0FBQyxDQUFDO0FBQ2xDLFFBQU0sQ0FBQyxLQUFLLEdBQUcsMkJBQWMsVUFBVSxDQUFDO0FBQ3hDLFFBQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLDJCQUFjLFNBQVMsQ0FBQyxDQUFDO0FBQ3JELFFBQU0sQ0FBQyxZQUFZLENBQUMsYUFBYSxFQUFFLDJCQUFjLGdCQUFnQixDQUFDLENBQUM7O0FBRW5FLGlCQUFlLEVBQUUsQ0FBQztDQUNuQixDQUFDOztBQUdGLElBQUksZUFBZSxHQUFHLHlCQUFTLEtBQUssRUFBRTs7QUFFcEMsTUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE9BQU8sS0FBSyxFQUFFLEVBQUU7QUFDakMsV0FBTyxLQUFLLENBQUM7R0FDZDs7QUFFRCxNQUFJLE1BQU0sR0FBRyxRQUFRLEVBQUUsQ0FBQzs7QUFFeEIsTUFBSSxVQUFVLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO0FBQ3pELGlEQXhITyxXQUFXLENBd0hOLFVBQVUsRUFBRSxNQUFNLENBQUMsQ0FBQzs7QUFFaEMsTUFBSSxlQUFlLEdBQUcsTUFBTSxDQUFDLGFBQWEsQ0FBQyxxQkFBcUIsQ0FBQyxDQUFDO0FBQ2xFLGlEQTNITyxXQUFXLENBMkhOLGVBQWUsRUFBRSxNQUFNLENBQUMsQ0FBQztDQUN0QyxDQUFDOzs7OztBQU1GLElBQUksbUJBQW1CLEdBQUcsK0JBQVc7QUFDbkMsTUFBSSxNQUFNLEdBQUcsUUFBUSxFQUFFLENBQUM7QUFDeEIsUUFBTSxDQUFDLEtBQUssQ0FBQyxTQUFTLEdBQUcsK0NBcElMLFlBQVksQ0FvSU0sUUFBUSxFQUFFLENBQUMsQ0FBQztDQUNuRCxDQUFDOztRQUlBLG9CQUFvQixHQUFwQixvQkFBb0I7UUFDcEIsUUFBUSxHQUFSLFFBQVE7UUFDUixVQUFVLEdBQVYsVUFBVTtRQUNWLFFBQVEsR0FBUixRQUFRO1FBQ1IsYUFBYSxHQUFiLGFBQWE7UUFDYixTQUFTLEdBQVQsU0FBUztRQUNULFVBQVUsR0FBVixVQUFVO1FBQ1YsZUFBZSxHQUFmLGVBQWU7UUFDZixtQkFBbUIsR0FBbkIsbUJBQW1COzs7Ozs7OztBQ2xKckIsSUFBSSxZQUFZOzs7QUFHZDs7OzZCQUcyQjs7O2tNQVFsQjs7OzZIQU1BOzs7dUNBRzhCOzs7K05BUzlCLDRDQUVnQzs7OzRKQVEzQjs7OzRHQU1MOzs7NEtBTUE7OztRQUdELENBQUM7O3FCQUVJLFlBQVk7Ozs7Ozs7Ozs7cUJDdkRwQixTQUFTOzsrQ0FNVCxtQkFBbUI7OzhFQU1uQixjQUFjOztBQWhCckIsSUFBSSxVQUFVLEdBQUcsQ0FBQyxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUUsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDOzs7OztBQXNCNUUsSUFBSSxhQUFhLEdBQUcsdUJBQVMsTUFBTSxFQUFFO0FBQ25DLE1BQUksS0FBSyxHQUFHLGlDQWhCWixRQUFRLEVBZ0JjLENBQUM7O0FBRXZCLE1BQUksTUFBTSxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUM7QUFDdkMsTUFBSSxLQUFLLEdBQUcsS0FBSyxDQUFDLGFBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQztBQUNyQyxNQUFJLFVBQVUsR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0FBQ3RELE1BQUksV0FBVyxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQzs7Ozs7QUFLeEQsUUFBTSxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxLQUFLLEdBQUcsZ0VBbkJoRCxVQUFVLENBbUJpRCxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQzs7Ozs7QUFLbEcsT0FBSyxDQUFDLFNBQVMsR0FBRyxNQUFNLENBQUMsSUFBSSxHQUFHLE1BQU0sQ0FBQyxJQUFJLEdBQUcsZ0VBeEI5QyxVQUFVLENBd0IrQyxNQUFNLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDckcsTUFBSSxNQUFNLENBQUMsSUFBSSxFQUFFLGdFQXhCVixJQUFJLENBd0JXLEtBQUssQ0FBQyxDQUFDOzs7OztBQUs3QixNQUFJLE1BQU0sQ0FBQyxXQUFXLEVBQUU7QUFDdEIsb0VBaENRLFFBQVEsQ0FnQ1AsS0FBSyxFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztBQUNwQyxTQUFLLENBQUMsWUFBWSxDQUFDLG1CQUFtQixFQUFFLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQztHQUM3RCxNQUFNOztBQUVMLFFBQUksV0FBVyxHQUFHLEtBQUssQ0FBQyxZQUFZLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUMxRCxvRUFyQ2tCLFdBQVcsQ0FxQ2pCLEtBQUssRUFBRSxXQUFXLENBQUMsQ0FBQztBQUNoQyxTQUFLLENBQUMsWUFBWSxDQUFDLG1CQUFtQixFQUFFLEVBQUUsQ0FBQyxDQUFDO0dBQzdDOzs7OztBQUtELGtFQTFDb0IsSUFBSSxDQTBDbkIsS0FBSyxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUM7O0FBRXpDLE1BQUksTUFBTSxDQUFDLElBQUksSUFBSSxDQUFDLE9BeERwQixLQUFLLEVBd0RzQixFQUFFOzs7QUFFM0IsVUFBSSxTQUFTLEdBQUcsS0FBSyxDQUFDOztBQUV0QixXQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtBQUMxQyxZQUFJLE1BQU0sQ0FBQyxJQUFJLEtBQUssVUFBVSxDQUFDLENBQUMsQ0FBQyxFQUFFO0FBQ2pDLG1CQUFTLEdBQUcsSUFBSSxDQUFDO0FBQ2pCLGdCQUFNO1NBQ1A7T0FDRjs7QUFFRCxVQUFJLENBQUMsU0FBUyxFQUFFO0FBQ2QsY0FBTSxDQUFDLHNCQUFzQixHQUFHLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUM3QzthQUFPLEtBQUs7VUFBQztPQUNkOztBQUVELFVBQUksY0FBYyxHQUFHLENBQUMsU0FBUyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7QUFDN0QsVUFBSSxLQUFLLFlBQUEsQ0FBQzs7QUFFVixVQUFJLGNBQWMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxFQUFFO0FBQzlDLGFBQUssR0FBRyxLQUFLLENBQUMsYUFBYSxDQUFDLFdBQVcsR0FBRyxLQUFLLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQy9ELHdFQWpFRyxJQUFJLENBaUVGLEtBQUssQ0FBQyxDQUFDO09BQ2I7O0FBRUQsVUFBSSxNQUFNLEdBQUcsaUNBM0VmLFFBQVEsRUEyRWlCLENBQUM7OztBQUd4QixjQUFRLE1BQU0sQ0FBQyxJQUFJOztBQUVqQixhQUFLLFNBQVM7QUFDWiwwRUE1RUksUUFBUSxDQTRFSCxLQUFLLEVBQUUsU0FBUyxDQUFDLENBQUM7QUFDM0IsMEVBN0VJLFFBQVEsQ0E2RUgsS0FBSyxDQUFDLGFBQWEsQ0FBQyxTQUFTLENBQUMsRUFBRSxtQkFBbUIsQ0FBQyxDQUFDO0FBQzlELDBFQTlFSSxRQUFRLENBOEVILEtBQUssQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLEVBQUUsb0JBQW9CLENBQUMsQ0FBQztBQUNoRSxnQkFBTTs7QUFBQSxBQUVSLGFBQUssT0FBTztBQUNWLDBFQWxGSSxRQUFRLENBa0ZILEtBQUssRUFBRSxrQkFBa0IsQ0FBQyxDQUFDO0FBQ3BDLDBFQW5GSSxRQUFRLENBbUZILEtBQUssQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDNUQsZ0JBQU07O0FBQUEsQUFFUixhQUFLLFNBQVM7QUFDWiwwRUF2RkksUUFBUSxDQXVGSCxLQUFLLEVBQUUsY0FBYyxDQUFDLENBQUM7QUFDaEMsMEVBeEZJLFFBQVEsQ0F3RkgsS0FBSyxDQUFDLGFBQWEsQ0FBQyxVQUFVLENBQUMsRUFBRSxpQkFBaUIsQ0FBQyxDQUFDO0FBQzdELDBFQXpGSSxRQUFRLENBeUZILEtBQUssQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEVBQUUsaUJBQWlCLENBQUMsQ0FBQztBQUM1RCxnQkFBTTs7QUFBQSxBQUVSLGFBQUssT0FBTyxDQUFDO0FBQ2IsYUFBSyxRQUFRO0FBQ1gsZ0JBQU0sQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxTQUFTLENBQUMsQ0FBQztBQUM5QyxnQkFBTSxDQUFDLEtBQUssR0FBRyxNQUFNLENBQUMsVUFBVSxDQUFDO0FBQ2pDLGdCQUFNLENBQUMsWUFBWSxDQUFDLGFBQWEsRUFBRSxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztBQUM1RCwwRUFqR0ksUUFBUSxDQWlHSCxLQUFLLEVBQUUsWUFBWSxDQUFDLENBQUM7QUFDOUIsb0JBQVUsQ0FBQyxZQUFZO0FBQ3JCLGtCQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7QUFDZixrQkFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUM7V0FDeEQsRUFBRSxHQUFHLENBQUMsQ0FBQztBQUNSLGdCQUFNO0FBQUEsT0FDVDs7Ozs7O0dBQ0Y7Ozs7O0FBS0QsTUFBSSxNQUFNLENBQUMsUUFBUSxFQUFFO0FBQ25CLFFBQUksV0FBVyxHQUFHLEtBQUssQ0FBQyxhQUFhLENBQUMsb0JBQW9CLENBQUMsQ0FBQzs7QUFFNUQsZUFBVyxDQUFDLEtBQUssQ0FBQyxlQUFlLEdBQUcsTUFBTSxHQUFHLE1BQU0sQ0FBQyxRQUFRLEdBQUcsR0FBRyxDQUFDO0FBQ25FLG9FQS9HSyxJQUFJLENBK0dKLFdBQVcsQ0FBQyxDQUFDOztBQUVsQixRQUFJLFNBQVMsR0FBRyxFQUFFLENBQUM7QUFDbkIsUUFBSSxVQUFVLEdBQUcsRUFBRSxDQUFDOztBQUVwQixRQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUU7QUFDcEIsVUFBSSxVQUFVLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDeEQsVUFBSSxRQUFRLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQyxDQUFDO0FBQzdCLFVBQUksU0FBUyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQzs7QUFFOUIsVUFBSSxDQUFDLFFBQVEsSUFBSSxDQUFDLFNBQVMsRUFBRTtBQUMzQixjQUFNLENBQUMsa0VBQWtFLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO09BQy9GLE1BQU07QUFDTCxpQkFBUyxHQUFHLFFBQVEsQ0FBQztBQUNyQixrQkFBVSxHQUFHLFNBQVMsQ0FBQztPQUN4QjtLQUNGOztBQUVELGVBQVcsQ0FBQyxZQUFZLENBQUMsT0FBTyxFQUFFLFdBQVcsQ0FBQyxZQUFZLENBQUMsT0FBTyxDQUFDLEdBQUcsUUFBUSxHQUFHLFNBQVMsR0FBRyxhQUFhLEdBQUcsVUFBVSxHQUFHLElBQUksQ0FBQyxDQUFDO0dBQ2pJOzs7OztBQUtELE9BQUssQ0FBQyxZQUFZLENBQUMsd0JBQXdCLEVBQUUsTUFBTSxDQUFDLGdCQUFnQixDQUFDLENBQUM7QUFDdEUsTUFBSSxNQUFNLENBQUMsZ0JBQWdCLEVBQUU7QUFDM0IsY0FBVSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsY0FBYyxDQUFDO0dBQzNDLE1BQU07QUFDTCxvRUEzSWtCLElBQUksQ0EySWpCLFVBQVUsQ0FBQyxDQUFDO0dBQ2xCOzs7OztBQUtELE9BQUssQ0FBQyxZQUFZLENBQUMseUJBQXlCLEVBQUUsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7QUFDeEUsTUFBSSxNQUFNLENBQUMsaUJBQWlCLEVBQUU7QUFDNUIsZUFBVyxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsY0FBYyxDQUFDO0dBQzVDLE1BQU07QUFDTCxvRUFySmtCLElBQUksQ0FxSmpCLFdBQVcsQ0FBQyxDQUFDO0dBQ25COzs7OztBQUtELE1BQUksTUFBTSxDQUFDLGdCQUFnQixFQUFFO0FBQzNCLGNBQVUsQ0FBQyxTQUFTLEdBQUcsZ0VBN0p6QixVQUFVLENBNkowQixNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztHQUM1RDtBQUNELE1BQUksTUFBTSxDQUFDLGlCQUFpQixFQUFFO0FBQzVCLGVBQVcsQ0FBQyxTQUFTLEdBQUcsZ0VBaEsxQixVQUFVLENBZ0syQixNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQztHQUM5RDs7Ozs7QUFLRCxNQUFJLE1BQU0sQ0FBQyxrQkFBa0IsRUFBRTs7QUFFN0IsZUFBVyxDQUFDLEtBQUssQ0FBQyxlQUFlLEdBQUcsTUFBTSxDQUFDLGtCQUFrQixDQUFDOzs7QUFHOUQscUNBaExGLGFBQWEsQ0FnTEcsV0FBVyxFQUFFLE1BQU0sQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0dBQ3ZEOzs7OztBQUtELE9BQUssQ0FBQyxZQUFZLENBQUMsMEJBQTBCLEVBQUUsTUFBTSxDQUFDLGlCQUFpQixDQUFDLENBQUM7Ozs7O0FBS3pFLE1BQUksZUFBZSxHQUFHLE1BQU0sQ0FBQyxZQUFZLEdBQUcsSUFBSSxHQUFHLEtBQUssQ0FBQztBQUN6RCxPQUFLLENBQUMsWUFBWSxDQUFDLHdCQUF3QixFQUFFLGVBQWUsQ0FBQyxDQUFDOzs7OztBQUs5RCxNQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRTtBQUNyQixTQUFLLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFLE1BQU0sQ0FBQyxDQUFDO0dBQzlDLE1BQU0sSUFBSSxPQUFPLE1BQU0sQ0FBQyxTQUFTLEtBQUssUUFBUSxFQUFFO0FBQy9DLFNBQUssQ0FBQyxZQUFZLENBQUMsZ0JBQWdCLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO0dBQ3hELE1BQU07QUFDTCxTQUFLLENBQUMsWUFBWSxDQUFDLGdCQUFnQixFQUFFLEtBQUssQ0FBQyxDQUFDO0dBQzdDOzs7OztBQUtELE9BQUssQ0FBQyxZQUFZLENBQUMsWUFBWSxFQUFFLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQztDQUNoRCxDQUFDOztxQkFFYSxhQUFhOzs7Ozs7Ozs7Ozs7QUNyTjVCLElBQUksTUFBTSxHQUFHLGdCQUFTLENBQUMsRUFBRSxDQUFDLEVBQUU7QUFDMUIsT0FBSyxJQUFJLEdBQUcsSUFBSSxDQUFDLEVBQUU7QUFDakIsUUFBSSxDQUFDLENBQUMsY0FBYyxDQUFDLEdBQUcsQ0FBQyxFQUFFO0FBQ3pCLE9BQUMsQ0FBQyxHQUFHLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUM7S0FDakI7R0FDRjtBQUNELFNBQU8sQ0FBQyxDQUFDO0NBQ1YsQ0FBQzs7Ozs7QUFLRixJQUFJLFFBQVEsR0FBRyxrQkFBUyxHQUFHLEVBQUU7QUFDM0IsTUFBSSxNQUFNLEdBQUcsMkNBQTJDLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO0FBQ25FLFNBQU8sTUFBTSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDO0NBQ2xILENBQUM7Ozs7O0FBS0YsSUFBSSxLQUFLLEdBQUcsaUJBQVc7QUFDckIsU0FBUSxNQUFNLENBQUMsV0FBVyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixDQUFFO0NBQ3pELENBQUM7Ozs7O0FBS0YsSUFBSSxNQUFNLEdBQUcsZ0JBQVMsTUFBTSxFQUFFO0FBQzVCLE1BQUksTUFBTSxDQUFDLE9BQU8sRUFBRTs7QUFFbEIsVUFBTSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxDQUFDO0dBQzdDO0NBQ0YsQ0FBQzs7Ozs7O0FBTUYsSUFBSSxjQUFjLEdBQUcsd0JBQVMsR0FBRyxFQUFFLEdBQUcsRUFBRTs7QUFFdEMsS0FBRyxHQUFHLE1BQU0sQ0FBQyxHQUFHLENBQUMsQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0FBQzdDLE1BQUksR0FBRyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7QUFDbEIsT0FBRyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUMsQ0FBQyxDQUFDLEdBQUcsR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDO0dBQzNEO0FBQ0QsS0FBRyxHQUFHLEdBQUcsSUFBSSxDQUFDLENBQUM7OztBQUdmLE1BQUksR0FBRyxHQUFHLEdBQUcsQ0FBQztBQUNkLE1BQUksQ0FBQyxDQUFDO0FBQ04sTUFBSSxDQUFDLENBQUM7O0FBRU4sT0FBSyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFLEVBQUU7QUFDdEIsS0FBQyxHQUFHLFFBQVEsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFDdkMsS0FBQyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ3JFLE9BQUcsSUFBSSxDQUFDLElBQUksR0FBRyxDQUFDLENBQUEsQ0FBRSxNQUFNLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDO0dBQ3BDOztBQUVELFNBQU8sR0FBRyxDQUFDO0NBQ1osQ0FBQzs7UUFJQSxNQUFNLEdBQU4sTUFBTTtRQUNOLFFBQVEsR0FBUixRQUFRO1FBQ1IsS0FBSyxHQUFMLEtBQUs7UUFDTCxNQUFNLEdBQU4sTUFBTTtRQUNOLGNBQWMsR0FBZCxjQUFjIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIi8vIFN3ZWV0QWxlcnRcbi8vIDIwMTQtMjAxNSAoYykgLSBUcmlzdGFuIEVkd2FyZHNcbi8vIGdpdGh1Yi5jb20vdDR0NS9zd2VldGFsZXJ0XG5cbi8qXG4gKiBqUXVlcnktbGlrZSBmdW5jdGlvbnMgZm9yIG1hbmlwdWxhdGluZyB0aGUgRE9NXG4gKi9cbmltcG9ydCB7XG4gIGhhc0NsYXNzLCBhZGRDbGFzcywgcmVtb3ZlQ2xhc3MsIFxuICBlc2NhcGVIdG1sLCBcbiAgX3Nob3csIHNob3csIF9oaWRlLCBoaWRlLCBcbiAgaXNEZXNjZW5kYW50LCBcbiAgZ2V0VG9wTWFyZ2luLFxuICBmYWRlSW4sIGZhZGVPdXQsXG4gIGZpcmVDbGljayxcbiAgc3RvcEV2ZW50UHJvcGFnYXRpb25cbn0gZnJvbSAnLi9tb2R1bGVzL2hhbmRsZS1kb20nO1xuXG4vKlxuICogSGFuZHkgdXRpbGl0aWVzXG4gKi9cbmltcG9ydCB7XG4gIGV4dGVuZCxcbiAgaGV4VG9SZ2IsXG4gIGlzSUU4LFxuICBsb2dTdHIsXG4gIGNvbG9yTHVtaW5hbmNlXG59IGZyb20gJy4vbW9kdWxlcy91dGlscyc7XG5cbi8qXG4gKiAgSGFuZGxlIHN3ZWV0QWxlcnQncyBET00gZWxlbWVudHNcbiAqL1xuaW1wb3J0IHtcbiAgc3dlZXRBbGVydEluaXRpYWxpemUsXG4gIGdldE1vZGFsLFxuICBnZXRPdmVybGF5LFxuICBnZXRJbnB1dCxcbiAgc2V0Rm9jdXNTdHlsZSxcbiAgb3Blbk1vZGFsLFxuICByZXNldElucHV0LFxuICBmaXhWZXJ0aWNhbFBvc2l0aW9uXG59IGZyb20gJy4vbW9kdWxlcy9oYW5kbGUtc3dhbC1kb20nO1xuXG5cbi8vIEhhbmRsZSBidXR0b24gZXZlbnRzIGFuZCBrZXlib2FyZCBldmVudHNcbmltcG9ydCB7IGhhbmRsZUJ1dHRvbiwgaGFuZGxlQ29uZmlybSwgaGFuZGxlQ2FuY2VsIH0gZnJvbSAnLi9tb2R1bGVzL2hhbmRsZS1jbGljayc7XG5pbXBvcnQgaGFuZGxlS2V5RG93biBmcm9tICcuL21vZHVsZXMvaGFuZGxlLWtleSc7XG5cblxuLy8gRGVmYXVsdCB2YWx1ZXNcbmltcG9ydCBkZWZhdWx0UGFyYW1zIGZyb20gJy4vbW9kdWxlcy9kZWZhdWx0LXBhcmFtcyc7XG5pbXBvcnQgc2V0UGFyYW1ldGVycyBmcm9tICcuL21vZHVsZXMvc2V0LXBhcmFtcyc7XG5cbi8qXG4gKiBSZW1lbWJlciBzdGF0ZSBpbiBjYXNlcyB3aGVyZSBvcGVuaW5nIGFuZCBoYW5kbGluZyBhIG1vZGFsIHdpbGwgZmlkZGxlIHdpdGggaXQuXG4gKiAoV2UgYWxzbyB1c2Ugd2luZG93LnByZXZpb3VzQWN0aXZlRWxlbWVudCBhcyBhIGdsb2JhbCB2YXJpYWJsZSlcbiAqL1xudmFyIHByZXZpb3VzV2luZG93S2V5RG93bjtcbnZhciBsYXN0Rm9jdXNlZEJ1dHRvbjtcblxuXG4vKlxuICogR2xvYmFsIHN3ZWV0QWxlcnQgZnVuY3Rpb25cbiAqICh0aGlzIGlzIHdoYXQgdGhlIHVzZXIgY2FsbHMpXG4gKi9cbnZhciBzd2VldEFsZXJ0LCBzd2FsO1xuXG5zd2VldEFsZXJ0ID0gc3dhbCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgY3VzdG9taXphdGlvbnMgPSBhcmd1bWVudHNbMF07XG5cbiAgYWRkQ2xhc3MoZG9jdW1lbnQuYm9keSwgJ3N0b3Atc2Nyb2xsaW5nJyk7XG4gIHJlc2V0SW5wdXQoKTtcblxuICAvKlxuICAgKiBVc2UgYXJndW1lbnQgaWYgZGVmaW5lZCBvciBkZWZhdWx0IHZhbHVlIGZyb20gcGFyYW1zIG9iamVjdCBvdGhlcndpc2UuXG4gICAqIFN1cHBvcnRzIHRoZSBjYXNlIHdoZXJlIGEgZGVmYXVsdCB2YWx1ZSBpcyBib29sZWFuIHRydWUgYW5kIHNob3VsZCBiZVxuICAgKiBvdmVycmlkZGVuIGJ5IGEgY29ycmVzcG9uZGluZyBleHBsaWNpdCBhcmd1bWVudCB3aGljaCBpcyBib29sZWFuIGZhbHNlLlxuICAgKi9cbiAgZnVuY3Rpb24gYXJndW1lbnRPckRlZmF1bHQoa2V5KSB7XG4gICAgdmFyIGFyZ3MgPSBjdXN0b21pemF0aW9ucztcbiAgICByZXR1cm4gKGFyZ3Nba2V5XSA9PT0gdW5kZWZpbmVkKSA/ICBkZWZhdWx0UGFyYW1zW2tleV0gOiBhcmdzW2tleV07XG4gIH1cblxuICBpZiAoY3VzdG9taXphdGlvbnMgPT09IHVuZGVmaW5lZCkge1xuICAgIGxvZ1N0cignU3dlZXRBbGVydCBleHBlY3RzIGF0IGxlYXN0IDEgYXR0cmlidXRlIScpO1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciBwYXJhbXMgPSBleHRlbmQoe30sIGRlZmF1bHRQYXJhbXMpO1xuXG4gIHN3aXRjaCAodHlwZW9mIGN1c3RvbWl6YXRpb25zKSB7XG5cbiAgICAvLyBFeDogc3dhbChcIkhlbGxvXCIsIFwiSnVzdCB0ZXN0aW5nXCIsIFwiaW5mb1wiKTtcbiAgICBjYXNlICdzdHJpbmcnOlxuICAgICAgcGFyYW1zLnRpdGxlID0gY3VzdG9taXphdGlvbnM7XG4gICAgICBwYXJhbXMudGV4dCAgPSBhcmd1bWVudHNbMV0gfHwgJyc7XG4gICAgICBwYXJhbXMudHlwZSAgPSBhcmd1bWVudHNbMl0gfHwgJyc7XG4gICAgICBicmVhaztcblxuICAgIC8vIEV4OiBzd2FsKHsgdGl0bGU6XCJIZWxsb1wiLCB0ZXh0OiBcIkp1c3QgdGVzdGluZ1wiLCB0eXBlOiBcImluZm9cIiB9KTtcbiAgICBjYXNlICdvYmplY3QnOlxuICAgICAgaWYgKGN1c3RvbWl6YXRpb25zLnRpdGxlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgbG9nU3RyKCdNaXNzaW5nIFwidGl0bGVcIiBhcmd1bWVudCEnKTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuXG4gICAgICBwYXJhbXMudGl0bGUgPSBjdXN0b21pemF0aW9ucy50aXRsZTtcblxuICAgICAgZm9yIChsZXQgY3VzdG9tTmFtZSBpbiBkZWZhdWx0UGFyYW1zKSB7XG4gICAgICAgIHBhcmFtc1tjdXN0b21OYW1lXSA9IGFyZ3VtZW50T3JEZWZhdWx0KGN1c3RvbU5hbWUpO1xuICAgICAgfVxuXG4gICAgICAvLyBTaG93IFwiQ29uZmlybVwiIGluc3RlYWQgb2YgXCJPS1wiIGlmIGNhbmNlbCBidXR0b24gaXMgdmlzaWJsZVxuICAgICAgcGFyYW1zLmNvbmZpcm1CdXR0b25UZXh0ID0gcGFyYW1zLnNob3dDYW5jZWxCdXR0b24gPyAnQ29uZmlybScgOiBkZWZhdWx0UGFyYW1zLmNvbmZpcm1CdXR0b25UZXh0O1xuICAgICAgcGFyYW1zLmNvbmZpcm1CdXR0b25UZXh0ID0gYXJndW1lbnRPckRlZmF1bHQoJ2NvbmZpcm1CdXR0b25UZXh0Jyk7XG5cbiAgICAgIC8vIENhbGxiYWNrIGZ1bmN0aW9uIHdoZW4gY2xpY2tpbmcgb24gXCJPS1wiL1wiQ2FuY2VsXCJcbiAgICAgIHBhcmFtcy5kb25lRnVuY3Rpb24gPSBhcmd1bWVudHNbMV0gfHwgbnVsbDtcblxuICAgICAgYnJlYWs7XG5cbiAgICBkZWZhdWx0OlxuICAgICAgbG9nU3RyKCdVbmV4cGVjdGVkIHR5cGUgb2YgYXJndW1lbnQhIEV4cGVjdGVkIFwic3RyaW5nXCIgb3IgXCJvYmplY3RcIiwgZ290ICcgKyB0eXBlb2YgY3VzdG9taXphdGlvbnMpO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuXG4gIH1cblxuICBzZXRQYXJhbWV0ZXJzKHBhcmFtcyk7XG4gIGZpeFZlcnRpY2FsUG9zaXRpb24oKTtcbiAgb3Blbk1vZGFsKGFyZ3VtZW50c1sxXSk7XG5cbiAgLy8gTW9kYWwgaW50ZXJhY3Rpb25zXG4gIHZhciBtb2RhbCA9IGdldE1vZGFsKCk7XG5cblxuICAvKiBcbiAgICogTWFrZSBzdXJlIGFsbCBtb2RhbCBidXR0b25zIHJlc3BvbmQgdG8gYWxsIGV2ZW50c1xuICAgKi9cbiAgdmFyICRidXR0b25zID0gbW9kYWwucXVlcnlTZWxlY3RvckFsbCgnYnV0dG9uJyk7XG4gIHZhciBidXR0b25FdmVudHMgPSBbJ29uY2xpY2snLCAnb25tb3VzZW92ZXInLCAnb25tb3VzZW91dCcsICdvbm1vdXNlZG93bicsICdvbm1vdXNldXAnLCAnb25mb2N1cyddO1xuICB2YXIgb25CdXR0b25FdmVudCA9IChlKSA9PiBoYW5kbGVCdXR0b24oZSwgcGFyYW1zLCBtb2RhbCk7XG5cbiAgZm9yIChsZXQgYnRuSW5kZXggPSAwOyBidG5JbmRleCA8ICRidXR0b25zLmxlbmd0aDsgYnRuSW5kZXgrKykge1xuICAgIGZvciAobGV0IGV2dEluZGV4ID0gMDsgZXZ0SW5kZXggPCBidXR0b25FdmVudHMubGVuZ3RoOyBldnRJbmRleCsrKSB7XG4gICAgICBsZXQgYnRuRXZ0ID0gYnV0dG9uRXZlbnRzW2V2dEluZGV4XTtcbiAgICAgICRidXR0b25zW2J0bkluZGV4XVtidG5FdnRdID0gb25CdXR0b25FdmVudDtcbiAgICB9XG4gIH1cblxuICAvLyBDbGlja2luZyBvdXRzaWRlIHRoZSBtb2RhbCBkaXNtaXNzZXMgaXQgKGlmIGFsbG93ZWQgYnkgdXNlcilcbiAgZ2V0T3ZlcmxheSgpLm9uY2xpY2sgPSBvbkJ1dHRvbkV2ZW50O1xuXG4gIHByZXZpb3VzV2luZG93S2V5RG93biA9IHdpbmRvdy5vbmtleWRvd247XG5cbiAgdmFyIG9uS2V5RXZlbnQgPSAoZSkgPT4gaGFuZGxlS2V5RG93bihlLCBwYXJhbXMsIG1vZGFsKTtcbiAgd2luZG93Lm9ua2V5ZG93biA9IG9uS2V5RXZlbnQ7XG5cbiAgd2luZG93Lm9uZm9jdXMgPSBmdW5jdGlvbiAoKSB7XG4gICAgLy8gV2hlbiB0aGUgdXNlciBoYXMgZm9jdXNlZCBhd2F5IGFuZCBmb2N1c2VkIGJhY2sgZnJvbSB0aGUgd2hvbGUgd2luZG93LlxuICAgIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgICAgLy8gUHV0IGluIGEgdGltZW91dCB0byBqdW1wIG91dCBvZiB0aGUgZXZlbnQgc2VxdWVuY2UuXG4gICAgICAvLyBDYWxsaW5nIGZvY3VzKCkgaW4gdGhlIGV2ZW50IHNlcXVlbmNlIGNvbmZ1c2VzIHRoaW5ncy5cbiAgICAgIGlmIChsYXN0Rm9jdXNlZEJ1dHRvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxhc3RGb2N1c2VkQnV0dG9uLmZvY3VzKCk7XG4gICAgICAgIGxhc3RGb2N1c2VkQnV0dG9uID0gdW5kZWZpbmVkO1xuICAgICAgfVxuICAgIH0sIDApO1xuICB9O1xufTtcblxuXG5cbi8qXG4gKiBTZXQgZGVmYXVsdCBwYXJhbXMgZm9yIGVhY2ggcG9wdXBcbiAqIEBwYXJhbSB7T2JqZWN0fSB1c2VyUGFyYW1zXG4gKi9cbnN3ZWV0QWxlcnQuc2V0RGVmYXVsdHMgPSBzd2FsLnNldERlZmF1bHRzID0gZnVuY3Rpb24odXNlclBhcmFtcykge1xuICBpZiAoIXVzZXJQYXJhbXMpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3VzZXJQYXJhbXMgaXMgcmVxdWlyZWQnKTtcbiAgfVxuICBpZiAodHlwZW9mIHVzZXJQYXJhbXMgIT09ICdvYmplY3QnKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCd1c2VyUGFyYW1zIGhhcyB0byBiZSBhIG9iamVjdCcpO1xuICB9XG5cbiAgZXh0ZW5kKGRlZmF1bHRQYXJhbXMsIHVzZXJQYXJhbXMpO1xufTtcblxuXG4vKlxuICogQW5pbWF0aW9uIHdoZW4gY2xvc2luZyBtb2RhbFxuICovXG5zd2VldEFsZXJ0LmNsb3NlID0gc3dhbC5jbG9zZSA9IGZ1bmN0aW9uKCkge1xuICB2YXIgbW9kYWwgPSBnZXRNb2RhbCgpO1xuXG4gIGZhZGVPdXQoZ2V0T3ZlcmxheSgpLCA1KTtcbiAgZmFkZU91dChtb2RhbCwgNSk7XG4gIHJlbW92ZUNsYXNzKG1vZGFsLCAnc2hvd1N3ZWV0QWxlcnQnKTtcbiAgYWRkQ2xhc3MobW9kYWwsICdoaWRlU3dlZXRBbGVydCcpO1xuICByZW1vdmVDbGFzcyhtb2RhbCwgJ3Zpc2libGUnKTtcblxuICAvKlxuICAgKiBSZXNldCBpY29uIGFuaW1hdGlvbnNcbiAgICovXG4gIHZhciAkc3VjY2Vzc0ljb24gPSBtb2RhbC5xdWVyeVNlbGVjdG9yKCcuc2EtaWNvbi5zYS1zdWNjZXNzJyk7XG4gIHJlbW92ZUNsYXNzKCRzdWNjZXNzSWNvbiwgJ2FuaW1hdGUnKTtcbiAgcmVtb3ZlQ2xhc3MoJHN1Y2Nlc3NJY29uLnF1ZXJ5U2VsZWN0b3IoJy5zYS10aXAnKSwgJ2FuaW1hdGVTdWNjZXNzVGlwJyk7XG4gIHJlbW92ZUNsYXNzKCRzdWNjZXNzSWNvbi5xdWVyeVNlbGVjdG9yKCcuc2EtbG9uZycpLCAnYW5pbWF0ZVN1Y2Nlc3NMb25nJyk7XG5cbiAgdmFyICRlcnJvckljb24gPSBtb2RhbC5xdWVyeVNlbGVjdG9yKCcuc2EtaWNvbi5zYS1lcnJvcicpO1xuICByZW1vdmVDbGFzcygkZXJyb3JJY29uLCAnYW5pbWF0ZUVycm9ySWNvbicpO1xuICByZW1vdmVDbGFzcygkZXJyb3JJY29uLnF1ZXJ5U2VsZWN0b3IoJy5zYS14LW1hcmsnKSwgJ2FuaW1hdGVYTWFyaycpO1xuXG4gIHZhciAkd2FybmluZ0ljb24gPSBtb2RhbC5xdWVyeVNlbGVjdG9yKCcuc2EtaWNvbi5zYS13YXJuaW5nJyk7XG4gIHJlbW92ZUNsYXNzKCR3YXJuaW5nSWNvbiwgJ3B1bHNlV2FybmluZycpO1xuICByZW1vdmVDbGFzcygkd2FybmluZ0ljb24ucXVlcnlTZWxlY3RvcignLnNhLWJvZHknKSwgJ3B1bHNlV2FybmluZ0lucycpO1xuICByZW1vdmVDbGFzcygkd2FybmluZ0ljb24ucXVlcnlTZWxlY3RvcignLnNhLWRvdCcpLCAncHVsc2VXYXJuaW5nSW5zJyk7XG5cbiAgLy8gUmVzZXQgY3VzdG9tIGNsYXNzIChkZWxheSBzbyB0aGF0IFVJIGNoYW5nZXMgYXJlbid0IHZpc2libGUpXG4gIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgdmFyIGN1c3RvbUNsYXNzID0gbW9kYWwuZ2V0QXR0cmlidXRlKCdkYXRhLWN1c3RvbS1jbGFzcycpO1xuICAgIHJlbW92ZUNsYXNzKG1vZGFsLCBjdXN0b21DbGFzcyk7XG4gIH0sIDMwMCk7XG5cbiAgLy8gTWFrZSBwYWdlIHNjcm9sbGFibGUgYWdhaW5cbiAgcmVtb3ZlQ2xhc3MoZG9jdW1lbnQuYm9keSwgJ3N0b3Atc2Nyb2xsaW5nJyk7XG5cbiAgLy8gUmVzZXQgdGhlIHBhZ2UgdG8gaXRzIHByZXZpb3VzIHN0YXRlXG4gIHdpbmRvdy5vbmtleWRvd24gPSBwcmV2aW91c1dpbmRvd0tleURvd247XG4gIGlmICh3aW5kb3cucHJldmlvdXNBY3RpdmVFbGVtZW50KSB7XG4gICAgd2luZG93LnByZXZpb3VzQWN0aXZlRWxlbWVudC5mb2N1cygpO1xuICB9XG4gIGxhc3RGb2N1c2VkQnV0dG9uID0gdW5kZWZpbmVkO1xuICBjbGVhclRpbWVvdXQobW9kYWwudGltZW91dCk7XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5cbi8qXG4gKiBWYWxpZGF0aW9uIG9mIHRoZSBpbnB1dCBmaWVsZCBpcyBkb25lIGJ5IHVzZXJcbiAqIElmIHNvbWV0aGluZyBpcyB3cm9uZyA9PiBjYWxsIHNob3dJbnB1dEVycm9yIHdpdGggZXJyb3JNZXNzYWdlXG4gKi9cbnN3ZWV0QWxlcnQuc2hvd0lucHV0RXJyb3IgPSBzd2FsLnNob3dJbnB1dEVycm9yID0gZnVuY3Rpb24oZXJyb3JNZXNzYWdlKSB7XG4gIHZhciBtb2RhbCA9IGdldE1vZGFsKCk7XG5cbiAgdmFyICRlcnJvckljb24gPSBtb2RhbC5xdWVyeVNlbGVjdG9yKCcuc2EtaW5wdXQtZXJyb3InKTtcbiAgYWRkQ2xhc3MoJGVycm9ySWNvbiwgJ3Nob3cnKTtcblxuICB2YXIgJGVycm9yQ29udGFpbmVyID0gbW9kYWwucXVlcnlTZWxlY3RvcignLnNhLWVycm9yLWNvbnRhaW5lcicpO1xuICBhZGRDbGFzcygkZXJyb3JDb250YWluZXIsICdzaG93Jyk7XG5cbiAgJGVycm9yQ29udGFpbmVyLnF1ZXJ5U2VsZWN0b3IoJ3AnKS5pbm5lckhUTUwgPSBlcnJvck1lc3NhZ2U7XG5cbiAgbW9kYWwucXVlcnlTZWxlY3RvcignaW5wdXQnKS5mb2N1cygpO1xufTtcblxuXG4vKlxuICogUmVzZXQgaW5wdXQgZXJyb3IgRE9NIGVsZW1lbnRzXG4gKi9cbnN3ZWV0QWxlcnQucmVzZXRJbnB1dEVycm9yID0gc3dhbC5yZXNldElucHV0RXJyb3IgPSBmdW5jdGlvbihldmVudCkge1xuICAvLyBJZiBwcmVzcyBlbnRlciA9PiBpZ25vcmVcbiAgaWYgKGV2ZW50ICYmIGV2ZW50LmtleUNvZGUgPT09IDEzKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgdmFyICRtb2RhbCA9IGdldE1vZGFsKCk7XG5cbiAgdmFyICRlcnJvckljb24gPSAkbW9kYWwucXVlcnlTZWxlY3RvcignLnNhLWlucHV0LWVycm9yJyk7XG4gIHJlbW92ZUNsYXNzKCRlcnJvckljb24sICdzaG93Jyk7XG5cbiAgdmFyICRlcnJvckNvbnRhaW5lciA9ICRtb2RhbC5xdWVyeVNlbGVjdG9yKCcuc2EtZXJyb3ItY29udGFpbmVyJyk7XG4gIHJlbW92ZUNsYXNzKCRlcnJvckNvbnRhaW5lciwgJ3Nob3cnKTtcbn07XG5cbmlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykge1xuICAvLyBUaGUgJ2hhbmRsZS1jbGljaycgbW9kdWxlIHJlcXVpcmVzXG4gIC8vIHRoYXQgJ3N3ZWV0QWxlcnQnIHdhcyBzZXQgYXMgZ2xvYmFsLlxuICB3aW5kb3cuc3dlZXRBbGVydCA9IHdpbmRvdy5zd2FsID0gc3dlZXRBbGVydDtcbn0gZWxzZSB7XG4gIGxvZ1N0cignU3dlZXRBbGVydCBpcyBhIGZyb250ZW5kIG1vZHVsZSEnKTtcbn1cbiIsInZhciBkZWZhdWx0UGFyYW1zID0ge1xuICB0aXRsZTogJycsXG4gIHRleHQ6ICcnLFxuICB0eXBlOiBudWxsLFxuICBhbGxvd091dHNpZGVDbGljazogZmFsc2UsXG4gIHNob3dDb25maXJtQnV0dG9uOiB0cnVlLFxuICBzaG93Q2FuY2VsQnV0dG9uOiBmYWxzZSxcbiAgY2xvc2VPbkNvbmZpcm06IHRydWUsXG4gIGNsb3NlT25DYW5jZWw6IHRydWUsXG4gIGNvbmZpcm1CdXR0b25UZXh0OiAnT0snLFxuICBjb25maXJtQnV0dG9uQ29sb3I6ICcjQUVERUY0JyxcbiAgY2FuY2VsQnV0dG9uVGV4dDogJ0NhbmNlbCcsXG4gIGltYWdlVXJsOiBudWxsLFxuICBpbWFnZVNpemU6IG51bGwsXG4gIHRpbWVyOiBudWxsLFxuICBjdXN0b21DbGFzczogJycsXG4gIGh0bWw6IGZhbHNlLFxuICBhbmltYXRpb246IHRydWUsXG4gIGFsbG93RXNjYXBlS2V5OiB0cnVlLFxuICBpbnB1dFR5cGU6ICd0ZXh0JyxcbiAgaW5wdXRQbGFjZWhvbGRlcjogJycsXG4gIGlucHV0VmFsdWU6ICcnXG59O1xuXG5leHBvcnQgZGVmYXVsdCBkZWZhdWx0UGFyYW1zOyIsImltcG9ydCB7IGNvbG9yTHVtaW5hbmNlIH0gZnJvbSAnLi91dGlscyc7XG5pbXBvcnQgeyBnZXRNb2RhbCB9IGZyb20gJy4vaGFuZGxlLXN3YWwtZG9tJztcbmltcG9ydCB7IGhhc0NsYXNzLCBpc0Rlc2NlbmRhbnQgfSBmcm9tICcuL2hhbmRsZS1kb20nO1xuXG5cbi8qXG4gKiBVc2VyIGNsaWNrZWQgb24gXCJDb25maXJtXCIvXCJPS1wiIG9yIFwiQ2FuY2VsXCJcbiAqL1xudmFyIGhhbmRsZUJ1dHRvbiA9IGZ1bmN0aW9uKGV2ZW50LCBwYXJhbXMsIG1vZGFsKSB7XG4gIHZhciBlID0gZXZlbnQgfHwgd2luZG93LmV2ZW50O1xuICB2YXIgdGFyZ2V0ID0gZS50YXJnZXQgfHwgZS5zcmNFbGVtZW50O1xuXG4gIHZhciB0YXJnZXRlZENvbmZpcm0gPSB0YXJnZXQuY2xhc3NOYW1lLmluZGV4T2YoJ2NvbmZpcm0nKSAhPT0gLTE7XG4gIHZhciB0YXJnZXRlZE92ZXJsYXkgPSB0YXJnZXQuY2xhc3NOYW1lLmluZGV4T2YoJ3N3ZWV0LW92ZXJsYXknKSAhPT0gLTE7XG4gIHZhciBtb2RhbElzVmlzaWJsZSAgPSBoYXNDbGFzcyhtb2RhbCwgJ3Zpc2libGUnKTtcbiAgdmFyIGRvbmVGdW5jdGlvbkV4aXN0cyA9IChwYXJhbXMuZG9uZUZ1bmN0aW9uICYmIG1vZGFsLmdldEF0dHJpYnV0ZSgnZGF0YS1oYXMtZG9uZS1mdW5jdGlvbicpID09PSAndHJ1ZScpO1xuXG4gIC8vIFNpbmNlIHRoZSB1c2VyIGNhbiBjaGFuZ2UgdGhlIGJhY2tncm91bmQtY29sb3Igb2YgdGhlIGNvbmZpcm0gYnV0dG9uIHByb2dyYW1tYXRpY2FsbHksXG4gIC8vIHdlIG11c3QgY2FsY3VsYXRlIHdoYXQgdGhlIGNvbG9yIHNob3VsZCBiZSBvbiBob3Zlci9hY3RpdmVcbiAgdmFyIG5vcm1hbENvbG9yLCBob3ZlckNvbG9yLCBhY3RpdmVDb2xvcjtcbiAgaWYgKHRhcmdldGVkQ29uZmlybSAmJiBwYXJhbXMuY29uZmlybUJ1dHRvbkNvbG9yKSB7XG4gICAgbm9ybWFsQ29sb3IgID0gcGFyYW1zLmNvbmZpcm1CdXR0b25Db2xvcjtcbiAgICBob3ZlckNvbG9yICAgPSBjb2xvckx1bWluYW5jZShub3JtYWxDb2xvciwgLTAuMDQpO1xuICAgIGFjdGl2ZUNvbG9yICA9IGNvbG9yTHVtaW5hbmNlKG5vcm1hbENvbG9yLCAtMC4xNCk7XG4gIH1cblxuICBmdW5jdGlvbiBzaG91bGRTZXRDb25maXJtQnV0dG9uQ29sb3IoY29sb3IpIHtcbiAgICBpZiAodGFyZ2V0ZWRDb25maXJtICYmIHBhcmFtcy5jb25maXJtQnV0dG9uQ29sb3IpIHtcbiAgICAgIHRhcmdldC5zdHlsZS5iYWNrZ3JvdW5kQ29sb3IgPSBjb2xvcjtcbiAgICB9XG4gIH1cblxuICBzd2l0Y2ggKGUudHlwZSkge1xuICAgIGNhc2UgJ21vdXNlb3Zlcic6XG4gICAgICBzaG91bGRTZXRDb25maXJtQnV0dG9uQ29sb3IoaG92ZXJDb2xvcik7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ21vdXNlb3V0JzpcbiAgICAgIHNob3VsZFNldENvbmZpcm1CdXR0b25Db2xvcihub3JtYWxDb2xvcik7XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgJ21vdXNlZG93bic6XG4gICAgICBzaG91bGRTZXRDb25maXJtQnV0dG9uQ29sb3IoYWN0aXZlQ29sb3IpO1xuICAgICAgYnJlYWs7XG5cbiAgICBjYXNlICdtb3VzZXVwJzpcbiAgICAgIHNob3VsZFNldENvbmZpcm1CdXR0b25Db2xvcihob3ZlckNvbG9yKTtcbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnZm9jdXMnOlxuICAgICAgbGV0ICRjb25maXJtQnV0dG9uID0gbW9kYWwucXVlcnlTZWxlY3RvcignYnV0dG9uLmNvbmZpcm0nKTtcbiAgICAgIGxldCAkY2FuY2VsQnV0dG9uICA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbi5jYW5jZWwnKTtcblxuICAgICAgaWYgKHRhcmdldGVkQ29uZmlybSkge1xuICAgICAgICAkY2FuY2VsQnV0dG9uLnN0eWxlLmJveFNoYWRvdyA9ICdub25lJztcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgICRjb25maXJtQnV0dG9uLnN0eWxlLmJveFNoYWRvdyA9ICdub25lJztcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuXG4gICAgY2FzZSAnY2xpY2snOlxuICAgICAgbGV0IGNsaWNrZWRPbk1vZGFsID0gKG1vZGFsID09PSB0YXJnZXQpO1xuICAgICAgbGV0IGNsaWNrZWRPbk1vZGFsQ2hpbGQgPSBpc0Rlc2NlbmRhbnQobW9kYWwsIHRhcmdldCk7XG5cbiAgICAgIC8vIElnbm9yZSBjbGljayBvdXRzaWRlIGlmIGFsbG93T3V0c2lkZUNsaWNrIGlzIGZhbHNlXG4gICAgICBpZiAoIWNsaWNrZWRPbk1vZGFsICYmICFjbGlja2VkT25Nb2RhbENoaWxkICYmIG1vZGFsSXNWaXNpYmxlICYmICFwYXJhbXMuYWxsb3dPdXRzaWRlQ2xpY2spIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmICh0YXJnZXRlZENvbmZpcm0gJiYgZG9uZUZ1bmN0aW9uRXhpc3RzICYmIG1vZGFsSXNWaXNpYmxlKSB7XG4gICAgICAgIGhhbmRsZUNvbmZpcm0obW9kYWwsIHBhcmFtcyk7XG4gICAgICB9IGVsc2UgaWYgKGRvbmVGdW5jdGlvbkV4aXN0cyAmJiBtb2RhbElzVmlzaWJsZSB8fCB0YXJnZXRlZE92ZXJsYXkpIHtcbiAgICAgICAgaGFuZGxlQ2FuY2VsKG1vZGFsLCBwYXJhbXMpO1xuICAgICAgfSBlbHNlIGlmIChpc0Rlc2NlbmRhbnQobW9kYWwsIHRhcmdldCkgJiYgdGFyZ2V0LnRhZ05hbWUgPT09ICdCVVRUT04nKSB7XG4gICAgICAgIHN3ZWV0QWxlcnQuY2xvc2UoKTtcbiAgICAgIH1cbiAgICAgIGJyZWFrO1xuICB9XG59O1xuXG4vKlxuICogIFVzZXIgY2xpY2tlZCBvbiBcIkNvbmZpcm1cIi9cIk9LXCJcbiAqL1xudmFyIGhhbmRsZUNvbmZpcm0gPSBmdW5jdGlvbihtb2RhbCwgcGFyYW1zKSB7XG4gIHZhciBjYWxsYmFja1ZhbHVlID0gdHJ1ZTtcblxuICBpZiAoaGFzQ2xhc3MobW9kYWwsICdzaG93LWlucHV0JykpIHtcbiAgICBjYWxsYmFja1ZhbHVlID0gbW9kYWwucXVlcnlTZWxlY3RvcignaW5wdXQnKS52YWx1ZTtcblxuICAgIGlmICghY2FsbGJhY2tWYWx1ZSkge1xuICAgICAgY2FsbGJhY2tWYWx1ZSA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIHBhcmFtcy5kb25lRnVuY3Rpb24oY2FsbGJhY2tWYWx1ZSk7XG5cbiAgaWYgKHBhcmFtcy5jbG9zZU9uQ29uZmlybSkge1xuICAgIHN3ZWV0QWxlcnQuY2xvc2UoKTtcbiAgfVxufTtcblxuLypcbiAqICBVc2VyIGNsaWNrZWQgb24gXCJDYW5jZWxcIlxuICovXG52YXIgaGFuZGxlQ2FuY2VsID0gZnVuY3Rpb24obW9kYWwsIHBhcmFtcykge1xuICAvLyBDaGVjayBpZiBjYWxsYmFjayBmdW5jdGlvbiBleHBlY3RzIGEgcGFyYW1ldGVyICh0byB0cmFjayBjYW5jZWwgYWN0aW9ucylcbiAgdmFyIGZ1bmN0aW9uQXNTdHIgPSBTdHJpbmcocGFyYW1zLmRvbmVGdW5jdGlvbikucmVwbGFjZSgvXFxzL2csICcnKTtcbiAgdmFyIGZ1bmN0aW9uSGFuZGxlc0NhbmNlbCA9IGZ1bmN0aW9uQXNTdHIuc3Vic3RyaW5nKDAsIDkpID09PSAnZnVuY3Rpb24oJyAmJiBmdW5jdGlvbkFzU3RyLnN1YnN0cmluZyg5LCAxMCkgIT09ICcpJztcblxuICBpZiAoZnVuY3Rpb25IYW5kbGVzQ2FuY2VsKSB7XG4gICAgcGFyYW1zLmRvbmVGdW5jdGlvbihmYWxzZSk7XG4gIH1cblxuICBpZiAocGFyYW1zLmNsb3NlT25DYW5jZWwpIHtcbiAgICBzd2VldEFsZXJ0LmNsb3NlKCk7XG4gIH1cbn07XG5cblxuZXhwb3J0IGRlZmF1bHQge1xuICBoYW5kbGVCdXR0b24sXG4gIGhhbmRsZUNvbmZpcm0sXG4gIGhhbmRsZUNhbmNlbFxufTsiLCJ2YXIgaGFzQ2xhc3MgPSBmdW5jdGlvbihlbGVtLCBjbGFzc05hbWUpIHtcbiAgcmV0dXJuIG5ldyBSZWdFeHAoJyAnICsgY2xhc3NOYW1lICsgJyAnKS50ZXN0KCcgJyArIGVsZW0uY2xhc3NOYW1lICsgJyAnKTtcbn07XG5cbnZhciBhZGRDbGFzcyA9IGZ1bmN0aW9uKGVsZW0sIGNsYXNzTmFtZSkge1xuICBpZiAoIWhhc0NsYXNzKGVsZW0sIGNsYXNzTmFtZSkpIHtcbiAgICBlbGVtLmNsYXNzTmFtZSArPSAnICcgKyBjbGFzc05hbWU7XG4gIH1cbn07XG5cbnZhciByZW1vdmVDbGFzcyA9IGZ1bmN0aW9uKGVsZW0sIGNsYXNzTmFtZSkge1xuICB2YXIgbmV3Q2xhc3MgPSAnICcgKyBlbGVtLmNsYXNzTmFtZS5yZXBsYWNlKC9bXFx0XFxyXFxuXS9nLCAnICcpICsgJyAnO1xuICBpZiAoaGFzQ2xhc3MoZWxlbSwgY2xhc3NOYW1lKSkge1xuICAgIHdoaWxlIChuZXdDbGFzcy5pbmRleE9mKCcgJyArIGNsYXNzTmFtZSArICcgJykgPj0gMCkge1xuICAgICAgbmV3Q2xhc3MgPSBuZXdDbGFzcy5yZXBsYWNlKCcgJyArIGNsYXNzTmFtZSArICcgJywgJyAnKTtcbiAgICB9XG4gICAgZWxlbS5jbGFzc05hbWUgPSBuZXdDbGFzcy5yZXBsYWNlKC9eXFxzK3xcXHMrJC9nLCAnJyk7XG4gIH1cbn07XG5cbnZhciBlc2NhcGVIdG1sID0gZnVuY3Rpb24oc3RyKSB7XG4gIHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTtcbiAgZGl2LmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKHN0cikpO1xuICByZXR1cm4gZGl2LmlubmVySFRNTDtcbn07XG5cbnZhciBfc2hvdyA9IGZ1bmN0aW9uKGVsZW0pIHtcbiAgZWxlbS5zdHlsZS5vcGFjaXR5ID0gJyc7XG4gIGVsZW0uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7XG59O1xuXG52YXIgc2hvdyA9IGZ1bmN0aW9uKGVsZW1zKSB7XG4gIGlmIChlbGVtcyAmJiAhZWxlbXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIF9zaG93KGVsZW1zKTtcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgX3Nob3coZWxlbXNbaV0pO1xuICB9XG59O1xuXG52YXIgX2hpZGUgPSBmdW5jdGlvbihlbGVtKSB7XG4gIGVsZW0uc3R5bGUub3BhY2l0eSA9ICcnO1xuICBlbGVtLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG59O1xuXG52YXIgaGlkZSA9IGZ1bmN0aW9uKGVsZW1zKSB7XG4gIGlmIChlbGVtcyAmJiAhZWxlbXMubGVuZ3RoKSB7XG4gICAgcmV0dXJuIF9oaWRlKGVsZW1zKTtcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGVsZW1zLmxlbmd0aDsgKytpKSB7XG4gICAgX2hpZGUoZWxlbXNbaV0pO1xuICB9XG59O1xuXG52YXIgaXNEZXNjZW5kYW50ID0gZnVuY3Rpb24ocGFyZW50LCBjaGlsZCkge1xuICB2YXIgbm9kZSA9IGNoaWxkLnBhcmVudE5vZGU7XG4gIHdoaWxlIChub2RlICE9PSBudWxsKSB7XG4gICAgaWYgKG5vZGUgPT09IHBhcmVudCkge1xuICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIG5vZGUgPSBub2RlLnBhcmVudE5vZGU7XG4gIH1cbiAgcmV0dXJuIGZhbHNlO1xufTtcblxudmFyIGdldFRvcE1hcmdpbiA9IGZ1bmN0aW9uKGVsZW0pIHtcbiAgZWxlbS5zdHlsZS5sZWZ0ID0gJy05OTk5cHgnO1xuICBlbGVtLnN0eWxlLmRpc3BsYXkgPSAnYmxvY2snO1xuXG4gIHZhciBoZWlnaHQgPSBlbGVtLmNsaWVudEhlaWdodCxcbiAgICAgIHBhZGRpbmc7XG4gIGlmICh0eXBlb2YgZ2V0Q29tcHV0ZWRTdHlsZSAhPT0gXCJ1bmRlZmluZWRcIikgeyAvLyBJRSA4XG4gICAgcGFkZGluZyA9IHBhcnNlSW50KGdldENvbXB1dGVkU3R5bGUoZWxlbSkuZ2V0UHJvcGVydHlWYWx1ZSgncGFkZGluZy10b3AnKSwgMTApO1xuICB9IGVsc2Uge1xuICAgIHBhZGRpbmcgPSBwYXJzZUludChlbGVtLmN1cnJlbnRTdHlsZS5wYWRkaW5nKTtcbiAgfVxuXG4gIGVsZW0uc3R5bGUubGVmdCA9ICcnO1xuICBlbGVtLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJldHVybiAoJy0nICsgcGFyc2VJbnQoKGhlaWdodCArIHBhZGRpbmcpIC8gMikgKyAncHgnKTtcbn07XG5cbnZhciBmYWRlSW4gPSBmdW5jdGlvbihlbGVtLCBpbnRlcnZhbCkge1xuICBpZiAoK2VsZW0uc3R5bGUub3BhY2l0eSA8IDEpIHtcbiAgICBpbnRlcnZhbCA9IGludGVydmFsIHx8IDE2O1xuICAgIGVsZW0uc3R5bGUub3BhY2l0eSA9IDA7XG4gICAgZWxlbS5zdHlsZS5kaXNwbGF5ID0gJ2Jsb2NrJztcbiAgICB2YXIgbGFzdCA9ICtuZXcgRGF0ZSgpO1xuICAgIHZhciB0aWNrID0gZnVuY3Rpb24oKSB7XG4gICAgICBlbGVtLnN0eWxlLm9wYWNpdHkgPSArZWxlbS5zdHlsZS5vcGFjaXR5ICsgKG5ldyBEYXRlKCkgLSBsYXN0KSAvIDEwMDtcbiAgICAgIGxhc3QgPSArbmV3IERhdGUoKTtcblxuICAgICAgaWYgKCtlbGVtLnN0eWxlLm9wYWNpdHkgPCAxKSB7XG4gICAgICAgIHNldFRpbWVvdXQodGljaywgaW50ZXJ2YWwpO1xuICAgICAgfVxuICAgIH07XG4gICAgdGljaygpO1xuICB9XG4gIGVsZW0uc3R5bGUuZGlzcGxheSA9ICdibG9jayc7IC8vZmFsbGJhY2sgSUU4XG59O1xuXG52YXIgZmFkZU91dCA9IGZ1bmN0aW9uKGVsZW0sIGludGVydmFsKSB7XG4gIGludGVydmFsID0gaW50ZXJ2YWwgfHwgMTY7XG4gIGVsZW0uc3R5bGUub3BhY2l0eSA9IDE7XG4gIHZhciBsYXN0ID0gK25ldyBEYXRlKCk7XG4gIHZhciB0aWNrID0gZnVuY3Rpb24oKSB7XG4gICAgZWxlbS5zdHlsZS5vcGFjaXR5ID0gK2VsZW0uc3R5bGUub3BhY2l0eSAtIChuZXcgRGF0ZSgpIC0gbGFzdCkgLyAxMDA7XG4gICAgbGFzdCA9ICtuZXcgRGF0ZSgpO1xuXG4gICAgaWYgKCtlbGVtLnN0eWxlLm9wYWNpdHkgPiAwKSB7XG4gICAgICBzZXRUaW1lb3V0KHRpY2ssIGludGVydmFsKTtcbiAgICB9IGVsc2Uge1xuICAgICAgZWxlbS5zdHlsZS5kaXNwbGF5ID0gJ25vbmUnO1xuICAgIH1cbiAgfTtcbiAgdGljaygpO1xufTtcblxudmFyIGZpcmVDbGljayA9IGZ1bmN0aW9uKG5vZGUpIHtcbiAgLy8gVGFrZW4gZnJvbSBodHRwOi8vd3d3Lm5vbm9idHJ1c2l2ZS5jb20vMjAxMS8xMS8yOS9wcm9ncmFtYXRpY2FsbHktZmlyZS1jcm9zc2Jyb3dzZXItY2xpY2stZXZlbnQtd2l0aC1qYXZhc2NyaXB0L1xuICAvLyBUaGVuIGZpeGVkIGZvciB0b2RheSdzIENocm9tZSBicm93c2VyLlxuICBpZiAodHlwZW9mIE1vdXNlRXZlbnQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAvLyBVcC10by1kYXRlIGFwcHJvYWNoXG4gICAgdmFyIG1ldnQgPSBuZXcgTW91c2VFdmVudCgnY2xpY2snLCB7XG4gICAgICB2aWV3OiB3aW5kb3csXG4gICAgICBidWJibGVzOiBmYWxzZSxcbiAgICAgIGNhbmNlbGFibGU6IHRydWVcbiAgICB9KTtcbiAgICBub2RlLmRpc3BhdGNoRXZlbnQobWV2dCk7XG4gIH0gZWxzZSBpZiAoIGRvY3VtZW50LmNyZWF0ZUV2ZW50ICkge1xuICAgIC8vIEZhbGxiYWNrXG4gICAgdmFyIGV2dCA9IGRvY3VtZW50LmNyZWF0ZUV2ZW50KCdNb3VzZUV2ZW50cycpO1xuICAgIGV2dC5pbml0RXZlbnQoJ2NsaWNrJywgZmFsc2UsIGZhbHNlKTtcbiAgICBub2RlLmRpc3BhdGNoRXZlbnQoZXZ0KTtcbiAgfSBlbHNlIGlmIChkb2N1bWVudC5jcmVhdGVFdmVudE9iamVjdCkge1xuICAgIG5vZGUuZmlyZUV2ZW50KCdvbmNsaWNrJykgO1xuICB9IGVsc2UgaWYgKHR5cGVvZiBub2RlLm9uY2xpY2sgPT09ICdmdW5jdGlvbicgKSB7XG4gICAgbm9kZS5vbmNsaWNrKCk7XG4gIH1cbn07XG5cbnZhciBzdG9wRXZlbnRQcm9wYWdhdGlvbiA9IGZ1bmN0aW9uKGUpIHtcbiAgLy8gSW4gcGFydGljdWxhciwgbWFrZSBzdXJlIHRoZSBzcGFjZSBiYXIgZG9lc24ndCBzY3JvbGwgdGhlIG1haW4gd2luZG93LlxuICBpZiAodHlwZW9mIGUuc3RvcFByb3BhZ2F0aW9uID09PSAnZnVuY3Rpb24nKSB7XG4gICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gIH0gZWxzZSBpZiAod2luZG93LmV2ZW50ICYmIHdpbmRvdy5ldmVudC5oYXNPd25Qcm9wZXJ0eSgnY2FuY2VsQnViYmxlJykpIHtcbiAgICB3aW5kb3cuZXZlbnQuY2FuY2VsQnViYmxlID0gdHJ1ZTtcbiAgfVxufTtcblxuZXhwb3J0IHsgXG4gIGhhc0NsYXNzLCBhZGRDbGFzcywgcmVtb3ZlQ2xhc3MsIFxuICBlc2NhcGVIdG1sLCBcbiAgX3Nob3csIHNob3csIF9oaWRlLCBoaWRlLCBcbiAgaXNEZXNjZW5kYW50LCBcbiAgZ2V0VG9wTWFyZ2luLFxuICBmYWRlSW4sIGZhZGVPdXQsXG4gIGZpcmVDbGljayxcbiAgc3RvcEV2ZW50UHJvcGFnYXRpb25cbn07XG4iLCJpbXBvcnQgeyBzdG9wRXZlbnRQcm9wYWdhdGlvbiwgZmlyZUNsaWNrIH0gZnJvbSAnLi9oYW5kbGUtZG9tJztcbmltcG9ydCB7IHNldEZvY3VzU3R5bGUgfSBmcm9tICcuL2hhbmRsZS1zd2FsLWRvbSc7XG5cblxudmFyIGhhbmRsZUtleURvd24gPSBmdW5jdGlvbihldmVudCwgcGFyYW1zLCBtb2RhbCkge1xuICB2YXIgZSA9IGV2ZW50IHx8IHdpbmRvdy5ldmVudDtcbiAgdmFyIGtleUNvZGUgPSBlLmtleUNvZGUgfHwgZS53aGljaDtcblxuICB2YXIgJG9rQnV0dG9uICAgICA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbi5jb25maXJtJyk7XG4gIHZhciAkY2FuY2VsQnV0dG9uID0gbW9kYWwucXVlcnlTZWxlY3RvcignYnV0dG9uLmNhbmNlbCcpO1xuICB2YXIgJG1vZGFsQnV0dG9ucyA9IG1vZGFsLnF1ZXJ5U2VsZWN0b3JBbGwoJ2J1dHRvblt0YWJpbmRleF0nKTtcblxuXG4gIGlmIChbOSwgMTMsIDMyLCAyN10uaW5kZXhPZihrZXlDb2RlKSA9PT0gLTEpIHtcbiAgICAvLyBEb24ndCBkbyB3b3JrIG9uIGtleXMgd2UgZG9uJ3QgY2FyZSBhYm91dC5cbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgJHRhcmdldEVsZW1lbnQgPSBlLnRhcmdldCB8fCBlLnNyY0VsZW1lbnQ7XG5cbiAgdmFyIGJ0bkluZGV4ID0gLTE7IC8vIEZpbmQgdGhlIGJ1dHRvbiAtIG5vdGUsIHRoaXMgaXMgYSBub2RlbGlzdCwgbm90IGFuIGFycmF5LlxuICBmb3IgKHZhciBpID0gMDsgaSA8ICRtb2RhbEJ1dHRvbnMubGVuZ3RoOyBpKyspIHtcbiAgICBpZiAoJHRhcmdldEVsZW1lbnQgPT09ICRtb2RhbEJ1dHRvbnNbaV0pIHtcbiAgICAgIGJ0bkluZGV4ID0gaTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChrZXlDb2RlID09PSA5KSB7XG4gICAgLy8gVEFCXG4gICAgaWYgKGJ0bkluZGV4ID09PSAtMSkge1xuICAgICAgLy8gTm8gYnV0dG9uIGZvY3VzZWQuIEp1bXAgdG8gdGhlIGNvbmZpcm0gYnV0dG9uLlxuICAgICAgJHRhcmdldEVsZW1lbnQgPSAkb2tCdXR0b247XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIEN5Y2xlIHRvIHRoZSBuZXh0IGJ1dHRvblxuICAgICAgaWYgKGJ0bkluZGV4ID09PSAkbW9kYWxCdXR0b25zLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgJHRhcmdldEVsZW1lbnQgPSAkbW9kYWxCdXR0b25zWzBdO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgJHRhcmdldEVsZW1lbnQgPSAkbW9kYWxCdXR0b25zW2J0bkluZGV4ICsgMV07XG4gICAgICB9XG4gICAgfVxuXG4gICAgc3RvcEV2ZW50UHJvcGFnYXRpb24oZSk7XG4gICAgJHRhcmdldEVsZW1lbnQuZm9jdXMoKTtcblxuICAgIGlmIChwYXJhbXMuY29uZmlybUJ1dHRvbkNvbG9yKSB7XG4gICAgICBzZXRGb2N1c1N0eWxlKCR0YXJnZXRFbGVtZW50LCBwYXJhbXMuY29uZmlybUJ1dHRvbkNvbG9yKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGtleUNvZGUgPT09IDEzKSB7XG4gICAgICBpZiAoJHRhcmdldEVsZW1lbnQudGFnTmFtZSA9PT0gJ0lOUFVUJykge1xuICAgICAgICAkdGFyZ2V0RWxlbWVudCA9ICRva0J1dHRvbjtcbiAgICAgICAgJG9rQnV0dG9uLmZvY3VzKCk7XG4gICAgICB9XG5cbiAgICAgIGlmIChidG5JbmRleCA9PT0gLTEpIHtcbiAgICAgICAgLy8gRU5URVIvU1BBQ0UgY2xpY2tlZCBvdXRzaWRlIG9mIGEgYnV0dG9uLlxuICAgICAgICAkdGFyZ2V0RWxlbWVudCA9ICRva0J1dHRvbjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIERvIG5vdGhpbmcgLSBsZXQgdGhlIGJyb3dzZXIgaGFuZGxlIGl0LlxuICAgICAgICAkdGFyZ2V0RWxlbWVudCA9IHVuZGVmaW5lZDtcbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGtleUNvZGUgPT09IDI3ICYmIHBhcmFtcy5hbGxvd0VzY2FwZUtleSA9PT0gdHJ1ZSkge1xuICAgICAgJHRhcmdldEVsZW1lbnQgPSAkY2FuY2VsQnV0dG9uO1xuICAgICAgZmlyZUNsaWNrKCR0YXJnZXRFbGVtZW50LCBlKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gRmFsbGJhY2sgLSBsZXQgdGhlIGJyb3dzZXIgaGFuZGxlIGl0LlxuICAgICAgJHRhcmdldEVsZW1lbnQgPSB1bmRlZmluZWQ7XG4gICAgfVxuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCBoYW5kbGVLZXlEb3duO1xuIiwiaW1wb3J0IHsgaGV4VG9SZ2IgfSBmcm9tICcuL3V0aWxzJztcbmltcG9ydCB7IHJlbW92ZUNsYXNzLCBnZXRUb3BNYXJnaW4sIGZhZGVJbiwgc2hvdywgYWRkQ2xhc3MgfSBmcm9tICcuL2hhbmRsZS1kb20nO1xuaW1wb3J0IGRlZmF1bHRQYXJhbXMgZnJvbSAnLi9kZWZhdWx0LXBhcmFtcyc7XG5cbnZhciBtb2RhbENsYXNzICAgPSAnLnN3ZWV0LWFsZXJ0JztcbnZhciBvdmVybGF5Q2xhc3MgPSAnLnN3ZWV0LW92ZXJsYXknO1xuXG4vKlxuICogQWRkIG1vZGFsICsgb3ZlcmxheSB0byBET01cbiAqL1xuaW1wb3J0IGluamVjdGVkSFRNTCBmcm9tICcuL2luamVjdGVkLWh0bWwnO1xuXG52YXIgc3dlZXRBbGVydEluaXRpYWxpemUgPSBmdW5jdGlvbigpIHtcbiAgdmFyIHN3ZWV0V3JhcCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2RpdicpO1xuICBzd2VldFdyYXAuaW5uZXJIVE1MID0gaW5qZWN0ZWRIVE1MO1xuXG4gIC8vIEFwcGVuZCBlbGVtZW50cyB0byBib2R5XG4gIHdoaWxlIChzd2VldFdyYXAuZmlyc3RDaGlsZCkge1xuICAgIGRvY3VtZW50LmJvZHkuYXBwZW5kQ2hpbGQoc3dlZXRXcmFwLmZpcnN0Q2hpbGQpO1xuICB9XG59O1xuXG4vKlxuICogR2V0IERPTSBlbGVtZW50IG9mIG1vZGFsXG4gKi9cbnZhciBnZXRNb2RhbCA9IGZ1bmN0aW9uKCkge1xuICB2YXIgJG1vZGFsID0gZG9jdW1lbnQucXVlcnlTZWxlY3Rvcihtb2RhbENsYXNzKTtcblxuICBpZiAoISRtb2RhbCkge1xuICAgIHN3ZWV0QWxlcnRJbml0aWFsaXplKCk7XG4gICAgJG1vZGFsID0gZ2V0TW9kYWwoKTtcbiAgfVxuXG4gIHJldHVybiAkbW9kYWw7XG59O1xuXG4vKlxuICogR2V0IERPTSBlbGVtZW50IG9mIGlucHV0IChpbiBtb2RhbClcbiAqL1xudmFyIGdldElucHV0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciAkbW9kYWwgPSBnZXRNb2RhbCgpO1xuICBpZiAoJG1vZGFsKSB7XG4gICAgcmV0dXJuICRtb2RhbC5xdWVyeVNlbGVjdG9yKCdpbnB1dCcpO1xuICB9XG59O1xuXG4vKlxuICogR2V0IERPTSBlbGVtZW50IG9mIG92ZXJsYXlcbiAqL1xudmFyIGdldE92ZXJsYXkgPSBmdW5jdGlvbigpIHtcbiAgcmV0dXJuIGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3Iob3ZlcmxheUNsYXNzKTtcbn07XG5cbi8qXG4gKiBBZGQgYm94LXNoYWRvdyBzdHlsZSB0byBidXR0b24gKGRlcGVuZGluZyBvbiBpdHMgY2hvc2VuIGJnLWNvbG9yKVxuICovXG52YXIgc2V0Rm9jdXNTdHlsZSA9IGZ1bmN0aW9uKCRidXR0b24sIGJnQ29sb3IpIHtcbiAgdmFyIHJnYkNvbG9yID0gaGV4VG9SZ2IoYmdDb2xvcik7XG4gICRidXR0b24uc3R5bGUuYm94U2hhZG93ID0gJzAgMCAycHggcmdiYSgnICsgcmdiQ29sb3IgKyAnLCAwLjgpLCBpbnNldCAwIDAgMCAxcHggcmdiYSgwLCAwLCAwLCAwLjA1KSc7XG59O1xuXG4vKlxuICogQW5pbWF0aW9uIHdoZW4gb3BlbmluZyBtb2RhbFxuICovXG52YXIgb3Blbk1vZGFsID0gZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgdmFyICRtb2RhbCA9IGdldE1vZGFsKCk7XG4gIGZhZGVJbihnZXRPdmVybGF5KCksIDEwKTtcbiAgc2hvdygkbW9kYWwpO1xuICBhZGRDbGFzcygkbW9kYWwsICdzaG93U3dlZXRBbGVydCcpO1xuICByZW1vdmVDbGFzcygkbW9kYWwsICdoaWRlU3dlZXRBbGVydCcpO1xuXG4gIHdpbmRvdy5wcmV2aW91c0FjdGl2ZUVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICB2YXIgJG9rQnV0dG9uID0gJG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJ2J1dHRvbi5jb25maXJtJyk7XG4gICRva0J1dHRvbi5mb2N1cygpO1xuXG4gIHNldFRpbWVvdXQoZnVuY3Rpb24gKCkge1xuICAgIGFkZENsYXNzKCRtb2RhbCwgJ3Zpc2libGUnKTtcbiAgfSwgNTAwKTtcblxuICB2YXIgdGltZXIgPSAkbW9kYWwuZ2V0QXR0cmlidXRlKCdkYXRhLXRpbWVyJyk7XG5cbiAgaWYgKHRpbWVyICE9PSAnbnVsbCcgJiYgdGltZXIgIT09ICcnKSB7XG4gICAgdmFyIHRpbWVyQ2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAkbW9kYWwudGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICB2YXIgZG9uZUZ1bmN0aW9uRXhpc3RzID0gKCh0aW1lckNhbGxiYWNrIHx8IG51bGwpICYmICRtb2RhbC5nZXRBdHRyaWJ1dGUoJ2RhdGEtaGFzLWRvbmUtZnVuY3Rpb24nKSA9PT0gJ3RydWUnKTtcbiAgICAgIGlmIChkb25lRnVuY3Rpb25FeGlzdHMpIHsgXG4gICAgICAgIHRpbWVyQ2FsbGJhY2sobnVsbCk7XG4gICAgICB9XG4gICAgICBlbHNlIHtcbiAgICAgICAgc3dlZXRBbGVydC5jbG9zZSgpO1xuICAgICAgfVxuICAgIH0sIHRpbWVyKTtcbiAgfVxufTtcblxuLypcbiAqIFJlc2V0IHRoZSBzdHlsaW5nIG9mIHRoZSBpbnB1dFxuICogKGZvciBleGFtcGxlIGlmIGVycm9ycyBoYXZlIGJlZW4gc2hvd24pXG4gKi9cbnZhciByZXNldElucHV0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciAkbW9kYWwgPSBnZXRNb2RhbCgpO1xuICB2YXIgJGlucHV0ID0gZ2V0SW5wdXQoKTtcblxuICByZW1vdmVDbGFzcygkbW9kYWwsICdzaG93LWlucHV0Jyk7XG4gICRpbnB1dC52YWx1ZSA9IGRlZmF1bHRQYXJhbXMuaW5wdXRWYWx1ZTtcbiAgJGlucHV0LnNldEF0dHJpYnV0ZSgndHlwZScsIGRlZmF1bHRQYXJhbXMuaW5wdXRUeXBlKTtcbiAgJGlucHV0LnNldEF0dHJpYnV0ZSgncGxhY2Vob2xkZXInLCBkZWZhdWx0UGFyYW1zLmlucHV0UGxhY2Vob2xkZXIpO1xuXG4gIHJlc2V0SW5wdXRFcnJvcigpO1xufTtcblxuXG52YXIgcmVzZXRJbnB1dEVycm9yID0gZnVuY3Rpb24oZXZlbnQpIHtcbiAgLy8gSWYgcHJlc3MgZW50ZXIgPT4gaWdub3JlXG4gIGlmIChldmVudCAmJiBldmVudC5rZXlDb2RlID09PSAxMykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHZhciAkbW9kYWwgPSBnZXRNb2RhbCgpO1xuXG4gIHZhciAkZXJyb3JJY29uID0gJG1vZGFsLnF1ZXJ5U2VsZWN0b3IoJy5zYS1pbnB1dC1lcnJvcicpO1xuICByZW1vdmVDbGFzcygkZXJyb3JJY29uLCAnc2hvdycpO1xuXG4gIHZhciAkZXJyb3JDb250YWluZXIgPSAkbW9kYWwucXVlcnlTZWxlY3RvcignLnNhLWVycm9yLWNvbnRhaW5lcicpO1xuICByZW1vdmVDbGFzcygkZXJyb3JDb250YWluZXIsICdzaG93Jyk7XG59O1xuXG5cbi8qXG4gKiBTZXQgXCJtYXJnaW4tdG9wXCItcHJvcGVydHkgb24gbW9kYWwgYmFzZWQgb24gaXRzIGNvbXB1dGVkIGhlaWdodFxuICovXG52YXIgZml4VmVydGljYWxQb3NpdGlvbiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgJG1vZGFsID0gZ2V0TW9kYWwoKTtcbiAgJG1vZGFsLnN0eWxlLm1hcmdpblRvcCA9IGdldFRvcE1hcmdpbihnZXRNb2RhbCgpKTtcbn07XG5cblxuZXhwb3J0IHsgXG4gIHN3ZWV0QWxlcnRJbml0aWFsaXplLFxuICBnZXRNb2RhbCxcbiAgZ2V0T3ZlcmxheSxcbiAgZ2V0SW5wdXQsXG4gIHNldEZvY3VzU3R5bGUsXG4gIG9wZW5Nb2RhbCxcbiAgcmVzZXRJbnB1dCxcbiAgcmVzZXRJbnB1dEVycm9yLFxuICBmaXhWZXJ0aWNhbFBvc2l0aW9uXG59O1xuIiwidmFyIGluamVjdGVkSFRNTCA9IFxuXG4gIC8vIERhcmsgb3ZlcmxheVxuICBgPGRpdiBjbGFzcz1cInN3ZWV0LW92ZXJsYXlcIiB0YWJJbmRleD1cIi0xXCI+PC9kaXY+YCArXG5cbiAgLy8gTW9kYWxcbiAgYDxkaXYgY2xhc3M9XCJzd2VldC1hbGVydFwiPmAgK1xuXG4gICAgLy8gRXJyb3IgaWNvblxuICAgIGA8ZGl2IGNsYXNzPVwic2EtaWNvbiBzYS1lcnJvclwiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJzYS14LW1hcmtcIj5cbiAgICAgICAgPHNwYW4gY2xhc3M9XCJzYS1saW5lIHNhLWxlZnRcIj48L3NwYW4+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwic2EtbGluZSBzYS1yaWdodFwiPjwvc3Bhbj5cbiAgICAgIDwvc3Bhbj5cbiAgICA8L2Rpdj5gICtcblxuICAgIC8vIFdhcm5pbmcgaWNvblxuICAgIGA8ZGl2IGNsYXNzPVwic2EtaWNvbiBzYS13YXJuaW5nXCI+XG4gICAgICA8c3BhbiBjbGFzcz1cInNhLWJvZHlcIj48L3NwYW4+XG4gICAgICA8c3BhbiBjbGFzcz1cInNhLWRvdFwiPjwvc3Bhbj5cbiAgICA8L2Rpdj5gICtcblxuICAgIC8vIEluZm8gaWNvblxuICAgIGA8ZGl2IGNsYXNzPVwic2EtaWNvbiBzYS1pbmZvXCI+PC9kaXY+YCArXG5cbiAgICAvLyBTdWNjZXNzIGljb25cbiAgICBgPGRpdiBjbGFzcz1cInNhLWljb24gc2Etc3VjY2Vzc1wiPlxuICAgICAgPHNwYW4gY2xhc3M9XCJzYS1saW5lIHNhLXRpcFwiPjwvc3Bhbj5cbiAgICAgIDxzcGFuIGNsYXNzPVwic2EtbGluZSBzYS1sb25nXCI+PC9zcGFuPlxuXG4gICAgICA8ZGl2IGNsYXNzPVwic2EtcGxhY2Vob2xkZXJcIj48L2Rpdj5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYS1maXhcIj48L2Rpdj5cbiAgICA8L2Rpdj5gICtcblxuICAgIGA8ZGl2IGNsYXNzPVwic2EtaWNvbiBzYS1jdXN0b21cIj48L2Rpdj5gICtcblxuICAgIC8vIFRpdGxlLCB0ZXh0IGFuZCBpbnB1dFxuICAgIGA8aDI+VGl0bGU8L2gyPlxuICAgIDxwPlRleHQ8L3A+XG4gICAgPGZpZWxkc2V0PlxuICAgICAgPGlucHV0IHR5cGU9XCJ0ZXh0XCIgdGFiSW5kZXg9XCIzXCIgLz5cbiAgICAgIDxkaXYgY2xhc3M9XCJzYS1pbnB1dC1lcnJvclwiPjwvZGl2PlxuICAgIDwvZmllbGRzZXQ+YCArXG5cbiAgICAvLyBJbnB1dCBlcnJvcnNcbiAgICBgPGRpdiBjbGFzcz1cInNhLWVycm9yLWNvbnRhaW5lclwiPlxuICAgICAgPGRpdiBjbGFzcz1cImljb25cIj4hPC9kaXY+XG4gICAgICA8cD5Ob3QgdmFsaWQhPC9wPlxuICAgIDwvZGl2PmAgK1xuXG4gICAgLy8gQ2FuY2VsIGFuZCBjb25maXJtIGJ1dHRvbnNcbiAgICBgPGRpdiBjbGFzcz1cInNhLWJ1dHRvbi1jb250YWluZXJcIj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJjYW5jZWxcIiB0YWJJbmRleD1cIjJcIj5DYW5jZWw8L2J1dHRvbj5cbiAgICAgIDxidXR0b24gY2xhc3M9XCJjb25maXJtXCIgdGFiSW5kZXg9XCIxXCI+T0s8L2J1dHRvbj5cbiAgICA8L2Rpdj5gICtcblxuICAvLyBFbmQgb2YgbW9kYWxcbiAgYDwvZGl2PmA7XG5cbmV4cG9ydCBkZWZhdWx0IGluamVjdGVkSFRNTDsiLCJ2YXIgYWxlcnRUeXBlcyA9IFsnZXJyb3InLCAnd2FybmluZycsICdpbmZvJywgJ3N1Y2Nlc3MnLCAnaW5wdXQnLCAncHJvbXB0J107XG5cbmltcG9ydCB7XG4gIGlzSUU4XG59IGZyb20gJy4vdXRpbHMnO1xuXG5pbXBvcnQge1xuICBnZXRNb2RhbCxcbiAgZ2V0SW5wdXQsXG4gIHNldEZvY3VzU3R5bGVcbn0gZnJvbSAnLi9oYW5kbGUtc3dhbC1kb20nO1xuXG5pbXBvcnQge1xuICBoYXNDbGFzcywgYWRkQ2xhc3MsIHJlbW92ZUNsYXNzLCBcbiAgZXNjYXBlSHRtbCwgXG4gIF9zaG93LCBzaG93LCBfaGlkZSwgaGlkZVxufSBmcm9tICcuL2hhbmRsZS1kb20nO1xuXG5cbi8qXG4gKiBTZXQgdHlwZSwgdGV4dCBhbmQgYWN0aW9ucyBvbiBtb2RhbFxuICovXG52YXIgc2V0UGFyYW1ldGVycyA9IGZ1bmN0aW9uKHBhcmFtcykge1xuICB2YXIgbW9kYWwgPSBnZXRNb2RhbCgpO1xuXG4gIHZhciAkdGl0bGUgPSBtb2RhbC5xdWVyeVNlbGVjdG9yKCdoMicpO1xuICB2YXIgJHRleHQgPSBtb2RhbC5xdWVyeVNlbGVjdG9yKCdwJyk7XG4gIHZhciAkY2FuY2VsQnRuID0gbW9kYWwucXVlcnlTZWxlY3RvcignYnV0dG9uLmNhbmNlbCcpO1xuICB2YXIgJGNvbmZpcm1CdG4gPSBtb2RhbC5xdWVyeVNlbGVjdG9yKCdidXR0b24uY29uZmlybScpO1xuXG4gIC8qXG4gICAqIFRpdGxlXG4gICAqL1xuICAkdGl0bGUuaW5uZXJIVE1MID0gcGFyYW1zLmh0bWwgPyBwYXJhbXMudGl0bGUgOiBlc2NhcGVIdG1sKHBhcmFtcy50aXRsZSkuc3BsaXQoJ1xcbicpLmpvaW4oJzxicj4nKTtcblxuICAvKlxuICAgKiBUZXh0XG4gICAqL1xuICAkdGV4dC5pbm5lckhUTUwgPSBwYXJhbXMuaHRtbCA/IHBhcmFtcy50ZXh0IDogZXNjYXBlSHRtbChwYXJhbXMudGV4dCB8fCAnJykuc3BsaXQoJ1xcbicpLmpvaW4oJzxicj4nKTtcbiAgaWYgKHBhcmFtcy50ZXh0KSBzaG93KCR0ZXh0KTtcblxuICAvKlxuICAgKiBDdXN0b20gY2xhc3NcbiAgICovXG4gIGlmIChwYXJhbXMuY3VzdG9tQ2xhc3MpIHtcbiAgICBhZGRDbGFzcyhtb2RhbCwgcGFyYW1zLmN1c3RvbUNsYXNzKTtcbiAgICBtb2RhbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtY3VzdG9tLWNsYXNzJywgcGFyYW1zLmN1c3RvbUNsYXNzKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBGaW5kIHByZXZpb3VzbHkgc2V0IGNsYXNzZXMgYW5kIHJlbW92ZSB0aGVtXG4gICAgbGV0IGN1c3RvbUNsYXNzID0gbW9kYWwuZ2V0QXR0cmlidXRlKCdkYXRhLWN1c3RvbS1jbGFzcycpO1xuICAgIHJlbW92ZUNsYXNzKG1vZGFsLCBjdXN0b21DbGFzcyk7XG4gICAgbW9kYWwuc2V0QXR0cmlidXRlKCdkYXRhLWN1c3RvbS1jbGFzcycsICcnKTtcbiAgfVxuXG4gIC8qXG4gICAqIEljb25cbiAgICovXG4gIGhpZGUobW9kYWwucXVlcnlTZWxlY3RvckFsbCgnLnNhLWljb24nKSk7XG5cbiAgaWYgKHBhcmFtcy50eXBlICYmICFpc0lFOCgpKSB7XG5cbiAgICBsZXQgdmFsaWRUeXBlID0gZmFsc2U7XG5cbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGFsZXJ0VHlwZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgIGlmIChwYXJhbXMudHlwZSA9PT0gYWxlcnRUeXBlc1tpXSkge1xuICAgICAgICB2YWxpZFR5cGUgPSB0cnVlO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXZhbGlkVHlwZSkge1xuICAgICAgbG9nU3RyKCdVbmtub3duIGFsZXJ0IHR5cGU6ICcgKyBwYXJhbXMudHlwZSk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbGV0IHR5cGVzV2l0aEljb25zID0gWydzdWNjZXNzJywgJ2Vycm9yJywgJ3dhcm5pbmcnLCAnaW5mbyddO1xuICAgIGxldCAkaWNvbjtcblxuICAgIGlmICh0eXBlc1dpdGhJY29ucy5pbmRleE9mKHBhcmFtcy50eXBlKSAhPT0gLTEpIHtcbiAgICAgICRpY29uID0gbW9kYWwucXVlcnlTZWxlY3RvcignLnNhLWljb24uJyArICdzYS0nICsgcGFyYW1zLnR5cGUpO1xuICAgICAgc2hvdygkaWNvbik7XG4gICAgfVxuXG4gICAgbGV0ICRpbnB1dCA9IGdldElucHV0KCk7XG5cbiAgICAvLyBBbmltYXRlIGljb25cbiAgICBzd2l0Y2ggKHBhcmFtcy50eXBlKSB7XG5cbiAgICAgIGNhc2UgJ3N1Y2Nlc3MnOlxuICAgICAgICBhZGRDbGFzcygkaWNvbiwgJ2FuaW1hdGUnKTtcbiAgICAgICAgYWRkQ2xhc3MoJGljb24ucXVlcnlTZWxlY3RvcignLnNhLXRpcCcpLCAnYW5pbWF0ZVN1Y2Nlc3NUaXAnKTtcbiAgICAgICAgYWRkQ2xhc3MoJGljb24ucXVlcnlTZWxlY3RvcignLnNhLWxvbmcnKSwgJ2FuaW1hdGVTdWNjZXNzTG9uZycpO1xuICAgICAgICBicmVhaztcblxuICAgICAgY2FzZSAnZXJyb3InOlxuICAgICAgICBhZGRDbGFzcygkaWNvbiwgJ2FuaW1hdGVFcnJvckljb24nKTtcbiAgICAgICAgYWRkQ2xhc3MoJGljb24ucXVlcnlTZWxlY3RvcignLnNhLXgtbWFyaycpLCAnYW5pbWF0ZVhNYXJrJyk7XG4gICAgICAgIGJyZWFrO1xuXG4gICAgICBjYXNlICd3YXJuaW5nJzpcbiAgICAgICAgYWRkQ2xhc3MoJGljb24sICdwdWxzZVdhcm5pbmcnKTtcbiAgICAgICAgYWRkQ2xhc3MoJGljb24ucXVlcnlTZWxlY3RvcignLnNhLWJvZHknKSwgJ3B1bHNlV2FybmluZ0lucycpO1xuICAgICAgICBhZGRDbGFzcygkaWNvbi5xdWVyeVNlbGVjdG9yKCcuc2EtZG90JyksICdwdWxzZVdhcm5pbmdJbnMnKTtcbiAgICAgICAgYnJlYWs7XG5cbiAgICAgIGNhc2UgJ2lucHV0JzpcbiAgICAgIGNhc2UgJ3Byb21wdCc6XG4gICAgICAgICRpbnB1dC5zZXRBdHRyaWJ1dGUoJ3R5cGUnLCBwYXJhbXMuaW5wdXRUeXBlKTtcbiAgICAgICAgJGlucHV0LnZhbHVlID0gcGFyYW1zLmlucHV0VmFsdWU7XG4gICAgICAgICRpbnB1dC5zZXRBdHRyaWJ1dGUoJ3BsYWNlaG9sZGVyJywgcGFyYW1zLmlucHV0UGxhY2Vob2xkZXIpO1xuICAgICAgICBhZGRDbGFzcyhtb2RhbCwgJ3Nob3ctaW5wdXQnKTtcbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgJGlucHV0LmZvY3VzKCk7XG4gICAgICAgICAgJGlucHV0LmFkZEV2ZW50TGlzdGVuZXIoJ2tleXVwJywgc3dhbC5yZXNldElucHV0RXJyb3IpO1xuICAgICAgICB9LCA0MDApO1xuICAgICAgICBicmVhaztcbiAgICB9XG4gIH1cblxuICAvKlxuICAgKiBDdXN0b20gaW1hZ2VcbiAgICovXG4gIGlmIChwYXJhbXMuaW1hZ2VVcmwpIHtcbiAgICBsZXQgJGN1c3RvbUljb24gPSBtb2RhbC5xdWVyeVNlbGVjdG9yKCcuc2EtaWNvbi5zYS1jdXN0b20nKTtcblxuICAgICRjdXN0b21JY29uLnN0eWxlLmJhY2tncm91bmRJbWFnZSA9ICd1cmwoJyArIHBhcmFtcy5pbWFnZVVybCArICcpJztcbiAgICBzaG93KCRjdXN0b21JY29uKTtcblxuICAgIGxldCBfaW1nV2lkdGggPSA4MDtcbiAgICBsZXQgX2ltZ0hlaWdodCA9IDgwO1xuXG4gICAgaWYgKHBhcmFtcy5pbWFnZVNpemUpIHtcbiAgICAgIGxldCBkaW1lbnNpb25zID0gcGFyYW1zLmltYWdlU2l6ZS50b1N0cmluZygpLnNwbGl0KCd4Jyk7XG4gICAgICBsZXQgaW1nV2lkdGggPSBkaW1lbnNpb25zWzBdO1xuICAgICAgbGV0IGltZ0hlaWdodCA9IGRpbWVuc2lvbnNbMV07XG5cbiAgICAgIGlmICghaW1nV2lkdGggfHwgIWltZ0hlaWdodCkge1xuICAgICAgICBsb2dTdHIoJ1BhcmFtZXRlciBpbWFnZVNpemUgZXhwZWN0cyB2YWx1ZSB3aXRoIGZvcm1hdCBXSURUSHhIRUlHSFQsIGdvdCAnICsgcGFyYW1zLmltYWdlU2l6ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBfaW1nV2lkdGggPSBpbWdXaWR0aDtcbiAgICAgICAgX2ltZ0hlaWdodCA9IGltZ0hlaWdodDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAkY3VzdG9tSWNvbi5zZXRBdHRyaWJ1dGUoJ3N0eWxlJywgJGN1c3RvbUljb24uZ2V0QXR0cmlidXRlKCdzdHlsZScpICsgJ3dpZHRoOicgKyBfaW1nV2lkdGggKyAncHg7IGhlaWdodDonICsgX2ltZ0hlaWdodCArICdweCcpO1xuICB9XG5cbiAgLypcbiAgICogU2hvdyBjYW5jZWwgYnV0dG9uP1xuICAgKi9cbiAgbW9kYWwuc2V0QXR0cmlidXRlKCdkYXRhLWhhcy1jYW5jZWwtYnV0dG9uJywgcGFyYW1zLnNob3dDYW5jZWxCdXR0b24pO1xuICBpZiAocGFyYW1zLnNob3dDYW5jZWxCdXR0b24pIHtcbiAgICAkY2FuY2VsQnRuLnN0eWxlLmRpc3BsYXkgPSAnaW5saW5lLWJsb2NrJztcbiAgfSBlbHNlIHtcbiAgICBoaWRlKCRjYW5jZWxCdG4pO1xuICB9XG5cbiAgLypcbiAgICogU2hvdyBjb25maXJtIGJ1dHRvbj9cbiAgICovXG4gIG1vZGFsLnNldEF0dHJpYnV0ZSgnZGF0YS1oYXMtY29uZmlybS1idXR0b24nLCBwYXJhbXMuc2hvd0NvbmZpcm1CdXR0b24pO1xuICBpZiAocGFyYW1zLnNob3dDb25maXJtQnV0dG9uKSB7XG4gICAgJGNvbmZpcm1CdG4uc3R5bGUuZGlzcGxheSA9ICdpbmxpbmUtYmxvY2snO1xuICB9IGVsc2Uge1xuICAgIGhpZGUoJGNvbmZpcm1CdG4pO1xuICB9XG5cbiAgLypcbiAgICogQ3VzdG9tIHRleHQgb24gY2FuY2VsL2NvbmZpcm0gYnV0dG9uc1xuICAgKi9cbiAgaWYgKHBhcmFtcy5jYW5jZWxCdXR0b25UZXh0KSB7XG4gICAgJGNhbmNlbEJ0bi5pbm5lckhUTUwgPSBlc2NhcGVIdG1sKHBhcmFtcy5jYW5jZWxCdXR0b25UZXh0KTtcbiAgfVxuICBpZiAocGFyYW1zLmNvbmZpcm1CdXR0b25UZXh0KSB7XG4gICAgJGNvbmZpcm1CdG4uaW5uZXJIVE1MID0gZXNjYXBlSHRtbChwYXJhbXMuY29uZmlybUJ1dHRvblRleHQpO1xuICB9XG5cbiAgLypcbiAgICogQ3VzdG9tIGNvbG9yIG9uIGNvbmZpcm0gYnV0dG9uXG4gICAqL1xuICBpZiAocGFyYW1zLmNvbmZpcm1CdXR0b25Db2xvcikge1xuICAgIC8vIFNldCBjb25maXJtIGJ1dHRvbiB0byBzZWxlY3RlZCBiYWNrZ3JvdW5kIGNvbG9yXG4gICAgJGNvbmZpcm1CdG4uc3R5bGUuYmFja2dyb3VuZENvbG9yID0gcGFyYW1zLmNvbmZpcm1CdXR0b25Db2xvcjtcblxuICAgIC8vIFNldCBib3gtc2hhZG93IHRvIGRlZmF1bHQgZm9jdXNlZCBidXR0b25cbiAgICBzZXRGb2N1c1N0eWxlKCRjb25maXJtQnRuLCBwYXJhbXMuY29uZmlybUJ1dHRvbkNvbG9yKTtcbiAgfVxuXG4gIC8qXG4gICAqIEFsbG93IG91dHNpZGUgY2xpY2tcbiAgICovXG4gIG1vZGFsLnNldEF0dHJpYnV0ZSgnZGF0YS1hbGxvdy1vdXRzaWRlLWNsaWNrJywgcGFyYW1zLmFsbG93T3V0c2lkZUNsaWNrKTtcblxuICAvKlxuICAgKiBDYWxsYmFjayBmdW5jdGlvblxuICAgKi9cbiAgdmFyIGhhc0RvbmVGdW5jdGlvbiA9IHBhcmFtcy5kb25lRnVuY3Rpb24gPyB0cnVlIDogZmFsc2U7XG4gIG1vZGFsLnNldEF0dHJpYnV0ZSgnZGF0YS1oYXMtZG9uZS1mdW5jdGlvbicsIGhhc0RvbmVGdW5jdGlvbik7XG5cbiAgLypcbiAgICogQW5pbWF0aW9uXG4gICAqL1xuICBpZiAoIXBhcmFtcy5hbmltYXRpb24pIHtcbiAgICBtb2RhbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtYW5pbWF0aW9uJywgJ25vbmUnKTtcbiAgfSBlbHNlIGlmICh0eXBlb2YgcGFyYW1zLmFuaW1hdGlvbiA9PT0gJ3N0cmluZycpIHtcbiAgICBtb2RhbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtYW5pbWF0aW9uJywgcGFyYW1zLmFuaW1hdGlvbik7IC8vIEN1c3RvbSBhbmltYXRpb25cbiAgfSBlbHNlIHtcbiAgICBtb2RhbC5zZXRBdHRyaWJ1dGUoJ2RhdGEtYW5pbWF0aW9uJywgJ3BvcCcpO1xuICB9XG5cbiAgLypcbiAgICogVGltZXJcbiAgICovXG4gIG1vZGFsLnNldEF0dHJpYnV0ZSgnZGF0YS10aW1lcicsIHBhcmFtcy50aW1lcik7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBzZXRQYXJhbWV0ZXJzO1xuIiwiLypcbiAqIEFsbG93IHVzZXIgdG8gcGFzcyB0aGVpciBvd24gcGFyYW1zXG4gKi9cbnZhciBleHRlbmQgPSBmdW5jdGlvbihhLCBiKSB7XG4gIGZvciAodmFyIGtleSBpbiBiKSB7XG4gICAgaWYgKGIuaGFzT3duUHJvcGVydHkoa2V5KSkge1xuICAgICAgYVtrZXldID0gYltrZXldO1xuICAgIH1cbiAgfVxuICByZXR1cm4gYTtcbn07XG5cbi8qXG4gKiBDb252ZXJ0IEhFWCBjb2RlcyB0byBSR0IgdmFsdWVzICgjMDAwMDAwIC0+IHJnYigwLDAsMCkpXG4gKi9cbnZhciBoZXhUb1JnYiA9IGZ1bmN0aW9uKGhleCkge1xuICB2YXIgcmVzdWx0ID0gL14jPyhbYS1mXFxkXXsyfSkoW2EtZlxcZF17Mn0pKFthLWZcXGRdezJ9KSQvaS5leGVjKGhleCk7XG4gIHJldHVybiByZXN1bHQgPyBwYXJzZUludChyZXN1bHRbMV0sIDE2KSArICcsICcgKyBwYXJzZUludChyZXN1bHRbMl0sIDE2KSArICcsICcgKyBwYXJzZUludChyZXN1bHRbM10sIDE2KSA6IG51bGw7XG59O1xuXG4vKlxuICogQ2hlY2sgaWYgdGhlIHVzZXIgaXMgdXNpbmcgSW50ZXJuZXQgRXhwbG9yZXIgOCAoZm9yIGZhbGxiYWNrcylcbiAqL1xudmFyIGlzSUU4ID0gZnVuY3Rpb24oKSB7XG4gIHJldHVybiAod2luZG93LmF0dGFjaEV2ZW50ICYmICF3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcik7XG59O1xuXG4vKlxuICogSUUgY29tcGF0aWJsZSBsb2dnaW5nIGZvciBkZXZlbG9wZXJzXG4gKi9cbnZhciBsb2dTdHIgPSBmdW5jdGlvbihzdHJpbmcpIHtcbiAgaWYgKHdpbmRvdy5jb25zb2xlKSB7XG4gICAgLy8gSUUuLi5cbiAgICB3aW5kb3cuY29uc29sZS5sb2coJ1N3ZWV0QWxlcnQ6ICcgKyBzdHJpbmcpO1xuICB9XG59O1xuXG4vKlxuICogU2V0IGhvdmVyLCBhY3RpdmUgYW5kIGZvY3VzLXN0YXRlcyBmb3IgYnV0dG9ucyBcbiAqIChzb3VyY2U6IGh0dHA6Ly93d3cuc2l0ZXBvaW50LmNvbS9qYXZhc2NyaXB0LWdlbmVyYXRlLWxpZ2h0ZXItZGFya2VyLWNvbG9yKVxuICovXG52YXIgY29sb3JMdW1pbmFuY2UgPSBmdW5jdGlvbihoZXgsIGx1bSkge1xuICAvLyBWYWxpZGF0ZSBoZXggc3RyaW5nXG4gIGhleCA9IFN0cmluZyhoZXgpLnJlcGxhY2UoL1teMC05YS1mXS9naSwgJycpO1xuICBpZiAoaGV4Lmxlbmd0aCA8IDYpIHtcbiAgICBoZXggPSBoZXhbMF0gKyBoZXhbMF0gKyBoZXhbMV0gKyBoZXhbMV0gKyBoZXhbMl0gKyBoZXhbMl07XG4gIH1cbiAgbHVtID0gbHVtIHx8IDA7XG5cbiAgLy8gQ29udmVydCB0byBkZWNpbWFsIGFuZCBjaGFuZ2UgbHVtaW5vc2l0eVxuICB2YXIgcmdiID0gJyMnO1xuICB2YXIgYztcbiAgdmFyIGk7XG5cbiAgZm9yIChpID0gMDsgaSA8IDM7IGkrKykge1xuICAgIGMgPSBwYXJzZUludChoZXguc3Vic3RyKGkgKiAyLCAyKSwgMTYpO1xuICAgIGMgPSBNYXRoLnJvdW5kKE1hdGgubWluKE1hdGgubWF4KDAsIGMgKyBjICogbHVtKSwgMjU1KSkudG9TdHJpbmcoMTYpO1xuICAgIHJnYiArPSAoJzAwJyArIGMpLnN1YnN0cihjLmxlbmd0aCk7XG4gIH1cblxuICByZXR1cm4gcmdiO1xufTtcblxuXG5leHBvcnQge1xuICBleHRlbmQsXG4gIGhleFRvUmdiLFxuICBpc0lFOCxcbiAgbG9nU3RyLFxuICBjb2xvckx1bWluYW5jZVxufTtcbiJdfQ== + + + /* + * Use SweetAlert with RequireJS + */ + + if (typeof define === 'function' && define.amd) { + define(function () { + return sweetAlert; + }); + } else if (typeof module !== 'undefined' && module.exports) { + module.exports = sweetAlert; + } + +})(window, document); \ No newline at end of file diff --git a/src/main/webapp/bower_components/sweetalert/sweetalert.css b/src/main/webapp/bower_components/sweetalert/sweetalert.css new file mode 100644 index 0000000..4469aea --- /dev/null +++ b/src/main/webapp/bower_components/sweetalert/sweetalert.css @@ -0,0 +1,715 @@ +body.stop-scrolling { + height: 100%; + overflow: hidden; } + +.sweet-overlay { + background-color: black; + /* IE8 */ + -ms-filter: "progid:DXImageTransform.Microsoft.Alpha(Opacity=40)"; + /* IE8 */ + background-color: rgba(0, 0, 0, 0.4); + position: fixed; + left: 0; + right: 0; + top: 0; + bottom: 0; + display: none; + z-index: 10000; } + +.sweet-alert { + background-color: white; + font-family: 'Open Sans', 'Helvetica Neue', Helvetica, Arial, sans-serif; + width: 478px; + padding: 17px; + border-radius: 5px; + text-align: center; + position: fixed; + left: 50%; + top: 50%; + margin-left: -256px; + margin-top: -200px; + overflow: hidden; + display: none; + z-index: 99999; } + @media all and (max-width: 540px) { + .sweet-alert { + width: auto; + margin-left: 0; + margin-right: 0; + left: 15px; + right: 15px; } } + .sweet-alert h2 { + color: #575757; + font-size: 30px; + text-align: center; + font-weight: 600; + text-transform: none; + position: relative; + margin: 25px 0; + padding: 0; + line-height: 40px; + display: block; } + .sweet-alert p { + color: #797979; + font-size: 16px; + text-align: center; + font-weight: 300; + position: relative; + text-align: inherit; + float: none; + margin: 0; + padding: 0; + line-height: normal; } + .sweet-alert fieldset { + border: none; + position: relative; } + .sweet-alert .sa-error-container { + background-color: #f1f1f1; + margin-left: -17px; + margin-right: -17px; + overflow: hidden; + padding: 0 10px; + max-height: 0; + webkit-transition: padding 0.15s, max-height 0.15s; + transition: padding 0.15s, max-height 0.15s; } + .sweet-alert .sa-error-container.show { + padding: 10px 0; + max-height: 100px; + webkit-transition: padding 0.2s, max-height 0.2s; + transition: padding 0.25s, max-height 0.25s; } + .sweet-alert .sa-error-container .icon { + display: inline-block; + width: 24px; + height: 24px; + border-radius: 50%; + background-color: #ea7d7d; + color: white; + line-height: 24px; + text-align: center; + margin-right: 3px; } + .sweet-alert .sa-error-container p { + display: inline-block; } + .sweet-alert .sa-input-error { + position: absolute; + top: 29px; + right: 26px; + width: 20px; + height: 20px; + opacity: 0; + -webkit-transform: scale(0.5); + transform: scale(0.5); + -webkit-transform-origin: 50% 50%; + transform-origin: 50% 50%; + -webkit-transition: all 0.1s; + transition: all 0.1s; } + .sweet-alert .sa-input-error::before, .sweet-alert .sa-input-error::after { + content: ""; + width: 20px; + height: 6px; + background-color: #f06e57; + border-radius: 3px; + position: absolute; + top: 50%; + margin-top: -4px; + left: 50%; + margin-left: -9px; } + .sweet-alert .sa-input-error::before { + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); } + .sweet-alert .sa-input-error::after { + -webkit-transform: rotate(45deg); + transform: rotate(45deg); } + .sweet-alert .sa-input-error.show { + opacity: 1; + -webkit-transform: scale(1); + transform: scale(1); } + .sweet-alert input { + width: 100%; + box-sizing: border-box; + border-radius: 3px; + border: 1px solid #d7d7d7; + height: 43px; + margin-top: 10px; + margin-bottom: 17px; + font-size: 18px; + box-shadow: inset 0px 1px 1px rgba(0, 0, 0, 0.06); + padding: 0 12px; + display: none; + -webkit-transition: all 0.3s; + transition: all 0.3s; } + .sweet-alert input:focus { + outline: none; + box-shadow: 0px 0px 3px #c4e6f5; + border: 1px solid #b4dbed; } + .sweet-alert input:focus::-moz-placeholder { + transition: opacity 0.3s 0.03s ease; + opacity: 0.5; } + .sweet-alert input:focus:-ms-input-placeholder { + transition: opacity 0.3s 0.03s ease; + opacity: 0.5; } + .sweet-alert input:focus::-webkit-input-placeholder { + transition: opacity 0.3s 0.03s ease; + opacity: 0.5; } + .sweet-alert input::-moz-placeholder { + color: #bdbdbd; } + .sweet-alert input:-ms-input-placeholder { + color: #bdbdbd; } + .sweet-alert input::-webkit-input-placeholder { + color: #bdbdbd; } + .sweet-alert.show-input input { + display: block; } + .sweet-alert button { + background-color: #AEDEF4; + color: white; + border: none; + box-shadow: none; + font-size: 17px; + font-weight: 500; + -webkit-border-radius: 4px; + border-radius: 5px; + padding: 10px 32px; + margin: 26px 5px 0 5px; + cursor: pointer; } + .sweet-alert button:focus { + outline: none; + box-shadow: 0 0 2px rgba(128, 179, 235, 0.5), inset 0 0 0 1px rgba(0, 0, 0, 0.05); } + .sweet-alert button:hover { + background-color: #a1d9f2; } + .sweet-alert button:active { + background-color: #81ccee; } + .sweet-alert button.cancel { + background-color: #D0D0D0; } + .sweet-alert button.cancel:hover { + background-color: #c8c8c8; } + .sweet-alert button.cancel:active { + background-color: #b6b6b6; } + .sweet-alert button.cancel:focus { + box-shadow: rgba(197, 205, 211, 0.8) 0px 0px 2px, rgba(0, 0, 0, 0.0470588) 0px 0px 0px 1px inset !important; } + .sweet-alert button::-moz-focus-inner { + border: 0; } + .sweet-alert[data-has-cancel-button=false] button { + box-shadow: none !important; } + .sweet-alert[data-has-confirm-button=false][data-has-cancel-button=false] { + padding-bottom: 40px; } + .sweet-alert .sa-icon { + width: 80px; + height: 80px; + border: 4px solid gray; + -webkit-border-radius: 40px; + border-radius: 40px; + border-radius: 50%; + margin: 20px auto; + padding: 0; + position: relative; + box-sizing: content-box; } + .sweet-alert .sa-icon.sa-error { + border-color: #F27474; } + .sweet-alert .sa-icon.sa-error .sa-x-mark { + position: relative; + display: block; } + .sweet-alert .sa-icon.sa-error .sa-line { + position: absolute; + height: 5px; + width: 47px; + background-color: #F27474; + display: block; + top: 37px; + border-radius: 2px; } + .sweet-alert .sa-icon.sa-error .sa-line.sa-left { + -webkit-transform: rotate(45deg); + transform: rotate(45deg); + left: 17px; } + .sweet-alert .sa-icon.sa-error .sa-line.sa-right { + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + right: 16px; } + .sweet-alert .sa-icon.sa-warning { + border-color: #F8BB86; } + .sweet-alert .sa-icon.sa-warning .sa-body { + position: absolute; + width: 5px; + height: 47px; + left: 50%; + top: 10px; + -webkit-border-radius: 2px; + border-radius: 2px; + margin-left: -2px; + background-color: #F8BB86; } + .sweet-alert .sa-icon.sa-warning .sa-dot { + position: absolute; + width: 7px; + height: 7px; + -webkit-border-radius: 50%; + border-radius: 50%; + margin-left: -3px; + left: 50%; + bottom: 10px; + background-color: #F8BB86; } + .sweet-alert .sa-icon.sa-info { + border-color: #C9DAE1; } + .sweet-alert .sa-icon.sa-info::before { + content: ""; + position: absolute; + width: 5px; + height: 29px; + left: 50%; + bottom: 17px; + border-radius: 2px; + margin-left: -2px; + background-color: #C9DAE1; } + .sweet-alert .sa-icon.sa-info::after { + content: ""; + position: absolute; + width: 7px; + height: 7px; + border-radius: 50%; + margin-left: -3px; + top: 19px; + background-color: #C9DAE1; } + .sweet-alert .sa-icon.sa-success { + border-color: #A5DC86; } + .sweet-alert .sa-icon.sa-success::before, .sweet-alert .sa-icon.sa-success::after { + content: ''; + -webkit-border-radius: 40px; + border-radius: 40px; + border-radius: 50%; + position: absolute; + width: 60px; + height: 120px; + background: white; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); } + .sweet-alert .sa-icon.sa-success::before { + -webkit-border-radius: 120px 0 0 120px; + border-radius: 120px 0 0 120px; + top: -7px; + left: -33px; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + -webkit-transform-origin: 60px 60px; + transform-origin: 60px 60px; } + .sweet-alert .sa-icon.sa-success::after { + -webkit-border-radius: 0 120px 120px 0; + border-radius: 0 120px 120px 0; + top: -11px; + left: 30px; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); + -webkit-transform-origin: 0px 60px; + transform-origin: 0px 60px; } + .sweet-alert .sa-icon.sa-success .sa-placeholder { + width: 80px; + height: 80px; + border: 4px solid rgba(165, 220, 134, 0.2); + -webkit-border-radius: 40px; + border-radius: 40px; + border-radius: 50%; + box-sizing: content-box; + position: absolute; + left: -4px; + top: -4px; + z-index: 2; } + .sweet-alert .sa-icon.sa-success .sa-fix { + width: 5px; + height: 90px; + background-color: white; + position: absolute; + left: 28px; + top: 8px; + z-index: 1; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); } + .sweet-alert .sa-icon.sa-success .sa-line { + height: 5px; + background-color: #A5DC86; + display: block; + border-radius: 2px; + position: absolute; + z-index: 2; } + .sweet-alert .sa-icon.sa-success .sa-line.sa-tip { + width: 25px; + left: 14px; + top: 46px; + -webkit-transform: rotate(45deg); + transform: rotate(45deg); } + .sweet-alert .sa-icon.sa-success .sa-line.sa-long { + width: 47px; + right: 8px; + top: 38px; + -webkit-transform: rotate(-45deg); + transform: rotate(-45deg); } + .sweet-alert .sa-icon.sa-custom { + background-size: contain; + border-radius: 0; + border: none; + background-position: center center; + background-repeat: no-repeat; } + +/* + * Animations + */ +@-webkit-keyframes showSweetAlert { + 0% { + transform: scale(0.7); + -webkit-transform: scale(0.7); } + 45% { + transform: scale(1.05); + -webkit-transform: scale(1.05); } + 80% { + transform: scale(0.95); + -webkit-transform: scale(0.95); } + 100% { + transform: scale(1); + -webkit-transform: scale(1); } } + +@keyframes showSweetAlert { + 0% { + transform: scale(0.7); + -webkit-transform: scale(0.7); } + 45% { + transform: scale(1.05); + -webkit-transform: scale(1.05); } + 80% { + transform: scale(0.95); + -webkit-transform: scale(0.95); } + 100% { + transform: scale(1); + -webkit-transform: scale(1); } } + +@-webkit-keyframes hideSweetAlert { + 0% { + transform: scale(1); + -webkit-transform: scale(1); } + 100% { + transform: scale(0.5); + -webkit-transform: scale(0.5); } } + +@keyframes hideSweetAlert { + 0% { + transform: scale(1); + -webkit-transform: scale(1); } + 100% { + transform: scale(0.5); + -webkit-transform: scale(0.5); } } + +@-webkit-keyframes slideFromTop { + 0% { + top: 0%; } + 100% { + top: 50%; } } + +@keyframes slideFromTop { + 0% { + top: 0%; } + 100% { + top: 50%; } } + +@-webkit-keyframes slideToTop { + 0% { + top: 50%; } + 100% { + top: 0%; } } + +@keyframes slideToTop { + 0% { + top: 50%; } + 100% { + top: 0%; } } + +@-webkit-keyframes slideFromBottom { + 0% { + top: 70%; } + 100% { + top: 50%; } } + +@keyframes slideFromBottom { + 0% { + top: 70%; } + 100% { + top: 50%; } } + +@-webkit-keyframes slideToBottom { + 0% { + top: 50%; } + 100% { + top: 70%; } } + +@keyframes slideToBottom { + 0% { + top: 50%; } + 100% { + top: 70%; } } + +.showSweetAlert[data-animation=pop] { + -webkit-animation: showSweetAlert 0.3s; + animation: showSweetAlert 0.3s; } + +.showSweetAlert[data-animation=none] { + -webkit-animation: none; + animation: none; } + +.showSweetAlert[data-animation=slide-from-top] { + -webkit-animation: slideFromTop 0.3s; + animation: slideFromTop 0.3s; } + +.showSweetAlert[data-animation=slide-from-bottom] { + -webkit-animation: slideFromBottom 0.3s; + animation: slideFromBottom 0.3s; } + +.hideSweetAlert[data-animation=pop] { + -webkit-animation: hideSweetAlert 0.2s; + animation: hideSweetAlert 0.2s; } + +.hideSweetAlert[data-animation=none] { + -webkit-animation: none; + animation: none; } + +.hideSweetAlert[data-animation=slide-from-top] { + -webkit-animation: slideToTop 0.4s; + animation: slideToTop 0.4s; } + +.hideSweetAlert[data-animation=slide-from-bottom] { + -webkit-animation: slideToBottom 0.3s; + animation: slideToBottom 0.3s; } + +@-webkit-keyframes animateSuccessTip { + 0% { + width: 0; + left: 1px; + top: 19px; } + 54% { + width: 0; + left: 1px; + top: 19px; } + 70% { + width: 50px; + left: -8px; + top: 37px; } + 84% { + width: 17px; + left: 21px; + top: 48px; } + 100% { + width: 25px; + left: 14px; + top: 45px; } } + +@keyframes animateSuccessTip { + 0% { + width: 0; + left: 1px; + top: 19px; } + 54% { + width: 0; + left: 1px; + top: 19px; } + 70% { + width: 50px; + left: -8px; + top: 37px; } + 84% { + width: 17px; + left: 21px; + top: 48px; } + 100% { + width: 25px; + left: 14px; + top: 45px; } } + +@-webkit-keyframes animateSuccessLong { + 0% { + width: 0; + right: 46px; + top: 54px; } + 65% { + width: 0; + right: 46px; + top: 54px; } + 84% { + width: 55px; + right: 0px; + top: 35px; } + 100% { + width: 47px; + right: 8px; + top: 38px; } } + +@keyframes animateSuccessLong { + 0% { + width: 0; + right: 46px; + top: 54px; } + 65% { + width: 0; + right: 46px; + top: 54px; } + 84% { + width: 55px; + right: 0px; + top: 35px; } + 100% { + width: 47px; + right: 8px; + top: 38px; } } + +@-webkit-keyframes rotatePlaceholder { + 0% { + transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); } + 5% { + transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); } + 12% { + transform: rotate(-405deg); + -webkit-transform: rotate(-405deg); } + 100% { + transform: rotate(-405deg); + -webkit-transform: rotate(-405deg); } } + +@keyframes rotatePlaceholder { + 0% { + transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); } + 5% { + transform: rotate(-45deg); + -webkit-transform: rotate(-45deg); } + 12% { + transform: rotate(-405deg); + -webkit-transform: rotate(-405deg); } + 100% { + transform: rotate(-405deg); + -webkit-transform: rotate(-405deg); } } + +.animateSuccessTip { + -webkit-animation: animateSuccessTip 0.75s; + animation: animateSuccessTip 0.75s; } + +.animateSuccessLong { + -webkit-animation: animateSuccessLong 0.75s; + animation: animateSuccessLong 0.75s; } + +.sa-icon.sa-success.animate::after { + -webkit-animation: rotatePlaceholder 4.25s ease-in; + animation: rotatePlaceholder 4.25s ease-in; } + +@-webkit-keyframes animateErrorIcon { + 0% { + transform: rotateX(100deg); + -webkit-transform: rotateX(100deg); + opacity: 0; } + 100% { + transform: rotateX(0deg); + -webkit-transform: rotateX(0deg); + opacity: 1; } } + +@keyframes animateErrorIcon { + 0% { + transform: rotateX(100deg); + -webkit-transform: rotateX(100deg); + opacity: 0; } + 100% { + transform: rotateX(0deg); + -webkit-transform: rotateX(0deg); + opacity: 1; } } + +.animateErrorIcon { + -webkit-animation: animateErrorIcon 0.5s; + animation: animateErrorIcon 0.5s; } + +@-webkit-keyframes animateXMark { + 0% { + transform: scale(0.4); + -webkit-transform: scale(0.4); + margin-top: 26px; + opacity: 0; } + 50% { + transform: scale(0.4); + -webkit-transform: scale(0.4); + margin-top: 26px; + opacity: 0; } + 80% { + transform: scale(1.15); + -webkit-transform: scale(1.15); + margin-top: -6px; } + 100% { + transform: scale(1); + -webkit-transform: scale(1); + margin-top: 0; + opacity: 1; } } + +@keyframes animateXMark { + 0% { + transform: scale(0.4); + -webkit-transform: scale(0.4); + margin-top: 26px; + opacity: 0; } + 50% { + transform: scale(0.4); + -webkit-transform: scale(0.4); + margin-top: 26px; + opacity: 0; } + 80% { + transform: scale(1.15); + -webkit-transform: scale(1.15); + margin-top: -6px; } + 100% { + transform: scale(1); + -webkit-transform: scale(1); + margin-top: 0; + opacity: 1; } } + +.animateXMark { + -webkit-animation: animateXMark 0.5s; + animation: animateXMark 0.5s; } + +@-webkit-keyframes pulseWarning { + 0% { + border-color: #F8D486; } + 100% { + border-color: #F8BB86; } } + +@keyframes pulseWarning { + 0% { + border-color: #F8D486; } + 100% { + border-color: #F8BB86; } } + +.pulseWarning { + -webkit-animation: pulseWarning 0.75s infinite alternate; + animation: pulseWarning 0.75s infinite alternate; } + +@-webkit-keyframes pulseWarningIns { + 0% { + background-color: #F8D486; } + 100% { + background-color: #F8BB86; } } + +@keyframes pulseWarningIns { + 0% { + background-color: #F8D486; } + 100% { + background-color: #F8BB86; } } + +.pulseWarningIns { + -webkit-animation: pulseWarningIns 0.75s infinite alternate; + animation: pulseWarningIns 0.75s infinite alternate; } + +/* Internet Explorer 9 has some special quirks that are fixed here */ +/* The icons are not animated. */ +/* This file is automatically merged into sweet-alert.min.js through Gulp */ +/* Error icon */ +.sweet-alert .sa-icon.sa-error .sa-line.sa-left { + -ms-transform: rotate(45deg) \9; } + +.sweet-alert .sa-icon.sa-error .sa-line.sa-right { + -ms-transform: rotate(-45deg) \9; } + +/* Success icon */ +.sweet-alert .sa-icon.sa-success { + border-color: transparent\9; } + +.sweet-alert .sa-icon.sa-success .sa-line.sa-tip { + -ms-transform: rotate(45deg) \9; } + +.sweet-alert .sa-icon.sa-success .sa-line.sa-long { + -ms-transform: rotate(-45deg) \9; } diff --git a/src/main/webapp/bower_components/sweetalert/sweetalert.min.js b/src/main/webapp/bower_components/sweetalert/sweetalert.min.js new file mode 100644 index 0000000..3e4e7ff --- /dev/null +++ b/src/main/webapp/bower_components/sweetalert/sweetalert.min.js @@ -0,0 +1 @@ +!function(e,t,n){"use strict";!function o(e,t,n){function a(s,l){if(!t[s]){if(!e[s]){var i="function"==typeof require&&require;if(!l&&i)return i(s,!0);if(r)return r(s,!0);var u=new Error("Cannot find module '"+s+"'");throw u.code="MODULE_NOT_FOUND",u}var c=t[s]={exports:{}};e[s][0].call(c.exports,function(t){var n=e[s][1][t];return a(n?n:t)},c,c.exports,o,e,t,n)}return t[s].exports}for(var r="function"==typeof require&&require,s=0;s=0;)n=n.replace(" "+t+" "," ");e.className=n.replace(/^\s+|\s+$/g,"")}},i=function(e){var n=t.createElement("div");return n.appendChild(t.createTextNode(e)),n.innerHTML},u=function(e){e.style.opacity="",e.style.display="block"},c=function(e){if(e&&!e.length)return u(e);for(var t=0;t0?setTimeout(o,t):e.style.display="none"});o()},h=function(n){if("function"==typeof MouseEvent){var o=new MouseEvent("click",{view:e,bubbles:!1,cancelable:!0});n.dispatchEvent(o)}else if(t.createEvent){var a=t.createEvent("MouseEvents");a.initEvent("click",!1,!1),n.dispatchEvent(a)}else t.createEventObject?n.fireEvent("onclick"):"function"==typeof n.onclick&&n.onclick()},g=function(t){"function"==typeof t.stopPropagation?(t.stopPropagation(),t.preventDefault()):e.event&&e.event.hasOwnProperty("cancelBubble")&&(e.event.cancelBubble=!0)};a.hasClass=r,a.addClass=s,a.removeClass=l,a.escapeHtml=i,a._show=u,a.show=c,a._hide=d,a.hide=f,a.isDescendant=p,a.getTopMargin=m,a.fadeIn=v,a.fadeOut=y,a.fireClick=h,a.stopEventPropagation=g},{}],5:[function(t,o,a){Object.defineProperty(a,"__esModule",{value:!0});var r=t("./handle-dom"),s=t("./handle-swal-dom"),l=function(t,o,a){var l=t||e.event,i=l.keyCode||l.which,u=a.querySelector("button.confirm"),c=a.querySelector("button.cancel"),d=a.querySelectorAll("button[tabindex]");if(-1!==[9,13,32,27].indexOf(i)){for(var f=l.target||l.srcElement,p=-1,m=0;m"),i.innerHTML=e.html?e.text:s.escapeHtml(e.text||"").split("\n").join("
"),e.text&&s.show(i),e.customClass)s.addClass(t,e.customClass),t.setAttribute("data-custom-class",e.customClass);else{var d=t.getAttribute("data-custom-class");s.removeClass(t,d),t.setAttribute("data-custom-class","")}if(s.hide(t.querySelectorAll(".sa-icon")),e.type&&!a.isIE8()){var f=function(){for(var o=!1,a=0;ao;o++)n=parseInt(e.substr(2*o,2),16),n=Math.round(Math.min(Math.max(0,n+n*t),255)).toString(16),a+=("00"+n).substr(n.length);return a};o.extend=a,o.hexToRgb=r,o.isIE8=s,o.logStr=l,o.colorLuminance=i},{}]},{},[1]),"function"==typeof define&&define.amd?define(function(){return sweetAlert}):"undefined"!=typeof module&&module.exports&&(module.exports=sweetAlert)}(window,document); \ No newline at end of file diff --git a/src/main/webapp/css/style.css b/src/main/webapp/css/style.css new file mode 100644 index 0000000..39dfd68 --- /dev/null +++ b/src/main/webapp/css/style.css @@ -0,0 +1,32 @@ +.btn.btn-primary.noselect{ + color: #337ab7; + background-color: #fff; + border-color: #2e6da4; + } +.btn.btn-primary.selected { + color: #fff; + background-color: #337ab7; + border-color: #2e6da4; + } +.breadcrumb { + margin: 5px -10px -20px -10px; + background-color: rgb(255, 255, 255); + } +.fileInfo { + max-width: 100px; + text-overflow: ellipsis; + white-space: nowrap; + display: inline-block; + overflow: hidden; +} +.fileDelete { + position: absolute; + right: 0; + top: 7px; + color: #c74545; + text-shadow: 2px 2px 2px #615f5f; + cursor: pointer; +} +.attachmentArea { + padding : 10px; +} \ No newline at end of file diff --git a/src/main/webapp/hello.html b/src/main/webapp/hello.html index 4952598..fe62d11 100644 --- a/src/main/webapp/hello.html +++ b/src/main/webapp/hello.html @@ -47,58 +47,7 @@
-
-

尊敬的面试官你好,以下是网站和个人的简略介绍

- 网站技术选型
- 数据库表结构:点我查看
- IoC容器:spring
- web框架:springmvc
- orm框架:mybatis
- 安全框架:shiro
- 数据源:dbcp2
- 日志: sl4j
- Json: Gson
- 前端框架:Bootstrap
- -

- 使用的小技术:
- 1.教师订购图书页面orderbook.jsp使用了ajax提交json与后台交互实现局部刷新
-

- -

- 可改进的地方(成吨的问题所以只能说改进了):
- 1.完善基本的业务功能
- 2.实现网站对机器的性能等监控(这个不会,很有兴趣去实现,了解到Driud好像有相关的资料)
- 3.阅读Shiro源码更好使用shiro,并且把权限控制从角色改变为资源粒度
- 4.学习Effective Java,Clean code,重构等书籍对代码进行清理
- 5.Sql优化
- 6.Web安全设计
- 7.Resetful方式重写
-

- -

- 目前所了解过的书籍(略为只扫读过一遍,稍微详细为仔细阅读过或者有写代码和练习)
- 略:
- 《数据结构与算法》(表,栈,队列,二叉树,散列表,希尔,快排,堆排,归并,快排,并查集,图的最小生成树,最短路径,拓扑排序相关算法,动态规划)
- 《设计模式》
- 《Operating system-Internal and Design principle》(英文版)
- 《数据库系统概念》
- 《算法导论》
- 《java核心卷1》
- 《Java网络编程》
- 《Http权威指南》
- 《Java NIO》
- 《深入剖析Tomcat》(之后阅读了Tomcat8源码)
- - 稍微详细:
- 《汇编语言》
- 《C Primer Plus》
- 《Windows程序设计》
- 《Head First JSP & Servlet》(英文版)
- 《深入理解计算机》
- -

-
+
diff --git a/src/main/webapp/js/ajaxfileupload.js b/src/main/webapp/js/ajaxfileupload.js new file mode 100644 index 0000000..2517c2b --- /dev/null +++ b/src/main/webapp/js/ajaxfileupload.js @@ -0,0 +1,206 @@ + +jQuery.extend({ + + + createUploadIframe: function(id, uri) + { + //create frame + var frameId = 'jUploadFrame' + id; + var iframeHtml = '