├── README.md ├── pom.xml └── src ├── main ├── java │ └── com │ │ └── visualpathit │ │ └── account │ │ ├── controller │ │ └── UserController.java │ │ ├── model │ │ ├── Role.java │ │ └── User.java │ │ ├── repository │ │ ├── RoleRepository.java │ │ └── UserRepository.java │ │ ├── service │ │ ├── SecurityService.java │ │ ├── SecurityServiceImpl.java │ │ ├── UserDetailsServiceImpl.java │ │ ├── UserService.java │ │ └── UserServiceImpl.java │ │ └── validator │ │ └── UserValidator.java ├── resources │ ├── application.properties │ ├── db.sql │ ├── logback.xml │ └── validation.properties └── webapp │ ├── WEB-INF │ ├── appconfig-data.xml │ ├── appconfig-mvc.xml │ ├── appconfig-root.xml │ ├── appconfig-security.xml │ ├── views │ │ ├── index_home.jsp │ │ ├── login.jsp │ │ ├── registration.jsp │ │ └── welcome.jsp │ └── web.xml │ └── resources │ ├── Images │ ├── header.jpg │ ├── technologies │ │ ├── Ansible_logo.png │ │ ├── Vagrant.png │ │ ├── aws.png │ │ ├── docker.png │ │ ├── git.jpg │ │ ├── jenkins.png │ │ ├── puppet.jpg │ │ └── python-logo.png │ ├── visualpath.png │ ├── visualpathlogo2.png │ └── visualpathlogo3.png │ ├── css │ ├── bootstrap.min.css │ ├── common.css │ └── profile.css │ └── js │ └── bootstrap.min.js └── test └── java └── com └── visualpathit └── account └── controllerTest └── SampleTest.java /README.md: -------------------------------------------------------------------------------- 1 | ## Prerequisites 2 | - JDK 1.8 or later 3 | - Maven 3 or later 4 | - MySQL 5.6 or later 5 | 6 | ## Technologies 7 | - Spring MVC 8 | - Spring Security 9 | - Spring Data JPA 10 | - Maven 11 | - JSP 12 | - MySQL 13 | ## Database 14 | Here,we used Mysql DB 15 | MSQL DB Installation Steps for Linux ubuntu 14.04: 16 | - $ sudo apt-get update 17 | - $ sudo apt-get install mysql-server 18 | 19 | Then look for the file : 20 | - /src/main/resources/db.sql 21 | 22 | - db.sql file contents all step for DB table creation commands. 23 | 24 | 25 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 3 | 4.0.0 4 | com.visualpathit 5 | VProfile 6 | war 7 | 1.0 8 | Visualpathit VProfile Webapp 9 | http://maven.apache.org 10 | 11 | 4.2.0.RELEASE 12 | 4.0.2.RELEASE 13 | 1.8.2.RELEASE 14 | 4.3.11.Final 15 | 5.2.1.Final 16 | 5.1.36 17 | 1.4 18 | 1.2 19 | 4.10 20 | 1.1.3 21 | 1.8 22 | 1.8 23 | 24 | 25 | 26 | 27 | org.springframework 28 | spring-web 29 | ${spring.version} 30 | 31 | 32 | 33 | org.springframework 34 | spring-webmvc 35 | ${spring.version} 36 | 37 | 38 | 39 | org.springframework.security 40 | spring-security-web 41 | ${spring-security.version} 42 | 43 | 44 | 45 | org.springframework.security 46 | spring-security-config 47 | ${spring-security.version} 48 | 49 | 50 | 51 | org.hibernate 52 | hibernate-validator 53 | ${hibernate-validator.version} 54 | 55 | 56 | 57 | org.springframework.data 58 | spring-data-jpa 59 | ${spring-data-jpa.version} 60 | 61 | 62 | 63 | org.hibernate 64 | hibernate-entitymanager 65 | ${hibernate.version} 66 | 67 | 68 | 69 | mysql 70 | mysql-connector-java 71 | ${mysql-connector.version} 72 | 73 | 74 | 75 | commons-dbcp 76 | commons-dbcp 77 | ${commons-dbcp.version} 78 | 79 | 80 | 81 | javax.servlet 82 | jstl 83 | ${jstl.version} 84 | 85 | 86 | 87 | junit 88 | junit 89 | ${junit.version} 90 | test 91 | 92 | 93 | org.mockito 94 | mockito-core 95 | 1.9.5 96 | test 97 | 98 | 99 | org.springframework 100 | spring-test 101 | 3.2.3.RELEASE 102 | test 103 | 104 | 105 | javax.servlet 106 | javax.servlet-api 107 | 3.1.0 108 | provided 109 | 110 | 111 | ch.qos.logback 112 | logback-classic 113 | ${logback.version} 114 | 115 | 116 | org.hamcrest 117 | hamcrest-all 118 | 1.3 119 | test 120 | 121 | 122 | 123 | 124 | 125 | org.eclipse.jetty 126 | jetty-maven-plugin 127 | 9.2.11.v20150529 128 | 129 | 10 130 | 131 | / 132 | 133 | 134 | 135 | 136 | 137 | org.jacoco 138 | jacoco-maven-plugin 139 | 0.7.2.201409121644 140 | 141 | 142 | jacoco-initialize 143 | process-resources 144 | 145 | prepare-agent 146 | 147 | 148 | 149 | jacoco-site 150 | post-integration-test 151 | 152 | report 153 | 154 | 155 | 156 | 157 | 158 | 159 | 160 | 161 | -------------------------------------------------------------------------------- /src/main/java/com/visualpathit/account/controller/UserController.java: -------------------------------------------------------------------------------- 1 | package com.visualpathit.account.controller; 2 | 3 | import com.visualpathit.account.model.User; 4 | import com.visualpathit.account.service.SecurityService; 5 | import com.visualpathit.account.service.UserService; 6 | import com.visualpathit.account.validator.UserValidator; 7 | 8 | import org.springframework.beans.factory.annotation.Autowired; 9 | import org.springframework.stereotype.Controller; 10 | import org.springframework.ui.Model; 11 | import org.springframework.validation.BindingResult; 12 | import org.springframework.web.bind.annotation.ModelAttribute; 13 | import org.springframework.web.bind.annotation.RequestMapping; 14 | import org.springframework.web.bind.annotation.RequestMethod; 15 | /**{@author waheedk}*/ 16 | @Controller 17 | public class UserController { 18 | @Autowired 19 | private UserService userService; 20 | 21 | @Autowired 22 | private SecurityService securityService; 23 | 24 | @Autowired 25 | private UserValidator userValidator; 26 | 27 | /** {@inheritDoc} */ 28 | @RequestMapping(value = "/registration", method = RequestMethod.GET) 29 | public final String registration(final Model model) { 30 | model.addAttribute("userForm", new User()); 31 | 32 | return "registration"; 33 | } 34 | /** {@inheritDoc} */ 35 | @RequestMapping(value = "/registration", method = RequestMethod.POST) 36 | public final String registration(final @ModelAttribute("userForm") User userForm, 37 | final BindingResult bindingResult, final Model model) { 38 | 39 | userValidator.validate(userForm, bindingResult); 40 | if (bindingResult.hasErrors()) { 41 | return "registration"; 42 | } 43 | System.out.println("User PWD:"+userForm.getPassword()); 44 | userService.save(userForm); 45 | 46 | securityService.autologin(userForm.getUsername(), userForm.getPasswordConfirm()); 47 | 48 | return "redirect:/welcome"; 49 | } 50 | /** {@inheritDoc} */ 51 | @RequestMapping(value = "/login", method = RequestMethod.GET) 52 | public final String login(final Model model, final String error, final String logout) { 53 | if (error != null){ 54 | model.addAttribute("error", "Your username and password is invalid."); 55 | } 56 | if (logout != null){ 57 | model.addAttribute("message", "You have been logged out successfully."); 58 | } 59 | return "login"; 60 | } 61 | /** {@inheritDoc} */ 62 | @RequestMapping(value = { "/", "/welcome"}, method = RequestMethod.GET) 63 | public final String welcome(final Model model) { 64 | return "welcome"; 65 | } 66 | /** {@inheritDoc} */ 67 | @RequestMapping(value = { "/index"} , method = RequestMethod.GET) 68 | public final String indexHome(final Model model) { 69 | return "index_home"; 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /src/main/java/com/visualpathit/account/model/Role.java: -------------------------------------------------------------------------------- 1 | package com.visualpathit.account.model; 2 | 3 | import javax.persistence.*; 4 | import java.util.Set; 5 | /**{@author waheedk} !*/ 6 | @Entity 7 | @Table(name = "role") 8 | public class Role { 9 | /** the id field !*/ 10 | private Long id; 11 | /** the name field !*/ 12 | private String name; 13 | /** the user field !*/ 14 | private Set users; 15 | /** {@inheritDoc}} !*/ 16 | @Id 17 | @GeneratedValue(strategy = GenerationType.AUTO) 18 | /** 19 | * {@link Role#id} 20 | !*/ 21 | public Long getId() { 22 | return id; 23 | } 24 | /** {@inheritDoc}} !*/ 25 | public final void setId(final Long id) { 26 | this.id = id; 27 | } 28 | /** 29 | * {@link Role#name} 30 | !*/ 31 | public String getName() { 32 | return name; 33 | } 34 | /** {@inheritDoc}} !*/ 35 | public final void setName(final String name) { 36 | this.name = name; 37 | } 38 | /** 39 | * {@inheritDoc}} 40 | !*/ 41 | @ManyToMany(mappedBy = "roles") 42 | /** 43 | * {@link Role#id} 44 | !*/ 45 | public Set getUsers() { 46 | return users; 47 | } 48 | /** 49 | * {@inheritDoc}} 50 | !*/ 51 | public final void setUsers(Set users) { 52 | this.users = users; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /src/main/java/com/visualpathit/account/model/User.java: -------------------------------------------------------------------------------- 1 | package com.visualpathit.account.model; 2 | 3 | 4 | import javax.persistence.*; 5 | import java.util.Set; 6 | /**{@author waheedk} !*/ 7 | @Entity 8 | @Table(name = "user") 9 | public class User { 10 | /** the id field !*/ 11 | private Long id; 12 | /** the user name field !*/ 13 | private String username; 14 | /** the password field !*/ 15 | private String password; 16 | /** the userEmail field !*/ 17 | private String userEmail; 18 | /** the passwordConfirm field !*/ 19 | private String passwordConfirm; 20 | /** the roles field !*/ 21 | private Set roles; 22 | /** {@inheritDoc}} !*/ 23 | @Id 24 | @GeneratedValue(strategy = GenerationType.AUTO) 25 | /** {@link User#id} */ 26 | public Long getId() { 27 | return id; 28 | } 29 | /** {@inheritDoc}} !*/ 30 | public final void setId(final Long id) { 31 | this.id = id; 32 | } 33 | /**{@inheritDoc}} !*/ 34 | public String getUsername() { 35 | return username; 36 | } 37 | /** {@inheritDoc}} !*/ 38 | public final void setUsername(final String username) { 39 | this.username = username; 40 | } 41 | /** 42 | * {@link User#password} 43 | * @return The {@link String} instance representing password 44 | !*/ 45 | public String getPassword() { 46 | return password; 47 | } 48 | /** 49 | * {@inheritDoc}} 50 | !*/ 51 | public final void setPassword(final String password) { 52 | this.password = password; 53 | } 54 | /** 55 | * {@link User#userEmail} 56 | * @return The {@link String} instance representing userEmail. 57 | !*/ 58 | public String getUserEmail() { 59 | return userEmail; 60 | } 61 | /** {@inheritDoc}} !*/ 62 | public final void setUserEmail(final String userEmail) { 63 | this.userEmail = userEmail; 64 | } 65 | 66 | /** {@inheritDoc}} !*/ 67 | @Transient 68 | /** 69 | * {@link User#passwordConfirm} 70 | !*/ 71 | public String getPasswordConfirm() { 72 | return passwordConfirm; 73 | } 74 | /** {@inheritDoc}} !*/ 75 | public final void setPasswordConfirm(final String passwordConfirm) { 76 | this.passwordConfirm = passwordConfirm; 77 | } 78 | /** {@inheritDoc}} !*/ 79 | @ManyToMany 80 | @JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id")) 81 | public Set getRoles() { 82 | return roles; 83 | } 84 | /** {@inheritDoc}} !*/ 85 | public final void setRoles(final Set roles) { 86 | this.roles = roles; 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /src/main/java/com/visualpathit/account/repository/RoleRepository.java: -------------------------------------------------------------------------------- 1 | package com.visualpathit.account.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.visualpathit.account.model.Role; 6 | 7 | public interface RoleRepository extends JpaRepository{ 8 | } 9 | -------------------------------------------------------------------------------- /src/main/java/com/visualpathit/account/repository/UserRepository.java: -------------------------------------------------------------------------------- 1 | package com.visualpathit.account.repository; 2 | 3 | import org.springframework.data.jpa.repository.JpaRepository; 4 | 5 | import com.visualpathit.account.model.User; 6 | 7 | public interface UserRepository extends JpaRepository { 8 | User findByUsername(String username); 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/visualpathit/account/service/SecurityService.java: -------------------------------------------------------------------------------- 1 | package com.visualpathit.account.service; 2 | 3 | /** method for finding already added user !*/ 4 | public interface SecurityService { 5 | /** {@inheritDoc}} !*/ 6 | String findLoggedInUsername(); 7 | 8 | void autologin(String username, String password); 9 | } 10 | -------------------------------------------------------------------------------- /src/main/java/com/visualpathit/account/service/SecurityServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.visualpathit.account.service; 2 | 3 | import org.slf4j.Logger; 4 | import org.slf4j.LoggerFactory; 5 | import org.springframework.beans.factory.annotation.Autowired; 6 | import org.springframework.security.authentication.AuthenticationManager; 7 | import org.springframework.security.authentication 8 | .UsernamePasswordAuthenticationToken; 9 | import org.springframework.security.core.context.SecurityContextHolder; 10 | import org.springframework.security.core.userdetails.UserDetails; 11 | import org.springframework.security.core.userdetails.UserDetailsService; 12 | import org.springframework.stereotype.Service; 13 | /** {@author waheedk} !*/ 14 | @Service 15 | public class SecurityServiceImpl implements SecurityService { 16 | /** authenticationManager !*/ 17 | @Autowired 18 | private AuthenticationManager authenticationManager; 19 | /** userDetailsService !*/ 20 | @Autowired 21 | private UserDetailsService userDetailsService; 22 | 23 | /** Logger creation !*/ 24 | private static final Logger logger = LoggerFactory 25 | .getLogger(SecurityServiceImpl.class); 26 | 27 | @Override 28 | public String findLoggedInUsername() { 29 | Object userDetails = SecurityContextHolder.getContext() 30 | .getAuthentication().getDetails(); 31 | if (userDetails instanceof UserDetails) { 32 | return ((UserDetails) userDetails).getUsername(); 33 | } 34 | 35 | return null; 36 | } 37 | 38 | @Override 39 | public void autologin(final String username, final String password) { 40 | UserDetails userDetails = userDetailsService.loadUserByUsername(username); 41 | UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = 42 | new UsernamePasswordAuthenticationToken(userDetails, password, userDetails.getAuthorities()); 43 | 44 | authenticationManager.authenticate(usernamePasswordAuthenticationToken); 45 | 46 | if (usernamePasswordAuthenticationToken.isAuthenticated()) { 47 | SecurityContextHolder.getContext() 48 | .setAuthentication(usernamePasswordAuthenticationToken); 49 | logger.debug(String.format("Auto login %s successfully!", username)); 50 | } 51 | } 52 | } 53 | -------------------------------------------------------------------------------- /src/main/java/com/visualpathit/account/service/UserDetailsServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.visualpathit.account.service; 2 | 3 | import com.visualpathit.account.model.Role; 4 | import com.visualpathit.account.model.User; 5 | import com.visualpathit.account.repository.UserRepository; 6 | 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.security.core.GrantedAuthority; 9 | import org.springframework.security.core.authority.SimpleGrantedAuthority; 10 | import org.springframework.security.core.userdetails.UserDetails; 11 | import org.springframework.security.core.userdetails.UserDetailsService; 12 | import org.springframework.security.core.userdetails.UsernameNotFoundException; 13 | import org.springframework.transaction.annotation.Transactional; 14 | 15 | import java.util.HashSet; 16 | import java.util.Set; 17 | /** {@author waheedk} !*/ 18 | public class UserDetailsServiceImpl implements UserDetailsService { 19 | @Autowired 20 | /** userRepository !*/ 21 | private UserRepository userRepository; 22 | 23 | @Override 24 | @Transactional(readOnly = true) 25 | public UserDetails loadUserByUsername(final String username) 26 | throws UsernameNotFoundException { 27 | User user = userRepository.findByUsername(username); 28 | 29 | Set grantedAuthorities = new HashSet<>(); 30 | for (Role role : user.getRoles()) { 31 | grantedAuthorities.add(new SimpleGrantedAuthority(role.getName())); 32 | } 33 | 34 | return new org.springframework.security.core 35 | .userdetails.User(user.getUsername(), user.getPassword(), grantedAuthorities); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/visualpathit/account/service/UserService.java: -------------------------------------------------------------------------------- 1 | package com.visualpathit.account.service; 2 | 3 | import com.visualpathit.account.model.User; 4 | 5 | /** {@author waheedk}!*/ 6 | public interface UserService { 7 | /** {@inheritDoc}} !*/ 8 | void save(User user); 9 | /** {@inheritDoc}} !*/ 10 | User findByUsername(String username); 11 | } 12 | -------------------------------------------------------------------------------- /src/main/java/com/visualpathit/account/service/UserServiceImpl.java: -------------------------------------------------------------------------------- 1 | package com.visualpathit.account.service; 2 | 3 | import com.visualpathit.account.model.User; 4 | import com.visualpathit.account.repository.RoleRepository; 5 | import com.visualpathit.account.repository.UserRepository; 6 | 7 | import org.springframework.beans.factory.annotation.Autowired; 8 | import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; 9 | import org.springframework.stereotype.Service; 10 | 11 | import java.util.HashSet; 12 | 13 | /** {@author waheedk}!*/ 14 | @Service 15 | public class UserServiceImpl implements UserService { 16 | @Autowired 17 | /** userRepository !*/ 18 | private UserRepository userRepository; 19 | @Autowired 20 | /** roleRepository !*/ 21 | private RoleRepository roleRepository; 22 | @Autowired 23 | /** bCryptPasswordEncoder !*/ 24 | private BCryptPasswordEncoder bCryptPasswordEncoder; 25 | 26 | @Override 27 | public void save(final User user) { 28 | user.setPassword(bCryptPasswordEncoder.encode(user.getPassword())); 29 | user.setRoles(new HashSet<>(roleRepository.findAll())); 30 | userRepository.save(user); 31 | } 32 | 33 | @Override 34 | public User findByUsername(final String username) { 35 | return userRepository.findByUsername(username); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /src/main/java/com/visualpathit/account/validator/UserValidator.java: -------------------------------------------------------------------------------- 1 | package com.visualpathit.account.validator; 2 | 3 | import com.visualpathit.account.model.User; 4 | import com.visualpathit.account.service.UserService; 5 | 6 | import org.springframework.beans.factory.annotation.Autowired; 7 | import org.springframework.stereotype.Component; 8 | import org.springframework.validation.Errors; 9 | import org.springframework.validation.ValidationUtils; 10 | import org.springframework.validation.Validator; 11 | 12 | @Component 13 | public class UserValidator implements Validator { 14 | @Autowired 15 | private UserService userService; 16 | 17 | @Override 18 | public boolean supports(Class aClass) { 19 | return User.class.equals(aClass); 20 | } 21 | 22 | @Override 23 | public void validate(Object o, Errors errors) { 24 | User user = (User) o; 25 | 26 | ValidationUtils.rejectIfEmptyOrWhitespace(errors, "username", "NotEmpty"); 27 | if (user.getUsername().length() < 6 || user.getUsername().length() > 32) { 28 | errors.rejectValue("username", "Size.userForm.username"); 29 | } 30 | if (userService.findByUsername(user.getUsername()) != null) { 31 | errors.rejectValue("username", "Duplicate.userForm.username"); 32 | } 33 | 34 | ValidationUtils.rejectIfEmptyOrWhitespace(errors, "password", "NotEmpty"); 35 | if (user.getPassword().length() < 8 || user.getPassword().length() > 32) { 36 | errors.rejectValue("password", "Size.userForm.password"); 37 | } 38 | 39 | if (!user.getPasswordConfirm().equals(user.getPassword())) { 40 | errors.rejectValue("passwordConfirm", "Diff.userForm.passwordConfirm"); 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | jdbc.driverClassName=com.mysql.jdbc.Driver 2 | jdbc.url=jdbc:mysql://localhost:3306/accounts?useUnicode=true&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull 3 | jdbc.username=newuser 4 | jdbc.password=password 5 | -------------------------------------------------------------------------------- /src/main/resources/db.sql: -------------------------------------------------------------------------------- 1 | -- 2 | --create a User with a password 3 | -- 4 | CREATE USER 'newuser'@'localhost' IDENTIFIED BY 'password'; 5 | GRANT ALL PRIVILEGES ON * . * TO 'newuser'@'localhost'; 6 | 7 | CREATE DATABASE IF NOT EXISTS `accounts`; 8 | USE `accounts`; 9 | -- 10 | -- Table structure for table `role` 11 | -- 12 | 13 | DROP TABLE IF EXISTS `role`; 14 | CREATE TABLE `role` ( 15 | `id` int(11) NOT NULL AUTO_INCREMENT, 16 | `name` varchar(45) DEFAULT NULL, 17 | PRIMARY KEY (`id`) 18 | ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; 19 | 20 | -- 21 | -- Dumping data for table `role` 22 | -- 23 | 24 | LOCK TABLES `role` WRITE; 25 | INSERT INTO `role` VALUES (1,'ROLE_USER'); 26 | UNLOCK TABLES; 27 | 28 | -- 29 | -- Table structure for table `user` 30 | -- 31 | 32 | DROP TABLE IF EXISTS `user`; 33 | CREATE TABLE `user` ( 34 | `id` int(11) NOT NULL AUTO_INCREMENT, 35 | `username` varchar(255) DEFAULT NULL, 36 | `userEmail` varchar(255) DEFAULT NULL, 37 | `password` varchar(255) DEFAULT NULL, 38 | PRIMARY KEY (`id`) 39 | ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; 40 | 41 | -- 42 | -- Table structure for table `user_role` 43 | -- 44 | 45 | DROP TABLE IF EXISTS `user_role`; 46 | CREATE TABLE `user_role` ( 47 | `user_id` int(11) NOT NULL, 48 | `role_id` int(11) NOT NULL, 49 | PRIMARY KEY (`user_id`,`role_id`), 50 | KEY `fk_user_role_roleid_idx` (`role_id`), 51 | CONSTRAINT `fk_user_role_roleid` FOREIGN KEY (`role_id`) REFERENCES `role` (`id`) ON DELETE CASCADE ON UPDATE CASCADE, 52 | CONSTRAINT `fk_user_role_userid` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE 53 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 54 | -------------------------------------------------------------------------------- /src/main/resources/logback.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | %date{HH:mm:ss.SSS} [%thread] %-5level %logger{15}#%line %msg\n 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | -------------------------------------------------------------------------------- /src/main/resources/validation.properties: -------------------------------------------------------------------------------- 1 | NotEmpty=This field is required. 2 | Size.userForm.username=Please use between 6 and 32 characters. 3 | Duplicate.userForm.username= User has already taken this Username. 4 | Size.userForm.password=Try one with at least 8 characters. 5 | Diff.userForm.passwordConfirm=These passwords don't match. -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/appconfig-data.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | org.hibernate.dialect.MySQL5Dialect 33 | true 34 | 35 | 36 | 37 | 38 | 39 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 51 | 52 | 53 | 54 | 55 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/appconfig-mvc.xml: -------------------------------------------------------------------------------- 1 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | classpath:validation 15 | 16 | 17 | 18 | 19 | 20 | /WEB-INF/views/ 21 | 22 | 23 | .jsp 24 | 25 | 26 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/appconfig-root.xml: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/appconfig-security.xml: -------------------------------------------------------------------------------- 1 | 2 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 27 | 28 | 29 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/views/index_home.jsp: -------------------------------------------------------------------------------- 1 | <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> 2 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 3 | <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 |
15 | 47 |
48 |
49 | 50 |
51 | Architecture 52 |
53 |

