Commit 7fa6e71b7c44ff2201db9ab3b51b520c731236c3

Authored by Paul Brodner
0 parents
Exists in master

init

Showing 36 changed files with 10676 additions and 0 deletions   Show diff stats
... ... @@ -0,0 +1,121 @@
  1 +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2 + xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  3 + <modelVersion>4.0.0</modelVersion>
  4 +
  5 + <groupId>org.alfresco</groupId>
  6 + <artifactId>tas-environments</artifactId>
  7 + <version>0.0.1-SNAPSHOT</version>
  8 + <packaging>jar</packaging>
  9 +
  10 + <name>tas-environments</name>
  11 + <url>http://maven.apache.org</url>
  12 +
  13 + <properties>
  14 + <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  15 + <jdk.version>1.8</jdk.version>
  16 + <tas.utility.version>1.0.5-SNAPSHOT</tas.utility.version>
  17 +
  18 + <spark.version>2.3</spark.version>
  19 + <spark.freemarker-template.version>2.3</spark.freemarker-template.version>
  20 + <spring.version>4.2.0.RELEASE</spring.version>
  21 + <spring.mongo.version>1.9.1.RELEASE</spring.mongo.version>
  22 + </properties>
  23 +
  24 + <dependencies>
  25 +
  26 + <!-- alfresco tester settings -->
  27 + <dependency>
  28 + <groupId>org.alfresco.tas</groupId>
  29 + <artifactId>utility</artifactId>
  30 + <version>${tas.utility.version}</version>
  31 + <exclusions>
  32 + <exclusion>
  33 + <artifactId>slf4j-api</artifactId>
  34 + <groupId>org.slf4j</groupId>
  35 + </exclusion>
  36 + <exclusion>
  37 + <groupId>org.slf4j</groupId>
  38 + <artifactId>slf4j-log4j12</artifactId>
  39 + </exclusion>
  40 + <exclusion>
  41 + <groupId>log4j</groupId>
  42 + <artifactId>log4j</artifactId>
  43 + </exclusion>
  44 + </exclusions>
  45 + </dependency>
  46 +
  47 + <!-- DB Context MONGO -->
  48 + <dependency>
  49 + <groupId>org.springframework.data</groupId>
  50 + <artifactId>spring-data-mongodb</artifactId>
  51 + <version>1.9.5.RELEASE</version>
  52 + </dependency>
  53 +
  54 + <!-- SPARK -->
  55 + <dependency>
  56 + <groupId>com.sparkjava</groupId>
  57 + <artifactId>spark-core</artifactId>
  58 + <version>${spark.version}</version>
  59 + </dependency>
  60 +
  61 + <dependency>
  62 + <groupId>com.sparkjava</groupId>
  63 + <artifactId>spark-template-freemarker</artifactId>
  64 + <version>${spark.freemarker-template.version}</version>
  65 + </dependency>
  66 +
  67 + <!-- Spring Core -->
  68 + <dependency>
  69 + <groupId>org.springframework</groupId>
  70 + <artifactId>spring-core</artifactId>
  71 + <version>${spring.version}</version>
  72 + </dependency>
  73 +
  74 + <!-- Spring Context -->
  75 + <dependency>
  76 + <groupId>org.springframework</groupId>
  77 + <artifactId>spring-context</artifactId>
  78 + <version>${spring.version}</version>
  79 + </dependency>
  80 +
  81 + <!-- Spring BEANS fixing: NoClassDefFoundError: org/springframework/beans/factory/SmartInitializingSingleton -->
  82 + <dependency>
  83 + <groupId>org.springframework</groupId>
  84 + <artifactId>spring-beans</artifactId>
  85 + <version>${spring.version}</version>
  86 + </dependency>
  87 + </dependencies>
  88 +
  89 + <build>
  90 + <plugins>
  91 + <plugin>
  92 + <groupId>org.apache.maven.plugins</groupId>
  93 + <artifactId>maven-compiler-plugin</artifactId>
  94 + <version>3.5.1</version>
  95 + <configuration>
  96 + <source>1.8</source>
  97 + <target>1.8</target>
  98 + </configuration>
  99 + </plugin>
  100 +
  101 + <plugin>
  102 + <groupId>org.codehaus.mojo</groupId>
  103 + <artifactId>exec-maven-plugin</artifactId>
  104 + <version>1.2.1</version>
  105 + <executions>
  106 + <execution>
  107 + <goals>
  108 + <goal>java</goal>
  109 + </goals>
  110 + </execution>
  111 + </executions>
  112 + <configuration>
  113 + <mainClass>org.alfresco.tasenvironment.App</mainClass>
  114 + <arguments>
  115 + </arguments>
  116 + </configuration>
  117 + </plugin>
  118 + </plugins>
  119 +
  120 + </build>
  121 +</project>