DevOps

54 |
55 |
56 |
57 |

58 |

Keep Learning ..

59 |

Learning is a Treasure that will follow it's Owner Everywhere..

60 |
61 | 62 |
63 | 64 | 65 |
66 |

TECHNOLOGIES

67 |
68 | 69 |
70 |
71 |
72 | DevOps 73 |
74 |
75 |
76 |
77 | DevOps 78 |
79 |
80 |
81 |
82 | DevOps 83 |
84 |
85 |
86 |
87 | DevOps 88 |
89 |
90 |
91 | 92 |
93 |
94 |
95 | DevOps 96 |
97 |
98 |
99 |
100 | DevOps 101 |
102 |
103 |
104 |
105 | DevOps 106 |
107 |
108 |
109 |
110 | DevOps 111 |
112 |
113 |
114 | 115 | 116 |
117 |

ABOUT

118 |
119 |

VisualPath is an IT Educational Institute.Established in 2001,and Institute offers world class quality of education and wide range of courses.VisualPath Institute has a dedicated placement team to help students get job placement in various IT job roles with major companies. 120 |

121 |

Address: Flat no: 205, 2nd Floor,NILGIRI Block,Aditya Encalve,Ameerpet, Hyderabad-16

122 |

Ph No: +91-9704455959,9618245689