... ...
src/main/java/org/alfresco/tasenvironment/App.java
... ... @@ -0,0 +1,22 @@
  1 +package org.alfresco.tasenvironment;
  2 +
  3 +import org.springframework.context.annotation.AnnotationConfigApplicationContext;
  4 +import org.springframework.context.annotation.ComponentScan;
  5 +import org.springframework.context.annotation.Configuration;
  6 +import org.springframework.context.annotation.ImportResource;
  7 +import org.springframework.data.mongodb.repository.config.EnableMongoRepositories;
  8 +
  9 +@Configuration
  10 +@EnableMongoRepositories
  11 +@ImportResource(value = "environments-context.xml")
  12 +@ComponentScan({ "org.alfresco.tasenvironment"})
  13 +public class App
  14 +{
  15 + public static void main(String[] args)
  16 + {
  17 + @SuppressWarnings("resource")
  18 + AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(App.class);
  19 + ctx.getBean(AppRoutes.class);
  20 + ctx.registerShutdownHook();
  21 + }
  22 +}
... ...
src/main/java/org/alfresco/tasenvironment/AppRoutes.java
... ... @@ -0,0 +1,45 @@
  1 +package org.alfresco.tasenvironment;
  2 +
  3 +import static spark.Spark.get;
  4 +import static spark.Spark.post;
  5 +
  6 +import org.alfresco.tasenvironment.controller.IndexController;
  7 +import org.alfresco.tasenvironment.helper.ViewContainerHelper;
  8 +import org.springframework.beans.factory.annotation.Autowired;
  9 +import org.springframework.stereotype.Service;
  10 +
  11 +import spark.Spark;
  12 +import spark.template.freemarker.FreeMarkerEngine;
  13 +
  14 +/**
  15 + * @author pbrodner
  16 + */
  17 +@Service
  18 +public class AppRoutes
  19 +{
  20 + public final static String layoutTemplate = "layout.ftl";
  21 +
  22 + @Autowired
  23 + IndexController indexController;
  24 +
  25 + public AppRoutes(int port)
  26 + {
  27 + Spark.staticFileLocation("/public");
  28 + Spark.port(8080);
  29 +
  30 + get("/", (request, response) -> {
  31 + return indexController.environments().toLayout();
  32 + }, new FreeMarkerEngine());
  33 +
  34 + get("/environment/new", (request, response) -> {
  35 + return indexController.addNew().toLayout();
  36 + }, new FreeMarkerEngine());
  37 +
  38 + post("/environment/new", (request, response) -> {
  39 + ViewContainerHelper mv = indexController.create(request);
  40 + mv.addAttribute("response", response);
  41 + return mv.toLayout();
  42 + }, new FreeMarkerEngine());
  43 + }
  44 +
  45 +}
... ...
src/main/java/org/alfresco/tasenvironment/controller/IndexController.java
... ... @@ -0,0 +1,42 @@
  1 +package org.alfresco.tasenvironment.controller;
  2 +
  3 +import org.alfresco.tasenvironment.helper.ViewContainerHelper;
  4 +import org.alfresco.tasenvironment.models.Environment;
  5 +import org.alfresco.tasenvironment.models.EnvironmentRepository;
  6 +import org.springframework.beans.factory.annotation.Autowired;
  7 +import org.springframework.stereotype.Service;
  8 +
  9 +import spark.Request;
  10 +
  11 +/**
  12 + * @author pbrodner
  13 + */
  14 +@Service
  15 +public class IndexController
  16 +{
  17 + @Autowired
  18 + EnvironmentRepository environmentRepo;
  19 +
  20 + public ViewContainerHelper environments()
  21 + {
  22 + ViewContainerHelper vt = new ViewContainerHelper("Environments", "environment/index.ftl");
  23 + Iterable<Environment> environments = environmentRepo.findAll();
  24 +
  25 + vt.addAttribute("environments", environments);
  26 + return vt;
  27 + }
  28 +
  29 + public ViewContainerHelper addNew()
  30 + {
  31 + return new ViewContainerHelper("Add Environment", "environment/new.ftl");
  32 + }
  33 +
  34 + public ViewContainerHelper create(Request request)
  35 + {
  36 + Environment newEnv = environmentRepo.save(new Environment(request.queryParams("envName"), request.queryParams("envIP"), request.queryParams("envPort")));
  37 +
  38 + ViewContainerHelper vc = new ViewContainerHelper("New Environment", "environment/response.ftl");
  39 + vc.addAttribute("object", newEnv);
  40 + return vc;
  41 + }
  42 +}
... ...
src/main/java/org/alfresco/tasenvironment/helper/AlertHelper.java
... ... @@ -0,0 +1,26 @@
  1 +package org.alfresco.tasenvironment.helper;
  2 +
  3 +import java.util.HashMap;
  4 +import java.util.Map;
  5 +
  6 +public class AlertHelper
  7 +{
  8 + public enum Type
  9 + {
  10 + SUCCESS, INFO, WARNING, DANGER
  11 + }
  12 +
  13 + Map<String, Object> alertAttributes;
  14 +
  15 + public AlertHelper(Type alertType, String alertMessage)
  16 + {
  17 + alertAttributes = new HashMap<String, Object>();
  18 + alertAttributes.put("alertType", alertType);
  19 + alertAttributes.put("alertMessage", alertMessage);
  20 + }
  21 +
  22 + public Map<String, Object> getAlertAttributes()
  23 + {
  24 + return alertAttributes;
  25 + }
  26 +}
... ...
src/main/java/org/alfresco/tasenvironment/helper/ViewContainerHelper.java
... ... @@ -0,0 +1,75 @@
  1 +package org.alfresco.tasenvironment.helper;
  2 +
  3 +import java.util.HashMap;
  4 +import java.util.Map;
  5 +
  6 +import spark.ModelAndView;
  7 +
  8 +/**
  9 + * Handle generation of ModelAndView objects
  10 + * Map key, value attributes that will be used further on view templates.
  11 + * Just instantiate this class with a templateName (e.g. index.ftl) - the view
  12 + * should exist in the resource folder
  13 + *
  14 + * @author pbrodner
  15 + */
  16 +public class ViewContainerHelper
  17 +{
  18 + Map<String, Object> viewAttributes;
  19 +
  20 + public ViewContainerHelper(String pageTitle, String templateName)
  21 + {
  22 + viewAttributes = new HashMap<String, Object>();
  23 + viewAttributes.put("pageTitle", pageTitle);
  24 + viewAttributes.put("templateName", templateName);
  25 + }
  26 +
  27 + public void addAttribute(String key, Object value)
  28 + {
  29 + viewAttributes.put(key, value);
  30 + }
  31 +
  32 + public Map<String, Object> getViewAttributes()
  33 + {
  34 + return viewAttributes;
  35 + }
  36 +
  37 + public ModelAndView toLayout()
  38 + {
  39 + return new ModelAndView(getViewAttributes(), "layout.ftl");
  40 + }
  41 +
  42 + @Override
  43 + public String toString()
  44 + {
  45 + return String.format("Generating view toLayout: %s", viewAttributes.toString());
  46 + }
  47 +
  48 + /**
  49 + * Just a helper to define a new alert and inject it in current view
  50 + * attributes
  51 + *
  52 + * @param alertType
  53 + * @param alertMessage
  54 + * @return
  55 + */
  56 + public ViewContainerHelper withAlert(AlertHelper.Type alertType, String alertMessage)
  57 + {
  58 + AlertHelper alert = new AlertHelper(alertType, alertMessage);
  59 + return withAlert(alert);
  60 + }
  61 +
  62 + /**
  63 + * Just a helper to define a new alert object and inject its detail to
  64 + * current view
  65 + *
  66 + * @param alert
  67 + * @return
  68 + */
  69 + public ViewContainerHelper withAlert(AlertHelper alert)
  70 + {
  71 + viewAttributes.putAll(alert.getAlertAttributes());
  72 + return this;
  73 + }
  74 +
  75 +}