123 |

E-Mail ID : visualpath999@gmail.com

124 |
125 |
126 | 127 | 128 |
129 |

CONTACT

130 |

Lets get in touch and talk about your and our next project.

131 |
132 | 133 | 134 | 135 | 136 | 139 |
140 |
141 | 142 | 143 |
144 | 145 | 146 | 147 | 150 | 151 | 152 | 153 | 154 | 155 | 156 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/views/login.jsp: -------------------------------------------------------------------------------- 1 | <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> 2 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 3 | <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | LOGIN 18 | 19 | 20 | 21 | 22 | 23 | 27 | 28 | Welcome 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 |
37 |
38 | 69 |
70 |
71 |
72 | 73 | 89 | 90 |
91 | 92 | 93 | 94 | 95 | 96 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/views/registration.jsp: -------------------------------------------------------------------------------- 1 | <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> 2 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 3 | <%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %> 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | SIGNUP 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 30 | 31 | 32 | 33 |
34 |
35 | 66 |
67 |
68 | 69 |
70 | 71 | 106 | 107 |
108 | 109 | 110 | 111 | 112 | 113 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/views/welcome.jsp: -------------------------------------------------------------------------------- 1 | <%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %> 2 | <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 3 | 4 | 5 | 6 | 7 | 8 | 9 | Welcome 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 |
19 | 93 |
.
94 | 119 |
120 |
121 |
122 | 123 |

${pageContext.request.userPrincipal.name}   ${pageContext.request.userPrincipal.name}@visualpath.co.in

124 | 137 |
138 |

139 | #DevOps #Continuous Integration #Continuous Delivery #Automation 140 |


141 | 142 | Posts 143 | Photos 42 144 | Contacts 42 145 | 146 | 147 | 148 | 149 | 150 | 151 |
152 |
153 |
154 | 155 |
156 |
157 |
158 | 159 | 160 | 161 |
162 |

${pageContext.request.userPrincipal.name} 42 minutes ago

163 | 164 | 180 | 181 |
182 |
183 |

"The Key to DevOps Success."

184 |

The Key to DevOps Success" Collaboration". Collaboration is essential to DevOps,yet how to do it is often unclear with many teams falling back on ineffective conference calls, instant messaging, documents, and SharePoint sites. In this keynote,we will share a vision for a next generation DevOps where collaboration, continuous documentation, and knowledge capture are combined with automation toolchains to enable rapid innovation and deployment.

185 |
186 |
187 |
188 |
189 | Like 190 | Reshare 191 | Comment 192 |
193 |
194 |

Public

195 |
196 |
197 |
198 |
199 |
200 |
201 | 202 | 203 | 204 |
205 |
206 | 207 |
208 |
209 |
210 |
211 | 212 |
213 |
214 |
215 | 216 | 217 | 218 |
219 |

${pageContext.request.userPrincipal.name} 42 minutes ago

220 | 221 | 237 | 238 |
239 |
240 |
241 |
242 |
243 | 244 | 245 | 246 |
247 |

Waheed Khan about 10 hours ago

248 |
249 |
250 |

What are DevOps skills?

251 |

Our respondents identified the top three skill areas for DevOps staff:

252 |

1) Coding or scripting 2)Process re-engineering 3)Communicating and collaborating with others Extensive knowledge of software build cycles 4)Experience deploying code 5)Experience in software architecture 6)Familiarity with application programming 7)Database management 8)System design.

253 |

These skills all point to a growing recognition that software is not written in the old way anymore. Where software used to be written from scratch in a highly complex and lengthy process, creating new products is now often a matter of choosing open source components and stitching them together with code. The complexity of todays software lies less in the authoring, and more in ensuring that the new software will work across a diverse set of operating systems and platforms right away. Likewise, testing and deployment are now done much more frequently. That is, they can be more frequent,if developers communicate early and regularly with the operations team, and if ops people bring their knowledge of the production environment to design of testing and staging environments.

254 |

Demand for people with DevOps skills is growing rapidly because businesses get great results from DevOps. Organizations using DevOps practices are overwhelmingly high-functioning: They deploy code up to 30 times more frequently than their competitors.

255 |
256 |
257 |
258 |
259 |
260 |
261 |
262 | Like 263 | Reshare 264 | Comment 265 |
266 |
267 |

Public

268 |
269 |
270 |
271 |
272 |
273 |
274 | 275 | 276 | 277 |
278 |
279 | 280 |
281 |
282 |
283 |
284 | 285 |
286 |
287 |
288 | 289 | 290 | 291 |
292 |

${pageContext.request.userPrincipal.name} 42 minutes ago

293 | 294 | 310 | 311 |
312 |
313 |

" Manager Reaction On Your Work without DevOps "

314 | 315 |


# I want DevOps # DevOps..

316 |
317 |
318 |
319 |
320 | Like 321 | Reshare 322 | Comment 323 |
324 |
325 |

Public via mobile

326 |
327 |
328 |
329 |
330 |
331 |
332 | 333 | 334 | 335 |
336 |
337 | 338 |
339 |
340 |
341 |
342 | 343 |
344 |
345 |
346 | 347 | 348 | 349 |
350 |

${pageContext.request.userPrincipal.name} 42 minutes ago

351 | 352 | 368 | 369 |
370 |
371 |

"Feeling Happy to be a DevOps."

372 |
373 |
374 |
375 |
376 | Like 377 | Comment 378 |
379 |
380 |

Limited

381 |
382 |
383 |
384 |
385 |
386 | Show 12 more comments 387 |
388 |
389 |
390 |
391 |
392 | 393 | 394 | 395 |
396 |

Kiran Kumar

397 |
398 |
399 |

DevOps has significant importance to any company delivering software or technical services today.Defining DevOps is trickier than you would think, primarily because of its wide usage. It is essentially shorthand, and nothing more than that, for a lean approach to software delivery.

400 |
12 minutes ago 401 |
402 |
403 |
404 |
405 |
406 |
407 |
408 |
409 |
410 | 411 | 412 | 413 |
414 |

Mi Chleen

415 |
416 |
417 |

The secret to DevOps maturity is not technology or process, but people. It takes engaged leadership and all for one cooperation to achieve the kind of results that lead companies to superior IT performance. High-performing DevOps teams can recover 168 times faster from failures and have 60 times fewer failures due to changes, according to the 2015 State of DevOps Report by Puppet Labs. High-performing teams also release code at significantly increasing velocity as their teams grow in size, approaching three deploys per day per developer, for teams of around 1000 developers.

418 |
9 minutes ago 419 |
420 |
421 |
422 |
423 |
424 |
425 |
426 |
427 |
428 | 429 | 430 | 431 |
432 |

${pageContext.request.userPrincipal.name}

433 |
434 |
435 |

At a time when the speed of application development is vital to commercial success, the DevOps methodology based on communication, collaboration, integration and automation has become one of the biggest IT moves around. However, it is more than just a business philosophy;to do it right requires genuine infrastructure investment and development.

436 |
2 minutes ago 437 |
438 |
439 |
440 |
441 |
442 |
443 |
444 | 445 | 446 | 447 |
448 |
449 | 450 |
451 |
452 |
453 |
454 |
455 |
456 |
457 |
458 | 459 |
460 | 461 |
462 | 463 |

Welcome ${pageContext.request.userPrincipal.name} | Logout