... ...
src/main/java/org/alfresco/tasenvironment/models/Environment.java
... ... @@ -0,0 +1,113 @@
  1 +package org.alfresco.tasenvironment.models;
  2 +
  3 +import org.alfresco.utility.network.ServerHealth;
  4 +import org.springframework.data.annotation.Id;
  5 +import org.springframework.data.annotation.PersistenceConstructor;
  6 +import org.springframework.data.mongodb.core.mapping.Document;
  7 +
  8 +/**
  9 + * @author pbrodner
  10 + */
  11 +@Document(collection = "environments")
  12 +public class Environment
  13 +{
  14 + @Id
  15 + private String id;
  16 +
  17 + private String name;
  18 + private String ip;
  19 + private String port;
  20 +
  21 + @PersistenceConstructor
  22 + public Environment(String name, String ip, String port)
  23 + {
  24 + setName(name);
  25 + setIp(ip);
  26 + setPort(port);
  27 + }
  28 +
  29 + public String getName()
  30 + {
  31 + return name;
  32 + }
  33 +
  34 + public void setName(String name)
  35 + {
  36 + this.name = name;
  37 + }
  38 +
  39 + public String getIp()
  40 + {
  41 + return ip;
  42 + }
  43 +
  44 + public void setIp(String ip)
  45 + {
  46 + this.ip = ip;
  47 + }
  48 +
  49 + public String getPort()
  50 + {
  51 + return port;
  52 + }
  53 +
  54 + public void setPort(String port)
  55 + {
  56 + this.port = port;
  57 + }
  58 +
  59 + public void setId(String id)
  60 + {
  61 + this.id = id;
  62 + }
  63 +
  64 + public String getId()
  65 + {
  66 + return id;
  67 + }
  68 +
  69 + @Override
  70 + public String toString()
  71 + {
  72 + return String.format("Environment [id=%s, name=%s, ip=%s]", getId(), getName(), getId());
  73 + }
  74 +
  75 + public String getAlfrescoPath()
  76 + {
  77 + return String.format("http://%s:%s/alfresco", getIp(), getPort());
  78 + }
  79 +
  80 + public String getSharePath()
  81 + {
  82 + return String.format("http://%s:%s/share", getIp(), getPort());
  83 + }
  84 +
  85 + public String getStatus()
  86 + {
  87 + boolean isOnline = false;
  88 + try
  89 + {
  90 + ServerHealth serverHealth = new ServerHealth();
  91 + isOnline = serverHealth.isServerReachable(getIp(), Integer.valueOf(getPort()));
  92 + }
  93 + catch (Exception e)
  94 + {
  95 + e.printStackTrace();
  96 + }
  97 +
  98 + if (isOnline)
  99 + return getOnlineIcon();
  100 + else
  101 + return getOfflineIcon();
  102 + }
  103 +
  104 + public String getOnlineIcon()
  105 + {
  106 + return "<span class=\"glyphicon glyphicon-upload btn-success\" style=\"float:right\"></span>";
  107 + }
  108 +
  109 + public String getOfflineIcon()
  110 + {
  111 + return "<span class=\"glyphicon glyphicon-download btn-danger\" style=\"float:right\"></span>";
  112 + }
  113 +}
0 114 \ No newline at end of file
... ...
src/main/java/org/alfresco/tasenvironment/models/EnvironmentRepository.java
... ... @@ -0,0 +1,12 @@
  1 +package org.alfresco.tasenvironment.models;
  2 +
  3 +import org.springframework.data.repository.PagingAndSortingRepository;
  4 +import org.springframework.stereotype.Repository;
  5 +
  6 +/**
  7 + * @author pbrodner
  8 + */
  9 +@Repository
  10 +public interface EnvironmentRepository extends PagingAndSortingRepository<Environment, Long>
  11 +{
  12 +}
... ...
src/main/resources/default.properties
... ... @@ -0,0 +1,11 @@
  1 +#
  2 +# MongodDB configuration
  3 +#
  4 +mongo.host=127.0.0.1
  5 +mongo.port=27017
  6 +mongo.database=tas-environments
  7 +
  8 +#
  9 +# Spark Web App configuration
  10 +#
  11 +webapp.port=8080
0 12 \ No newline at end of file
... ...
src/main/resources/environments-context.xml
... ... @@ -0,0 +1,28 @@
  1 +<beans xmlns="http://www.springframework.org/schema/beans"
  2 + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
  3 + xmlns:mongo="http://www.springframework.org/schema/data/mongo"
  4 + xsi:schemaLocation="http://www.springframework.org/schema/context
  5 + http://www.springframework.org/schema/context/spring-context-4.0.xsd
  6 + http://www.springframework.org/schema/data/mongo
  7 + http://www.springframework.org/schema/data/mongo/spring-mongo-1.0.xsd
  8 + http://www.springframework.org/schema/beans
  9 + http://www.springframework.org/schema/beans/spring-beans-4.0.xsd">
  10 +
  11 + <context:property-placeholder location="default.properties"
  12 + ignore-unresolvable="true" />
  13 +
  14 + <bean id="appRoutes" class="org.alfresco.tasenvironment.AppRoutes">
  15 + <constructor-arg name="port" value="${webapp.port}" />
  16 + </bean>
  17 +
  18 + <mongo:mongo host="${mongo.host}" port="${mongo.port}" />
  19 + <mongo:db-factory dbname="${mongo.database}" />
  20 +
  21 + <bean id="mongoTemplate" class="org.springframework.data.mongodb.core.MongoTemplate">
  22 + <constructor-arg name="mongoDbFactory" ref="mongoDbFactory" />
  23 + </bean>
  24 +
  25 +
  26 + <mongo:repositories base-package="org.alfresco.models.*Repository" />
  27 +
  28 +</beans>
0 29 \ No newline at end of file
... ...
src/main/resources/log4j.properties
... ... @@ -0,0 +1,17 @@
  1 +# Root logger option
  2 +log4j.rootLogger=ERROR, stdout, file
  3 +
  4 +# Redirect log messages to console
  5 +log4j.appender.stdout=org.apache.log4j.ConsoleAppender
  6 +log4j.appender.stdout.Target=System.out
  7 +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
  8 +log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
  9 +
  10 +# Redirect log messages to a log file
  11 +log4j.appender.file=org.apache.log4j.RollingFileAppender
  12 +
  13 +log4j.appender.file.File=tas-environments.log
  14 +log4j.appender.file.MaxFileSize=5MB
  15 +log4j.appender.file.MaxBackupIndex=10
  16 +log4j.appender.file.layout=org.apache.log4j.PatternLayout
  17 +log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n
0 18 \ No newline at end of file
... ...
src/main/resources/public/css/bootstrap-theme.css
... ... @@ -0,0 +1,587 @@
  1 +/*!
  2 + * Bootstrap v3.3.6 (http://getbootstrap.com)
  3 + * Copyright 2011-2015 Twitter, Inc.
  4 + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
  5 + */
  6 +.btn-default,
  7 +.btn-primary,
  8 +.btn-success,
  9 +.btn-info,
  10 +.btn-warning,
  11 +.btn-danger {
  12 + text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);
  13 + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
  14 + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);
  15 +}
  16 +.btn-default:active,
  17 +.btn-primary:active,
  18 +.btn-success:active,
  19 +.btn-info:active,
  20 +.btn-warning:active,
  21 +.btn-danger:active,
  22 +.btn-default.active,
  23 +.btn-primary.active,
  24 +.btn-success.active,
  25 +.btn-info.active,
  26 +.btn-warning.active,
  27 +.btn-danger.active {
  28 + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
  29 + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);
  30 +}
  31 +.btn-default.disabled,
  32 +.btn-primary.disabled,
  33 +.btn-success.disabled,
  34 +.btn-info.disabled,
  35 +.btn-warning.disabled,
  36 +.btn-danger.disabled,
  37 +.btn-default[disabled],
  38 +.btn-primary[disabled],
  39 +.btn-success[disabled],
  40 +.btn-info[disabled],
  41 +.btn-warning[disabled],
  42 +.btn-danger[disabled],
  43 +fieldset[disabled] .btn-default,
  44 +fieldset[disabled] .btn-primary,
  45 +fieldset[disabled] .btn-success,
  46 +fieldset[disabled] .btn-info,
  47 +fieldset[disabled] .btn-warning,
  48 +fieldset[disabled] .btn-danger {
  49 + -webkit-box-shadow: none;
  50 + box-shadow: none;
  51 +}
  52 +.btn-default .badge,
  53 +.btn-primary .badge,
  54 +.btn-success .badge,
  55 +.btn-info .badge,
  56 +.btn-warning .badge,
  57 +.btn-danger .badge {
  58 + text-shadow: none;
  59 +}
  60 +.btn:active,
  61 +.btn.active {
  62 + background-image: none;
  63 +}
  64 +.btn-default {
  65 + text-shadow: 0 1px 0 #fff;
  66 + background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);
  67 + background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);
  68 + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0));
  69 + background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);
  70 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);
  71 + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
  72 + background-repeat: repeat-x;
  73 + border-color: #dbdbdb;
  74 + border-color: #ccc;
  75 +}
  76 +.btn-default:hover,
  77 +.btn-default:focus {
  78 + background-color: #e0e0e0;
  79 + background-position: 0 -15px;
  80 +}
  81 +.btn-default:active,
  82 +.btn-default.active {
  83 + background-color: #e0e0e0;
  84 + border-color: #dbdbdb;
  85 +}
  86 +.btn-default.disabled,
  87 +.btn-default[disabled],
  88 +fieldset[disabled] .btn-default,
  89 +.btn-default.disabled:hover,
  90 +.btn-default[disabled]:hover,
  91 +fieldset[disabled] .btn-default:hover,
  92 +.btn-default.disabled:focus,
  93 +.btn-default[disabled]:focus,
  94 +fieldset[disabled] .btn-default:focus,
  95 +.btn-default.disabled.focus,
  96 +.btn-default[disabled].focus,
  97 +fieldset[disabled] .btn-default.focus,
  98 +.btn-default.disabled:active,
  99 +.btn-default[disabled]:active,
  100 +fieldset[disabled] .btn-default:active,
  101 +.btn-default.disabled.active,
  102 +.btn-default[disabled].active,
  103 +fieldset[disabled] .btn-default.active {
  104 + background-color: #e0e0e0;
  105 + background-image: none;
  106 +}
  107 +.btn-primary {
  108 + background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);
  109 + background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);
  110 + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88));
  111 + background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);
  112 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);
  113 + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
  114 + background-repeat: repeat-x;
  115 + border-color: #245580;
  116 +}
  117 +.btn-primary:hover,
  118 +.btn-primary:focus {
  119 + background-color: #265a88;
  120 + background-position: 0 -15px;
  121 +}
  122 +.btn-primary:active,
  123 +.btn-primary.active {
  124 + background-color: #265a88;
  125 + border-color: #245580;
  126 +}
  127 +.btn-primary.disabled,
  128 +.btn-primary[disabled],
  129 +fieldset[disabled] .btn-primary,
  130 +.btn-primary.disabled:hover,
  131 +.btn-primary[disabled]:hover,
  132 +fieldset[disabled] .btn-primary:hover,
  133 +.btn-primary.disabled:focus,
  134 +.btn-primary[disabled]:focus,
  135 +fieldset[disabled] .btn-primary:focus,
  136 +.btn-primary.disabled.focus,
  137 +.btn-primary[disabled].focus,
  138 +fieldset[disabled] .btn-primary.focus,
  139 +.btn-primary.disabled:active,
  140 +.btn-primary[disabled]:active,
  141 +fieldset[disabled] .btn-primary:active,
  142 +.btn-primary.disabled.active,
  143 +.btn-primary[disabled].active,
  144 +fieldset[disabled] .btn-primary.active {
  145 + background-color: #265a88;
  146 + background-image: none;
  147 +}
  148 +.btn-success {
  149 + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);
  150 + background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);
  151 + background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641));
  152 + background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);
  153 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);
  154 + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
  155 + background-repeat: repeat-x;
  156 + border-color: #3e8f3e;
  157 +}
  158 +.btn-success:hover,
  159 +.btn-success:focus {
  160 + background-color: #419641;
  161 + background-position: 0 -15px;
  162 +}
  163 +.btn-success:active,
  164 +.btn-success.active {
  165 + background-color: #419641;
  166 + border-color: #3e8f3e;
  167 +}
  168 +.btn-success.disabled,
  169 +.btn-success[disabled],
  170 +fieldset[disabled] .btn-success,
  171 +.btn-success.disabled:hover,
  172 +.btn-success[disabled]:hover,
  173 +fieldset[disabled] .btn-success:hover,
  174 +.btn-success.disabled:focus,
  175 +.btn-success[disabled]:focus,
  176 +fieldset[disabled] .btn-success:focus,
  177 +.btn-success.disabled.focus,
  178 +.btn-success[disabled].focus,
  179 +fieldset[disabled] .btn-success.focus,
  180 +.btn-success.disabled:active,
  181 +.btn-success[disabled]:active,
  182 +fieldset[disabled] .btn-success:active,
  183 +.btn-success.disabled.active,
  184 +.btn-success[disabled].active,
  185 +fieldset[disabled] .btn-success.active {
  186 + background-color: #419641;
  187 + background-image: none;
  188 +}
  189 +.btn-info {
  190 + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
  191 + background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
  192 + background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2));
  193 + background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);
  194 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);
  195 + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
  196 + background-repeat: repeat-x;
  197 + border-color: #28a4c9;
  198 +}
  199 +.btn-info:hover,
  200 +.btn-info:focus {
  201 + background-color: #2aabd2;
  202 + background-position: 0 -15px;
  203 +}
  204 +.btn-info:active,
  205 +.btn-info.active {
  206 + background-color: #2aabd2;
  207 + border-color: #28a4c9;
  208 +}
  209 +.btn-info.disabled,
  210 +.btn-info[disabled],
  211 +fieldset[disabled] .btn-info,
  212 +.btn-info.disabled:hover,
  213 +.btn-info[disabled]:hover,
  214 +fieldset[disabled] .btn-info:hover,
  215 +.btn-info.disabled:focus,
  216 +.btn-info[disabled]:focus,
  217 +fieldset[disabled] .btn-info:focus,
  218 +.btn-info.disabled.focus,
  219 +.btn-info[disabled].focus,
  220 +fieldset[disabled] .btn-info.focus,
  221 +.btn-info.disabled:active,
  222 +.btn-info[disabled]:active,
  223 +fieldset[disabled] .btn-info:active,
  224 +.btn-info.disabled.active,
  225 +.btn-info[disabled].active,
  226 +fieldset[disabled] .btn-info.active {
  227 + background-color: #2aabd2;
  228 + background-image: none;
  229 +}
  230 +.btn-warning {
  231 + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
  232 + background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
  233 + background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316));
  234 + background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);
  235 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);
  236 + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
  237 + background-repeat: repeat-x;
  238 + border-color: #e38d13;
  239 +}
  240 +.btn-warning:hover,
  241 +.btn-warning:focus {
  242 + background-color: #eb9316;
  243 + background-position: 0 -15px;
  244 +}
  245 +.btn-warning:active,
  246 +.btn-warning.active {
  247 + background-color: #eb9316;
  248 + border-color: #e38d13;
  249 +}
  250 +.btn-warning.disabled,
  251 +.btn-warning[disabled],
  252 +fieldset[disabled] .btn-warning,
  253 +.btn-warning.disabled:hover,
  254 +.btn-warning[disabled]:hover,
  255 +fieldset[disabled] .btn-warning:hover,
  256 +.btn-warning.disabled:focus,
  257 +.btn-warning[disabled]:focus,
  258 +fieldset[disabled] .btn-warning:focus,
  259 +.btn-warning.disabled.focus,
  260 +.btn-warning[disabled].focus,
  261 +fieldset[disabled] .btn-warning.focus,
  262 +.btn-warning.disabled:active,
  263 +.btn-warning[disabled]:active,
  264 +fieldset[disabled] .btn-warning:active,
  265 +.btn-warning.disabled.active,
  266 +.btn-warning[disabled].active,
  267 +fieldset[disabled] .btn-warning.active {
  268 + background-color: #eb9316;
  269 + background-image: none;
  270 +}
  271 +.btn-danger {
  272 + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
  273 + background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
  274 + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a));
  275 + background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);
  276 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);
  277 + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
  278 + background-repeat: repeat-x;
  279 + border-color: #b92c28;
  280 +}
  281 +.btn-danger:hover,
  282 +.btn-danger:focus {
  283 + background-color: #c12e2a;
  284 + background-position: 0 -15px;
  285 +}
  286 +.btn-danger:active,
  287 +.btn-danger.active {
  288 + background-color: #c12e2a;
  289 + border-color: #b92c28;
  290 +}
  291 +.btn-danger.disabled,
  292 +.btn-danger[disabled],
  293 +fieldset[disabled] .btn-danger,
  294 +.btn-danger.disabled:hover,
  295 +.btn-danger[disabled]:hover,
  296 +fieldset[disabled] .btn-danger:hover,
  297 +.btn-danger.disabled:focus,
  298 +.btn-danger[disabled]:focus,
  299 +fieldset[disabled] .btn-danger:focus,
  300 +.btn-danger.disabled.focus,
  301 +.btn-danger[disabled].focus,
  302 +fieldset[disabled] .btn-danger.focus,
  303 +.btn-danger.disabled:active,
  304 +.btn-danger[disabled]:active,
  305 +fieldset[disabled] .btn-danger:active,
  306 +.btn-danger.disabled.active,
  307 +.btn-danger[disabled].active,
  308 +fieldset[disabled] .btn-danger.active {
  309 + background-color: #c12e2a;
  310 + background-image: none;
  311 +}
  312 +.thumbnail,
  313 +.img-thumbnail {
  314 + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
  315 + box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
  316 +}
  317 +.dropdown-menu > li > a:hover,
  318 +.dropdown-menu > li > a:focus {
  319 + background-color: #e8e8e8;
  320 + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
  321 + background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
  322 + background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8));
  323 + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
  324 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);
  325 + background-repeat: repeat-x;
  326 +}
  327 +.dropdown-menu > .active > a,
  328 +.dropdown-menu > .active > a:hover,
  329 +.dropdown-menu > .active > a:focus {
  330 + background-color: #2e6da4;
  331 + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
  332 + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
  333 + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
  334 + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
  335 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
  336 + background-repeat: repeat-x;
  337 +}
  338 +.navbar-default {
  339 + background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);
  340 + background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%);
  341 + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8));
  342 + background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%);
  343 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);
  344 + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
  345 + background-repeat: repeat-x;
  346 + border-radius: 4px;
  347 + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
  348 + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);
  349 +}
  350 +.navbar-default .navbar-nav > .open > a,
  351 +.navbar-default .navbar-nav > .active > a {
  352 + background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
  353 + background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);
  354 + background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2));
  355 + background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);
  356 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);
  357 + background-repeat: repeat-x;
  358 + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
  359 + box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);
  360 +}
  361 +.navbar-brand,
  362 +.navbar-nav > li > a {
  363 + text-shadow: 0 1px 0 rgba(255, 255, 255, .25);
  364 +}
  365 +.navbar-inverse {
  366 + background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);
  367 + background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);
  368 + background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222));
  369 + background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);
  370 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);
  371 + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
  372 + background-repeat: repeat-x;
  373 + border-radius: 4px;
  374 +}
  375 +.navbar-inverse .navbar-nav > .open > a,
  376 +.navbar-inverse .navbar-nav > .active > a {
  377 + background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);
  378 + background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);
  379 + background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f));
  380 + background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);
  381 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);
  382 + background-repeat: repeat-x;
  383 + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
  384 + box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);
  385 +}
  386 +.navbar-inverse .navbar-brand,
  387 +.navbar-inverse .navbar-nav > li > a {
  388 + text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);
  389 +}
  390 +.navbar-static-top,
  391 +.navbar-fixed-top,
  392 +.navbar-fixed-bottom {
  393 + border-radius: 0;
  394 +}
  395 +@media (max-width: 767px) {
  396 + .navbar .navbar-nav .open .dropdown-menu > .active > a,
  397 + .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,
  398 + .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {
  399 + color: #fff;
  400 + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
  401 + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);
  402 + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4));
  403 + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);
  404 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);
  405 + background-repeat: repeat-x;
  406 + }
  407 +}
  408 +.alert {
  409 + text-shadow: 0 1px 0 rgba(255, 255, 255, .2);
  410 + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
  411 + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);
  412 +}
  413 +.alert-success {
  414 + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
  415 + background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
  416 + background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc));
  417 + background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);
  418 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);
  419 + background-repeat: repeat-x;
  420 + border-color: #b2dba1;
  421 +}
  422 +.alert-info {
  423 + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
  424 + background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
  425 + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0));
  426 + background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);
  427 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);
  428 + background-repeat: repeat-x;
  429 + border-color: #9acfea;
  430 +}
  431 +.alert-warning {
  432 + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
  433 + background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
  434 + background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0));
  435 + background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);
  436 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);
  437 + background-repeat: repeat-x;
  438 + border-color: #f5e79e;
  439 +}
  440 +.alert-danger {
  441 + background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
  442 + background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
  443 + background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3));
  444 + background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);
  445 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);
  446 + background-repeat: repeat-x;
  447 + border-color: #dca7a7;
  448 +}
  449 +.progress {
  450 + background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
  451 + background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
  452 + background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5));
  453 + background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);
  454 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);
  455 + background-repeat: repeat-x;
  456 +}
  457 +.progress-bar {
  458 + background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);
  459 + background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);
  460 + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090));
  461 + background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);
  462 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);
  463 + background-repeat: repeat-x;
  464 +}
  465 +.progress-bar-success {
  466 + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);
  467 + background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);
  468 + background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44));
  469 + background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);
  470 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);
  471 + background-repeat: repeat-x;
  472 +}
  473 +.progress-bar-info {
  474 + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
  475 + background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
  476 + background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5));
  477 + background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);
  478 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);
  479 + background-repeat: repeat-x;
  480 +}
  481 +.progress-bar-warning {
  482 + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
  483 + background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
  484 + background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f));
  485 + background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);
  486 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);
  487 + background-repeat: repeat-x;
  488 +}
  489 +.progress-bar-danger {
  490 + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);
  491 + background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);
  492 + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c));
  493 + background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);
  494 + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);
  495 + background-repeat: repeat-x;
  496 +}
  497 +.progress-bar-striped {
  498 + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
  499 + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
  500 + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent);
  501 +}
  502 +.list-group {
  503 + border-radius: 4px;
  504 + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
  505 + box-shadow: 0 1px 2px rgba(0, 0, 0, .075);
  506 +}
  507 +.list-group-item.active,
  508