464 | 465 |
466 |
467 | 475 | 476 | 477 | 478 | 479 | 480 | -------------------------------------------------------------------------------- /src/main/webapp/WEB-INF/web.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | Account Registration Web Application 4 | 5 | contextConfigLocation 6 | /WEB-INF/appconfig-root.xml 7 | 8 | 9 | springSecurityFilterChain 10 | org.springframework.web.filter.DelegatingFilterProxy 11 | 12 | 13 | springSecurityFilterChain 14 | /* 15 | 16 | 17 | dispatcher 18 | org.springframework.web.servlet.DispatcherServlet 19 | 20 | contextConfigLocation 21 | 22 | 23 | 1 24 | 25 | 26 | dispatcher 27 | / 28 | 29 | 30 | org.springframework.web.context.ContextLoaderListener 31 | 32 | -------------------------------------------------------------------------------- /src/main/webapp/resources/Images/header.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/watchip2/https-github.com-devopshydclub-vprofile-project/365103d9d4b8e885c8b8074d06e5a92042113b6c/src/main/webapp/resources/Images/header.jpg -------------------------------------------------------------------------------- /src/main/webapp/resources/Images/technologies/Ansible_logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/watchip2/https-github.com-devopshydclub-vprofile-project/365103d9d4b8e885c8b8074d06e5a92042113b6c/src/main/webapp/resources/Images/technologies/Ansible_logo.png -------------------------------------------------------------------------------- /src/main/webapp/resources/Images/technologies/Vagrant.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/watchip2/https-github.com-devopshydclub-vprofile-project/365103d9d4b8e885c8b8074d06e5a92042113b6c/src/main/webapp/resources/Images/technologies/Vagrant.png -------------------------------------------------------------------------------- /src/main/webapp/resources/Images/technologies/aws.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/watchip2/https-github.com-devopshydclub-vprofile-project/365103d9d4b8e885c8b8074d06e5a92042113b6c/src/main/webapp/resources/Images/technologies/aws.png -------------------------------------------------------------------------------- /src/main/webapp/resources/Images/technologies/docker.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/watchip2/https-github.com-devopshydclub-vprofile-project/365103d9d4b8e885c8b8074d06e5a92042113b6c/src/main/webapp/resources/Images/technologies/docker.png -------------------------------------------------------------------------------- /src/main/webapp/resources/Images/technologies/git.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/watchip2/https-github.com-devopshydclub-vprofile-project/365103d9d4b8e885c8b8074d06e5a92042113b6c/src/main/webapp/resources/Images/technologies/git.jpg -------------------------------------------------------------------------------- /src/main/webapp/resources/Images/technologies/jenkins.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/watchip2/https-github.com-devopshydclub-vprofile-project/365103d9d4b8e885c8b8074d06e5a92042113b6c/src/main/webapp/resources/Images/technologies/jenkins.png -------------------------------------------------------------------------------- /src/main/webapp/resources/Images/technologies/puppet.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/watchip2/https-github.com-devopshydclub-vprofile-project/365103d9d4b8e885c8b8074d06e5a92042113b6c/src/main/webapp/resources/Images/technologies/puppet.jpg -------------------------------------------------------------------------------- /src/main/webapp/resources/Images/technologies/python-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/watchip2/https-github.com-devopshydclub-vprofile-project/365103d9d4b8e885c8b8074d06e5a92042113b6c/src/main/webapp/resources/Images/technologies/python-logo.png -------------------------------------------------------------------------------- /src/main/webapp/resources/Images/visualpath.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/watchip2/https-github.com-devopshydclub-vprofile-project/365103d9d4b8e885c8b8074d06e5a92042113b6c/src/main/webapp/resources/Images/visualpath.png -------------------------------------------------------------------------------- /src/main/webapp/resources/Images/visualpathlogo2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/watchip2/https-github.com-devopshydclub-vprofile-project/365103d9d4b8e885c8b8074d06e5a92042113b6c/src/main/webapp/resources/Images/visualpathlogo2.png -------------------------------------------------------------------------------- /src/main/webapp/resources/Images/visualpathlogo3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/watchip2/https-github.com-devopshydclub-vprofile-project/365103d9d4b8e885c8b8074d06e5a92042113b6c/src/main/webapp/resources/Images/visualpathlogo3.png -------------------------------------------------------------------------------- /src/main/webapp/resources/css/common.css: -------------------------------------------------------------------------------- 1 | body { 2 | padding-top: 100px; 3 | padding-bottom: 50px; 4 | background-color: #ffffff; 5 | 6 | } 7 | form { 8 | border: 3px solid #204a87; 9 | } 10 | 11 | img.logo { 12 | display: block; 13 | margin-left: auto; 14 | margin-right: auto; 15 | width: 300px; 16 | height: 70px; 17 | 18 | } 19 | .form-signin { 20 | max-width: 330px; 21 | padding: 15px; 22 | margin: 0 auto; 23 | } 24 | .btn-custom,.btn-custom:hover, .btn-custom:focus, .btn-custom:active { 25 | border-radius: 0; 26 | color: #ffffff; 27 | background-color: #ef2929; 28 | border-color: #ef2929; 29 | 30 | } 31 | .btn-custom-LOGIN { 32 | border-radius: 0; 33 | color: #ffffff; 34 | height:3em; 35 | background-color: #26C6DA; 36 | border-color: #ef2929; 37 | 38 | } 39 | 40 | .form-signin .form-signin-heading, 41 | .form-signin .checkbox { 42 | margin-bottom: 10px; 43 | } 44 | 45 | .form-signin .checkbox { 46 | font-weight: normal; 47 | } 48 | 49 | .form-signin .form-control { 50 | position: relative; 51 | height: auto; 52 | -webkit-box-sizing: border-box; 53 | -moz-box-sizing: border-box; 54 | box-sizing: border-box; 55 | padding: 10px; 56 | font-size: 16px; 57 | } 58 | 59 | .form-signin .form-control:focus { 60 | z-index: 2; 61 | } 62 | 63 | .form-signin input { 64 | margin-top: 10px; 65 | border-bottom-right-radius: 0; 66 | border-bottom-left-radius: 0; 67 | } 68 | 69 | .form-signin button { 70 | margin-top: 10px; 71 | } 72 | 73 | .has-error { 74 | color: red 75 | } -------------------------------------------------------------------------------- /src/main/webapp/resources/css/profile.css: -------------------------------------------------------------------------------- 1 | .mainbody { 2 | background:#f0f0f0; 3 | } 4 | /* Special class on .container surrounding .navbar, used for positioning it into place. */ 5 | .navbar-wrapper { 6 | position: fixed; 7 | top: 0; 8 | left: 0; 9 | right: 0; 10 | z-index: 20; 11 | margin-left: -15px; 12 | margin-right: -15px; 13 | //background-color:#1C3B47; 14 | } 15 | .navbar-custom { 16 | background-color: #1C3B47; 17 | border-color: #E7E7E7; 18 | 19 | } 20 | 21 | /* Flip around the padding for proper display in narrow viewports */ 22 | .navbar-wrapper .container { 23 | padding-left: 0; 24 | padding-right: 0; 25 | } 26 | .navbar-wrapper .navbar { 27 | padding-left: 15px; 28 | padding-right: 15px; 29 | } 30 | 31 | .navbar-content 32 | { 33 | width:320px; 34 | padding: 15px; 35 | padding-bottom:0px; 36 | } 37 | .navbar-content:before, .navbar-content:after 38 | { 39 | display: table; 40 | content: ""; 41 | line-height: 0; 42 | } 43 | .navbar-nav.navbar-right:last-child { 44 | margin-right: 15px !important; 45 | } 46 | .navbar-footer 47 | { 48 | background-color:#DDD; 49 | } 50 | .navbar-brand,.navbar-toggle,.brand_network{ 51 | color: #FFFFFF; 52 | font-weight: bold; 53 | 54 | } 55 | .navbar-custom .navbar-nav > li > a { 56 | color:#FFFFFF; 57 | font-weight: bold; 58 | } 59 | .navbar-custom .navbar-toggle{ 60 | color: #f57900; 61 | background: #f57900; 62 | } 63 | .navbar-footer-content { padding:15px 15px 15px 15px; } 64 | .dropdown-menu { 65 | padding: 0px; 66 | overflow: hidden; 67 | } 68 | 69 | .brand_network { 70 | color: #9D9D9D; 71 | float: left; 72 | position: absolute; 73 | left: 70px; 74 | top: 30px; 75 | font-size: smaller; 76 | } 77 | 78 | .post-content { 79 | margin-left:58px; 80 | } 81 | 82 | .badge-important { 83 | margin-top: 3px; 84 | margin-left: 25px; 85 | position: absolute; 86 | } 87 | 88 | body { 89 | background-color: #e8e8e8; 90 | } 91 | //contact forms 92 | 93 | .container { 94 | max-width:700px; 95 | width:100%; 96 | margin:0 auto; 97 | position:relative; 98 | } 99 | 100 | #contact input[type="text"], #contact input[type="email"], #contact input[type="tel"], #contact input[type="url"], #contact textarea, #contact button[type="submit"] { font:400 12px/16px "Open Sans", Helvetica, Arial, sans-serif; } 101 | 102 | #contact,#technologies,#about { 103 | background:#F9F9F9; 104 | padding:25px; 105 | margin:50px 0; 106 | } 107 | 108 | #contact h3,#technologies h3,#about h3 { 109 | color: #F96; 110 | display: block; 111 | font-size: 30px; 112 | font-weight: 400; 113 | } 114 | 115 | #contact h4,#technologies h4,#about h4 { 116 | margin:5px 0 15px; 117 | display:block; 118 | font-size:13px; 119 | } 120 | 121 | fieldset { 122 | border: medium none !important; 123 | margin: 0 0 10px; 124 | min-width: 100%; 125 | padding: 0; 126 | width: 100%; 127 | } 128 | 129 | #contact input[type="text"], #contact input[type="email"], #contact input[type="tel"], #contact input[type="url"], #contact textarea { 130 | width:100%; 131 | border:1px solid #CCC; 132 | background:#FFF; 133 | margin:0 0 5px; 134 | padding:10px; 135 | } 136 | 137 | #contact input[type="text"]:hover, #contact input[type="email"]:hover, #contact input[type="tel"]:hover, #contact input[type="url"]:hover, #contact textarea:hover { 138 | -webkit-transition:border-color 0.3s ease-in-out; 139 | -moz-transition:border-color 0.3s ease-in-out; 140 | transition:border-color 0.3s ease-in-out; 141 | border:1px solid #AAA; 142 | } 143 | 144 | #contact textarea { 145 | height:100px; 146 | max-width:100%; 147 | resize:none; 148 | } 149 | 150 | #contact button[type="submit"] { 151 | cursor:pointer; 152 | width:100%; 153 | border:none; 154 | background:#0CF; 155 | color:#FFF; 156 | margin:0 0 5px; 157 | padding:10px; 158 | font-size:15px; 159 | } 160 | 161 | #contact button[type="submit"]:hover { 162 | background:#09C; 163 | -webkit-transition:background 0.3s ease-in-out; 164 | -moz-transition:background 0.3s ease-in-out; 165 | transition:background-color 0.3s ease-in-out; 166 | } 167 | 168 | #contact button[type="submit"]:active { box-shadow:inset 0 1px 3px rgba(0, 0, 0, 0.5); } 169 | 170 | #contact input:focus, #contact textarea:focus { 171 | outline:0; 172 | border:1px solid #999; 173 | } 174 | ::-webkit-input-placeholder { 175 | color:#888; 176 | } 177 | :-moz-placeholder { 178 | color:#888; 179 | } 180 | ::-moz-placeholder { 181 | color:#888; 182 | } 183 | :-ms-input-placeholder { 184 | color:#888; 185 | } 186 | blockquote{ 187 | display:block; 188 | background: #fff; 189 | padding: 15px 20px 15px 45px; 190 | margin: 0 0 20px; 191 | position: relative; 192 | 193 | /*Font*/ 194 | font-family: Georgia, serif; 195 | font-size: 16px; 196 | line-height: 1.2; 197 | color: #666; 198 | text-align: justify; 199 | 200 | /*Borders - (Optional)*/ 201 | border-left: 15px solid #c76c0c; 202 | border-right: 2px solid #c76c0c; 203 | 204 | /*Box Shadow - (Optional)*/ 205 | -moz-box-shadow: 2px 2px 15px #ccc; 206 | -webkit-box-shadow: 2px 2px 15px #ccc; 207 | box-shadow: 2px 2px 15px #ccc; 208 | } 209 | 210 | blockquote::before{ 211 | //content: "\201C"; /*Unicode for Left Double Quote*/ 212 | 213 | /*Font*/ 214 | font-family: Verdana,sans-serif; 215 | font-size: 60px; 216 | font-weight: bold; 217 | color: #1C3B47; 218 | 219 | /*Positioning*/ 220 | position: absolute; 221 | left: 25px; 222 | top:5px; 223 | } 224 | 225 | blockquote::after{ 226 | /*Reset to make sure*/ 227 | content: ""; 228 | } 229 | 230 | blockquote a{ 231 | text-decoration: none; 232 | background: #eee; 233 | cursor: pointer; 234 | padding: 0 4px; 235 | color: #c76c0c; 236 | } 237 | 238 | blockquote a:hover{ 239 | color: #1C3B47; 240 | } 241 | 242 | blockquote em{ 243 | font-style: italic; 244 | } -------------------------------------------------------------------------------- /src/main/webapp/resources/js/bootstrap.min.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * Bootstrap v3.3.5 (http://getbootstrap.com) 3 | * Copyright 2011-2015 Twitter, Inc. 4 | * Licensed under the MIT license 5 | */ 6 | if ("undefined" == typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery"); 7 | +function (a) { 8 | "use strict"; 9 | var b = a.fn.jquery.split(" ")[0].split("."); 10 | if (b[0] < 2 && b[1] < 9 || 1 == b[0] && 9 == b[1] && b[2] < 1)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher") 11 | }(jQuery), +function (a) { 12 | "use strict"; 13 | function b() { 14 | var a = document.createElement("bootstrap"), b = { 15 | WebkitTransition: "webkitTransitionEnd", 16 | MozTransition: "transitionend", 17 | OTransition: "oTransitionEnd otransitionend", 18 | transition: "transitionend" 19 | }; 20 | for (var c in b)if (void 0 !== a.style[c])return {end: b[c]}; 21 | return !1 22 | } 23 | 24 | a.fn.emulateTransitionEnd = function (b) { 25 | var c = !1, d = this; 26 | a(this).one("bsTransitionEnd", function () { 27 | c = !0 28 | }); 29 | var e = function () { 30 | c || a(d).trigger(a.support.transition.end) 31 | }; 32 | return setTimeout(e, b), this 33 | }, a(function () { 34 | a.support.transition = b(), a.support.transition && (a.event.special.bsTransitionEnd = { 35 | bindType: a.support.transition.end, 36 | delegateType: a.support.transition.end, 37 | handle: function (b) { 38 | return a(b.target).is(this) ? b.handleObj.handler.apply(this, arguments) : void 0 39 | } 40 | }) 41 | }) 42 | }(jQuery), +function (a) { 43 | "use strict"; 44 | function b(b) { 45 | return this.each(function () { 46 | var c = a(this), e = c.data("bs.alert"); 47 | e || c.data("bs.alert", e = new d(this)), "string" == typeof b && e[b].call(c) 48 | }) 49 | } 50 | 51 | var c = '[data-dismiss="alert"]', d = function (b) { 52 | a(b).on("click", c, this.close) 53 | }; 54 | d.VERSION = "3.3.5", d.TRANSITION_DURATION = 150, d.prototype.close = function (b) { 55 | function c() { 56 | g.detach().trigger("closed.bs.alert").remove() 57 | } 58 | 59 | var e = a(this), f = e.attr("data-target"); 60 | f || (f = e.attr("href"), f = f && f.replace(/.*(?=#[^\s]*$)/, "")); 61 | var g = a(f); 62 | b && b.preventDefault(), g.length || (g = e.closest(".alert")), g.trigger(b = a.Event("close.bs.alert")), b.isDefaultPrevented() || (g.removeClass("in"), a.support.transition && g.hasClass("fade") ? g.one("bsTransitionEnd", c).emulateTransitionEnd(d.TRANSITION_DURATION) : c()) 63 | }; 64 | var e = a.fn.alert; 65 | a.fn.alert = b, a.fn.alert.Constructor = d, a.fn.alert.noConflict = function () { 66 | return a.fn.alert = e, this 67 | }, a(document).on("click.bs.alert.data-api", c, d.prototype.close) 68 | }(jQuery), +function (a) { 69 | "use strict"; 70 | function b(b) { 71 | return this.each(function () { 72 | var d = a(this), e = d.data("bs.button"), f = "object" == typeof b && b; 73 | e || d.data("bs.button", e = new c(this, f)), "toggle" == b ? e.toggle() : b && e.setState(b) 74 | }) 75 | } 76 | 77 | var c = function (b, d) { 78 | this.$element = a(b), this.options = a.extend({}, c.DEFAULTS, d), this.isLoading = !1 79 | }; 80 | c.VERSION = "3.3.5", c.DEFAULTS = {loadingText: "loading..."}, c.prototype.setState = function (b) { 81 | var c = "disabled", d = this.$element, e = d.is("input") ? "val" : "html", f = d.data(); 82 | b += "Text", null == f.resetText && d.data("resetText", d[e]()), setTimeout(a.proxy(function () { 83 | d[e](null == f[b] ? this.options[b] : f[b]), "loadingText" == b ? (this.isLoading = !0, d.addClass(c).attr(c, c)) : this.isLoading && (this.isLoading = !1, d.removeClass(c).removeAttr(c)) 84 | }, this), 0) 85 | }, c.prototype.toggle = function () { 86 | var a = !0, b = this.$element.closest('[data-toggle="buttons"]'); 87 | if (b.length) { 88 | var c = this.$element.find("input"); 89 | "radio" == c.prop("type") ? (c.prop("checked") && (a = !1), b.find(".active").removeClass("active"), this.$element.addClass("active")) : "checkbox" == c.prop("type") && (c.prop("checked") !== this.$element.hasClass("active") && (a = !1), this.$element.toggleClass("active")), c.prop("checked", this.$element.hasClass("active")), a && c.trigger("change") 90 | } else this.$element.attr("aria-pressed", !this.$element.hasClass("active")), this.$element.toggleClass("active") 91 | }; 92 | var d = a.fn.button; 93 | a.fn.button = b, a.fn.button.Constructor = c, a.fn.button.noConflict = function () { 94 | return a.fn.button = d, this 95 | }, a(document).on("click.bs.button.data-api", '[data-toggle^="button"]', function (c) { 96 | var d = a(c.target); 97 | d.hasClass("btn") || (d = d.closest(".btn")), b.call(d, "toggle"), a(c.target).is('input[type="radio"]') || a(c.target).is('input[type="checkbox"]') || c.preventDefault() 98 | }).on("focus.bs.button.data-api blur.bs.button.data-api", '[data-toggle^="button"]', function (b) { 99 | a(b.target).closest(".btn").toggleClass("focus", /^focus(in)?$/.test(b.type)) 100 | }) 101 | }(jQuery), +function (a) { 102 | "use strict"; 103 | function b(b) { 104 | return this.each(function () { 105 | var d = a(this), e = d.data("bs.carousel"), f = a.extend({}, c.DEFAULTS, d.data(), "object" == typeof b && b), g = "string" == typeof b ? b : f.slide; 106 | e || d.data("bs.carousel", e = new c(this, f)), "number" == typeof b ? e.to(b) : g ? e[g]() : f.interval && e.pause().cycle() 107 | }) 108 | } 109 | 110 | var c = function (b, c) { 111 | this.$element = a(b), this.$indicators = this.$element.find(".carousel-indicators"), this.options = c, this.paused = null, this.sliding = null, this.interval = null, this.$active = null, this.$items = null, this.options.keyboard && this.$element.on("keydown.bs.carousel", a.proxy(this.keydown, this)), "hover" == this.options.pause && !("ontouchstart"in document.documentElement) && this.$element.on("mouseenter.bs.carousel", a.proxy(this.pause, this)).on("mouseleave.bs.carousel", a.proxy(this.cycle, this)) 112 | }; 113 | c.VERSION = "3.3.5", c.TRANSITION_DURATION = 600, c.DEFAULTS = { 114 | interval: 5e3, 115 | pause: "hover", 116 | wrap: !0, 117 | keyboard: !0 118 | }, c.prototype.keydown = function (a) { 119 | if (!/input|textarea/i.test(a.target.tagName)) { 120 | switch (a.which) { 121 | case 37: 122 | this.prev(); 123 | break; 124 | case 39: 125 | this.next(); 126 | break; 127 | default: 128 | return 129 | } 130 | a.preventDefault() 131 | } 132 | }, c.prototype.cycle = function (b) { 133 | return b || (this.paused = !1), this.interval && clearInterval(this.interval), this.options.interval && !this.paused && (this.interval = setInterval(a.proxy(this.next, this), this.options.interval)), this 134 | }, c.prototype.getItemIndex = function (a) { 135 | return this.$items = a.parent().children(".item"), this.$items.index(a || this.$active) 136 | }, c.prototype.getItemForDirection = function (a, b) { 137 | var c = this.getItemIndex(b), d = "prev" == a && 0 === c || "next" == a && c == this.$items.length - 1; 138 | if (d && !this.options.wrap)return b; 139 | var e = "prev" == a ? -1 : 1, f = (c + e) % this.$items.length; 140 | return this.$items.eq(f) 141 | }, c.prototype.to = function (a) { 142 | var b = this, c = this.getItemIndex(this.$active = this.$element.find(".item.active")); 143 | return a > this.$items.length - 1 || 0 > a ? void 0 : this.sliding ? this.$element.one("slid.bs.carousel", function () { 144 | b.to(a) 145 | }) : c == a ? this.pause().cycle() : this.slide(a > c ? "next" : "prev", this.$items.eq(a)) 146 | }, c.prototype.pause = function (b) { 147 | return b || (this.paused = !0), this.$element.find(".next, .prev").length && a.support.transition && (this.$element.trigger(a.support.transition.end), this.cycle(!0)), this.interval = clearInterval(this.interval), this 148 | }, c.prototype.next = function () { 149 | return this.sliding ? void 0 : this.slide("next") 150 | }, c.prototype.prev = function () { 151 | return this.sliding ? void 0 : this.slide("prev") 152 | }, c.prototype.slide = function (b, d) { 153 | var e = this.$element.find(".item.active"), f = d || this.getItemForDirection(b, e), g = this.interval, h = "next" == b ? "left" : "right", i = this; 154 | if (f.hasClass("active"))return this.sliding = !1; 155 | var j = f[0], k = a.Event("slide.bs.carousel", {relatedTarget: j, direction: h}); 156 | if (this.$element.trigger(k), !k.isDefaultPrevented()) { 157 | if (this.sliding = !0, g && this.pause(), this.$indicators.length) { 158 | this.$indicators.find(".active").removeClass("active"); 159 | var l = a(this.$indicators.children()[this.getItemIndex(f)]); 160 | l && l.addClass("active") 161 | } 162 | var m = a.Event("slid.bs.carousel", {relatedTarget: j, direction: h}); 163 | return a.support.transition && this.$element.hasClass("slide") ? (f.addClass(b), f[0].offsetWidth, e.addClass(h), f.addClass(h), e.one("bsTransitionEnd", function () { 164 | f.removeClass([b, h].join(" ")).addClass("active"), e.removeClass(["active", h].join(" ")), i.sliding = !1, setTimeout(function () { 165 | i.$element.trigger(m) 166 | }, 0) 167 | }).emulateTransitionEnd(c.TRANSITION_DURATION)) : (e.removeClass("active"), f.addClass("active"), this.sliding = !1, this.$element.trigger(m)), g && this.cycle(), this 168 | } 169 | }; 170 | var d = a.fn.carousel; 171 | a.fn.carousel = b, a.fn.carousel.Constructor = c, a.fn.carousel.noConflict = function () { 172 | return a.fn.carousel = d, this 173 | }; 174 | var e = function (c) { 175 | var d, e = a(this), f = a(e.attr("data-target") || (d = e.attr("href")) && d.replace(/.*(?=#[^\s]+$)/, "")); 176 | if (f.hasClass("carousel")) { 177 | var g = a.extend({}, f.data(), e.data()), h = e.attr("data-slide-to"); 178 | h && (g.interval = !1), b.call(f, g), h && f.data("bs.carousel").to(h), c.preventDefault() 179 | } 180 | }; 181 | a(document).on("click.bs.carousel.data-api", "[data-slide]", e).on("click.bs.carousel.data-api", "[data-slide-to]", e), a(window).on("load", function () { 182 | a('[data-ride="carousel"]').each(function () { 183 | var c = a(this); 184 | b.call(c, c.data()) 185 | }) 186 | }) 187 | }(jQuery), +function (a) { 188 | "use strict"; 189 | function b(b) { 190 | var c, d = b.attr("data-target") || (c = b.attr("href")) && c.replace(/.*(?=#[^\s]+$)/, ""); 191 | return a(d) 192 | } 193 | 194 | function c(b) { 195 | return this.each(function () { 196 | var c = a(this), e = c.data("bs.collapse"), f = a.extend({}, d.DEFAULTS, c.data(), "object" == typeof b && b); 197 | !e && f.toggle && /show|hide/.test(b) && (f.toggle = !1), e || c.data("bs.collapse", e = new d(this, f)), "string" == typeof b && e[b]() 198 | }) 199 | } 200 | 201 | var d = function (b, c) { 202 | this.$element = a(b), this.options = a.extend({}, d.DEFAULTS, c), this.$trigger = a('[data-toggle="collapse"][href="#' + b.id + '"],[data-toggle="collapse"][data-target="#' + b.id + '"]'), this.transitioning = null, this.options.parent ? this.$parent = this.getParent() : this.addAriaAndCollapsedClass(this.$element, this.$trigger), this.options.toggle && this.toggle() 203 | }; 204 | d.VERSION = "3.3.5", d.TRANSITION_DURATION = 350, d.DEFAULTS = {toggle: !0}, d.prototype.dimension = function () { 205 | var a = this.$element.hasClass("width"); 206 | return a ? "width" : "height" 207 | }, d.prototype.show = function () { 208 | if (!this.transitioning && !this.$element.hasClass("in")) { 209 | var b, e = this.$parent && this.$parent.children(".panel").children(".in, .collapsing"); 210 | if (!(e && e.length && (b = e.data("bs.collapse"), b && b.transitioning))) { 211 | var f = a.Event("show.bs.collapse"); 212 | if (this.$element.trigger(f), !f.isDefaultPrevented()) { 213 | e && e.length && (c.call(e, "hide"), b || e.data("bs.collapse", null)); 214 | var g = this.dimension(); 215 | this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded", !0), this.$trigger.removeClass("collapsed").attr("aria-expanded", !0), this.transitioning = 1; 216 | var h = function () { 217 | this.$element.removeClass("collapsing").addClass("collapse in")[g](""), this.transitioning = 0, this.$element.trigger("shown.bs.collapse") 218 | }; 219 | if (!a.support.transition)return h.call(this); 220 | var i = a.camelCase(["scroll", g].join("-")); 221 | this.$element.one("bsTransitionEnd", a.proxy(h, this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i]) 222 | } 223 | } 224 | } 225 | }, d.prototype.hide = function () { 226 | if (!this.transitioning && this.$element.hasClass("in")) { 227 | var b = a.Event("hide.bs.collapse"); 228 | if (this.$element.trigger(b), !b.isDefaultPrevented()) { 229 | var c = this.dimension(); 230 | this.$element[c](this.$element[c]())[0].offsetHeight, this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded", !1), this.$trigger.addClass("collapsed").attr("aria-expanded", !1), this.transitioning = 1; 231 | var e = function () { 232 | this.transitioning = 0, this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse") 233 | }; 234 | return a.support.transition ? void this.$element[c](0).one("bsTransitionEnd", a.proxy(e, this)).emulateTransitionEnd(d.TRANSITION_DURATION) : e.call(this) 235 | } 236 | } 237 | }, d.prototype.toggle = function () { 238 | this[this.$element.hasClass("in") ? "hide" : "show"]() 239 | }, d.prototype.getParent = function () { 240 | return a(this.options.parent).find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]').each(a.proxy(function (c, d) { 241 | var e = a(d); 242 | this.addAriaAndCollapsedClass(b(e), e) 243 | }, this)).end() 244 | }, d.prototype.addAriaAndCollapsedClass = function (a, b) { 245 | var c = a.hasClass("in"); 246 | a.attr("aria-expanded", c), b.toggleClass("collapsed", !c).attr("aria-expanded", c) 247 | }; 248 | var e = a.fn.collapse; 249 | a.fn.collapse = c, a.fn.collapse.Constructor = d, a.fn.collapse.noConflict = function () { 250 | return a.fn.collapse = e, this 251 | }, a(document).on("click.bs.collapse.data-api", '[data-toggle="collapse"]', function (d) { 252 | var e = a(this); 253 | e.attr("data-target") || d.preventDefault(); 254 | var f = b(e), g = f.data("bs.collapse"), h = g ? "toggle" : e.data(); 255 | c.call(f, h) 256 | }) 257 | }(jQuery), +function (a) { 258 | "use strict"; 259 | function b(b) { 260 | var c = b.attr("data-target"); 261 | c || (c = b.attr("href"), c = c && /#[A-Za-z]/.test(c) && c.replace(/.*(?=#[^\s]*$)/, "")); 262 | var d = c && a(c); 263 | return d && d.length ? d : b.parent() 264 | } 265 | 266 | function c(c) { 267 | c && 3 === c.which || (a(e).remove(), a(f).each(function () { 268 | var d = a(this), e = b(d), f = {relatedTarget: this}; 269 | e.hasClass("open") && (c && "click" == c.type && /input|textarea/i.test(c.target.tagName) && a.contains(e[0], c.target) || (e.trigger(c = a.Event("hide.bs.dropdown", f)), c.isDefaultPrevented() || (d.attr("aria-expanded", "false"), e.removeClass("open").trigger("hidden.bs.dropdown", f)))) 270 | })) 271 | } 272 | 273 | function d(b) { 274 | return this.each(function () { 275 | var c = a(this), d = c.data("bs.dropdown"); 276 | d || c.data("bs.dropdown", d = new g(this)), "string" == typeof b && d[b].call(c) 277 | }) 278 | } 279 | 280 | var e = ".dropdown-backdrop", f = '[data-toggle="dropdown"]', g = function (b) { 281 | a(b).on("click.bs.dropdown", this.toggle) 282 | }; 283 | g.VERSION = "3.3.5", g.prototype.toggle = function (d) { 284 | var e = a(this); 285 | if (!e.is(".disabled, :disabled")) { 286 | var f = b(e), g = f.hasClass("open"); 287 | if (c(), !g) { 288 | "ontouchstart"in document.documentElement && !f.closest(".navbar-nav").length && a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click", c); 289 | var h = {relatedTarget: this}; 290 | if (f.trigger(d = a.Event("show.bs.dropdown", h)), d.isDefaultPrevented())return; 291 | e.trigger("focus").attr("aria-expanded", "true"), f.toggleClass("open").trigger("shown.bs.dropdown", h) 292 | } 293 | return !1 294 | } 295 | }, g.prototype.keydown = function (c) { 296 | if (/(38|40|27|32)/.test(c.which) && !/input|textarea/i.test(c.target.tagName)) { 297 | var d = a(this); 298 | if (c.preventDefault(), c.stopPropagation(), !d.is(".disabled, :disabled")) { 299 | var e = b(d), g = e.hasClass("open"); 300 | if (!g && 27 != c.which || g && 27 == c.which)return 27 == c.which && e.find(f).trigger("focus"), d.trigger("click"); 301 | var h = " li:not(.disabled):visible a", i = e.find(".dropdown-menu" + h); 302 | if (i.length) { 303 | var j = i.index(c.target); 304 | 38 == c.which && j > 0 && j--, 40 == c.which && j < i.length - 1 && j++, ~j || (j = 0), i.eq(j).trigger("focus") 305 | } 306 | } 307 | } 308 | }; 309 | var h = a.fn.dropdown; 310 | a.fn.dropdown = d, a.fn.dropdown.Constructor = g, a.fn.dropdown.noConflict = function () { 311 | return a.fn.dropdown = h, this 312 | }, a(document).on("click.bs.dropdown.data-api", c).on("click.bs.dropdown.data-api", ".dropdown form", function (a) { 313 | a.stopPropagation() 314 | }).on("click.bs.dropdown.data-api", f, g.prototype.toggle).on("keydown.bs.dropdown.data-api", f, g.prototype.keydown).on("keydown.bs.dropdown.data-api", ".dropdown-menu", g.prototype.keydown) 315 | }(jQuery), +function (a) { 316 | "use strict"; 317 | function b(b, d) { 318 | return this.each(function () { 319 | var e = a(this), f = e.data("bs.modal"), g = a.extend({}, c.DEFAULTS, e.data(), "object" == typeof b && b); 320 | f || e.data("bs.modal", f = new c(this, g)), "string" == typeof b ? f[b](d) : g.show && f.show(d) 321 | }) 322 | } 323 | 324 | var c = function (b, c) { 325 | this.options = c, this.$body = a(document.body), this.$element = a(b), this.$dialog = this.$element.find(".modal-dialog"), this.$backdrop = null, this.isShown = null, this.originalBodyPad = null, this.scrollbarWidth = 0, this.ignoreBackdropClick = !1, this.options.remote && this.$element.find(".modal-content").load(this.options.remote, a.proxy(function () { 326 | this.$element.trigger("loaded.bs.modal") 327 | }, this)) 328 | }; 329 | c.VERSION = "3.3.5", c.TRANSITION_DURATION = 300, c.BACKDROP_TRANSITION_DURATION = 150, c.DEFAULTS = { 330 | backdrop: !0, 331 | keyboard: !0, 332 | show: !0 333 | }, c.prototype.toggle = function (a) { 334 | return this.isShown ? this.hide() : this.show(a) 335 | }, c.prototype.show = function (b) { 336 | var d = this, e = a.Event("show.bs.modal", {relatedTarget: b}); 337 | this.$element.trigger(e), this.isShown || e.isDefaultPrevented() || (this.isShown = !0, this.checkScrollbar(), this.setScrollbar(), this.$body.addClass("modal-open"), this.escape(), this.resize(), this.$element.on("click.dismiss.bs.modal", '[data-dismiss="modal"]', a.proxy(this.hide, this)), this.$dialog.on("mousedown.dismiss.bs.modal", function () { 338 | d.$element.one("mouseup.dismiss.bs.modal", function (b) { 339 | a(b.target).is(d.$element) && (d.ignoreBackdropClick = !0) 340 | }) 341 | }), this.backdrop(function () { 342 | var e = a.support.transition && d.$element.hasClass("fade"); 343 | d.$element.parent().length || d.$element.appendTo(d.$body), d.$element.show().scrollTop(0), d.adjustDialog(), e && d.$element[0].offsetWidth, d.$element.addClass("in"), d.enforceFocus(); 344 | var f = a.Event("shown.bs.modal", {relatedTarget: b}); 345 | e ? d.$dialog.one("bsTransitionEnd", function () { 346 | d.$element.trigger("focus").trigger(f) 347 | }).emulateTransitionEnd(c.TRANSITION_DURATION) : d.$element.trigger("focus").trigger(f) 348 | })) 349 | }, c.prototype.hide = function (b) { 350 | b && b.preventDefault(), b = a.Event("hide.bs.modal"), this.$element.trigger(b), this.isShown && !b.isDefaultPrevented() && (this.isShown = !1, this.escape(), this.resize(), a(document).off("focusin.bs.modal"), this.$element.removeClass("in").off("click.dismiss.bs.modal").off("mouseup.dismiss.bs.modal"), this.$dialog.off("mousedown.dismiss.bs.modal"), a.support.transition && this.$element.hasClass("fade") ? this.$element.one("bsTransitionEnd", a.proxy(this.hideModal, this)).emulateTransitionEnd(c.TRANSITION_DURATION) : this.hideModal()) 351 | }, c.prototype.enforceFocus = function () { 352 | a(document).off("focusin.bs.modal").on("focusin.bs.modal", a.proxy(function (a) { 353 | this.$element[0] === a.target || this.$element.has(a.target).length || this.$element.trigger("focus") 354 | }, this)) 355 | }, c.prototype.escape = function () { 356 | this.isShown && this.options.keyboard ? this.$element.on("keydown.dismiss.bs.modal", a.proxy(function (a) { 357 | 27 == a.which && this.hide() 358 | }, this)) : this.isShown || this.$element.off("keydown.dismiss.bs.modal") 359 | }, c.prototype.resize = function () { 360 | this.isShown ? a(window).on("resize.bs.modal", a.proxy(this.handleUpdate, this)) : a(window).off("resize.bs.modal") 361 | }, c.prototype.hideModal = function () { 362 | var a = this; 363 | this.$element.hide(), this.backdrop(function () { 364 | a.$body.removeClass("modal-open"), a.resetAdjustments(), a.resetScrollbar(), a.$element.trigger("hidden.bs.modal") 365 | }) 366 | }, c.prototype.removeBackdrop = function () { 367 | this.$backdrop && this.$backdrop.remove(), this.$backdrop = null 368 | }, c.prototype.backdrop = function (b) { 369 | var d = this, e = this.$element.hasClass("fade") ? "fade" : ""; 370 | if (this.isShown && this.options.backdrop) { 371 | var f = a.support.transition && e; 372 | if (this.$backdrop = a(document.createElement("div")).addClass("modal-backdrop " + e).appendTo(this.$body), this.$element.on("click.dismiss.bs.modal", a.proxy(function (a) { 373 | return this.ignoreBackdropClick ? void(this.ignoreBackdropClick = !1) : void(a.target === a.currentTarget && ("static" == this.options.backdrop ? this.$element[0].focus() : this.hide())) 374 | }, this)), f && this.$backdrop[0].offsetWidth, this.$backdrop.addClass("in"), !b)return; 375 | f ? this.$backdrop.one("bsTransitionEnd", b).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION) : b() 376 | } else if (!this.isShown && this.$backdrop) { 377 | this.$backdrop.removeClass("in"); 378 | var g = function () { 379 | d.removeBackdrop(), b && b() 380 | }; 381 | a.support.transition && this.$element.hasClass("fade") ? this.$backdrop.one("bsTransitionEnd", g).emulateTransitionEnd(c.BACKDROP_TRANSITION_DURATION) : g() 382 | } else b && b() 383 | }, c.prototype.handleUpdate = function () { 384 | this.adjustDialog() 385 | }, c.prototype.adjustDialog = function () { 386 | var a = this.$element[0].scrollHeight > document.documentElement.clientHeight; 387 | this.$element.css({ 388 | paddingLeft: !this.bodyIsOverflowing && a ? this.scrollbarWidth : "", 389 | paddingRight: this.bodyIsOverflowing && !a ? this.scrollbarWidth : "" 390 | }) 391 | }, c.prototype.resetAdjustments = function () { 392 | this.$element.css({paddingLeft: "", paddingRight: ""}) 393 | }, c.prototype.checkScrollbar = function () { 394 | var a = window.innerWidth; 395 | if (!a) { 396 | var b = document.documentElement.getBoundingClientRect(); 397 | a = b.right - Math.abs(b.left) 398 | } 399 | this.bodyIsOverflowing = document.body.clientWidth < a, this.scrollbarWidth = this.measureScrollbar() 400 | }, c.prototype.setScrollbar = function () { 401 | var a = parseInt(this.$body.css("padding-right") || 0, 10); 402 | this.originalBodyPad = document.body.style.paddingRight || "", this.bodyIsOverflowing && this.$body.css("padding-right", a + this.scrollbarWidth) 403 | }, c.prototype.resetScrollbar = function () { 404 | this.$body.css("padding-right", this.originalBodyPad) 405 | }, c.prototype.measureScrollbar = function () { 406 | var a = document.createElement("div"); 407 | a.className = "modal-scrollbar-measure", this.$body.append(a); 408 | var b = a.offsetWidth - a.clientWidth; 409 | return this.$body[0].removeChild(a), b 410 | }; 411 | var d = a.fn.modal; 412 | a.fn.modal = b, a.fn.modal.Constructor = c, a.fn.modal.noConflict = function () { 413 | return a.fn.modal = d, this 414 | }, a(document).on("click.bs.modal.data-api", '[data-toggle="modal"]', function (c) { 415 | var d = a(this), e = d.attr("href"), f = a(d.attr("data-target") || e && e.replace(/.*(?=#[^\s]+$)/, "")), g = f.data("bs.modal") ? "toggle" : a.extend({remote: !/#/.test(e) && e}, f.data(), d.data()); 416 | d.is("a") && c.preventDefault(), f.one("show.bs.modal", function (a) { 417 | a.isDefaultPrevented() || f.one("hidden.bs.modal", function () { 418 | d.is(":visible") && d.trigger("focus") 419 | }) 420 | }), b.call(f, g, this) 421 | }) 422 | }(jQuery), +function (a) { 423 | "use strict"; 424 | function b(b) { 425 | return this.each(function () { 426 | var d = a(this), e = d.data("bs.tooltip"), f = "object" == typeof b && b; 427 | (e || !/destroy|hide/.test(b)) && (e || d.data("bs.tooltip", e = new c(this, f)), "string" == typeof b && e[b]()) 428 | }) 429 | } 430 | 431 | var c = function (a, b) { 432 | this.type = null, this.options = null, this.enabled = null, this.timeout = null, this.hoverState = null, this.$element = null, this.inState = null, this.init("tooltip", a, b) 433 | }; 434 | c.VERSION = "3.3.5", c.TRANSITION_DURATION = 150, c.DEFAULTS = { 435 | animation: !0, 436 | placement: "top", 437 | selector: !1, 438 | template: '', 439 | trigger: "hover focus", 440 | title: "", 441 | delay: 0, 442 | html: !1, 443 | container: !1, 444 | viewport: {selector: "body", padding: 0} 445 | }, c.prototype.init = function (b, c, d) { 446 | if (this.enabled = !0, this.type = b, this.$element = a(c), this.options = this.getOptions(d), this.$viewport = this.options.viewport && a(a.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : this.options.viewport.selector || this.options.viewport), this.inState = { 447 | click: !1, 448 | hover: !1, 449 | focus: !1 450 | }, this.$element[0]instanceof document.constructor && !this.options.selector)throw new Error("`selector` option must be specified when initializing " + this.type + " on the window.document object!"); 451 | for (var e = this.options.trigger.split(" "), f = e.length; f--;) { 452 | var g = e[f]; 453 | if ("click" == g)this.$element.on("click." + this.type, this.options.selector, a.proxy(this.toggle, this)); else if ("manual" != g) { 454 | var h = "hover" == g ? "mouseenter" : "focusin", i = "hover" == g ? "mouseleave" : "focusout"; 455 | this.$element.on(h + "." + this.type, this.options.selector, a.proxy(this.enter, this)), this.$element.on(i + "." + this.type, this.options.selector, a.proxy(this.leave, this)) 456 | } 457 | } 458 | this.options.selector ? this._options = a.extend({}, this.options, { 459 | trigger: "manual", 460 | selector: "" 461 | }) : this.fixTitle() 462 | }, c.prototype.getDefaults = function () { 463 | return c.DEFAULTS 464 | }, c.prototype.getOptions = function (b) { 465 | return b = a.extend({}, this.getDefaults(), this.$element.data(), b), b.delay && "number" == typeof b.delay && (b.delay = { 466 | show: b.delay, 467 | hide: b.delay 468 | }), b 469 | }, c.prototype.getDelegateOptions = function () { 470 | var b = {}, c = this.getDefaults(); 471 | return this._options && a.each(this._options, function (a, d) { 472 | c[a] != d && (b[a] = d) 473 | }), b 474 | }, c.prototype.enter = function (b) { 475 | var c = b instanceof this.constructor ? b : a(b.currentTarget).data("bs." + this.type); 476 | return c || (c = new this.constructor(b.currentTarget, this.getDelegateOptions()), a(b.currentTarget).data("bs." + this.type, c)), b instanceof a.Event && (c.inState["focusin" == b.type ? "focus" : "hover"] = !0), c.tip().hasClass("in") || "in" == c.hoverState ? void(c.hoverState = "in") : (clearTimeout(c.timeout), c.hoverState = "in", c.options.delay && c.options.delay.show ? void(c.timeout = setTimeout(function () { 477 | "in" == c.hoverState && c.show() 478 | }, c.options.delay.show)) : c.show()) 479 | }, c.prototype.isInStateTrue = function () { 480 | for (var a in this.inState)if (this.inState[a])return !0; 481 | return !1 482 | }, c.prototype.leave = function (b) { 483 | var c = b instanceof this.constructor ? b : a(b.currentTarget).data("bs." + this.type); 484 | return c || (c = new this.constructor(b.currentTarget, this.getDelegateOptions()), a(b.currentTarget).data("bs." + this.type, c)), b instanceof a.Event && (c.inState["focusout" == b.type ? "focus" : "hover"] = !1), c.isInStateTrue() ? void 0 : (clearTimeout(c.timeout), c.hoverState = "out", c.options.delay && c.options.delay.hide ? void(c.timeout = setTimeout(function () { 485 | "out" == c.hoverState && c.hide() 486 | }, c.options.delay.hide)) : c.hide()) 487 | }, c.prototype.show = function () { 488 | var b = a.Event("show.bs." + this.type); 489 | if (this.hasContent() && this.enabled) { 490 | this.$element.trigger(b); 491 | var d = a.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]); 492 | if (b.isDefaultPrevented() || !d)return; 493 | var e = this, f = this.tip(), g = this.getUID(this.type); 494 | this.setContent(), f.attr("id", g), this.$element.attr("aria-describedby", g), this.options.animation && f.addClass("fade"); 495 | var h = "function" == typeof this.options.placement ? this.options.placement.call(this, f[0], this.$element[0]) : this.options.placement, i = /\s?auto?\s?/i, j = i.test(h); 496 | j && (h = h.replace(i, "") || "top"), f.detach().css({ 497 | top: 0, 498 | left: 0, 499 | display: "block" 500 | }).addClass(h).data("bs." + this.type, this), this.options.container ? f.appendTo(this.options.container) : f.insertAfter(this.$element), this.$element.trigger("inserted.bs." + this.type); 501 | var k = this.getPosition(), l = f[0].offsetWidth, m = f[0].offsetHeight; 502 | if (j) { 503 | var n = h, o = this.getPosition(this.$viewport); 504 | h = "bottom" == h && k.bottom + m > o.bottom ? "top" : "top" == h && k.top - m < o.top ? "bottom" : "right" == h && k.right + l > o.width ? "left" : "left" == h && k.left - l < o.left ? "right" : h, f.removeClass(n).addClass(h) 505 | } 506 | var p = this.getCalculatedOffset(h, k, l, m); 507 | this.applyPlacement(p, h); 508 | var q = function () { 509 | var a = e.hoverState; 510 | e.$element.trigger("shown.bs." + e.type), e.hoverState = null, "out" == a && e.leave(e) 511 | }; 512 | a.support.transition && this.$tip.hasClass("fade") ? f.one("bsTransitionEnd", q).emulateTransitionEnd(c.TRANSITION_DURATION) : q() 513 | } 514 | }, c.prototype.applyPlacement = function (b, c) { 515 | var d = this.tip(), e = d[0].offsetWidth, f = d[0].offsetHeight, g = parseInt(d.css("margin-top"), 10), h = parseInt(d.css("margin-left"), 10); 516 | isNaN(g) && (g = 0), isNaN(h) && (h = 0), b.top += g, b.left += h, a.offset.setOffset(d[0], a.extend({ 517 | using: function (a) { 518 | d.css({top: Math.round(a.top), left: Math.round(a.left)}) 519 | } 520 | }, b), 0), d.addClass("in"); 521 | var i = d[0].offsetWidth, j = d[0].offsetHeight; 522 | "top" == c && j != f && (b.top = b.top + f - j); 523 | var k = this.getViewportAdjustedDelta(c, b, i, j); 524 | k.left ? b.left += k.left : b.top += k.top; 525 | var l = /top|bottom/.test(c), m = l ? 2 * k.left - e + i : 2 * k.top - f + j, n = l ? "offsetWidth" : "offsetHeight"; 526 | d.offset(b), this.replaceArrow(m, d[0][n], l) 527 | }, c.prototype.replaceArrow = function (a, b, c) { 528 | this.arrow().css(c ? "left" : "top", 50 * (1 - a / b) + "%").css(c ? "top" : "left", "") 529 | }, c.prototype.setContent = function () { 530 | var a = this.tip(), b = this.getTitle(); 531 | a.find(".tooltip-inner")[this.options.html ? "html" : "text"](b), a.removeClass("fade in top bottom left right") 532 | }, c.prototype.hide = function (b) { 533 | function d() { 534 | "in" != e.hoverState && f.detach(), e.$element.removeAttr("aria-describedby").trigger("hidden.bs." + e.type), b && b() 535 | } 536 | 537 | var e = this, f = a(this.$tip), g = a.Event("hide.bs." + this.type); 538 | return this.$element.trigger(g), g.isDefaultPrevented() ? void 0 : (f.removeClass("in"), a.support.transition && f.hasClass("fade") ? f.one("bsTransitionEnd", d).emulateTransitionEnd(c.TRANSITION_DURATION) : d(), this.hoverState = null, this) 539 | }, c.prototype.fixTitle = function () { 540 | var a = this.$element; 541 | (a.attr("title") || "string" != typeof a.attr("data-original-title")) && a.attr("data-original-title", a.attr("title") || "").attr("title", "") 542 | }, c.prototype.hasContent = function () { 543 | return this.getTitle() 544 | }, c.prototype.getPosition = function (b) { 545 | b = b || this.$element; 546 | var c = b[0], d = "BODY" == c.tagName, e = c.getBoundingClientRect(); 547 | null == e.width && (e = a.extend({}, e, {width: e.right - e.left, height: e.bottom - e.top})); 548 | var f = d ? { 549 | top: 0, 550 | left: 0 551 | } : b.offset(), g = {scroll: d ? document.documentElement.scrollTop || document.body.scrollTop : b.scrollTop()}, h = d ? { 552 | width: a(window).width(), 553 | height: a(window).height() 554 | } : null; 555 | return a.extend({}, e, g, h, f) 556 | }, c.prototype.getCalculatedOffset = function (a, b, c, d) { 557 | return "bottom" == a ? { 558 | top: b.top + b.height, 559 | left: b.left + b.width / 2 - c / 2 560 | } : "top" == a ? { 561 | top: b.top - d, 562 | left: b.left + b.width / 2 - c / 2 563 | } : "left" == a ? {top: b.top + b.height / 2 - d / 2, left: b.left - c} : { 564 | top: b.top + b.height / 2 - d / 2, 565 | left: b.left + b.width 566 | } 567 | }, c.prototype.getViewportAdjustedDelta = function (a, b, c, d) { 568 | var e = {top: 0, left: 0}; 569 | if (!this.$viewport)return e; 570 | var f = this.options.viewport && this.options.viewport.padding || 0, g = this.getPosition(this.$viewport); 571 | if (/right|left/.test(a)) { 572 | var h = b.top - f - g.scroll, i = b.top + f - g.scroll + d; 573 | h < g.top ? e.top = g.top - h : i > g.top + g.height && (e.top = g.top + g.height - i) 574 | } else { 575 | var j = b.left - f, k = b.left + f + c; 576 | j < g.left ? e.left = g.left - j : k > g.right && (e.left = g.left + g.width - k) 577 | } 578 | return e 579 | }, c.prototype.getTitle = function () { 580 | var a, b = this.$element, c = this.options; 581 | return a = b.attr("data-original-title") || ("function" == typeof c.title ? c.title.call(b[0]) : c.title) 582 | }, c.prototype.getUID = function (a) { 583 | do a += ~~(1e6 * Math.random()); while (document.getElementById(a)); 584 | return a 585 | }, c.prototype.tip = function () { 586 | if (!this.$tip && (this.$tip = a(this.options.template), 1 != this.$tip.length))throw new Error(this.type + " `template` option must consist of exactly 1 top-level element!"); 587 | return this.$tip 588 | }, c.prototype.arrow = function () { 589 | return this.$arrow = this.$arrow || this.tip().find(".tooltip-arrow") 590 | }, c.prototype.enable = function () { 591 | this.enabled = !0 592 | }, c.prototype.disable = function () { 593 | this.enabled = !1 594 | }, c.prototype.toggleEnabled = function () { 595 | this.enabled = !this.enabled 596 | }, c.prototype.toggle = function (b) { 597 | var c = this; 598 | b && (c = a(b.currentTarget).data("bs." + this.type), c || (c = new this.constructor(b.currentTarget, this.getDelegateOptions()), a(b.currentTarget).data("bs." + this.type, c))), b ? (c.inState.click = !c.inState.click, c.isInStateTrue() ? c.enter(c) : c.leave(c)) : c.tip().hasClass("in") ? c.leave(c) : c.enter(c) 599 | }, c.prototype.destroy = function () { 600 | var a = this; 601 | clearTimeout(this.timeout), this.hide(function () { 602 | a.$element.off("." + a.type).removeData("bs." + a.type), a.$tip && a.$tip.detach(), a.$tip = null, a.$arrow = null, a.$viewport = null 603 | }) 604 | }; 605 | var d = a.fn.tooltip; 606 | a.fn.tooltip = b, a.fn.tooltip.Constructor = c, a.fn.tooltip.noConflict = function () { 607 | return a.fn.tooltip = d, this 608 | } 609 | }(jQuery), +function (a) { 610 | "use strict"; 611 | function b(b) { 612 | return this.each(function () { 613 | var d = a(this), e = d.data("bs.popover"), f = "object" == typeof b && b; 614 | (e || !/destroy|hide/.test(b)) && (e || d.data("bs.popover", e = new c(this, f)), "string" == typeof b && e[b]()) 615 | }) 616 | } 617 | 618 | var c = function (a, b) { 619 | this.init("popover", a, b) 620 | }; 621 | if (!a.fn.tooltip)throw new Error("Popover requires tooltip.js"); 622 | c.VERSION = "3.3.5", c.DEFAULTS = a.extend({}, a.fn.tooltip.Constructor.DEFAULTS, { 623 | placement: "right", 624 | trigger: "click", 625 | content: "", 626 | template: '' 627 | }), c.prototype = a.extend({}, a.fn.tooltip.Constructor.prototype), c.prototype.constructor = c, c.prototype.getDefaults = function () { 628 | return c.DEFAULTS 629 | }, c.prototype.setContent = function () { 630 | var a = this.tip(), b = this.getTitle(), c = this.getContent(); 631 | a.find(".popover-title")[this.options.html ? "html" : "text"](b), a.find(".popover-content").children().detach().end()[this.options.html ? "string" == typeof c ? "html" : "append" : "text"](c), a.removeClass("fade top bottom left right in"), a.find(".popover-title").html() || a.find(".popover-title").hide() 632 | }, c.prototype.hasContent = function () { 633 | return this.getTitle() || this.getContent() 634 | }, c.prototype.getContent = function () { 635 | var a = this.$element, b = this.options; 636 | return a.attr("data-content") || ("function" == typeof b.content ? b.content.call(a[0]) : b.content) 637 | }, c.prototype.arrow = function () { 638 | return this.$arrow = this.$arrow || this.tip().find(".arrow") 639 | }; 640 | var d = a.fn.popover; 641 | a.fn.popover = b, a.fn.popover.Constructor = c, a.fn.popover.noConflict = function () { 642 | return a.fn.popover = d, this 643 | } 644 | }(jQuery), +function (a) { 645 | "use strict"; 646 | function b(c, d) { 647 | this.$body = a(document.body), this.$scrollElement = a(a(c).is(document.body) ? window : c), this.options = a.extend({}, b.DEFAULTS, d), this.selector = (this.options.target || "") + " .nav li > a", this.offsets = [], this.targets = [], this.activeTarget = null, this.scrollHeight = 0, this.$scrollElement.on("scroll.bs.scrollspy", a.proxy(this.process, this)), this.refresh(), this.process() 648 | } 649 | 650 | function c(c) { 651 | return this.each(function () { 652 | var d = a(this), e = d.data("bs.scrollspy"), f = "object" == typeof c && c; 653 | e || d.data("bs.scrollspy", e = new b(this, f)), "string" == typeof c && e[c]() 654 | }) 655 | } 656 | 657 | b.VERSION = "3.3.5", b.DEFAULTS = {offset: 10}, b.prototype.getScrollHeight = function () { 658 | return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) 659 | }, b.prototype.refresh = function () { 660 | var b = this, c = "offset", d = 0; 661 | this.offsets = [], this.targets = [], this.scrollHeight = this.getScrollHeight(), a.isWindow(this.$scrollElement[0]) || (c = "position", d = this.$scrollElement.scrollTop()), this.$body.find(this.selector).map(function () { 662 | var b = a(this), e = b.data("target") || b.attr("href"), f = /^#./.test(e) && a(e); 663 | return f && f.length && f.is(":visible") && [[f[c]().top + d, e]] || null 664 | }).sort(function (a, b) { 665 | return a[0] - b[0] 666 | }).each(function () { 667 | b.offsets.push(this[0]), b.targets.push(this[1]) 668 | }) 669 | }, b.prototype.process = function () { 670 | var a, b = this.$scrollElement.scrollTop() + this.options.offset, c = this.getScrollHeight(), d = this.options.offset + c - this.$scrollElement.height(), e = this.offsets, f = this.targets, g = this.activeTarget; 671 | if (this.scrollHeight != c && this.refresh(), b >= d)return g != (a = f[f.length - 1]) && this.activate(a); 672 | if (g && b < e[0])return this.activeTarget = null, this.clear(); 673 | for (a = e.length; a--;)g != f[a] && b >= e[a] && (void 0 === e[a + 1] || b < e[a + 1]) && this.activate(f[a]) 674 | }, b.prototype.activate = function (b) { 675 | this.activeTarget = b, this.clear(); 676 | var c = this.selector + '[data-target="' + b + '"],' + this.selector + '[href="' + b + '"]', d = a(c).parents("li").addClass("active"); 677 | d.parent(".dropdown-menu").length && (d = d.closest("li.dropdown").addClass("active")), 678 | d.trigger("activate.bs.scrollspy") 679 | }, b.prototype.clear = function () { 680 | a(this.selector).parentsUntil(this.options.target, ".active").removeClass("active") 681 | }; 682 | var d = a.fn.scrollspy; 683 | a.fn.scrollspy = c, a.fn.scrollspy.Constructor = b, a.fn.scrollspy.noConflict = function () { 684 | return a.fn.scrollspy = d, this 685 | }, a(window).on("load.bs.scrollspy.data-api", function () { 686 | a('[data-spy="scroll"]').each(function () { 687 | var b = a(this); 688 | c.call(b, b.data()) 689 | }) 690 | }) 691 | }(jQuery), +function (a) { 692 | "use strict"; 693 | function b(b) { 694 | return this.each(function () { 695 | var d = a(this), e = d.data("bs.tab"); 696 | e || d.data("bs.tab", e = new c(this)), "string" == typeof b && e[b]() 697 | }) 698 | } 699 | 700 | var c = function (b) { 701 | this.element = a(b) 702 | }; 703 | c.VERSION = "3.3.5", c.TRANSITION_DURATION = 150, c.prototype.show = function () { 704 | var b = this.element, c = b.closest("ul:not(.dropdown-menu)"), d = b.data("target"); 705 | if (d || (d = b.attr("href"), d = d && d.replace(/.*(?=#[^\s]*$)/, "")), !b.parent("li").hasClass("active")) { 706 | var e = c.find(".active:last a"), f = a.Event("hide.bs.tab", {relatedTarget: b[0]}), g = a.Event("show.bs.tab", {relatedTarget: e[0]}); 707 | if (e.trigger(f), b.trigger(g), !g.isDefaultPrevented() && !f.isDefaultPrevented()) { 708 | var h = a(d); 709 | this.activate(b.closest("li"), c), this.activate(h, h.parent(), function () { 710 | e.trigger({type: "hidden.bs.tab", relatedTarget: b[0]}), b.trigger({ 711 | type: "shown.bs.tab", 712 | relatedTarget: e[0] 713 | }) 714 | }) 715 | } 716 | } 717 | }, c.prototype.activate = function (b, d, e) { 718 | function f() { 719 | g.removeClass("active").find("> .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded", !1), b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded", !0), h ? (b[0].offsetWidth, b.addClass("in")) : b.removeClass("fade"), b.parent(".dropdown-menu").length && b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded", !0), e && e() 720 | } 721 | 722 | var g = d.find("> .active"), h = e && a.support.transition && (g.length && g.hasClass("fade") || !!d.find("> .fade").length); 723 | g.length && h ? g.one("bsTransitionEnd", f).emulateTransitionEnd(c.TRANSITION_DURATION) : f(), g.removeClass("in") 724 | }; 725 | var d = a.fn.tab; 726 | a.fn.tab = b, a.fn.tab.Constructor = c, a.fn.tab.noConflict = function () { 727 | return a.fn.tab = d, this 728 | }; 729 | var e = function (c) { 730 | c.preventDefault(), b.call(a(this), "show") 731 | }; 732 | a(document).on("click.bs.tab.data-api", '[data-toggle="tab"]', e).on("click.bs.tab.data-api", '[data-toggle="pill"]', e) 733 | }(jQuery), +function (a) { 734 | "use strict"; 735 | function b(b) { 736 | return this.each(function () { 737 | var d = a(this), e = d.data("bs.affix"), f = "object" == typeof b && b; 738 | e || d.data("bs.affix", e = new c(this, f)), "string" == typeof b && e[b]() 739 | }) 740 | } 741 | 742 | var c = function (b, d) { 743 | this.options = a.extend({}, c.DEFAULTS, d), this.$target = a(this.options.target).on("scroll.bs.affix.data-api", a.proxy(this.checkPosition, this)).on("click.bs.affix.data-api", a.proxy(this.checkPositionWithEventLoop, this)), this.$element = a(b), this.affixed = null, this.unpin = null, this.pinnedOffset = null, this.checkPosition() 744 | }; 745 | c.VERSION = "3.3.5", c.RESET = "affix affix-top affix-bottom", c.DEFAULTS = { 746 | offset: 0, 747 | target: window 748 | }, c.prototype.getState = function (a, b, c, d) { 749 | var e = this.$target.scrollTop(), f = this.$element.offset(), g = this.$target.height(); 750 | if (null != c && "top" == this.affixed)return c > e ? "top" : !1; 751 | if ("bottom" == this.affixed)return null != c ? e + this.unpin <= f.top ? !1 : "bottom" : a - d >= e + g ? !1 : "bottom"; 752 | var h = null == this.affixed, i = h ? e : f.top, j = h ? g : b; 753 | return null != c && c >= e ? "top" : null != d && i + j >= a - d ? "bottom" : !1 754 | }, c.prototype.getPinnedOffset = function () { 755 | if (this.pinnedOffset)return this.pinnedOffset; 756 | this.$element.removeClass(c.RESET).addClass("affix"); 757 | var a = this.$target.scrollTop(), b = this.$element.offset(); 758 | return this.pinnedOffset = b.top - a 759 | }, c.prototype.checkPositionWithEventLoop = function () { 760 | setTimeout(a.proxy(this.checkPosition, this), 1) 761 | }, c.prototype.checkPosition = function () { 762 | if (this.$element.is(":visible")) { 763 | var b = this.$element.height(), d = this.options.offset, e = d.top, f = d.bottom, g = Math.max(a(document).height(), a(document.body).height()); 764 | "object" != typeof d && (f = e = d), "function" == typeof e && (e = d.top(this.$element)), "function" == typeof f && (f = d.bottom(this.$element)); 765 | var h = this.getState(g, b, e, f); 766 | if (this.affixed != h) { 767 | null != this.unpin && this.$element.css("top", ""); 768 | var i = "affix" + (h ? "-" + h : ""), j = a.Event(i + ".bs.affix"); 769 | if (this.$element.trigger(j), j.isDefaultPrevented())return; 770 | this.affixed = h, this.unpin = "bottom" == h ? this.getPinnedOffset() : null, this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix", "affixed") + ".bs.affix") 771 | } 772 | "bottom" == h && this.$element.offset({top: g - b - f}) 773 | } 774 | }; 775 | var d = a.fn.affix; 776 | a.fn.affix = b, a.fn.affix.Constructor = c, a.fn.affix.noConflict = function () { 777 | return a.fn.affix = d, this 778 | }, a(window).on("load", function () { 779 | a('[data-spy="affix"]').each(function () { 780 | var c = a(this), d = c.data(); 781 | d.offset = d.offset || {}, null != d.offsetBottom && (d.offset.bottom = d.offsetBottom), null != d.offsetTop && (d.offset.top = d.offsetTop), b.call(c, d) 782 | }) 783 | }) 784 | }(jQuery); -------------------------------------------------------------------------------- /src/test/java/com/visualpathit/account/controllerTest/SampleTest.java: -------------------------------------------------------------------------------- 1 | package com.visualpathit.account.controllerTest; 2 | 3 | import static org.junit.Assert.assertEquals; 4 | 5 | import org.junit.Test; 6 | 7 | public class SampleTest { 8 | @Test 9 | public void SampleTestHappyFlow(){ 10 | assertEquals("Hello".length(), 5); 11 | } 12 | 13 | } 14 | --------------------------------------------------------------------------------