diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..2ea54b5 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,3 @@ +*.js linguist-language=java +*.css linguist-language=java +*.html linguist-language=java \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2cc611e --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +*.iml +target/ +.idea/ +~/ diff --git a/.ignore b/.ignore new file mode 100644 index 0000000..e69de29 diff --git a/childpassmanage/.gitignore b/childpassmanage/.gitignore new file mode 100644 index 0000000..a2a3040 --- /dev/null +++ b/childpassmanage/.gitignore @@ -0,0 +1,31 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/** +!**/src/test/** + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ + +### VS Code ### +.vscode/ diff --git a/childpassmanage/.mvn/wrapper/MavenWrapperDownloader.java b/childpassmanage/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 0000000..a45eb6b --- /dev/null +++ b/childpassmanage/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,118 @@ +/* + * Copyright 2007-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.net.*; +import java.io.*; +import java.nio.channels.*; +import java.util.Properties; + +public class MavenWrapperDownloader { + + private static final String WRAPPER_VERSION = "0.5.6"; + /** + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. + */ + private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" + + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; + + /** + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to + * use instead of the default one. + */ + private static final String MAVEN_WRAPPER_PROPERTIES_PATH = + ".mvn/wrapper/maven-wrapper.properties"; + + /** + * Path where the maven-wrapper.jar will be saved to. + */ + private static final String MAVEN_WRAPPER_JAR_PATH = + ".mvn/wrapper/maven-wrapper.jar"; + + /** + * Name of the property which should be used to override the default download url for the wrapper. + */ + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; + + public static void main(String args[]) { + System.out.println("- Downloader started"); + File baseDirectory = new File(args[0]); + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); + + // If the maven-wrapper.properties exists, read it and check if it contains a custom + // wrapperUrl parameter. + File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); + String url = DEFAULT_DOWNLOAD_URL; + if (mavenWrapperPropertyFile.exists()) { + FileInputStream mavenWrapperPropertyFileInputStream = null; + try { + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); + Properties mavenWrapperProperties = new Properties(); + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); + } catch (IOException e) { + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); + } finally { + try { + if (mavenWrapperPropertyFileInputStream != null) { + mavenWrapperPropertyFileInputStream.close(); + } + } catch (IOException e) { + // Ignore ... + } + } + } + System.out.println("- Downloading from: " + url); + + File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); + if (!outputFile.getParentFile().exists()) { + if (!outputFile.getParentFile().mkdirs()) { + System.out.println( + "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); + } + } + System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); + try { + downloadFileFromURL(url, outputFile); + System.out.println("Done"); + System.exit(0); + } catch (Throwable e) { + System.out.println("- Error downloading"); + e.printStackTrace(); + System.exit(1); + } + } + + private static void downloadFileFromURL(String urlString, File destination) throws Exception { + if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { + String username = System.getenv("MVNW_USERNAME"); + char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); + Authenticator.setDefault(new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(username, password); + } + }); + } + URL website = new URL(urlString); + ReadableByteChannel rbc; + rbc = Channels.newChannel(website.openStream()); + FileOutputStream fos = new FileOutputStream(destination); + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + fos.close(); + rbc.close(); + } + +} diff --git a/childpassmanage/.mvn/wrapper/maven-wrapper.jar b/childpassmanage/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000..2cc7d4a Binary files /dev/null and b/childpassmanage/.mvn/wrapper/maven-wrapper.jar differ diff --git a/childpassmanage/.mvn/wrapper/maven-wrapper.properties b/childpassmanage/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..642d572 --- /dev/null +++ b/childpassmanage/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar diff --git a/childpassmanage/mvnw b/childpassmanage/mvnw new file mode 100644 index 0000000..a16b543 --- /dev/null +++ b/childpassmanage/mvnw @@ -0,0 +1,310 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/childpassmanage/mvnw.cmd b/childpassmanage/mvnw.cmd new file mode 100644 index 0000000..c8d4337 --- /dev/null +++ b/childpassmanage/mvnw.cmd @@ -0,0 +1,182 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + +FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/childpassmanage/pom.xml b/childpassmanage/pom.xml new file mode 100644 index 0000000..aba947a --- /dev/null +++ b/childpassmanage/pom.xml @@ -0,0 +1,105 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.2.6.RELEASE + + + com.childpassmanage + childpassmanage + 0.0.1-SNAPSHOT + childpassmanage + + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + + org.springframework.boot + spring-boot-devtools + runtime + true + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + test + + + org.junit.vintage + junit-vintage-engine + + + + + tk.mybatis + mapper-spring-boot-starter + 2.1.5 + + + org.bouncycastle + bcprov-jdk15on + 1.68 + + + commons-codec + commons-codec + + + mysql + mysql-connector-java + 8.0.19 + + + org.apache.httpcomponents + httpclient + 4.5.10 + + + commons-lang + commons-lang + 2.6 + + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + + + central + aliyun maven + http://maven.aliyun.com/nexus/content/groups/public/ + default + + + true + + + + false + + + + diff --git a/childpassmanage/src/main/java/com/childpassmanage/net/ChildpassmanageApplication.java b/childpassmanage/src/main/java/com/childpassmanage/net/ChildpassmanageApplication.java new file mode 100644 index 0000000..136e96c --- /dev/null +++ b/childpassmanage/src/main/java/com/childpassmanage/net/ChildpassmanageApplication.java @@ -0,0 +1,15 @@ +package com.childpassmanage.net; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import tk.mybatis.spring.annotation.MapperScan; + +@SpringBootApplication +@MapperScan("com.childpassmanage.net.dao") +public class ChildpassmanageApplication { + + public static void main(String[] args) { + SpringApplication.run(ChildpassmanageApplication.class, args); + } + +} diff --git a/childpassmanage/src/main/java/com/childpassmanage/net/controller/LinkUpassServerController.java b/childpassmanage/src/main/java/com/childpassmanage/net/controller/LinkUpassServerController.java new file mode 100644 index 0000000..f185a28 --- /dev/null +++ b/childpassmanage/src/main/java/com/childpassmanage/net/controller/LinkUpassServerController.java @@ -0,0 +1,113 @@ +package com.childpassmanage.net.controller; + +import com.childpassmanage.net.dao.KeyPassMapper; +import com.childpassmanage.net.pojo.KeyPassPO; +import com.childpassmanage.net.pojo.UserNamePO; +import com.childpassmanage.net.service.KeyPassServie; +import com.childpassmanage.net.service.SM4PubService; +import com.childpassmanage.net.service.UserNameService; +import com.childpassmanage.net.utils.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.*; + +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Controller +public class LinkUpassServerController { + + + @Autowired + private UserNameService userNameService; + + @Autowired + private KeyPassMapper keyPassMapper; + + @Autowired + private SM4PubService sm4PubService; + + @RequestMapping(value = "/remote/getSessionKey",method = RequestMethod.POST) + @ResponseBody + public R getUserPublicKey(@RequestParam("username")String username,@RequestParam("password")String password) throws Exception { + boolean userNameIfExist = userNameService.findUserNameIfExist(username); + if (userNameIfExist) { + HashMap hashMap = new HashMap<>(); + String sessionkey = Sm4Util.generateKey(); + hashMap.put("sessionkey", sessionkey); + hashMap.put("username", username); + HttpUtils.post("http://localhost:18088/us-admin/remote/saveUserSM4KEY", hashMap); + return R.ok().put("sessionkey", sessionkey); + } else { + return R.error(); + } + } + + @RequestMapping("/remote/setUserName/{username}") + public void setUserName(@PathVariable("username")String userName) throws Exception { + PCIKeyPair pciKeyPair = SM2Util.genKeyPair(); + String priKey = pciKeyPair.getPriKey(); + String pubKey = pciKeyPair.getPubKey(); + sm4PubService.insertPubKey(pubKey,userName); + UserNamePO userNamePO = new UserNamePO(); + userNamePO.setUserName(userName); + userNamePO.setCreateDate(new Date()); + userNamePO.setIfClose(0); + userNamePO.setPriKey(priKey); + userNameService.insertUserName(userNamePO); + } + + @RequestMapping("/remote/getSM2Pub/{username}") + @ResponseBody + public R getSM4Pub(@PathVariable("username")String username){ + String pubKey =sm4PubService.getSM4PubByUserName(username); + return R.ok().put("pubKey", pubKey); + } + + @RequestMapping("/remote/getSM2Pri/{username}") + @ResponseBody + public R getSM4Pri(@PathVariable("username")String username){ + String pubKey =userNameService.getSM4PriByUserName(username); + return R.ok().put("priKey", pubKey); + } + + @RequestMapping("/remote/savekeypass/{username}") + @ResponseBody + public R saveKeyPass(@PathVariable("username")String username,@RequestParam("keyPass")String keyPass){ + KeyPassPO keyPassPO = new KeyPassPO(); + Map split = Shamir.split(Integer.parseInt(keyPass)); + keyPassPO.setDian0(split.get("dian[0]")); + keyPassPO.setDian1(split.get("dian[1]")); + keyPassPO.setDian2(split.get("dian[2]")); + keyPassPO.setF0(split.get("f[0]")); + keyPassPO.setF1(split.get("f[1]")); + keyPassPO.setF2(split.get("f[2]")); + keyPassPO.setP(split.get("p")); + keyPassPO.setUsername(username); + keyPassMapper.insert(keyPassPO); + return R.ok().put("flag", "true"); + } + + @RequestMapping("/remote/getKeyPass/{username}") + @ResponseBody + public R getKeyPass(@PathVariable("username")String username){ + KeyPassPO keyPassPO = new KeyPassPO(); + keyPassPO.setUsername(username); + List select = keyPassMapper.select(keyPassPO); + KeyPassPO keyPassPO1 = select.get(0); + Map hashMap = new HashMap<>(); + hashMap.put("dian[0]", keyPassPO1.getDian0()); + hashMap.put("dian[1]", keyPassPO1.getDian1()); + hashMap.put("dian[2]", keyPassPO1.getDian2()); + hashMap.put("f[0]", keyPassPO1.getF0()); + hashMap.put("f[1]", keyPassPO1.getF1()); + hashMap.put("f[2]", keyPassPO1.getF2()); + hashMap.put("p", keyPassPO1.getP()); + long combine = Shamir.combine(hashMap); + String keyByPass = ThroughUserkey.getKeyByPass(combine+""); + return R.ok().put("keyPass",keyByPass); + } + +} diff --git a/childpassmanage/src/main/java/com/childpassmanage/net/controller/RandomStringController.java b/childpassmanage/src/main/java/com/childpassmanage/net/controller/RandomStringController.java new file mode 100644 index 0000000..3be817e --- /dev/null +++ b/childpassmanage/src/main/java/com/childpassmanage/net/controller/RandomStringController.java @@ -0,0 +1,60 @@ +package com.childpassmanage.net.controller; + +import com.childpassmanage.net.dao.KeyPassMapper; +import com.childpassmanage.net.pojo.KeyPassPO; +import com.childpassmanage.net.service.RandomService; +import com.childpassmanage.net.utils.*; +import org.apache.commons.lang.RandomStringUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.ResponseBody; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Controller +public class RandomStringController { + + @Autowired + private RandomService randomService; + + @Autowired + private KeyPassMapper keyPassMapper; + + @RequestMapping(value = "remote/ranstr/{userName}/{keyId}",method = RequestMethod.GET) + @ResponseBody + public R getRandomString(@PathVariable("userName") String userName,@PathVariable("keyId")String keyId) throws Exception { + String sm4Key = Sm4Util.generateKey(); + R r = new R(); + r.put("random", sm4Key); + KeyPassPO keyPassPO = new KeyPassPO(); + keyPassPO.setUsername(userName); + List select = keyPassMapper.select(keyPassPO); + KeyPassPO keyPassPO1 = select.get(0); + Map hashMap = new HashMap<>(); + hashMap.put("dian[0]", keyPassPO1.getDian0()); + hashMap.put("dian[1]", keyPassPO1.getDian1()); + hashMap.put("dian[2]", keyPassPO1.getDian2()); + hashMap.put("f[0]", keyPassPO1.getF0()); + hashMap.put("f[1]", keyPassPO1.getF1()); + hashMap.put("f[2]", keyPassPO1.getF2()); + hashMap.put("p", keyPassPO1.getP()); + long combine = Shamir.combine(hashMap); + String keyByPass = ThroughUserkey.getKeyByPass(combine+""); + byte[] encryptSM4key = AESUtil.encrypt(sm4Key, keyByPass); + Boolean flag = randomService.insertRandomStringByUserName(userName,new String(encryptSM4key),keyId); + return flag ? r:R.error(); + } + + + @RequestMapping(value = "remote/ranstr/{keyId}",method = RequestMethod.GET) + @ResponseBody + public R getKeyRanByKeyId(@PathVariable("keyId")String keyId){ + String ranStr = randomService.getRandomStringByKeyId(keyId); + return R.ok().put("ranstr",ranStr); + } +} diff --git a/childpassmanage/src/main/java/com/childpassmanage/net/dao/KeyPairMapper.java b/childpassmanage/src/main/java/com/childpassmanage/net/dao/KeyPairMapper.java new file mode 100644 index 0000000..ca0cefa --- /dev/null +++ b/childpassmanage/src/main/java/com/childpassmanage/net/dao/KeyPairMapper.java @@ -0,0 +1,9 @@ +package com.childpassmanage.net.dao; + +import com.childpassmanage.net.pojo.KeyPairPO; +import org.springframework.stereotype.Component; +import tk.mybatis.mapper.common.Mapper; + +@Component +public interface KeyPairMapper extends Mapper { +} diff --git a/childpassmanage/src/main/java/com/childpassmanage/net/dao/KeyPassMapper.java b/childpassmanage/src/main/java/com/childpassmanage/net/dao/KeyPassMapper.java new file mode 100644 index 0000000..1cec522 --- /dev/null +++ b/childpassmanage/src/main/java/com/childpassmanage/net/dao/KeyPassMapper.java @@ -0,0 +1,9 @@ +package com.childpassmanage.net.dao; + +import com.childpassmanage.net.pojo.KeyPassPO; +import org.springframework.stereotype.Component; +import tk.mybatis.mapper.common.Mapper; + +@Component +public interface KeyPassMapper extends Mapper { +} diff --git a/childpassmanage/src/main/java/com/childpassmanage/net/dao/RandomMapper.java b/childpassmanage/src/main/java/com/childpassmanage/net/dao/RandomMapper.java new file mode 100644 index 0000000..07b4c13 --- /dev/null +++ b/childpassmanage/src/main/java/com/childpassmanage/net/dao/RandomMapper.java @@ -0,0 +1,9 @@ +package com.childpassmanage.net.dao; + +import com.childpassmanage.net.pojo.RandomStringPO; +import org.springframework.stereotype.Component; +import tk.mybatis.mapper.common.Mapper; + +@Component +public interface RandomMapper extends Mapper { +} diff --git a/childpassmanage/src/main/java/com/childpassmanage/net/dao/SM4PubMapper.java b/childpassmanage/src/main/java/com/childpassmanage/net/dao/SM4PubMapper.java new file mode 100644 index 0000000..e6109d1 --- /dev/null +++ b/childpassmanage/src/main/java/com/childpassmanage/net/dao/SM4PubMapper.java @@ -0,0 +1,9 @@ +package com.childpassmanage.net.dao; + +import com.childpassmanage.net.pojo.SM4PubPO; +import org.springframework.stereotype.Component; +import tk.mybatis.mapper.common.Mapper; + +@Component +public interface SM4PubMapper extends Mapper { +} diff --git a/childpassmanage/src/main/java/com/childpassmanage/net/dao/UserNameMapper.java b/childpassmanage/src/main/java/com/childpassmanage/net/dao/UserNameMapper.java new file mode 100644 index 0000000..03e9a8b --- /dev/null +++ b/childpassmanage/src/main/java/com/childpassmanage/net/dao/UserNameMapper.java @@ -0,0 +1,10 @@ +package com.childpassmanage.net.dao; + + +import com.childpassmanage.net.pojo.UserNamePO; +import org.springframework.stereotype.Component; +import tk.mybatis.mapper.common.Mapper; + +@Component +public interface UserNameMapper extends Mapper { +} diff --git a/childpassmanage/src/main/java/com/childpassmanage/net/pojo/AdminUser.java b/childpassmanage/src/main/java/com/childpassmanage/net/pojo/AdminUser.java new file mode 100644 index 0000000..4019e9e --- /dev/null +++ b/childpassmanage/src/main/java/com/childpassmanage/net/pojo/AdminUser.java @@ -0,0 +1,11 @@ +package com.childpassmanage.net.pojo; + +import lombok.Data; + + +@Data +public class AdminUser { + private Integer id; + private String username; + private String password; +} diff --git a/childpassmanage/src/main/java/com/childpassmanage/net/pojo/KeyPairPO.java b/childpassmanage/src/main/java/com/childpassmanage/net/pojo/KeyPairPO.java new file mode 100644 index 0000000..ef71e4f --- /dev/null +++ b/childpassmanage/src/main/java/com/childpassmanage/net/pojo/KeyPairPO.java @@ -0,0 +1,10 @@ +package com.childpassmanage.net.pojo; + +import lombok.Data; + +@Data +public class KeyPairPO { + private Integer id; + private String userName; + private String pubKey; +} diff --git a/childpassmanage/src/main/java/com/childpassmanage/net/pojo/KeyPassPO.java b/childpassmanage/src/main/java/com/childpassmanage/net/pojo/KeyPassPO.java new file mode 100644 index 0000000..12d62e4 --- /dev/null +++ b/childpassmanage/src/main/java/com/childpassmanage/net/pojo/KeyPassPO.java @@ -0,0 +1,19 @@ +package com.childpassmanage.net.pojo; + +import lombok.Data; + +import javax.persistence.Table; + +@Data +@Table(name = "p_passdata") +public class KeyPassPO { + private Integer id; + private String username; + private Long dian0; + private Long dian1; + private Long dian2; + private Long f0; + private Long f1; + private Long f2; + private Long p; +} diff --git a/childpassmanage/src/main/java/com/childpassmanage/net/pojo/RandomStringPO.java b/childpassmanage/src/main/java/com/childpassmanage/net/pojo/RandomStringPO.java new file mode 100644 index 0000000..1124c87 --- /dev/null +++ b/childpassmanage/src/main/java/com/childpassmanage/net/pojo/RandomStringPO.java @@ -0,0 +1,15 @@ +package com.childpassmanage.net.pojo; + +import lombok.Data; + +import javax.persistence.Table; + +@Data +@Table(name = "p_random") +public class RandomStringPO { + private Integer id; + private String userName; + private String randomStr; + private Integer keyId; + +} diff --git a/childpassmanage/src/main/java/com/childpassmanage/net/pojo/SM4PubPO.java b/childpassmanage/src/main/java/com/childpassmanage/net/pojo/SM4PubPO.java new file mode 100644 index 0000000..51af388 --- /dev/null +++ b/childpassmanage/src/main/java/com/childpassmanage/net/pojo/SM4PubPO.java @@ -0,0 +1,13 @@ +package com.childpassmanage.net.pojo; + +import lombok.Data; + +import javax.persistence.Table; + +@Data +@Table(name = "p_sm4pub") +public class SM4PubPO { + private Integer id; + private String pubkey; + private String username; +} diff --git a/childpassmanage/src/main/java/com/childpassmanage/net/pojo/UserNamePO.java b/childpassmanage/src/main/java/com/childpassmanage/net/pojo/UserNamePO.java new file mode 100644 index 0000000..fea7e72 --- /dev/null +++ b/childpassmanage/src/main/java/com/childpassmanage/net/pojo/UserNamePO.java @@ -0,0 +1,16 @@ +package com.childpassmanage.net.pojo; + +import lombok.Data; + +import javax.persistence.Table; +import java.util.Date; + +@Data +@Table(name = "p_username") +public class UserNamePO { + private Integer id; + private String userName; + private Date createDate; + private Integer ifClose; + private String priKey; +} diff --git a/childpassmanage/src/main/java/com/childpassmanage/net/service/KeyPairService.java b/childpassmanage/src/main/java/com/childpassmanage/net/service/KeyPairService.java new file mode 100644 index 0000000..8a1792e --- /dev/null +++ b/childpassmanage/src/main/java/com/childpassmanage/net/service/KeyPairService.java @@ -0,0 +1,12 @@ +package com.childpassmanage.net.service; + +import com.childpassmanage.net.pojo.KeyPairPO; +import org.springframework.stereotype.Service; + + +public interface KeyPairService { + + Integer insertKeyPairByUsername(String username, String priKey); + + KeyPairPO selectKeyPairByUserName(String username); +} diff --git a/childpassmanage/src/main/java/com/childpassmanage/net/service/KeyPassServie.java b/childpassmanage/src/main/java/com/childpassmanage/net/service/KeyPassServie.java new file mode 100644 index 0000000..3634413 --- /dev/null +++ b/childpassmanage/src/main/java/com/childpassmanage/net/service/KeyPassServie.java @@ -0,0 +1,4 @@ +package com.childpassmanage.net.service; + +public interface KeyPassServie { +} diff --git a/childpassmanage/src/main/java/com/childpassmanage/net/service/RandomService.java b/childpassmanage/src/main/java/com/childpassmanage/net/service/RandomService.java new file mode 100644 index 0000000..6eb8e29 --- /dev/null +++ b/childpassmanage/src/main/java/com/childpassmanage/net/service/RandomService.java @@ -0,0 +1,7 @@ +package com.childpassmanage.net.service; + +public interface RandomService { + public Boolean insertRandomStringByUserName(String userName ,String randomKey,String keyId); + public Boolean updateRandomStringByUserNameAndKey(String userName, Integer keyId,String randomStr); + public String getRandomStringByKeyId(String keyId); +} diff --git a/childpassmanage/src/main/java/com/childpassmanage/net/service/SM4PubService.java b/childpassmanage/src/main/java/com/childpassmanage/net/service/SM4PubService.java new file mode 100644 index 0000000..c3bbbfc --- /dev/null +++ b/childpassmanage/src/main/java/com/childpassmanage/net/service/SM4PubService.java @@ -0,0 +1,7 @@ +package com.childpassmanage.net.service; + +public interface SM4PubService { + String getSM4PubByUserName(String username); + + void insertPubKey(String pubKey, String userName); +} diff --git a/childpassmanage/src/main/java/com/childpassmanage/net/service/UserNameService.java b/childpassmanage/src/main/java/com/childpassmanage/net/service/UserNameService.java new file mode 100644 index 0000000..b36c64e --- /dev/null +++ b/childpassmanage/src/main/java/com/childpassmanage/net/service/UserNameService.java @@ -0,0 +1,20 @@ +package com.childpassmanage.net.service; + +import com.childpassmanage.net.pojo.UserNamePO; + +public interface UserNameService { + /** + * 查找用户名是否存在 + * @param username + * @return + */ + boolean findUserNameIfExist(String username); + + /** + * 插入新用户名 + * @param userNamePO + */ + void insertUserName(UserNamePO userNamePO); + + String getSM4PriByUserName(String username); +} diff --git a/childpassmanage/src/main/java/com/childpassmanage/net/service/impl/KeyPairServiceImpl.java b/childpassmanage/src/main/java/com/childpassmanage/net/service/impl/KeyPairServiceImpl.java new file mode 100644 index 0000000..217213a --- /dev/null +++ b/childpassmanage/src/main/java/com/childpassmanage/net/service/impl/KeyPairServiceImpl.java @@ -0,0 +1,33 @@ +package com.childpassmanage.net.service.impl; + +import com.childpassmanage.net.dao.KeyPairMapper; +import com.childpassmanage.net.pojo.KeyPairPO; +import com.childpassmanage.net.service.KeyPairService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class KeyPairServiceImpl implements KeyPairService { + + @Autowired + private KeyPairMapper keyPairMapper; + + @Override + public Integer insertKeyPairByUsername(String username, String priKey) { + KeyPairPO keyPairPO = new KeyPairPO(); + keyPairPO.setUserName(username); + keyPairPO.setPubKey(priKey); + int count = keyPairMapper.insert(keyPairPO); + return count; + } + + @Override + public KeyPairPO selectKeyPairByUserName(String username) { + KeyPairPO keyPairPO = new KeyPairPO(); + keyPairPO.setUserName(username); + KeyPairPO keyPairPOS = keyPairMapper.selectOne(keyPairPO); + return keyPairPOS; + } +} diff --git a/childpassmanage/src/main/java/com/childpassmanage/net/service/impl/KeyPassServiceImpl.java b/childpassmanage/src/main/java/com/childpassmanage/net/service/impl/KeyPassServiceImpl.java new file mode 100644 index 0000000..caf4679 --- /dev/null +++ b/childpassmanage/src/main/java/com/childpassmanage/net/service/impl/KeyPassServiceImpl.java @@ -0,0 +1,8 @@ +package com.childpassmanage.net.service.impl; + +import com.childpassmanage.net.service.KeyPassServie; +import org.springframework.stereotype.Service; + +@Service +public class KeyPassServiceImpl implements KeyPassServie { +} diff --git a/childpassmanage/src/main/java/com/childpassmanage/net/service/impl/RandomServiceImpl.java b/childpassmanage/src/main/java/com/childpassmanage/net/service/impl/RandomServiceImpl.java new file mode 100644 index 0000000..beb83c5 --- /dev/null +++ b/childpassmanage/src/main/java/com/childpassmanage/net/service/impl/RandomServiceImpl.java @@ -0,0 +1,47 @@ +package com.childpassmanage.net.service.impl; + +import com.childpassmanage.net.dao.RandomMapper; +import com.childpassmanage.net.pojo.RandomStringPO; +import com.childpassmanage.net.service.RandomService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional +public class RandomServiceImpl implements RandomService { + + @Autowired + private RandomMapper randomMapper; + + @Override + public Boolean insertRandomStringByUserName(String userName, String randomKey,String keyId) { + RandomStringPO randomStringPO = new RandomStringPO(); + randomStringPO.setRandomStr(randomKey); + randomStringPO.setUserName(userName); + randomStringPO.setKeyId(Integer.parseInt(keyId)); + int insert = randomMapper.insert(randomStringPO); + return insert == 1; + } + + @Override + public Boolean updateRandomStringByUserNameAndKey(String userName, Integer keyId,String randomStr) { + RandomStringPO randomStringPO = new RandomStringPO(); + randomStringPO.setUserName(userName); + randomStringPO.setRandomStr(randomStr); + RandomStringPO randomStringPO1 = randomMapper.selectOne(randomStringPO); + if(randomStringPO1!=null){ + randomStringPO.setKeyId(keyId); + } + int update = randomMapper.updateByPrimaryKey(randomStringPO1); + return update == 1; + } + + @Override + public String getRandomStringByKeyId(String keyId) { + RandomStringPO randomStringPO = new RandomStringPO(); + randomStringPO.setKeyId(Integer.parseInt(keyId)); + RandomStringPO randomString = randomMapper.selectOne(randomStringPO); + return randomString.getRandomStr(); + } +} diff --git a/childpassmanage/src/main/java/com/childpassmanage/net/service/impl/SM4PubServiceImpl.java b/childpassmanage/src/main/java/com/childpassmanage/net/service/impl/SM4PubServiceImpl.java new file mode 100644 index 0000000..befb0f9 --- /dev/null +++ b/childpassmanage/src/main/java/com/childpassmanage/net/service/impl/SM4PubServiceImpl.java @@ -0,0 +1,35 @@ +package com.childpassmanage.net.service.impl; + +import com.childpassmanage.net.dao.SM4PubMapper; +import com.childpassmanage.net.dao.UserNameMapper; +import com.childpassmanage.net.pojo.SM4PubPO; +import com.childpassmanage.net.pojo.UserNamePO; +import com.childpassmanage.net.service.SM4PubService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class SM4PubServiceImpl implements SM4PubService { + + @Autowired + private SM4PubMapper sm4PubMapper; + + + @Override + public String getSM4PubByUserName(String username) { + SM4PubPO sm4PubPO = new SM4PubPO(); + sm4PubPO.setUsername(username); + List select = sm4PubMapper.select(sm4PubPO); + return select.get(0).getPubkey(); + } + + @Override + public void insertPubKey(String pubKey, String userName) { + SM4PubPO sm4PubPO = new SM4PubPO(); + sm4PubPO.setUsername(userName); + sm4PubPO.setPubkey(pubKey); + sm4PubMapper.insert(sm4PubPO); + } +} diff --git a/childpassmanage/src/main/java/com/childpassmanage/net/service/impl/UserNameServiceImpl.java b/childpassmanage/src/main/java/com/childpassmanage/net/service/impl/UserNameServiceImpl.java new file mode 100644 index 0000000..9ad7da2 --- /dev/null +++ b/childpassmanage/src/main/java/com/childpassmanage/net/service/impl/UserNameServiceImpl.java @@ -0,0 +1,42 @@ +package com.childpassmanage.net.service.impl; + +import com.childpassmanage.net.dao.UserNameMapper; +import com.childpassmanage.net.pojo.UserNamePO; +import com.childpassmanage.net.service.UserNameService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Service +@Transactional +public class UserNameServiceImpl implements UserNameService { + @Autowired + private UserNameMapper userMapper; + + @Override + public boolean findUserNameIfExist(String username) { + UserNamePO userNamePO = new UserNamePO(); + userNamePO.setUserName(username); + UserNamePO userNamePO1 = userMapper.selectOne(userNamePO); + if(userNamePO1 != null || userNamePO1.getIfClose() != -1){ + return true; + }else{ + return false; + } + } + + @Override + public void insertUserName(UserNamePO userNamePO) { + userMapper.insert(userNamePO); + } + + @Override + public String getSM4PriByUserName(String username) { + UserNamePO userNamePO = new UserNamePO(); + userNamePO.setUserName(username); + List select = userMapper.select(userNamePO); + return select.get(0).getPriKey(); + } +} diff --git a/childpassmanage/src/main/java/com/childpassmanage/net/utils/AESUtil.java b/childpassmanage/src/main/java/com/childpassmanage/net/utils/AESUtil.java new file mode 100644 index 0000000..5772cc7 --- /dev/null +++ b/childpassmanage/src/main/java/com/childpassmanage/net/utils/AESUtil.java @@ -0,0 +1,82 @@ +package com.childpassmanage.net.utils; + +import javax.crypto.*; +import javax.crypto.spec.SecretKeySpec; +import java.io.UnsupportedEncodingException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; + +public class AESUtil { + /** + * AES加密字符串 + * + * @param content + * 需要被加密的字符串 + * @param password + * 加密需要的密码 + * @return 密文 + */ + public static byte[] encrypt(String content, String password) { + try { + KeyGenerator kgen = KeyGenerator.getInstance("AES");// 创建AES的Key生产者 + kgen.init(128, new SecureRandom(password.getBytes()));// 利用用户密码作为随机数初始化出 + //加密没关系,SecureRandom是生成安全随机数序列,password.getBytes()是种子,只要种子相同,序列就一样,所以解密只要有password就行 + SecretKey secretKey = kgen.generateKey();// 根据用户密码,生成一个密钥 + byte[] enCodeFormat = secretKey.getEncoded();// 返回基本编码格式的密钥,如果此密钥不支持编码,则返回 + SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");// 转换为AES专用密钥 + Cipher cipher = Cipher.getInstance("AES");// 创建密码器 + byte[] byteContent = content.getBytes("utf-8"); + cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化为加密模式的密码器 + byte[] result = cipher.doFinal(byteContent);// 加密 + return result; + } catch (NoSuchPaddingException e) { + e.printStackTrace(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } catch (InvalidKeyException e) { + e.printStackTrace(); + } catch (IllegalBlockSizeException e) { + e.printStackTrace(); + } catch (BadPaddingException e) { + e.printStackTrace(); + } + return null; + } + + /** + * 解密AES加密过的字符串 + * + * @param content + * AES加密过过的内容 + * @param password + * 加密时的密码 + * @return 明文 + */ + public static byte[] decrypt(byte[] content, String password) { + try { + KeyGenerator kgen = KeyGenerator.getInstance("AES");// 创建AES的Key生产者 + kgen.init(128, new SecureRandom(password.getBytes())); + SecretKey secretKey = kgen.generateKey();// 根据用户密码,生成一个密钥 + byte[] enCodeFormat = secretKey.getEncoded();// 返回基本编码格式的密钥 + SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");// 转换为AES专用密钥 + Cipher cipher = Cipher.getInstance("AES");// 创建密码器 + cipher.init(Cipher.DECRYPT_MODE, key);// 初始化为解密模式的密码器 + byte[] result = cipher.doFinal(content); + return result; // 明文 + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (NoSuchPaddingException e) { + e.printStackTrace(); + } catch (InvalidKeyException e) { + e.printStackTrace(); + } catch (IllegalBlockSizeException e) { + e.printStackTrace(); + } catch (BadPaddingException e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/childpassmanage/src/main/java/com/childpassmanage/net/utils/CommonUtils.java b/childpassmanage/src/main/java/com/childpassmanage/net/utils/CommonUtils.java new file mode 100644 index 0000000..97c42e5 --- /dev/null +++ b/childpassmanage/src/main/java/com/childpassmanage/net/utils/CommonUtils.java @@ -0,0 +1,417 @@ +package com.childpassmanage.net.utils; + +import org.springframework.util.StringUtils; + +import java.io.UnsupportedEncodingException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +/** + * @ClassName: CommonUtils + * @Description: 通用工具类 + * @since: 0.0.1 + * @author: dzy + * @date: 2017年2月22日 上午11:46:44 + */ +public class CommonUtils { + + + /** + * @param date 日期 + * @param pattern 模式 如:yyyyMMdd等 + * @return + * @Title: formatDate + * @Description: 格式化日期 + * @since: 0.0.1 + */ + public static String formatDate(Date date, String pattern) { + SimpleDateFormat formatter = new SimpleDateFormat(pattern); + return formatter.format(date); + } + + /** + * @param strDate String类型日期 + * @param pattern 日期显示模式 + * @return + * @Title: parseDate + * @Description: 将String日期转换为Date类型日期 + * @since: 0.0.1 + */ + public static Date parseDate(String strDate, String pattern) { + SimpleDateFormat formatter = null; + if (StringUtils.isEmpty(strDate) || strDate.equals("")) { + return null; + } + formatter = new SimpleDateFormat(pattern); + try { + return formatter.parse(strDate); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * @param date 操作前的日期 + * @param field 日期的部分如:年,月,日 + * @param amount 增加或减少的值(负数表示减少) + * @return + * @Title: dateAdd + * @Description: 日期的加减操作 + * @since: 0.0.1 + */ + public static Date dateAdd(Date date, int field, int amount) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(field, amount); + return calendar.getTime(); + } + + /** + * @param source 源字符串 + * @param offset 填充开始的位置, 0-在左边, source.getBytes().length 在右边, 如果有中文时需小心位置 + * @param c 用于填充的字符 + * @param length 最后字符串的字节长度 + * @return + * @Title: fill + * @Description: 填充字符串, 长度是按字节计算, 不是字符 + * @since: 0.0.1 + */ + public static String fill(String source, int offset, char c, int length) throws UnsupportedEncodingException { + if (null == source) { + source = ""; + } + if (source.getBytes("utf-8").length == length) { + return source; + } + byte[] buf = new byte[length]; + byte[] src = source.getBytes("utf-8"); + if (src.length > length) { + System.arraycopy(src, src.length - length, buf, 0, length); + return new String(buf, "utf-8"); + } + if (offset > src.length) { + offset = src.length; + } else if (offset < 0) { + offset = 0; + } + int n = length - src.length; + + System.arraycopy(src, 0, buf, 0, offset); + for (int i = 0; i < n; i++) { + buf[i + offset] = (byte) c; + } + System.arraycopy(src, offset, buf, offset + n, src.length - offset); + return new String(buf, "utf-8"); + } + + /** + * @param original 原字符串 + * @param offset 填充开始的位置, 0-在左边, original.getBytes().length 在右边, 如果有中文时需小心位置 + * @param length 替换的字节数 + * @param c 用于替换的字符 + * @return + * @Title: replace + * @Description: 替换字符串, 长度是按字节计算, 不是字符 + * @since: 0.0.1 + */ + public static String replace(String original, int offset, int length, char c) throws UnsupportedEncodingException { + if (original == null) { + original = ""; + } + if (original.getBytes("utf-8").length <= offset) { + return original; + } + if (original.getBytes("utf-8").length < offset + length) { + length = original.getBytes("utf-8").length - offset; + } + byte[] buf = new byte[original.length()]; + byte[] src = original.getBytes("utf-8"); + System.arraycopy(src, 0, buf, 0, offset); + + for (int i = offset; i < offset + length; i++) { + buf[i] = (byte) c; + } + System.arraycopy(src, offset + length, buf, offset + length, src.length - offset - length); + return new String(buf, "utf-8"); + } + + /** + * @param s 16进制字符串 + * @return + * @Title: hexToByte + * @Description: 16进制字符串转字节数组 + * @since: 0.0.1 + */ + public static byte[] hexToByte(String s) { + byte[] result = null; + try { + int i = s.length(); +// if (i % 2 == 1) { +// throw new Exception("字符串长度不是偶数."); +// } + if (i % 2 != 0) { + throw new Exception("字符串长度不是偶数."); + } + result = new byte[i / 2]; + for (int j = 0; j < result.length; j++) { + result[j] = (byte) Integer.parseInt(s.substring(j * 2, j * 2 + 2), 16); + } + } catch (Exception e) { + result = null; + e.printStackTrace(); +// log.error("16进制字符串转字节数组时出现异常:", e); + } + return result; + } + + /** + * @param bytes 字节数组 + * @return + * @Title: byte2hexString + * @Description: 字节数组转换为16进制字符串 //0x33 0xD2 0x00 0x46 转换为 "33d20046" 转换和打印报文用 + * @since: 0.0.1 + */ + public static String byte2hexString(byte[] bytes) { + StringBuffer buf = new StringBuffer(bytes.length * 2); + for (int i = 0; i < bytes.length; i++) { + if (((int) bytes[i] & 0xff) < 0x10) { + buf.append("0"); + } + buf.append(Long.toString((int) bytes[i] & 0xff, 16)); + } + return buf.toString().toUpperCase(); + } + + /** + * @param hexString 16进制字符串 如:"33d20046" 转换为 0x33 0xD2 0x00 0x46 + * @return + * @Title: hexString2byte + * @Description: 16进制字符串转字节数组 + * @since: 0.0.1 + */ + public static byte[] hexString2byte(String hexString) { + if (null == hexString || hexString.length() % 2 != 0 || hexString.contains("null")) { + return null; + } + byte[] bytes = new byte[hexString.length() / 2]; + for (int i = 0; i < hexString.length(); i += 2) { + bytes[i / 2] = (byte) (Integer.parseInt(hexString.substring(i, i + 2), 16) & 0xff); + } + return bytes; + } + + /** + * @param i 需要转的int类型数字 + * @return + * @Title: byte1ToBcd2 + * @Description: int类型转BCD码 + * @since: 0.0.1 + */ + public static String byte1ToBcd2(int i) { +// return (new Integer(i / 16).toString() + (new Integer(i % 16)).toString()); + return Integer.toString(i / 16) + Integer.toString(i % 16); + } + + /** + * @param b 字节数组 + * @return + * @Title: byteToHex2 + * @Description: 字节数组转换为16进制字符串 For example, byte[] {0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF} will be changed to String "0123456789ABCDEF" + * @since: 0.0.1 + */ + public static String byteToHex2(byte[] b) { + StringBuffer result = new StringBuffer(); + String tmp = ""; + + for (int i = 0; i < b.length; i++) { + tmp = Integer.toHexString(b[i] & 0xff); + if (tmp.length() == 1) { + result.append("0" + tmp); + } else { + result.append(tmp); + } + } + return result.toString().toUpperCase(); + } + + /** + * @param num 数字 + * @param len 字节数组长度 + * @return + * @Title: intToHexBytes + * @Description: int类型转16进制字节数组 + */ + public static byte[] intToHexBytes(int num, int len) { + byte[] bytes = null; + String hexString = Integer.toHexString(num); + if (len > 0) { + int length = len * 2; + hexString = leftFill(hexString, '0', length); + bytes = CommonUtils.hexString2byte(hexString); + } + return bytes; + } + + private static String leftFill(String hexString, char c, int length) { + StringBuilder stringBuilder = new StringBuilder(); + if(hexString.length() < length){ + for(int count = 0; count getSubElement(byte[] message) { +// Map map = new HashMap(); +// String key = null; +// String value = null; +// int len = 0; +// int idx = 0; +// while (idx < message.length) { +// key = new String(message, idx, 2); +// idx += 2; //取了SE id 移2位 +// len = Integer.parseInt(new String(message, idx, 2)); +// idx += 2; //取了SE id的内容长度 移2位 +// value = new String(message, idx, len); +// map.put(key, value); +// idx += len; +// } +// return map; +// } + + //byte数组转成long + + /** + * @param b 将字节数组转long类型 位置为小端 + * @return + */ + public static long byteToLong(byte[] b) { + long s = 0; + long s0 = b[0] & 0xff;// 最低位 + long s1 = b[1] & 0xff; + long s2 = b[2] & 0xff; + long s3 = b[3] & 0xff; + long s4 = b[4] & 0xff;// 最低位 + long s5 = b[5] & 0xff; + long s6 = b[6] & 0xff; + long s7 = b[7] & 0xff; + + // s0不变 + s1 <<= 8; + s2 <<= 16; + s3 <<= 24; + s4 <<= 8 * 4; + s5 <<= 8 * 5; + s6 <<= 8 * 6; + s7 <<= 8 * 7; + s = s0 | s1 | s2 | s3 | s4 | s5 | s6 | s7; + return s; + } + + /** + * @param b 将字节数组转int类型 位置为小端 + * @return + */ + public static int byteToInt(byte[] b) { + int s = 0; + int s0 = b[0] & 0xff;// 最低位 + int s1 = b[1] & 0xff; + int s2 = b[2] & 0xff; + int s3 = b[3] & 0xff; + + // s0不变 + s1 <<= 8; + s2 <<= 16; + s3 <<= 24; + + s = s0 | s1 | s2 | s3; + return s; + } + + /** + * int类型转换小端的byte数组 + * @param i + * @return + */ + public static byte[] intToLittleBytes(int i) { + ByteBuffer byteBuffer = ByteBuffer.allocate(4); + byteBuffer.order(ByteOrder.LITTLE_ENDIAN); + byteBuffer.asIntBuffer().put(i); + byte[] littleBytes = byteBuffer.array(); + return littleBytes; + } + + /** + * 将一个字节转成10进制 + * @param b + * @return + */ + public static int byteToInt(byte b) { + int value = b & 0xff; + return value; + } + + /** + * 字节数组合并 + * @param bt1 字节数组bt1 + * @param bt2 字节数组bt2 + * @return + */ + public static byte[] byteMerger(byte[] bt1, byte[] bt2){ + byte[] bt3 = new byte[bt1.length+bt2.length]; + System.arraycopy(bt1, 0, bt3, 0, bt1.length); + System.arraycopy(bt2, 0, bt3, bt1.length, bt2.length); + return bt3; + } + +} \ No newline at end of file diff --git a/childpassmanage/src/main/java/com/childpassmanage/net/utils/Generatingkey.java b/childpassmanage/src/main/java/com/childpassmanage/net/utils/Generatingkey.java new file mode 100644 index 0000000..a22c6eb --- /dev/null +++ b/childpassmanage/src/main/java/com/childpassmanage/net/utils/Generatingkey.java @@ -0,0 +1,68 @@ +package com.childpassmanage.net.utils; + +import javax.crypto.KeyGenerator; +import javax.crypto.SecretKey; +import java.security.NoSuchAlgorithmException; + +public class Generatingkey { + /** + 随机生成AES密钥 + * @return + */ + public static String getAESKey() { + String s1; + KeyGenerator kg = null; + try { + kg = KeyGenerator.getInstance("AES"); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + kg.init(128); + //要生成多少位,只需要修改这里即可128, 192或256 + SecretKey sk = kg.generateKey(); + byte[] b = sk.getEncoded(); + s1 = byteToHexString(b); + // System.out.println("随机生成的密钥长度:"+s1.length()*4); + // System.out.println("密钥:"+s1); + return s1; + } + + public static String getDESKey() { + String s1; + KeyGenerator kg = null; + try { + kg = KeyGenerator.getInstance("DES"); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + kg.init(56); + //要生成多少位,只需要修改这里即可128, 192或256 + SecretKey sk = kg.generateKey(); + byte[] b = sk.getEncoded(); + s1 = byteToHexString(b); + // System.out.println("随机生成的密钥长度:"+s1.length()*4); + // System.out.println("密钥:"+s1); + + return s1; + } + + /** + byte数组转化为16进制字符串 + */ + public static String byteToHexString(byte[] bytes) { + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < bytes.length; i++) { + String strHex=Integer.toHexString(bytes[i]); + if(strHex.length() > 3) { + sb.append(strHex.substring(6)); + } else { + if(strHex.length() < 2) { + sb.append("0" + strHex); + } else { + sb.append(strHex); + } + } + } + return sb.toString(); + } +} diff --git a/childpassmanage/src/main/java/com/childpassmanage/net/utils/HttpUtils.java b/childpassmanage/src/main/java/com/childpassmanage/net/utils/HttpUtils.java new file mode 100644 index 0000000..0fcec8b --- /dev/null +++ b/childpassmanage/src/main/java/com/childpassmanage/net/utils/HttpUtils.java @@ -0,0 +1,129 @@ +package com.childpassmanage.net.utils; + +import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpEntity; +import org.apache.http.NameValuePair; +import org.apache.http.client.ResponseHandler; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.BasicResponseHandler; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; + +import java.io.IOException; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Slf4j +public class HttpUtils { + + private static final String ENCODING = "UTF-8"; + + + public static String post(String url, Map paramsMap) { + CloseableHttpClient client = HttpClients.createDefault(); + String responseText = ""; + CloseableHttpResponse response = null; + try { + HttpPost method = new HttpPost(url); + if (paramsMap != null) { + List paramList = new ArrayList(); + for (Map.Entry param : paramsMap.entrySet()) { + NameValuePair pair = new BasicNameValuePair(param.getKey(), param.getValue()); + paramList.add(pair); + } + method.setEntity(new UrlEncodedFormEntity(paramList, ENCODING)); + } + response = client.execute(method); + HttpEntity entity = response.getEntity(); + if (entity != null) { + responseText = EntityUtils.toString(entity); + } + } catch (Exception e) { + log.error("http request failed",e); + } finally { + try { + response.close(); + } catch (Exception e) { + log.error("",e); + } + } + return responseText; + } + + public static String get(String url, Map paramsMap) { + CloseableHttpClient client = HttpClients.createDefault(); + String responseText = ""; + CloseableHttpResponse response = null; + try { + String getUrl = url+"?"; + if (paramsMap != null) { + for (Map.Entry param : paramsMap.entrySet()) { + getUrl += param.getKey() + "=" + URLEncoder.encode(param.getValue(), ENCODING)+"&"; + } + } + HttpGet method = new HttpGet(getUrl); + response = client.execute(method); + HttpEntity entity = response.getEntity(); + if (entity != null) { + responseText = EntityUtils.toString(entity); + } + } catch (Exception e) { + log.error("http request failed",e); + } finally { + try { + response.close(); + } catch (Exception e) { + log.error("",e); + } + } + return responseText; + } + //post请求参数为json格式 + public static String HttpPostWithJson(String url, String json) { + String returnValue = "这是默认返回值,接口调用失败"; + CloseableHttpClient httpClient = HttpClients.createDefault(); + ResponseHandler responseHandler = new BasicResponseHandler(); + try{ + //第一步:创建HttpClient对象 + httpClient = HttpClients.createDefault(); + + //第二步:创建httpPost对象 + HttpPost httpPost = new HttpPost(url); + + //第三步:给httpPost设置JSON格式的参数 + StringEntity requestEntity = new StringEntity(json,"utf-8"); + requestEntity.setContentEncoding("UTF-8"); + httpPost.setHeader("Content-type", "application/json"); + httpPost.setEntity(requestEntity); + + //第四步:发送HttpPost请求,获取返回值 + returnValue = httpClient.execute(httpPost,responseHandler); //调接口获取返回值时,必须用此方法 + + } + catch(Exception e) + { + e.printStackTrace(); + } + + finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + //第五步:处理返回值 + return returnValue; + } + + +} diff --git a/childpassmanage/src/main/java/com/childpassmanage/net/utils/PCIKeyPair.java b/childpassmanage/src/main/java/com/childpassmanage/net/utils/PCIKeyPair.java new file mode 100644 index 0000000..721a7a5 --- /dev/null +++ b/childpassmanage/src/main/java/com/childpassmanage/net/utils/PCIKeyPair.java @@ -0,0 +1,15 @@ +package com.childpassmanage.net.utils; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class PCIKeyPair { + + private String priKey; //私钥 + private String pubKey; //公钥 + +} \ No newline at end of file diff --git a/childpassmanage/src/main/java/com/childpassmanage/net/utils/R.java b/childpassmanage/src/main/java/com/childpassmanage/net/utils/R.java new file mode 100644 index 0000000..edd323d --- /dev/null +++ b/childpassmanage/src/main/java/com/childpassmanage/net/utils/R.java @@ -0,0 +1,49 @@ +package com.childpassmanage.net.utils; + +import java.util.HashMap; +import java.util.Map; + +public class R extends HashMap { + + private static final long serialVersionUID = 1L; + + public R() { + put("code", 200); + } + + public static R error() { + return error(500, "未知异常,请联系管理员"); + } + + public static R error(String msg) { + return error(500, msg); + } + + public static R error(int code, String msg) { + R r = new R(); + r.put("code", code); + r.put("msg", msg); + return r; + } + + public static R ok(String msg) { + R r = new R(); + r.put("msg", msg); + return r; + } + + public static R ok(Map map) { + R r = new R(); + r.putAll(map); + return r; + } + + public static R ok() { + return new R(); + } + + public R put(String key, Object value) { + super.put(key, value); + return this; + } +} \ No newline at end of file diff --git a/childpassmanage/src/main/java/com/childpassmanage/net/utils/RandomUtil.java b/childpassmanage/src/main/java/com/childpassmanage/net/utils/RandomUtil.java new file mode 100644 index 0000000..f37ec36 --- /dev/null +++ b/childpassmanage/src/main/java/com/childpassmanage/net/utils/RandomUtil.java @@ -0,0 +1,156 @@ +package com.childpassmanage.net.utils; + +import java.util.HashSet; +import java.util.Iterator; +import java.util.Random; +import java.util.Set; + +/** + * 工具类-随机数 + */ +public class RandomUtil { + + /** + * 获取从a至z,长度为length随机数 + * + * @return + */ + public static String getRandomStr(int length) { + String base = "abcdefghijklmnopqrstuvwxyz"; + Random random = new Random(); + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < length; i++) { + int number = random.nextInt(base.length()); + sb.append(base.charAt(number)); + } + return sb.toString(); + } + + /** + * 获取范围内int值 + * + * @return + */ + public static int getRandomRange(int max, int min) { + return (int) (Math.random() * (max - min) + min); + } + + /** + * 获取随机长度随机字符 + * + * @param length             base + * @return + */ + public static String getRandomString(int length, String base) { // length表示生成字符串的长度 + Random random = new Random(); + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < length; i++) { + int number = random.nextInt(base.length()); + sb.append(base.charAt(number)); + } + return sb.toString(); + } + + /** + * 获取随机长度随机字符 + * + * @param length + * @return + */ + public static String getRandomString(int length) { // length表示生成字符串的长度 + String base = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + Random random = new Random(); + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < length; i++) { + int number = random.nextInt(base.length()); + sb.append(base.charAt(number)); + } + return sb.toString(); + } + + /** + * 获取随机长度随机数字 + * + * @param length + * @return + */ + public static String getRandomNumString(int length) { // length表示生成字符串的长度 + String base = "0123456789"; + Random random = new Random(); + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < length; i++) { + int number = random.nextInt(base.length()); + sb.append(base.charAt(number)); + } + return sb.toString(); + } + + /** + * 返回随机数组 + * + * @param start             开始值 + * @param end             结束值 + * @return + */ + public static int[] getRangRandom(int start, int end) { + return getRangRandom(start, end, end - start + 1); + } + + /** + * 返回指定范围指定个数的不重复随机数。 + * + * @param start + * @param end + * @param num + * @return + */ + public static int[] getRangRandom(int start, int end, int num) { + + int length = end - start + 1; + // 参数不合法 + if (length < 1 || num > length) { + return null; + } else { + int[] numbers = new int[length]; + int[] result = new int[num]; + // 循环赋初始值 + for (int i = 0; i < length; i++) { + numbers[i] = i + start; + } + Random random = new Random(); + // 取randomMax次数 + for (int i = 0; i < num; i++) { + // 随机获取取数的位置 + int m = random.nextInt(length - i) + i; + result[i] = numbers[m]; + // 交换位置 + int temp = numbers[m]; + numbers[m] = numbers[i]; + numbers[i] = temp; + } + return result; + } + } + + /* + * 生成6位随机数验证码 + */ + public static String code() { + Set set = GetRandomNumber(); + Iterator iterator = set.iterator(); + String temp = ""; + while (iterator.hasNext()) { + temp += iterator.next(); + } + return temp; + } + + public static Set GetRandomNumber() { + Set set = new HashSet(); + Random random = new Random(); + while (set.size() < 6) { + set.add(random.nextInt(10)); + } + return set; + } +} diff --git a/childpassmanage/src/main/java/com/childpassmanage/net/utils/SM2Util.java b/childpassmanage/src/main/java/com/childpassmanage/net/utils/SM2Util.java new file mode 100644 index 0000000..267a594 --- /dev/null +++ b/childpassmanage/src/main/java/com/childpassmanage/net/utils/SM2Util.java @@ -0,0 +1,286 @@ +package com.childpassmanage.net.utils; + + +import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.codec.binary.Base64; +import org.bouncycastle.asn1.gm.GMNamedCurves; +import org.bouncycastle.asn1.x9.X9ECParameters; +import org.bouncycastle.crypto.AsymmetricCipherKeyPair; +import org.bouncycastle.crypto.engines.SM2Engine; +import org.bouncycastle.crypto.generators.ECKeyPairGenerator; +import org.bouncycastle.crypto.params.*; +import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey; +import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey; +import org.bouncycastle.jce.spec.ECParameterSpec; +import org.bouncycastle.math.ec.ECPoint; +import org.bouncycastle.util.encoders.Hex; + +import java.math.BigInteger; +import java.security.*; +import java.util.Map; + +import static javax.crypto.Cipher.PRIVATE_KEY; +import static javax.crypto.Cipher.PUBLIC_KEY; + +/** + * @Author: dzy + * @Date: 2018/9/28 15:53 + * @Describe: SM2工具类 + */ +@Slf4j +public class SM2Util { + + /** + * 生成SM2公私钥对 + * @return + */ + private static AsymmetricCipherKeyPair genKeyPair0() { + //获取一条SM2曲线参数 + X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1"); + + //构造domain参数 + ECDomainParameters domainParameters = new ECDomainParameters(sm2ECParameters.getCurve(), + sm2ECParameters.getG(), sm2ECParameters.getN()); + + //1.创建密钥生成器 + ECKeyPairGenerator keyPairGenerator = new ECKeyPairGenerator(); + + //2.初始化生成器,带上随机数 + try { + keyPairGenerator.init(new ECKeyGenerationParameters(domainParameters, SecureRandom.getInstance("SHA1PRNG"))); + } catch (NoSuchAlgorithmException e) { + log.error("生成公私钥对时出现异常:", e); +// e.printStackTrace(); + } + + //3.生成密钥对 + AsymmetricCipherKeyPair asymmetricCipherKeyPair = keyPairGenerator.generateKeyPair(); + return asymmetricCipherKeyPair; + } + + /** + * 生成公私钥对(默认压缩公钥) + * @return + */ + public static PCIKeyPair genKeyPair() { + return genKeyPair(true); + } + + /** + * 生成公私钥对 + * @param compressedPubKey 是否压缩公钥 + * @return + */ + public static PCIKeyPair genKeyPair(boolean compressedPubKey) { + AsymmetricCipherKeyPair asymmetricCipherKeyPair = genKeyPair0(); + + //提取公钥点 + ECPoint ecPoint = ((ECPublicKeyParameters) asymmetricCipherKeyPair.getPublic()).getQ(); + //公钥前面的02或者03表示是压缩公钥,04表示未压缩公钥,04的时候,可以去掉前面的04 + String pubKey = Hex.toHexString(ecPoint.getEncoded(compressedPubKey)); + + BigInteger privatekey = ((ECPrivateKeyParameters) asymmetricCipherKeyPair.getPrivate()).getD(); + String priKey = privatekey.toString(16); + + PCIKeyPair keyPair = new PCIKeyPair(priKey, pubKey); + return keyPair; + } + + + /** + * 将R或者S修正为固定字节数 + * @param rs + * @return + */ + private static byte[] modifyRSFixedBytes(byte[] rs) { + int length = rs.length; + int fixedLength = 32; + byte[] result = new byte[fixedLength]; + if (length < 32) { + System.arraycopy(rs, 0, result, fixedLength - length, length); + } else { + System.arraycopy(rs, length - fixedLength, result, 0, fixedLength); + } + return result; + } + + + /** + * SM2加密算法 + * @param publicKey 公钥 + * @param data 数据 + * @return + */ + public static String encrypt(String publicKey, String data){ + // 获取一条SM2曲线参数 + X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1"); + // 构造domain参数 + ECDomainParameters domainParameters = new ECDomainParameters(sm2ECParameters.getCurve(), + sm2ECParameters.getG(), + sm2ECParameters.getN()); + //提取公钥点 + ECPoint pukPoint = sm2ECParameters.getCurve().decodePoint(CommonUtils.hexString2byte(publicKey)); + // 公钥前面的02或者03表示是压缩公钥,04表示未压缩公钥, 04的时候,可以去掉前面的04 + ECPublicKeyParameters publicKeyParameters = new ECPublicKeyParameters(pukPoint, domainParameters); + + SM2Engine sm2Engine = new SM2Engine(); + sm2Engine.init(true, new ParametersWithRandom(publicKeyParameters, new SecureRandom())); + + byte[] arrayOfBytes = null; + try { + byte[] in = data.getBytes("utf-8"); + arrayOfBytes = sm2Engine.processBlock(in, 0, in.length); + } catch (Exception e) { + log.error("SM2加密时出现异常:", e); + } + return Hex.toHexString(arrayOfBytes); + } + + /** + * SM2加密算法 + * @param publicKey 公钥 + * @param data 明文数据 + * @return + */ + public static String encrypt(PublicKey publicKey, String data) { + + ECPublicKeyParameters ecPublicKeyParameters = null; + if (publicKey instanceof BCECPublicKey) { + BCECPublicKey bcecPublicKey = (BCECPublicKey) publicKey; + ECParameterSpec ecParameterSpec = bcecPublicKey.getParameters(); + ECDomainParameters ecDomainParameters = new ECDomainParameters(ecParameterSpec.getCurve(), + ecParameterSpec.getG(), ecParameterSpec.getN()); + ecPublicKeyParameters = new ECPublicKeyParameters(bcecPublicKey.getQ(), ecDomainParameters); + } + + SM2Engine sm2Engine = new SM2Engine(); + sm2Engine.init(true, new ParametersWithRandom(ecPublicKeyParameters, new SecureRandom())); + + byte[] arrayOfBytes = null; + try { + byte[] in = data.getBytes("utf-8"); + arrayOfBytes = sm2Engine.processBlock(in,0, in.length); + } catch (Exception e) { + log.error("SM2加密时出现异常:", e); + } + return Hex.toHexString(arrayOfBytes); + } + + /** + * SM2解密算法 + * @param privateKey 私钥 + * @param cipherData 密文数据 + * @return + */ + public static String decrypt(String privateKey, String cipherData) { + byte[] cipherDataByte = Hex.decode(cipherData); + + //获取一条SM2曲线参数 + X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1"); + //构造domain参数 + ECDomainParameters domainParameters = new ECDomainParameters(sm2ECParameters.getCurve(), + sm2ECParameters.getG(), sm2ECParameters.getN()); + + BigInteger privateKeyD = new BigInteger(privateKey, 16); + ECPrivateKeyParameters privateKeyParameters = new ECPrivateKeyParameters(privateKeyD, domainParameters); + + SM2Engine sm2Engine = new SM2Engine(); + sm2Engine.init(false, privateKeyParameters); + + String result = null; + try { + byte[] arrayOfBytes = sm2Engine.processBlock(cipherDataByte, 0, cipherDataByte.length); + return new String(arrayOfBytes, "utf-8"); + } catch (Exception e) { + log.error("SM2解密时出现异常:", e); + } + return result; + + } + + /** + * SM2解密算法 + * @param privateKey 私钥 + * @param cipherData 密文数据 + * @return + */ + public static String decrypt(PrivateKey privateKey, String cipherData) { + byte[] cipherDataByte = Hex.decode(cipherData); + + BCECPrivateKey bcecPrivateKey = (BCECPrivateKey) privateKey; + ECParameterSpec ecParameterSpec = bcecPrivateKey.getParameters(); + + ECDomainParameters ecDomainParameters = new ECDomainParameters(ecParameterSpec.getCurve(), + ecParameterSpec.getG(), ecParameterSpec.getN()); + + ECPrivateKeyParameters ecPrivateKeyParameters = new ECPrivateKeyParameters(bcecPrivateKey.getD(), + ecDomainParameters); + + SM2Engine sm2Engine = new SM2Engine(); + sm2Engine.init(false, ecPrivateKeyParameters); + + String result = null; + try { + byte[] arrayOfBytes = sm2Engine.processBlock(cipherDataByte, 0, cipherDataByte.length); + return new String(arrayOfBytes, "utf-8"); + } catch (Exception e) { + log.error("SM2解密时出现异常:", e); + } + return result; + } + + /** + * 将未压缩公钥压缩成压缩公钥 + * @param pubKey 未压缩公钥(16进制,不要带头部04) + * @return + */ + public static String compressPubKey(String pubKey) { + pubKey = "04"+ pubKey; //将未压缩公钥加上未压缩标识. + // 获取一条SM2曲线参数 + X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1"); + // 构造domain参数 + ECDomainParameters domainParameters = new ECDomainParameters(sm2ECParameters.getCurve(), + sm2ECParameters.getG(), + sm2ECParameters.getN()); + //提取公钥点 + ECPoint pukPoint = sm2ECParameters.getCurve().decodePoint(CommonUtils.hexString2byte(pubKey)); + // 公钥前面的02或者03表示是压缩公钥,04表示未压缩公钥, 04的时候,可以去掉前面的04 +// ECPublicKeyParameters publicKeyParameters = new ECPublicKeyParameters(pukPoint, domainParameters); + + String compressPubKey = Hex.toHexString(pukPoint.getEncoded(Boolean.TRUE)); + + return compressPubKey; + } + + /** + * 将压缩的公钥解压为非压缩公钥 + * @param compressKey 压缩公钥 + * @return + */ + public static String unCompressPubKey(String compressKey) { + // 获取一条SM2曲线参数 + X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1"); + // 构造domain参数 + ECDomainParameters domainParameters = new ECDomainParameters(sm2ECParameters.getCurve(), + sm2ECParameters.getG(), + sm2ECParameters.getN()); + //提取公钥点 + ECPoint pukPoint = sm2ECParameters.getCurve().decodePoint(CommonUtils.hexString2byte(compressKey)); + // 公钥前面的02或者03表示是压缩公钥,04表示未压缩公钥, 04的时候,可以去掉前面的04 +// ECPublicKeyParameters publicKeyParameters = new ECPublicKeyParameters(pukPoint, domainParameters); + + String pubKey = Hex.toHexString(pukPoint.getEncoded(Boolean.FALSE)); + pubKey = pubKey.substring(2); //去掉前面的04 (04的时候,可以去掉前面的04) + + return pubKey; + } + + /** + * 取得公私钥字符串。 + */ + public static String getKeyStr(Key key) { + return Base64.encodeBase64String(key.getEncoded()); + } + + +} diff --git a/childpassmanage/src/main/java/com/childpassmanage/net/utils/Shamir.java b/childpassmanage/src/main/java/com/childpassmanage/net/utils/Shamir.java new file mode 100644 index 0000000..12b3007 --- /dev/null +++ b/childpassmanage/src/main/java/com/childpassmanage/net/utils/Shamir.java @@ -0,0 +1,226 @@ +package com.childpassmanage.net.utils; + +import org.apache.commons.lang.math.RandomUtils; + +import java.math.BigInteger; +import java.util.HashMap; +import java.util.Map; +import java.util.Random; +import java.util.Scanner; + +public class Shamir { + public static Map split(int secret) { + //Scanner in = new Scanner(System.in); + long a[] = new long[100];// 放系数 + long f[] = new long[100];// 放密钥的值 + long dian[] = new long[100];// 放密钥的点 + Map hashMap = new HashMap<>(); + Random rand = new Random(); + int bit_num = rand.nextInt(29) + 2;// 随机2到31位 + BigInteger q = BigInteger.probablePrime(bit_num, rand);// 生成一个随机大素数,必须大于输入的随机整数 + long p = q.longValue(); + while (p < secret) {// 如果不大于输入的数 + bit_num = rand.nextInt(29) + 2; + q = BigInteger.probablePrime(bit_num, rand); + p = q.longValue(); + } + hashMap.put("p", p); + int k = 2; + int zi_key = 3; + for (int i = 0; i < k - 1; i++) { + a[i] = (long) (Math.random() * p);// 生成伪随机系数 + if (a[i] == 0) {// 生成的随机系数不能为0 + i--; + } + } + for (int i = 0; i < zi_key; i++) { + dian[i] = (long) (Math.random() * 100);// 生成100以内随机点,不能重复,如果大了,可能在以后的运算中超出数据类型范围,导致错误 + if (dian[i] == 0) {// 生成的随机点不能为0 + i--; + } + } + for (int i = 0; i < zi_key; i++) {// 计算zi_key个子密钥 + f[i] = secret; + for (int j = 0; j < k - 1; j++) {// 一个子密钥 + long zhishu = j + 1; + f[i] = Math.floorMod((long) (a[j] * Math.pow(dian[i], zhishu)) + f[i], p); + } + } + + hashMap.put("dian[0]", dian[0]); + hashMap.put("dian[1]", dian[1]); + hashMap.put("dian[2]", dian[2]); + hashMap.put("f[0]", f[0]); + hashMap.put("f[1]", f[1]); + hashMap.put("f[2]", f[2]); + + return hashMap; + } + + + public static long combine(Map hashMap) { + long m = (hashMap.get("p")); + int k = 2; + long key_d[] = new long[k]; + long key_z[] = new long[k]; + long num_x[] = new long[k]; + long num_s[] = new long[k]; + long s = 0; + + int flag = RandomUtil.getRandomRange(3, 1); + if (flag == 1) { + key_d[0] = (hashMap.get("dian[0]")); + key_d[1] = (hashMap.get("dian[1]")); + key_z[0] = (hashMap.get("f[0]")); + key_z[1] = (hashMap.get("f[1]")); + } else if(flag == 2){ + key_d[0] = (hashMap.get("dian[0]")); + key_d[1] = (hashMap.get("dian[2]")); + key_z[0] = (hashMap.get("f[0]")); + key_z[1] = (hashMap.get("f[2]")); + }else if(flag == 3){ + key_d[0] = (hashMap.get("dian[1]")); + key_d[1] = (hashMap.get("dian[2]")); + key_z[0] = (hashMap.get("f[1]")); + key_z[1] = (hashMap.get("f[2]")); + } + + for (int i = 0; i < k; i++) { + num_x[i] = 1; + num_s[i] = 1; + for (int j = 0; j < k; j++) { + if (j == i) { + j++; + } + if (j == k) { + break; + } + num_x[i] = num_x[i] * (key_d[i] - key_d[j]); + num_s[i] = (-key_d[j]) * num_s[i]; + } + num_x[i] = qiu_ni(num_x[i], m); + s = num_x[i] * num_s[i] * key_z[i] + s; + } + s = Math.floorMod(s, m); + return s; + } + + // 求逆函数 + static long qiu_ni(long a, long b) {// 最后s[1]为s即逆元,t[1]为t + long s[] = { 1, 0, 0 }; + long t[] = { 0, 1, 0 }; + long r1 = a; + long r2 = b; + long tmp; + int i = (int) (r1 / r2); + tmp = r2; + r2 = Math.floorMod(r1, r2); + r1 = tmp; + while (r2 != 0) { + s[2] = s[0] - i * s[1]; + t[2] = t[0] - i * t[1]; + s[0] = s[1]; + s[1] = s[2]; + t[0] = t[1]; + t[1] = t[2]; + if (r2 != 0) + i = (int) (r1 / r2); + tmp = r2; + r2 = Math.floorMod(r1, r2); + r1 = tmp; + } + return s[1]; + } + + +/* + public static void main(String[] args) { + Scanner in = new Scanner(System.in); + while (true) { + System.out.println("分解秘密请选择1,还原秘密选择2, 退出选择3"); + int flag = in.nextInt(); + if (flag == 1) { + long a[] = new long[100];// 放系数 + long f[] = new long[100];// 放密钥的值 + long dian[] = new long[100];// 放密钥的点 + System.out.println("输入你的秘密"); + int secret = in.nextInt();// 输入为一个数小于2,147,483,647 + Random rand = new Random(); + int bit_num = rand.nextInt(29) + 2;// 随机2到31位 + BigInteger q = BigInteger.probablePrime(bit_num, rand);// 生成一个随机大素数,必须大于输入的随机整数 + long p = q.longValue(); + while (p < secret) {// 如果不大于输入的数 + bit_num = rand.nextInt(29) + 2; + q = BigInteger.probablePrime(bit_num, rand); + p = q.longValue(); + } + System.out.println("模为 " + p); + //System.out.println("输入门限值");// 门限值小于等于100 + int k = 2; + //System.out.println("输入得到几个子密钥");// 子密钥值小于等于100 + int zi_key = 3; + for (int i = 0; i < k - 1; i++) { + a[i] = (long) (Math.random() * p);// 生成伪随机系数 + if (a[i] == 0) {// 生成的随机系数不能为0 + i--; + } + } + for (int i = 0; i < zi_key; i++) { + dian[i] = (long) (Math.random() * 100);// 生成100以内随机点,不能重复,如果大了,可能在以后的运算中超出数据类型范围,导致错误 + if (dian[i] == 0) {// 生成的随机点不能为0 + i--; + } + } + System.out.println("子密钥为(确保子密钥没有重复,如果有请重新生成) "); + for (int i = 0; i < zi_key; i++) {// 计算zi_key个子密钥 + f[i] = secret; + for (int j = 0; j < k - 1; j++) {// 一个子密钥 + long zhishu = j + 1; + f[i] = Math.floorMod((long) (a[j] * Math.pow(dian[i], zhishu)) + f[i], p); + } + System.out.print(dian[i] + " "); + System.out.println(f[i]); + } + } else if (flag == 2) { + System.out.println("输入模值"); + int m = in.nextInt(); + System.out.println("输入门限"); + int k = in.nextInt(); + long key_d[] = new long[k]; + long key_z[] = new long[k]; + long num_x[] = new long[k]; + long num_s[] = new long[k]; + long s = 0; + System.out.println("请输入密钥(先输入所有的点,再输入各点对应的值) "); + for (int i = 0; i < k; i++) { + key_d[i] = in.nextLong(); + } + for (int i = 0; i < k; i++) { + key_z[i] = in.nextLong(); + } + for (int i = 0; i < k; i++) { + num_x[i] = 1; + num_s[i] = 1; + for (int j = 0; j < k; j++) { + if (j == i) { + j++; + } + if (j == k) { + break; + } + num_x[i] = num_x[i] * (key_d[i] - key_d[j]); + num_s[i] = (-key_d[j]) * num_s[i]; + } + num_x[i] = qiu_ni(num_x[i], m); + s = num_x[i] * num_s[i] * key_z[i] + s; + } + s = Math.floorMod(s, m); + System.out.println("秘密为 " + s); + } else { + break; + } + } + } +*/ + +} diff --git a/childpassmanage/src/main/java/com/childpassmanage/net/utils/Sm4Util.java b/childpassmanage/src/main/java/com/childpassmanage/net/utils/Sm4Util.java new file mode 100644 index 0000000..7a975ab --- /dev/null +++ b/childpassmanage/src/main/java/com/childpassmanage/net/utils/Sm4Util.java @@ -0,0 +1,177 @@ +package com.childpassmanage.net.utils; + +import org.apache.commons.codec.binary.Hex; +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.bouncycastle.pqc.math.linearalgebra.ByteUtils; + +import javax.crypto.Cipher; +import javax.crypto.KeyGenerator; +import javax.crypto.spec.SecretKeySpec; +import java.security.Key; +import java.security.SecureRandom; +import java.security.Security; +import java.util.Arrays; + +public class Sm4Util { + static { + Security.addProvider(new BouncyCastleProvider()); + } + + private static final String ENCODING = "UTF-8"; + public static final String ALGORITHM_NAME = "SM4"; + // 加密算法/分组加密模式/分组填充方式 + // PKCS5Padding-以8个字节为一组进行分组加密 + // 定义分组加密模式使用:PKCS5Padding + public static final String ALGORITHM_NAME_ECB_PADDING = "SM4/ECB/PKCS5Padding"; + // 128-32位16进制;256-64位16进制 + public static final int DEFAULT_KEY_SIZE = 128; + + /** + * 自动生成密钥 + * + * @return + * @explain + */ + public static String generateKey() throws Exception { + return new String(Hex.encodeHex(generateKey(DEFAULT_KEY_SIZE),false)); + } + + /** + * @param keySize + * @return + * @throws Exception + * @explain + */ + public static byte[] generateKey(int keySize) throws Exception { + KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM_NAME, BouncyCastleProvider.PROVIDER_NAME); + kg.init(keySize, new SecureRandom()); + return kg.generateKey().getEncoded(); + } + + /** + * 生成ECB暗号 + * + * @param algorithmName 算法名称 + * @param mode 模式 + * @param key + * @return + * @throws Exception + * @explain ECB模式(电子密码本模式:Electronic codebook) + */ + private static Cipher generateEcbCipher(String algorithmName, int mode, byte[] key) throws Exception { + Cipher cipher = Cipher.getInstance(algorithmName, BouncyCastleProvider.PROVIDER_NAME); + Key sm4Key = new SecretKeySpec(key, ALGORITHM_NAME); + cipher.init(mode, sm4Key); + return cipher; + } + + /** + * sm4加密 + * + * @param hexKey 16进制密钥(忽略大小写) + * @param paramStr 待加密字符串 + * @return 返回16进制的加密字符串 + * @explain 加密模式:ECB + * 密文长度不固定,会随着被加密字符串长度的变化而变化 + */ + public static String encryptEcb(String hexKey, String paramStr) { + try { + String cipherText = ""; + // 16进制字符串-->byte[] + byte[] keyData = ByteUtils.fromHexString(hexKey); + // String-->byte[] + byte[] srcData = paramStr.getBytes(ENCODING); + // 加密后的数组 + byte[] cipherArray = encrypt_Ecb_Padding(keyData, srcData); + // byte[]-->hexString + cipherText = ByteUtils.toHexString(cipherArray); + return cipherText; + } catch (Exception e) { + return paramStr; + } + } + + /** + * 加密模式之Ecb + * + * @param key + * @param data + * @return + * @throws Exception + * @explain + */ + public static byte[] encrypt_Ecb_Padding(byte[] key, byte[] data) throws Exception { + Cipher cipher = generateEcbCipher(ALGORITHM_NAME_ECB_PADDING, Cipher.ENCRYPT_MODE, key); + return cipher.doFinal(data); + } + + /** + * sm4解密 + * + * @param hexKey 16进制密钥 + * @param cipherText 16进制的加密字符串(忽略大小写) + * @return 解密后的字符串 + * @throws Exception + * @explain 解密模式:采用ECB + */ + public static String decryptEcb(String hexKey, String cipherText) { + // 用于接收解密后的字符串 + String decryptStr = ""; + // hexString-->byte[] + byte[] keyData = ByteUtils.fromHexString(hexKey); + // hexString-->byte[] + byte[] cipherData = ByteUtils.fromHexString(cipherText); + // 解密 + byte[] srcData = new byte[0]; + try { + srcData = decrypt_Ecb_Padding(keyData, cipherData); + // byte[]-->String + decryptStr = new String(srcData, ENCODING); + } catch (Exception e) { + e.printStackTrace(); + } + return decryptStr; + } + + /** + * 解密 + * + * @param key + * @param cipherText + * @return + * @throws Exception + * @explain + */ + public static byte[] decrypt_Ecb_Padding(byte[] key, byte[] cipherText) throws Exception { + Cipher cipher = generateEcbCipher(ALGORITHM_NAME_ECB_PADDING, Cipher.DECRYPT_MODE, key); + return cipher.doFinal(cipherText); + } + + /** + * 校验加密前后的字符串是否为同一数据 + * + * @param hexKey 16进制密钥(忽略大小写) + * @param cipherText 16进制加密后的字符串 + * @param paramStr 加密前的字符串 + * @return 是否为同一数据 + * @throws Exception + * @explain + */ + public static boolean verifyEcb(String hexKey, String cipherText, String paramStr) throws Exception { + // 用于接收校验结果 + boolean flag = false; + // hexString-->byte[] + byte[] keyData = ByteUtils.fromHexString(hexKey); + // 将16进制字符串转换成数组 + byte[] cipherData = ByteUtils.fromHexString(cipherText); + // 解密 + byte[] decryptData = decrypt_Ecb_Padding(keyData, cipherData); + // 将原字符串转换成byte[] + byte[] srcData = paramStr.getBytes(ENCODING); + // 判断2个数组是否一致 + flag = Arrays.equals(decryptData, srcData); + return flag; + } + + +} diff --git a/childpassmanage/src/main/java/com/childpassmanage/net/utils/ThroughUserkey.java b/childpassmanage/src/main/java/com/childpassmanage/net/utils/ThroughUserkey.java new file mode 100644 index 0000000..6f5efe3 --- /dev/null +++ b/childpassmanage/src/main/java/com/childpassmanage/net/utils/ThroughUserkey.java @@ -0,0 +1,96 @@ +package com.childpassmanage.net.utils;/* +主密钥生成类 +*/ + +import javax.crypto.KeyGenerator; +import javax.crypto.SecretKey; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; + +public class ThroughUserkey { + + /** + 随机生成密钥 + * @return + */ + public static String getAESKey() { + String s1; + KeyGenerator kg = null; + try { + kg = KeyGenerator.getInstance("AES"); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + kg.init(128); + //要生成多少位,只需要修改这里即可128, 192或256 + SecretKey sk = kg.generateKey(); + byte[] b = sk.getEncoded(); + s1 = byteToHexString(b); + // System.out.println("随机生成的密钥长度:"+s1.length()*4); + // System.out.println("密钥:"+s1); + + return s1; + } + + public static String getDESKey() { + String s1; + KeyGenerator kg = null; + try { + kg = KeyGenerator.getInstance("DES"); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + kg.init(56); + //要生成多少位,只需要修改这里即可128, 192或256 + SecretKey sk = kg.generateKey(); + byte[] b = sk.getEncoded(); + s1 = byteToHexString(b); + // System.out.println("随机生成的密钥长度:"+s1.length()*4); + // System.out.println("密钥:"+s1); + + return s1; + } + /** + 使用指定的字符串生成密钥 + * @return + */ + public static String getKeyByPass(String password) { + //生成秘钥 + KeyGenerator kg = null; + try { + kg = KeyGenerator.getInstance("AES"); + } catch (NoSuchAlgorithmException ex) { + ex.printStackTrace(); + } + //SecureRandom是生成安全随机数序列,password.getBytes()是种子,只要种子相同,序列就一样,所以生成的秘钥就一样。 + //System.out.println("输入指定字符串生成的密钥的长度:"); + //int i=input.nextInt(); + + kg.init(128, new SecureRandom(password.getBytes())); + SecretKey sk = kg.generateKey(); + byte[] b = sk.getEncoded(); + String s2 = byteToHexString(b); + // System.out.println("指定字符串生成的密钥长度:"+s2.length()*4); + // System.out.println("密钥:"+s2); + return s2; + } + /** + byte数组转化为16进制字符串 + */ + public static String byteToHexString(byte[] bytes) { + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < bytes.length; i++) { + String strHex=Integer.toHexString(bytes[i]); + if(strHex.length() > 3) { + sb.append(strHex.substring(6)); + } else { + if(strHex.length() < 2) { + sb.append("0" + strHex); + } else { + sb.append(strHex); + } + } + } + return sb.toString(); + } +} diff --git a/childpassmanage/src/main/resources/application-localhost.yml b/childpassmanage/src/main/resources/application-localhost.yml new file mode 100644 index 0000000..48646c1 --- /dev/null +++ b/childpassmanage/src/main/resources/application-localhost.yml @@ -0,0 +1,104 @@ +##本地环境设置 配置注意事项 : 后面紧跟一个空格 然后再配置您的实际值 +server: + #tomcat端口 比如http://{ip}:{port}{/context-path}中的{port} 纯数字 + port: 18087 +Spring: + datasource: + #mysql url连接信息 + url: jdbc:mysql://localhost:3306/us?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&userSSL=true&serverTimezone=Hongkong&zeroDateTimeBehavior=CONVERT_TO_NULL + #数据库用户名 + username: root + #数据库密码 + password: 123456 + #mysql8新驱动名称 + driverClassName: com.mysql.cj.jdbc.Driver + +spring: + thymeleaf: + cache: false + redis: + #所有的redis 缓存都会加入下面的前缀 方便管理 + keyPrefix: + # redis地址 单机模式 参见RedisConfig + host: localhost + #redis端口 单机模式 + port: 6379 + #不允许redis密码为空字符串 可以不设置 您也可以使用"1234" + password: 123456 + #集群模式 默认不开启 因为集群模式redis配置复杂,演示版只有一个redis + # cluster: + #redis支持集群模式(需要参考文档自行打开) 也支持单机(配置一个即可) 配置规则:节点的ip:port,ip:port 逗号分隔多个 +# nodes: localhost:6379 +# 最大连接时间 具体参考JedisCluster官方文档 +# connectionTimeout: 5000 +# soTimeout: 5000 +# maxAttempts: 3 + + #druid管理后台 http://localhost:18080/us-admin/druid/ 可以查看数据源的状态 账号/密码:admin/123456 + monitor: + druid: + userName: admin + password: 123456 + allowIps: 127.0.0.1 + denyIps: 10.1.1.1 + filters: stat,log4j + devtools: + restart: + #是否开启热部署 另外需要配置ide的配置一同生效 参考这篇文章 https://blog.csdn.net/boywcx/article/details/81164411 + enabled: false + servlet: + multipart: + #单个文件大小 1G + max-file-size: 1024000000 + #总上传的数据大小 1G + max-request-size: 1024000000 + #是否开启 + enabled: true + +magicalcoder: + file: + #文件上传配置:useDisk useAliyunOss 如果open都为true 则都使用 returnUrl 默认优先级 useAliyunOss useDisk + upload: + #上传至本地硬盘 + useDisk: + #是否开启 + open: true + #控制是否采用此模式返回给前端的图片地址 + returnUrl: true + #由于spring boot是jar方式执行,无法自动映射上传文件访问地址,采取单独映射方法 + mapping: + #文件要上传到的硬盘路径 例如 windows: /E:/tmp/test/ linux: /home/web/file/upload/ 如果不设置 则会自动查找classpath路径下的upload + uploadDiskFolder: + #虚拟访问映射地址 请尽量不要改动 AdminCommonFileRestController里面有根据这个返回给前端 你可以设置images/magic 前后不要有/ 不能为空 + requestPrefix: upload + #实际额外在前面添加其他内容 主要用于跟你自己的项目路径映射 会在实际路径中加入此前缀 不要以http开头 /upload/ + fileExtraAddPrefix: upload/ + #使用阿里云oss 开通方式参考 doc\upload\阿里云oss文件上传.docx 本配置请改成您自己的阿里云实际参数 因为存储桶要钱购买 所以这里不可能免费使用 + useAliyunOss: + #是否开启 + open: false + #控制是否采用此模式返回给前端的图片地址 + returnUrl: true + #Region请按实际情况填写 + endpoint: http://oss-cn-beijing.aliyuncs.com + #oos存储账号 + accessKeyId: LTAIGeWoz1iMmX2X + #oos存储密码 + accessKeySecret: OywMJpmN5cSqreqgLNYZVrBqtxmE8H + #oos存储桶名称 + bucketName: us + #桶的地址前缀 你如果不明白怎么配置 去阿里云oss后台 找个地址看一下 组合是 urlPrefix+上传时候的文件名称 + aliyunImgDomain: https://us.oss-cn-beijing.aliyuncs.com/ + + #超级管理员账号名称 密码默认:magicalcoder + superUserName: magicalcoder + cors: + # 跨域 支持哪些同源域名 逗号分隔多个 你可以配置 http://localhost:18088,http://www.magicalcoder.com 跨域demo参考README.md + allowOrigin: + #是否是发布模式 true则加载精简的us-all.min.js us-all.min.css,如果您更改了系统js css 注意自行合并 参考YouyabootAllJsCompressTest YouyabootAllCssCompressTest 这样页面加载速度会更快 否则加载其他的crud下面的js 和各个 css + publish: false + settings: + #当启动成功 自动帮助启动浏览器 linux服务端部署方式启动 请设置false + autoStartExplorer: true + #设置默认浏览器的浏览器路径 此处设置chrome为例 您如果未安装chrome 或者不设置此处 则使用默认浏览器 + explorerPath: C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe diff --git a/childpassmanage/src/main/resources/application.yml b/childpassmanage/src/main/resources/application.yml new file mode 100644 index 0000000..39e7eec --- /dev/null +++ b/childpassmanage/src/main/resources/application.yml @@ -0,0 +1,35 @@ +#全局配置 +# tomcat配置 +server: + #当前环境上下文 比如http://{ip}:{port}{/context-path}中的{/context-path} 以/开头配置 + # context-path: /us-admin + servlet: + context-path: / +#log +logging: + config: + #日志配置:读取当前环境下的logback.xml + classpath: logback.xml + +spring: + # thymeleaf: + # prefix: classpath:/templates + profiles: + # publish localhost就可以切换不同环境application-xxx的配置 + active: localhost + messages: + encoding: UTF-8 + http: + encoding: + charset: UTF-8 + enabled: true + force: true + application: + #service-name + name: passuser + jackson: + time-zone: GMT+8 + mvc: + #这样浏览器小图标就可以加载你自己的favicon.ico了 + favicon: + enabled: false diff --git a/childpassmanage/src/main/resources/banner.txt b/childpassmanage/src/main/resources/banner.txt new file mode 100644 index 0000000..8ca73ae --- /dev/null +++ b/childpassmanage/src/main/resources/banner.txt @@ -0,0 +1,32 @@ +version: v0.0.1 +发布日期:2018-8-19 +/** + *        ┏┓  ┏┓+ + + *       ┏┛┻━━━┛┻┓ + + + *       ┃      ┃   + *       ┃   ━   ┃ ++ + + + + *       ████━████ ┃+ + *       ┃       ┃ + + *       ┃   ┻   ┃ + *       ┃      ┃ + + + *       ┗━┓   ┏━┛ + *         ┃   ┃            + *         ┃   ┃ + + + + + *         ┃   ┃          + *         ┃   ┃ +      + *         ┃   ┃ + *         ┃   ┃  +          + *         ┃    ┗━━━┓ + + + *         ┃      ┣┓ + *         ┃       ┏┛ + *         ┗┓┓┏━┳┓┏┛ + + + + + *         ┃┫┫ ┃┫┫ + *         ┗┻┛ ┗┻┛+ + + + + * + * 神兽保佑 永无BUG + */ + #登录后台 + http://localhost:18080/us-admin/ 测试账号 admin/admin + 如果启动失败 : 1 请配置application-publish.yml的数据库和redis 相关信息 + druid数据库连接池信息查看:http://localhost:18088/us-web/druid admin/123456 + diff --git a/childpassmanage/src/main/resources/logback.xml b/childpassmanage/src/main/resources/logback.xml new file mode 100644 index 0000000..1b10213 --- /dev/null +++ b/childpassmanage/src/main/resources/logback.xml @@ -0,0 +1,30 @@ + + + + + + ~/data/us-servicelog.log + + ~/data/us-%d{yyyyMMdd}.log.%i + + 500MB + + 100 + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n + + + + + + + + + + + + + + + diff --git a/childpassmanage/src/test/java/com/childpassmanage/net/ChildpassmanageApplicationTests.java b/childpassmanage/src/test/java/com/childpassmanage/net/ChildpassmanageApplicationTests.java new file mode 100644 index 0000000..24186fc --- /dev/null +++ b/childpassmanage/src/test/java/com/childpassmanage/net/ChildpassmanageApplicationTests.java @@ -0,0 +1,13 @@ +package com.childpassmanage.net; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; + +@SpringBootTest +class ChildpassmanageApplicationTests { + + @Test + void contextLoads() { + } + +} diff --git a/key.txt b/key.txt new file mode 100644 index 0000000..c13463a --- /dev/null +++ b/key.txt @@ -0,0 +1 @@ +{"passId":123555,"passType":"SM2","passChildfir":"044783f57ab77198c74a4a8ec2db7c8e64db2164f28feb1910bf2aa0dcd6c344ef23408f526412911e692a880e35deb04768c78b31bf1e9942964ec2f157c71490ec2dd950ed11e8c2e3e6df0b413443d36eef8a522bca930bb055682582b4a6e5a95337890d1107cab6cd10112368a1d0a5c595ce55b68ceb717ce0c195da9de8048a5632cc380f7848a5432c5e1bffb43ddd12dfbd55784c74e74714b50b2dd82520","passChildsec":"046a273ba00d097067d157a282da4c3f849f30248fc7a45737bc7e10c9f22cf60a4ee159c8173a0d3834d08ac4fa3dd1bb20eea3bf87414786bae02f35888c5b4939aab20f259d332e882251a422212a5ee0df2db118e73f2bec07dd236fd3a0a2313e58729da893475567e13ddc5a5c64fa577e3e3caf8fc3d30ec01e6594f628bbdc6a2520cb8f6b10609b990c44c7fd6f3f7de2a4258d455b9fecc758f374a2af04","username":"yg9531"} \ No newline at end of file diff --git a/passuser/.gitignore b/passuser/.gitignore new file mode 100644 index 0000000..a2a3040 --- /dev/null +++ b/passuser/.gitignore @@ -0,0 +1,31 @@ +HELP.md +target/ +!.mvn/wrapper/maven-wrapper.jar +!**/src/main/** +!**/src/test/** + +### STS ### +.apt_generated +.classpath +.factorypath +.project +.settings +.springBeans +.sts4-cache + +### IntelliJ IDEA ### +.idea +*.iws +*.iml +*.ipr + +### NetBeans ### +/nbproject/private/ +/nbbuild/ +/dist/ +/nbdist/ +/.nb-gradle/ +build/ + +### VS Code ### +.vscode/ diff --git a/passuser/.mvn/wrapper/MavenWrapperDownloader.java b/passuser/.mvn/wrapper/MavenWrapperDownloader.java new file mode 100644 index 0000000..a45eb6b --- /dev/null +++ b/passuser/.mvn/wrapper/MavenWrapperDownloader.java @@ -0,0 +1,118 @@ +/* + * Copyright 2007-present the original author or authors. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import java.net.*; +import java.io.*; +import java.nio.channels.*; +import java.util.Properties; + +public class MavenWrapperDownloader { + + private static final String WRAPPER_VERSION = "0.5.6"; + /** + * Default URL to download the maven-wrapper.jar from, if no 'downloadUrl' is provided. + */ + private static final String DEFAULT_DOWNLOAD_URL = "https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/" + + WRAPPER_VERSION + "/maven-wrapper-" + WRAPPER_VERSION + ".jar"; + + /** + * Path to the maven-wrapper.properties file, which might contain a downloadUrl property to + * use instead of the default one. + */ + private static final String MAVEN_WRAPPER_PROPERTIES_PATH = + ".mvn/wrapper/maven-wrapper.properties"; + + /** + * Path where the maven-wrapper.jar will be saved to. + */ + private static final String MAVEN_WRAPPER_JAR_PATH = + ".mvn/wrapper/maven-wrapper.jar"; + + /** + * Name of the property which should be used to override the default download url for the wrapper. + */ + private static final String PROPERTY_NAME_WRAPPER_URL = "wrapperUrl"; + + public static void main(String args[]) { + System.out.println("- Downloader started"); + File baseDirectory = new File(args[0]); + System.out.println("- Using base directory: " + baseDirectory.getAbsolutePath()); + + // If the maven-wrapper.properties exists, read it and check if it contains a custom + // wrapperUrl parameter. + File mavenWrapperPropertyFile = new File(baseDirectory, MAVEN_WRAPPER_PROPERTIES_PATH); + String url = DEFAULT_DOWNLOAD_URL; + if (mavenWrapperPropertyFile.exists()) { + FileInputStream mavenWrapperPropertyFileInputStream = null; + try { + mavenWrapperPropertyFileInputStream = new FileInputStream(mavenWrapperPropertyFile); + Properties mavenWrapperProperties = new Properties(); + mavenWrapperProperties.load(mavenWrapperPropertyFileInputStream); + url = mavenWrapperProperties.getProperty(PROPERTY_NAME_WRAPPER_URL, url); + } catch (IOException e) { + System.out.println("- ERROR loading '" + MAVEN_WRAPPER_PROPERTIES_PATH + "'"); + } finally { + try { + if (mavenWrapperPropertyFileInputStream != null) { + mavenWrapperPropertyFileInputStream.close(); + } + } catch (IOException e) { + // Ignore ... + } + } + } + System.out.println("- Downloading from: " + url); + + File outputFile = new File(baseDirectory.getAbsolutePath(), MAVEN_WRAPPER_JAR_PATH); + if (!outputFile.getParentFile().exists()) { + if (!outputFile.getParentFile().mkdirs()) { + System.out.println( + "- ERROR creating output directory '" + outputFile.getParentFile().getAbsolutePath() + "'"); + } + } + System.out.println("- Downloading to: " + outputFile.getAbsolutePath()); + try { + downloadFileFromURL(url, outputFile); + System.out.println("Done"); + System.exit(0); + } catch (Throwable e) { + System.out.println("- Error downloading"); + e.printStackTrace(); + System.exit(1); + } + } + + private static void downloadFileFromURL(String urlString, File destination) throws Exception { + if (System.getenv("MVNW_USERNAME") != null && System.getenv("MVNW_PASSWORD") != null) { + String username = System.getenv("MVNW_USERNAME"); + char[] password = System.getenv("MVNW_PASSWORD").toCharArray(); + Authenticator.setDefault(new Authenticator() { + @Override + protected PasswordAuthentication getPasswordAuthentication() { + return new PasswordAuthentication(username, password); + } + }); + } + URL website = new URL(urlString); + ReadableByteChannel rbc; + rbc = Channels.newChannel(website.openStream()); + FileOutputStream fos = new FileOutputStream(destination); + fos.getChannel().transferFrom(rbc, 0, Long.MAX_VALUE); + fos.close(); + rbc.close(); + } + +} diff --git a/passuser/.mvn/wrapper/maven-wrapper.jar b/passuser/.mvn/wrapper/maven-wrapper.jar new file mode 100644 index 0000000..2cc7d4a Binary files /dev/null and b/passuser/.mvn/wrapper/maven-wrapper.jar differ diff --git a/passuser/.mvn/wrapper/maven-wrapper.properties b/passuser/.mvn/wrapper/maven-wrapper.properties new file mode 100644 index 0000000..642d572 --- /dev/null +++ b/passuser/.mvn/wrapper/maven-wrapper.properties @@ -0,0 +1,2 @@ +distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.6.3/apache-maven-3.6.3-bin.zip +wrapperUrl=https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar diff --git a/passuser/mvnw b/passuser/mvnw new file mode 100644 index 0000000..a16b543 --- /dev/null +++ b/passuser/mvnw @@ -0,0 +1,310 @@ +#!/bin/sh +# ---------------------------------------------------------------------------- +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +# ---------------------------------------------------------------------------- + +# ---------------------------------------------------------------------------- +# Maven Start Up Batch script +# +# Required ENV vars: +# ------------------ +# JAVA_HOME - location of a JDK home dir +# +# Optional ENV vars +# ----------------- +# M2_HOME - location of maven2's installed home dir +# MAVEN_OPTS - parameters passed to the Java VM when running Maven +# e.g. to debug Maven itself, use +# set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +# MAVEN_SKIP_RC - flag to disable loading of mavenrc files +# ---------------------------------------------------------------------------- + +if [ -z "$MAVEN_SKIP_RC" ] ; then + + if [ -f /etc/mavenrc ] ; then + . /etc/mavenrc + fi + + if [ -f "$HOME/.mavenrc" ] ; then + . "$HOME/.mavenrc" + fi + +fi + +# OS specific support. $var _must_ be set to either true or false. +cygwin=false; +darwin=false; +mingw=false +case "`uname`" in + CYGWIN*) cygwin=true ;; + MINGW*) mingw=true;; + Darwin*) darwin=true + # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home + # See https://developer.apple.com/library/mac/qa/qa1170/_index.html + if [ -z "$JAVA_HOME" ]; then + if [ -x "/usr/libexec/java_home" ]; then + export JAVA_HOME="`/usr/libexec/java_home`" + else + export JAVA_HOME="/Library/Java/Home" + fi + fi + ;; +esac + +if [ -z "$JAVA_HOME" ] ; then + if [ -r /etc/gentoo-release ] ; then + JAVA_HOME=`java-config --jre-home` + fi +fi + +if [ -z "$M2_HOME" ] ; then + ## resolve links - $0 may be a link to maven's home + PRG="$0" + + # need this for relative symlinks + while [ -h "$PRG" ] ; do + ls=`ls -ld "$PRG"` + link=`expr "$ls" : '.*-> \(.*\)$'` + if expr "$link" : '/.*' > /dev/null; then + PRG="$link" + else + PRG="`dirname "$PRG"`/$link" + fi + done + + saveddir=`pwd` + + M2_HOME=`dirname "$PRG"`/.. + + # make it fully qualified + M2_HOME=`cd "$M2_HOME" && pwd` + + cd "$saveddir" + # echo Using m2 at $M2_HOME +fi + +# For Cygwin, ensure paths are in UNIX format before anything is touched +if $cygwin ; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --unix "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --unix "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --unix "$CLASSPATH"` +fi + +# For Mingw, ensure paths are in UNIX format before anything is touched +if $mingw ; then + [ -n "$M2_HOME" ] && + M2_HOME="`(cd "$M2_HOME"; pwd)`" + [ -n "$JAVA_HOME" ] && + JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" +fi + +if [ -z "$JAVA_HOME" ]; then + javaExecutable="`which javac`" + if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then + # readlink(1) is not available as standard on Solaris 10. + readLink=`which readlink` + if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then + if $darwin ; then + javaHome="`dirname \"$javaExecutable\"`" + javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" + else + javaExecutable="`readlink -f \"$javaExecutable\"`" + fi + javaHome="`dirname \"$javaExecutable\"`" + javaHome=`expr "$javaHome" : '\(.*\)/bin'` + JAVA_HOME="$javaHome" + export JAVA_HOME + fi + fi +fi + +if [ -z "$JAVACMD" ] ; then + if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD="$JAVA_HOME/jre/sh/java" + else + JAVACMD="$JAVA_HOME/bin/java" + fi + else + JAVACMD="`which java`" + fi +fi + +if [ ! -x "$JAVACMD" ] ; then + echo "Error: JAVA_HOME is not defined correctly." >&2 + echo " We cannot execute $JAVACMD" >&2 + exit 1 +fi + +if [ -z "$JAVA_HOME" ] ; then + echo "Warning: JAVA_HOME environment variable is not set." +fi + +CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher + +# traverses directory structure from process work directory to filesystem root +# first directory with .mvn subdirectory is considered project base directory +find_maven_basedir() { + + if [ -z "$1" ] + then + echo "Path not specified to find_maven_basedir" + return 1 + fi + + basedir="$1" + wdir="$1" + while [ "$wdir" != '/' ] ; do + if [ -d "$wdir"/.mvn ] ; then + basedir=$wdir + break + fi + # workaround for JBEAP-8937 (on Solaris 10/Sparc) + if [ -d "${wdir}" ]; then + wdir=`cd "$wdir/.."; pwd` + fi + # end of workaround + done + echo "${basedir}" +} + +# concatenates all lines of a file +concat_lines() { + if [ -f "$1" ]; then + echo "$(tr -s '\n' ' ' < "$1")" + fi +} + +BASE_DIR=`find_maven_basedir "$(pwd)"` +if [ -z "$BASE_DIR" ]; then + exit 1; +fi + +########################################################################################## +# Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +# This allows using the maven wrapper in projects that prohibit checking in binary data. +########################################################################################## +if [ -r "$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found .mvn/wrapper/maven-wrapper.jar" + fi +else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Couldn't find .mvn/wrapper/maven-wrapper.jar, downloading it ..." + fi + if [ -n "$MVNW_REPOURL" ]; then + jarUrl="$MVNW_REPOURL/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + else + jarUrl="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + fi + while IFS="=" read key value; do + case "$key" in (wrapperUrl) jarUrl="$value"; break ;; + esac + done < "$BASE_DIR/.mvn/wrapper/maven-wrapper.properties" + if [ "$MVNW_VERBOSE" = true ]; then + echo "Downloading from: $jarUrl" + fi + wrapperJarPath="$BASE_DIR/.mvn/wrapper/maven-wrapper.jar" + if $cygwin; then + wrapperJarPath=`cygpath --path --windows "$wrapperJarPath"` + fi + + if command -v wget > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found wget ... using wget" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + wget "$jarUrl" -O "$wrapperJarPath" + else + wget --http-user=$MVNW_USERNAME --http-password=$MVNW_PASSWORD "$jarUrl" -O "$wrapperJarPath" + fi + elif command -v curl > /dev/null; then + if [ "$MVNW_VERBOSE" = true ]; then + echo "Found curl ... using curl" + fi + if [ -z "$MVNW_USERNAME" ] || [ -z "$MVNW_PASSWORD" ]; then + curl -o "$wrapperJarPath" "$jarUrl" -f + else + curl --user $MVNW_USERNAME:$MVNW_PASSWORD -o "$wrapperJarPath" "$jarUrl" -f + fi + + else + if [ "$MVNW_VERBOSE" = true ]; then + echo "Falling back to using Java to download" + fi + javaClass="$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.java" + # For Cygwin, switch paths to Windows format before running javac + if $cygwin; then + javaClass=`cygpath --path --windows "$javaClass"` + fi + if [ -e "$javaClass" ]; then + if [ ! -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Compiling MavenWrapperDownloader.java ..." + fi + # Compiling the Java class + ("$JAVA_HOME/bin/javac" "$javaClass") + fi + if [ -e "$BASE_DIR/.mvn/wrapper/MavenWrapperDownloader.class" ]; then + # Running the downloader + if [ "$MVNW_VERBOSE" = true ]; then + echo " - Running MavenWrapperDownloader.java ..." + fi + ("$JAVA_HOME/bin/java" -cp .mvn/wrapper MavenWrapperDownloader "$MAVEN_PROJECTBASEDIR") + fi + fi + fi +fi +########################################################################################## +# End of extension +########################################################################################## + +export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} +if [ "$MVNW_VERBOSE" = true ]; then + echo $MAVEN_PROJECTBASEDIR +fi +MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" + +# For Cygwin, switch paths to Windows format before running java +if $cygwin; then + [ -n "$M2_HOME" ] && + M2_HOME=`cygpath --path --windows "$M2_HOME"` + [ -n "$JAVA_HOME" ] && + JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` + [ -n "$CLASSPATH" ] && + CLASSPATH=`cygpath --path --windows "$CLASSPATH"` + [ -n "$MAVEN_PROJECTBASEDIR" ] && + MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` +fi + +# Provide a "standardized" way to retrieve the CLI args that will +# work with both Windows and non-Windows executions. +MAVEN_CMD_LINE_ARGS="$MAVEN_CONFIG $@" +export MAVEN_CMD_LINE_ARGS + +WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +exec "$JAVACMD" \ + $MAVEN_OPTS \ + -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ + "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ + ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" diff --git a/passuser/mvnw.cmd b/passuser/mvnw.cmd new file mode 100644 index 0000000..c8d4337 --- /dev/null +++ b/passuser/mvnw.cmd @@ -0,0 +1,182 @@ +@REM ---------------------------------------------------------------------------- +@REM Licensed to the Apache Software Foundation (ASF) under one +@REM or more contributor license agreements. See the NOTICE file +@REM distributed with this work for additional information +@REM regarding copyright ownership. The ASF licenses this file +@REM to you under the Apache License, Version 2.0 (the +@REM "License"); you may not use this file except in compliance +@REM with the License. You may obtain a copy of the License at +@REM +@REM https://www.apache.org/licenses/LICENSE-2.0 +@REM +@REM Unless required by applicable law or agreed to in writing, +@REM software distributed under the License is distributed on an +@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +@REM KIND, either express or implied. See the License for the +@REM specific language governing permissions and limitations +@REM under the License. +@REM ---------------------------------------------------------------------------- + +@REM ---------------------------------------------------------------------------- +@REM Maven Start Up Batch script +@REM +@REM Required ENV vars: +@REM JAVA_HOME - location of a JDK home dir +@REM +@REM Optional ENV vars +@REM M2_HOME - location of maven2's installed home dir +@REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands +@REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending +@REM MAVEN_OPTS - parameters passed to the Java VM when running Maven +@REM e.g. to debug Maven itself, use +@REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 +@REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files +@REM ---------------------------------------------------------------------------- + +@REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' +@echo off +@REM set title of command window +title %0 +@REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' +@if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% + +@REM set %HOME% to equivalent of $HOME +if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") + +@REM Execute a user defined script before this one +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre +@REM check for pre script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" +if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" +:skipRcPre + +@setlocal + +set ERROR_CODE=0 + +@REM To isolate internal variables from possible post scripts, we use another setlocal +@setlocal + +@REM ==== START VALIDATION ==== +if not "%JAVA_HOME%" == "" goto OkJHome + +echo. +echo Error: JAVA_HOME not found in your environment. >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +:OkJHome +if exist "%JAVA_HOME%\bin\java.exe" goto init + +echo. +echo Error: JAVA_HOME is set to an invalid directory. >&2 +echo JAVA_HOME = "%JAVA_HOME%" >&2 +echo Please set the JAVA_HOME variable in your environment to match the >&2 +echo location of your Java installation. >&2 +echo. +goto error + +@REM ==== END VALIDATION ==== + +:init + +@REM Find the project base dir, i.e. the directory that contains the folder ".mvn". +@REM Fallback to current working directory if not found. + +set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% +IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir + +set EXEC_DIR=%CD% +set WDIR=%EXEC_DIR% +:findBaseDir +IF EXIST "%WDIR%"\.mvn goto baseDirFound +cd .. +IF "%WDIR%"=="%CD%" goto baseDirNotFound +set WDIR=%CD% +goto findBaseDir + +:baseDirFound +set MAVEN_PROJECTBASEDIR=%WDIR% +cd "%EXEC_DIR%" +goto endDetectBaseDir + +:baseDirNotFound +set MAVEN_PROJECTBASEDIR=%EXEC_DIR% +cd "%EXEC_DIR%" + +:endDetectBaseDir + +IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig + +@setlocal EnableExtensions EnableDelayedExpansion +for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a +@endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% + +:endReadAdditionalConfig + +SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" +set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" +set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain + +set DOWNLOAD_URL="https://repo.maven.apache.org/maven2/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + +FOR /F "tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( + IF "%%A"=="wrapperUrl" SET DOWNLOAD_URL=%%B +) + +@REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central +@REM This allows using the maven wrapper in projects that prohibit checking in binary data. +if exist %WRAPPER_JAR% ( + if "%MVNW_VERBOSE%" == "true" ( + echo Found %WRAPPER_JAR% + ) +) else ( + if not "%MVNW_REPOURL%" == "" ( + SET DOWNLOAD_URL="%MVNW_REPOURL%/io/takari/maven-wrapper/0.5.6/maven-wrapper-0.5.6.jar" + ) + if "%MVNW_VERBOSE%" == "true" ( + echo Couldn't find %WRAPPER_JAR%, downloading it ... + echo Downloading from: %DOWNLOAD_URL% + ) + + powershell -Command "&{"^ + "$webclient = new-object System.Net.WebClient;"^ + "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ + "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ + "}"^ + "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%DOWNLOAD_URL%', '%WRAPPER_JAR%')"^ + "}" + if "%MVNW_VERBOSE%" == "true" ( + echo Finished downloading %WRAPPER_JAR% + ) +) +@REM End of extension + +@REM Provide a "standardized" way to retrieve the CLI args that will +@REM work with both Windows and non-Windows executions. +set MAVEN_CMD_LINE_ARGS=%* + +%MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* +if ERRORLEVEL 1 goto error +goto end + +:error +set ERROR_CODE=1 + +:end +@endlocal & set ERROR_CODE=%ERROR_CODE% + +if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost +@REM check for post script, once with legacy .bat ending and once with .cmd ending +if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" +if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" +:skipRcPost + +@REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' +if "%MAVEN_BATCH_PAUSE%" == "on" pause + +if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% + +exit /B %ERROR_CODE% diff --git a/passuser/pom.xml b/passuser/pom.xml new file mode 100644 index 0000000..8927726 --- /dev/null +++ b/passuser/pom.xml @@ -0,0 +1,201 @@ + + + 4.0.0 + + org.springframework.boot + spring-boot-starter-parent + 2.1.3.RELEASE + + + com.passuser + passuser + 0.0.1-SNAPSHOT + passuser + Demo project for Spring Boot + + + 1.8 + + + + + org.springframework.boot + spring-boot-starter-web + + + org.projectlombok + lombok + true + + + org.springframework.boot + spring-boot-starter-test + 2.1.3.RELEASE + test + + + org.junit.vintage + junit-vintage-engine + + + + + org.apache.httpcomponents + httpclient + 4.5.10 + + + com.google.code.gson + gson + 2.8.6 + + + org.bouncycastle + bcprov-jdk15on + 1.68 + + + + io.jsonwebtoken + jjwt + 0.9.0 + + + + com.alibaba + fastjson + 1.2.31 + + + nl.bitwalker + UserAgentUtils + 1.2.4 + + + commons-codec + commons-codec + 1.6 + + + + javax.servlet + javax.servlet-api + provided + + + + javax.servlet + jstl + + + + org.springframework.boot + spring-boot-starter-tomcat + provided + + + + org.apache.tomcat.embed + tomcat-embed-jasper + + + + mysql + mysql-connector-java + 8.0.12 + + + + org.springframework.boot + spring-boot-starter-jdbc + 2.1.3.RELEASE + + + org.springframework.boot + spring-boot-starter-data-redis + 2.1.3.RELEASE + + + + com.dyuproject.protostuff + protostuff-core + 1.0.12 + + + com.dyuproject.protostuff + protostuff-runtime + 1.0.12 + + + org.objenesis + objenesis + 3.1 + + + org.springframework.boot + spring-boot-starter-thymeleaf + + + com.ibeetl + beetl + 2.9.3 + + + org.apache.commons + commons-lang3 + 3.7 + + + commons-lang + commons-lang + 2.6 + + + + + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${java.version} + ${java.version} + + + + net-web + + + src/main/resources + + **/*.* + + + + + + + alimaven + aliyun maven + http://maven.aliyun.com/nexus/content/groups/public/ + + true + + + false + + + + diff --git a/passuser/src/main/java/com/passuser/net/KeyUtils/PCIKeyPair.java b/passuser/src/main/java/com/passuser/net/KeyUtils/PCIKeyPair.java new file mode 100644 index 0000000..2bfbd80 --- /dev/null +++ b/passuser/src/main/java/com/passuser/net/KeyUtils/PCIKeyPair.java @@ -0,0 +1,20 @@ +package com.passuser.net.KeyUtils; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class PCIKeyPair { + + private String priKey; //私钥 + private String pubKey; //公钥 + private String username; //用户名 + + public PCIKeyPair(String priKey, String pubKey) { + this.priKey = priKey; + this.pubKey = pubKey; + } +} \ No newline at end of file diff --git a/passuser/src/main/java/com/passuser/net/KeyUtils/SM2Util.java b/passuser/src/main/java/com/passuser/net/KeyUtils/SM2Util.java new file mode 100644 index 0000000..ab6fc7d --- /dev/null +++ b/passuser/src/main/java/com/passuser/net/KeyUtils/SM2Util.java @@ -0,0 +1,283 @@ +package com.passuser.net.KeyUtils; + + +import com.passuser.net.utils.CommonUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.codec.binary.Base64; +import org.bouncycastle.asn1.gm.GMNamedCurves; +import org.bouncycastle.asn1.x9.X9ECParameters; +import org.bouncycastle.crypto.AsymmetricCipherKeyPair; +import org.bouncycastle.crypto.engines.SM2Engine; +import org.bouncycastle.crypto.generators.ECKeyPairGenerator; +import org.bouncycastle.crypto.params.*; +import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey; +import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey; +import org.bouncycastle.jce.spec.ECParameterSpec; +import org.bouncycastle.math.ec.ECPoint; +import org.bouncycastle.util.encoders.Hex; + +import java.math.BigInteger; +import java.security.*; + +/** + * @Author: dzy + * @Date: 2018/9/28 15:53 + * @Describe: SM2工具类 + */ +@Slf4j +public class SM2Util { + + /** + * 生成SM2公私钥对 + * @return + */ + private static AsymmetricCipherKeyPair genKeyPair0() { + //获取一条SM2曲线参数 + X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1"); + + //构造domain参数 + ECDomainParameters domainParameters = new ECDomainParameters(sm2ECParameters.getCurve(), + sm2ECParameters.getG(), sm2ECParameters.getN()); + + //1.创建密钥生成器 + ECKeyPairGenerator keyPairGenerator = new ECKeyPairGenerator(); + + //2.初始化生成器,带上随机数 + try { + keyPairGenerator.init(new ECKeyGenerationParameters(domainParameters, SecureRandom.getInstance("SHA1PRNG"))); + } catch (NoSuchAlgorithmException e) { + log.error("生成公私钥对时出现异常:", e); +// e.printStackTrace(); + } + + //3.生成密钥对 + AsymmetricCipherKeyPair asymmetricCipherKeyPair = keyPairGenerator.generateKeyPair(); + return asymmetricCipherKeyPair; + } + + /** + * 生成公私钥对(默认压缩公钥) + * @return + */ + public static PCIKeyPair genKeyPair() { + return genKeyPair(true); + } + + /** + * 生成公私钥对 + * @param compressedPubKey 是否压缩公钥 + * @return + */ + public static PCIKeyPair genKeyPair(boolean compressedPubKey) { + AsymmetricCipherKeyPair asymmetricCipherKeyPair = genKeyPair0(); + + //提取公钥点 + ECPoint ecPoint = ((ECPublicKeyParameters) asymmetricCipherKeyPair.getPublic()).getQ(); + //公钥前面的02或者03表示是压缩公钥,04表示未压缩公钥,04的时候,可以去掉前面的04 + String pubKey = Hex.toHexString(ecPoint.getEncoded(compressedPubKey)); + + BigInteger privatekey = ((ECPrivateKeyParameters) asymmetricCipherKeyPair.getPrivate()).getD(); + String priKey = privatekey.toString(16); + + PCIKeyPair keyPair = new PCIKeyPair(priKey, pubKey); + return keyPair; + } + + + /** + * 将R或者S修正为固定字节数 + * @param rs + * @return + */ + private static byte[] modifyRSFixedBytes(byte[] rs) { + int length = rs.length; + int fixedLength = 32; + byte[] result = new byte[fixedLength]; + if (length < 32) { + System.arraycopy(rs, 0, result, fixedLength - length, length); + } else { + System.arraycopy(rs, length - fixedLength, result, 0, fixedLength); + } + return result; + } + + + /** + * SM2加密算法 + * @param publicKey 公钥 + * @param data 数据 + * @return + */ + public static String encrypt(String publicKey, String data){ + // 获取一条SM2曲线参数 + X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1"); + // 构造domain参数 + ECDomainParameters domainParameters = new ECDomainParameters(sm2ECParameters.getCurve(), + sm2ECParameters.getG(), + sm2ECParameters.getN()); + //提取公钥点 + ECPoint pukPoint = sm2ECParameters.getCurve().decodePoint(CommonUtils.hexString2byte(publicKey)); + // 公钥前面的02或者03表示是压缩公钥,04表示未压缩公钥, 04的时候,可以去掉前面的04 + ECPublicKeyParameters publicKeyParameters = new ECPublicKeyParameters(pukPoint, domainParameters); + + SM2Engine sm2Engine = new SM2Engine(); + sm2Engine.init(true, new ParametersWithRandom(publicKeyParameters, new SecureRandom())); + + byte[] arrayOfBytes = null; + try { + byte[] in = data.getBytes("utf-8"); + arrayOfBytes = sm2Engine.processBlock(in, 0, in.length); + } catch (Exception e) { + log.error("SM2加密时出现异常:", e); + } + return Hex.toHexString(arrayOfBytes); + } + + /** + * SM2加密算法 + * @param publicKey 公钥 + * @param data 明文数据 + * @return + */ + public static String encrypt(PublicKey publicKey, String data) { + + ECPublicKeyParameters ecPublicKeyParameters = null; + if (publicKey instanceof BCECPublicKey) { + BCECPublicKey bcecPublicKey = (BCECPublicKey) publicKey; + ECParameterSpec ecParameterSpec = bcecPublicKey.getParameters(); + ECDomainParameters ecDomainParameters = new ECDomainParameters(ecParameterSpec.getCurve(), + ecParameterSpec.getG(), ecParameterSpec.getN()); + ecPublicKeyParameters = new ECPublicKeyParameters(bcecPublicKey.getQ(), ecDomainParameters); + } + + SM2Engine sm2Engine = new SM2Engine(); + sm2Engine.init(true, new ParametersWithRandom(ecPublicKeyParameters, new SecureRandom())); + + byte[] arrayOfBytes = null; + try { + byte[] in = data.getBytes("utf-8"); + arrayOfBytes = sm2Engine.processBlock(in,0, in.length); + } catch (Exception e) { + log.error("SM2加密时出现异常:", e); + } + return Hex.toHexString(arrayOfBytes); + } + + /** + * SM2解密算法 + * @param privateKey 私钥 + * @param cipherData 密文数据 + * @return + */ + public static String decrypt(String privateKey, String cipherData) { + byte[] cipherDataByte = Hex.decode(cipherData); + + //获取一条SM2曲线参数 + X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1"); + //构造domain参数 + ECDomainParameters domainParameters = new ECDomainParameters(sm2ECParameters.getCurve(), + sm2ECParameters.getG(), sm2ECParameters.getN()); + + BigInteger privateKeyD = new BigInteger(privateKey, 16); + ECPrivateKeyParameters privateKeyParameters = new ECPrivateKeyParameters(privateKeyD, domainParameters); + + SM2Engine sm2Engine = new SM2Engine(); + sm2Engine.init(false, privateKeyParameters); + + String result = null; + try { + byte[] arrayOfBytes = sm2Engine.processBlock(cipherDataByte, 0, cipherDataByte.length); + return new String(arrayOfBytes, "utf-8"); + } catch (Exception e) { + log.error("SM2解密时出现异常:", e); + } + return result; + + } + + /** + * SM2解密算法 + * @param privateKey 私钥 + * @param cipherData 密文数据 + * @return + */ + public static String decrypt(PrivateKey privateKey, String cipherData) { + byte[] cipherDataByte = Hex.decode(cipherData); + + BCECPrivateKey bcecPrivateKey = (BCECPrivateKey) privateKey; + ECParameterSpec ecParameterSpec = bcecPrivateKey.getParameters(); + + ECDomainParameters ecDomainParameters = new ECDomainParameters(ecParameterSpec.getCurve(), + ecParameterSpec.getG(), ecParameterSpec.getN()); + + ECPrivateKeyParameters ecPrivateKeyParameters = new ECPrivateKeyParameters(bcecPrivateKey.getD(), + ecDomainParameters); + + SM2Engine sm2Engine = new SM2Engine(); + sm2Engine.init(false, ecPrivateKeyParameters); + + String result = null; + try { + byte[] arrayOfBytes = sm2Engine.processBlock(cipherDataByte, 0, cipherDataByte.length); + return new String(arrayOfBytes, "utf-8"); + } catch (Exception e) { + log.error("SM2解密时出现异常:", e); + } + return result; + } + + /** + * 将未压缩公钥压缩成压缩公钥 + * @param pubKey 未压缩公钥(16进制,不要带头部04) + * @return + */ + public static String compressPubKey(String pubKey) { + pubKey = "04"+ pubKey; //将未压缩公钥加上未压缩标识. + // 获取一条SM2曲线参数 + X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1"); + // 构造domain参数 + ECDomainParameters domainParameters = new ECDomainParameters(sm2ECParameters.getCurve(), + sm2ECParameters.getG(), + sm2ECParameters.getN()); + //提取公钥点 + ECPoint pukPoint = sm2ECParameters.getCurve().decodePoint(CommonUtils.hexString2byte(pubKey)); + // 公钥前面的02或者03表示是压缩公钥,04表示未压缩公钥, 04的时候,可以去掉前面的04 +// ECPublicKeyParameters publicKeyParameters = new ECPublicKeyParameters(pukPoint, domainParameters); + + String compressPubKey = Hex.toHexString(pukPoint.getEncoded(Boolean.TRUE)); + + return compressPubKey; + } + + /** + * 将压缩的公钥解压为非压缩公钥 + * @param compressKey 压缩公钥 + * @return + */ + public static String unCompressPubKey(String compressKey) { + // 获取一条SM2曲线参数 + X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1"); + // 构造domain参数 + ECDomainParameters domainParameters = new ECDomainParameters(sm2ECParameters.getCurve(), + sm2ECParameters.getG(), + sm2ECParameters.getN()); + //提取公钥点 + ECPoint pukPoint = sm2ECParameters.getCurve().decodePoint(CommonUtils.hexString2byte(compressKey)); + // 公钥前面的02或者03表示是压缩公钥,04表示未压缩公钥, 04的时候,可以去掉前面的04 +// ECPublicKeyParameters publicKeyParameters = new ECPublicKeyParameters(pukPoint, domainParameters); + + String pubKey = Hex.toHexString(pukPoint.getEncoded(Boolean.FALSE)); + pubKey = pubKey.substring(2); //去掉前面的04 (04的时候,可以去掉前面的04) + + return pubKey; + } + + /** + * 取得公私钥字符串。 + */ + public static String getKeyStr(Key key) { + return Base64.encodeBase64String(key.getEncoded()); + } + + +} diff --git a/passuser/src/main/java/com/passuser/net/KeyUtils/Sm3Utils.java b/passuser/src/main/java/com/passuser/net/KeyUtils/Sm3Utils.java new file mode 100644 index 0000000..d65b12e --- /dev/null +++ b/passuser/src/main/java/com/passuser/net/KeyUtils/Sm3Utils.java @@ -0,0 +1,75 @@ +package com.passuser.net.KeyUtils; + + +import java.io.UnsupportedEncodingException; +import java.security.SecureRandom; + +import org.apache.commons.codec.binary.Hex; +import org.bouncycastle.crypto.digests.SM3Digest; +import org.bouncycastle.jce.provider.BouncyCastleProvider; + +import javax.crypto.KeyGenerator; + +/** + * @author CHENR + * @Title: Sm3Utils + * @ProjectName upds + * @Description: TODO + * @date 2019/9/611:13 + */ +public class Sm3Utils { + private final static byte[] hex = "0123456789ABCDEF".getBytes(); + // 128-32位16进制;256-64位16进制 + public static final int DEFAULT_KEY_SIZE = 128; + public static final String ALGORITHM_NAME = "SM3"; + + + /** + * @desc SM3加密算法实现方法 + * @param data + * @return + */ + public static byte[] digest(byte[] data) { + SM3Digest sm3 = new SM3Digest(); + byte[] result = null; + try { + sm3.update(data, 0, data.length); + result = new byte[sm3.getDigestSize()]; + sm3.doFinal(result, 0); + } catch (Exception e) { + System.out.println("Fail: SM3 byte[] to byte[]" + e); + } + return result; + } + + /** + * @desc 将字节数组转换为16进制的字符串 + * @param b + * @return + */ + public static String bytes2HexString(byte[] b) { + byte[] buff = new byte[2 * b.length]; + for (int i = 0; i < b.length; i++) { + buff[2 * i] = hex[(b[i] >> 4) & 0x0f]; + buff[2 * i + 1] = hex[b[i] & 0x0f]; + } + return new String(buff); + } + + /** + * @desc 调用该方法使用SM3算法对手机号、卡号、证件号进行加密,输出16进制的密文字符串 + * @param msg 要加密的信息 + * @return 16进制的加密密文字符串,如加密算法调用失败返回空串 + */ + public static String encryptBySm3(String msg) { + try { + String encryptedCardNo = bytes2HexString(digest(msg.getBytes("UTF-8"))); + return encryptedCardNo; + } catch (UnsupportedEncodingException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + return ""; + } + } + +} diff --git a/passuser/src/main/java/com/passuser/net/KeyUtils/Sm4Util.java b/passuser/src/main/java/com/passuser/net/KeyUtils/Sm4Util.java new file mode 100644 index 0000000..5fbf4b3 --- /dev/null +++ b/passuser/src/main/java/com/passuser/net/KeyUtils/Sm4Util.java @@ -0,0 +1,176 @@ +package com.passuser.net.KeyUtils; + +import org.apache.commons.codec.binary.Hex; +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.bouncycastle.pqc.math.linearalgebra.ByteUtils; + +import javax.crypto.Cipher; +import javax.crypto.KeyGenerator; +import javax.crypto.spec.SecretKeySpec; +import java.security.Key; +import java.security.SecureRandom; +import java.security.Security; +import java.util.Arrays; + +public class Sm4Util { + static { + Security.addProvider(new BouncyCastleProvider()); + } + + private static final String ENCODING = "UTF-8"; + public static final String ALGORITHM_NAME = "SM4"; + // 加密算法/分组加密模式/分组填充方式 + // PKCS5Padding-以8个字节为一组进行分组加密 + // 定义分组加密模式使用:PKCS5Padding + public static final String ALGORITHM_NAME_ECB_PADDING = "SM4/ECB/PKCS5Padding"; + // 128-32位16进制;256-64位16进制 + public static final int DEFAULT_KEY_SIZE = 128; + + /** + * 自动生成密钥 + * + * @return + * @explain + */ + public static String generateKey() throws Exception { + return new String(Hex.encodeHex(generateKey(DEFAULT_KEY_SIZE),false)); + } + + /** + * @param keySize + * @return + * @throws Exception + * @explain + */ + public static byte[] generateKey(int keySize) throws Exception { + KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM_NAME, BouncyCastleProvider.PROVIDER_NAME); + kg.init(keySize, new SecureRandom()); + return kg.generateKey().getEncoded(); + } + + /** + * 生成ECB暗号 + * + * @param algorithmName 算法名称 + * @param mode 模式 + * @param key + * @return + * @throws Exception + * @explain ECB模式(电子密码本模式:Electronic codebook) + */ + private static Cipher generateEcbCipher(String algorithmName, int mode, byte[] key) throws Exception { + Cipher cipher = Cipher.getInstance(algorithmName, BouncyCastleProvider.PROVIDER_NAME); + Key sm4Key = new SecretKeySpec(key, ALGORITHM_NAME); + cipher.init(mode, sm4Key); + return cipher; + } + + /** + * sm4加密 + * + * @param hexKey 16进制密钥(忽略大小写) + * @param paramStr 待加密字符串 + * @return 返回16进制的加密字符串 + * @explain 加密模式:ECB + * 密文长度不固定,会随着被加密字符串长度的变化而变化 + */ + public static String encryptEcb(String hexKey, String paramStr) { + try { + String cipherText = ""; + // 16进制字符串-->byte[] + byte[] keyData = ByteUtils.fromHexString(hexKey); + // String-->byte[] + byte[] srcData = paramStr.getBytes(ENCODING); + // 加密后的数组 + byte[] cipherArray = encrypt_Ecb_Padding(keyData, srcData); + // byte[]-->hexString + cipherText = ByteUtils.toHexString(cipherArray); + return cipherText; + } catch (Exception e) { + return paramStr; + } + } + + /** + * 加密模式之Ecb + * + * @param key + * @param data + * @return + * @throws Exception + * @explain + */ + public static byte[] encrypt_Ecb_Padding(byte[] key, byte[] data) throws Exception { + Cipher cipher = generateEcbCipher(ALGORITHM_NAME_ECB_PADDING, Cipher.ENCRYPT_MODE, key); + return cipher.doFinal(data); + } + + /** + * sm4解密 + * + * @param hexKey 16进制密钥 + * @param cipherText 16进制的加密字符串(忽略大小写) + * @return 解密后的字符串 + * @throws Exception + * @explain 解密模式:采用ECB + */ + public static String decryptEcb(String hexKey, String cipherText) { + // 用于接收解密后的字符串 + String decryptStr = ""; + // hexString-->byte[] + byte[] keyData = ByteUtils.fromHexString(hexKey); + // hexString-->byte[] + byte[] cipherData = ByteUtils.fromHexString(cipherText); + // 解密 + byte[] srcData = new byte[0]; + try { + srcData = decrypt_Ecb_Padding(keyData, cipherData); + // byte[]-->String + decryptStr = new String(srcData, ENCODING); + } catch (Exception e) { + e.printStackTrace(); + } + return decryptStr; + } + + /** + * 解密 + * + * @param key + * @param cipherText + * @return + * @throws Exception + * @explain + */ + public static byte[] decrypt_Ecb_Padding(byte[] key, byte[] cipherText) throws Exception { + Cipher cipher = generateEcbCipher(ALGORITHM_NAME_ECB_PADDING, Cipher.DECRYPT_MODE, key); + return cipher.doFinal(cipherText); + } + + /** + * 校验加密前后的字符串是否为同一数据 + * + * @param hexKey 16进制密钥(忽略大小写) + * @param cipherText 16进制加密后的字符串 + * @param paramStr 加密前的字符串 + * @return 是否为同一数据 + * @throws Exception + * @explain + */ + public static boolean verifyEcb(String hexKey, String cipherText, String paramStr) throws Exception { + // 用于接收校验结果 + boolean flag = false; + // hexString-->byte[] + byte[] keyData = ByteUtils.fromHexString(hexKey); + // 将16进制字符串转换成数组 + byte[] cipherData = ByteUtils.fromHexString(cipherText); + // 解密 + byte[] decryptData = decrypt_Ecb_Padding(keyData, cipherData); + // 将原字符串转换成byte[] + byte[] srcData = paramStr.getBytes(ENCODING); + // 判断2个数组是否一致 + flag = Arrays.equals(decryptData, srcData); + return flag; + } + +} diff --git a/passuser/src/main/java/com/passuser/net/KeyUtils/XORUtils.java b/passuser/src/main/java/com/passuser/net/KeyUtils/XORUtils.java new file mode 100644 index 0000000..3f7400d --- /dev/null +++ b/passuser/src/main/java/com/passuser/net/KeyUtils/XORUtils.java @@ -0,0 +1,91 @@ +package com.passuser.net.KeyUtils; + +import java.io.BufferedOutputStream; +import java.io.Closeable; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; + +/** + * 异或(xor)算法加密/解密工具 + * + * @author xietansheng + */ +public class XORUtils { + + /** + * 异或算法加密/解密 + * + * @param data 数据(密文/明文) + * @param key 密钥 + * @return 返回解密/加密后的数据 + */ + public static byte[] encrypt(byte[] data, byte[] key) { + if (data == null || data.length == 0 || key == null || key.length == 0) { + return data; + } + + byte[] result = new byte[data.length]; + + // 使用密钥字节数组循环加密或解密 + for (int i = 0; i < data.length; i++) { + // 数据与密钥异或, 再与循环变量的低8位异或(增加复杂度) + result[i] = (byte) (data[i] ^ key[i % key.length] ^ (i & 0xFF)); + } + + return result; + } + + /** + * 对文件异或算法加密/解密 + * + * @param inFile 输入文件(密文/明文) + * @param outFile 结果输出文件 + * @param key 密钥 + */ + public static void encryptFile(File inFile, File outFile, byte[] key) throws Exception { + InputStream in = null; + OutputStream out = null; + + try { + // 文件输入流 + in = new FileInputStream(inFile); + // 结果输出流, 异或运算时, 字节是一个一个读取和写入, 这里必须使用缓冲流包装, + // 等缓冲到一定数量的字节(10240字节)后再写入磁盘(否则写磁盘次数太多, 速度会非常慢) + out = new BufferedOutputStream(new FileOutputStream(outFile), 10240); + + int b = -1; + long i = 0; + + // 每次循环读取文件的一个字节, 使用密钥字节数组循环加密或解密 + while ((b = in.read()) != -1) { + // 数据与密钥异或, 再与循环变量的低8位异或(增加复杂度) + b = (b ^ key[(int) (i % key.length)] ^ (int) (i & 0xFF)); + // 写入一个加密/解密后的字节 + out.write(b); + // 循环变量递增 + i++; + } + out.flush(); + + } finally { + close(in); + close(out); + } + } + + private static void close(Closeable c) { + if (c != null) { + try { + c.close(); + } catch (IOException e) { + // nothing + } + } + } + +} + diff --git a/passuser/src/main/java/com/passuser/net/PassuserApplication.java b/passuser/src/main/java/com/passuser/net/PassuserApplication.java new file mode 100644 index 0000000..3ff1387 --- /dev/null +++ b/passuser/src/main/java/com/passuser/net/PassuserApplication.java @@ -0,0 +1,13 @@ +package com.passuser.net; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class PassuserApplication { + + public static void main(String[] args) { + SpringApplication.run(PassuserApplication.class, args); + } + +} diff --git a/passuser/src/main/java/com/passuser/net/annotation/AuthToken.java b/passuser/src/main/java/com/passuser/net/annotation/AuthToken.java new file mode 100644 index 0000000..c007e83 --- /dev/null +++ b/passuser/src/main/java/com/passuser/net/annotation/AuthToken.java @@ -0,0 +1,19 @@ +package com.passuser.net.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @author Think + * @Title: AuthToken + * @ProjectName token-authentication + * @Description: TODO + * @date 2019/1/1815:52 + */ +@Target({ElementType.METHOD, ElementType.TYPE}) +@Retention(RetentionPolicy.RUNTIME) +public @interface AuthToken { + +} \ No newline at end of file diff --git a/passuser/src/main/java/com/passuser/net/configuration/WebAppConfiguration.java b/passuser/src/main/java/com/passuser/net/configuration/WebAppConfiguration.java new file mode 100644 index 0000000..9f9e071 --- /dev/null +++ b/passuser/src/main/java/com/passuser/net/configuration/WebAppConfiguration.java @@ -0,0 +1,62 @@ +package com.passuser.net.configuration; + +import com.fasterxml.jackson.annotation.JsonAutoDetect; +import com.fasterxml.jackson.annotation.PropertyAccessor; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.passuser.net.interceptor.AuthorizationInterceptor; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; +import org.springframework.data.redis.serializer.StringRedisSerializer; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * @author cailei.lu + * @description + * @date 2018/8/3 + */ +@Configuration +public class WebAppConfiguration implements WebMvcConfigurer { + @Bean + public AuthorizationInterceptor getAuthorizationInterceptor(){ + return new AuthorizationInterceptor(); + } + /** + * redisTemplate 序列化使用的jdkSerializeable, 存储二进制字节码, 所以自定义序列化类 + * @param redisConnectionFactory + * @return + */ + @Bean + public RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) { + RedisTemplate redisTemplate = new RedisTemplate<>(); + redisTemplate.setConnectionFactory(redisConnectionFactory); + + // 使用Jackson2JsonRedisSerialize 替换默认序列化 + Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); + + ObjectMapper objectMapper = new ObjectMapper(); + objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); + objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); + + jackson2JsonRedisSerializer.setObjectMapper(objectMapper); + + // 设置value的序列化规则和 key的序列化规则 + redisTemplate.setValueSerializer(new StringRedisSerializer()); + redisTemplate.setKeySerializer(new StringRedisSerializer()); + redisTemplate.afterPropertiesSet(); + return redisTemplate; + } + @Override + public void addInterceptors(InterceptorRegistry registry) { + registry.addInterceptor(getAuthorizationInterceptor()).addPathPatterns("/**"); + } + public void addResourceHandlers(ResourceHandlerRegistry registry) { + //将所有/static/** 访问都映射到classpath:/static/ 目录下 + registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/"); + } + +} diff --git a/passuser/src/main/java/com/passuser/net/controller/key/KeyController.java b/passuser/src/main/java/com/passuser/net/controller/key/KeyController.java new file mode 100644 index 0000000..456cdfb --- /dev/null +++ b/passuser/src/main/java/com/passuser/net/controller/key/KeyController.java @@ -0,0 +1,461 @@ +package com.passuser.net.controller.key; + +import ch.qos.logback.core.encoder.ByteArrayUtil; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.google.gson.Gson; +import com.google.gson.reflect.TypeToken; +import com.passuser.net.KeyUtils.*; +import com.passuser.net.annotation.AuthToken; +import com.passuser.net.entity.PpassInstant; +import com.passuser.net.utils.*; +import lombok.SneakyThrows; +import org.apache.commons.lang.time.DateFormatUtils; +import org.apache.http.cookie.SM; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.text.SimpleDateFormat; +import java.util.*; + +@Controller +@RequestMapping("/passInstant") +public class KeyController { + + @Resource + private RedisTemplate redisTemplate; + + @Autowired + private ResolveResponUtils resolveResponUtils; + + private SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd"); + + private String PREFIX = "/PassInstant/passInstant/"; + + /** + * 跳转到密钥管理首页 + */ + @RequestMapping("") + public String index() { + return PREFIX + "passInstant.html"; + } + + @RequestMapping("passInstant_upload") + public String uploadPpass(){return PREFIX + "passInstant_upload.html";} + + /** + * 跳转到添加密钥管理 + */ + @RequestMapping("/passInstant_add") + public String passInstantAdd() { + return PREFIX + "passInstant_add.html"; + } + + @RequestMapping("/list") + @AuthToken + @ResponseBody + public String getKeyList(HttpServletRequest request) throws Exception { + String token = CookieUtils.getCookieValue(request, "Authorization"); + String username = redisTemplate.opsForValue().get(token); + List strList = new ArrayList<>(); + strList.add("encryptData"); + Map encryptData = resolveResponUtils.getGetResponseDecryptData("http://localhost:18088/us-admin/remote/getKeyList/" + username, null, strList); + Gson gson = new Gson(); + List nowPassInstant = gson.fromJson(encryptData.get("encryptData"), new TypeToken>() { + }.getType()); + Map hashMap = new HashMap<>(); + hashMap.put("code", "0"); + hashMap.put("data", nowPassInstant); + String postJSON = gson.toJson(hashMap); + return postJSON; + } + + @RequestMapping("/add") + @AuthToken + public String generateKeyAndUpload(PpassInstant ppassInstant, HttpServletRequest request) throws Exception { + String passType = ppassInstant.getPassType(); + ppassInstant.setPassCreatetime(DateFormatUtils.format(new Date(), "yyyy-MM-dd hh:mm:ss")); + return addNewKeyByData(ppassInstant, request, passType); + + } + + private String addNewKeyByData(PpassInstant ppassInstant, HttpServletRequest request, String passType) throws Exception { + switch (passType) { + case "SM4": + Map SM4flag = generateSM4Key(ppassInstant, request); + SM4flag.put("keyId", ppassInstant.getPassId() + ""); + return SM4flag.get("flag").equals("true") ? PREFIX + "passInstant.html" : "404.html"; + case "SM2": + Map SM2flag = generateSM2key(ppassInstant, request); + SM2flag.put("keyId", ppassInstant.getPassId() + ""); + return SM2flag.get("flag").equals("true") ? PREFIX + "passInstant.html" : "404.html"; + case ("AES"): + Map AESflag = generateAESKey(ppassInstant, request); + AESflag.put("keyId", ppassInstant.getPassId() + ""); + return AESflag.get("flag").equals("true") ? PREFIX + "passInstant.html" : "404.html"; + case ("DES"): + Map DESflag = generateDESKey(ppassInstant, request); + DESflag.put("keyId", ppassInstant.getPassId() + ""); + return DESflag.get("flag").equals("true") ? PREFIX + "passInstant.html" : "404.html"; + case ("RSA"): + Map RSAflag = generateRSAkey(ppassInstant, request); + RSAflag.put("keyId", ppassInstant.getPassId() + ""); + return RSAflag.get("flag").equals("true") ? PREFIX + "passInstant.html" : "404.html"; + default: + return "404.html"; + } + } + + private Map generateSM2key(PpassInstant ppassInstant, HttpServletRequest request) throws Exception { + Map sm2key = getSM2KeyPairToJSON(); + return resolveSetPpassInstant(ppassInstant, request, sm2key); + } + + private Map generateSM4Key(PpassInstant ppassInstant, HttpServletRequest request) throws Exception { + String sm4key = Sm4Util.generateKey(); + return resolveSetPpassInstant(ppassInstant, request, sm4key); + } + + + @RequestMapping("updateKey/{keyId}") + @AuthToken + public String updateKeyAndUpload(@PathVariable("keyId") String keyId, @ModelAttribute PpassInstant ppassInstant, Model model, HttpServletRequest request) throws Exception { + return UpdateKeyAndUpload(keyId, ppassInstant, request); + } + + private String UpdateKeyAndUpload(@PathVariable("keyId") String keyId, @ModelAttribute PpassInstant ppassInstant, HttpServletRequest request) throws Exception { + String passType = ppassInstant.getPassType(); + switch (passType) { + case ("SM4"): + String sm4key = Sm4Util.generateKey(); + Map SM4flag = resolveSetPpassInstantById(keyId, ppassInstant, request, sm4key); + return SM4flag.get("flag").equals("true") ? PREFIX + "passInstant.html" : "404.html"; + case ("SM2"): + Map sm2key = getSM2KeyPairToJSON(); + Map SM2flag = resolveSetSM2PpassInstantById(keyId, ppassInstant, request, sm2key); + return SM2flag.get("flag").equals("true") ? PREFIX + "passInstant.html" : "404.html"; + case ("AES"): + Map AESflag = generateAESKey(ppassInstant, request); + AESflag.put("keyId", ppassInstant.getPassId() + ""); + return AESflag.get("flag").equals("true") ? PREFIX + "passInstant.html" : "404.html"; + case ("DES"): + Map DESflag = generateDESKey(ppassInstant, request); + DESflag.put("keyId", ppassInstant.getPassId() + ""); + return DESflag.get("flag").equals("true") ? PREFIX + "passInstant.html" : "404.html"; + case ("RSA"): + Map RSAflag = generateRSAkey(ppassInstant, request); + RSAflag.put("keyId", ppassInstant.getPassId() + ""); + return RSAflag.get("flag").equals("true") ? PREFIX + "passInstant.html" : "404.html"; + default: + return "404.html"; + } + } + + @RequestMapping("download/{keyId}") + @AuthToken + @ResponseBody + public String download(@PathVariable("keyId") String keyId, Model model, HttpServletRequest request, HttpServletResponse response,@RequestParam("username")String qianyiUser) throws Exception { + String token = CookieUtils.getCookieValue(request, "Authorization"); + String username = redisTemplate.opsForValue().get(token); + String key = downloadKeyByKeyId(keyId, username, qianyiUser); + // 以流的形式下载文件。 + InputStream fis = new BufferedInputStream(new ByteArrayInputStream(key.getBytes("utf-8"))); + byte[] buffer = new byte[fis.available()]; + fis.read(buffer); + fis.close(); + // 清空response + response.reset(); + // 设置response的Header + response.addHeader("Content-Disposition", "attachment;filename=" + new String("key.txt".getBytes())); + response.addHeader("Content-Length", "" + key.length()); + OutputStream toClient = new BufferedOutputStream(response.getOutputStream()); + response.setContentType("application/octet-stream"); + toClient.write(buffer); + toClient.flush(); + toClient.close(); + return "下载成功"; + } + + @RequestMapping("update/{keyId}") + @AuthToken + @ResponseBody + public String updateKey(@PathVariable("keyId") String keyId, HttpServletRequest request) throws Exception { + String token = CookieUtils.getCookieValue(request, "Authorization"); + String username = redisTemplate.opsForValue().get(token); + Map keyDataMap = getKeyDataMap(keyId, username); + String keytype = keyDataMap.get("keytype"); + deleteByKeyId(keyId,username); + PpassInstant ppassInstant = new PpassInstant(); + ppassInstant.setPassType(keytype); + ppassInstant.setPassId(Integer.parseInt(keyId)+1); + ppassInstant.setPassName(keyId+" update key"); + ppassInstant.setPassExpiry(DateFormatUtils.format(DateUtils.rollMon(new Date(),1),"yyyy-MM-dd")); + ppassInstant.setPassCreatetime(DateFormatUtils.format(new Date(), "yyyy-MM-dd hh:mm:ss")); + return generateKeyAndUpload(ppassInstant,request); + } + + @RequestMapping("delete/{keyId}") + @AuthToken + @ResponseBody + public String deleteKey(@PathVariable("keyId") String keyId, HttpServletRequest request) throws Exception { + String token = CookieUtils.getCookieValue(request, "Authorization"); + String username = redisTemplate.opsForValue().get(token); + String flag = deleteByKeyId(keyId, username); + return flag.equals("true") ? "/passInstant" : "404.html"; + } + + /** + * 上传推荐资料 + */ + @RequestMapping(value = "/upload",method= RequestMethod.POST) + @ResponseBody + public String handleFileUpload(HttpServletRequest request, @RequestParam("file") MultipartFile file) throws Exception { + if (!file.isEmpty()) { + try { + BufferedOutputStream out = new BufferedOutputStream( + new FileOutputStream(new File( + file.getOriginalFilename()))); + System.out.println(file.getName()); + out.write(file.getBytes()); + out.flush(); + out.close(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + return "上传失败," + e.getMessage(); + } catch (IOException e) { + e.printStackTrace(); + return "上传失败," + e.getMessage(); + } + //上传文件路径 + String path = request.getServletContext().getRealPath("/systemFiles/"); + //上传文件名 + String filename = file.getOriginalFilename(); + File filepath = new File(path, filename); + //判断路径是否存在,如果不存在就创建一个 + if (!filepath.getParentFile().exists()) { + filepath.getParentFile().mkdirs(); + } //将上传文件保存到一个目标文件当中 + file.transferTo(new File(path + File.separator + filename)); + File readTxt = new File(path + File.separator + filename); + BufferedReader reader = null; + String tempString = null; + StringBuffer sb = new StringBuffer(); + try { + // System.out.println("以行为单位读取文件内容,一次读一整行:"); + reader = new BufferedReader(new InputStreamReader(new FileInputStream(readTxt),"UTF-8")); + while ((tempString = reader.readLine()) != null) { + sb.append(tempString); + } + reader.close(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + }finally{ + if(reader != null){ + try { + reader.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + String keyStr = sb.toString(); + Gson gson = new Gson(); + PpassInstant ppassInstant = gson.fromJson(keyStr, PpassInstant.class); + String priKey = resolveResponUtils.getGetResponseData("http://localhost:18087/remote/getSM2Pri/" + ppassInstant.getUsername(), null, "priKey"); + String fir = SM2Util.decrypt(priKey, ppassInstant.getPassChildfir()); + ppassInstant.setPassChildfir(fir); + if(ppassInstant.getPassChildsec()!=null){ + String sec = SM2Util.decrypt(priKey, ppassInstant.getPassChildsec()); + ppassInstant.setPassChildsec(sec); + Map hashMap = new HashMap<>(); + hashMap.put("priKey",ppassInstant.getPassChildfir()); + hashMap.put("pubKey",ppassInstant.getPassChildsec()); + ppassInstant.setPassId(ppassInstant.getPassId() + 1 ); + Map SM2flag = resolveSetPpassInstant(ppassInstant, request, hashMap); + return SM2flag.get("flag").equals("true") ? "上传成功" : "404.html"; + } + ppassInstant.setPassId(ppassInstant.getPassId() + 1 ); + Map uploadKeyflag = resolveSetPpassInstant(ppassInstant, request,fir); + return uploadKeyflag.get("flag").equals("true") ? "上传成功" : "404.html"; + } else { + return "404.html"; + } + } + + @RequestMapping("/passInstant_download/{ppassId}") + public String passInstant_download(@PathVariable("ppassId")String ppassId,Model model){ + model.addAttribute("ppassId",ppassId); + return PREFIX + "passInstant_download.html"; + } + + private String deleteByKeyId(String keyId, String username) throws Exception { + List flagList = new ArrayList<>(); + flagList.add("flag"); + Map flagMap = resolveResponUtils.getGetResponseDecryptData("http://localhost:18088/us-admin/remote/deleteKey/" + keyId + "/" + username, null, flagList); + String flag = flagMap.get("flag"); + return flag; + } + + private String updateByKeyId(String keyId, String username) throws Exception { + List flagList = new ArrayList<>(); + flagList.add("flag"); + Map flagMap = resolveResponUtils.getGetResponseDecryptData("http://localhost:18088/us-admin/remote/updateKey/" + keyId + "/" + username, null, flagList); + String flag = flagMap.get("flag"); + return flag; + } + + private String downloadKeyByKeyId(String keyId, String username,String qianyiUser) throws Exception { + String keyPass = resolveResponUtils.getGetResponseData("http://localhost:18087/remote/getKeyPass/" + username , null, "keyPass"); + Map getKeyData = getKeyDataMap(keyId, username); + String keydata = getKeyData.get("keydata"); + if (keydata.contains("pubKey:")) { + String[] split = keydata.split("pubKey:"); + String[] split1 = split[1].split("priKey:"); + String pubKeyStr = new String(split1[0].getBytes()); + String priKeyStr = new String(split1[1].getBytes()); + String keyPubKey = resolveResponUtils.getGetResponseData("http://localhost:18087/remote/getSM2Pub/" + qianyiUser, null, "pubKey"); + String pubKey = Sm4Util.decryptEcb(keyPass, pubKeyStr); + String priKey = Sm4Util.decryptEcb(keyPass, priKeyStr); + String pubKeyEnc = SM2Util.encrypt(keyPubKey, pubKey); + String priKeyEnc = SM2Util.encrypt(keyPubKey, priKey); + PpassInstant ppassInstant = new PpassInstant(); + ppassInstant.setPassChildfir(pubKeyEnc); + ppassInstant.setPassChildsec(priKeyEnc); + ppassInstant.setPassType(getKeyData.get("keytype")); + ppassInstant.setUsername(qianyiUser); + ppassInstant.setPassId(Integer.parseInt(getKeyData.get("keyId"))); + Gson gson = new Gson(); + String keyJson = gson.toJson(ppassInstant); + return keyJson; + } + String keyPubKey = resolveResponUtils.getGetResponseData("http://localhost:18087/remote/getSM2Pub/" + username, null, "pubKey"); + String keyEnc = Sm4Util.decryptEcb(keyPass,keydata); + String encryptKey = SM2Util.encrypt(keyPubKey, keyEnc); + PpassInstant ppassInstant = new PpassInstant(); + ppassInstant.setPassChildfir(encryptKey); + ppassInstant.setPassType(getKeyData.get("keytype")); + ppassInstant.setPassId(Integer.parseInt(getKeyData.get("keyId"))); + ppassInstant.setUsername(qianyiUser); + Gson gson = new Gson(); + String keyJson = gson.toJson(ppassInstant); + return keyJson; + } + + private Map getKeyDataMap(String keyId, String username) throws Exception { + List keyStr = new ArrayList<>(); + keyStr.add("keydata"); + keyStr.add("keytype"); + keyStr.add("keyId"); + return resolveResponUtils.getGetResponseDecryptData("http://localhost:18088/us-admin/remote/getKeyById/" + keyId + "/" + username, null, keyStr); + } + + private Map resolveSetSM2PpassInstantById(String keyId, PpassInstant ppassInstant, HttpServletRequest request, Map key) throws Exception { + String token = CookieUtils.getCookieValue(request, "Authorization"); + String userName = redisTemplate.opsForValue().get(token); + String postJson = getKeyPostBody(ppassInstant, key, userName,token); + List strList = new ArrayList<>(); + strList.add("flag"); + return resolveResponUtils.getPostJsonResponseDecryptData("http://localhost:18088/us-admin/remote/keyUploadJson/" + keyId + "/" + userName, postJson, strList); + } + + private Map resolveSetPpassInstantById(String keyId, PpassInstant ppassInstant, HttpServletRequest request, String key) throws Exception { + String token = CookieUtils.getCookieValue(request, "Authorization"); + String userName = redisTemplate.opsForValue().get(token); + String postJson = getKeyPostBody(ppassInstant, key, userName, token); + List strList = new ArrayList<>(); + strList.add("flag"); + return resolveResponUtils.getPostJsonResponseDecryptData("http://localhost:18088/us-admin/remote/keyUploadJson/" + keyId + "/" + userName, postJson, strList); + } + + private String getKeyPostBody(PpassInstant ppassInstant, Map key, String userName, String token) throws Exception { + String keyPass = resolveResponUtils.getGetResponseData("http://localhost:18087/remote/getKeyPass/" + userName , null, "keyPass"); + String privateKey = Sm4Util.encryptEcb(keyPass, key.get("priKey")); + String publicKey = Sm4Util.encryptEcb(keyPass, key.get("pubKey")); + key.put("priKey",privateKey); + key.put("pubKey",publicKey); + ppassInstant.setPassCreatetime(DateFormatUtils.format(new Date(), "yyyy-MM-dd hh:mm:ss")); + ppassInstant.setPassExpiry(DateFormatUtils.format(DateUtils.rollDay(new Date(), 31), "yyyy-MM-dd")); + ppassInstant.setPassLength(new String(privateKey).length()); + ppassInstant.setPassChildfir(privateKey); + ppassInstant.setPassChildsec(publicKey); + Gson gson = new Gson(); + return gson.toJson(ppassInstant); + } + + private String getKeyPostBody(PpassInstant ppassInstant, String key, String userName, String token) throws Exception { + String keyPass = resolveResponUtils.getGetResponseData("http://localhost:18087/remote/getKeyPass/" + userName , null, "keyPass"); + String priKeyStr = Sm4Util.encryptEcb(keyPass, key); + ppassInstant.setPassCreatetime(DateFormatUtils.format(new Date(), "yyyy-MM-dd hh:mm:ss")); + ppassInstant.setPassExpiry(DateFormatUtils.format(DateUtils.rollDay(new Date(), 31), "yyyy-MM-dd")); + ppassInstant.setPassLength(key.length()); + ppassInstant.setPassChildfir(priKeyStr); + Gson gson = new Gson(); + return gson.toJson(ppassInstant); + } + + private Map getSM2KeyPairToJSON() { + PCIKeyPair pciKeyPair = SM2Util.genKeyPair(); + String priKey = pciKeyPair.getPriKey(); + String pubKey = pciKeyPair.getPubKey(); + Map hashMap = new HashMap<>(); + hashMap.put("priKey", priKey); + hashMap.put("pubKey", pubKey); + return hashMap; + } + + private Map resolveSetPpassInstant(@ModelAttribute PpassInstant ppassInstant, HttpServletRequest request, String key) throws Exception { + String token = CookieUtils.getCookieValue(request, "Authorization"); + String userName = redisTemplate.opsForValue().get(token); + String postJson = getKeyPostBody(ppassInstant, key, userName, token); + List strList = new ArrayList<>(); + strList.add("flag"); + strList.add("keyId"); + Map postList = resolveResponUtils.getPostJsonResponseDecryptData("http://localhost:18088/us-admin/remote/keySaveJson/" + userName, postJson, strList); + return postList; + } + + private Map resolveSetPpassInstant(@ModelAttribute PpassInstant ppassInstant, HttpServletRequest request, Map key) throws Exception { + String token = CookieUtils.getCookieValue(request, "Authorization"); + String userName = redisTemplate.opsForValue().get(token); + String postJson = getKeyPostBody(ppassInstant, key, userName,token); + List strList = new ArrayList<>(); + strList.add("flag"); + strList.add("keyId"); + Map postList = resolveResponUtils.getPostJsonResponseDecryptData("http://localhost:18088/us-admin/remote/keySaveJson/" + userName, postJson, strList); + return postList; + } + + private Map generateAESKey(PpassInstant ppassInstant, HttpServletRequest request) throws Exception { + String AESkey = Generatingkey.getAESKey(); + return resolveSetPpassInstant(ppassInstant, request, AESkey); + } + + private Map generateDESKey(PpassInstant ppassInstant, HttpServletRequest request) throws Exception { + String DESkey = Generatingkey.getDESKey(); + return resolveSetPpassInstant(ppassInstant, request, DESkey); + } + + private Map getRSAKeyPairToJSON() throws Exception { + PCIKeyPair pciKeyPair = SM2Util.genKeyPair(); + String priKey = RSAUtils.getPriKey(); + String pubKey = RSAUtils.getPubKey(); + Map hashMap = new HashMap<>(); + hashMap.put("priKey", priKey); + hashMap.put("pubKey", pubKey); + return hashMap; + } + + private Map generateRSAkey(PpassInstant ppassInstant, HttpServletRequest request) throws Exception { + Map RSAkey = getRSAKeyPairToJSON(); + return resolveSetPpassInstant(ppassInstant, request, RSAkey); + } +} diff --git a/passuser/src/main/java/com/passuser/net/controller/notice/NoticeController.java b/passuser/src/main/java/com/passuser/net/controller/notice/NoticeController.java new file mode 100644 index 0000000..5f5bba7 --- /dev/null +++ b/passuser/src/main/java/com/passuser/net/controller/notice/NoticeController.java @@ -0,0 +1,30 @@ +package com.passuser.net.controller.notice; + +import com.passuser.net.annotation.AuthToken; +import com.passuser.net.utils.R; +import com.passuser.net.utils.ResolveResponUtils; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.ResponseBody; + +import javax.servlet.http.HttpServletRequest; +import java.util.Arrays; +import java.util.Map; + +@Controller + +public class NoticeController { + + @Autowired + private ResolveResponUtils resolveResponUtils; + @RequestMapping("notice") + @AuthToken + @ResponseBody + public R getUserNotice(HttpServletRequest request) throws Exception { + String user = (String)request.getAttribute("user"); + Map noticelist = resolveResponUtils.getGetResponseDecryptData("http://localhost:18088/notice/" + user, null, Arrays.asList("noticelist")); + return new R().put("noticelist",noticelist.get("noticelist")); + } +} diff --git a/passuser/src/main/java/com/passuser/net/controller/user/UserController.java b/passuser/src/main/java/com/passuser/net/controller/user/UserController.java new file mode 100644 index 0000000..c188cdd --- /dev/null +++ b/passuser/src/main/java/com/passuser/net/controller/user/UserController.java @@ -0,0 +1,157 @@ +package com.passuser.net.controller.user; + +import com.google.gson.Gson; +import com.mysql.cj.util.StringUtils; +import com.passuser.net.KeyUtils.Sm4Util; +import com.passuser.net.annotation.AuthToken; +import com.passuser.net.utils.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Controller; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.*; + +@Controller +public class UserController { + + // 注入Md5TokenGenerator + @Resource + Md5TokenGenerator tokenGenerator; + + // 注入ResolveResponUtils + @Autowired + private ResolveResponUtils resolveResponUtils; + + // 注入RedisTemplate + @Resource + private RedisTemplate redisTemplate; + + // 登录接口 + @RequestMapping(value = "/login", method = RequestMethod.POST) + public String loginUserBySM4(@RequestParam("username") String username, @RequestParam("password") String password, HttpServletRequest request, HttpServletResponse response) throws Exception { + HashMap hashMap = new HashMap<>(); + Gson gson = new Gson(); + hashMap.put("username", username); + hashMap.put("password", password); + // 发送post请求获取sessionkey + String post = HttpUtils.post("http://localhost:18087/remote/getSessionKey", hashMap); + Map map = new HashMap<>(); + Map publicKey = gson.fromJson(post, map.getClass()); + String sessionkey = (String) publicKey.get("sessionkey"); + // 将sessionkey存入redis + redisTemplate.opsForValue().set("sessionkey", sessionkey); + // 将用户信息加密 + String jsonUserName = gson.toJson(hashMap); + String userEncrypt = Sm4Util.encryptEcb(sessionkey, jsonUserName); + HashMap userInfos = new HashMap<>(); + userInfos.put("username", username); + userInfos.put("userEncrypt", userEncrypt); + // 发送post请求进行认证 + String userPost = HttpUtils.post("http://localhost:18088/us-admin/remote/remoteauth", userInfos); + Map r = gson.fromJson(userPost, map.getClass()); + Boolean auth = (Boolean) r.get("auth"); + if (Boolean.TRUE.equals(auth)) { + // 获取keyPass + String keyPass = resolveResponUtils.getGetResponseData("http://localhost:18087/remote/getKeyPass/" + username, null, "keyPass"); + // 生成token + String token = tokenGenerator.generate(username, password); + // 设置cookie和header + CookieUtils.setCookie(request,response,"Authorization", token); + response.setHeader("Authorization", token); + // 将token和用户名存入redis + redisTemplate.opsForValue().set(token, username); + redisTemplate.opsForValue().set(token+username,System.currentTimeMillis()+""); + } + if (Boolean.TRUE.equals(auth)) { + return "/PassInstant/passInstant/passInstant.html"; + } else { + return "login.html"; + } + } + + // 获取登录页面 + @RequestMapping(value = {"/login", "/"}, method = RequestMethod.GET) + public String getLoginPage(HttpServletRequest request,HttpServletResponse response) { + String token = CookieUtils.getCookieValue(request, "Authorization"); + if (!StringUtils.isNullOrEmpty(token) && redisTemplate.opsForValue().get(token) != null) { + return "/PassInstant/passInstant/passInstant.html"; + } + + return "/login.html"; + } + + // 登出接口 + @RequestMapping("logout") + public String logout(HttpServletRequest request,HttpServletResponse response){ + // 删除cookie + CookieUtils.deleteCookie(request,response,"Authorization"); + // 清除session + Enumeration em = request.getSession().getAttributeNames(); + while(em.hasMoreElements()){ + request.getSession().removeAttribute(em.nextElement().toString()); + } + return "login.html"; + } + + // 获取用户注册页面 + @RequestMapping("/user_userAdd") + public String getUserRegister(){ + return "/system/user/user_teacherAdd.html"; + } + + // 获取修改密码页面 + @RequestMapping("/changePassword") + public String changPassword(){ + return "/system/user/user_changPwd"; + } + + + /** + * 修改密码 + */ + @RequestMapping(value = "/changPassword",method = RequestMethod.POST) + @AuthToken + public String addUser(@RequestParam("oldpassword") String oldpassword, @RequestParam("firpassword") String firpassword, @RequestParam("secpassword") String secpassword, HttpServletRequest request, HttpServletResponse response) throws Exception { + HashMap hashMap = new HashMap<>(); + String token = CookieUtils.getCookieValue(request, "Authorization"); + String username = redisTemplate.opsForValue().get(token); + if (!firpassword.equals(secpassword)) { + return "404.html"; + } + Gson gson = new Gson(); + hashMap.put("oldpassword", oldpassword); + hashMap.put("newpassword", firpassword); + hashMap.put("username", username); + String hashMapJson = gson.toJson(hashMap); + String sessionkey = redisTemplate.opsForValue().get("sessionkey"); + String userEncrypt = Sm4Util.encryptEcb(sessionkey, hashMapJson); + R r = R.ok().put("encryptData", userEncrypt); + String postJson = gson.toJson(r); + // 发送post请求修改密码 + String flag = resolveResponUtils.getPostJsonResponseData("http://localhost:18088/us-admin/remote/changpwd/" + username, postJson, "flag"); + return flag.equals("true")?"redirect:/passInstant":"404.html"; + } + + /** + * 用户注册 + */ + @RequestMapping(value = "register",method = RequestMethod.POST) + public String register(@RequestParam("username")String username,@RequestParam("password")String password,@RequestParam("keypass")String keypass) throws Exception { + Map hashMap = new HashMap<>(); + hashMap.put("username",username); + hashMap.put("password",password); + Map keyPass = new HashMap<>(); + keyPass.put("keyPass",keypass); + // 发送post请求注册用户 + String flag = resolveResponUtils.getPostResponseData("http://localhost:18088/us-admin/remote/register/", hashMap, "flag"); + // 发送post请求保存keyPass + resolveResponUtils.getPostResponseData("http://localhost:18087/remote/savekeypass/"+username, keyPass, "flag"); + return flag.equals("true")?"redirect:/login":"404.html"; + } +} diff --git a/passuser/src/main/java/com/passuser/net/entity/PpassInstant.java b/passuser/src/main/java/com/passuser/net/entity/PpassInstant.java new file mode 100644 index 0000000..39724a0 --- /dev/null +++ b/passuser/src/main/java/com/passuser/net/entity/PpassInstant.java @@ -0,0 +1,102 @@ +package com.passuser.net.entity; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.util.Date; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 软件作者:何栋宇 qq:709876443 +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:648595928 +*/ +@Data +public class PpassInstant implements Serializable{ + + private Integer passId;//密钥UUID + private String passName;//密钥名称 + private Integer passLength;//密钥长度 + private String passType;//密钥类型 + private String passChildfir;//第一子密钥 + private String passChildsec;//第二子密钥 + private String passChildthi;//第三子密钥 + private String passExpiry;//密钥有效期 + @DateTimeFormat( pattern = "yyyy-MM-dd HH:mm:ss" ) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8") + private String passCreatetime;//密钥上传时间 + private Integer passUserid;//密钥使用者 + private String username; + + public Integer getPassId(){ + return passId; + } + public void setPassId(Integer passId){ + this.passId = passId; + } + + public String getPassName(){ + return passName; + } + public void setPassName(String passName){ + this.passName = passName; + } + + public Integer getPassLength(){ + return passLength; + } + public void setPassLength(Integer passLength){ + this.passLength = passLength; + } + + public String getPassType(){ + return passType; + } + public void setPassType(String passType){ + this.passType = passType; + } + + public String getPassChildfir(){ + return passChildfir; + } + public void setPassChildfir(String passChildfir){ + this.passChildfir = passChildfir; + } + + public String getPassChildsec(){ + return passChildsec; + } + public void setPassChildsec(String passChildsec){ + this.passChildsec = passChildsec; + } + + public String getPassChildthi(){ + return passChildthi; + } + public void setPassChildthi(String passChildthi){ + this.passChildthi = passChildthi; + } + + public String getPassExpiry(){ + return passExpiry; + } + public void setPassExpiry(String passExpiry){ + this.passExpiry = passExpiry; + } + + public String getPassCreatetime(){ + return passCreatetime; + } + public void setPassCreatetime(String passCreatetime){ + this.passCreatetime = passCreatetime; + } + + public Integer getPassUserid(){ + return passUserid; + } + public void setPassUserid(Integer passUserid){ + this.passUserid = passUserid; + } +} diff --git a/passuser/src/main/java/com/passuser/net/entity/TokenEntity.java b/passuser/src/main/java/com/passuser/net/entity/TokenEntity.java new file mode 100644 index 0000000..99bff0b --- /dev/null +++ b/passuser/src/main/java/com/passuser/net/entity/TokenEntity.java @@ -0,0 +1,22 @@ +package com.passuser.net.entity; + +import lombok.Data; + +/** + * @Description: Token实体类 + * @author: Yangxf + * @date: 2019/4/14 12:53 + */ +@Data +public class TokenEntity { + + /* 用户ID */ + private Long userName; + + /* 刷新时间 */ + private int buildTime; + + /* token */ + private String token; + +} \ No newline at end of file diff --git a/passuser/src/main/java/com/passuser/net/interceptor/AuthorizationInterceptor.java b/passuser/src/main/java/com/passuser/net/interceptor/AuthorizationInterceptor.java new file mode 100644 index 0000000..a85480c --- /dev/null +++ b/passuser/src/main/java/com/passuser/net/interceptor/AuthorizationInterceptor.java @@ -0,0 +1,131 @@ +package com.passuser.net.interceptor; + +import com.alibaba.fastjson.JSONObject; +import com.passuser.net.annotation.AuthToken; +import com.passuser.net.utils.ConstantKit; +import com.passuser.net.utils.CookieUtils; +import com.passuser.net.utils.RedisUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Component; +import org.springframework.web.method.HandlerMethod; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.PrintWriter; +import java.lang.reflect.Method; +import java.util.concurrent.TimeUnit; + +/** + * @author Think + * @Title: AuthorizationInterceptor + * @ProjectName token-authentication + * @Description: TODO + * @date 2019/1/1815:50 + */ +@Slf4j +@Component +public class AuthorizationInterceptor implements HandlerInterceptor { + + @Autowired + private RedisTemplate redisTemplate; + + //存放鉴权信息的Header名称,默认是Authorization + private String httpHeaderName = "Authorization"; + + //鉴权失败后返回的错误信息,默认为401 unauthorized + private String unauthorizedErrorMessage = "401 unauthorized"; + + //鉴权失败后返回的HTTP错误码,默认为401 + private int unauthorizedErrorCode = HttpServletResponse.SC_UNAUTHORIZED; + + /** + * 存放登录用户模型Key的Request Key + */ + public static final String REQUEST_CURRENT_KEY = "REQUEST_CURRENT_KEY"; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler){ + if (!(handler instanceof HandlerMethod)) { + return true; + } + HandlerMethod handlerMethod = (HandlerMethod) handler; + Method method = handlerMethod.getMethod(); + + // 如果打上了AuthToken注解则需要验证token + if (method.getAnnotation(AuthToken.class) != null || handlerMethod.getBeanType().getAnnotation(AuthToken.class) != null) { + + String token = CookieUtils.getCookieValue(request, httpHeaderName); +// String token = request.getHeader(httpHeaderName); + // String token = request.getParameter(httpHeaderName); + log.info("Get token from request is {} ", token); + String username = ""; + if (token != null && token.length() != 0) { + username = redisTemplate.opsForValue().get(token); + log.info("Get username from Redis is {}", username); + } + if (username != null && !username.trim().equals("")) { + //log.info("token birth time is: {}",jedis.get(username+token)); + Long tokeBirthTime = Long.valueOf(redisTemplate.opsForValue().get(token + username)); + log.info("token Birth time is: {}", tokeBirthTime); + Long diff = System.currentTimeMillis() - tokeBirthTime; + log.info("token is exist : {} ms", diff); + //重新设置Redis中的token过期时间 + if (diff > ConstantKit.TOKEN_RESET_TIME) { + redisTemplate.expire(username, ConstantKit.TOKEN_EXPIRE_TIME, TimeUnit.MINUTES); + redisTemplate.expire(token, ConstantKit.TOKEN_EXPIRE_TIME, TimeUnit.MINUTES); + log.info("Reset expire time success!"); + Long newBirthTime = System.currentTimeMillis(); + redisTemplate.opsForValue().set(token + username, newBirthTime.toString()); + } + + //用完关闭 + request.setAttribute(REQUEST_CURRENT_KEY, username); + return true; + } else { + JSONObject jsonObject = new JSONObject(); + + PrintWriter out = null; + try { + response.setStatus(unauthorizedErrorCode); + response.setContentType(MediaType.APPLICATION_JSON_VALUE); + jsonObject.put("code", ((HttpServletResponse) response).getStatus()); + jsonObject.put("message", HttpStatus.UNAUTHORIZED); + out = response.getWriter(); + out.println(jsonObject); + + return false; + } catch (Exception e) { + e.printStackTrace(); + } finally { + if (null != out) { + out.flush(); + out.close(); + } + } + + } + + } + + request.setAttribute(REQUEST_CURRENT_KEY, null); + + return true; + } + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + + } +} diff --git a/passuser/src/main/java/com/passuser/net/model/ResponseTemplate.java b/passuser/src/main/java/com/passuser/net/model/ResponseTemplate.java new file mode 100644 index 0000000..c2ed990 --- /dev/null +++ b/passuser/src/main/java/com/passuser/net/model/ResponseTemplate.java @@ -0,0 +1,17 @@ +package com.scorpios.tokenauthentication.model; + +import lombok.Builder; +import lombok.Data; + + +@Builder +@Data +public class ResponseTemplate { + + public Integer code; + + public String message; + + public Object data; + +} diff --git a/passuser/src/main/java/com/passuser/net/utils/AESUtil.java b/passuser/src/main/java/com/passuser/net/utils/AESUtil.java new file mode 100644 index 0000000..962fc6e --- /dev/null +++ b/passuser/src/main/java/com/passuser/net/utils/AESUtil.java @@ -0,0 +1,82 @@ +package com.passuser.net.utils; + +import javax.crypto.*; +import javax.crypto.spec.SecretKeySpec; +import java.io.UnsupportedEncodingException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; + +public class AESUtil { + /** + * AES加密字符串 + * + * @param content + * 需要被加密的字符串 + * @param password + * 加密需要的密码 + * @return 密文 + */ + public static byte[] encrypt(String content, String password) { + try { + KeyGenerator kgen = KeyGenerator.getInstance("AES");// 创建AES的Key生产者 + kgen.init(128, new SecureRandom(password.getBytes()));// 利用用户密码作为随机数初始化出 + //加密没关系,SecureRandom是生成安全随机数序列,password.getBytes()是种子,只要种子相同,序列就一样,所以解密只要有password就行 + SecretKey secretKey = kgen.generateKey();// 根据用户密码,生成一个密钥 + byte[] enCodeFormat = secretKey.getEncoded();// 返回基本编码格式的密钥,如果此密钥不支持编码,则返回 + SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");// 转换为AES专用密钥 + Cipher cipher = Cipher.getInstance("AES");// 创建密码器 + byte[] byteContent = content.getBytes("utf-8"); + cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化为加密模式的密码器 + byte[] result = cipher.doFinal(byteContent);// 加密 + return result; + } catch (NoSuchPaddingException e) { + e.printStackTrace(); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } catch (InvalidKeyException e) { + e.printStackTrace(); + } catch (IllegalBlockSizeException e) { + e.printStackTrace(); + } catch (BadPaddingException e) { + e.printStackTrace(); + } + return null; + } + + /** + * 解密AES加密过的字符串 + * + * @param content + * AES加密过过的内容 + * @param password + * 加密时的密码 + * @return 明文 + */ + public static byte[] decrypt(byte[] content, String password) { + try { + KeyGenerator kgen = KeyGenerator.getInstance("AES");// 创建AES的Key生产者 + kgen.init(128, new SecureRandom(password.getBytes())); + SecretKey secretKey = kgen.generateKey();// 根据用户密码,生成一个密钥 + byte[] enCodeFormat = secretKey.getEncoded();// 返回基本编码格式的密钥 + SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");// 转换为AES专用密钥 + Cipher cipher = Cipher.getInstance("AES");// 创建密码器 + cipher.init(Cipher.DECRYPT_MODE, key);// 初始化为解密模式的密码器 + byte[] result = cipher.doFinal(content); + return result; // 明文 + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } catch (NoSuchPaddingException e) { + e.printStackTrace(); + } catch (InvalidKeyException e) { + e.printStackTrace(); + } catch (IllegalBlockSizeException e) { + e.printStackTrace(); + } catch (BadPaddingException e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/passuser/src/main/java/com/passuser/net/utils/CommonUtils.java b/passuser/src/main/java/com/passuser/net/utils/CommonUtils.java new file mode 100644 index 0000000..ced8cd5 --- /dev/null +++ b/passuser/src/main/java/com/passuser/net/utils/CommonUtils.java @@ -0,0 +1,417 @@ +package com.passuser.net.utils; + +import org.springframework.util.StringUtils; + +import java.io.UnsupportedEncodingException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +/** + * @ClassName: CommonUtils + * @Description: 通用工具类 + * @since: 0.0.1 + * @author: dzy + * @date: 2017年2月22日 上午11:46:44 + */ +public class CommonUtils { + + + /** + * @param date 日期 + * @param pattern 模式 如:yyyyMMdd等 + * @return + * @Title: formatDate + * @Description: 格式化日期 + * @since: 0.0.1 + */ + public static String formatDate(Date date, String pattern) { + SimpleDateFormat formatter = new SimpleDateFormat(pattern); + return formatter.format(date); + } + + /** + * @param strDate String类型日期 + * @param pattern 日期显示模式 + * @return + * @Title: parseDate + * @Description: 将String日期转换为Date类型日期 + * @since: 0.0.1 + */ + public static Date parseDate(String strDate, String pattern) { + SimpleDateFormat formatter = null; + if (StringUtils.isEmpty(strDate) || strDate.equals("")) { + return null; + } + formatter = new SimpleDateFormat(pattern); + try { + return formatter.parse(strDate); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * @param date 操作前的日期 + * @param field 日期的部分如:年,月,日 + * @param amount 增加或减少的值(负数表示减少) + * @return + * @Title: dateAdd + * @Description: 日期的加减操作 + * @since: 0.0.1 + */ + public static Date dateAdd(Date date, int field, int amount) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(field, amount); + return calendar.getTime(); + } + + /** + * @param source 源字符串 + * @param offset 填充开始的位置, 0-在左边, source.getBytes().length 在右边, 如果有中文时需小心位置 + * @param c 用于填充的字符 + * @param length 最后字符串的字节长度 + * @return + * @Title: fill + * @Description: 填充字符串, 长度是按字节计算, 不是字符 + * @since: 0.0.1 + */ + public static String fill(String source, int offset, char c, int length) throws UnsupportedEncodingException { + if (null == source) { + source = ""; + } + if (source.getBytes("utf-8").length == length) { + return source; + } + byte[] buf = new byte[length]; + byte[] src = source.getBytes("utf-8"); + if (src.length > length) { + System.arraycopy(src, src.length - length, buf, 0, length); + return new String(buf, "utf-8"); + } + if (offset > src.length) { + offset = src.length; + } else if (offset < 0) { + offset = 0; + } + int n = length - src.length; + + System.arraycopy(src, 0, buf, 0, offset); + for (int i = 0; i < n; i++) { + buf[i + offset] = (byte) c; + } + System.arraycopy(src, offset, buf, offset + n, src.length - offset); + return new String(buf, "utf-8"); + } + + /** + * @param original 原字符串 + * @param offset 填充开始的位置, 0-在左边, original.getBytes().length 在右边, 如果有中文时需小心位置 + * @param length 替换的字节数 + * @param c 用于替换的字符 + * @return + * @Title: replace + * @Description: 替换字符串, 长度是按字节计算, 不是字符 + * @since: 0.0.1 + */ + public static String replace(String original, int offset, int length, char c) throws UnsupportedEncodingException { + if (original == null) { + original = ""; + } + if (original.getBytes("utf-8").length <= offset) { + return original; + } + if (original.getBytes("utf-8").length < offset + length) { + length = original.getBytes("utf-8").length - offset; + } + byte[] buf = new byte[original.length()]; + byte[] src = original.getBytes("utf-8"); + System.arraycopy(src, 0, buf, 0, offset); + + for (int i = offset; i < offset + length; i++) { + buf[i] = (byte) c; + } + System.arraycopy(src, offset + length, buf, offset + length, src.length - offset - length); + return new String(buf, "utf-8"); + } + + /** + * @param s 16进制字符串 + * @return + * @Title: hexToByte + * @Description: 16进制字符串转字节数组 + * @since: 0.0.1 + */ + public static byte[] hexToByte(String s) { + byte[] result = null; + try { + int i = s.length(); +// if (i % 2 == 1) { +// throw new Exception("字符串长度不是偶数."); +// } + if (i % 2 != 0) { + throw new Exception("字符串长度不是偶数."); + } + result = new byte[i / 2]; + for (int j = 0; j < result.length; j++) { + result[j] = (byte) Integer.parseInt(s.substring(j * 2, j * 2 + 2), 16); + } + } catch (Exception e) { + result = null; + e.printStackTrace(); +// log.error("16进制字符串转字节数组时出现异常:", e); + } + return result; + } + + /** + * @param bytes 字节数组 + * @return + * @Title: byte2hexString + * @Description: 字节数组转换为16进制字符串 //0x33 0xD2 0x00 0x46 转换为 "33d20046" 转换和打印报文用 + * @since: 0.0.1 + */ + public static String byte2hexString(byte[] bytes) { + StringBuffer buf = new StringBuffer(bytes.length * 2); + for (int i = 0; i < bytes.length; i++) { + if (((int) bytes[i] & 0xff) < 0x10) { + buf.append("0"); + } + buf.append(Long.toString((int) bytes[i] & 0xff, 16)); + } + return buf.toString().toUpperCase(); + } + + /** + * @param hexString 16进制字符串 如:"33d20046" 转换为 0x33 0xD2 0x00 0x46 + * @return + * @Title: hexString2byte + * @Description: 16进制字符串转字节数组 + * @since: 0.0.1 + */ + public static byte[] hexString2byte(String hexString) { + if (null == hexString || hexString.length() % 2 != 0 || hexString.contains("null")) { + return null; + } + byte[] bytes = new byte[hexString.length() / 2]; + for (int i = 0; i < hexString.length(); i += 2) { + bytes[i / 2] = (byte) (Integer.parseInt(hexString.substring(i, i + 2), 16) & 0xff); + } + return bytes; + } + + /** + * @param i 需要转的int类型数字 + * @return + * @Title: byte1ToBcd2 + * @Description: int类型转BCD码 + * @since: 0.0.1 + */ + public static String byte1ToBcd2(int i) { +// return (new Integer(i / 16).toString() + (new Integer(i % 16)).toString()); + return Integer.toString(i / 16) + Integer.toString(i % 16); + } + + /** + * @param b 字节数组 + * @return + * @Title: byteToHex2 + * @Description: 字节数组转换为16进制字符串 For example, byte[] {0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF} will be changed to String "0123456789ABCDEF" + * @since: 0.0.1 + */ + public static String byteToHex2(byte[] b) { + StringBuffer result = new StringBuffer(); + String tmp = ""; + + for (int i = 0; i < b.length; i++) { + tmp = Integer.toHexString(b[i] & 0xff); + if (tmp.length() == 1) { + result.append("0" + tmp); + } else { + result.append(tmp); + } + } + return result.toString().toUpperCase(); + } + + /** + * @param num 数字 + * @param len 字节数组长度 + * @return + * @Title: intToHexBytes + * @Description: int类型转16进制字节数组 + */ + public static byte[] intToHexBytes(int num, int len) { + byte[] bytes = null; + String hexString = Integer.toHexString(num); + if (len > 0) { + int length = len * 2; + hexString = leftFill(hexString, '0', length); + bytes = CommonUtils.hexString2byte(hexString); + } + return bytes; + } + + private static String leftFill(String hexString, char c, int length) { + StringBuilder stringBuilder = new StringBuilder(); + if(hexString.length() < length){ + for(int count = 0; count getSubElement(byte[] message) { +// Map map = new HashMap(); +// String key = null; +// String value = null; +// int len = 0; +// int idx = 0; +// while (idx < message.length) { +// key = new String(message, idx, 2); +// idx += 2; //取了SE id 移2位 +// len = Integer.parseInt(new String(message, idx, 2)); +// idx += 2; //取了SE id的内容长度 移2位 +// value = new String(message, idx, len); +// map.put(key, value); +// idx += len; +// } +// return map; +// } + + //byte数组转成long + + /** + * @param b 将字节数组转long类型 位置为小端 + * @return + */ + public static long byteToLong(byte[] b) { + long s = 0; + long s0 = b[0] & 0xff;// 最低位 + long s1 = b[1] & 0xff; + long s2 = b[2] & 0xff; + long s3 = b[3] & 0xff; + long s4 = b[4] & 0xff;// 最低位 + long s5 = b[5] & 0xff; + long s6 = b[6] & 0xff; + long s7 = b[7] & 0xff; + + // s0不变 + s1 <<= 8; + s2 <<= 16; + s3 <<= 24; + s4 <<= 8 * 4; + s5 <<= 8 * 5; + s6 <<= 8 * 6; + s7 <<= 8 * 7; + s = s0 | s1 | s2 | s3 | s4 | s5 | s6 | s7; + return s; + } + + /** + * @param b 将字节数组转int类型 位置为小端 + * @return + */ + public static int byteToInt(byte[] b) { + int s = 0; + int s0 = b[0] & 0xff;// 最低位 + int s1 = b[1] & 0xff; + int s2 = b[2] & 0xff; + int s3 = b[3] & 0xff; + + // s0不变 + s1 <<= 8; + s2 <<= 16; + s3 <<= 24; + + s = s0 | s1 | s2 | s3; + return s; + } + + /** + * int类型转换小端的byte数组 + * @param i + * @return + */ + public static byte[] intToLittleBytes(int i) { + ByteBuffer byteBuffer = ByteBuffer.allocate(4); + byteBuffer.order(ByteOrder.LITTLE_ENDIAN); + byteBuffer.asIntBuffer().put(i); + byte[] littleBytes = byteBuffer.array(); + return littleBytes; + } + + /** + * 将一个字节转成10进制 + * @param b + * @return + */ + public static int byteToInt(byte b) { + int value = b & 0xff; + return value; + } + + /** + * 字节数组合并 + * @param bt1 字节数组bt1 + * @param bt2 字节数组bt2 + * @return + */ + public static byte[] byteMerger(byte[] bt1, byte[] bt2){ + byte[] bt3 = new byte[bt1.length+bt2.length]; + System.arraycopy(bt1, 0, bt3, 0, bt1.length); + System.arraycopy(bt2, 0, bt3, bt1.length, bt2.length); + return bt3; + } + +} \ No newline at end of file diff --git a/passuser/src/main/java/com/passuser/net/utils/ConstantKit.java b/passuser/src/main/java/com/passuser/net/utils/ConstantKit.java new file mode 100644 index 0000000..24f4be7 --- /dev/null +++ b/passuser/src/main/java/com/passuser/net/utils/ConstantKit.java @@ -0,0 +1,27 @@ +package com.passuser.net.utils; + + +public final class ConstantKit { + + /** + * 设置删除标志为真 + */ + public static final Integer DEL_FLAG_TRUE = 1; + + /** + * 设置删除标志为假 + */ + public static final Integer DEL_FLAG_FALSE = 0; + + /** + * redis存储token设置的过期时间,10分钟 + */ + public static final Integer TOKEN_EXPIRE_TIME = 60 * 10; + + /** + * 设置可以重置token过期时间的时间界限 + */ + public static final Integer TOKEN_RESET_TIME = 1000 * 100; + + +} diff --git a/passuser/src/main/java/com/passuser/net/utils/CookieUtils.java b/passuser/src/main/java/com/passuser/net/utils/CookieUtils.java new file mode 100644 index 0000000..cc820e5 --- /dev/null +++ b/passuser/src/main/java/com/passuser/net/utils/CookieUtils.java @@ -0,0 +1,326 @@ +package com.passuser.net.utils; + +import org.slf4j.Logger; + +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.net.URLEncoder; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + + +/** + * + * Cookie 工具类 + * + */ +public final class CookieUtils { + + + /** + * 得到Cookie的值, 不编码 + * + * @param request + * @param cookieName + * @return + */ + public static String getCookieValue(HttpServletRequest request, String cookieName) { + return getCookieValue(request, cookieName, false); + } + + /** + * 得到Cookie的值, + * + * @param request + * @param cookieName + * @return + */ + public static String getCookieValue(HttpServletRequest request, String cookieName, boolean isDecoder) { + Cookie[] cookieList = request.getCookies(); + if (cookieList == null || cookieName == null) { + return null; + } + String retValue = null; + try { + for (int i = 0; i < cookieList.length; i++) { + if (cookieList[i].getName().equals(cookieName)) { + if (isDecoder) { + retValue = URLDecoder.decode(cookieList[i].getValue(), "UTF-8"); + } else { + retValue = cookieList[i].getValue(); + } + break; + } + } + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); +// e.printStackTrace(); + } + return retValue; + } + + /** + * 得到Cookie的值, + * + * @param request + * @param cookieName + * @return + */ + public static String getCookieValue(HttpServletRequest request, String cookieName, String encodeString) { + Cookie[] cookieList = request.getCookies(); + if (cookieList == null || cookieName == null) { + return null; + } + String retValue = null; + try { + for (int i = 0; i < cookieList.length; i++) { + if (cookieList[i].getName().equals(cookieName)) { + retValue = URLDecoder.decode(cookieList[i].getValue(), encodeString); + break; + } + } + } catch (UnsupportedEncodingException e) { + throw new RuntimeException(e); +// e.printStackTrace(); + } + return retValue; + } + + /** + * 设置Cookie的值 不设置生效时间默认浏览器关闭即失效,也不编码 + */ + public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName, + String cookieValue) { + setCookie(request, response, cookieName, cookieValue, -1); + } + + /** + * 设置Cookie的值 不设置生效时间默认浏览器关闭即失效,也不编码 + */ + public static void setCookieTwo(String domian, HttpServletResponse response, String cookieName, + String cookieValue) { + setCookieTwo(domian, response, cookieName, cookieValue, -1); + } + + /** + * 设置Cookie的值 在指定时间内生效,但不编码 + */ + public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName, + String cookieValue, int cookieMaxage) { + setCookie(request, response, cookieName, cookieValue, cookieMaxage, false); + } + + /** + * 设置Cookie的值 在指定时间内生效,但不编码 + */ + public static void setCookieTwo(String domain, HttpServletResponse response, String cookieName, + String cookieValue, int cookieMaxage) { + setCookieTwo(domain, response, cookieName, cookieValue, cookieMaxage, false); + } + + /** + * 设置Cookie的值 在指定时间内生效, 编码参数 + */ + public static void setCookieTwo(String domain, HttpServletResponse response, String cookieName, + String cookieValue, int cookieMaxage, boolean isEncode) { + doSetCookieTwo(domain, response, cookieName, cookieValue, cookieMaxage, isEncode); + } + + /** + * 设置Cookie的值,并使其在指定时间内生效 + * + * @param cookieMaxage cookie生效的最大秒数 + */ + private static final void doSetCookieTwo(String domain, HttpServletResponse response, + String cookieName, String cookieValue, int cookieMaxage, boolean isEncode) { + try { + if (cookieValue == null) { + cookieValue = ""; + } else if (isEncode) { + cookieValue = URLEncoder.encode(cookieValue, "utf-8"); + } + Cookie cookie = new Cookie(cookieName, cookieValue); + if (cookieMaxage > 0) + cookie.setMaxAge(cookieMaxage); + String domainName = getDomainNameByUrl(domain); + if (!"localhost".equals(domainName)) { + cookie.setDomain(domainName); + } + cookie.setPath("/"); + cookie.setHttpOnly(true); + response.addCookie(cookie); + } catch (Exception e) { +// logger.error("doSetCookie错误信息:{}",e); + throw new RuntimeException(e); +// e.printStackTrace(); + } + } + + /** + * 得到cookie的域名 + */ + public static final String getDomainNameByUrl(String domain) { + String domainName = null; + + String serverName = domain; + if (serverName == null || serverName.equals("")) { + domainName = ""; + } else { +// serverName = serverName.toLowerCase(); +// serverName = serverName.substring(7); +// final int end = serverName.indexOf("/"); + serverName = domain; + final String[] domains = serverName.split("\\."); + int len = domains.length; + if (len > 3) { + // www.xxx.com.cn + domainName = "." + domains[len - 3] + "." + domains[len - 2] + "." + domains[len - 1]; + } else if (len <= 3 && len > 1) { + // xxx.com or xxx.cn + domainName = "."+domains[len - 2] + "." + domains[len - 1]; + } else { + domainName = serverName; + } + } + + if (domainName != null && domainName.indexOf(":") > 0) { + String[] ary = domainName.split("\\:"); + domainName = ary[0]; + } + return domainName; + } + + /** + * 设置Cookie的值 不设置生效时间,但编码 + */ + public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName, + String cookieValue, boolean isEncode) { + setCookie(request, response, cookieName, cookieValue, -1, isEncode); + } + + /** + * 设置Cookie的值 在指定时间内生效, 编码参数 + */ + public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName, + String cookieValue, int cookieMaxage, boolean isEncode) { + doSetCookie(request, response, cookieName, cookieValue, cookieMaxage, isEncode); + } + + /** + * 设置Cookie的值 在指定时间内生效, 编码参数(指定编码) + */ + public static void setCookie(HttpServletRequest request, HttpServletResponse response, String cookieName, + String cookieValue, int cookieMaxage, String encodeString) { + doSetCookie(request, response, cookieName, cookieValue, cookieMaxage, encodeString); + } + + /** + * 删除Cookie带cookie域名 + */ + public static void deleteCookie(HttpServletRequest request, HttpServletResponse response, + String cookieName) { + doSetCookie(request, response, cookieName, "", -1, false); + } + + /** + * 设置Cookie的值,并使其在指定时间内生效 + * + * @param cookieMaxage cookie生效的最大秒数 + */ + private static final void doSetCookie(HttpServletRequest request, HttpServletResponse response, + String cookieName, String cookieValue, int cookieMaxage, boolean isEncode) { + try { + if (cookieValue == null) { + cookieValue = ""; + } else if (isEncode) { + cookieValue = URLEncoder.encode(cookieValue, "utf-8"); + } + Cookie cookie = new Cookie(cookieName, cookieValue); + if (cookieMaxage > 0) + cookie.setMaxAge(cookieMaxage); + if (null != request) {// 设置域名的cookie + String domainName = getDomainName(request); + if (!"localhost".equals(domainName)) { + cookie.setDomain(domainName); + } + } + cookie.setPath("/"); + cookie.setHttpOnly(true); + response.addCookie(cookie); + } catch (Exception e) { +// logger.error("doSetCookie错误信息:{}",e); + throw new RuntimeException(e); +// e.printStackTrace(); + } + } + + /** + * 设置Cookie的值,并使其在指定时间内生效 + * + * @param cookieMaxage cookie生效的最大秒数 + */ + private static final void doSetCookie(HttpServletRequest request, HttpServletResponse response, + String cookieName, String cookieValue, int cookieMaxage, String encodeString) { + try { + if (cookieValue == null) { + cookieValue = ""; + } else { + cookieValue = URLEncoder.encode(cookieValue, encodeString); + } + Cookie cookie = new Cookie(cookieName, cookieValue); + if (cookieMaxage > 0) + cookie.setMaxAge(cookieMaxage); + if (null != request) {// 设置域名的cookie + String domainName = getDomainName(request); + System.out.println(domainName); + if (!"localhost".equals(domainName)) { + cookie.setDomain(domainName); + } + } + cookie.setPath("/"); + response.addCookie(cookie); + } catch (Exception e) { +// logger.error("doSetCookie错误信息:{}",e); + throw new RuntimeException(e); +// e.printStackTrace(); + } + } + + /** + * 得到cookie的域名 + */ + public static final String getDomainName(HttpServletRequest request) { + String domainName = null; + + String serverName = request.getRequestURL().toString(); + if (serverName == null || serverName.equals("")) { + domainName = ""; + } else { + serverName = serverName.toLowerCase(); + serverName = serverName.substring(7); + final int end = serverName.indexOf("/"); + serverName = serverName.substring(0, end); + final String[] domains = serverName.split("\\."); + int len = domains.length; + if (len > 3) { + // www.xxx.com.cn + domainName = domains[len - 3] + "." + domains[len - 2] + "." + domains[len - 1]; + } else if (len <= 3 && len > 1) { + // xxx.com or xxx.cn + domainName = domains[len - 2] + "." + domains[len - 1]; + } else { + domainName = serverName; + } + } + + if (domainName != null && domainName.indexOf(":") > 0) { + String[] ary = domainName.split("\\:"); + domainName = ary[0]; + } + return domainName; + } + +} + diff --git a/passuser/src/main/java/com/passuser/net/utils/DateUtils.java b/passuser/src/main/java/com/passuser/net/utils/DateUtils.java new file mode 100644 index 0000000..1bea8df --- /dev/null +++ b/passuser/src/main/java/com/passuser/net/utils/DateUtils.java @@ -0,0 +1,1090 @@ +package com.passuser.net.utils; + +import org.springframework.util.StringUtils; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +/** + * 工具类-日期处理 + * + * @author xx + * @version 1.0 + * @since 2014年1月28日 + */ +public class DateUtils { + + /** + * 获得当前日期 + * + * @return + */ + public static Date getNow() { + Calendar cal = Calendar.getInstance(); + Date currDate = cal.getTime(); + return currDate; + } + + /** + * 日期转换为字符串 格式自定义 + * + * @param date + * @param f + * @return + */ + public static String dateStr(Date date, String f) { + if (date == null) { + return ""; + } + SimpleDateFormat format = new SimpleDateFormat(f); + String str = format.format(date); + return str; + } + + /** + * 日期转换为字符串 MM月dd日 hh:mm + * + * @param date + * @return + */ + public static String dateStr(Date date) { + return dateStr(date, "MM月dd日 hh:mm"); + } + + /** + * 日期转换为字符串 yyyy-MM-dd + * + * @param date + * @return + */ + public static String dateStr2(Date date) { + return dateStr(date, "yyyy-MM-dd"); + } + + /** + * yyyy年MM月dd日HH时mm分ss秒 + * + * @param date + * @return + */ + public static String dateStr5(Date date) { + return dateStr(date, "yyyy年MM月dd日 HH时mm分ss秒"); + } + + /** + * yyyyMMddHHmmss + * + * @param date + * @return + */ + public static String dateStr3(Date date) { + return dateStr(date, "yyyyMMddHHmmss"); + } + + /** + * yyyy-MM-dd HH:mm:ss + * + * @param date + * @return + */ + public static String dateStr4(Date date) { + return dateStr(date, "yyyy-MM-dd HH:mm:ss"); + + } + + /** + * yyyy年MM月dd日 + * + * @param date + * @return + */ + public static String dateStr6(Date date) { + return dateStr(date, "yyyy年MM月dd日"); + } + + /** + * yyyyMMdd + * + * @param date + * @return + */ + public static String dateStr7(Date date) { + return dateStr(date, "yyyyMMdd"); + } + + /** + * MM-dd + * + * @param date + * @return + */ + public static String dateStr8(Date date) { + return dateStr(date, "MM-dd"); + } + + /** + * HH:mm + * + * @param date + * @return + */ + public static String dateStr9(Date date) { + return dateStr(date, "HH:mm"); + } + + /** + * 将时间戳转换为Date + * + * @param times + * @return + */ + public static Date getDate(String times) { + long time = Long.parseLong(times); + return new Date(time * 1000); + } + + public static String dateStr(String times) { + return dateStr(getDate(times)); + } + + public static String dateStr2(String times) { + return dateStr2(getDate(times)); + } + + public static String dateStr3(String times) { + return dateStr3(getDate(times)); + } + + public static String dateStr4(String times) { + return dateStr4(getDate(times)); + } + + public static String dateStr5(String times) { + return dateStr5(getDate(times)); + } + + /** + * 将Date转换为时间戳 + * + * @param date + * @return + */ + public static long getTime(Date date) { + return date.getTime() / 1000; + } + + public static int getDay(Date d) { + Calendar cal = Calendar.getInstance(); + cal.setTime(d); + return cal.get(Calendar.DAY_OF_MONTH); + } + + /** + * s - 表示 "yyyy-mm-dd" 形式的日期的 String 对象 + * + * @param + * @return + */ + public static Date valueOf(String s) { + final int YEAR_LENGTH = 4; + final int MONTH_LENGTH = 2; + final int DAY_LENGTH = 2; + final int MAX_MONTH = 12; + final int MAX_DAY = 31; + int firstDash; + int secondDash; + int threeDash = 0; + int fourDash = 0; + Date d = null; + + if (s == null) { + throw new IllegalArgumentException(); + } + + firstDash = s.indexOf('-'); + secondDash = s.indexOf('-', firstDash + 1); + if (s.contains(":")) { + threeDash = s.indexOf(':'); + fourDash = s.indexOf(':', threeDash + 1); + } + if ((firstDash > 0) && (secondDash > 0) && (secondDash < s.length() - 1)) { + String yyyy = s.substring(0, firstDash); + String mm = s.substring(firstDash + 1, secondDash); + String dd = ""; + String hh = ""; + String MM = ""; + String ss = ""; + if (s.contains(":")) { + dd = s.substring(secondDash + 1, threeDash - 3); + hh = s.substring(threeDash - 2, threeDash); + MM = s.substring(threeDash + 1, fourDash); + ss = s.substring(fourDash + 1); + } else { + dd = s.substring(secondDash + 1); + } + if (yyyy.length() == YEAR_LENGTH && mm.length() == MONTH_LENGTH && dd.length() == DAY_LENGTH) { + int year = Integer.parseInt(yyyy); + int month = Integer.parseInt(mm); + int day = Integer.parseInt(dd); + int hour = 0; + int minute = 0; + int second = 0; + if (s.contains(":")) { + hour = Integer.parseInt(hh); + minute = Integer.parseInt(MM); + second = Integer.parseInt(ss); + } + if (month >= 1 && month <= MAX_MONTH) { + int maxDays = MAX_DAY; + switch (month) { + // February determine if a leap year or not + case 2: + if ((year % 4 == 0 && !(year % 100 == 0)) || (year % 400 == 0)) { + maxDays = MAX_DAY - 2; // leap year so 29 days in + // February + } else { + maxDays = MAX_DAY - 3; // not a leap year so 28 days + // in February + } + break; + // April, June, Sept, Nov 30 day months + case 4: + case 6: + case 9: + case 11: + maxDays = MAX_DAY - 1; + break; + } + if (day >= 1 && day <= maxDays) { + Calendar cal = Calendar.getInstance(); + cal.set(year, month - 1, day, hour, minute, second); + cal.set(Calendar.MILLISECOND, 0); + d = cal.getTime(); + } + } + } + } + if (d == null) { + throw new IllegalArgumentException(); + } + return d; + } + + /** + * 获取指定日期星期几 + * + * @param dt + * @return + */ + public static String getWeekOfDate(Date dt) { + String[] weekDays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"}; + Calendar cal = Calendar.getInstance(); + cal.setTime(dt); + int w = cal.get(Calendar.DAY_OF_WEEK) - 1; + if (w < 0) { + w = 0; + } + return weekDays[w]; + } + + + /** + * 获取指定日期星期几(int) + * + * @param dt + * @return + */ + public static int getWeekOfInt(Date dt) { + int[] weekDays = {7, 1, 2, 3, 4, 5, 6}; + Calendar cal = Calendar.getInstance(); + cal.setTime(dt); + int w = cal.get(Calendar.DAY_OF_WEEK) - 1; + if (w < 0) { + w = 0; + } + return weekDays[w]; + } + + + /** + * 前/后?分钟 + * + * @param d + * @param minute + * @return + */ + public static Date rollMinute(Date d, int minute) { + return new Date(d.getTime() + minute * 60 * 1000); + } + + /** + * 前/后?天 + * + * @param d + * @param day + * @return + */ + public static Date rollDay(Date d, int day) { + Calendar cal = Calendar.getInstance(); + cal.setTime(d); + cal.add(Calendar.DAY_OF_MONTH, day); + return cal.getTime(); + } + + /** + * 前/后?月 + * + * @param d + * @param mon + * @return + */ + public static Date rollMon(Date d, int mon) { + Calendar cal = Calendar.getInstance(); + cal.setTime(d); + cal.add(Calendar.MONTH, mon); + return cal.getTime(); + } + + /** + * 前/后?年 + * + * @param d + * @param year + * @return + */ + public static Date rollYear(Date d, int year) { + Calendar cal = Calendar.getInstance(); + cal.setTime(d); + cal.add(Calendar.YEAR, year); + return cal.getTime(); + } + + public static Date rollDate(Date d, int year, int mon, int day) { + Calendar cal = Calendar.getInstance(); + cal.setTime(d); + cal.add(Calendar.YEAR, year); + cal.add(Calendar.MONTH, mon); + cal.add(Calendar.DAY_OF_MONTH, day); + return cal.getTime(); + } + + /** + * 获取当前时间-时间戳字符串 + * + * @return + */ + public static String getNowTimeStr() { + String str = Long.toString(System.currentTimeMillis() / 1000); + return str; + } + + /** + * 获取当前时间-时间戳 + * + * @return + */ + public static long getNowTime() { + return System.currentTimeMillis(); + } + + /** + * 将Date转换为时间戳 + * + * @param time + * @return + */ + public static String getTimeStr(Date time) { + long date = time.getTime(); + String str = Long.toString(date / 1000); + return str; + } + + public static String getTimeStr(String dateStr, String format) { + SimpleDateFormat sdf = new SimpleDateFormat(format); + Date date; + try { + date = sdf.parse(dateStr); + } catch (Exception e) { + e.printStackTrace(); + return ""; + } + String str = DateUtils.getTimeStr(date); + return str; + } + + + public static Date getIntegralTime() { + Calendar cal = Calendar.getInstance(); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.MILLISECOND, 0); + return cal.getTime(); + } + + /** + * 获取当天23:59:59 + * + * @return + */ + public static Date getLastIntegralTime() { + Calendar cal = Calendar.getInstance(); + cal.set(Calendar.HOUR_OF_DAY, 23); + cal.set(Calendar.SECOND, 59); + cal.set(Calendar.MINUTE, 59); + cal.set(Calendar.MILLISECOND, 0); + return cal.getTime(); + } + + /** + * 设置时间格式为 23:59:59 + * + * @return + */ + public static Date getLastSecIntegralTime(Date d) { + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(d.getTime()); + cal.set(Calendar.HOUR_OF_DAY, 23); + cal.set(Calendar.SECOND, 59); + cal.set(Calendar.MINUTE, 59); + cal.set(Calendar.MILLISECOND, 0); + return cal.getTime(); + } + + /** + * 获取本周日的日期 + */ + public static String getCurrentWeekday() { + int weeks = 0; + int mondayPlus = DateUtils.getMondayPlus(); + GregorianCalendar currentDate = new GregorianCalendar(); + currentDate.add(GregorianCalendar.DATE, mondayPlus + 6); + Date monday = currentDate.getTime(); + + DateFormat df = DateFormat.getDateInstance(); + String preMonday = df.format(monday); + return preMonday; + } + + /** + * 获取时间戳 + * + * @param format 日期时间 + * @return + */ + public static long getTime(String format) { + long t = 0; + if (StringUtils.isEmpty(format)) { + return t; + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date; + try { + date = sdf.parse(format); + t = date.getTime() / 1000; + } catch (Exception e) { + e.printStackTrace(); + } + return t; + } + + /** + * 获得当前日期与本周日相差的天数 + */ + private static int getMondayPlus() { + Calendar cd = Calendar.getInstance(); + // 获得今天是一周的第几天,星期日是第一天,星期二是第二天...... + int dayOfWeek = cd.get(Calendar.DAY_OF_WEEK) - 1; + // 因为按中国礼拜一作为第一天所以这里减1 + if (dayOfWeek == 1) { + return 0; + } else { + return 1 - dayOfWeek; + } + } + + + /** + * 获得本周一的日期 + * + * @return + */ + public static String getMondayOFWeek() { + int weeks = 0; + int mondayPlus = DateUtils.getMondayPlus(); + GregorianCalendar currentDate = new GregorianCalendar(); + currentDate.add(GregorianCalendar.DATE, mondayPlus); + Date monday = currentDate.getTime(); + + DateFormat df = DateFormat.getDateInstance(); + String preMonday = df.format(monday); + return preMonday; + } + + /** + * 获取当前月第一天: + */ + public static String getFirstDayOfMonth(String first) { + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + Calendar c = Calendar.getInstance(); + c.add(Calendar.MONTH, 0); + // 设置为1号,当前日期既为本月第一天 + c.set(Calendar.DAY_OF_MONTH, 1); + first = format.format(c.getTime()); + return first; + } + + /** + * 获取当月最后一天 + */ + public static String getLastDayOfMonth(String last) { + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + Calendar ca = Calendar.getInstance(); + ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH)); + last = format.format(ca.getTime()); + return last; + } + + /** + * 获取当月最后一天 天数 + */ + public static Integer getLastDayOfMonthInt(Date date) { + Calendar ca = Calendar.getInstance(); + ca.setTime(date); + return ca.get(Calendar.DATE); + } + + /** + * 日期月份处理 + * + * @param d 时间 + * @param month 相加的月份,正数则加,负数则减 + * @return + */ + public static Date timeMonthManage(Date d, int month) { + Calendar rightNow = Calendar.getInstance(); + rightNow.setTime(d); + rightNow.add(Calendar.MONTH, month); + return rightNow.getTime(); + } + + /** + * 获取指定年月的最后一天 + * + * @param year_time 指定年 + * @param month_time 指定月 + * @return + */ + public static Date monthLastDay(int year_time, int month_time) { + Calendar cal = Calendar.getInstance(); + cal.set(year_time, month_time, 0, 23, 59, 59); + return cal.getTime(); + } + + /** + * 获取指定年月的第一天 + * + * @param year_time 指定年 + * @param month_time 指定月 + * @return + */ + public static Date monthFirstDay(int year_time, int month_time) { + Calendar cal = Calendar.getInstance(); + cal.set(year_time, month_time - 1, 1, 0, 0, 0); + return cal.getTime(); + } + + /** + * 获取指定时间月的第一天 + * + * @param d 指定时间,为空代表当前时间 + * @return + */ + public static Date currMonthFirstDay(Date d) { + Calendar cal = Calendar.getInstance(); + if (d != null) { + cal.setTime(d); + } + cal.set(Calendar.DAY_OF_MONTH, cal.getActualMinimum(Calendar.DAY_OF_MONTH)); + cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE), 0, 0, 0); + return cal.getTime(); + } + + /** + * 获取指定时间月的最后一天 + * + * @param d 指定时间,为空代表当前时间 + * @return + */ + public static Date currMonthLastDay(Date d) { + Calendar cal = Calendar.getInstance(); + if (d != null) + cal.setTime(d); + cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH)); + cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE), 23, 59, 59); + return cal.getTime(); + } + + /** + * 获取指定时间的年 + * + * @param date 指定时间 + * @return + */ + public static int getTimeYear(Date date) { + if (date == null) { + date = new Date(); + } + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + return cal.get(Calendar.YEAR); + } + + /** + * 获取指定时间的月 + * + * @param date 指定时间 + * @return + */ + public static int getTimeMonth(Date date) { + if (date == null) { + date = new Date(); + } + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + return cal.get(Calendar.MONTH) + 1; + } + + /** + * 获取指定时间的天 + * + * @param date 指定时间 + * @return + */ + public static int getTimeDay(Date date) { + if (date == null) + date = new Date(); + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + return cal.get(Calendar.DATE); + } + + public static Date getFirstSecIntegralTime(Date d) { + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(d.getTime()); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.MILLISECOND, 0); + cal.set(Calendar.DATE, 0); + return cal.getTime(); + } + + /** + * 获取指定时间天的结束时间 + * + * @param d + * @return + */ + public static Date getDayEndTime(long d) { + Date day = null; + if (d <= 0) { + day = new Date(); + } else { + day = new Date(d * 1000); + } + Calendar cal = Calendar.getInstance(); + if (day != null) { + cal.setTimeInMillis(day.getTime()); + } + cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE), 23, 59, 59); + return cal.getTime(); + } + + /** + * 获取指定时间天的开始时间 + * + * @param d + * @return + */ + public static Date getDayStartTime(long d) { + Date day = null; + if (d <= 0) { + day = new Date(); + } else { + day = new Date(d * 1000); + } + Calendar cal = Calendar.getInstance(); + if (day != null) { + cal.setTimeInMillis(day.getTime()); + } + cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE), 0, 0, 0); + return cal.getTime(); + } + + /** + * 获取19位的格式时间 + * + * @param dateStr + * @return + * @throws + */ + public static Date getDateByFullDateStr(String dateStr) { + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + return sdf.parse(dateStr); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取16位的格式时间 yyyy-MM-dd HH:mm + * + * @param dateStr + * @return + * @throws Exception + */ + public static Date getDateByStr(String dateStr) { + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + return sdf.parse(dateStr); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取yyyy-MM-dd的格式时间 + * + * @param dateStr + * @return + * @throws + */ + public static Date getDateByDateStr(String dateStr) { + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + return sdf.parse(dateStr); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取两个日期相差的月数 + * + * @param d1 较大的日期 + * @param d2 较小的日期 + * @return 如果d1>d2返回 月数差 否则返回0 + */ + public static int monthsBetween(Date d1, Date d2) { + Calendar c1 = Calendar.getInstance(); + Calendar c2 = Calendar.getInstance(); + c1.setTime(d1); + c2.setTime(d2); + if (c1.getTimeInMillis() < c2.getTimeInMillis()) { + return 0; + } + int year1 = c1.get(Calendar.YEAR); + int year2 = c2.get(Calendar.YEAR); + int month1 = c1.get(Calendar.MONTH); + int month2 = c2.get(Calendar.MONTH); + int day1 = c1.get(Calendar.DAY_OF_MONTH); + int day2 = c2.get(Calendar.DAY_OF_MONTH); + // 获取年的差值 假设 d1 = 2015-8-16 d2 = 2011-9-30 + int yearInterval = year1 - year2; + // 如果 d1的 月-日 小于 d2的 月-日 那么 yearInterval-- 这样就得到了相差的年数 + if (month1 < month2 || month1 == month2 && day1 < day2) { + yearInterval--; + } + // 获取月数差值 + int monthInterval = (month1 + 12) - month2; + if (day1 < day2) { + monthInterval--; + } + monthInterval %= 12; + return yearInterval * 12 + monthInterval; + } + + /** + * 计算date2 - date1之间相差的天数 + * + * @param date1 + * @param date2 + * @return + */ + public static int daysBetween(Date date1, Date date2) { + DateFormat sdf = new SimpleDateFormat("yyyyMMdd"); + Calendar cal = Calendar.getInstance(); + try { + Date d1 = sdf.parse(DateUtils.dateStr7(date1)); + Date d2 = sdf.parse(DateUtils.dateStr7(date2)); + cal.setTime(d1); + long time1 = cal.getTimeInMillis(); + cal.setTime(d2); + long time2 = cal.getTimeInMillis(); + return Integer.parseInt(String.valueOf((time2 - time1) / 86400000L)); + } catch (Exception e) { + e.printStackTrace(); + } + return 0; + } + + /** + * 计算date2 - date1之间相差的分钟 + * + * @param date1 + * @param date2 + * @return + */ + public static int minutesBetween(Date date1, Date date2) { + Calendar cal = Calendar.getInstance(); + cal.setTime(date1); + long time1 = cal.getTimeInMillis(); + cal.setTime(date2); + long time2 = cal.getTimeInMillis(); + if (time2 - time1 <= 0) { + return 0; + } else { + return Integer.parseInt(String.valueOf((time2 - time1) / 60000L)) + 1; + } + + } + + /** + * 计算date2 - date1之间相差的秒 + * + * @param date1 + * @param date2 + * @return + */ + public static int secondBetween(Date date1, Date date2) { + Calendar cal = Calendar.getInstance(); + cal.setTime(date1); + long time1 = cal.getTimeInMillis(); + cal.setTime(date2); + long time2 = cal.getTimeInMillis(); + if (time2 - time1 <= 0) { + return 0; + } else { + return Integer.parseInt(String.valueOf((time2 - time1) / 1000L)) + 1; + } + } + + /** + * 计算date2 - date1之间相差的毫秒 + * + * @param date1 + * @param date2 + * @return + */ + public static int millisecondBetween(Date date1, Date date2) { + Calendar cal = Calendar.getInstance(); + cal.setTime(date1); + long time1 = cal.getTimeInMillis(); + cal.setTime(date2); + long time2 = cal.getTimeInMillis(); + if (time2 - time1 <= 0) { + return 0; + } else { + return Integer.parseInt(String.valueOf((time2 - time1))); + } + } + + /** + * 获取当月开始时间 + */ + public static Date getMonthStartTime() { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM"); + Calendar cal = Calendar.getInstance(); + Date nowdate = cal.getTime(); + String date1 = sdf.format(nowdate); + date1 += "-01 00:00:00"; + try { + SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + return sdf2.parse(date1); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取当月开始时间Str + */ + public static String getMonthStartTimeStr() { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM"); + Calendar cal = Calendar.getInstance(); + Date nowdate = cal.getTime(); + String date = sdf.format(nowdate); + date += "-01 00:00:00"; + return date; + } + + + /** + * 获取当月结束时间 + */ + + public static Date getMonthEndTime() { + Calendar calendar = Calendar.getInstance(); + // 设置日期为本月最大日期 + calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE)); + // 打印 + DateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd"); + calendar.getTime(); + String date1 = sdf1.format(calendar.getTime()); + date1 += " 23:59:59"; + SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + return sdf2.parse(date1); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + + /** + * 根据当前日期计算今年剩余天数 + * + * @return + */ + public static int getLeftDaysOfCurrYear() { + return daysBetween(new Date(), getCurrYearLast()); + } + + /** + * 获取当年的最后一天 + * + * @return + */ + public static Date getCurrYearLast() { + Calendar currCal = Calendar.getInstance(); + int currentYear = currCal.get(Calendar.YEAR); + return getYearLast(currentYear); + } + + /** + * 获取某年最后一天日期 + * + * @param year 年份 + * @return Date + */ + public static Date getYearLast(int year) { + Calendar calendar = Calendar.getInstance(); + calendar.clear(); + calendar.set(Calendar.YEAR, year); + calendar.roll(Calendar.DAY_OF_YEAR, -1); + Date currYearLast = calendar.getTime(); + + return currYearLast; + } + + /** + * 根据出生日期计算年龄 + * + * @param birthday 出生日期 + * @return + */ + public static int getAge(Date birthday) { + int age = 0; + Calendar born = Calendar.getInstance(); + Calendar now = Calendar.getInstance(); + if (birthday != null) { + now.setTime(new Date()); + born.setTime(birthday); + if (born.after(now)) { + throw new IllegalArgumentException("年龄不能超过当前日期"); + } + age = now.get(Calendar.YEAR) - born.get(Calendar.YEAR); + int nowDayOfYear = now.get(Calendar.DAY_OF_YEAR); + int bornDayOfYear = born.get(Calendar.DAY_OF_YEAR); + if (nowDayOfYear < bornDayOfYear) { + age -= 1; + } + } + return age; + } + + + /** + * 判断当前时间是否是否 3:00过后 如果当前时间是交易时间段 + * + * @return + */ + public static boolean checkedTransactionTime() { + Date da = new Date(); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + String now = sdf.format(da); + Calendar c1 = Calendar.getInstance(); + Calendar c2 = Calendar.getInstance(); + try { + c1.setTime(sdf.parse(now)); + c2.setTime(sdf.parse("15:00:00")); + } catch (ParseException e) { + e.printStackTrace(); + } + + if ((c1.compareTo(c2) > 0)) { + return false; + } + return true; + } + + + /** + * 判断当前时间是否是否 2:30前 + * + * @return + */ + public static boolean checkedTransactionTowTime() { + Date da = new Date(); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + String now = sdf.format(da); + Calendar c1 = Calendar.getInstance(); + Calendar c2 = Calendar.getInstance(); + try { + c1.setTime(sdf.parse(now)); + c2.setTime(sdf.parse("14:30:00")); + } catch (ParseException e) { + e.printStackTrace(); + } + + if ((c1.compareTo(c2) > 0)) { + return false; + } + return true; + } + + /** + * 日期转换为字符串 格式自定义 + * + * @param date + * @param f + * @return + */ + public static Date dateFormat(Date date, String f) { + Date date1 = new Date(); + if (date == null) { + return null; + } + SimpleDateFormat format = new SimpleDateFormat(f); + String str = format.format(date); + try { + date1 = format.parse(str); + } catch (ParseException e) { + e.printStackTrace(); + } + return date1; + } + + +} diff --git a/passuser/src/main/java/com/passuser/net/utils/Generatingkey.java b/passuser/src/main/java/com/passuser/net/utils/Generatingkey.java new file mode 100644 index 0000000..2cb8cf5 --- /dev/null +++ b/passuser/src/main/java/com/passuser/net/utils/Generatingkey.java @@ -0,0 +1,69 @@ +package com.passuser.net.utils; + +import javax.crypto.KeyGenerator; +import javax.crypto.SecretKey; +import java.security.NoSuchAlgorithmException; +import java.util.Scanner; + +public class Generatingkey { + /** + 随机生成AES密钥 + * @return + */ + public static String getAESKey() { + String s1; + KeyGenerator kg = null; + try { + kg = KeyGenerator.getInstance("AES"); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + kg.init(128); + //要生成多少位,只需要修改这里即可128, 192或256 + SecretKey sk = kg.generateKey(); + byte[] b = sk.getEncoded(); + s1 = byteToHexString(b); + // System.out.println("随机生成的密钥长度:"+s1.length()*4); + // System.out.println("密钥:"+s1); + return s1; + } + + public static String getDESKey() { + String s1; + KeyGenerator kg = null; + try { + kg = KeyGenerator.getInstance("DES"); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + kg.init(56); + //要生成多少位,只需要修改这里即可128, 192或256 + SecretKey sk = kg.generateKey(); + byte[] b = sk.getEncoded(); + s1 = byteToHexString(b); + // System.out.println("随机生成的密钥长度:"+s1.length()*4); + // System.out.println("密钥:"+s1); + + return s1; + } + + /** + byte数组转化为16进制字符串 + */ + public static String byteToHexString(byte[] bytes) { + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < bytes.length; i++) { + String strHex=Integer.toHexString(bytes[i]); + if(strHex.length() > 3) { + sb.append(strHex.substring(6)); + } else { + if(strHex.length() < 2) { + sb.append("0" + strHex); + } else { + sb.append(strHex); + } + } + } + return sb.toString(); + } +} diff --git a/passuser/src/main/java/com/passuser/net/utils/HttpUtils.java b/passuser/src/main/java/com/passuser/net/utils/HttpUtils.java new file mode 100644 index 0000000..b36d306 --- /dev/null +++ b/passuser/src/main/java/com/passuser/net/utils/HttpUtils.java @@ -0,0 +1,129 @@ +package com.passuser.net.utils; + +import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpEntity; +import org.apache.http.NameValuePair; +import org.apache.http.client.ResponseHandler; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.BasicResponseHandler; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; + +import java.io.IOException; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Slf4j +public class HttpUtils { + + private static final String ENCODING = "UTF-8"; + + + public static String post(String url, Map paramsMap) { + CloseableHttpClient client = HttpClients.createDefault(); + String responseText = ""; + CloseableHttpResponse response = null; + try { + HttpPost method = new HttpPost(url); + if (paramsMap != null) { + List paramList = new ArrayList(); + for (Map.Entry param : paramsMap.entrySet()) { + NameValuePair pair = new BasicNameValuePair(param.getKey(), param.getValue()); + paramList.add(pair); + } + method.setEntity(new UrlEncodedFormEntity(paramList, ENCODING)); + } + response = client.execute(method); + HttpEntity entity = response.getEntity(); + if (entity != null) { + responseText = EntityUtils.toString(entity); + } + } catch (Exception e) { + log.error("http request failed",e); + } finally { + try { + response.close(); + } catch (Exception e) { + log.error("",e); + } + } + return responseText; + } + + public static String get(String url, Map paramsMap) { + CloseableHttpClient client = HttpClients.createDefault(); + String responseText = ""; + CloseableHttpResponse response = null; + try { + String getUrl = url+"?"; + if (paramsMap != null) { + for (Map.Entry param : paramsMap.entrySet()) { + getUrl += param.getKey() + "=" + URLEncoder.encode(param.getValue(), ENCODING)+"&"; + } + } + HttpGet method = new HttpGet(getUrl); + response = client.execute(method); + HttpEntity entity = response.getEntity(); + if (entity != null) { + responseText = EntityUtils.toString(entity); + } + } catch (Exception e) { + log.error("http request failed",e); + } finally { + try { + response.close(); + } catch (Exception e) { + log.error("",e); + } + } + return responseText; + } + //post请求参数为json格式 + public static String HttpPostWithJson(String url, String json) { + String returnValue = "这是默认返回值,接口调用失败"; + CloseableHttpClient httpClient = HttpClients.createDefault(); + ResponseHandler responseHandler = new BasicResponseHandler(); + try{ + //第一步:创建HttpClient对象 + httpClient = HttpClients.createDefault(); + + //第二步:创建httpPost对象 + HttpPost httpPost = new HttpPost(url); + + //第三步:给httpPost设置JSON格式的参数 + StringEntity requestEntity = new StringEntity(json,"utf-8"); + requestEntity.setContentEncoding("UTF-8"); + httpPost.setHeader("Content-type", "application/json"); + httpPost.setEntity(requestEntity); + + //第四步:发送HttpPost请求,获取返回值 + returnValue = httpClient.execute(httpPost,responseHandler); //调接口获取返回值时,必须用此方法 + + } + catch(Exception e) + { + e.printStackTrace(); + } + + finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + //第五步:处理返回值 + return returnValue; + } + + +} diff --git a/passuser/src/main/java/com/passuser/net/utils/Md5TokenGenerator.java b/passuser/src/main/java/com/passuser/net/utils/Md5TokenGenerator.java new file mode 100644 index 0000000..c29b3d0 --- /dev/null +++ b/passuser/src/main/java/com/passuser/net/utils/Md5TokenGenerator.java @@ -0,0 +1,21 @@ +package com.passuser.net.utils; + +import org.springframework.stereotype.Component; +import org.springframework.util.DigestUtils; + + +@Component +public class Md5TokenGenerator implements TokenGenerator { + + @Override + public String generate(String... strings) { + long timestamp = System.currentTimeMillis(); + String tokenMeta = ""; + for (String s : strings) { + tokenMeta = tokenMeta + s; + } + tokenMeta = tokenMeta + timestamp; + String token = DigestUtils.md5DigestAsHex(tokenMeta.getBytes()); + return token; + } +} diff --git a/passuser/src/main/java/com/passuser/net/utils/R.java b/passuser/src/main/java/com/passuser/net/utils/R.java new file mode 100644 index 0000000..bf61e40 --- /dev/null +++ b/passuser/src/main/java/com/passuser/net/utils/R.java @@ -0,0 +1,49 @@ +package com.passuser.net.utils; + +import java.util.HashMap; +import java.util.Map; + +public class R extends HashMap { + + private static final long serialVersionUID = 1L; + + public R() { + put("code", 200); + } + + public static R error() { + return error(500, "未知异常,请联系管理员"); + } + + public static R error(String msg) { + return error(500, msg); + } + + public static R error(int code, String msg) { + R r = new R(); + r.put("code", code); + r.put("msg", msg); + return r; + } + + public static R ok(String msg) { + R r = new R(); + r.put("msg", msg); + return r; + } + + public static R ok(Map map) { + R r = new R(); + r.putAll(map); + return r; + } + + public static R ok() { + return new R(); + } + + public R put(String key, Object value) { + super.put(key, value); + return this; + } +} \ No newline at end of file diff --git a/passuser/src/main/java/com/passuser/net/utils/RSAUtils.java b/passuser/src/main/java/com/passuser/net/utils/RSAUtils.java new file mode 100644 index 0000000..9a84d25 --- /dev/null +++ b/passuser/src/main/java/com/passuser/net/utils/RSAUtils.java @@ -0,0 +1,111 @@ +package com.passuser.net.utils; + +import sun.misc.BASE64Decoder; +import sun.misc.BASE64Encoder; + +import java.security.Key; +import java.security.KeyPair; +import java.security.KeyPairGenerator; +import java.security.interfaces.RSAPrivateKey; +import java.security.interfaces.RSAPublicKey; +import java.util.HashMap; +import java.util.Map; + + +public class RSAUtils { + + + + public class Keys { + + } + + public static final String KEY_ALGORITHM = "RSA"; + //public static final String SIGNATURE_ALGORITHM = "MD5withRSA"; + private static final String PUBLIC_KEY = "RSAPublicKey"; + private static final String PRIVATE_KEY = "RSAPrivateKey"; + + //获得公钥 + public static String getPublicKey(Map keyMap) throws Exception { + //获得map中的公钥对象 转为key对象 + Key key = (Key) keyMap.get(PUBLIC_KEY); + //byte[] publicKey = key.getEncoded(); + //编码返回字符串 + return encryptBASE64(key.getEncoded()); + } + + //获得私钥 + public static String getPrivateKey(Map keyMap) throws Exception { + //获得map中的私钥对象 转为key对象 + Key key = (Key) keyMap.get(PRIVATE_KEY); + //byte[] privateKey = key.getEncoded(); + //编码返回字符串 + return encryptBASE64(key.getEncoded()); + } + + //解码返回byte + public static byte[] decryptBASE64(String key) throws Exception { + return (new BASE64Decoder()).decodeBuffer(key); + } + + //编码返回字符串 + public static String encryptBASE64(byte[] key) throws Exception { + return (new BASE64Encoder()).encodeBuffer(key); + } + + //map对象中存放公私钥 + public static Map initKey() throws Exception { + //获得对象 KeyPairGenerator 参数 RSA 1024个字节 + KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM); + keyPairGen.initialize(1024); + //通过对象 KeyPairGenerator 获取对象KeyPair + KeyPair keyPair = keyPairGen.generateKeyPair(); + + //通过对象 KeyPair 获取RSA公私钥对象RSAPublicKey RSAPrivateKey + RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); + RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); + //公私钥对象存入map中 + Map keyMap = new HashMap(2); + keyMap.put(PUBLIC_KEY, publicKey); + keyMap.put(PRIVATE_KEY, privateKey); + return keyMap; + } + + + + public static String getPriKey() throws Exception { + Map keyMap; + keyMap = initKey(); + //String publicKey = getPublicKey(keyMap); + //System.out.println(publicKey); + String privateKey = getPrivateKey(keyMap); + //System.out.println(privateKey); + //return privateKey; + return privateKey; + } + + public static String getPubKey() throws Exception { + Map keyMap; + keyMap = initKey(); + String publicKey = getPublicKey(keyMap); + //System.out.println(publicKey); + //String privateKey = getPrivateKey(keyMap); + //System.out.println(privateKey); + return publicKey; + } +/* + public static void main(String[] args) { + + try { + String privateKey =getPriKey(); + String publicKey =getPubKey(); + + System.out.println(publicKey); + + System.out.println(privateKey); + } catch (Exception e) { + e.printStackTrace(); + } + } +*/ +} \ No newline at end of file diff --git a/passuser/src/main/java/com/passuser/net/utils/RedisTokenUtil.java b/passuser/src/main/java/com/passuser/net/utils/RedisTokenUtil.java new file mode 100644 index 0000000..24bea45 --- /dev/null +++ b/passuser/src/main/java/com/passuser/net/utils/RedisTokenUtil.java @@ -0,0 +1,29 @@ +package com.passuser.net.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; + +import java.util.concurrent.TimeUnit; + +public class RedisTokenUtil { + + @Autowired + Md5TokenGenerator tokenGenerator; + + @Autowired + private static RedisTemplate redisUtil; + + + public String returnToken(String username,String password){ + String token = tokenGenerator.generate(username, password); + redisUtil.opsForValue().set(username, token); + //设置key生存时间,当key过期时,它会被自动删除,时间是秒 + redisUtil.expire(username, ConstantKit.TOKEN_EXPIRE_TIME, TimeUnit.MINUTES); + redisUtil.opsForValue().set(token, username); + redisUtil.expire(token, ConstantKit.TOKEN_EXPIRE_TIME,TimeUnit.MINUTES); + Long currentTime = System.currentTimeMillis(); + redisUtil.opsForValue().set(token + username, currentTime.toString()); + //用完关闭 + return token; + } +} diff --git a/passuser/src/main/java/com/passuser/net/utils/RedisUtils.java b/passuser/src/main/java/com/passuser/net/utils/RedisUtils.java new file mode 100644 index 0000000..3bbed85 --- /dev/null +++ b/passuser/src/main/java/com/passuser/net/utils/RedisUtils.java @@ -0,0 +1,231 @@ +package com.passuser.net.utils; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.concurrent.TimeUnit; + +@Component +public class RedisUtils { + + private RedisUtils() { + } + + @Autowired + private static RedisTemplate redisTemplate; + + /** + * 设置有效时间 + * + * @param key Redis键 + * @param timeout 超时时间 + * @return true=设置成功;false=设置失败 + */ + public static boolean expire(final String key, final long timeout) { + + return expire(key, timeout, TimeUnit.SECONDS); + } + + /** + * 设置有效时间 + * + * @param key Redis键 + * @param timeout 超时时间 + * @param unit 时间单位 + * @return true=设置成功;false=设置失败 + */ + public static boolean expire(final String key, final long timeout, final TimeUnit unit) { + + Boolean ret = redisTemplate.expire(key, timeout, unit); + return ret != null && ret; + } + + /** + * 删除单个key + * + * @param key 键 + * @return true=删除成功;false=删除失败 + */ + public static boolean del(final String key) { + + Boolean ret = redisTemplate.delete(key); + return ret != null && ret; + } + + /** + * 删除多个key + * + * @param keys 键集合 + * @return 成功删除的个数 + */ + public static long del(final Collection keys) { + + Long ret = redisTemplate.delete(keys); + return ret == null ? 0 : ret; + } + + /** + * 存入普通对象 + * + * @param key Redis键 + * @param value 值 + */ + public static void set(final String key, final String value) { + + redisTemplate.opsForValue().set(key, value, 1, TimeUnit.MINUTES); + } + + // 存储普通对象操作 + + /** + * 存入普通对象 + * + * @param key 键 + * @param value 值 + * @param timeout 有效期,单位秒 + */ + public static void set(final String key, final String value, final long timeout) { + + redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS); + } + + /** + * 获取普通对象 + * + * @param key 键 + * @return 对象 + */ + public static String get(final String key) { + + return redisTemplate.opsForValue().get(key); + } + + // 存储Hash操作 + + /** + * 往Hash中存入数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @param value 值 + */ + public static void hPut(final String key, final String hKey, final Object value) { + + redisTemplate.opsForHash().put(key, hKey, value); + } + + /** + * 往Hash中存入多个数据 + * + * @param key Redis键 + * @param values Hash键值对 + */ + public static void hPutAll(final String key, final Map values) { + + redisTemplate.opsForHash().putAll(key, values); + } + + /** + * 获取Hash中的数据 + * + * @param key Redis键 + * @param hKey Hash键 + * @return Hash中的对象 + */ + public static Object hGet(final String key, final String hKey) { + + return redisTemplate.opsForHash().get(key, hKey); + } + + /** + * 获取多个Hash中的数据 + * + * @param key Redis键 + * @param hKeys Hash键集合 + * @return Hash对象集合 + */ + public static List hMultiGet(final String key, final Collection hKeys) { + + return redisTemplate.opsForHash().multiGet(key, hKeys); + } + + // 存储Set相关操作 + + /** + * 往Set中存入数据 + * + * @param key Redis键 + * @param values 值 + * @return 存入的个数 + */ + public static long sSet(final String key, final String... values) { + Long count = redisTemplate.opsForSet().add(key, values); + return count == null ? 0 : count; + } + + /** + * 删除Set中的数据 + * + * @param key Redis键 + * @param values 值 + * @return 移除的个数 + */ + public static long sDel(final String key, final String... values) { + Long count = redisTemplate.opsForSet().remove(key, values); + return count == null ? 0 : count; + } + + // 存储List相关操作 + + /** + * 往List中存入数据 + * + * @param key Redis键 + * @param value 数据 + * @return 存入的个数 + */ + public static long lPush(final String key, final String value) { + Long count = redisTemplate.opsForList().rightPush(key, value); + return count == null ? 0 : count; + } + + /** + * 往List中存入多个数据 + * + * @param key Redis键 + * @param values 多个数据 + * @return 存入的个数 + */ + public static long lPushAll(final String key, final Collection values) { + Long count = redisTemplate.opsForList().rightPushAll(key, values); + return count == null ? 0 : count; + } + + /** + * 往List中存入多个数据 + * + * @param key Redis键 + * @param values 多个数据 + * @return 存入的个数 + */ + public static long lPushAll(final String key, final String... values) { + Long count = redisTemplate.opsForList().rightPushAll(key, values); + return count == null ? 0 : count; + } + + /** + * 从List中获取begin到end之间的元素 + * + * @param key Redis键 + * @param start 开始位置 + * @param end 结束位置(start=0,end=-1表示获取全部元素) + * @return List对象 + */ + public static List lGet(final String key, final int start, final int end) { + return redisTemplate.opsForList().range(key, start, end); + } +} diff --git a/passuser/src/main/java/com/passuser/net/utils/ResolveResponUtils.java b/passuser/src/main/java/com/passuser/net/utils/ResolveResponUtils.java new file mode 100644 index 0000000..19e04d3 --- /dev/null +++ b/passuser/src/main/java/com/passuser/net/utils/ResolveResponUtils.java @@ -0,0 +1,111 @@ +package com.passuser.net.utils; + +import com.google.gson.Gson; +import com.passuser.net.KeyUtils.Sm4Util; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Component +public class ResolveResponUtils { + + @Autowired + private RedisTemplate redisTemplate; + + @Autowired + private Map map = new HashMap<>(); + + public Map resolveGetRespons(String url, Map paramsMap){ + String getRanStr = HttpUtils.get(url, paramsMap); + return getResponse(getRanStr); + } + + public Map resolvePostRespons(String url, Map paramsMap){ + String getRanStr = HttpUtils.post(url, paramsMap); + return getResponse(getRanStr); + } + + public Map resolvePostJsonRespons(String url, String postJson){ + String getRanStr = HttpUtils.HttpPostWithJson(url, postJson); + return getResponse(getRanStr); + } + + public String getGetResponseData(String url,Map paramsMap, String dataKey) throws Exception { + String getRanStr = HttpUtils.get(url, paramsMap); + return dealGetResponseData(dataKey, getRanStr); + } + + public String getPostJsonResponseData(String url,String postJson, String dataKey) throws Exception { + String getRanStr = HttpUtils.HttpPostWithJson(url, postJson); + return dealGetResponseData(dataKey, getRanStr); + } + + public String getPostResponseData(String url,Map paramsMap, String dataKey) throws Exception { + String getRanStr = HttpUtils.post(url, paramsMap); + return dealGetResponseData(dataKey, getRanStr); + } + + public Map getGetResponseDecryptData(String url,Map paramsMap, List dataKey) throws Exception { + String getRanStr = HttpUtils.get(url, paramsMap); + return dealResponseDecryptData(getRanStr,dataKey); + } + + public Map getPostResponseDecryptData(String url,Map paramsMap, List dataKey) throws Exception { + String getRanStr = HttpUtils.post(url, paramsMap); + return dealResponseDecryptData( getRanStr,dataKey); + } + + public Map getPostJsonResponseDecryptData(String url, String postjson, List dataKey) throws Exception { + String getRanStr = HttpUtils.HttpPostWithJson(url, postjson); + return dealResponseDecryptData( getRanStr,dataKey); + } + + private Map dealResponseDecryptData(String getRanStr, List dataKey) throws Exception { + String sessionkey = redisTemplate.opsForValue().get("sessionkey"); + Map response = getResponse(getRanStr); + Map perDatas = new HashMap<>(); + if(response!= null){ + for (String key : dataKey) { + perDatas.put(key,Sm4Util.decryptEcb(sessionkey, response.get(key).toString())); + } + }else{ + throw new Exception("Response is not defined"); + } + return perDatas; + } + + private String dealResponseListDecryptData(String dataKey, String getRanStr) throws Exception { + String sessionkey = redisTemplate.opsForValue().get("sessionkey"); + Map response = getResponse(getRanStr); + String perData = ""; + if(response!= null){ + perData = Sm4Util.decryptEcb(sessionkey, response.get(dataKey).toString()); + }else{ + throw new Exception("Response is not defined"); + } + return perData; + } + + + private String dealGetResponseData(String dataKey, String getRanStr) { + Map response = getResponse(getRanStr); + String perData; + if (response != null) { + perData = response.get(dataKey).toString(); + } else { + throw new NullPointerException("Response is not defined"); + } + return perData; + } + + + private Map getResponse(String getRanStr) { + Gson gson = new Gson(); + return gson.fromJson(getRanStr, map.getClass()); + } + +} diff --git a/passuser/src/main/java/com/passuser/net/utils/ThroughUserkey.java b/passuser/src/main/java/com/passuser/net/utils/ThroughUserkey.java new file mode 100644 index 0000000..e139e20 --- /dev/null +++ b/passuser/src/main/java/com/passuser/net/utils/ThroughUserkey.java @@ -0,0 +1,111 @@ +package com.passuser.net.utils;/* +主密钥生成类 +*/ +import java.security.NoSuchAlgorithmException; +import javax.crypto.KeyGenerator; +import javax.crypto.SecretKey; +import java.util.Scanner; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import javax.crypto.KeyGenerator; +import javax.crypto.SecretKey; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.ObjectInputStream; +import java.io.ObjectOutputStream; +import java.io.OutputStream; +import java.security.Key; +import java.security.SecureRandom; +import javax.crypto.Cipher; +import javax.crypto.CipherInputStream; +import javax.crypto.CipherOutputStream; +import javax.crypto.KeyGenerator; + +public class ThroughUserkey { + + /** + 随机生成密钥 + * @return + */ + public static String getAESKey() { + String s1; + KeyGenerator kg = null; + try { + kg = KeyGenerator.getInstance("AES"); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + kg.init(128); + //要生成多少位,只需要修改这里即可128, 192或256 + SecretKey sk = kg.generateKey(); + byte[] b = sk.getEncoded(); + s1 = byteToHexString(b); + // System.out.println("随机生成的密钥长度:"+s1.length()*4); + // System.out.println("密钥:"+s1); + + return s1; + } + + public static String getDESKey() { + String s1; + KeyGenerator kg = null; + try { + kg = KeyGenerator.getInstance("DES"); + } catch (NoSuchAlgorithmException e) { + e.printStackTrace(); + } + kg.init(56); + //要生成多少位,只需要修改这里即可128, 192或256 + SecretKey sk = kg.generateKey(); + byte[] b = sk.getEncoded(); + s1 = byteToHexString(b); + // System.out.println("随机生成的密钥长度:"+s1.length()*4); + // System.out.println("密钥:"+s1); + + return s1; + } + /** + 使用指定的字符串生成密钥 + * @return + */ + public static String getKeyByPass(String password) { + //生成秘钥 + KeyGenerator kg = null; + try { + kg = KeyGenerator.getInstance("AES"); + } catch (NoSuchAlgorithmException ex) { + ex.printStackTrace(); + } + //SecureRandom是生成安全随机数序列,password.getBytes()是种子,只要种子相同,序列就一样,所以生成的秘钥就一样。 + //System.out.println("输入指定字符串生成的密钥的长度:"); + //int i=input.nextInt(); + + kg.init(128, new SecureRandom(password.getBytes())); + SecretKey sk = kg.generateKey(); + byte[] b = sk.getEncoded(); + String s2 = byteToHexString(b); + // System.out.println("指定字符串生成的密钥长度:"+s2.length()*4); + // System.out.println("密钥:"+s2); + return s2; + } + /** + byte数组转化为16进制字符串 + */ + public static String byteToHexString(byte[] bytes) { + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < bytes.length; i++) { + String strHex=Integer.toHexString(bytes[i]); + if(strHex.length() > 3) { + sb.append(strHex.substring(6)); + } else { + if(strHex.length() < 2) { + sb.append("0" + strHex); + } else { + sb.append(strHex); + } + } + } + return sb.toString(); + } +} diff --git a/passuser/src/main/java/com/passuser/net/utils/TokenGenerator.java b/passuser/src/main/java/com/passuser/net/utils/TokenGenerator.java new file mode 100644 index 0000000..e21f250 --- /dev/null +++ b/passuser/src/main/java/com/passuser/net/utils/TokenGenerator.java @@ -0,0 +1,10 @@ +package com.passuser.net.utils; + +import org.springframework.stereotype.Component; + +@Component +public interface TokenGenerator { + + public String generate(String... strings); + +} diff --git a/passuser/src/main/resources/META-INF/resources/WEB-INF/view/PassInstant/passInstant/passInstant.html b/passuser/src/main/resources/META-INF/resources/WEB-INF/view/PassInstant/passInstant/passInstant.html new file mode 100644 index 0000000..9e8afaa --- /dev/null +++ b/passuser/src/main/resources/META-INF/resources/WEB-INF/view/PassInstant/passInstant/passInstant.html @@ -0,0 +1,37 @@ +
+
+
+
+
密钥管理管理
+
+
+
+
+
+
+ <#NameCon id="condition" name="名称" /> +
+
+ <#button name="搜索" icon="fa-search" clickFun="PassInstant.search()"/> +
+
+ + <#table id="PassInstantTable"/> +
+
+
+
+
+
+ +@} diff --git a/passuser/src/main/resources/META-INF/resources/WEB-INF/view/PassInstant/passInstant/passInstant_add.html b/passuser/src/main/resources/META-INF/resources/WEB-INF/view/PassInstant/passInstant/passInstant_add.html new file mode 100644 index 0000000..93f5258 --- /dev/null +++ b/passuser/src/main/resources/META-INF/resources/WEB-INF/view/PassInstant/passInstant/passInstant_add.html @@ -0,0 +1,35 @@ +@layout("/common/_container.html"){ +
+
+
+ +
+
+ <#input id="passId" name="密钥UUID" underline="true"/> + <#input id="passName" name="密钥名称" underline="true"/> + <#input id="passLength" name="密钥长度" underline="true"/> + <#input id="passType" name="密钥类型" underline="true"/> + <#input id="passChildfir" name="第一子密钥"/> +
+ +
+ <#input id="passChildsec" name="第二子密钥" underline="true"/> + <#input id="passChildthi" name="第三子密钥" underline="true"/> + <#input id="passExpiry" name="密钥有效期" underline="true"/> + <#input id="passCreatetime" name="密钥上传时间" underline="true"/> + <#input id="passUserid" name="密钥用户" underline="true"/> +
+
+ +
+
+ <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="PassInstantInfoDlg.addSubmit()"/> + <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="PassInstantInfoDlg.close()"/> +
+
+
+ +
+
+ +@} diff --git a/passuser/src/main/resources/META-INF/resources/WEB-INF/view/PassInstant/passInstant/passInstant_edit.html b/passuser/src/main/resources/META-INF/resources/WEB-INF/view/PassInstant/passInstant/passInstant_edit.html new file mode 100644 index 0000000..f2c567f --- /dev/null +++ b/passuser/src/main/resources/META-INF/resources/WEB-INF/view/PassInstant/passInstant/passInstant_edit.html @@ -0,0 +1,35 @@ +@layout("/common/_container.html"){ +
+
+
+ +
+
+ <#input id="passId" name="密钥UUID" value="${item.passId}" underline="true"/> + <#input id="passName" name="密钥名称" value="${item.passName}" underline="true"/> + <#input id="passLength" name="密钥长度" value="${item.passLength}" underline="true"/> + <#input id="passType" name="密钥类型" value="${item.passType}" underline="true"/> + <#input id="passChildfir" name="第一子密钥" value="${item.passChildfir}" /> +
+ +
+ <#input id="passChildsec" name="第二子密钥" value="${item.passChildsec}" underline="true"/> + <#input id="passChildthi" name="第三子密钥" value="${item.passChildthi}" underline="true"/> + <#input id="passExpiry" name="密钥有效期" value="${item.passExpiry}" underline="true"/> + <#input id="passCreatetime" name="密钥上传时间" value="${item.passCreatetime}" underline="true"/> + <#input id="passUserid" name="密钥用户" value="${item.passUserid}" /> +
+
+ +
+
+ <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="PassInstantInfoDlg.editSubmit()"/> + <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="PassInstantInfoDlg.close()"/> +
+
+
+ +
+
+ +@} diff --git a/passuser/src/main/resources/META-INF/resources/WEB-INF/view/login.html b/passuser/src/main/resources/META-INF/resources/WEB-INF/view/login.html new file mode 100644 index 0000000..5cf1d70 --- /dev/null +++ b/passuser/src/main/resources/META-INF/resources/WEB-INF/view/login.html @@ -0,0 +1,62 @@ + + + + + + + 创新课程系统 - 登录 + + + + + + + + + + + + +
+
+
+

欢迎使用创新课程管理系统

+ +
+

创新课程,让课程管理更加高效有趣,更加智能化!

+ +
+

${tips!}

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

+
+
+
+ + + + + + diff --git a/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/css/bootstrap-theme.css b/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/css/bootstrap-theme.css new file mode 100644 index 0000000..31d8882 --- /dev/null +++ b/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/css/bootstrap-theme.css @@ -0,0 +1,587 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +.btn-default, +.btn-primary, +.btn-success, +.btn-info, +.btn-warning, +.btn-danger { + text-shadow: 0 -1px 0 rgba(0, 0, 0, .2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075); +} +.btn-default:active, +.btn-primary:active, +.btn-success:active, +.btn-info:active, +.btn-warning:active, +.btn-danger:active, +.btn-default.active, +.btn-primary.active, +.btn-success.active, +.btn-info.active, +.btn-warning.active, +.btn-danger.active { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn-default.disabled, +.btn-primary.disabled, +.btn-success.disabled, +.btn-info.disabled, +.btn-warning.disabled, +.btn-danger.disabled, +.btn-default[disabled], +.btn-primary[disabled], +.btn-success[disabled], +.btn-info[disabled], +.btn-warning[disabled], +.btn-danger[disabled], +fieldset[disabled] .btn-default, +fieldset[disabled] .btn-primary, +fieldset[disabled] .btn-success, +fieldset[disabled] .btn-info, +fieldset[disabled] .btn-warning, +fieldset[disabled] .btn-danger { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-default .badge, +.btn-primary .badge, +.btn-success .badge, +.btn-info .badge, +.btn-warning .badge, +.btn-danger .badge { + text-shadow: none; +} +.btn:active, +.btn.active { + background-image: none; +} +.btn-default { + text-shadow: 0 1px 0 #fff; + background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%); + background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#e0e0e0)); + background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #dbdbdb; + border-color: #ccc; +} +.btn-default:hover, +.btn-default:focus { + background-color: #e0e0e0; + background-position: 0 -15px; +} +.btn-default:active, +.btn-default.active { + background-color: #e0e0e0; + border-color: #dbdbdb; +} +.btn-default.disabled, +.btn-default[disabled], +fieldset[disabled] .btn-default, +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus, +.btn-default.disabled:active, +.btn-default[disabled]:active, +fieldset[disabled] .btn-default:active, +.btn-default.disabled.active, +.btn-default[disabled].active, +fieldset[disabled] .btn-default.active { + background-color: #e0e0e0; + background-image: none; +} +.btn-primary { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#265a88)); + background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #245580; +} +.btn-primary:hover, +.btn-primary:focus { + background-color: #265a88; + background-position: 0 -15px; +} +.btn-primary:active, +.btn-primary.active { + background-color: #265a88; + border-color: #245580; +} +.btn-primary.disabled, +.btn-primary[disabled], +fieldset[disabled] .btn-primary, +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus, +.btn-primary.disabled:active, +.btn-primary[disabled]:active, +fieldset[disabled] .btn-primary:active, +.btn-primary.disabled.active, +.btn-primary[disabled].active, +fieldset[disabled] .btn-primary.active { + background-color: #265a88; + background-image: none; +} +.btn-success { + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%); + background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#419641)); + background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #3e8f3e; +} +.btn-success:hover, +.btn-success:focus { + background-color: #419641; + background-position: 0 -15px; +} +.btn-success:active, +.btn-success.active { + background-color: #419641; + border-color: #3e8f3e; +} +.btn-success.disabled, +.btn-success[disabled], +fieldset[disabled] .btn-success, +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus, +.btn-success.disabled:active, +.btn-success[disabled]:active, +fieldset[disabled] .btn-success:active, +.btn-success.disabled.active, +.btn-success[disabled].active, +fieldset[disabled] .btn-success.active { + background-color: #419641; + background-image: none; +} +.btn-info { + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); + background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#2aabd2)); + background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #28a4c9; +} +.btn-info:hover, +.btn-info:focus { + background-color: #2aabd2; + background-position: 0 -15px; +} +.btn-info:active, +.btn-info.active { + background-color: #2aabd2; + border-color: #28a4c9; +} +.btn-info.disabled, +.btn-info[disabled], +fieldset[disabled] .btn-info, +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus, +.btn-info.disabled:active, +.btn-info[disabled]:active, +fieldset[disabled] .btn-info:active, +.btn-info.disabled.active, +.btn-info[disabled].active, +fieldset[disabled] .btn-info.active { + background-color: #2aabd2; + background-image: none; +} +.btn-warning { + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); + background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#eb9316)); + background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #e38d13; +} +.btn-warning:hover, +.btn-warning:focus { + background-color: #eb9316; + background-position: 0 -15px; +} +.btn-warning:active, +.btn-warning.active { + background-color: #eb9316; + border-color: #e38d13; +} +.btn-warning.disabled, +.btn-warning[disabled], +fieldset[disabled] .btn-warning, +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus, +.btn-warning.disabled:active, +.btn-warning[disabled]:active, +fieldset[disabled] .btn-warning:active, +.btn-warning.disabled.active, +.btn-warning[disabled].active, +fieldset[disabled] .btn-warning.active { + background-color: #eb9316; + background-image: none; +} +.btn-danger { + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%); + background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c12e2a)); + background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-color: #b92c28; +} +.btn-danger:hover, +.btn-danger:focus { + background-color: #c12e2a; + background-position: 0 -15px; +} +.btn-danger:active, +.btn-danger.active { + background-color: #c12e2a; + border-color: #b92c28; +} +.btn-danger.disabled, +.btn-danger[disabled], +fieldset[disabled] .btn-danger, +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus, +.btn-danger.disabled:active, +.btn-danger[disabled]:active, +fieldset[disabled] .btn-danger:active, +.btn-danger.disabled.active, +.btn-danger[disabled].active, +fieldset[disabled] .btn-danger.active { + background-color: #c12e2a; + background-image: none; +} +.thumbnail, +.img-thumbnail { + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); + box-shadow: 0 1px 2px rgba(0, 0, 0, .075); +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + background-color: #e8e8e8; + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); + background-repeat: repeat-x; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + background-color: #2e6da4; + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-repeat: repeat-x; +} +.navbar-default { + background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%); + background-image: -o-linear-gradient(top, #fff 0%, #f8f8f8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fff), to(#f8f8f8)); + background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075); +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .active > a { + background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); + background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dbdbdb), to(#e2e2e2)); + background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0); + background-repeat: repeat-x; + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075); +} +.navbar-brand, +.navbar-nav > li > a { + text-shadow: 0 1px 0 rgba(255, 255, 255, .25); +} +.navbar-inverse { + background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%); + background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#3c3c3c), to(#222)); + background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0); + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + background-repeat: repeat-x; + border-radius: 4px; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .active > a { + background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%); + background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#080808), to(#0f0f0f)); + background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0); + background-repeat: repeat-x; + -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); + box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25); +} +.navbar-inverse .navbar-brand, +.navbar-inverse .navbar-nav > li > a { + text-shadow: 0 -1px 0 rgba(0, 0, 0, .25); +} +.navbar-static-top, +.navbar-fixed-top, +.navbar-fixed-bottom { + border-radius: 0; +} +@media (max-width: 767px) { + .navbar .navbar-nav .open .dropdown-menu > .active > a, + .navbar .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-repeat: repeat-x; + } +} +.alert { + text-shadow: 0 1px 0 rgba(255, 255, 255, .2); + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05); +} +.alert-success { + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); + background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#c8e5bc)); + background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0); + background-repeat: repeat-x; + border-color: #b2dba1; +} +.alert-info { + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%); + background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#b9def0)); + background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0); + background-repeat: repeat-x; + border-color: #9acfea; +} +.alert-warning { + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); + background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#f8efc0)); + background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0); + background-repeat: repeat-x; + border-color: #f5e79e; +} +.alert-danger { + background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); + background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#e7c3c3)); + background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0); + background-repeat: repeat-x; + border-color: #dca7a7; +} +.progress { + background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); + background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#ebebeb), to(#f5f5f5)); + background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#286090)); + background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-success { + background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%); + background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5cb85c), to(#449d44)); + background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-info { + background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); + background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#5bc0de), to(#31b0d5)); + background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-warning { + background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); + background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f0ad4e), to(#ec971f)); + background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-danger { + background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%); + background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9534f), to(#c9302c)); + background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0); + background-repeat: repeat-x; +} +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.list-group { + border-radius: 4px; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075); + box-shadow: 0 1px 2px rgba(0, 0, 0, .075); +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + text-shadow: 0 -1px 0 #286090; + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2b669a)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0); + background-repeat: repeat-x; + border-color: #2b669a; +} +.list-group-item.active .badge, +.list-group-item.active:hover .badge, +.list-group-item.active:focus .badge { + text-shadow: none; +} +.panel { + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05); + box-shadow: 0 1px 2px rgba(0, 0, 0, .05); +} +.panel-default > .panel-heading { + background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#e8e8e8)); + background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0); + background-repeat: repeat-x; +} +.panel-primary > .panel-heading { + background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#337ab7), to(#2e6da4)); + background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0); + background-repeat: repeat-x; +} +.panel-success > .panel-heading { + background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); + background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#dff0d8), to(#d0e9c6)); + background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0); + background-repeat: repeat-x; +} +.panel-info > .panel-heading { + background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); + background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#d9edf7), to(#c4e3f3)); + background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0); + background-repeat: repeat-x; +} +.panel-warning > .panel-heading { + background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); + background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#fcf8e3), to(#faf2cc)); + background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0); + background-repeat: repeat-x; +} +.panel-danger > .panel-heading { + background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%); + background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#f2dede), to(#ebcccc)); + background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0); + background-repeat: repeat-x; +} +.well { + background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); + background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%); + background-image: -webkit-gradient(linear, left top, left bottom, from(#e8e8e8), to(#f5f5f5)); + background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0); + background-repeat: repeat-x; + border-color: #dcdcdc; + -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1); +} +/*# sourceMappingURL=bootstrap-theme.css.map */ diff --git a/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/css/bootstrap-theme.css.map b/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/css/bootstrap-theme.css.map new file mode 100644 index 0000000..c4cac97 --- /dev/null +++ b/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/css/bootstrap-theme.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["bootstrap-theme.css","less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":"AAAA;;;;GAIG;ACeH;;;;;;EAME,yCAAA;EC2CA,4FAAA;EACQ,oFAAA;CFvDT;ACgBC;;;;;;;;;;;;ECsCA,yDAAA;EACQ,iDAAA;CFxCT;ACMC;;;;;;;;;;;;;;;;;;ECiCA,yBAAA;EACQ,iBAAA;CFnBT;AC/BD;;;;;;EAuBI,kBAAA;CDgBH;ACyBC;;EAEE,uBAAA;CDvBH;AC4BD;EErEI,sEAAA;EACA,iEAAA;EACA,2FAAA;EAAA,oEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;EAuC2C,0BAAA;EAA2B,mBAAA;CDjBvE;ACpBC;;EAEE,0BAAA;EACA,6BAAA;CDsBH;ACnBC;;EAEE,0BAAA;EACA,sBAAA;CDqBH;ACfG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CD6BL;ACbD;EEtEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CD8DD;AC5DC;;EAEE,0BAAA;EACA,6BAAA;CD8DH;AC3DC;;EAEE,0BAAA;EACA,sBAAA;CD6DH;ACvDG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CDqEL;ACpDD;EEvEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CDsGD;ACpGC;;EAEE,0BAAA;EACA,6BAAA;CDsGH;ACnGC;;EAEE,0BAAA;EACA,sBAAA;CDqGH;AC/FG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CD6GL;AC3FD;EExEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CD8ID;AC5IC;;EAEE,0BAAA;EACA,6BAAA;CD8IH;AC3IC;;EAEE,0BAAA;EACA,sBAAA;CD6IH;ACvIG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CDqJL;AClID;EEzEI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CDsLD;ACpLC;;EAEE,0BAAA;EACA,6BAAA;CDsLH;ACnLC;;EAEE,0BAAA;EACA,sBAAA;CDqLH;AC/KG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CD6LL;ACzKD;EE1EI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EAEA,uHAAA;ECnBF,oEAAA;EH4CA,4BAAA;EACA,sBAAA;CD8ND;AC5NC;;EAEE,0BAAA;EACA,6BAAA;CD8NH;AC3NC;;EAEE,0BAAA;EACA,sBAAA;CD6NH;ACvNG;;;;;;;;;;;;;;;;;;EAME,0BAAA;EACA,uBAAA;CDqOL;AC1MD;;EClCE,mDAAA;EACQ,2CAAA;CFgPT;ACrMD;;EE3FI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF0FF,0BAAA;CD2MD;ACzMD;;;EEhGI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EFgGF,0BAAA;CD+MD;ACtMD;EE7GI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;ECnBF,oEAAA;EH+HA,mBAAA;ECjEA,4FAAA;EACQ,oFAAA;CF8QT;ACjND;;EE7GI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;ED2CF,yDAAA;EACQ,iDAAA;CFwRT;AC9MD;;EAEE,+CAAA;CDgND;AC5MD;EEhII,sEAAA;EACA,iEAAA;EACA,2FAAA;EAAA,oEAAA;EACA,4BAAA;EACA,uHAAA;ECnBF,oEAAA;EHkJA,mBAAA;CDkND;ACrND;;EEhII,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;ED2CF,wDAAA;EACQ,gDAAA;CF+ST;AC/ND;;EAYI,0CAAA;CDuNH;AClND;;;EAGE,iBAAA;CDoND;AC/LD;EAfI;;;IAGE,YAAA;IE7JF,yEAAA;IACA,oEAAA;IACA,8FAAA;IAAA,uEAAA;IACA,4BAAA;IACA,uHAAA;GH+WD;CACF;AC3MD;EACE,8CAAA;EC3HA,2FAAA;EACQ,mFAAA;CFyUT;ACnMD;EEtLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CD+MD;AC1MD;EEvLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CDuND;ACjND;EExLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CD+ND;ACxND;EEzLI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EF8KF,sBAAA;CDuOD;ACxND;EEjMI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH4ZH;ACrND;EE3MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHmaH;AC3ND;EE5MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH0aH;ACjOD;EE7MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHibH;ACvOD;EE9MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHwbH;AC7OD;EE/MI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH+bH;AChPD;EElLI,8MAAA;EACA,yMAAA;EACA,sMAAA;CHqaH;AC5OD;EACE,mBAAA;EC9KA,mDAAA;EACQ,2CAAA;CF6ZT;AC7OD;;;EAGE,8BAAA;EEnOE,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EFiOF,sBAAA;CDmPD;ACxPD;;;EAQI,kBAAA;CDqPH;AC3OD;ECnME,kDAAA;EACQ,0CAAA;CFibT;ACrOD;EE5PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHoeH;AC3OD;EE7PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CH2eH;ACjPD;EE9PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHkfH;ACvPD;EE/PI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHyfH;AC7PD;EEhQI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHggBH;ACnQD;EEjQI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;CHugBH;ACnQD;EExQI,yEAAA;EACA,oEAAA;EACA,8FAAA;EAAA,uEAAA;EACA,4BAAA;EACA,uHAAA;EFsQF,sBAAA;EC3NA,0FAAA;EACQ,kFAAA;CFqeT","file":"bootstrap-theme.css","sourcesContent":["/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.btn-default:active,\n.btn-primary:active,\n.btn-success:active,\n.btn-info:active,\n.btn-warning:active,\n.btn-danger:active,\n.btn-default.active,\n.btn-primary.active,\n.btn-success.active,\n.btn-info.active,\n.btn-warning.active,\n.btn-danger.active {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-default.disabled,\n.btn-primary.disabled,\n.btn-success.disabled,\n.btn-info.disabled,\n.btn-warning.disabled,\n.btn-danger.disabled,\n.btn-default[disabled],\n.btn-primary[disabled],\n.btn-success[disabled],\n.btn-info[disabled],\n.btn-warning[disabled],\n.btn-danger[disabled],\nfieldset[disabled] .btn-default,\nfieldset[disabled] .btn-primary,\nfieldset[disabled] .btn-success,\nfieldset[disabled] .btn-info,\nfieldset[disabled] .btn-warning,\nfieldset[disabled] .btn-danger {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-default .badge,\n.btn-primary .badge,\n.btn-success .badge,\n.btn-info .badge,\n.btn-warning .badge,\n.btn-danger .badge {\n text-shadow: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n}\n.btn-default {\n background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);\n background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #dbdbdb;\n text-shadow: 0 1px 0 #fff;\n border-color: #ccc;\n}\n.btn-default:hover,\n.btn-default:focus {\n background-color: #e0e0e0;\n background-position: 0 -15px;\n}\n.btn-default:active,\n.btn-default.active {\n background-color: #e0e0e0;\n border-color: #dbdbdb;\n}\n.btn-default.disabled,\n.btn-default[disabled],\nfieldset[disabled] .btn-default,\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus,\n.btn-default.disabled:active,\n.btn-default[disabled]:active,\nfieldset[disabled] .btn-default:active,\n.btn-default.disabled.active,\n.btn-default[disabled].active,\nfieldset[disabled] .btn-default.active {\n background-color: #e0e0e0;\n background-image: none;\n}\n.btn-primary {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #265a88 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #265a88 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #245580;\n}\n.btn-primary:hover,\n.btn-primary:focus {\n background-color: #265a88;\n background-position: 0 -15px;\n}\n.btn-primary:active,\n.btn-primary.active {\n background-color: #265a88;\n border-color: #245580;\n}\n.btn-primary.disabled,\n.btn-primary[disabled],\nfieldset[disabled] .btn-primary,\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus,\n.btn-primary.disabled:active,\n.btn-primary[disabled]:active,\nfieldset[disabled] .btn-primary:active,\n.btn-primary.disabled.active,\n.btn-primary[disabled].active,\nfieldset[disabled] .btn-primary.active {\n background-color: #265a88;\n background-image: none;\n}\n.btn-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #3e8f3e;\n}\n.btn-success:hover,\n.btn-success:focus {\n background-color: #419641;\n background-position: 0 -15px;\n}\n.btn-success:active,\n.btn-success.active {\n background-color: #419641;\n border-color: #3e8f3e;\n}\n.btn-success.disabled,\n.btn-success[disabled],\nfieldset[disabled] .btn-success,\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus,\n.btn-success.disabled:active,\n.btn-success[disabled]:active,\nfieldset[disabled] .btn-success:active,\n.btn-success.disabled.active,\n.btn-success[disabled].active,\nfieldset[disabled] .btn-success.active {\n background-color: #419641;\n background-image: none;\n}\n.btn-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #28a4c9;\n}\n.btn-info:hover,\n.btn-info:focus {\n background-color: #2aabd2;\n background-position: 0 -15px;\n}\n.btn-info:active,\n.btn-info.active {\n background-color: #2aabd2;\n border-color: #28a4c9;\n}\n.btn-info.disabled,\n.btn-info[disabled],\nfieldset[disabled] .btn-info,\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus,\n.btn-info.disabled:active,\n.btn-info[disabled]:active,\nfieldset[disabled] .btn-info:active,\n.btn-info.disabled.active,\n.btn-info[disabled].active,\nfieldset[disabled] .btn-info.active {\n background-color: #2aabd2;\n background-image: none;\n}\n.btn-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #e38d13;\n}\n.btn-warning:hover,\n.btn-warning:focus {\n background-color: #eb9316;\n background-position: 0 -15px;\n}\n.btn-warning:active,\n.btn-warning.active {\n background-color: #eb9316;\n border-color: #e38d13;\n}\n.btn-warning.disabled,\n.btn-warning[disabled],\nfieldset[disabled] .btn-warning,\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus,\n.btn-warning.disabled:active,\n.btn-warning[disabled]:active,\nfieldset[disabled] .btn-warning:active,\n.btn-warning.disabled.active,\n.btn-warning[disabled].active,\nfieldset[disabled] .btn-warning.active {\n background-color: #eb9316;\n background-image: none;\n}\n.btn-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n background-repeat: repeat-x;\n border-color: #b92c28;\n}\n.btn-danger:hover,\n.btn-danger:focus {\n background-color: #c12e2a;\n background-position: 0 -15px;\n}\n.btn-danger:active,\n.btn-danger.active {\n background-color: #c12e2a;\n border-color: #b92c28;\n}\n.btn-danger.disabled,\n.btn-danger[disabled],\nfieldset[disabled] .btn-danger,\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus,\n.btn-danger.disabled:active,\n.btn-danger[disabled]:active,\nfieldset[disabled] .btn-danger:active,\n.btn-danger.disabled.active,\n.btn-danger[disabled].active,\nfieldset[disabled] .btn-danger.active {\n background-color: #c12e2a;\n background-image: none;\n}\n.thumbnail,\n.img-thumbnail {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n background-color: #e8e8e8;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n background-color: #2e6da4;\n}\n.navbar-default {\n background-image: -webkit-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: -o-linear-gradient(top, #ffffff 0%, #f8f8f8 100%);\n background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: -o-linear-gradient(top, #dbdbdb 0%, #e2e2e2 100%);\n background-image: linear-gradient(to bottom, #dbdbdb 0%, #e2e2e2 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);\n}\n.navbar-inverse {\n background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);\n background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n border-radius: 4px;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .active > a {\n background-image: -webkit-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: -o-linear-gradient(top, #080808 0%, #0f0f0f 100%);\n background-image: linear-gradient(to bottom, #080808 0%, #0f0f0f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);\n -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);\n}\n.navbar-inverse .navbar-brand,\n.navbar-inverse .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n@media (max-width: 767px) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n }\n}\n.alert {\n text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.alert-success {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);\n border-color: #b2dba1;\n}\n.alert-info {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);\n border-color: #9acfea;\n}\n.alert-warning {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);\n border-color: #f5e79e;\n}\n.alert-danger {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);\n border-color: #dca7a7;\n}\n.progress {\n background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);\n}\n.progress-bar {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #286090 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #286090 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);\n}\n.progress-bar-success {\n background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);\n background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);\n}\n.progress-bar-info {\n background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);\n background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);\n}\n.progress-bar-warning {\n background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);\n background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);\n}\n.progress-bar-danger {\n background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);\n background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);\n}\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.list-group {\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 #286090;\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2b669a 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2b669a 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);\n border-color: #2b669a;\n}\n.list-group-item.active .badge,\n.list-group-item.active:hover .badge,\n.list-group-item.active:focus .badge {\n text-shadow: none;\n}\n.panel {\n -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);\n}\n.panel-default > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);\n background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);\n}\n.panel-primary > .panel-heading {\n background-image: -webkit-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: -o-linear-gradient(top, #337ab7 0%, #2e6da4 100%);\n background-image: linear-gradient(to bottom, #337ab7 0%, #2e6da4 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);\n}\n.panel-success > .panel-heading {\n background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);\n background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);\n}\n.panel-info > .panel-heading {\n background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);\n background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);\n}\n.panel-warning > .panel-heading {\n background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);\n background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);\n}\n.panel-danger > .panel-heading {\n background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);\n background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);\n}\n.well {\n background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);\n background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);\n border-color: #dcdcdc;\n -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);\n}\n/*# sourceMappingURL=bootstrap-theme.css.map */","/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n .box-shadow(none);\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n border-radius: @navbar-border-radius;\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} diff --git a/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/css/bootstrap-theme.min.css b/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/css/bootstrap-theme.min.css new file mode 100644 index 0000000..7c1405d --- /dev/null +++ b/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/css/bootstrap-theme.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */.btn-danger,.btn-default,.btn-info,.btn-primary,.btn-success,.btn-warning{text-shadow:0 -1px 0 rgba(0,0,0,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 1px rgba(0,0,0,.075)}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-danger.disabled,.btn-danger[disabled],.btn-default.disabled,.btn-default[disabled],.btn-info.disabled,.btn-info[disabled],.btn-primary.disabled,.btn-primary[disabled],.btn-success.disabled,.btn-success[disabled],.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-danger,fieldset[disabled] .btn-default,fieldset[disabled] .btn-info,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-success,fieldset[disabled] .btn-warning{-webkit-box-shadow:none;box-shadow:none}.btn-danger .badge,.btn-default .badge,.btn-info .badge,.btn-primary .badge,.btn-success .badge,.btn-warning .badge{text-shadow:none}.btn.active,.btn:active{background-image:none}.btn-default{text-shadow:0 1px 0 #fff;background-image:-webkit-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-o-linear-gradient(top,#fff 0,#e0e0e0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#e0e0e0));background-image:linear-gradient(to bottom,#fff 0,#e0e0e0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#dbdbdb;border-color:#ccc}.btn-default:focus,.btn-default:hover{background-color:#e0e0e0;background-position:0 -15px}.btn-default.active,.btn-default:active{background-color:#e0e0e0;border-color:#dbdbdb}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled.focus,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled].focus,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default.focus,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#e0e0e0;background-image:none}.btn-primary{background-image:-webkit-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-o-linear-gradient(top,#337ab7 0,#265a88 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#265a88));background-image:linear-gradient(to bottom,#337ab7 0,#265a88 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff265a88', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#245580}.btn-primary:focus,.btn-primary:hover{background-color:#265a88;background-position:0 -15px}.btn-primary.active,.btn-primary:active{background-color:#265a88;border-color:#245580}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled.focus,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled].focus,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary.focus,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#265a88;background-image:none}.btn-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#419641 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#419641));background-image:linear-gradient(to bottom,#5cb85c 0,#419641 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#3e8f3e}.btn-success:focus,.btn-success:hover{background-color:#419641;background-position:0 -15px}.btn-success.active,.btn-success:active{background-color:#419641;border-color:#3e8f3e}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled.focus,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled].focus,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success.focus,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#419641;background-image:none}.btn-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#2aabd2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#2aabd2));background-image:linear-gradient(to bottom,#5bc0de 0,#2aabd2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#28a4c9}.btn-info:focus,.btn-info:hover{background-color:#2aabd2;background-position:0 -15px}.btn-info.active,.btn-info:active{background-color:#2aabd2;border-color:#28a4c9}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled.focus,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled].focus,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info.focus,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#2aabd2;background-image:none}.btn-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#eb9316 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#eb9316));background-image:linear-gradient(to bottom,#f0ad4e 0,#eb9316 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#e38d13}.btn-warning:focus,.btn-warning:hover{background-color:#eb9316;background-position:0 -15px}.btn-warning.active,.btn-warning:active{background-color:#eb9316;border-color:#e38d13}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled.focus,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled].focus,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning.focus,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#eb9316;background-image:none}.btn-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c12e2a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c12e2a));background-image:linear-gradient(to bottom,#d9534f 0,#c12e2a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-color:#b92c28}.btn-danger:focus,.btn-danger:hover{background-color:#c12e2a;background-position:0 -15px}.btn-danger.active,.btn-danger:active{background-color:#c12e2a;border-color:#b92c28}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled.focus,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled].focus,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger.focus,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#c12e2a;background-image:none}.img-thumbnail,.thumbnail{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{background-color:#e8e8e8;background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{background-color:#2e6da4;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.navbar-default{background-image:-webkit-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-o-linear-gradient(top,#fff 0,#f8f8f8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fff),to(#f8f8f8));background-image:linear-gradient(to bottom,#fff 0,#f8f8f8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.15),0 1px 5px rgba(0,0,0,.075)}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-o-linear-gradient(top,#dbdbdb 0,#e2e2e2 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dbdbdb),to(#e2e2e2));background-image:linear-gradient(to bottom,#dbdbdb 0,#e2e2e2 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdbdbdb', endColorstr='#ffe2e2e2', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.075);box-shadow:inset 0 3px 9px rgba(0,0,0,.075)}.navbar-brand,.navbar-nav>li>a{text-shadow:0 1px 0 rgba(255,255,255,.25)}.navbar-inverse{background-image:-webkit-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-o-linear-gradient(top,#3c3c3c 0,#222 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#3c3c3c),to(#222));background-image:linear-gradient(to bottom,#3c3c3c 0,#222 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);background-repeat:repeat-x;border-radius:4px}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.open>a{background-image:-webkit-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-o-linear-gradient(top,#080808 0,#0f0f0f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#080808),to(#0f0f0f));background-image:linear-gradient(to bottom,#080808 0,#0f0f0f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff080808', endColorstr='#ff0f0f0f', GradientType=0);background-repeat:repeat-x;-webkit-box-shadow:inset 0 3px 9px rgba(0,0,0,.25);box-shadow:inset 0 3px 9px rgba(0,0,0,.25)}.navbar-inverse .navbar-brand,.navbar-inverse .navbar-nav>li>a{text-shadow:0 -1px 0 rgba(0,0,0,.25)}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}@media (max-width:767px){.navbar .navbar-nav .open .dropdown-menu>.active>a,.navbar .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}}.alert{text-shadow:0 1px 0 rgba(255,255,255,.2);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.25),0 1px 2px rgba(0,0,0,.05)}.alert-success{background-image:-webkit-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#c8e5bc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#c8e5bc));background-image:linear-gradient(to bottom,#dff0d8 0,#c8e5bc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);background-repeat:repeat-x;border-color:#b2dba1}.alert-info{background-image:-webkit-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#b9def0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#b9def0));background-image:linear-gradient(to bottom,#d9edf7 0,#b9def0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);background-repeat:repeat-x;border-color:#9acfea}.alert-warning{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#f8efc0 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#f8efc0));background-image:linear-gradient(to bottom,#fcf8e3 0,#f8efc0 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);background-repeat:repeat-x;border-color:#f5e79e}.alert-danger{background-image:-webkit-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-o-linear-gradient(top,#f2dede 0,#e7c3c3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#e7c3c3));background-image:linear-gradient(to bottom,#f2dede 0,#e7c3c3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);background-repeat:repeat-x;border-color:#dca7a7}.progress{background-image:-webkit-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#ebebeb 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#ebebeb),to(#f5f5f5));background-image:linear-gradient(to bottom,#ebebeb 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x}.progress-bar{background-image:-webkit-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-o-linear-gradient(top,#337ab7 0,#286090 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#286090));background-image:linear-gradient(to bottom,#337ab7 0,#286090 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff286090', GradientType=0);background-repeat:repeat-x}.progress-bar-success{background-image:-webkit-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-o-linear-gradient(top,#5cb85c 0,#449d44 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5cb85c),to(#449d44));background-image:linear-gradient(to bottom,#5cb85c 0,#449d44 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);background-repeat:repeat-x}.progress-bar-info{background-image:-webkit-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-o-linear-gradient(top,#5bc0de 0,#31b0d5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#5bc0de),to(#31b0d5));background-image:linear-gradient(to bottom,#5bc0de 0,#31b0d5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);background-repeat:repeat-x}.progress-bar-warning{background-image:-webkit-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-o-linear-gradient(top,#f0ad4e 0,#ec971f 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f0ad4e),to(#ec971f));background-image:linear-gradient(to bottom,#f0ad4e 0,#ec971f 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);background-repeat:repeat-x}.progress-bar-danger{background-image:-webkit-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-o-linear-gradient(top,#d9534f 0,#c9302c 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9534f),to(#c9302c));background-image:linear-gradient(to bottom,#d9534f 0,#c9302c 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);background-repeat:repeat-x}.progress-bar-striped{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.list-group{border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0,0,0,.075);box-shadow:0 1px 2px rgba(0,0,0,.075)}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{text-shadow:0 -1px 0 #286090;background-image:-webkit-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2b669a 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2b669a));background-image:linear-gradient(to bottom,#337ab7 0,#2b669a 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2b669a', GradientType=0);background-repeat:repeat-x;border-color:#2b669a}.list-group-item.active .badge,.list-group-item.active:focus .badge,.list-group-item.active:hover .badge{text-shadow:none}.panel{-webkit-box-shadow:0 1px 2px rgba(0,0,0,.05);box-shadow:0 1px 2px rgba(0,0,0,.05)}.panel-default>.panel-heading{background-image:-webkit-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-o-linear-gradient(top,#f5f5f5 0,#e8e8e8 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f5f5f5),to(#e8e8e8));background-image:linear-gradient(to bottom,#f5f5f5 0,#e8e8e8 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);background-repeat:repeat-x}.panel-primary>.panel-heading{background-image:-webkit-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-o-linear-gradient(top,#337ab7 0,#2e6da4 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#337ab7),to(#2e6da4));background-image:linear-gradient(to bottom,#337ab7 0,#2e6da4 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff337ab7', endColorstr='#ff2e6da4', GradientType=0);background-repeat:repeat-x}.panel-success>.panel-heading{background-image:-webkit-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-o-linear-gradient(top,#dff0d8 0,#d0e9c6 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#dff0d8),to(#d0e9c6));background-image:linear-gradient(to bottom,#dff0d8 0,#d0e9c6 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);background-repeat:repeat-x}.panel-info>.panel-heading{background-image:-webkit-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-o-linear-gradient(top,#d9edf7 0,#c4e3f3 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#d9edf7),to(#c4e3f3));background-image:linear-gradient(to bottom,#d9edf7 0,#c4e3f3 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);background-repeat:repeat-x}.panel-warning>.panel-heading{background-image:-webkit-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-o-linear-gradient(top,#fcf8e3 0,#faf2cc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#fcf8e3),to(#faf2cc));background-image:linear-gradient(to bottom,#fcf8e3 0,#faf2cc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);background-repeat:repeat-x}.panel-danger>.panel-heading{background-image:-webkit-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-o-linear-gradient(top,#f2dede 0,#ebcccc 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#f2dede),to(#ebcccc));background-image:linear-gradient(to bottom,#f2dede 0,#ebcccc 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);background-repeat:repeat-x}.well{background-image:-webkit-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-o-linear-gradient(top,#e8e8e8 0,#f5f5f5 100%);background-image:-webkit-gradient(linear,left top,left bottom,from(#e8e8e8),to(#f5f5f5));background-image:linear-gradient(to bottom,#e8e8e8 0,#f5f5f5 100%);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);background-repeat:repeat-x;border-color:#dcdcdc;-webkit-box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 3px rgba(0,0,0,.05),0 1px 0 rgba(255,255,255,.1)} +/*# sourceMappingURL=bootstrap-theme.min.css.map */ diff --git a/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/css/bootstrap-theme.min.css.map b/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/css/bootstrap-theme.min.css.map new file mode 100644 index 0000000..619b322 --- /dev/null +++ b/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/css/bootstrap-theme.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["less/theme.less","less/mixins/vendor-prefixes.less","less/mixins/gradients.less","less/mixins/reset-filter.less"],"names":[],"mappings":";;;;AAmBA,YAAA,aAAA,UAAA,aAAA,aAAA,aAME,YAAA,EAAA,KAAA,EAAA,eC2CA,mBAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,iBDvCR,mBAAA,mBAAA,oBAAA,oBAAA,iBAAA,iBAAA,oBAAA,oBAAA,oBAAA,oBAAA,oBAAA,oBCsCA,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBDlCR,qBAAA,sBAAA,sBAAA,uBAAA,mBAAA,oBAAA,sBAAA,uBAAA,sBAAA,uBAAA,sBAAA,uBAAA,+BAAA,gCAAA,6BAAA,gCAAA,gCAAA,gCCiCA,mBAAA,KACQ,WAAA,KDlDV,mBAAA,oBAAA,iBAAA,oBAAA,oBAAA,oBAuBI,YAAA,KAyCF,YAAA,YAEE,iBAAA,KAKJ,aErEI,YAAA,EAAA,IAAA,EAAA,KACA,iBAAA,iDACA,iBAAA,4CAAA,iBAAA,qEAEA,iBAAA,+CCnBF,OAAA,+GH4CA,OAAA,0DACA,kBAAA,SAuC2C,aAAA,QAA2B,aAAA,KArCtE,mBAAA,mBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,oBAAA,oBAEE,iBAAA,QACA,aAAA,QAMA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,uBAAA,8BAAA,6BAAA,8BAAA,6BAAA,6BAAA,gCAAA,uCAAA,sCAAA,uCAAA,sCAAA,sCAME,iBAAA,QACA,iBAAA,KAgBN,aEtEI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,mBAAA,mBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,oBAAA,oBAEE,iBAAA,QACA,aAAA,QAMA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,uBAAA,8BAAA,6BAAA,8BAAA,6BAAA,6BAAA,gCAAA,uCAAA,sCAAA,uCAAA,sCAAA,sCAME,iBAAA,QACA,iBAAA,KAiBN,aEvEI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,mBAAA,mBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,oBAAA,oBAEE,iBAAA,QACA,aAAA,QAMA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,uBAAA,8BAAA,6BAAA,8BAAA,6BAAA,6BAAA,gCAAA,uCAAA,sCAAA,uCAAA,sCAAA,sCAME,iBAAA,QACA,iBAAA,KAkBN,UExEI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,gBAAA,gBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,iBAAA,iBAEE,iBAAA,QACA,aAAA,QAMA,mBAAA,0BAAA,yBAAA,0BAAA,yBAAA,yBAAA,oBAAA,2BAAA,0BAAA,2BAAA,0BAAA,0BAAA,6BAAA,oCAAA,mCAAA,oCAAA,mCAAA,mCAME,iBAAA,QACA,iBAAA,KAmBN,aEzEI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,mBAAA,mBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,oBAAA,oBAEE,iBAAA,QACA,aAAA,QAMA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,uBAAA,8BAAA,6BAAA,8BAAA,6BAAA,6BAAA,gCAAA,uCAAA,sCAAA,uCAAA,sCAAA,sCAME,iBAAA,QACA,iBAAA,KAoBN,YE1EI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDAEA,OAAA,+GCnBF,OAAA,0DH4CA,kBAAA,SACA,aAAA,QAEA,kBAAA,kBAEE,iBAAA,QACA,oBAAA,EAAA,MAGF,mBAAA,mBAEE,iBAAA,QACA,aAAA,QAMA,qBAAA,4BAAA,2BAAA,4BAAA,2BAAA,2BAAA,sBAAA,6BAAA,4BAAA,6BAAA,4BAAA,4BAAA,+BAAA,sCAAA,qCAAA,sCAAA,qCAAA,qCAME,iBAAA,QACA,iBAAA,KA2BN,eAAA,WClCE,mBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,EAAA,IAAA,IAAA,iBD2CV,0BAAA,0BE3FI,iBAAA,QACA,iBAAA,oDACA,iBAAA,+CAAA,iBAAA,wEACA,iBAAA,kDACA,OAAA,+GF0FF,kBAAA,SAEF,yBAAA,+BAAA,+BEhGI,iBAAA,QACA,iBAAA,oDACA,iBAAA,+CAAA,iBAAA,wEACA,iBAAA,kDACA,OAAA,+GFgGF,kBAAA,SASF,gBE7GI,iBAAA,iDACA,iBAAA,4CACA,iBAAA,qEAAA,iBAAA,+CACA,OAAA,+GACA,OAAA,0DCnBF,kBAAA,SH+HA,cAAA,ICjEA,mBAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,iBD6DV,sCAAA,oCE7GI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SD2CF,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBD0EV,cAAA,iBAEE,YAAA,EAAA,IAAA,EAAA,sBAIF,gBEhII,iBAAA,iDACA,iBAAA,4CACA,iBAAA,qEAAA,iBAAA,+CACA,OAAA,+GACA,OAAA,0DCnBF,kBAAA,SHkJA,cAAA,IAHF,sCAAA,oCEhII,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SD2CF,mBAAA,MAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,gBDgFV,8BAAA,iCAYI,YAAA,EAAA,KAAA,EAAA,gBAKJ,qBAAA,kBAAA,mBAGE,cAAA,EAqBF,yBAfI,mDAAA,yDAAA,yDAGE,MAAA,KE7JF,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,UFqKJ,OACE,YAAA,EAAA,IAAA,EAAA,qBC3HA,mBAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,MAAA,EAAA,IAAA,EAAA,sBAAA,EAAA,IAAA,IAAA,gBDsIV,eEtLI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8KF,aAAA,QAKF,YEvLI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8KF,aAAA,QAMF,eExLI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8KF,aAAA,QAOF,cEzLI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF8KF,aAAA,QAeF,UEjMI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFuMJ,cE3MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFwMJ,sBE5MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFyMJ,mBE7MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF0MJ,sBE9MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF2MJ,qBE/MI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF+MJ,sBElLI,iBAAA,yKACA,iBAAA,oKACA,iBAAA,iKFyLJ,YACE,cAAA,IC9KA,mBAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,EAAA,IAAA,IAAA,iBDgLV,wBAAA,8BAAA,8BAGE,YAAA,EAAA,KAAA,EAAA,QEnOE,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFiOF,aAAA,QALF,+BAAA,qCAAA,qCAQI,YAAA,KAUJ,OCnME,mBAAA,EAAA,IAAA,IAAA,gBACQ,WAAA,EAAA,IAAA,IAAA,gBD4MV,8BE5PI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFyPJ,8BE7PI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF0PJ,8BE9PI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF2PJ,2BE/PI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF4PJ,8BEhQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SF6PJ,6BEjQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFoQJ,MExQI,iBAAA,oDACA,iBAAA,+CACA,iBAAA,wEAAA,iBAAA,kDACA,OAAA,+GACA,kBAAA,SFsQF,aAAA,QC3NA,mBAAA,MAAA,EAAA,IAAA,IAAA,gBAAA,EAAA,IAAA,EAAA,qBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,gBAAA,EAAA,IAAA,EAAA","sourcesContent":["/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n\n//\n// Load core variables and mixins\n// --------------------------------------------------\n\n@import \"variables.less\";\n@import \"mixins.less\";\n\n\n//\n// Buttons\n// --------------------------------------------------\n\n// Common styles\n.btn-default,\n.btn-primary,\n.btn-success,\n.btn-info,\n.btn-warning,\n.btn-danger {\n text-shadow: 0 -1px 0 rgba(0,0,0,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 1px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n // Reset the shadow\n &:active,\n &.active {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n .box-shadow(none);\n }\n\n .badge {\n text-shadow: none;\n }\n}\n\n// Mixin for generating new styles\n.btn-styles(@btn-color: #555) {\n #gradient > .vertical(@start-color: @btn-color; @end-color: darken(@btn-color, 12%));\n .reset-filter(); // Disable gradients for IE9 because filter bleeds through rounded corners; see https://github.com/twbs/bootstrap/issues/10620\n background-repeat: repeat-x;\n border-color: darken(@btn-color, 14%);\n\n &:hover,\n &:focus {\n background-color: darken(@btn-color, 12%);\n background-position: 0 -15px;\n }\n\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n border-color: darken(@btn-color, 14%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &,\n &:hover,\n &:focus,\n &.focus,\n &:active,\n &.active {\n background-color: darken(@btn-color, 12%);\n background-image: none;\n }\n }\n}\n\n// Common styles\n.btn {\n // Remove the gradient for the pressed/active state\n &:active,\n &.active {\n background-image: none;\n }\n}\n\n// Apply the mixin to the buttons\n.btn-default { .btn-styles(@btn-default-bg); text-shadow: 0 1px 0 #fff; border-color: #ccc; }\n.btn-primary { .btn-styles(@btn-primary-bg); }\n.btn-success { .btn-styles(@btn-success-bg); }\n.btn-info { .btn-styles(@btn-info-bg); }\n.btn-warning { .btn-styles(@btn-warning-bg); }\n.btn-danger { .btn-styles(@btn-danger-bg); }\n\n\n//\n// Images\n// --------------------------------------------------\n\n.thumbnail,\n.img-thumbnail {\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n\n\n//\n// Dropdowns\n// --------------------------------------------------\n\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-hover-bg; @end-color: darken(@dropdown-link-hover-bg, 5%));\n background-color: darken(@dropdown-link-hover-bg, 5%);\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n background-color: darken(@dropdown-link-active-bg, 5%);\n}\n\n\n//\n// Navbar\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n #gradient > .vertical(@start-color: lighten(@navbar-default-bg, 10%); @end-color: @navbar-default-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered\n border-radius: @navbar-border-radius;\n @shadow: inset 0 1px 0 rgba(255,255,255,.15), 0 1px 5px rgba(0,0,0,.075);\n .box-shadow(@shadow);\n\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: darken(@navbar-default-link-active-bg, 5%); @end-color: darken(@navbar-default-link-active-bg, 2%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.075));\n }\n}\n.navbar-brand,\n.navbar-nav > li > a {\n text-shadow: 0 1px 0 rgba(255,255,255,.25);\n}\n\n// Inverted navbar\n.navbar-inverse {\n #gradient > .vertical(@start-color: lighten(@navbar-inverse-bg, 10%); @end-color: @navbar-inverse-bg);\n .reset-filter(); // Remove gradient in IE<10 to fix bug where dropdowns don't get triggered; see https://github.com/twbs/bootstrap/issues/10257\n border-radius: @navbar-border-radius;\n .navbar-nav > .open > a,\n .navbar-nav > .active > a {\n #gradient > .vertical(@start-color: @navbar-inverse-link-active-bg; @end-color: lighten(@navbar-inverse-link-active-bg, 2.5%));\n .box-shadow(inset 0 3px 9px rgba(0,0,0,.25));\n }\n\n .navbar-brand,\n .navbar-nav > li > a {\n text-shadow: 0 -1px 0 rgba(0,0,0,.25);\n }\n}\n\n// Undo rounded corners in static and fixed navbars\n.navbar-static-top,\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n border-radius: 0;\n}\n\n// Fix active state of dropdown items in collapsed mode\n@media (max-width: @grid-float-breakpoint-max) {\n .navbar .navbar-nav .open .dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: #fff;\n #gradient > .vertical(@start-color: @dropdown-link-active-bg; @end-color: darken(@dropdown-link-active-bg, 5%));\n }\n }\n}\n\n\n//\n// Alerts\n// --------------------------------------------------\n\n// Common styles\n.alert {\n text-shadow: 0 1px 0 rgba(255,255,255,.2);\n @shadow: inset 0 1px 0 rgba(255,255,255,.25), 0 1px 2px rgba(0,0,0,.05);\n .box-shadow(@shadow);\n}\n\n// Mixin for generating new styles\n.alert-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 7.5%));\n border-color: darken(@color, 15%);\n}\n\n// Apply the mixin to the alerts\n.alert-success { .alert-styles(@alert-success-bg); }\n.alert-info { .alert-styles(@alert-info-bg); }\n.alert-warning { .alert-styles(@alert-warning-bg); }\n.alert-danger { .alert-styles(@alert-danger-bg); }\n\n\n//\n// Progress bars\n// --------------------------------------------------\n\n// Give the progress background some depth\n.progress {\n #gradient > .vertical(@start-color: darken(@progress-bg, 4%); @end-color: @progress-bg)\n}\n\n// Mixin for generating new styles\n.progress-bar-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 10%));\n}\n\n// Apply the mixin to the progress bars\n.progress-bar { .progress-bar-styles(@progress-bar-bg); }\n.progress-bar-success { .progress-bar-styles(@progress-bar-success-bg); }\n.progress-bar-info { .progress-bar-styles(@progress-bar-info-bg); }\n.progress-bar-warning { .progress-bar-styles(@progress-bar-warning-bg); }\n.progress-bar-danger { .progress-bar-styles(@progress-bar-danger-bg); }\n\n// Reset the striped class because our mixins don't do multiple gradients and\n// the above custom styles override the new `.progress-bar-striped` in v3.2.0.\n.progress-bar-striped {\n #gradient > .striped();\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n.list-group {\n border-radius: @border-radius-base;\n .box-shadow(0 1px 2px rgba(0,0,0,.075));\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n text-shadow: 0 -1px 0 darken(@list-group-active-bg, 10%);\n #gradient > .vertical(@start-color: @list-group-active-bg; @end-color: darken(@list-group-active-bg, 7.5%));\n border-color: darken(@list-group-active-border, 7.5%);\n\n .badge {\n text-shadow: none;\n }\n}\n\n\n//\n// Panels\n// --------------------------------------------------\n\n// Common styles\n.panel {\n .box-shadow(0 1px 2px rgba(0,0,0,.05));\n}\n\n// Mixin for generating new styles\n.panel-heading-styles(@color) {\n #gradient > .vertical(@start-color: @color; @end-color: darken(@color, 5%));\n}\n\n// Apply the mixin to the panel headings only\n.panel-default > .panel-heading { .panel-heading-styles(@panel-default-heading-bg); }\n.panel-primary > .panel-heading { .panel-heading-styles(@panel-primary-heading-bg); }\n.panel-success > .panel-heading { .panel-heading-styles(@panel-success-heading-bg); }\n.panel-info > .panel-heading { .panel-heading-styles(@panel-info-heading-bg); }\n.panel-warning > .panel-heading { .panel-heading-styles(@panel-warning-heading-bg); }\n.panel-danger > .panel-heading { .panel-heading-styles(@panel-danger-heading-bg); }\n\n\n//\n// Wells\n// --------------------------------------------------\n\n.well {\n #gradient > .vertical(@start-color: darken(@well-bg, 5%); @end-color: @well-bg);\n border-color: darken(@well-bg, 10%);\n @shadow: inset 0 1px 3px rgba(0,0,0,.05), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n"]} diff --git a/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/css/bootstrap.css b/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/css/bootstrap.css new file mode 100644 index 0000000..6167622 --- /dev/null +++ b/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/css/bootstrap.css @@ -0,0 +1,6757 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +body { + margin: 0; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +main, +menu, +nav, +section, +summary { + display: block; +} +audio, +canvas, +progress, +video { + display: inline-block; + vertical-align: baseline; +} +audio:not([controls]) { + display: none; + height: 0; +} +[hidden], +template { + display: none; +} +a { + background-color: transparent; +} +a:active, +a:hover { + outline: 0; +} +abbr[title] { + border-bottom: 1px dotted; +} +b, +strong { + font-weight: bold; +} +dfn { + font-style: italic; +} +h1 { + margin: .67em 0; + font-size: 2em; +} +mark { + color: #000; + background: #ff0; +} +small { + font-size: 80%; +} +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sup { + top: -.5em; +} +sub { + bottom: -.25em; +} +img { + border: 0; +} +svg:not(:root) { + overflow: hidden; +} +figure { + margin: 1em 40px; +} +hr { + height: 0; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; +} +pre { + overflow: auto; +} +code, +kbd, +pre, +samp { + font-family: monospace, monospace; + font-size: 1em; +} +button, +input, +optgroup, +select, +textarea { + margin: 0; + font: inherit; + color: inherit; +} +button { + overflow: visible; +} +button, +select { + text-transform: none; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +button[disabled], +html input[disabled] { + cursor: default; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} +input { + line-height: normal; +} +input[type="checkbox"], +input[type="radio"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0; +} +input[type="number"]::-webkit-inner-spin-button, +input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} +input[type="search"]::-webkit-search-cancel-button, +input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +fieldset { + padding: .35em .625em .75em; + margin: 0 2px; + border: 1px solid #c0c0c0; +} +legend { + padding: 0; + border: 0; +} +textarea { + overflow: auto; +} +optgroup { + font-weight: bold; +} +table { + border-spacing: 0; + border-collapse: collapse; +} +td, +th { + padding: 0; +} +/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, + *:before, + *:after { + color: #000 !important; + text-shadow: none !important; + background: transparent !important; + -webkit-box-shadow: none !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + a[href^="#"]:after, + a[href^="javascript:"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } + .navbar { + display: none; + } + .btn > .caret, + .dropup > .btn > .caret { + border-top-color: #000 !important; + } + .label { + border: 1px solid #000; + } + .table { + border-collapse: collapse !important; + } + .table td, + .table th { + background-color: #fff !important; + } + .table-bordered th, + .table-bordered td { + border: 1px solid #ddd !important; + } +} +@font-face { + font-family: 'Glyphicons Halflings'; + + src: url('../fonts/glyphicons-halflings-regular.eot'); + src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg'); +} +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: normal; + line-height: 1; + + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.glyphicon-asterisk:before { + content: "\002a"; +} +.glyphicon-plus:before { + content: "\002b"; +} +.glyphicon-euro:before, +.glyphicon-eur:before { + content: "\20ac"; +} +.glyphicon-minus:before { + content: "\2212"; +} +.glyphicon-cloud:before { + content: "\2601"; +} +.glyphicon-envelope:before { + content: "\2709"; +} +.glyphicon-pencil:before { + content: "\270f"; +} +.glyphicon-glass:before { + content: "\e001"; +} +.glyphicon-music:before { + content: "\e002"; +} +.glyphicon-search:before { + content: "\e003"; +} +.glyphicon-heart:before { + content: "\e005"; +} +.glyphicon-star:before { + content: "\e006"; +} +.glyphicon-star-empty:before { + content: "\e007"; +} +.glyphicon-user:before { + content: "\e008"; +} +.glyphicon-film:before { + content: "\e009"; +} +.glyphicon-th-large:before { + content: "\e010"; +} +.glyphicon-th:before { + content: "\e011"; +} +.glyphicon-th-list:before { + content: "\e012"; +} +.glyphicon-ok:before { + content: "\e013"; +} +.glyphicon-remove:before { + content: "\e014"; +} +.glyphicon-zoom-in:before { + content: "\e015"; +} +.glyphicon-zoom-out:before { + content: "\e016"; +} +.glyphicon-off:before { + content: "\e017"; +} +.glyphicon-signal:before { + content: "\e018"; +} +.glyphicon-cog:before { + content: "\e019"; +} +.glyphicon-trash:before { + content: "\e020"; +} +.glyphicon-home:before { + content: "\e021"; +} +.glyphicon-file:before { + content: "\e022"; +} +.glyphicon-time:before { + content: "\e023"; +} +.glyphicon-road:before { + content: "\e024"; +} +.glyphicon-download-alt:before { + content: "\e025"; +} +.glyphicon-download:before { + content: "\e026"; +} +.glyphicon-upload:before { + content: "\e027"; +} +.glyphicon-inbox:before { + content: "\e028"; +} +.glyphicon-play-circle:before { + content: "\e029"; +} +.glyphicon-repeat:before { + content: "\e030"; +} +.glyphicon-refresh:before { + content: "\e031"; +} +.glyphicon-list-alt:before { + content: "\e032"; +} +.glyphicon-lock:before { + content: "\e033"; +} +.glyphicon-flag:before { + content: "\e034"; +} +.glyphicon-headphones:before { + content: "\e035"; +} +.glyphicon-volume-off:before { + content: "\e036"; +} +.glyphicon-volume-down:before { + content: "\e037"; +} +.glyphicon-volume-up:before { + content: "\e038"; +} +.glyphicon-qrcode:before { + content: "\e039"; +} +.glyphicon-barcode:before { + content: "\e040"; +} +.glyphicon-tag:before { + content: "\e041"; +} +.glyphicon-tags:before { + content: "\e042"; +} +.glyphicon-book:before { + content: "\e043"; +} +.glyphicon-bookmark:before { + content: "\e044"; +} +.glyphicon-print:before { + content: "\e045"; +} +.glyphicon-camera:before { + content: "\e046"; +} +.glyphicon-font:before { + content: "\e047"; +} +.glyphicon-bold:before { + content: "\e048"; +} +.glyphicon-italic:before { + content: "\e049"; +} +.glyphicon-text-height:before { + content: "\e050"; +} +.glyphicon-text-width:before { + content: "\e051"; +} +.glyphicon-align-left:before { + content: "\e052"; +} +.glyphicon-align-center:before { + content: "\e053"; +} +.glyphicon-align-right:before { + content: "\e054"; +} +.glyphicon-align-justify:before { + content: "\e055"; +} +.glyphicon-list:before { + content: "\e056"; +} +.glyphicon-indent-left:before { + content: "\e057"; +} +.glyphicon-indent-right:before { + content: "\e058"; +} +.glyphicon-facetime-video:before { + content: "\e059"; +} +.glyphicon-picture:before { + content: "\e060"; +} +.glyphicon-map-marker:before { + content: "\e062"; +} +.glyphicon-adjust:before { + content: "\e063"; +} +.glyphicon-tint:before { + content: "\e064"; +} +.glyphicon-edit:before { + content: "\e065"; +} +.glyphicon-share:before { + content: "\e066"; +} +.glyphicon-check:before { + content: "\e067"; +} +.glyphicon-move:before { + content: "\e068"; +} +.glyphicon-step-backward:before { + content: "\e069"; +} +.glyphicon-fast-backward:before { + content: "\e070"; +} +.glyphicon-backward:before { + content: "\e071"; +} +.glyphicon-play:before { + content: "\e072"; +} +.glyphicon-pause:before { + content: "\e073"; +} +.glyphicon-stop:before { + content: "\e074"; +} +.glyphicon-forward:before { + content: "\e075"; +} +.glyphicon-fast-forward:before { + content: "\e076"; +} +.glyphicon-step-forward:before { + content: "\e077"; +} +.glyphicon-eject:before { + content: "\e078"; +} +.glyphicon-chevron-left:before { + content: "\e079"; +} +.glyphicon-chevron-right:before { + content: "\e080"; +} +.glyphicon-plus-sign:before { + content: "\e081"; +} +.glyphicon-minus-sign:before { + content: "\e082"; +} +.glyphicon-remove-sign:before { + content: "\e083"; +} +.glyphicon-ok-sign:before { + content: "\e084"; +} +.glyphicon-question-sign:before { + content: "\e085"; +} +.glyphicon-info-sign:before { + content: "\e086"; +} +.glyphicon-screenshot:before { + content: "\e087"; +} +.glyphicon-remove-circle:before { + content: "\e088"; +} +.glyphicon-ok-circle:before { + content: "\e089"; +} +.glyphicon-ban-circle:before { + content: "\e090"; +} +.glyphicon-arrow-left:before { + content: "\e091"; +} +.glyphicon-arrow-right:before { + content: "\e092"; +} +.glyphicon-arrow-up:before { + content: "\e093"; +} +.glyphicon-arrow-down:before { + content: "\e094"; +} +.glyphicon-share-alt:before { + content: "\e095"; +} +.glyphicon-resize-full:before { + content: "\e096"; +} +.glyphicon-resize-small:before { + content: "\e097"; +} +.glyphicon-exclamation-sign:before { + content: "\e101"; +} +.glyphicon-gift:before { + content: "\e102"; +} +.glyphicon-leaf:before { + content: "\e103"; +} +.glyphicon-fire:before { + content: "\e104"; +} +.glyphicon-eye-open:before { + content: "\e105"; +} +.glyphicon-eye-close:before { + content: "\e106"; +} +.glyphicon-warning-sign:before { + content: "\e107"; +} +.glyphicon-plane:before { + content: "\e108"; +} +.glyphicon-calendar:before { + content: "\e109"; +} +.glyphicon-random:before { + content: "\e110"; +} +.glyphicon-comment:before { + content: "\e111"; +} +.glyphicon-magnet:before { + content: "\e112"; +} +.glyphicon-chevron-up:before { + content: "\e113"; +} +.glyphicon-chevron-down:before { + content: "\e114"; +} +.glyphicon-retweet:before { + content: "\e115"; +} +.glyphicon-shopping-cart:before { + content: "\e116"; +} +.glyphicon-folder-close:before { + content: "\e117"; +} +.glyphicon-folder-open:before { + content: "\e118"; +} +.glyphicon-resize-vertical:before { + content: "\e119"; +} +.glyphicon-resize-horizontal:before { + content: "\e120"; +} +.glyphicon-hdd:before { + content: "\e121"; +} +.glyphicon-bullhorn:before { + content: "\e122"; +} +.glyphicon-bell:before { + content: "\e123"; +} +.glyphicon-certificate:before { + content: "\e124"; +} +.glyphicon-thumbs-up:before { + content: "\e125"; +} +.glyphicon-thumbs-down:before { + content: "\e126"; +} +.glyphicon-hand-right:before { + content: "\e127"; +} +.glyphicon-hand-left:before { + content: "\e128"; +} +.glyphicon-hand-up:before { + content: "\e129"; +} +.glyphicon-hand-down:before { + content: "\e130"; +} +.glyphicon-circle-arrow-right:before { + content: "\e131"; +} +.glyphicon-circle-arrow-left:before { + content: "\e132"; +} +.glyphicon-circle-arrow-up:before { + content: "\e133"; +} +.glyphicon-circle-arrow-down:before { + content: "\e134"; +} +.glyphicon-globe:before { + content: "\e135"; +} +.glyphicon-wrench:before { + content: "\e136"; +} +.glyphicon-tasks:before { + content: "\e137"; +} +.glyphicon-filter:before { + content: "\e138"; +} +.glyphicon-briefcase:before { + content: "\e139"; +} +.glyphicon-fullscreen:before { + content: "\e140"; +} +.glyphicon-dashboard:before { + content: "\e141"; +} +.glyphicon-paperclip:before { + content: "\e142"; +} +.glyphicon-heart-empty:before { + content: "\e143"; +} +.glyphicon-link:before { + content: "\e144"; +} +.glyphicon-phone:before { + content: "\e145"; +} +.glyphicon-pushpin:before { + content: "\e146"; +} +.glyphicon-usd:before { + content: "\e148"; +} +.glyphicon-gbp:before { + content: "\e149"; +} +.glyphicon-sort:before { + content: "\e150"; +} +.glyphicon-sort-by-alphabet:before { + content: "\e151"; +} +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152"; +} +.glyphicon-sort-by-order:before { + content: "\e153"; +} +.glyphicon-sort-by-order-alt:before { + content: "\e154"; +} +.glyphicon-sort-by-attributes:before { + content: "\e155"; +} +.glyphicon-sort-by-attributes-alt:before { + content: "\e156"; +} +.glyphicon-unchecked:before { + content: "\e157"; +} +.glyphicon-expand:before { + content: "\e158"; +} +.glyphicon-collapse-down:before { + content: "\e159"; +} +.glyphicon-collapse-up:before { + content: "\e160"; +} +.glyphicon-log-in:before { + content: "\e161"; +} +.glyphicon-flash:before { + content: "\e162"; +} +.glyphicon-log-out:before { + content: "\e163"; +} +.glyphicon-new-window:before { + content: "\e164"; +} +.glyphicon-record:before { + content: "\e165"; +} +.glyphicon-save:before { + content: "\e166"; +} +.glyphicon-open:before { + content: "\e167"; +} +.glyphicon-saved:before { + content: "\e168"; +} +.glyphicon-import:before { + content: "\e169"; +} +.glyphicon-export:before { + content: "\e170"; +} +.glyphicon-send:before { + content: "\e171"; +} +.glyphicon-floppy-disk:before { + content: "\e172"; +} +.glyphicon-floppy-saved:before { + content: "\e173"; +} +.glyphicon-floppy-remove:before { + content: "\e174"; +} +.glyphicon-floppy-save:before { + content: "\e175"; +} +.glyphicon-floppy-open:before { + content: "\e176"; +} +.glyphicon-credit-card:before { + content: "\e177"; +} +.glyphicon-transfer:before { + content: "\e178"; +} +.glyphicon-cutlery:before { + content: "\e179"; +} +.glyphicon-header:before { + content: "\e180"; +} +.glyphicon-compressed:before { + content: "\e181"; +} +.glyphicon-earphone:before { + content: "\e182"; +} +.glyphicon-phone-alt:before { + content: "\e183"; +} +.glyphicon-tower:before { + content: "\e184"; +} +.glyphicon-stats:before { + content: "\e185"; +} +.glyphicon-sd-video:before { + content: "\e186"; +} +.glyphicon-hd-video:before { + content: "\e187"; +} +.glyphicon-subtitles:before { + content: "\e188"; +} +.glyphicon-sound-stereo:before { + content: "\e189"; +} +.glyphicon-sound-dolby:before { + content: "\e190"; +} +.glyphicon-sound-5-1:before { + content: "\e191"; +} +.glyphicon-sound-6-1:before { + content: "\e192"; +} +.glyphicon-sound-7-1:before { + content: "\e193"; +} +.glyphicon-copyright-mark:before { + content: "\e194"; +} +.glyphicon-registration-mark:before { + content: "\e195"; +} +.glyphicon-cloud-download:before { + content: "\e197"; +} +.glyphicon-cloud-upload:before { + content: "\e198"; +} +.glyphicon-tree-conifer:before { + content: "\e199"; +} +.glyphicon-tree-deciduous:before { + content: "\e200"; +} +.glyphicon-cd:before { + content: "\e201"; +} +.glyphicon-save-file:before { + content: "\e202"; +} +.glyphicon-open-file:before { + content: "\e203"; +} +.glyphicon-level-up:before { + content: "\e204"; +} +.glyphicon-copy:before { + content: "\e205"; +} +.glyphicon-paste:before { + content: "\e206"; +} +.glyphicon-alert:before { + content: "\e209"; +} +.glyphicon-equalizer:before { + content: "\e210"; +} +.glyphicon-king:before { + content: "\e211"; +} +.glyphicon-queen:before { + content: "\e212"; +} +.glyphicon-pawn:before { + content: "\e213"; +} +.glyphicon-bishop:before { + content: "\e214"; +} +.glyphicon-knight:before { + content: "\e215"; +} +.glyphicon-baby-formula:before { + content: "\e216"; +} +.glyphicon-tent:before { + content: "\26fa"; +} +.glyphicon-blackboard:before { + content: "\e218"; +} +.glyphicon-bed:before { + content: "\e219"; +} +.glyphicon-apple:before { + content: "\f8ff"; +} +.glyphicon-erase:before { + content: "\e221"; +} +.glyphicon-hourglass:before { + content: "\231b"; +} +.glyphicon-lamp:before { + content: "\e223"; +} +.glyphicon-duplicate:before { + content: "\e224"; +} +.glyphicon-piggy-bank:before { + content: "\e225"; +} +.glyphicon-scissors:before { + content: "\e226"; +} +.glyphicon-bitcoin:before { + content: "\e227"; +} +.glyphicon-btc:before { + content: "\e227"; +} +.glyphicon-xbt:before { + content: "\e227"; +} +.glyphicon-yen:before { + content: "\00a5"; +} +.glyphicon-jpy:before { + content: "\00a5"; +} +.glyphicon-ruble:before { + content: "\20bd"; +} +.glyphicon-rub:before { + content: "\20bd"; +} +.glyphicon-scale:before { + content: "\e230"; +} +.glyphicon-ice-lolly:before { + content: "\e231"; +} +.glyphicon-ice-lolly-tasted:before { + content: "\e232"; +} +.glyphicon-education:before { + content: "\e233"; +} +.glyphicon-option-horizontal:before { + content: "\e234"; +} +.glyphicon-option-vertical:before { + content: "\e235"; +} +.glyphicon-menu-hamburger:before { + content: "\e236"; +} +.glyphicon-modal-window:before { + content: "\e237"; +} +.glyphicon-oil:before { + content: "\e238"; +} +.glyphicon-grain:before { + content: "\e239"; +} +.glyphicon-sunglasses:before { + content: "\e240"; +} +.glyphicon-text-size:before { + content: "\e241"; +} +.glyphicon-text-color:before { + content: "\e242"; +} +.glyphicon-text-background:before { + content: "\e243"; +} +.glyphicon-object-align-top:before { + content: "\e244"; +} +.glyphicon-object-align-bottom:before { + content: "\e245"; +} +.glyphicon-object-align-horizontal:before { + content: "\e246"; +} +.glyphicon-object-align-left:before { + content: "\e247"; +} +.glyphicon-object-align-vertical:before { + content: "\e248"; +} +.glyphicon-object-align-right:before { + content: "\e249"; +} +.glyphicon-triangle-right:before { + content: "\e250"; +} +.glyphicon-triangle-left:before { + content: "\e251"; +} +.glyphicon-triangle-bottom:before { + content: "\e252"; +} +.glyphicon-triangle-top:before { + content: "\e253"; +} +.glyphicon-console:before { + content: "\e254"; +} +.glyphicon-superscript:before { + content: "\e255"; +} +.glyphicon-subscript:before { + content: "\e256"; +} +.glyphicon-menu-left:before { + content: "\e257"; +} +.glyphicon-menu-right:before { + content: "\e258"; +} +.glyphicon-menu-down:before { + content: "\e259"; +} +.glyphicon-menu-up:before { + content: "\e260"; +} +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +*:before, +*:after { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +html { + font-size: 10px; + + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color: #333; + background-color: #fff; +} +input, +button, +select, +textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit; +} +a { + color: #337ab7; + text-decoration: none; +} +a:hover, +a:focus { + color: #23527c; + text-decoration: underline; +} +a:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +figure { + margin: 0; +} +img { + vertical-align: middle; +} +.img-responsive, +.thumbnail > img, +.thumbnail a > img, +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + max-width: 100%; + height: auto; +} +.img-rounded { + border-radius: 6px; +} +.img-thumbnail { + display: inline-block; + max-width: 100%; + height: auto; + padding: 4px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; + transition: all .2s ease-in-out; +} +.img-circle { + border-radius: 50%; +} +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee; +} +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0; +} +.sr-only-focusable:active, +.sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto; +} +[role="button"] { + cursor: pointer; +} +h1, +h2, +h3, +h4, +h5, +h6, +.h1, +.h2, +.h3, +.h4, +.h5, +.h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small, +.h1 small, +.h2 small, +.h3 small, +.h4 small, +.h5 small, +.h6 small, +h1 .small, +h2 .small, +h3 .small, +h4 .small, +h5 .small, +h6 .small, +.h1 .small, +.h2 .small, +.h3 .small, +.h4 .small, +.h5 .small, +.h6 .small { + font-weight: normal; + line-height: 1; + color: #777; +} +h1, +.h1, +h2, +.h2, +h3, +.h3 { + margin-top: 20px; + margin-bottom: 10px; +} +h1 small, +.h1 small, +h2 small, +.h2 small, +h3 small, +.h3 small, +h1 .small, +.h1 .small, +h2 .small, +.h2 .small, +h3 .small, +.h3 .small { + font-size: 65%; +} +h4, +.h4, +h5, +.h5, +h6, +.h6 { + margin-top: 10px; + margin-bottom: 10px; +} +h4 small, +.h4 small, +h5 small, +.h5 small, +h6 small, +.h6 small, +h4 .small, +.h4 .small, +h5 .small, +.h5 .small, +h6 .small, +.h6 .small { + font-size: 75%; +} +h1, +.h1 { + font-size: 36px; +} +h2, +.h2 { + font-size: 30px; +} +h3, +.h3 { + font-size: 24px; +} +h4, +.h4 { + font-size: 18px; +} +h5, +.h5 { + font-size: 14px; +} +h6, +.h6 { + font-size: 12px; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4; +} +@media (min-width: 768px) { + .lead { + font-size: 21px; + } +} +small, +.small { + font-size: 85%; +} +mark, +.mark { + padding: .2em; + background-color: #fcf8e3; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +.text-justify { + text-align: justify; +} +.text-nowrap { + white-space: nowrap; +} +.text-lowercase { + text-transform: lowercase; +} +.text-uppercase { + text-transform: uppercase; +} +.text-capitalize { + text-transform: capitalize; +} +.text-muted { + color: #777; +} +.text-primary { + color: #337ab7; +} +a.text-primary:hover, +a.text-primary:focus { + color: #286090; +} +.text-success { + color: #3c763d; +} +a.text-success:hover, +a.text-success:focus { + color: #2b542c; +} +.text-info { + color: #31708f; +} +a.text-info:hover, +a.text-info:focus { + color: #245269; +} +.text-warning { + color: #8a6d3b; +} +a.text-warning:hover, +a.text-warning:focus { + color: #66512c; +} +.text-danger { + color: #a94442; +} +a.text-danger:hover, +a.text-danger:focus { + color: #843534; +} +.bg-primary { + color: #fff; + background-color: #337ab7; +} +a.bg-primary:hover, +a.bg-primary:focus { + background-color: #286090; +} +.bg-success { + background-color: #dff0d8; +} +a.bg-success:hover, +a.bg-success:focus { + background-color: #c1e2b3; +} +.bg-info { + background-color: #d9edf7; +} +a.bg-info:hover, +a.bg-info:focus { + background-color: #afd9ee; +} +.bg-warning { + background-color: #fcf8e3; +} +a.bg-warning:hover, +a.bg-warning:focus { + background-color: #f7ecb5; +} +.bg-danger { + background-color: #f2dede; +} +a.bg-danger:hover, +a.bg-danger:focus { + background-color: #e4b9b9; +} +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eee; +} +ul, +ol { + margin-top: 0; + margin-bottom: 10px; +} +ul ul, +ol ul, +ul ol, +ol ol { + margin-bottom: 0; +} +.list-unstyled { + padding-left: 0; + list-style: none; +} +.list-inline { + padding-left: 0; + margin-left: -5px; + list-style: none; +} +.list-inline > li { + display: inline-block; + padding-right: 5px; + padding-left: 5px; +} +dl { + margin-top: 0; + margin-bottom: 20px; +} +dt, +dd { + line-height: 1.42857143; +} +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +@media (min-width: 768px) { + .dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap; + } + .dl-horizontal dd { + margin-left: 180px; + } +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #777; +} +.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eee; +} +blockquote p:last-child, +blockquote ul:last-child, +blockquote ol:last-child { + margin-bottom: 0; +} +blockquote footer, +blockquote small, +blockquote .small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #777; +} +blockquote footer:before, +blockquote small:before, +blockquote .small:before { + content: '\2014 \00A0'; +} +.blockquote-reverse, +blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + text-align: right; + border-right: 5px solid #eee; + border-left: 0; +} +.blockquote-reverse footer:before, +blockquote.pull-right footer:before, +.blockquote-reverse small:before, +blockquote.pull-right small:before, +.blockquote-reverse .small:before, +blockquote.pull-right .small:before { + content: ''; +} +.blockquote-reverse footer:after, +blockquote.pull-right footer:after, +.blockquote-reverse small:after, +blockquote.pull-right small:after, +.blockquote-reverse .small:after, +blockquote.pull-right .small:after { + content: '\00A0 \2014'; +} +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143; +} +code, +kbd, +pre, +samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; +} +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; +} +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); +} +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: bold; + -webkit-box-shadow: none; + box-shadow: none; +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + color: #333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px; +} +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +@media (min-width: 768px) { + .container { + width: 750px; + } +} +@media (min-width: 992px) { + .container { + width: 970px; + } +} +@media (min-width: 1200px) { + .container { + width: 1170px; + } +} +.container-fluid { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto; +} +.row { + margin-right: -15px; + margin-left: -15px; +} +.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px; +} +.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 { + float: left; +} +.col-xs-12 { + width: 100%; +} +.col-xs-11 { + width: 91.66666667%; +} +.col-xs-10 { + width: 83.33333333%; +} +.col-xs-9 { + width: 75%; +} +.col-xs-8 { + width: 66.66666667%; +} +.col-xs-7 { + width: 58.33333333%; +} +.col-xs-6 { + width: 50%; +} +.col-xs-5 { + width: 41.66666667%; +} +.col-xs-4 { + width: 33.33333333%; +} +.col-xs-3 { + width: 25%; +} +.col-xs-2 { + width: 16.66666667%; +} +.col-xs-1 { + width: 8.33333333%; +} +.col-xs-pull-12 { + right: 100%; +} +.col-xs-pull-11 { + right: 91.66666667%; +} +.col-xs-pull-10 { + right: 83.33333333%; +} +.col-xs-pull-9 { + right: 75%; +} +.col-xs-pull-8 { + right: 66.66666667%; +} +.col-xs-pull-7 { + right: 58.33333333%; +} +.col-xs-pull-6 { + right: 50%; +} +.col-xs-pull-5 { + right: 41.66666667%; +} +.col-xs-pull-4 { + right: 33.33333333%; +} +.col-xs-pull-3 { + right: 25%; +} +.col-xs-pull-2 { + right: 16.66666667%; +} +.col-xs-pull-1 { + right: 8.33333333%; +} +.col-xs-pull-0 { + right: auto; +} +.col-xs-push-12 { + left: 100%; +} +.col-xs-push-11 { + left: 91.66666667%; +} +.col-xs-push-10 { + left: 83.33333333%; +} +.col-xs-push-9 { + left: 75%; +} +.col-xs-push-8 { + left: 66.66666667%; +} +.col-xs-push-7 { + left: 58.33333333%; +} +.col-xs-push-6 { + left: 50%; +} +.col-xs-push-5 { + left: 41.66666667%; +} +.col-xs-push-4 { + left: 33.33333333%; +} +.col-xs-push-3 { + left: 25%; +} +.col-xs-push-2 { + left: 16.66666667%; +} +.col-xs-push-1 { + left: 8.33333333%; +} +.col-xs-push-0 { + left: auto; +} +.col-xs-offset-12 { + margin-left: 100%; +} +.col-xs-offset-11 { + margin-left: 91.66666667%; +} +.col-xs-offset-10 { + margin-left: 83.33333333%; +} +.col-xs-offset-9 { + margin-left: 75%; +} +.col-xs-offset-8 { + margin-left: 66.66666667%; +} +.col-xs-offset-7 { + margin-left: 58.33333333%; +} +.col-xs-offset-6 { + margin-left: 50%; +} +.col-xs-offset-5 { + margin-left: 41.66666667%; +} +.col-xs-offset-4 { + margin-left: 33.33333333%; +} +.col-xs-offset-3 { + margin-left: 25%; +} +.col-xs-offset-2 { + margin-left: 16.66666667%; +} +.col-xs-offset-1 { + margin-left: 8.33333333%; +} +.col-xs-offset-0 { + margin-left: 0; +} +@media (min-width: 768px) { + .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 { + float: left; + } + .col-sm-12 { + width: 100%; + } + .col-sm-11 { + width: 91.66666667%; + } + .col-sm-10 { + width: 83.33333333%; + } + .col-sm-9 { + width: 75%; + } + .col-sm-8 { + width: 66.66666667%; + } + .col-sm-7 { + width: 58.33333333%; + } + .col-sm-6 { + width: 50%; + } + .col-sm-5 { + width: 41.66666667%; + } + .col-sm-4 { + width: 33.33333333%; + } + .col-sm-3 { + width: 25%; + } + .col-sm-2 { + width: 16.66666667%; + } + .col-sm-1 { + width: 8.33333333%; + } + .col-sm-pull-12 { + right: 100%; + } + .col-sm-pull-11 { + right: 91.66666667%; + } + .col-sm-pull-10 { + right: 83.33333333%; + } + .col-sm-pull-9 { + right: 75%; + } + .col-sm-pull-8 { + right: 66.66666667%; + } + .col-sm-pull-7 { + right: 58.33333333%; + } + .col-sm-pull-6 { + right: 50%; + } + .col-sm-pull-5 { + right: 41.66666667%; + } + .col-sm-pull-4 { + right: 33.33333333%; + } + .col-sm-pull-3 { + right: 25%; + } + .col-sm-pull-2 { + right: 16.66666667%; + } + .col-sm-pull-1 { + right: 8.33333333%; + } + .col-sm-pull-0 { + right: auto; + } + .col-sm-push-12 { + left: 100%; + } + .col-sm-push-11 { + left: 91.66666667%; + } + .col-sm-push-10 { + left: 83.33333333%; + } + .col-sm-push-9 { + left: 75%; + } + .col-sm-push-8 { + left: 66.66666667%; + } + .col-sm-push-7 { + left: 58.33333333%; + } + .col-sm-push-6 { + left: 50%; + } + .col-sm-push-5 { + left: 41.66666667%; + } + .col-sm-push-4 { + left: 33.33333333%; + } + .col-sm-push-3 { + left: 25%; + } + .col-sm-push-2 { + left: 16.66666667%; + } + .col-sm-push-1 { + left: 8.33333333%; + } + .col-sm-push-0 { + left: auto; + } + .col-sm-offset-12 { + margin-left: 100%; + } + .col-sm-offset-11 { + margin-left: 91.66666667%; + } + .col-sm-offset-10 { + margin-left: 83.33333333%; + } + .col-sm-offset-9 { + margin-left: 75%; + } + .col-sm-offset-8 { + margin-left: 66.66666667%; + } + .col-sm-offset-7 { + margin-left: 58.33333333%; + } + .col-sm-offset-6 { + margin-left: 50%; + } + .col-sm-offset-5 { + margin-left: 41.66666667%; + } + .col-sm-offset-4 { + margin-left: 33.33333333%; + } + .col-sm-offset-3 { + margin-left: 25%; + } + .col-sm-offset-2 { + margin-left: 16.66666667%; + } + .col-sm-offset-1 { + margin-left: 8.33333333%; + } + .col-sm-offset-0 { + margin-left: 0; + } +} +@media (min-width: 992px) { + .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 { + float: left; + } + .col-md-12 { + width: 100%; + } + .col-md-11 { + width: 91.66666667%; + } + .col-md-10 { + width: 83.33333333%; + } + .col-md-9 { + width: 75%; + } + .col-md-8 { + width: 66.66666667%; + } + .col-md-7 { + width: 58.33333333%; + } + .col-md-6 { + width: 50%; + } + .col-md-5 { + width: 41.66666667%; + } + .col-md-4 { + width: 33.33333333%; + } + .col-md-3 { + width: 25%; + } + .col-md-2 { + width: 16.66666667%; + } + .col-md-1 { + width: 8.33333333%; + } + .col-md-pull-12 { + right: 100%; + } + .col-md-pull-11 { + right: 91.66666667%; + } + .col-md-pull-10 { + right: 83.33333333%; + } + .col-md-pull-9 { + right: 75%; + } + .col-md-pull-8 { + right: 66.66666667%; + } + .col-md-pull-7 { + right: 58.33333333%; + } + .col-md-pull-6 { + right: 50%; + } + .col-md-pull-5 { + right: 41.66666667%; + } + .col-md-pull-4 { + right: 33.33333333%; + } + .col-md-pull-3 { + right: 25%; + } + .col-md-pull-2 { + right: 16.66666667%; + } + .col-md-pull-1 { + right: 8.33333333%; + } + .col-md-pull-0 { + right: auto; + } + .col-md-push-12 { + left: 100%; + } + .col-md-push-11 { + left: 91.66666667%; + } + .col-md-push-10 { + left: 83.33333333%; + } + .col-md-push-9 { + left: 75%; + } + .col-md-push-8 { + left: 66.66666667%; + } + .col-md-push-7 { + left: 58.33333333%; + } + .col-md-push-6 { + left: 50%; + } + .col-md-push-5 { + left: 41.66666667%; + } + .col-md-push-4 { + left: 33.33333333%; + } + .col-md-push-3 { + left: 25%; + } + .col-md-push-2 { + left: 16.66666667%; + } + .col-md-push-1 { + left: 8.33333333%; + } + .col-md-push-0 { + left: auto; + } + .col-md-offset-12 { + margin-left: 100%; + } + .col-md-offset-11 { + margin-left: 91.66666667%; + } + .col-md-offset-10 { + margin-left: 83.33333333%; + } + .col-md-offset-9 { + margin-left: 75%; + } + .col-md-offset-8 { + margin-left: 66.66666667%; + } + .col-md-offset-7 { + margin-left: 58.33333333%; + } + .col-md-offset-6 { + margin-left: 50%; + } + .col-md-offset-5 { + margin-left: 41.66666667%; + } + .col-md-offset-4 { + margin-left: 33.33333333%; + } + .col-md-offset-3 { + margin-left: 25%; + } + .col-md-offset-2 { + margin-left: 16.66666667%; + } + .col-md-offset-1 { + margin-left: 8.33333333%; + } + .col-md-offset-0 { + margin-left: 0; + } +} +@media (min-width: 1200px) { + .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 { + float: left; + } + .col-lg-12 { + width: 100%; + } + .col-lg-11 { + width: 91.66666667%; + } + .col-lg-10 { + width: 83.33333333%; + } + .col-lg-9 { + width: 75%; + } + .col-lg-8 { + width: 66.66666667%; + } + .col-lg-7 { + width: 58.33333333%; + } + .col-lg-6 { + width: 50%; + } + .col-lg-5 { + width: 41.66666667%; + } + .col-lg-4 { + width: 33.33333333%; + } + .col-lg-3 { + width: 25%; + } + .col-lg-2 { + width: 16.66666667%; + } + .col-lg-1 { + width: 8.33333333%; + } + .col-lg-pull-12 { + right: 100%; + } + .col-lg-pull-11 { + right: 91.66666667%; + } + .col-lg-pull-10 { + right: 83.33333333%; + } + .col-lg-pull-9 { + right: 75%; + } + .col-lg-pull-8 { + right: 66.66666667%; + } + .col-lg-pull-7 { + right: 58.33333333%; + } + .col-lg-pull-6 { + right: 50%; + } + .col-lg-pull-5 { + right: 41.66666667%; + } + .col-lg-pull-4 { + right: 33.33333333%; + } + .col-lg-pull-3 { + right: 25%; + } + .col-lg-pull-2 { + right: 16.66666667%; + } + .col-lg-pull-1 { + right: 8.33333333%; + } + .col-lg-pull-0 { + right: auto; + } + .col-lg-push-12 { + left: 100%; + } + .col-lg-push-11 { + left: 91.66666667%; + } + .col-lg-push-10 { + left: 83.33333333%; + } + .col-lg-push-9 { + left: 75%; + } + .col-lg-push-8 { + left: 66.66666667%; + } + .col-lg-push-7 { + left: 58.33333333%; + } + .col-lg-push-6 { + left: 50%; + } + .col-lg-push-5 { + left: 41.66666667%; + } + .col-lg-push-4 { + left: 33.33333333%; + } + .col-lg-push-3 { + left: 25%; + } + .col-lg-push-2 { + left: 16.66666667%; + } + .col-lg-push-1 { + left: 8.33333333%; + } + .col-lg-push-0 { + left: auto; + } + .col-lg-offset-12 { + margin-left: 100%; + } + .col-lg-offset-11 { + margin-left: 91.66666667%; + } + .col-lg-offset-10 { + margin-left: 83.33333333%; + } + .col-lg-offset-9 { + margin-left: 75%; + } + .col-lg-offset-8 { + margin-left: 66.66666667%; + } + .col-lg-offset-7 { + margin-left: 58.33333333%; + } + .col-lg-offset-6 { + margin-left: 50%; + } + .col-lg-offset-5 { + margin-left: 41.66666667%; + } + .col-lg-offset-4 { + margin-left: 33.33333333%; + } + .col-lg-offset-3 { + margin-left: 25%; + } + .col-lg-offset-2 { + margin-left: 16.66666667%; + } + .col-lg-offset-1 { + margin-left: 8.33333333%; + } + .col-lg-offset-0 { + margin-left: 0; + } +} +table { + background-color: transparent; +} +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777; + text-align: left; +} +th { + text-align: left; +} +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px; +} +.table > thead > tr > th, +.table > tbody > tr > th, +.table > tfoot > tr > th, +.table > thead > tr > td, +.table > tbody > tr > td, +.table > tfoot > tr > td { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #ddd; +} +.table > thead > tr > th { + vertical-align: bottom; + border-bottom: 2px solid #ddd; +} +.table > caption + thead > tr:first-child > th, +.table > colgroup + thead > tr:first-child > th, +.table > thead:first-child > tr:first-child > th, +.table > caption + thead > tr:first-child > td, +.table > colgroup + thead > tr:first-child > td, +.table > thead:first-child > tr:first-child > td { + border-top: 0; +} +.table > tbody + tbody { + border-top: 2px solid #ddd; +} +.table .table { + background-color: #fff; +} +.table-condensed > thead > tr > th, +.table-condensed > tbody > tr > th, +.table-condensed > tfoot > tr > th, +.table-condensed > thead > tr > td, +.table-condensed > tbody > tr > td, +.table-condensed > tfoot > tr > td { + padding: 5px; +} +.table-bordered { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > tbody > tr > th, +.table-bordered > tfoot > tr > th, +.table-bordered > thead > tr > td, +.table-bordered > tbody > tr > td, +.table-bordered > tfoot > tr > td { + border: 1px solid #ddd; +} +.table-bordered > thead > tr > th, +.table-bordered > thead > tr > td { + border-bottom-width: 2px; +} +.table-striped > tbody > tr:nth-of-type(odd) { + background-color: #f9f9f9; +} +.table-hover > tbody > tr:hover { + background-color: #f5f5f5; +} +table col[class*="col-"] { + position: static; + display: table-column; + float: none; +} +table td[class*="col-"], +table th[class*="col-"] { + position: static; + display: table-cell; + float: none; +} +.table > thead > tr > td.active, +.table > tbody > tr > td.active, +.table > tfoot > tr > td.active, +.table > thead > tr > th.active, +.table > tbody > tr > th.active, +.table > tfoot > tr > th.active, +.table > thead > tr.active > td, +.table > tbody > tr.active > td, +.table > tfoot > tr.active > td, +.table > thead > tr.active > th, +.table > tbody > tr.active > th, +.table > tfoot > tr.active > th { + background-color: #f5f5f5; +} +.table-hover > tbody > tr > td.active:hover, +.table-hover > tbody > tr > th.active:hover, +.table-hover > tbody > tr.active:hover > td, +.table-hover > tbody > tr:hover > .active, +.table-hover > tbody > tr.active:hover > th { + background-color: #e8e8e8; +} +.table > thead > tr > td.success, +.table > tbody > tr > td.success, +.table > tfoot > tr > td.success, +.table > thead > tr > th.success, +.table > tbody > tr > th.success, +.table > tfoot > tr > th.success, +.table > thead > tr.success > td, +.table > tbody > tr.success > td, +.table > tfoot > tr.success > td, +.table > thead > tr.success > th, +.table > tbody > tr.success > th, +.table > tfoot > tr.success > th { + background-color: #dff0d8; +} +.table-hover > tbody > tr > td.success:hover, +.table-hover > tbody > tr > th.success:hover, +.table-hover > tbody > tr.success:hover > td, +.table-hover > tbody > tr:hover > .success, +.table-hover > tbody > tr.success:hover > th { + background-color: #d0e9c6; +} +.table > thead > tr > td.info, +.table > tbody > tr > td.info, +.table > tfoot > tr > td.info, +.table > thead > tr > th.info, +.table > tbody > tr > th.info, +.table > tfoot > tr > th.info, +.table > thead > tr.info > td, +.table > tbody > tr.info > td, +.table > tfoot > tr.info > td, +.table > thead > tr.info > th, +.table > tbody > tr.info > th, +.table > tfoot > tr.info > th { + background-color: #d9edf7; +} +.table-hover > tbody > tr > td.info:hover, +.table-hover > tbody > tr > th.info:hover, +.table-hover > tbody > tr.info:hover > td, +.table-hover > tbody > tr:hover > .info, +.table-hover > tbody > tr.info:hover > th { + background-color: #c4e3f3; +} +.table > thead > tr > td.warning, +.table > tbody > tr > td.warning, +.table > tfoot > tr > td.warning, +.table > thead > tr > th.warning, +.table > tbody > tr > th.warning, +.table > tfoot > tr > th.warning, +.table > thead > tr.warning > td, +.table > tbody > tr.warning > td, +.table > tfoot > tr.warning > td, +.table > thead > tr.warning > th, +.table > tbody > tr.warning > th, +.table > tfoot > tr.warning > th { + background-color: #fcf8e3; +} +.table-hover > tbody > tr > td.warning:hover, +.table-hover > tbody > tr > th.warning:hover, +.table-hover > tbody > tr.warning:hover > td, +.table-hover > tbody > tr:hover > .warning, +.table-hover > tbody > tr.warning:hover > th { + background-color: #faf2cc; +} +.table > thead > tr > td.danger, +.table > tbody > tr > td.danger, +.table > tfoot > tr > td.danger, +.table > thead > tr > th.danger, +.table > tbody > tr > th.danger, +.table > tfoot > tr > th.danger, +.table > thead > tr.danger > td, +.table > tbody > tr.danger > td, +.table > tfoot > tr.danger > td, +.table > thead > tr.danger > th, +.table > tbody > tr.danger > th, +.table > tfoot > tr.danger > th { + background-color: #f2dede; +} +.table-hover > tbody > tr > td.danger:hover, +.table-hover > tbody > tr > th.danger:hover, +.table-hover > tbody > tr.danger:hover > td, +.table-hover > tbody > tr:hover > .danger, +.table-hover > tbody > tr.danger:hover > th { + background-color: #ebcccc; +} +.table-responsive { + min-height: .01%; + overflow-x: auto; +} +@media screen and (max-width: 767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #ddd; + } + .table-responsive > .table { + margin-bottom: 0; + } + .table-responsive > .table > thead > tr > th, + .table-responsive > .table > tbody > tr > th, + .table-responsive > .table > tfoot > tr > th, + .table-responsive > .table > thead > tr > td, + .table-responsive > .table > tbody > tr > td, + .table-responsive > .table > tfoot > tr > td { + white-space: nowrap; + } + .table-responsive > .table-bordered { + border: 0; + } + .table-responsive > .table-bordered > thead > tr > th:first-child, + .table-responsive > .table-bordered > tbody > tr > th:first-child, + .table-responsive > .table-bordered > tfoot > tr > th:first-child, + .table-responsive > .table-bordered > thead > tr > td:first-child, + .table-responsive > .table-bordered > tbody > tr > td:first-child, + .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; + } + .table-responsive > .table-bordered > thead > tr > th:last-child, + .table-responsive > .table-bordered > tbody > tr > th:last-child, + .table-responsive > .table-bordered > tfoot > tr > th:last-child, + .table-responsive > .table-bordered > thead > tr > td:last-child, + .table-responsive > .table-bordered > tbody > tr > td:last-child, + .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; + } + .table-responsive > .table-bordered > tbody > tr:last-child > th, + .table-responsive > .table-bordered > tfoot > tr:last-child > th, + .table-responsive > .table-bordered > tbody > tr:last-child > td, + .table-responsive > .table-bordered > tfoot > tr:last-child > td { + border-bottom: 0; + } +} +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: bold; +} +input[type="search"] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + margin-top: 1px \9; + line-height: normal; +} +input[type="file"] { + display: block; +} +input[type="range"] { + display: block; + width: 100%; +} +select[multiple], +select[size] { + height: auto; +} +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.42857143; + color: #555; +} +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s; +} +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6); +} +.form-control::-moz-placeholder { + color: #999; + opacity: 1; +} +.form-control:-ms-input-placeholder { + color: #999; +} +.form-control::-webkit-input-placeholder { + color: #999; +} +.form-control::-ms-expand { + background-color: transparent; + border: 0; +} +.form-control[disabled], +.form-control[readonly], +fieldset[disabled] .form-control { + background-color: #eee; + opacity: 1; +} +.form-control[disabled], +fieldset[disabled] .form-control { + cursor: not-allowed; +} +textarea.form-control { + height: auto; +} +input[type="search"] { + -webkit-appearance: none; +} +@media screen and (-webkit-min-device-pixel-ratio: 0) { + input[type="date"].form-control, + input[type="time"].form-control, + input[type="datetime-local"].form-control, + input[type="month"].form-control { + line-height: 34px; + } + input[type="date"].input-sm, + input[type="time"].input-sm, + input[type="datetime-local"].input-sm, + input[type="month"].input-sm, + .input-group-sm input[type="date"], + .input-group-sm input[type="time"], + .input-group-sm input[type="datetime-local"], + .input-group-sm input[type="month"] { + line-height: 30px; + } + input[type="date"].input-lg, + input[type="time"].input-lg, + input[type="datetime-local"].input-lg, + input[type="month"].input-lg, + .input-group-lg input[type="date"], + .input-group-lg input[type="time"], + .input-group-lg input[type="datetime-local"], + .input-group-lg input[type="month"] { + line-height: 46px; + } +} +.form-group { + margin-bottom: 15px; +} +.radio, +.checkbox { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px; +} +.radio label, +.checkbox label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + cursor: pointer; +} +.radio input[type="radio"], +.radio-inline input[type="radio"], +.checkbox input[type="checkbox"], +.checkbox-inline input[type="checkbox"] { + position: absolute; + margin-top: 4px \9; + margin-left: -20px; +} +.radio + .radio, +.checkbox + .checkbox { + margin-top: -5px; +} +.radio-inline, +.checkbox-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: normal; + vertical-align: middle; + cursor: pointer; +} +.radio-inline + .radio-inline, +.checkbox-inline + .checkbox-inline { + margin-top: 0; + margin-left: 10px; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"].disabled, +input[type="checkbox"].disabled, +fieldset[disabled] input[type="radio"], +fieldset[disabled] input[type="checkbox"] { + cursor: not-allowed; +} +.radio-inline.disabled, +.checkbox-inline.disabled, +fieldset[disabled] .radio-inline, +fieldset[disabled] .checkbox-inline { + cursor: not-allowed; +} +.radio.disabled label, +.checkbox.disabled label, +fieldset[disabled] .radio label, +fieldset[disabled] .checkbox label { + cursor: not-allowed; +} +.form-control-static { + min-height: 34px; + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0; +} +.form-control-static.input-lg, +.form-control-static.input-sm { + padding-right: 0; + padding-left: 0; +} +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-sm { + height: 30px; + line-height: 30px; +} +textarea.input-sm, +select[multiple].input-sm { + height: auto; +} +.form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.form-group-sm select.form-control { + height: 30px; + line-height: 30px; +} +.form-group-sm textarea.form-control, +.form-group-sm select[multiple].form-control { + height: auto; +} +.form-group-sm .form-control-static { + height: 30px; + min-height: 32px; + padding: 6px 10px; + font-size: 12px; + line-height: 1.5; +} +.input-lg { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-lg { + height: 46px; + line-height: 46px; +} +textarea.input-lg, +select[multiple].input-lg { + height: auto; +} +.form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.form-group-lg select.form-control { + height: 46px; + line-height: 46px; +} +.form-group-lg textarea.form-control, +.form-group-lg select[multiple].form-control { + height: auto; +} +.form-group-lg .form-control-static { + height: 46px; + min-height: 38px; + padding: 11px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.has-feedback { + position: relative; +} +.has-feedback .form-control { + padding-right: 42.5px; +} +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + pointer-events: none; +} +.input-lg + .form-control-feedback, +.input-group-lg + .form-control-feedback, +.form-group-lg .form-control + .form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px; +} +.input-sm + .form-control-feedback, +.input-group-sm + .form-control-feedback, +.form-group-sm .form-control + .form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px; +} +.has-success .help-block, +.has-success .control-label, +.has-success .radio, +.has-success .checkbox, +.has-success .radio-inline, +.has-success .checkbox-inline, +.has-success.radio label, +.has-success.checkbox label, +.has-success.radio-inline label, +.has-success.checkbox-inline label { + color: #3c763d; +} +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; +} +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d; +} +.has-success .form-control-feedback { + color: #3c763d; +} +.has-warning .help-block, +.has-warning .control-label, +.has-warning .radio, +.has-warning .checkbox, +.has-warning .radio-inline, +.has-warning .checkbox-inline, +.has-warning.radio label, +.has-warning.checkbox label, +.has-warning.radio-inline label, +.has-warning.checkbox-inline label { + color: #8a6d3b; +} +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; +} +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b; +} +.has-warning .form-control-feedback { + color: #8a6d3b; +} +.has-error .help-block, +.has-error .control-label, +.has-error .radio, +.has-error .checkbox, +.has-error .radio-inline, +.has-error .checkbox-inline, +.has-error.radio label, +.has-error.checkbox label, +.has-error.radio-inline label, +.has-error.checkbox-inline label { + color: #a94442; +} +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); +} +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; +} +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442; +} +.has-error .form-control-feedback { + color: #a94442; +} +.has-feedback label ~ .form-control-feedback { + top: 25px; +} +.has-feedback label.sr-only ~ .form-control-feedback { + top: 0; +} +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373; +} +@media (min-width: 768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .form-inline .form-control-static { + display: inline-block; + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle; + } + .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn, + .form-inline .input-group .form-control { + width: auto; + } + .form-inline .input-group > .form-control { + width: 100%; + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio, + .form-inline .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .form-inline .radio label, + .form-inline .checkbox label { + padding-left: 0; + } + .form-inline .radio input[type="radio"], + .form-inline .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .form-inline .has-feedback .form-control-feedback { + top: 0; + } +} +.form-horizontal .radio, +.form-horizontal .checkbox, +.form-horizontal .radio-inline, +.form-horizontal .checkbox-inline { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0; +} +.form-horizontal .radio, +.form-horizontal .checkbox { + min-height: 27px; +} +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .form-horizontal .control-label { + padding-top: 7px; + margin-bottom: 0; + text-align: right; + } +} +.form-horizontal .has-feedback .form-control-feedback { + right: 15px; +} +@media (min-width: 768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 11px; + font-size: 18px; + } +} +@media (min-width: 768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + font-size: 12px; + } +} +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: normal; + line-height: 1.42857143; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.btn:focus, +.btn:active:focus, +.btn.active:focus, +.btn.focus, +.btn:active.focus, +.btn.active.focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn:hover, +.btn:focus, +.btn.focus { + color: #333; + text-decoration: none; +} +.btn:active, +.btn.active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn.disabled, +.btn[disabled], +fieldset[disabled] .btn { + cursor: not-allowed; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + box-shadow: none; + opacity: .65; +} +a.btn.disabled, +fieldset[disabled] a.btn { + pointer-events: none; +} +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc; +} +.btn-default:focus, +.btn-default.focus { + color: #333; + background-color: #e6e6e6; + border-color: #8c8c8c; +} +.btn-default:hover { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + color: #333; + background-color: #e6e6e6; + border-color: #adadad; +} +.btn-default:active:hover, +.btn-default.active:hover, +.open > .dropdown-toggle.btn-default:hover, +.btn-default:active:focus, +.btn-default.active:focus, +.open > .dropdown-toggle.btn-default:focus, +.btn-default:active.focus, +.btn-default.active.focus, +.open > .dropdown-toggle.btn-default.focus { + color: #333; + background-color: #d4d4d4; + border-color: #8c8c8c; +} +.btn-default:active, +.btn-default.active, +.open > .dropdown-toggle.btn-default { + background-image: none; +} +.btn-default.disabled:hover, +.btn-default[disabled]:hover, +fieldset[disabled] .btn-default:hover, +.btn-default.disabled:focus, +.btn-default[disabled]:focus, +fieldset[disabled] .btn-default:focus, +.btn-default.disabled.focus, +.btn-default[disabled].focus, +fieldset[disabled] .btn-default.focus { + background-color: #fff; + border-color: #ccc; +} +.btn-default .badge { + color: #fff; + background-color: #333; +} +.btn-primary { + color: #fff; + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary:focus, +.btn-primary.focus { + color: #fff; + background-color: #286090; + border-color: #122b40; +} +.btn-primary:hover { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + color: #fff; + background-color: #286090; + border-color: #204d74; +} +.btn-primary:active:hover, +.btn-primary.active:hover, +.open > .dropdown-toggle.btn-primary:hover, +.btn-primary:active:focus, +.btn-primary.active:focus, +.open > .dropdown-toggle.btn-primary:focus, +.btn-primary:active.focus, +.btn-primary.active.focus, +.open > .dropdown-toggle.btn-primary.focus { + color: #fff; + background-color: #204d74; + border-color: #122b40; +} +.btn-primary:active, +.btn-primary.active, +.open > .dropdown-toggle.btn-primary { + background-image: none; +} +.btn-primary.disabled:hover, +.btn-primary[disabled]:hover, +fieldset[disabled] .btn-primary:hover, +.btn-primary.disabled:focus, +.btn-primary[disabled]:focus, +fieldset[disabled] .btn-primary:focus, +.btn-primary.disabled.focus, +.btn-primary[disabled].focus, +fieldset[disabled] .btn-primary.focus { + background-color: #337ab7; + border-color: #2e6da4; +} +.btn-primary .badge { + color: #337ab7; + background-color: #fff; +} +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success:focus, +.btn-success.focus { + color: #fff; + background-color: #449d44; + border-color: #255625; +} +.btn-success:hover { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + color: #fff; + background-color: #449d44; + border-color: #398439; +} +.btn-success:active:hover, +.btn-success.active:hover, +.open > .dropdown-toggle.btn-success:hover, +.btn-success:active:focus, +.btn-success.active:focus, +.open > .dropdown-toggle.btn-success:focus, +.btn-success:active.focus, +.btn-success.active.focus, +.open > .dropdown-toggle.btn-success.focus { + color: #fff; + background-color: #398439; + border-color: #255625; +} +.btn-success:active, +.btn-success.active, +.open > .dropdown-toggle.btn-success { + background-image: none; +} +.btn-success.disabled:hover, +.btn-success[disabled]:hover, +fieldset[disabled] .btn-success:hover, +.btn-success.disabled:focus, +.btn-success[disabled]:focus, +fieldset[disabled] .btn-success:focus, +.btn-success.disabled.focus, +.btn-success[disabled].focus, +fieldset[disabled] .btn-success.focus { + background-color: #5cb85c; + border-color: #4cae4c; +} +.btn-success .badge { + color: #5cb85c; + background-color: #fff; +} +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info:focus, +.btn-info.focus { + color: #fff; + background-color: #31b0d5; + border-color: #1b6d85; +} +.btn-info:hover { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + color: #fff; + background-color: #31b0d5; + border-color: #269abc; +} +.btn-info:active:hover, +.btn-info.active:hover, +.open > .dropdown-toggle.btn-info:hover, +.btn-info:active:focus, +.btn-info.active:focus, +.open > .dropdown-toggle.btn-info:focus, +.btn-info:active.focus, +.btn-info.active.focus, +.open > .dropdown-toggle.btn-info.focus { + color: #fff; + background-color: #269abc; + border-color: #1b6d85; +} +.btn-info:active, +.btn-info.active, +.open > .dropdown-toggle.btn-info { + background-image: none; +} +.btn-info.disabled:hover, +.btn-info[disabled]:hover, +fieldset[disabled] .btn-info:hover, +.btn-info.disabled:focus, +.btn-info[disabled]:focus, +fieldset[disabled] .btn-info:focus, +.btn-info.disabled.focus, +.btn-info[disabled].focus, +fieldset[disabled] .btn-info.focus { + background-color: #5bc0de; + border-color: #46b8da; +} +.btn-info .badge { + color: #5bc0de; + background-color: #fff; +} +.btn-warning { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning:focus, +.btn-warning.focus { + color: #fff; + background-color: #ec971f; + border-color: #985f0d; +} +.btn-warning:hover { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + color: #fff; + background-color: #ec971f; + border-color: #d58512; +} +.btn-warning:active:hover, +.btn-warning.active:hover, +.open > .dropdown-toggle.btn-warning:hover, +.btn-warning:active:focus, +.btn-warning.active:focus, +.open > .dropdown-toggle.btn-warning:focus, +.btn-warning:active.focus, +.btn-warning.active.focus, +.open > .dropdown-toggle.btn-warning.focus { + color: #fff; + background-color: #d58512; + border-color: #985f0d; +} +.btn-warning:active, +.btn-warning.active, +.open > .dropdown-toggle.btn-warning { + background-image: none; +} +.btn-warning.disabled:hover, +.btn-warning[disabled]:hover, +fieldset[disabled] .btn-warning:hover, +.btn-warning.disabled:focus, +.btn-warning[disabled]:focus, +fieldset[disabled] .btn-warning:focus, +.btn-warning.disabled.focus, +.btn-warning[disabled].focus, +fieldset[disabled] .btn-warning.focus { + background-color: #f0ad4e; + border-color: #eea236; +} +.btn-warning .badge { + color: #f0ad4e; + background-color: #fff; +} +.btn-danger { + color: #fff; + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger:focus, +.btn-danger.focus { + color: #fff; + background-color: #c9302c; + border-color: #761c19; +} +.btn-danger:hover { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + color: #fff; + background-color: #c9302c; + border-color: #ac2925; +} +.btn-danger:active:hover, +.btn-danger.active:hover, +.open > .dropdown-toggle.btn-danger:hover, +.btn-danger:active:focus, +.btn-danger.active:focus, +.open > .dropdown-toggle.btn-danger:focus, +.btn-danger:active.focus, +.btn-danger.active.focus, +.open > .dropdown-toggle.btn-danger.focus { + color: #fff; + background-color: #ac2925; + border-color: #761c19; +} +.btn-danger:active, +.btn-danger.active, +.open > .dropdown-toggle.btn-danger { + background-image: none; +} +.btn-danger.disabled:hover, +.btn-danger[disabled]:hover, +fieldset[disabled] .btn-danger:hover, +.btn-danger.disabled:focus, +.btn-danger[disabled]:focus, +fieldset[disabled] .btn-danger:focus, +.btn-danger.disabled.focus, +.btn-danger[disabled].focus, +fieldset[disabled] .btn-danger.focus { + background-color: #d9534f; + border-color: #d43f3a; +} +.btn-danger .badge { + color: #d9534f; + background-color: #fff; +} +.btn-link { + font-weight: normal; + color: #337ab7; + border-radius: 0; +} +.btn-link, +.btn-link:active, +.btn-link.active, +.btn-link[disabled], +fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none; +} +.btn-link, +.btn-link:hover, +.btn-link:focus, +.btn-link:active { + border-color: transparent; +} +.btn-link:hover, +.btn-link:focus { + color: #23527c; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +fieldset[disabled] .btn-link:hover, +.btn-link[disabled]:focus, +fieldset[disabled] .btn-link:focus { + color: #777; + text-decoration: none; +} +.btn-lg, +.btn-group-lg > .btn { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +.btn-sm, +.btn-group-sm > .btn { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-xs, +.btn-group-xs > .btn { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +.btn-block { + display: block; + width: 100%; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.fade { + opacity: 0; + -webkit-transition: opacity .15s linear; + -o-transition: opacity .15s linear; + transition: opacity .15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + display: none; +} +.collapse.in { + display: block; +} +tr.collapse.in { + display: table-row; +} +tbody.collapse.in { + display: table-row-group; +} +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility; +} +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-top: 4px solid \9; + border-right: 4px solid transparent; + border-left: 4px solid transparent; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle:focus { + outline: 0; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 14px; + text-align: left; + list-style: none; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); + box-shadow: 0 6px 12px rgba(0, 0, 0, .175); +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 1.42857143; + color: #333; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus { + color: #262626; + text-decoration: none; + background-color: #f5f5f5; +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #fff; + text-decoration: none; + background-color: #337ab7; + outline: 0; +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #777; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.open > .dropdown-menu { + display: block; +} +.open > a { + outline: 0; +} +.dropdown-menu-right { + right: 0; + left: auto; +} +.dropdown-menu-left { + right: auto; + left: 0; +} +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #777; + white-space: nowrap; +} +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + content: ""; + border-top: 0; + border-bottom: 4px dashed; + border-bottom: 4px solid \9; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px; +} +@media (min-width: 768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto; + } + .navbar-right .dropdown-menu-left { + right: auto; + left: 0; + } +} +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + float: left; +} +.btn-group > .btn:hover, +.btn-group-vertical > .btn:hover, +.btn-group > .btn:focus, +.btn-group-vertical > .btn:focus, +.btn-group > .btn:active, +.btn-group-vertical > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn.active { + z-index: 2; +} +.btn-group .btn + .btn, +.btn-group .btn + .btn-group, +.btn-group .btn-group + .btn, +.btn-group .btn-group + .btn-group { + margin-left: -1px; +} +.btn-toolbar { + margin-left: -5px; +} +.btn-toolbar .btn, +.btn-toolbar .btn-group, +.btn-toolbar .input-group { + float: left; +} +.btn-toolbar > .btn, +.btn-toolbar > .btn-group, +.btn-toolbar > .input-group { + margin-left: 5px; +} +.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) { + border-radius: 0; +} +.btn-group > .btn:first-child { + margin-left: 0; +} +.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:last-child:not(:first-child), +.btn-group > .dropdown-toggle:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group > .btn-group { + float: left; +} +.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-right: 8px; + padding-left: 8px; +} +.btn-group > .btn-lg + .dropdown-toggle { + padding-right: 12px; + padding-left: 12px; +} +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); +} +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none; +} +.btn .caret { + margin-left: 0; +} +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0; +} +.dropup .btn-lg .caret { + border-width: 0 5px 5px; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group, +.btn-group-vertical > .btn-group > .btn { + display: block; + float: none; + width: 100%; + max-width: 100%; +} +.btn-group-vertical > .btn-group > .btn { + float: none; +} +.btn-group-vertical > .btn + .btn, +.btn-group-vertical > .btn + .btn-group, +.btn-group-vertical > .btn-group + .btn, +.btn-group-vertical > .btn-group + .btn-group { + margin-top: -1px; + margin-left: 0; +} +.btn-group-vertical > .btn:not(:first-child):not(:last-child) { + border-radius: 0; +} +.btn-group-vertical > .btn:first-child:not(:last-child) { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:last-child:not(:first-child) { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn { + border-radius: 0; +} +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child, +.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate; +} +.btn-group-justified > .btn, +.btn-group-justified > .btn-group { + display: table-cell; + float: none; + width: 1%; +} +.btn-group-justified > .btn-group .btn { + width: 100%; +} +.btn-group-justified > .btn-group .dropdown-menu { + left: auto; +} +[data-toggle="buttons"] > .btn input[type="radio"], +[data-toggle="buttons"] > .btn-group > .btn input[type="radio"], +[data-toggle="buttons"] > .btn input[type="checkbox"], +[data-toggle="buttons"] > .btn-group > .btn input[type="checkbox"] { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.input-group { + position: relative; + display: table; + border-collapse: separate; +} +.input-group[class*="col-"] { + float: none; + padding-right: 0; + padding-left: 0; +} +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0; +} +.input-group .form-control:focus { + z-index: 3; +} +.input-group-lg > .form-control, +.input-group-lg > .input-group-addon, +.input-group-lg > .input-group-btn > .btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px; +} +select.input-group-lg > .form-control, +select.input-group-lg > .input-group-addon, +select.input-group-lg > .input-group-btn > .btn { + height: 46px; + line-height: 46px; +} +textarea.input-group-lg > .form-control, +textarea.input-group-lg > .input-group-addon, +textarea.input-group-lg > .input-group-btn > .btn, +select[multiple].input-group-lg > .form-control, +select[multiple].input-group-lg > .input-group-addon, +select[multiple].input-group-lg > .input-group-btn > .btn { + height: auto; +} +.input-group-sm > .form-control, +.input-group-sm > .input-group-addon, +.input-group-sm > .input-group-btn > .btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px; +} +select.input-group-sm > .form-control, +select.input-group-sm > .input-group-addon, +select.input-group-sm > .input-group-btn > .btn { + height: 30px; + line-height: 30px; +} +textarea.input-group-sm > .form-control, +textarea.input-group-sm > .input-group-addon, +textarea.input-group-sm > .input-group-btn > .btn, +select[multiple].input-group-sm > .form-control, +select[multiple].input-group-sm > .input-group-addon, +select[multiple].input-group-sm > .input-group-btn > .btn { + height: auto; +} +.input-group-addon, +.input-group-btn, +.input-group .form-control { + display: table-cell; +} +.input-group-addon:not(:first-child):not(:last-child), +.input-group-btn:not(:first-child):not(:last-child), +.input-group .form-control:not(:first-child):not(:last-child) { + border-radius: 0; +} +.input-group-addon, +.input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle; +} +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: normal; + line-height: 1; + color: #555; + text-align: center; + background-color: #eee; + border: 1px solid #ccc; + border-radius: 4px; +} +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px; +} +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px; +} +.input-group-addon input[type="radio"], +.input-group-addon input[type="checkbox"] { + margin-top: 0; +} +.input-group .form-control:first-child, +.input-group-addon:first-child, +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group > .btn, +.input-group-btn:first-child > .dropdown-toggle, +.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle), +.input-group-btn:last-child > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group-addon:first-child { + border-right: 0; +} +.input-group .form-control:last-child, +.input-group-addon:last-child, +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group > .btn, +.input-group-btn:last-child > .dropdown-toggle, +.input-group-btn:first-child > .btn:not(:first-child), +.input-group-btn:first-child > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group-addon:last-child { + border-left: 0; +} +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap; +} +.input-group-btn > .btn { + position: relative; +} +.input-group-btn > .btn + .btn { + margin-left: -1px; +} +.input-group-btn > .btn:hover, +.input-group-btn > .btn:focus, +.input-group-btn > .btn:active { + z-index: 2; +} +.input-group-btn:first-child > .btn, +.input-group-btn:first-child > .btn-group { + margin-right: -1px; +} +.input-group-btn:last-child > .btn, +.input-group-btn:last-child > .btn-group { + z-index: 2; + margin-left: -1px; +} +.nav { + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.nav > li { + position: relative; + display: block; +} +.nav > li > a { + position: relative; + display: block; + padding: 10px 15px; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eee; +} +.nav > li.disabled > a { + color: #777; +} +.nav > li.disabled > a:hover, +.nav > li.disabled > a:focus { + color: #777; + text-decoration: none; + cursor: not-allowed; + background-color: transparent; +} +.nav .open > a, +.nav .open > a:hover, +.nav .open > a:focus { + background-color: #eee; + border-color: #337ab7; +} +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5; +} +.nav > li > a > img { + max-width: none; +} +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs > li { + float: left; + margin-bottom: -1px; +} +.nav-tabs > li > a { + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover { + border-color: #eee #eee #ddd; +} +.nav-tabs > li.active > a, +.nav-tabs > li.active > a:hover, +.nav-tabs > li.active > a:focus { + color: #555; + cursor: default; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent; +} +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0; +} +.nav-tabs.nav-justified > li { + float: none; +} +.nav-tabs.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-tabs.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-tabs.nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs.nav-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs.nav-justified > .active > a, +.nav-tabs.nav-justified > .active > a:hover, +.nav-tabs.nav-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs.nav-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs.nav-justified > .active > a, + .nav-tabs.nav-justified > .active > a:hover, + .nav-tabs.nav-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.nav-pills > li { + float: left; +} +.nav-pills > li > a { + border-radius: 4px; +} +.nav-pills > li + li { + margin-left: 2px; +} +.nav-pills > li.active > a, +.nav-pills > li.active > a:hover, +.nav-pills > li.active > a:focus { + color: #fff; + background-color: #337ab7; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li + li { + margin-top: 2px; + margin-left: 0; +} +.nav-justified { + width: 100%; +} +.nav-justified > li { + float: none; +} +.nav-justified > li > a { + margin-bottom: 5px; + text-align: center; +} +.nav-justified > .dropdown .dropdown-menu { + top: auto; + left: auto; +} +@media (min-width: 768px) { + .nav-justified > li { + display: table-cell; + width: 1%; + } + .nav-justified > li > a { + margin-bottom: 0; + } +} +.nav-tabs-justified { + border-bottom: 0; +} +.nav-tabs-justified > li > a { + margin-right: 0; + border-radius: 4px; +} +.nav-tabs-justified > .active > a, +.nav-tabs-justified > .active > a:hover, +.nav-tabs-justified > .active > a:focus { + border: 1px solid #ddd; +} +@media (min-width: 768px) { + .nav-tabs-justified > li > a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0; + } + .nav-tabs-justified > .active > a, + .nav-tabs-justified > .active > a:hover, + .nav-tabs-justified > .active > a:focus { + border-bottom-color: #fff; + } +} +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent; +} +@media (min-width: 768px) { + .navbar { + border-radius: 4px; + } +} +@media (min-width: 768px) { + .navbar-header { + float: left; + } +} +.navbar-collapse { + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + -webkit-overflow-scrolling: touch; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); +} +.navbar-collapse.in { + overflow-y: auto; +} +@media (min-width: 768px) { + .navbar-collapse { + width: auto; + border-top: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important; + } + .navbar-collapse.in { + overflow-y: visible; + } + .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + padding-right: 0; + padding-left: 0; + } +} +.navbar-fixed-top .navbar-collapse, +.navbar-fixed-bottom .navbar-collapse { + max-height: 340px; +} +@media (max-device-width: 480px) and (orientation: landscape) { + .navbar-fixed-top .navbar-collapse, + .navbar-fixed-bottom .navbar-collapse { + max-height: 200px; + } +} +.container > .navbar-header, +.container-fluid > .navbar-header, +.container > .navbar-collapse, +.container-fluid > .navbar-collapse { + margin-right: -15px; + margin-left: -15px; +} +@media (min-width: 768px) { + .container > .navbar-header, + .container-fluid > .navbar-header, + .container > .navbar-collapse, + .container-fluid > .navbar-collapse { + margin-right: 0; + margin-left: 0; + } +} +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px; +} +@media (min-width: 768px) { + .navbar-static-top { + border-radius: 0; + } +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; +} +@media (min-width: 768px) { + .navbar-fixed-top, + .navbar-fixed-bottom { + border-radius: 0; + } +} +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px; +} +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0; +} +.navbar-brand { + float: left; + height: 50px; + padding: 15px 15px; + font-size: 18px; + line-height: 20px; +} +.navbar-brand:hover, +.navbar-brand:focus { + text-decoration: none; +} +.navbar-brand > img { + display: block; +} +@media (min-width: 768px) { + .navbar > .container .navbar-brand, + .navbar > .container-fluid .navbar-brand { + margin-left: -15px; + } +} +.navbar-toggle { + position: relative; + float: right; + padding: 9px 10px; + margin-top: 8px; + margin-right: 15px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px; +} +.navbar-toggle:focus { + outline: 0; +} +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px; +} +.navbar-toggle .icon-bar + .icon-bar { + margin-top: 4px; +} +@media (min-width: 768px) { + .navbar-toggle { + display: none; + } +} +.navbar-nav { + margin: 7.5px -15px; +} +.navbar-nav > li > a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px; +} +@media (max-width: 767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } + .navbar-nav .open .dropdown-menu > li > a, + .navbar-nav .open .dropdown-menu .dropdown-header { + padding: 5px 15px 5px 25px; + } + .navbar-nav .open .dropdown-menu > li > a { + line-height: 20px; + } + .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-nav .open .dropdown-menu > li > a:focus { + background-image: none; + } +} +@media (min-width: 768px) { + .navbar-nav { + float: left; + margin: 0; + } + .navbar-nav > li { + float: left; + } + .navbar-nav > li > a { + padding-top: 15px; + padding-bottom: 15px; + } +} +.navbar-form { + padding: 10px 15px; + margin-top: 8px; + margin-right: -15px; + margin-bottom: 8px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1); +} +@media (min-width: 768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle; + } + .navbar-form .form-control-static { + display: inline-block; + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle; + } + .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn, + .navbar-form .input-group .form-control { + width: auto; + } + .navbar-form .input-group > .form-control { + width: 100%; + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio, + .navbar-form .checkbox { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle; + } + .navbar-form .radio label, + .navbar-form .checkbox label { + padding-left: 0; + } + .navbar-form .radio input[type="radio"], + .navbar-form .checkbox input[type="checkbox"] { + position: relative; + margin-left: 0; + } + .navbar-form .has-feedback .form-control-feedback { + top: 0; + } +} +@media (max-width: 767px) { + .navbar-form .form-group { + margin-bottom: 5px; + } + .navbar-form .form-group:last-child { + margin-bottom: 0; + } +} +@media (min-width: 768px) { + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + } +} +.navbar-nav > li > .dropdown-menu { + margin-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu { + margin-bottom: 0; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px; +} +.navbar-btn.btn-sm { + margin-top: 10px; + margin-bottom: 10px; +} +.navbar-btn.btn-xs { + margin-top: 14px; + margin-bottom: 14px; +} +.navbar-text { + margin-top: 15px; + margin-bottom: 15px; +} +@media (min-width: 768px) { + .navbar-text { + float: left; + margin-right: 15px; + margin-left: 15px; + } +} +@media (min-width: 768px) { + .navbar-left { + float: left !important; + } + .navbar-right { + float: right !important; + margin-right: -15px; + } + .navbar-right ~ .navbar-right { + margin-right: 0; + } +} +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7; +} +.navbar-default .navbar-brand { + color: #777; +} +.navbar-default .navbar-brand:hover, +.navbar-default .navbar-brand:focus { + color: #5e5e5e; + background-color: transparent; +} +.navbar-default .navbar-text { + color: #777; +} +.navbar-default .navbar-nav > li > a { + color: #777; +} +.navbar-default .navbar-nav > li > a:hover, +.navbar-default .navbar-nav > li > a:focus { + color: #333; + background-color: transparent; +} +.navbar-default .navbar-nav > .active > a, +.navbar-default .navbar-nav > .active > a:hover, +.navbar-default .navbar-nav > .active > a:focus { + color: #555; + background-color: #e7e7e7; +} +.navbar-default .navbar-nav > .disabled > a, +.navbar-default .navbar-nav > .disabled > a:hover, +.navbar-default .navbar-nav > .disabled > a:focus { + color: #ccc; + background-color: transparent; +} +.navbar-default .navbar-toggle { + border-color: #ddd; +} +.navbar-default .navbar-toggle:hover, +.navbar-default .navbar-toggle:focus { + background-color: #ddd; +} +.navbar-default .navbar-toggle .icon-bar { + background-color: #888; +} +.navbar-default .navbar-collapse, +.navbar-default .navbar-form { + border-color: #e7e7e7; +} +.navbar-default .navbar-nav > .open > a, +.navbar-default .navbar-nav > .open > a:hover, +.navbar-default .navbar-nav > .open > a:focus { + color: #555; + background-color: #e7e7e7; +} +@media (max-width: 767px) { + .navbar-default .navbar-nav .open .dropdown-menu > li > a { + color: #777; + } + .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus { + color: #333; + background-color: transparent; + } + .navbar-default .navbar-nav .open .dropdown-menu > .active > a, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #555; + background-color: #e7e7e7; + } + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #ccc; + background-color: transparent; + } +} +.navbar-default .navbar-link { + color: #777; +} +.navbar-default .navbar-link:hover { + color: #333; +} +.navbar-default .btn-link { + color: #777; +} +.navbar-default .btn-link:hover, +.navbar-default .btn-link:focus { + color: #333; +} +.navbar-default .btn-link[disabled]:hover, +fieldset[disabled] .navbar-default .btn-link:hover, +.navbar-default .btn-link[disabled]:focus, +fieldset[disabled] .navbar-default .btn-link:focus { + color: #ccc; +} +.navbar-inverse { + background-color: #222; + border-color: #080808; +} +.navbar-inverse .navbar-brand { + color: #9d9d9d; +} +.navbar-inverse .navbar-brand:hover, +.navbar-inverse .navbar-brand:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-text { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a { + color: #9d9d9d; +} +.navbar-inverse .navbar-nav > li > a:hover, +.navbar-inverse .navbar-nav > li > a:focus { + color: #fff; + background-color: transparent; +} +.navbar-inverse .navbar-nav > .active > a, +.navbar-inverse .navbar-nav > .active > a:hover, +.navbar-inverse .navbar-nav > .active > a:focus { + color: #fff; + background-color: #080808; +} +.navbar-inverse .navbar-nav > .disabled > a, +.navbar-inverse .navbar-nav > .disabled > a:hover, +.navbar-inverse .navbar-nav > .disabled > a:focus { + color: #444; + background-color: transparent; +} +.navbar-inverse .navbar-toggle { + border-color: #333; +} +.navbar-inverse .navbar-toggle:hover, +.navbar-inverse .navbar-toggle:focus { + background-color: #333; +} +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #fff; +} +.navbar-inverse .navbar-collapse, +.navbar-inverse .navbar-form { + border-color: #101010; +} +.navbar-inverse .navbar-nav > .open > a, +.navbar-inverse .navbar-nav > .open > a:hover, +.navbar-inverse .navbar-nav > .open > a:focus { + color: #fff; + background-color: #080808; +} +@media (max-width: 767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header { + border-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a { + color: #9d9d9d; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus { + color: #fff; + background-color: transparent; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus { + color: #fff; + background-color: #080808; + } + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, + .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus { + color: #444; + background-color: transparent; + } +} +.navbar-inverse .navbar-link { + color: #9d9d9d; +} +.navbar-inverse .navbar-link:hover { + color: #fff; +} +.navbar-inverse .btn-link { + color: #9d9d9d; +} +.navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link:focus { + color: #fff; +} +.navbar-inverse .btn-link[disabled]:hover, +fieldset[disabled] .navbar-inverse .btn-link:hover, +.navbar-inverse .btn-link[disabled]:focus, +fieldset[disabled] .navbar-inverse .btn-link:focus { + color: #444; +} +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px; +} +.breadcrumb > li { + display: inline-block; +} +.breadcrumb > li + li:before { + padding: 0 5px; + color: #ccc; + content: "/\00a0"; +} +.breadcrumb > .active { + color: #777; +} +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px; +} +.pagination > li { + display: inline; +} +.pagination > li > a, +.pagination > li > span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.42857143; + color: #337ab7; + text-decoration: none; + background-color: #fff; + border: 1px solid #ddd; +} +.pagination > li:first-child > a, +.pagination > li:first-child > span { + margin-left: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +.pagination > li:last-child > a, +.pagination > li:last-child > span { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +.pagination > li > a:hover, +.pagination > li > span:hover, +.pagination > li > a:focus, +.pagination > li > span:focus { + z-index: 2; + color: #23527c; + background-color: #eee; + border-color: #ddd; +} +.pagination > .active > a, +.pagination > .active > span, +.pagination > .active > a:hover, +.pagination > .active > span:hover, +.pagination > .active > a:focus, +.pagination > .active > span:focus { + z-index: 3; + color: #fff; + cursor: default; + background-color: #337ab7; + border-color: #337ab7; +} +.pagination > .disabled > span, +.pagination > .disabled > span:hover, +.pagination > .disabled > span:focus, +.pagination > .disabled > a, +.pagination > .disabled > a:hover, +.pagination > .disabled > a:focus { + color: #777; + cursor: not-allowed; + background-color: #fff; + border-color: #ddd; +} +.pagination-lg > li > a, +.pagination-lg > li > span { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; +} +.pagination-lg > li:first-child > a, +.pagination-lg > li:first-child > span { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px; +} +.pagination-lg > li:last-child > a, +.pagination-lg > li:last-child > span { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px; +} +.pagination-sm > li > a, +.pagination-sm > li > span { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; +} +.pagination-sm > li:first-child > a, +.pagination-sm > li:first-child > span { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px; +} +.pagination-sm > li:last-child > a, +.pagination-sm > li:last-child > span { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px; +} +.pager { + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #eee; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #777; + cursor: not-allowed; + background-color: #fff; +} +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em; +} +a.label:hover, +a.label:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.label:empty { + display: none; +} +.btn .label { + position: relative; + top: -1px; +} +.label-default { + background-color: #777; +} +.label-default[href]:hover, +.label-default[href]:focus { + background-color: #5e5e5e; +} +.label-primary { + background-color: #337ab7; +} +.label-primary[href]:hover, +.label-primary[href]:focus { + background-color: #286090; +} +.label-success { + background-color: #5cb85c; +} +.label-success[href]:hover, +.label-success[href]:focus { + background-color: #449d44; +} +.label-info { + background-color: #5bc0de; +} +.label-info[href]:hover, +.label-info[href]:focus { + background-color: #31b0d5; +} +.label-warning { + background-color: #f0ad4e; +} +.label-warning[href]:hover, +.label-warning[href]:focus { + background-color: #ec971f; +} +.label-danger { + background-color: #d9534f; +} +.label-danger[href]:hover, +.label-danger[href]:focus { + background-color: #c9302c; +} +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: bold; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: middle; + background-color: #777; + border-radius: 10px; +} +.badge:empty { + display: none; +} +.btn .badge { + position: relative; + top: -1px; +} +.btn-xs .badge, +.btn-group-xs > .btn .badge { + top: 0; + padding: 1px 5px; +} +a.badge:hover, +a.badge:focus { + color: #fff; + text-decoration: none; + cursor: pointer; +} +.list-group-item.active > .badge, +.nav-pills > .active > a > .badge { + color: #337ab7; + background-color: #fff; +} +.list-group-item > .badge { + float: right; +} +.list-group-item > .badge + .badge { + margin-right: 5px; +} +.nav-pills > li > a > .badge { + margin-left: 3px; +} +.jumbotron { + padding-top: 30px; + padding-bottom: 30px; + margin-bottom: 30px; + color: inherit; + background-color: #eee; +} +.jumbotron h1, +.jumbotron .h1 { + color: inherit; +} +.jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200; +} +.jumbotron > hr { + border-top-color: #d5d5d5; +} +.container .jumbotron, +.container-fluid .jumbotron { + padding-right: 15px; + padding-left: 15px; + border-radius: 6px; +} +.jumbotron .container { + max-width: 100%; +} +@media screen and (min-width: 768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px; + } + .container .jumbotron, + .container-fluid .jumbotron { + padding-right: 60px; + padding-left: 60px; + } + .jumbotron h1, + .jumbotron .h1 { + font-size: 63px; + } +} +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: border .2s ease-in-out; + -o-transition: border .2s ease-in-out; + transition: border .2s ease-in-out; +} +.thumbnail > img, +.thumbnail a > img { + margin-right: auto; + margin-left: auto; +} +a.thumbnail:hover, +a.thumbnail:focus, +a.thumbnail.active { + border-color: #337ab7; +} +.thumbnail .caption { + padding: 9px; + color: #333; +} +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px; +} +.alert h4 { + margin-top: 0; + color: inherit; +} +.alert .alert-link { + font-weight: bold; +} +.alert > p, +.alert > ul { + margin-bottom: 0; +} +.alert > p + p { + margin-top: 5px; +} +.alert-dismissable, +.alert-dismissible { + padding-right: 35px; +} +.alert-dismissable .close, +.alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit; +} +.alert-success { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.alert-success hr { + border-top-color: #c9e2b3; +} +.alert-success .alert-link { + color: #2b542c; +} +.alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.alert-info hr { + border-top-color: #a6e1ec; +} +.alert-info .alert-link { + color: #245269; +} +.alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.alert-warning hr { + border-top-color: #f7e1b5; +} +.alert-warning .alert-link { + color: #66512c; +} +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.alert-danger hr { + border-top-color: #e4b9c0; +} +.alert-danger .alert-link { + color: #843534; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); +} +.progress-bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #fff; + text-align: center; + background-color: #337ab7; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + -webkit-transition: width .6s ease; + -o-transition: width .6s ease; + transition: width .6s ease; +} +.progress-striped .progress-bar, +.progress-bar-striped { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .progress-bar, +.progress-bar.active { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-bar-success { + background-color: #5cb85c; +} +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-info { + background-color: #5bc0de; +} +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-warning { + background-color: #f0ad4e; +} +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.progress-bar-danger { + background-color: #d9534f; +} +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); +} +.media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media, +.media-body { + overflow: hidden; + zoom: 1; +} +.media-body { + width: 10000px; +} +.media-object { + display: block; +} +.media-object.img-thumbnail { + max-width: none; +} +.media-right, +.media > .pull-right { + padding-left: 10px; +} +.media-left, +.media > .pull-left { + padding-right: 10px; +} +.media-left, +.media-right, +.media-body { + display: table-cell; + vertical-align: top; +} +.media-middle { + vertical-align: middle; +} +.media-bottom { + vertical-align: bottom; +} +.media-heading { + margin-top: 0; + margin-bottom: 5px; +} +.media-list { + padding-left: 0; + list-style: none; +} +.list-group { + padding-left: 0; + margin-bottom: 20px; +} +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd; +} +.list-group-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px; +} +a.list-group-item, +button.list-group-item { + color: #555; +} +a.list-group-item .list-group-item-heading, +button.list-group-item .list-group-item-heading { + color: #333; +} +a.list-group-item:hover, +button.list-group-item:hover, +a.list-group-item:focus, +button.list-group-item:focus { + color: #555; + text-decoration: none; + background-color: #f5f5f5; +} +button.list-group-item { + width: 100%; + text-align: left; +} +.list-group-item.disabled, +.list-group-item.disabled:hover, +.list-group-item.disabled:focus { + color: #777; + cursor: not-allowed; + background-color: #eee; +} +.list-group-item.disabled .list-group-item-heading, +.list-group-item.disabled:hover .list-group-item-heading, +.list-group-item.disabled:focus .list-group-item-heading { + color: inherit; +} +.list-group-item.disabled .list-group-item-text, +.list-group-item.disabled:hover .list-group-item-text, +.list-group-item.disabled:focus .list-group-item-text { + color: #777; +} +.list-group-item.active, +.list-group-item.active:hover, +.list-group-item.active:focus { + z-index: 2; + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.list-group-item.active .list-group-item-heading, +.list-group-item.active:hover .list-group-item-heading, +.list-group-item.active:focus .list-group-item-heading, +.list-group-item.active .list-group-item-heading > small, +.list-group-item.active:hover .list-group-item-heading > small, +.list-group-item.active:focus .list-group-item-heading > small, +.list-group-item.active .list-group-item-heading > .small, +.list-group-item.active:hover .list-group-item-heading > .small, +.list-group-item.active:focus .list-group-item-heading > .small { + color: inherit; +} +.list-group-item.active .list-group-item-text, +.list-group-item.active:hover .list-group-item-text, +.list-group-item.active:focus .list-group-item-text { + color: #c7ddef; +} +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8; +} +a.list-group-item-success, +button.list-group-item-success { + color: #3c763d; +} +a.list-group-item-success .list-group-item-heading, +button.list-group-item-success .list-group-item-heading { + color: inherit; +} +a.list-group-item-success:hover, +button.list-group-item-success:hover, +a.list-group-item-success:focus, +button.list-group-item-success:focus { + color: #3c763d; + background-color: #d0e9c6; +} +a.list-group-item-success.active, +button.list-group-item-success.active, +a.list-group-item-success.active:hover, +button.list-group-item-success.active:hover, +a.list-group-item-success.active:focus, +button.list-group-item-success.active:focus { + color: #fff; + background-color: #3c763d; + border-color: #3c763d; +} +.list-group-item-info { + color: #31708f; + background-color: #d9edf7; +} +a.list-group-item-info, +button.list-group-item-info { + color: #31708f; +} +a.list-group-item-info .list-group-item-heading, +button.list-group-item-info .list-group-item-heading { + color: inherit; +} +a.list-group-item-info:hover, +button.list-group-item-info:hover, +a.list-group-item-info:focus, +button.list-group-item-info:focus { + color: #31708f; + background-color: #c4e3f3; +} +a.list-group-item-info.active, +button.list-group-item-info.active, +a.list-group-item-info.active:hover, +button.list-group-item-info.active:hover, +a.list-group-item-info.active:focus, +button.list-group-item-info.active:focus { + color: #fff; + background-color: #31708f; + border-color: #31708f; +} +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3; +} +a.list-group-item-warning, +button.list-group-item-warning { + color: #8a6d3b; +} +a.list-group-item-warning .list-group-item-heading, +button.list-group-item-warning .list-group-item-heading { + color: inherit; +} +a.list-group-item-warning:hover, +button.list-group-item-warning:hover, +a.list-group-item-warning:focus, +button.list-group-item-warning:focus { + color: #8a6d3b; + background-color: #faf2cc; +} +a.list-group-item-warning.active, +button.list-group-item-warning.active, +a.list-group-item-warning.active:hover, +button.list-group-item-warning.active:hover, +a.list-group-item-warning.active:focus, +button.list-group-item-warning.active:focus { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b; +} +.list-group-item-danger { + color: #a94442; + background-color: #f2dede; +} +a.list-group-item-danger, +button.list-group-item-danger { + color: #a94442; +} +a.list-group-item-danger .list-group-item-heading, +button.list-group-item-danger .list-group-item-heading { + color: inherit; +} +a.list-group-item-danger:hover, +button.list-group-item-danger:hover, +a.list-group-item-danger:focus, +button.list-group-item-danger:focus { + color: #a94442; + background-color: #ebcccc; +} +a.list-group-item-danger.active, +button.list-group-item-danger.active, +a.list-group-item-danger.active:hover, +button.list-group-item-danger.active:hover, +a.list-group-item-danger.active:focus, +button.list-group-item-danger.active:focus { + color: #fff; + background-color: #a94442; + border-color: #a94442; +} +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px; +} +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3; +} +.panel { + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: 0 1px 1px rgba(0, 0, 0, .05); +} +.panel-body { + padding: 15px; +} +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel-heading > .dropdown .dropdown-toggle { + color: inherit; +} +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit; +} +.panel-title > a, +.panel-title > small, +.panel-title > .small, +.panel-title > small > a, +.panel-title > .small > a { + color: inherit; +} +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .list-group, +.panel > .panel-collapse > .list-group { + margin-bottom: 0; +} +.panel > .list-group .list-group-item, +.panel > .panel-collapse > .list-group .list-group-item { + border-width: 1px 0; + border-radius: 0; +} +.panel > .list-group:first-child .list-group-item:first-child, +.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child { + border-top: 0; + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .list-group:last-child .list-group-item:last-child, +.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child { + border-top-left-radius: 0; + border-top-right-radius: 0; +} +.panel-heading + .list-group .list-group-item:first-child { + border-top-width: 0; +} +.list-group + .panel-footer { + border-top-width: 0; +} +.panel > .table, +.panel > .table-responsive > .table, +.panel > .panel-collapse > .table { + margin-bottom: 0; +} +.panel > .table caption, +.panel > .table-responsive > .table caption, +.panel > .panel-collapse > .table caption { + padding-right: 15px; + padding-left: 15px; +} +.panel > .table:first-child, +.panel > .table-responsive:first-child > .table:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child { + border-top-left-radius: 3px; + border-top-right-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child { + border-top-left-radius: 3px; +} +.panel > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child, +.panel > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child, +.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child, +.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child { + border-top-right-radius: 3px; +} +.panel > .table:last-child, +.panel > .table-responsive:last-child > .table:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child { + border-bottom-left-radius: 3px; +} +.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child, +.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child, +.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child, +.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child { + border-bottom-right-radius: 3px; +} +.panel > .panel-body + .table, +.panel > .panel-body + .table-responsive, +.panel > .table + .panel-body, +.panel > .table-responsive + .panel-body { + border-top: 1px solid #ddd; +} +.panel > .table > tbody:first-child > tr:first-child th, +.panel > .table > tbody:first-child > tr:first-child td { + border-top: 0; +} +.panel > .table-bordered, +.panel > .table-responsive > .table-bordered { + border: 0; +} +.panel > .table-bordered > thead > tr > th:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:first-child, +.panel > .table-bordered > tbody > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child, +.panel > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child, +.panel > .table-bordered > thead > tr > td:first-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:first-child, +.panel > .table-bordered > tbody > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child, +.panel > .table-bordered > tfoot > tr > td:first-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child { + border-left: 0; +} +.panel > .table-bordered > thead > tr > th:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > th:last-child, +.panel > .table-bordered > tbody > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child, +.panel > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child, +.panel > .table-bordered > thead > tr > td:last-child, +.panel > .table-responsive > .table-bordered > thead > tr > td:last-child, +.panel > .table-bordered > tbody > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child, +.panel > .table-bordered > tfoot > tr > td:last-child, +.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child { + border-right: 0; +} +.panel > .table-bordered > thead > tr:first-child > td, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > td, +.panel > .table-bordered > tbody > tr:first-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td, +.panel > .table-bordered > thead > tr:first-child > th, +.panel > .table-responsive > .table-bordered > thead > tr:first-child > th, +.panel > .table-bordered > tbody > tr:first-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th { + border-bottom: 0; +} +.panel > .table-bordered > tbody > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td, +.panel > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td, +.panel > .table-bordered > tbody > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th, +.panel > .table-bordered > tfoot > tr:last-child > th, +.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th { + border-bottom: 0; +} +.panel > .table-responsive { + margin-bottom: 0; + border: 0; +} +.panel-group { + margin-bottom: 20px; +} +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px; +} +.panel-group .panel + .panel { + margin-top: 5px; +} +.panel-group .panel-heading { + border-bottom: 0; +} +.panel-group .panel-heading + .panel-collapse > .panel-body, +.panel-group .panel-heading + .panel-collapse > .list-group { + border-top: 1px solid #ddd; +} +.panel-group .panel-footer { + border-top: 0; +} +.panel-group .panel-footer + .panel-collapse .panel-body { + border-bottom: 1px solid #ddd; +} +.panel-default { + border-color: #ddd; +} +.panel-default > .panel-heading { + color: #333; + background-color: #f5f5f5; + border-color: #ddd; +} +.panel-default > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ddd; +} +.panel-default > .panel-heading .badge { + color: #f5f5f5; + background-color: #333; +} +.panel-default > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ddd; +} +.panel-primary { + border-color: #337ab7; +} +.panel-primary > .panel-heading { + color: #fff; + background-color: #337ab7; + border-color: #337ab7; +} +.panel-primary > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #337ab7; +} +.panel-primary > .panel-heading .badge { + color: #337ab7; + background-color: #fff; +} +.panel-primary > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #337ab7; +} +.panel-success { + border-color: #d6e9c6; +} +.panel-success > .panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6; +} +.panel-success > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #d6e9c6; +} +.panel-success > .panel-heading .badge { + color: #dff0d8; + background-color: #3c763d; +} +.panel-success > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #d6e9c6; +} +.panel-info { + border-color: #bce8f1; +} +.panel-info > .panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1; +} +.panel-info > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #bce8f1; +} +.panel-info > .panel-heading .badge { + color: #d9edf7; + background-color: #31708f; +} +.panel-info > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #bce8f1; +} +.panel-warning { + border-color: #faebcc; +} +.panel-warning > .panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc; +} +.panel-warning > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #faebcc; +} +.panel-warning > .panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b; +} +.panel-warning > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #faebcc; +} +.panel-danger { + border-color: #ebccd1; +} +.panel-danger > .panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1; +} +.panel-danger > .panel-heading + .panel-collapse > .panel-body { + border-top-color: #ebccd1; +} +.panel-danger > .panel-heading .badge { + color: #f2dede; + background-color: #a94442; +} +.panel-danger > .panel-footer + .panel-collapse > .panel-body { + border-bottom-color: #ebccd1; +} +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden; +} +.embed-responsive .embed-responsive-item, +.embed-responsive iframe, +.embed-responsive embed, +.embed-responsive object, +.embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; +} +.embed-responsive-16by9 { + padding-bottom: 56.25%; +} +.embed-responsive-4by3 { + padding-bottom: 75%; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, .15); +} +.well-lg { + padding: 24px; + border-radius: 6px; +} +.well-sm { + padding: 9px; + border-radius: 3px; +} +.close { + float: right; + font-size: 21px; + font-weight: bold; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + filter: alpha(opacity=20); + opacity: .2; +} +.close:hover, +.close:focus { + color: #000; + text-decoration: none; + cursor: pointer; + filter: alpha(opacity=50); + opacity: .5; +} +button.close { + -webkit-appearance: none; + padding: 0; + cursor: pointer; + background: transparent; + border: 0; +} +.modal-open { + overflow: hidden; +} +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + display: none; + overflow: hidden; + -webkit-overflow-scrolling: touch; + outline: 0; +} +.modal.fade .modal-dialog { + -webkit-transition: -webkit-transform .3s ease-out; + -o-transition: -o-transform .3s ease-out; + transition: transform .3s ease-out; + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%); +} +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0); +} +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto; +} +.modal-dialog { + position: relative; + width: auto; + margin: 10px; +} +.modal-content { + position: relative; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + outline: 0; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); + box-shadow: 0 3px 9px rgba(0, 0, 0, .5); +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000; +} +.modal-backdrop.fade { + filter: alpha(opacity=0); + opacity: 0; +} +.modal-backdrop.in { + filter: alpha(opacity=50); + opacity: .5; +} +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5; +} +.modal-header .close { + margin-top: -2px; +} +.modal-title { + margin: 0; + line-height: 1.42857143; +} +.modal-body { + position: relative; + padding: 15px; +} +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5; +} +.modal-footer .btn + .btn { + margin-bottom: 0; + margin-left: 5px; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll; +} +@media (min-width: 768px) { + .modal-dialog { + width: 600px; + margin: 30px auto; + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + } + .modal-sm { + width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg { + width: 900px; + } +} +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 12px; + font-style: normal; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + filter: alpha(opacity=0); + opacity: 0; + + line-break: auto; +} +.tooltip.in { + filter: alpha(opacity=90); + opacity: .9; +} +.tooltip.top { + padding: 5px 0; + margin-top: -3px; +} +.tooltip.right { + padding: 0 5px; + margin-left: 3px; +} +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px; +} +.tooltip.left { + padding: 0 5px; + margin-left: -3px; +} +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 4px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-left .tooltip-arrow { + right: 5px; + bottom: 0; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + font-style: normal; + font-weight: normal; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + + line-break: auto; +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0; +} +.popover-content { + padding: 9px 14px; +} +.popover > .arrow, +.popover > .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover > .arrow { + border-width: 11px; +} +.popover > .arrow:after { + content: ""; + border-width: 10px; +} +.popover.top > .arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, .25); + border-bottom-width: 0; +} +.popover.top > .arrow:after { + bottom: 1px; + margin-left: -10px; + content: " "; + border-top-color: #fff; + border-bottom-width: 0; +} +.popover.right > .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, .25); + border-left-width: 0; +} +.popover.right > .arrow:after { + bottom: -10px; + left: 1px; + content: " "; + border-right-color: #fff; + border-left-width: 0; +} +.popover.bottom > .arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, .25); +} +.popover.bottom > .arrow:after { + top: 1px; + margin-left: -10px; + content: " "; + border-top-width: 0; + border-bottom-color: #fff; +} +.popover.left > .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, .25); +} +.popover.left > .arrow:after { + right: 1px; + bottom: -10px; + content: " "; + border-right-width: 0; + border-left-color: #fff; +} +.carousel { + position: relative; +} +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner > .item { + position: relative; + display: none; + -webkit-transition: .6s ease-in-out left; + -o-transition: .6s ease-in-out left; + transition: .6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + line-height: 1; +} +@media all and (transform-3d), (-webkit-transform-3d) { + .carousel-inner > .item { + -webkit-transition: -webkit-transform .6s ease-in-out; + -o-transition: -o-transform .6s ease-in-out; + transition: transform .6s ease-in-out; + + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000px; + perspective: 1000px; + } + .carousel-inner > .item.next, + .carousel-inner > .item.active.right { + left: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + .carousel-inner > .item.prev, + .carousel-inner > .item.active.left { + left: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + .carousel-inner > .item.next.left, + .carousel-inner > .item.prev.right, + .carousel-inner > .item.active { + left: 0; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); + background-color: rgba(0, 0, 0, 0); + filter: alpha(opacity=50); + opacity: .5; +} +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control.right { + right: 0; + left: auto; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1); + background-repeat: repeat-x; +} +.carousel-control:hover, +.carousel-control:focus { + color: #fff; + text-decoration: none; + filter: alpha(opacity=90); + outline: 0; + opacity: .9; +} +.carousel-control .icon-prev, +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-left, +.carousel-control .glyphicon-chevron-right { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; + margin-top: -10px; +} +.carousel-control .icon-prev, +.carousel-control .glyphicon-chevron-left { + left: 50%; + margin-left: -10px; +} +.carousel-control .icon-next, +.carousel-control .glyphicon-chevron-right { + right: 50%; + margin-right: -10px; +} +.carousel-control .icon-prev, +.carousel-control .icon-next { + width: 20px; + height: 20px; + font-family: serif; + line-height: 1; +} +.carousel-control .icon-prev:before { + content: '\2039'; +} +.carousel-control .icon-next:before { + content: '\203a'; +} +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none; +} +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + background-color: #000 \9; + background-color: rgba(0, 0, 0, 0); + border: 1px solid #fff; + border-radius: 10px; +} +.carousel-indicators .active { + width: 12px; + height: 12px; + margin: 0; + background-color: #fff; +} +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); +} +.carousel-caption .btn { + text-shadow: none; +} +@media screen and (min-width: 768px) { + .carousel-control .glyphicon-chevron-left, + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-prev, + .carousel-control .icon-next { + width: 30px; + height: 30px; + margin-top: -10px; + font-size: 30px; + } + .carousel-control .glyphicon-chevron-left, + .carousel-control .icon-prev { + margin-left: -10px; + } + .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next { + margin-right: -10px; + } + .carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px; + } + .carousel-indicators { + bottom: 20px; + } +} +.clearfix:before, +.clearfix:after, +.dl-horizontal dd:before, +.dl-horizontal dd:after, +.container:before, +.container:after, +.container-fluid:before, +.container-fluid:after, +.row:before, +.row:after, +.form-horizontal .form-group:before, +.form-horizontal .form-group:after, +.btn-toolbar:before, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:before, +.btn-group-vertical > .btn-group:after, +.nav:before, +.nav:after, +.navbar:before, +.navbar:after, +.navbar-header:before, +.navbar-header:after, +.navbar-collapse:before, +.navbar-collapse:after, +.pager:before, +.pager:after, +.panel-body:before, +.panel-body:after, +.modal-header:before, +.modal-header:after, +.modal-footer:before, +.modal-footer:after { + display: table; + content: " "; +} +.clearfix:after, +.dl-horizontal dd:after, +.container:after, +.container-fluid:after, +.row:after, +.form-horizontal .form-group:after, +.btn-toolbar:after, +.btn-group-vertical > .btn-group:after, +.nav:after, +.navbar:after, +.navbar-header:after, +.navbar-collapse:after, +.pager:after, +.panel-body:after, +.modal-header:after, +.modal-footer:after { + clear: both; +} +.center-block { + display: block; + margin-right: auto; + margin-left: auto; +} +.pull-right { + float: right !important; +} +.pull-left { + float: left !important; +} +.hide { + display: none !important; +} +.show { + display: block !important; +} +.invisible { + visibility: hidden; +} +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.hidden { + display: none !important; +} +.affix { + position: fixed; +} +@-ms-viewport { + width: device-width; +} +.visible-xs, +.visible-sm, +.visible-md, +.visible-lg { + display: none !important; +} +.visible-xs-block, +.visible-xs-inline, +.visible-xs-inline-block, +.visible-sm-block, +.visible-sm-inline, +.visible-sm-inline-block, +.visible-md-block, +.visible-md-inline, +.visible-md-inline-block, +.visible-lg-block, +.visible-lg-inline, +.visible-lg-inline-block { + display: none !important; +} +@media (max-width: 767px) { + .visible-xs { + display: block !important; + } + table.visible-xs { + display: table !important; + } + tr.visible-xs { + display: table-row !important; + } + th.visible-xs, + td.visible-xs { + display: table-cell !important; + } +} +@media (max-width: 767px) { + .visible-xs-block { + display: block !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline { + display: inline !important; + } +} +@media (max-width: 767px) { + .visible-xs-inline-block { + display: inline-block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm { + display: block !important; + } + table.visible-sm { + display: table !important; + } + tr.visible-sm { + display: table-row !important; + } + th.visible-sm, + td.visible-sm { + display: table-cell !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-block { + display: block !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline { + display: inline !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .visible-sm-inline-block { + display: inline-block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md { + display: block !important; + } + table.visible-md { + display: table !important; + } + tr.visible-md { + display: table-row !important; + } + th.visible-md, + td.visible-md { + display: table-cell !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-block { + display: block !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline { + display: inline !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .visible-md-inline-block { + display: inline-block !important; + } +} +@media (min-width: 1200px) { + .visible-lg { + display: block !important; + } + table.visible-lg { + display: table !important; + } + tr.visible-lg { + display: table-row !important; + } + th.visible-lg, + td.visible-lg { + display: table-cell !important; + } +} +@media (min-width: 1200px) { + .visible-lg-block { + display: block !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline { + display: inline !important; + } +} +@media (min-width: 1200px) { + .visible-lg-inline-block { + display: inline-block !important; + } +} +@media (max-width: 767px) { + .hidden-xs { + display: none !important; + } +} +@media (min-width: 768px) and (max-width: 991px) { + .hidden-sm { + display: none !important; + } +} +@media (min-width: 992px) and (max-width: 1199px) { + .hidden-md { + display: none !important; + } +} +@media (min-width: 1200px) { + .hidden-lg { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: block !important; + } + table.visible-print { + display: table !important; + } + tr.visible-print { + display: table-row !important; + } + th.visible-print, + td.visible-print { + display: table-cell !important; + } +} +.visible-print-block { + display: none !important; +} +@media print { + .visible-print-block { + display: block !important; + } +} +.visible-print-inline { + display: none !important; +} +@media print { + .visible-print-inline { + display: inline !important; + } +} +.visible-print-inline-block { + display: none !important; +} +@media print { + .visible-print-inline-block { + display: inline-block !important; + } +} +@media print { + .hidden-print { + display: none !important; + } +} +/*# sourceMappingURL=bootstrap.css.map */ diff --git a/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/css/bootstrap.css.map b/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/css/bootstrap.css.map new file mode 100644 index 0000000..b2ec0bf --- /dev/null +++ b/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/css/bootstrap.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["bootstrap.css","less/normalize.less","less/print.less","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/mixins/reset-text.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,4EAA4E;ACG5E;EACE,wBAAA;EACA,2BAAA;EACA,+BAAA;CDDD;ACQD;EACE,UAAA;CDND;ACmBD;;;;;;;;;;;;;EAaE,eAAA;CDjBD;ACyBD;;;;EAIE,sBAAA;EACA,yBAAA;CDvBD;AC+BD;EACE,cAAA;EACA,UAAA;CD7BD;ACqCD;;EAEE,cAAA;CDnCD;AC6CD;EACE,8BAAA;CD3CD;ACmDD;;EAEE,WAAA;CDjDD;AC2DD;EACE,0BAAA;CDzDD;ACgED;;EAEE,kBAAA;CD9DD;ACqED;EACE,mBAAA;CDnED;AC2ED;EACE,eAAA;EACA,iBAAA;CDzED;ACgFD;EACE,iBAAA;EACA,YAAA;CD9ED;ACqFD;EACE,eAAA;CDnFD;AC0FD;;EAEE,eAAA;EACA,eAAA;EACA,mBAAA;EACA,yBAAA;CDxFD;AC2FD;EACE,YAAA;CDzFD;AC4FD;EACE,gBAAA;CD1FD;ACoGD;EACE,UAAA;CDlGD;ACyGD;EACE,iBAAA;CDvGD;ACiHD;EACE,iBAAA;CD/GD;ACsHD;EACE,gCAAA;KAAA,6BAAA;UAAA,wBAAA;EACA,UAAA;CDpHD;AC2HD;EACE,eAAA;CDzHD;ACgID;;;;EAIE,kCAAA;EACA,eAAA;CD9HD;ACgJD;;;;;EAKE,eAAA;EACA,cAAA;EACA,UAAA;CD9ID;ACqJD;EACE,kBAAA;CDnJD;AC6JD;;EAEE,qBAAA;CD3JD;ACsKD;;;;EAIE,2BAAA;EACA,gBAAA;CDpKD;AC2KD;;EAEE,gBAAA;CDzKD;ACgLD;;EAEE,UAAA;EACA,WAAA;CD9KD;ACsLD;EACE,oBAAA;CDpLD;AC+LD;;EAEE,+BAAA;KAAA,4BAAA;UAAA,uBAAA;EACA,WAAA;CD7LD;ACsMD;;EAEE,aAAA;CDpMD;AC4MD;EACE,8BAAA;EACA,gCAAA;KAAA,6BAAA;UAAA,wBAAA;CD1MD;ACmND;;EAEE,yBAAA;CDjND;ACwND;EACE,0BAAA;EACA,cAAA;EACA,+BAAA;CDtND;AC8ND;EACE,UAAA;EACA,WAAA;CD5ND;ACmOD;EACE,eAAA;CDjOD;ACyOD;EACE,kBAAA;CDvOD;ACiPD;EACE,0BAAA;EACA,kBAAA;CD/OD;ACkPD;;EAEE,WAAA;CDhPD;AACD,qFAAqF;AElFrF;EA7FI;;;IAGI,mCAAA;IACA,uBAAA;IACA,oCAAA;YAAA,4BAAA;IACA,6BAAA;GFkLL;EE/KC;;IAEI,2BAAA;GFiLL;EE9KC;IACI,6BAAA;GFgLL;EE7KC;IACI,8BAAA;GF+KL;EE1KC;;IAEI,YAAA;GF4KL;EEzKC;;IAEI,uBAAA;IACA,yBAAA;GF2KL;EExKC;IACI,4BAAA;GF0KL;EEvKC;;IAEI,yBAAA;GFyKL;EEtKC;IACI,2BAAA;GFwKL;EErKC;;;IAGI,WAAA;IACA,UAAA;GFuKL;EEpKC;;IAEI,wBAAA;GFsKL;EEhKC;IACI,cAAA;GFkKL;EEhKC;;IAGQ,kCAAA;GFiKT;EE9JC;IACI,uBAAA;GFgKL;EE7JC;IACI,qCAAA;GF+JL;EEhKC;;IAKQ,kCAAA;GF+JT;EE5JC;;IAGQ,kCAAA;GF6JT;CACF;AGnPD;EACE,oCAAA;EACA,sDAAA;EACA,gYAAA;CHqPD;AG7OD;EACE,mBAAA;EACA,SAAA;EACA,sBAAA;EACA,oCAAA;EACA,mBAAA;EACA,oBAAA;EACA,eAAA;EACA,oCAAA;EACA,mCAAA;CH+OD;AG3OmC;EAAW,iBAAA;CH8O9C;AG7OmC;EAAW,iBAAA;CHgP9C;AG9OmC;;EAAW,iBAAA;CHkP9C;AGjPmC;EAAW,iBAAA;CHoP9C;AGnPmC;EAAW,iBAAA;CHsP9C;AGrPmC;EAAW,iBAAA;CHwP9C;AGvPmC;EAAW,iBAAA;CH0P9C;AGzPmC;EAAW,iBAAA;CH4P9C;AG3PmC;EAAW,iBAAA;CH8P9C;AG7PmC;EAAW,iBAAA;CHgQ9C;AG/PmC;EAAW,iBAAA;CHkQ9C;AGjQmC;EAAW,iBAAA;CHoQ9C;AGnQmC;EAAW,iBAAA;CHsQ9C;AGrQmC;EAAW,iBAAA;CHwQ9C;AGvQmC;EAAW,iBAAA;CH0Q9C;AGzQmC;EAAW,iBAAA;CH4Q9C;AG3QmC;EAAW,iBAAA;CH8Q9C;AG7QmC;EAAW,iBAAA;CHgR9C;AG/QmC;EAAW,iBAAA;CHkR9C;AGjRmC;EAAW,iBAAA;CHoR9C;AGnRmC;EAAW,iBAAA;CHsR9C;AGrRmC;EAAW,iBAAA;CHwR9C;AGvRmC;EAAW,iBAAA;CH0R9C;AGzRmC;EAAW,iBAAA;CH4R9C;AG3RmC;EAAW,iBAAA;CH8R9C;AG7RmC;EAAW,iBAAA;CHgS9C;AG/RmC;EAAW,iBAAA;CHkS9C;AGjSmC;EAAW,iBAAA;CHoS9C;AGnSmC;EAAW,iBAAA;CHsS9C;AGrSmC;EAAW,iBAAA;CHwS9C;AGvSmC;EAAW,iBAAA;CH0S9C;AGzSmC;EAAW,iBAAA;CH4S9C;AG3SmC;EAAW,iBAAA;CH8S9C;AG7SmC;EAAW,iBAAA;CHgT9C;AG/SmC;EAAW,iBAAA;CHkT9C;AGjTmC;EAAW,iBAAA;CHoT9C;AGnTmC;EAAW,iBAAA;CHsT9C;AGrTmC;EAAW,iBAAA;CHwT9C;AGvTmC;EAAW,iBAAA;CH0T9C;AGzTmC;EAAW,iBAAA;CH4T9C;AG3TmC;EAAW,iBAAA;CH8T9C;AG7TmC;EAAW,iBAAA;CHgU9C;AG/TmC;EAAW,iBAAA;CHkU9C;AGjUmC;EAAW,iBAAA;CHoU9C;AGnUmC;EAAW,iBAAA;CHsU9C;AGrUmC;EAAW,iBAAA;CHwU9C;AGvUmC;EAAW,iBAAA;CH0U9C;AGzUmC;EAAW,iBAAA;CH4U9C;AG3UmC;EAAW,iBAAA;CH8U9C;AG7UmC;EAAW,iBAAA;CHgV9C;AG/UmC;EAAW,iBAAA;CHkV9C;AGjVmC;EAAW,iBAAA;CHoV9C;AGnVmC;EAAW,iBAAA;CHsV9C;AGrVmC;EAAW,iBAAA;CHwV9C;AGvVmC;EAAW,iBAAA;CH0V9C;AGzVmC;EAAW,iBAAA;CH4V9C;AG3VmC;EAAW,iBAAA;CH8V9C;AG7VmC;EAAW,iBAAA;CHgW9C;AG/VmC;EAAW,iBAAA;CHkW9C;AGjWmC;EAAW,iBAAA;CHoW9C;AGnWmC;EAAW,iBAAA;CHsW9C;AGrWmC;EAAW,iBAAA;CHwW9C;AGvWmC;EAAW,iBAAA;CH0W9C;AGzWmC;EAAW,iBAAA;CH4W9C;AG3WmC;EAAW,iBAAA;CH8W9C;AG7WmC;EAAW,iBAAA;CHgX9C;AG/WmC;EAAW,iBAAA;CHkX9C;AGjXmC;EAAW,iBAAA;CHoX9C;AGnXmC;EAAW,iBAAA;CHsX9C;AGrXmC;EAAW,iBAAA;CHwX9C;AGvXmC;EAAW,iBAAA;CH0X9C;AGzXmC;EAAW,iBAAA;CH4X9C;AG3XmC;EAAW,iBAAA;CH8X9C;AG7XmC;EAAW,iBAAA;CHgY9C;AG/XmC;EAAW,iBAAA;CHkY9C;AGjYmC;EAAW,iBAAA;CHoY9C;AGnYmC;EAAW,iBAAA;CHsY9C;AGrYmC;EAAW,iBAAA;CHwY9C;AGvYmC;EAAW,iBAAA;CH0Y9C;AGzYmC;EAAW,iBAAA;CH4Y9C;AG3YmC;EAAW,iBAAA;CH8Y9C;AG7YmC;EAAW,iBAAA;CHgZ9C;AG/YmC;EAAW,iBAAA;CHkZ9C;AGjZmC;EAAW,iBAAA;CHoZ9C;AGnZmC;EAAW,iBAAA;CHsZ9C;AGrZmC;EAAW,iBAAA;CHwZ9C;AGvZmC;EAAW,iBAAA;CH0Z9C;AGzZmC;EAAW,iBAAA;CH4Z9C;AG3ZmC;EAAW,iBAAA;CH8Z9C;AG7ZmC;EAAW,iBAAA;CHga9C;AG/ZmC;EAAW,iBAAA;CHka9C;AGjamC;EAAW,iBAAA;CHoa9C;AGnamC;EAAW,iBAAA;CHsa9C;AGramC;EAAW,iBAAA;CHwa9C;AGvamC;EAAW,iBAAA;CH0a9C;AGzamC;EAAW,iBAAA;CH4a9C;AG3amC;EAAW,iBAAA;CH8a9C;AG7amC;EAAW,iBAAA;CHgb9C;AG/amC;EAAW,iBAAA;CHkb9C;AGjbmC;EAAW,iBAAA;CHob9C;AGnbmC;EAAW,iBAAA;CHsb9C;AGrbmC;EAAW,iBAAA;CHwb9C;AGvbmC;EAAW,iBAAA;CH0b9C;AGzbmC;EAAW,iBAAA;CH4b9C;AG3bmC;EAAW,iBAAA;CH8b9C;AG7bmC;EAAW,iBAAA;CHgc9C;AG/bmC;EAAW,iBAAA;CHkc9C;AGjcmC;EAAW,iBAAA;CHoc9C;AGncmC;EAAW,iBAAA;CHsc9C;AGrcmC;EAAW,iBAAA;CHwc9C;AGvcmC;EAAW,iBAAA;CH0c9C;AGzcmC;EAAW,iBAAA;CH4c9C;AG3cmC;EAAW,iBAAA;CH8c9C;AG7cmC;EAAW,iBAAA;CHgd9C;AG/cmC;EAAW,iBAAA;CHkd9C;AGjdmC;EAAW,iBAAA;CHod9C;AGndmC;EAAW,iBAAA;CHsd9C;AGrdmC;EAAW,iBAAA;CHwd9C;AGvdmC;EAAW,iBAAA;CH0d9C;AGzdmC;EAAW,iBAAA;CH4d9C;AG3dmC;EAAW,iBAAA;CH8d9C;AG7dmC;EAAW,iBAAA;CHge9C;AG/dmC;EAAW,iBAAA;CHke9C;AGjemC;EAAW,iBAAA;CHoe9C;AGnemC;EAAW,iBAAA;CHse9C;AGremC;EAAW,iBAAA;CHwe9C;AGvemC;EAAW,iBAAA;CH0e9C;AGzemC;EAAW,iBAAA;CH4e9C;AG3emC;EAAW,iBAAA;CH8e9C;AG7emC;EAAW,iBAAA;CHgf9C;AG/emC;EAAW,iBAAA;CHkf9C;AGjfmC;EAAW,iBAAA;CHof9C;AGnfmC;EAAW,iBAAA;CHsf9C;AGrfmC;EAAW,iBAAA;CHwf9C;AGvfmC;EAAW,iBAAA;CH0f9C;AGzfmC;EAAW,iBAAA;CH4f9C;AG3fmC;EAAW,iBAAA;CH8f9C;AG7fmC;EAAW,iBAAA;CHggB9C;AG/fmC;EAAW,iBAAA;CHkgB9C;AGjgBmC;EAAW,iBAAA;CHogB9C;AGngBmC;EAAW,iBAAA;CHsgB9C;AGrgBmC;EAAW,iBAAA;CHwgB9C;AGvgBmC;EAAW,iBAAA;CH0gB9C;AGzgBmC;EAAW,iBAAA;CH4gB9C;AG3gBmC;EAAW,iBAAA;CH8gB9C;AG7gBmC;EAAW,iBAAA;CHghB9C;AG/gBmC;EAAW,iBAAA;CHkhB9C;AGjhBmC;EAAW,iBAAA;CHohB9C;AGnhBmC;EAAW,iBAAA;CHshB9C;AGrhBmC;EAAW,iBAAA;CHwhB9C;AGvhBmC;EAAW,iBAAA;CH0hB9C;AGzhBmC;EAAW,iBAAA;CH4hB9C;AG3hBmC;EAAW,iBAAA;CH8hB9C;AG7hBmC;EAAW,iBAAA;CHgiB9C;AG/hBmC;EAAW,iBAAA;CHkiB9C;AGjiBmC;EAAW,iBAAA;CHoiB9C;AGniBmC;EAAW,iBAAA;CHsiB9C;AGriBmC;EAAW,iBAAA;CHwiB9C;AGviBmC;EAAW,iBAAA;CH0iB9C;AGziBmC;EAAW,iBAAA;CH4iB9C;AG3iBmC;EAAW,iBAAA;CH8iB9C;AG7iBmC;EAAW,iBAAA;CHgjB9C;AG/iBmC;EAAW,iBAAA;CHkjB9C;AGjjBmC;EAAW,iBAAA;CHojB9C;AGnjBmC;EAAW,iBAAA;CHsjB9C;AGrjBmC;EAAW,iBAAA;CHwjB9C;AGvjBmC;EAAW,iBAAA;CH0jB9C;AGzjBmC;EAAW,iBAAA;CH4jB9C;AG3jBmC;EAAW,iBAAA;CH8jB9C;AG7jBmC;EAAW,iBAAA;CHgkB9C;AG/jBmC;EAAW,iBAAA;CHkkB9C;AGjkBmC;EAAW,iBAAA;CHokB9C;AGnkBmC;EAAW,iBAAA;CHskB9C;AGrkBmC;EAAW,iBAAA;CHwkB9C;AGvkBmC;EAAW,iBAAA;CH0kB9C;AGzkBmC;EAAW,iBAAA;CH4kB9C;AG3kBmC;EAAW,iBAAA;CH8kB9C;AG7kBmC;EAAW,iBAAA;CHglB9C;AG/kBmC;EAAW,iBAAA;CHklB9C;AGjlBmC;EAAW,iBAAA;CHolB9C;AGnlBmC;EAAW,iBAAA;CHslB9C;AGrlBmC;EAAW,iBAAA;CHwlB9C;AGvlBmC;EAAW,iBAAA;CH0lB9C;AGzlBmC;EAAW,iBAAA;CH4lB9C;AG3lBmC;EAAW,iBAAA;CH8lB9C;AG7lBmC;EAAW,iBAAA;CHgmB9C;AG/lBmC;EAAW,iBAAA;CHkmB9C;AGjmBmC;EAAW,iBAAA;CHomB9C;AGnmBmC;EAAW,iBAAA;CHsmB9C;AGrmBmC;EAAW,iBAAA;CHwmB9C;AGvmBmC;EAAW,iBAAA;CH0mB9C;AGzmBmC;EAAW,iBAAA;CH4mB9C;AG3mBmC;EAAW,iBAAA;CH8mB9C;AG7mBmC;EAAW,iBAAA;CHgnB9C;AG/mBmC;EAAW,iBAAA;CHknB9C;AGjnBmC;EAAW,iBAAA;CHonB9C;AGnnBmC;EAAW,iBAAA;CHsnB9C;AGrnBmC;EAAW,iBAAA;CHwnB9C;AGvnBmC;EAAW,iBAAA;CH0nB9C;AGznBmC;EAAW,iBAAA;CH4nB9C;AG3nBmC;EAAW,iBAAA;CH8nB9C;AG7nBmC;EAAW,iBAAA;CHgoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AG/nBmC;EAAW,iBAAA;CHkoB9C;AGjoBmC;EAAW,iBAAA;CHooB9C;AGnoBmC;EAAW,iBAAA;CHsoB9C;AGroBmC;EAAW,iBAAA;CHwoB9C;AGvoBmC;EAAW,iBAAA;CH0oB9C;AGzoBmC;EAAW,iBAAA;CH4oB9C;AG3oBmC;EAAW,iBAAA;CH8oB9C;AG7oBmC;EAAW,iBAAA;CHgpB9C;AG/oBmC;EAAW,iBAAA;CHkpB9C;AGjpBmC;EAAW,iBAAA;CHopB9C;AGnpBmC;EAAW,iBAAA;CHspB9C;AGrpBmC;EAAW,iBAAA;CHwpB9C;AGvpBmC;EAAW,iBAAA;CH0pB9C;AGzpBmC;EAAW,iBAAA;CH4pB9C;AG3pBmC;EAAW,iBAAA;CH8pB9C;AG7pBmC;EAAW,iBAAA;CHgqB9C;AG/pBmC;EAAW,iBAAA;CHkqB9C;AGjqBmC;EAAW,iBAAA;CHoqB9C;AGnqBmC;EAAW,iBAAA;CHsqB9C;AGrqBmC;EAAW,iBAAA;CHwqB9C;AGvqBmC;EAAW,iBAAA;CH0qB9C;AGzqBmC;EAAW,iBAAA;CH4qB9C;AG3qBmC;EAAW,iBAAA;CH8qB9C;AG7qBmC;EAAW,iBAAA;CHgrB9C;AG/qBmC;EAAW,iBAAA;CHkrB9C;AGjrBmC;EAAW,iBAAA;CHorB9C;AGnrBmC;EAAW,iBAAA;CHsrB9C;AGrrBmC;EAAW,iBAAA;CHwrB9C;AGvrBmC;EAAW,iBAAA;CH0rB9C;AGzrBmC;EAAW,iBAAA;CH4rB9C;AG3rBmC;EAAW,iBAAA;CH8rB9C;AG7rBmC;EAAW,iBAAA;CHgsB9C;AG/rBmC;EAAW,iBAAA;CHksB9C;AGjsBmC;EAAW,iBAAA;CHosB9C;AGnsBmC;EAAW,iBAAA;CHssB9C;AGrsBmC;EAAW,iBAAA;CHwsB9C;AGvsBmC;EAAW,iBAAA;CH0sB9C;AGzsBmC;EAAW,iBAAA;CH4sB9C;AG3sBmC;EAAW,iBAAA;CH8sB9C;AG7sBmC;EAAW,iBAAA;CHgtB9C;AG/sBmC;EAAW,iBAAA;CHktB9C;AGjtBmC;EAAW,iBAAA;CHotB9C;AGntBmC;EAAW,iBAAA;CHstB9C;AGrtBmC;EAAW,iBAAA;CHwtB9C;AGvtBmC;EAAW,iBAAA;CH0tB9C;AGztBmC;EAAW,iBAAA;CH4tB9C;AG3tBmC;EAAW,iBAAA;CH8tB9C;AG7tBmC;EAAW,iBAAA;CHguB9C;AG/tBmC;EAAW,iBAAA;CHkuB9C;AGjuBmC;EAAW,iBAAA;CHouB9C;AGnuBmC;EAAW,iBAAA;CHsuB9C;AGruBmC;EAAW,iBAAA;CHwuB9C;AGvuBmC;EAAW,iBAAA;CH0uB9C;AGzuBmC;EAAW,iBAAA;CH4uB9C;AG3uBmC;EAAW,iBAAA;CH8uB9C;AG7uBmC;EAAW,iBAAA;CHgvB9C;AIthCD;ECgEE,+BAAA;EACG,4BAAA;EACK,uBAAA;CLy9BT;AIxhCD;;EC6DE,+BAAA;EACG,4BAAA;EACK,uBAAA;CL+9BT;AIthCD;EACE,gBAAA;EACA,8CAAA;CJwhCD;AIrhCD;EACE,4DAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,uBAAA;CJuhCD;AInhCD;;;;EAIE,qBAAA;EACA,mBAAA;EACA,qBAAA;CJqhCD;AI/gCD;EACE,eAAA;EACA,sBAAA;CJihCD;AI/gCC;;EAEE,eAAA;EACA,2BAAA;CJihCH;AI9gCC;EEnDA,2CAAA;EACA,qBAAA;CNokCD;AIvgCD;EACE,UAAA;CJygCD;AIngCD;EACE,uBAAA;CJqgCD;AIjgCD;;;;;EGvEE,eAAA;EACA,gBAAA;EACA,aAAA;CP+kCD;AIrgCD;EACE,mBAAA;CJugCD;AIjgCD;EACE,aAAA;EACA,wBAAA;EACA,uBAAA;EACA,uBAAA;EACA,mBAAA;EC6FA,yCAAA;EACK,oCAAA;EACG,iCAAA;EEvLR,sBAAA;EACA,gBAAA;EACA,aAAA;CP+lCD;AIjgCD;EACE,mBAAA;CJmgCD;AI7/BD;EACE,iBAAA;EACA,oBAAA;EACA,UAAA;EACA,8BAAA;CJ+/BD;AIv/BD;EACE,mBAAA;EACA,WAAA;EACA,YAAA;EACA,aAAA;EACA,WAAA;EACA,iBAAA;EACA,uBAAA;EACA,UAAA;CJy/BD;AIj/BC;;EAEE,iBAAA;EACA,YAAA;EACA,aAAA;EACA,UAAA;EACA,kBAAA;EACA,WAAA;CJm/BH;AIx+BD;EACE,gBAAA;CJ0+BD;AQjoCD;;;;;;;;;;;;EAEE,qBAAA;EACA,iBAAA;EACA,iBAAA;EACA,eAAA;CR6oCD;AQlpCD;;;;;;;;;;;;;;;;;;;;;;;;EASI,oBAAA;EACA,eAAA;EACA,eAAA;CRmqCH;AQ/pCD;;;;;;EAGE,iBAAA;EACA,oBAAA;CRoqCD;AQxqCD;;;;;;;;;;;;EAQI,eAAA;CR8qCH;AQ3qCD;;;;;;EAGE,iBAAA;EACA,oBAAA;CRgrCD;AQprCD;;;;;;;;;;;;EAQI,eAAA;CR0rCH;AQtrCD;;EAAU,gBAAA;CR0rCT;AQzrCD;;EAAU,gBAAA;CR6rCT;AQ5rCD;;EAAU,gBAAA;CRgsCT;AQ/rCD;;EAAU,gBAAA;CRmsCT;AQlsCD;;EAAU,gBAAA;CRssCT;AQrsCD;;EAAU,gBAAA;CRysCT;AQnsCD;EACE,iBAAA;CRqsCD;AQlsCD;EACE,oBAAA;EACA,gBAAA;EACA,iBAAA;EACA,iBAAA;CRosCD;AQ/rCD;EAwOA;IA1OI,gBAAA;GRqsCD;CACF;AQ7rCD;;EAEE,eAAA;CR+rCD;AQ5rCD;;EAEE,0BAAA;EACA,cAAA;CR8rCD;AQ1rCD;EAAuB,iBAAA;CR6rCtB;AQ5rCD;EAAuB,kBAAA;CR+rCtB;AQ9rCD;EAAuB,mBAAA;CRisCtB;AQhsCD;EAAuB,oBAAA;CRmsCtB;AQlsCD;EAAuB,oBAAA;CRqsCtB;AQlsCD;EAAuB,0BAAA;CRqsCtB;AQpsCD;EAAuB,0BAAA;CRusCtB;AQtsCD;EAAuB,2BAAA;CRysCtB;AQtsCD;EACE,eAAA;CRwsCD;AQtsCD;ECrGE,eAAA;CT8yCD;AS7yCC;;EAEE,eAAA;CT+yCH;AQ1sCD;ECxGE,eAAA;CTqzCD;ASpzCC;;EAEE,eAAA;CTszCH;AQ9sCD;EC3GE,eAAA;CT4zCD;AS3zCC;;EAEE,eAAA;CT6zCH;AQltCD;EC9GE,eAAA;CTm0CD;ASl0CC;;EAEE,eAAA;CTo0CH;AQttCD;ECjHE,eAAA;CT00CD;ASz0CC;;EAEE,eAAA;CT20CH;AQttCD;EAGE,YAAA;EE3HA,0BAAA;CVk1CD;AUj1CC;;EAEE,0BAAA;CVm1CH;AQxtCD;EE9HE,0BAAA;CVy1CD;AUx1CC;;EAEE,0BAAA;CV01CH;AQ5tCD;EEjIE,0BAAA;CVg2CD;AU/1CC;;EAEE,0BAAA;CVi2CH;AQhuCD;EEpIE,0BAAA;CVu2CD;AUt2CC;;EAEE,0BAAA;CVw2CH;AQpuCD;EEvIE,0BAAA;CV82CD;AU72CC;;EAEE,0BAAA;CV+2CH;AQnuCD;EACE,oBAAA;EACA,oBAAA;EACA,iCAAA;CRquCD;AQ7tCD;;EAEE,cAAA;EACA,oBAAA;CR+tCD;AQluCD;;;;EAMI,iBAAA;CRkuCH;AQ3tCD;EACE,gBAAA;EACA,iBAAA;CR6tCD;AQztCD;EALE,gBAAA;EACA,iBAAA;EAMA,kBAAA;CR4tCD;AQ9tCD;EAKI,sBAAA;EACA,kBAAA;EACA,mBAAA;CR4tCH;AQvtCD;EACE,cAAA;EACA,oBAAA;CRytCD;AQvtCD;;EAEE,wBAAA;CRytCD;AQvtCD;EACE,kBAAA;CRytCD;AQvtCD;EACE,eAAA;CRytCD;AQhsCD;EA6EA;IAvFM,YAAA;IACA,aAAA;IACA,YAAA;IACA,kBAAA;IGtNJ,iBAAA;IACA,wBAAA;IACA,oBAAA;GXq6CC;EQ7nCH;IAhFM,mBAAA;GRgtCH;CACF;AQvsCD;;EAGE,aAAA;EACA,kCAAA;CRwsCD;AQtsCD;EACE,eAAA;EA9IqB,0BAAA;CRu1CtB;AQpsCD;EACE,mBAAA;EACA,iBAAA;EACA,kBAAA;EACA,+BAAA;CRssCD;AQjsCG;;;EACE,iBAAA;CRqsCL;AQ/sCD;;;EAmBI,eAAA;EACA,eAAA;EACA,wBAAA;EACA,eAAA;CRisCH;AQ/rCG;;;EACE,uBAAA;CRmsCL;AQ3rCD;;EAEE,oBAAA;EACA,gBAAA;EACA,gCAAA;EACA,eAAA;EACA,kBAAA;CR6rCD;AQvrCG;;;;;;EAAW,YAAA;CR+rCd;AQ9rCG;;;;;;EACE,uBAAA;CRqsCL;AQ/rCD;EACE,oBAAA;EACA,mBAAA;EACA,wBAAA;CRisCD;AYv+CD;;;;EAIE,+DAAA;CZy+CD;AYr+CD;EACE,iBAAA;EACA,eAAA;EACA,eAAA;EACA,0BAAA;EACA,mBAAA;CZu+CD;AYn+CD;EACE,iBAAA;EACA,eAAA;EACA,YAAA;EACA,uBAAA;EACA,mBAAA;EACA,uDAAA;UAAA,+CAAA;CZq+CD;AY3+CD;EASI,WAAA;EACA,gBAAA;EACA,kBAAA;EACA,yBAAA;UAAA,iBAAA;CZq+CH;AYh+CD;EACE,eAAA;EACA,eAAA;EACA,iBAAA;EACA,gBAAA;EACA,wBAAA;EACA,sBAAA;EACA,sBAAA;EACA,eAAA;EACA,0BAAA;EACA,uBAAA;EACA,mBAAA;CZk+CD;AY7+CD;EAeI,WAAA;EACA,mBAAA;EACA,eAAA;EACA,sBAAA;EACA,8BAAA;EACA,iBAAA;CZi+CH;AY59CD;EACE,kBAAA;EACA,mBAAA;CZ89CD;AaxhDD;ECHE,mBAAA;EACA,kBAAA;EACA,mBAAA;EACA,oBAAA;Cd8hDD;AaxhDC;EAqEF;IAvEI,aAAA;Gb8hDD;CACF;Aa1hDC;EAkEF;IApEI,aAAA;GbgiDD;CACF;Aa5hDD;EA+DA;IAjEI,cAAA;GbkiDD;CACF;AazhDD;ECvBE,mBAAA;EACA,kBAAA;EACA,mBAAA;EACA,oBAAA;CdmjDD;AathDD;ECvBE,mBAAA;EACA,oBAAA;CdgjDD;AehjDG;EACE,mBAAA;EAEA,gBAAA;EAEA,mBAAA;EACA,oBAAA;CfgjDL;AehiDG;EACE,YAAA;CfkiDL;Ae3hDC;EACE,YAAA;Cf6hDH;Ae9hDC;EACE,oBAAA;CfgiDH;AejiDC;EACE,oBAAA;CfmiDH;AepiDC;EACE,WAAA;CfsiDH;AeviDC;EACE,oBAAA;CfyiDH;Ae1iDC;EACE,oBAAA;Cf4iDH;Ae7iDC;EACE,WAAA;Cf+iDH;AehjDC;EACE,oBAAA;CfkjDH;AenjDC;EACE,oBAAA;CfqjDH;AetjDC;EACE,WAAA;CfwjDH;AezjDC;EACE,oBAAA;Cf2jDH;Ae5jDC;EACE,mBAAA;Cf8jDH;AehjDC;EACE,YAAA;CfkjDH;AenjDC;EACE,oBAAA;CfqjDH;AetjDC;EACE,oBAAA;CfwjDH;AezjDC;EACE,WAAA;Cf2jDH;Ae5jDC;EACE,oBAAA;Cf8jDH;Ae/jDC;EACE,oBAAA;CfikDH;AelkDC;EACE,WAAA;CfokDH;AerkDC;EACE,oBAAA;CfukDH;AexkDC;EACE,oBAAA;Cf0kDH;Ae3kDC;EACE,WAAA;Cf6kDH;Ae9kDC;EACE,oBAAA;CfglDH;AejlDC;EACE,mBAAA;CfmlDH;Ae/kDC;EACE,YAAA;CfilDH;AejmDC;EACE,WAAA;CfmmDH;AepmDC;EACE,mBAAA;CfsmDH;AevmDC;EACE,mBAAA;CfymDH;Ae1mDC;EACE,UAAA;Cf4mDH;Ae7mDC;EACE,mBAAA;Cf+mDH;AehnDC;EACE,mBAAA;CfknDH;AennDC;EACE,UAAA;CfqnDH;AetnDC;EACE,mBAAA;CfwnDH;AeznDC;EACE,mBAAA;Cf2nDH;Ae5nDC;EACE,UAAA;Cf8nDH;Ae/nDC;EACE,mBAAA;CfioDH;AeloDC;EACE,kBAAA;CfooDH;AehoDC;EACE,WAAA;CfkoDH;AepnDC;EACE,kBAAA;CfsnDH;AevnDC;EACE,0BAAA;CfynDH;Ae1nDC;EACE,0BAAA;Cf4nDH;Ae7nDC;EACE,iBAAA;Cf+nDH;AehoDC;EACE,0BAAA;CfkoDH;AenoDC;EACE,0BAAA;CfqoDH;AetoDC;EACE,iBAAA;CfwoDH;AezoDC;EACE,0BAAA;Cf2oDH;Ae5oDC;EACE,0BAAA;Cf8oDH;Ae/oDC;EACE,iBAAA;CfipDH;AelpDC;EACE,0BAAA;CfopDH;AerpDC;EACE,yBAAA;CfupDH;AexpDC;EACE,gBAAA;Cf0pDH;Aa1pDD;EElCI;IACE,YAAA;Gf+rDH;EexrDD;IACE,YAAA;Gf0rDD;Ee3rDD;IACE,oBAAA;Gf6rDD;Ee9rDD;IACE,oBAAA;GfgsDD;EejsDD;IACE,WAAA;GfmsDD;EepsDD;IACE,oBAAA;GfssDD;EevsDD;IACE,oBAAA;GfysDD;Ee1sDD;IACE,WAAA;Gf4sDD;Ee7sDD;IACE,oBAAA;Gf+sDD;EehtDD;IACE,oBAAA;GfktDD;EentDD;IACE,WAAA;GfqtDD;EettDD;IACE,oBAAA;GfwtDD;EeztDD;IACE,mBAAA;Gf2tDD;Ee7sDD;IACE,YAAA;Gf+sDD;EehtDD;IACE,oBAAA;GfktDD;EentDD;IACE,oBAAA;GfqtDD;EettDD;IACE,WAAA;GfwtDD;EeztDD;IACE,oBAAA;Gf2tDD;Ee5tDD;IACE,oBAAA;Gf8tDD;Ee/tDD;IACE,WAAA;GfiuDD;EeluDD;IACE,oBAAA;GfouDD;EeruDD;IACE,oBAAA;GfuuDD;EexuDD;IACE,WAAA;Gf0uDD;Ee3uDD;IACE,oBAAA;Gf6uDD;Ee9uDD;IACE,mBAAA;GfgvDD;Ee5uDD;IACE,YAAA;Gf8uDD;Ee9vDD;IACE,WAAA;GfgwDD;EejwDD;IACE,mBAAA;GfmwDD;EepwDD;IACE,mBAAA;GfswDD;EevwDD;IACE,UAAA;GfywDD;Ee1wDD;IACE,mBAAA;Gf4wDD;Ee7wDD;IACE,mBAAA;Gf+wDD;EehxDD;IACE,UAAA;GfkxDD;EenxDD;IACE,mBAAA;GfqxDD;EetxDD;IACE,mBAAA;GfwxDD;EezxDD;IACE,UAAA;Gf2xDD;Ee5xDD;IACE,mBAAA;Gf8xDD;Ee/xDD;IACE,kBAAA;GfiyDD;Ee7xDD;IACE,WAAA;Gf+xDD;EejxDD;IACE,kBAAA;GfmxDD;EepxDD;IACE,0BAAA;GfsxDD;EevxDD;IACE,0BAAA;GfyxDD;Ee1xDD;IACE,iBAAA;Gf4xDD;Ee7xDD;IACE,0BAAA;Gf+xDD;EehyDD;IACE,0BAAA;GfkyDD;EenyDD;IACE,iBAAA;GfqyDD;EetyDD;IACE,0BAAA;GfwyDD;EezyDD;IACE,0BAAA;Gf2yDD;Ee5yDD;IACE,iBAAA;Gf8yDD;Ee/yDD;IACE,0BAAA;GfizDD;EelzDD;IACE,yBAAA;GfozDD;EerzDD;IACE,gBAAA;GfuzDD;CACF;Aa/yDD;EE3CI;IACE,YAAA;Gf61DH;Eet1DD;IACE,YAAA;Gfw1DD;Eez1DD;IACE,oBAAA;Gf21DD;Ee51DD;IACE,oBAAA;Gf81DD;Ee/1DD;IACE,WAAA;Gfi2DD;Eel2DD;IACE,oBAAA;Gfo2DD;Eer2DD;IACE,oBAAA;Gfu2DD;Eex2DD;IACE,WAAA;Gf02DD;Ee32DD;IACE,oBAAA;Gf62DD;Ee92DD;IACE,oBAAA;Gfg3DD;Eej3DD;IACE,WAAA;Gfm3DD;Eep3DD;IACE,oBAAA;Gfs3DD;Eev3DD;IACE,mBAAA;Gfy3DD;Ee32DD;IACE,YAAA;Gf62DD;Ee92DD;IACE,oBAAA;Gfg3DD;Eej3DD;IACE,oBAAA;Gfm3DD;Eep3DD;IACE,WAAA;Gfs3DD;Eev3DD;IACE,oBAAA;Gfy3DD;Ee13DD;IACE,oBAAA;Gf43DD;Ee73DD;IACE,WAAA;Gf+3DD;Eeh4DD;IACE,oBAAA;Gfk4DD;Een4DD;IACE,oBAAA;Gfq4DD;Eet4DD;IACE,WAAA;Gfw4DD;Eez4DD;IACE,oBAAA;Gf24DD;Ee54DD;IACE,mBAAA;Gf84DD;Ee14DD;IACE,YAAA;Gf44DD;Ee55DD;IACE,WAAA;Gf85DD;Ee/5DD;IACE,mBAAA;Gfi6DD;Eel6DD;IACE,mBAAA;Gfo6DD;Eer6DD;IACE,UAAA;Gfu6DD;Eex6DD;IACE,mBAAA;Gf06DD;Ee36DD;IACE,mBAAA;Gf66DD;Ee96DD;IACE,UAAA;Gfg7DD;Eej7DD;IACE,mBAAA;Gfm7DD;Eep7DD;IACE,mBAAA;Gfs7DD;Eev7DD;IACE,UAAA;Gfy7DD;Ee17DD;IACE,mBAAA;Gf47DD;Ee77DD;IACE,kBAAA;Gf+7DD;Ee37DD;IACE,WAAA;Gf67DD;Ee/6DD;IACE,kBAAA;Gfi7DD;Eel7DD;IACE,0BAAA;Gfo7DD;Eer7DD;IACE,0BAAA;Gfu7DD;Eex7DD;IACE,iBAAA;Gf07DD;Ee37DD;IACE,0BAAA;Gf67DD;Ee97DD;IACE,0BAAA;Gfg8DD;Eej8DD;IACE,iBAAA;Gfm8DD;Eep8DD;IACE,0BAAA;Gfs8DD;Eev8DD;IACE,0BAAA;Gfy8DD;Ee18DD;IACE,iBAAA;Gf48DD;Ee78DD;IACE,0BAAA;Gf+8DD;Eeh9DD;IACE,yBAAA;Gfk9DD;Een9DD;IACE,gBAAA;Gfq9DD;CACF;Aa18DD;EE9CI;IACE,YAAA;Gf2/DH;Eep/DD;IACE,YAAA;Gfs/DD;Eev/DD;IACE,oBAAA;Gfy/DD;Ee1/DD;IACE,oBAAA;Gf4/DD;Ee7/DD;IACE,WAAA;Gf+/DD;EehgED;IACE,oBAAA;GfkgED;EengED;IACE,oBAAA;GfqgED;EetgED;IACE,WAAA;GfwgED;EezgED;IACE,oBAAA;Gf2gED;Ee5gED;IACE,oBAAA;Gf8gED;Ee/gED;IACE,WAAA;GfihED;EelhED;IACE,oBAAA;GfohED;EerhED;IACE,mBAAA;GfuhED;EezgED;IACE,YAAA;Gf2gED;Ee5gED;IACE,oBAAA;Gf8gED;Ee/gED;IACE,oBAAA;GfihED;EelhED;IACE,WAAA;GfohED;EerhED;IACE,oBAAA;GfuhED;EexhED;IACE,oBAAA;Gf0hED;Ee3hED;IACE,WAAA;Gf6hED;Ee9hED;IACE,oBAAA;GfgiED;EejiED;IACE,oBAAA;GfmiED;EepiED;IACE,WAAA;GfsiED;EeviED;IACE,oBAAA;GfyiED;Ee1iED;IACE,mBAAA;Gf4iED;EexiED;IACE,YAAA;Gf0iED;Ee1jED;IACE,WAAA;Gf4jED;Ee7jED;IACE,mBAAA;Gf+jED;EehkED;IACE,mBAAA;GfkkED;EenkED;IACE,UAAA;GfqkED;EetkED;IACE,mBAAA;GfwkED;EezkED;IACE,mBAAA;Gf2kED;Ee5kED;IACE,UAAA;Gf8kED;Ee/kED;IACE,mBAAA;GfilED;EellED;IACE,mBAAA;GfolED;EerlED;IACE,UAAA;GfulED;EexlED;IACE,mBAAA;Gf0lED;Ee3lED;IACE,kBAAA;Gf6lED;EezlED;IACE,WAAA;Gf2lED;Ee7kED;IACE,kBAAA;Gf+kED;EehlED;IACE,0BAAA;GfklED;EenlED;IACE,0BAAA;GfqlED;EetlED;IACE,iBAAA;GfwlED;EezlED;IACE,0BAAA;Gf2lED;Ee5lED;IACE,0BAAA;Gf8lED;Ee/lED;IACE,iBAAA;GfimED;EelmED;IACE,0BAAA;GfomED;EermED;IACE,0BAAA;GfumED;EexmED;IACE,iBAAA;Gf0mED;Ee3mED;IACE,0BAAA;Gf6mED;Ee9mED;IACE,yBAAA;GfgnED;EejnED;IACE,gBAAA;GfmnED;CACF;AgBvrED;EACE,8BAAA;ChByrED;AgBvrED;EACE,iBAAA;EACA,oBAAA;EACA,eAAA;EACA,iBAAA;ChByrED;AgBvrED;EACE,iBAAA;ChByrED;AgBnrED;EACE,YAAA;EACA,gBAAA;EACA,oBAAA;ChBqrED;AgBxrED;;;;;;EAWQ,aAAA;EACA,wBAAA;EACA,oBAAA;EACA,2BAAA;ChBqrEP;AgBnsED;EAoBI,uBAAA;EACA,8BAAA;ChBkrEH;AgBvsED;;;;;;EA8BQ,cAAA;ChBirEP;AgB/sED;EAoCI,2BAAA;ChB8qEH;AgBltED;EAyCI,uBAAA;ChB4qEH;AgBrqED;;;;;;EAOQ,aAAA;ChBsqEP;AgB3pED;EACE,uBAAA;ChB6pED;AgB9pED;;;;;;EAQQ,uBAAA;ChB8pEP;AgBtqED;;EAeM,yBAAA;ChB2pEL;AgBjpED;EAEI,0BAAA;ChBkpEH;AgBzoED;EAEI,0BAAA;ChB0oEH;AgBjoED;EACE,iBAAA;EACA,YAAA;EACA,sBAAA;ChBmoED;AgB9nEG;;EACE,iBAAA;EACA,YAAA;EACA,oBAAA;ChBioEL;AiB7wEC;;;;;;;;;;;;EAOI,0BAAA;CjBoxEL;AiB9wEC;;;;;EAMI,0BAAA;CjB+wEL;AiBlyEC;;;;;;;;;;;;EAOI,0BAAA;CjByyEL;AiBnyEC;;;;;EAMI,0BAAA;CjBoyEL;AiBvzEC;;;;;;;;;;;;EAOI,0BAAA;CjB8zEL;AiBxzEC;;;;;EAMI,0BAAA;CjByzEL;AiB50EC;;;;;;;;;;;;EAOI,0BAAA;CjBm1EL;AiB70EC;;;;;EAMI,0BAAA;CjB80EL;AiBj2EC;;;;;;;;;;;;EAOI,0BAAA;CjBw2EL;AiBl2EC;;;;;EAMI,0BAAA;CjBm2EL;AgBjtED;EACE,iBAAA;EACA,kBAAA;ChBmtED;AgBtpED;EACA;IA3DI,YAAA;IACA,oBAAA;IACA,mBAAA;IACA,6CAAA;IACA,uBAAA;GhBotED;EgB7pEH;IAnDM,iBAAA;GhBmtEH;EgBhqEH;;;;;;IA1CY,oBAAA;GhBktET;EgBxqEH;IAlCM,UAAA;GhB6sEH;EgB3qEH;;;;;;IAzBY,eAAA;GhB4sET;EgBnrEH;;;;;;IArBY,gBAAA;GhBgtET;EgB3rEH;;;;IARY,iBAAA;GhBysET;CACF;AkBn6ED;EACE,WAAA;EACA,UAAA;EACA,UAAA;EAIA,aAAA;ClBk6ED;AkB/5ED;EACE,eAAA;EACA,YAAA;EACA,WAAA;EACA,oBAAA;EACA,gBAAA;EACA,qBAAA;EACA,eAAA;EACA,UAAA;EACA,iCAAA;ClBi6ED;AkB95ED;EACE,sBAAA;EACA,gBAAA;EACA,mBAAA;EACA,kBAAA;ClBg6ED;AkBr5ED;Eb4BE,+BAAA;EACG,4BAAA;EACK,uBAAA;CL43ET;AkBr5ED;;EAEE,gBAAA;EACA,mBAAA;EACA,oBAAA;ClBu5ED;AkBp5ED;EACE,eAAA;ClBs5ED;AkBl5ED;EACE,eAAA;EACA,YAAA;ClBo5ED;AkBh5ED;;EAEE,aAAA;ClBk5ED;AkB94ED;;;EZrEE,2CAAA;EACA,qBAAA;CNw9ED;AkB74ED;EACE,eAAA;EACA,iBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;ClB+4ED;AkBr3ED;EACE,eAAA;EACA,YAAA;EACA,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,uBAAA;EACA,uBAAA;EACA,uBAAA;EACA,mBAAA;EbxDA,yDAAA;EACQ,iDAAA;EAyHR,uFAAA;EACK,0EAAA;EACG,uEAAA;CLwzET;AmBh8EC;EACE,sBAAA;EACA,WAAA;EdUF,uFAAA;EACQ,+EAAA;CLy7ET;AKx5EC;EACE,YAAA;EACA,WAAA;CL05EH;AKx5EC;EAA0B,YAAA;CL25E3B;AK15EC;EAAgC,YAAA;CL65EjC;AkBj4EC;EACE,UAAA;EACA,8BAAA;ClBm4EH;AkB33EC;;;EAGE,0BAAA;EACA,WAAA;ClB63EH;AkB13EC;;EAEE,oBAAA;ClB43EH;AkBx3EC;EACE,aAAA;ClB03EH;AkB92ED;EACE,yBAAA;ClBg3ED;AkBx0ED;EAtBI;;;;IACE,kBAAA;GlBo2EH;EkBj2EC;;;;;;;;IAEE,kBAAA;GlBy2EH;EkBt2EC;;;;;;;;IAEE,kBAAA;GlB82EH;CACF;AkBp2ED;EACE,oBAAA;ClBs2ED;AkB91ED;;EAEE,mBAAA;EACA,eAAA;EACA,iBAAA;EACA,oBAAA;ClBg2ED;AkBr2ED;;EAQI,iBAAA;EACA,mBAAA;EACA,iBAAA;EACA,oBAAA;EACA,gBAAA;ClBi2EH;AkB91ED;;;;EAIE,mBAAA;EACA,mBAAA;EACA,mBAAA;ClBg2ED;AkB71ED;;EAEE,iBAAA;ClB+1ED;AkB31ED;;EAEE,mBAAA;EACA,sBAAA;EACA,mBAAA;EACA,iBAAA;EACA,uBAAA;EACA,oBAAA;EACA,gBAAA;ClB61ED;AkB31ED;;EAEE,cAAA;EACA,kBAAA;ClB61ED;AkBp1EC;;;;;;EAGE,oBAAA;ClBy1EH;AkBn1EC;;;;EAEE,oBAAA;ClBu1EH;AkBj1EC;;;;EAGI,oBAAA;ClBo1EL;AkBz0ED;EAEE,iBAAA;EACA,oBAAA;EAEA,iBAAA;EACA,iBAAA;ClBy0ED;AkBv0EC;;EAEE,gBAAA;EACA,iBAAA;ClBy0EH;AkB5zED;ECnQE,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CnBkkFD;AmBhkFC;EACE,aAAA;EACA,kBAAA;CnBkkFH;AmB/jFC;;EAEE,aAAA;CnBikFH;AkBx0ED;EAEI,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;ClBy0EH;AkB/0ED;EASI,aAAA;EACA,kBAAA;ClBy0EH;AkBn1ED;;EAcI,aAAA;ClBy0EH;AkBv1ED;EAiBI,aAAA;EACA,iBAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;ClBy0EH;AkBr0ED;EC/RE,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;CnBumFD;AmBrmFC;EACE,aAAA;EACA,kBAAA;CnBumFH;AmBpmFC;;EAEE,aAAA;CnBsmFH;AkBj1ED;EAEI,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;ClBk1EH;AkBx1ED;EASI,aAAA;EACA,kBAAA;ClBk1EH;AkB51ED;;EAcI,aAAA;ClBk1EH;AkBh2ED;EAiBI,aAAA;EACA,iBAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;ClBk1EH;AkBz0ED;EAEE,mBAAA;ClB00ED;AkB50ED;EAMI,sBAAA;ClBy0EH;AkBr0ED;EACE,mBAAA;EACA,OAAA;EACA,SAAA;EACA,WAAA;EACA,eAAA;EACA,YAAA;EACA,aAAA;EACA,kBAAA;EACA,mBAAA;EACA,qBAAA;ClBu0ED;AkBr0ED;;;EAGE,YAAA;EACA,aAAA;EACA,kBAAA;ClBu0ED;AkBr0ED;;;EAGE,YAAA;EACA,aAAA;EACA,kBAAA;ClBu0ED;AkBn0ED;;;;;;;;;;EC1ZI,eAAA;CnByuFH;AkB/0ED;ECtZI,sBAAA;Ed+CF,yDAAA;EACQ,iDAAA;CL0rFT;AmBxuFG;EACE,sBAAA;Ed4CJ,0EAAA;EACQ,kEAAA;CL+rFT;AkBz1ED;EC5YI,eAAA;EACA,sBAAA;EACA,0BAAA;CnBwuFH;AkB91ED;ECtYI,eAAA;CnBuuFH;AkB91ED;;;;;;;;;;EC7ZI,eAAA;CnBuwFH;AkB12ED;ECzZI,sBAAA;Ed+CF,yDAAA;EACQ,iDAAA;CLwtFT;AmBtwFG;EACE,sBAAA;Ed4CJ,0EAAA;EACQ,kEAAA;CL6tFT;AkBp3ED;EC/YI,eAAA;EACA,sBAAA;EACA,0BAAA;CnBswFH;AkBz3ED;ECzYI,eAAA;CnBqwFH;AkBz3ED;;;;;;;;;;EChaI,eAAA;CnBqyFH;AkBr4ED;EC5ZI,sBAAA;Ed+CF,yDAAA;EACQ,iDAAA;CLsvFT;AmBpyFG;EACE,sBAAA;Ed4CJ,0EAAA;EACQ,kEAAA;CL2vFT;AkB/4ED;EClZI,eAAA;EACA,sBAAA;EACA,0BAAA;CnBoyFH;AkBp5ED;EC5YI,eAAA;CnBmyFH;AkBh5EC;EACE,UAAA;ClBk5EH;AkBh5EC;EACE,OAAA;ClBk5EH;AkBx4ED;EACE,eAAA;EACA,gBAAA;EACA,oBAAA;EACA,eAAA;ClB04ED;AkBvzED;EAwEA;IAtIM,sBAAA;IACA,iBAAA;IACA,uBAAA;GlBy3EH;EkBrvEH;IA/HM,sBAAA;IACA,YAAA;IACA,uBAAA;GlBu3EH;EkB1vEH;IAxHM,sBAAA;GlBq3EH;EkB7vEH;IApHM,sBAAA;IACA,uBAAA;GlBo3EH;EkBjwEH;;;IA9GQ,YAAA;GlBo3EL;EkBtwEH;IAxGM,YAAA;GlBi3EH;EkBzwEH;IApGM,iBAAA;IACA,uBAAA;GlBg3EH;EkB7wEH;;IA5FM,sBAAA;IACA,cAAA;IACA,iBAAA;IACA,uBAAA;GlB62EH;EkBpxEH;;IAtFQ,gBAAA;GlB82EL;EkBxxEH;;IAjFM,mBAAA;IACA,eAAA;GlB62EH;EkB7xEH;IA3EM,OAAA;GlB22EH;CACF;AkBj2ED;;;;EASI,cAAA;EACA,iBAAA;EACA,iBAAA;ClB81EH;AkBz2ED;;EAiBI,iBAAA;ClB41EH;AkB72ED;EJthBE,mBAAA;EACA,oBAAA;Cds4FD;AkB10EC;EAyBF;IAnCM,kBAAA;IACA,iBAAA;IACA,iBAAA;GlBw1EH;CACF;AkBx3ED;EAwCI,YAAA;ClBm1EH;AkBr0EC;EAUF;IAdQ,kBAAA;IACA,gBAAA;GlB60EL;CACF;AkBn0EC;EAEF;IANQ,iBAAA;IACA,gBAAA;GlB20EL;CACF;AoBp6FD;EACE,sBAAA;EACA,iBAAA;EACA,oBAAA;EACA,mBAAA;EACA,uBAAA;EACA,+BAAA;MAAA,2BAAA;EACA,gBAAA;EACA,uBAAA;EACA,8BAAA;EACA,oBAAA;EC0CA,kBAAA;EACA,gBAAA;EACA,wBAAA;EACA,mBAAA;EhB+JA,0BAAA;EACG,uBAAA;EACC,sBAAA;EACI,kBAAA;CL+tFT;AoBv6FG;;;;;;EdnBF,2CAAA;EACA,qBAAA;CNk8FD;AoB16FC;;;EAGE,YAAA;EACA,sBAAA;CpB46FH;AoBz6FC;;EAEE,WAAA;EACA,uBAAA;Ef2BF,yDAAA;EACQ,iDAAA;CLi5FT;AoBz6FC;;;EAGE,oBAAA;EE7CF,cAAA;EAGA,0BAAA;EjB8DA,yBAAA;EACQ,iBAAA;CL05FT;AoBz6FG;;EAEE,qBAAA;CpB26FL;AoBl6FD;EC3DE,YAAA;EACA,uBAAA;EACA,mBAAA;CrBg+FD;AqB99FC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBg+FP;AqB99FC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBg+FP;AqB99FC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBg+FP;AqB99FG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBs+FT;AqBn+FC;;;EAGE,uBAAA;CrBq+FH;AqBh+FG;;;;;;;;;EAGE,uBAAA;EACI,mBAAA;CrBw+FT;AoBv9FD;ECZI,YAAA;EACA,uBAAA;CrBs+FH;AoBx9FD;EC9DE,YAAA;EACA,0BAAA;EACA,sBAAA;CrByhGD;AqBvhGC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrByhGP;AqBvhGC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrByhGP;AqBvhGC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrByhGP;AqBvhGG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB+hGT;AqB5hGC;;;EAGE,uBAAA;CrB8hGH;AqBzhGG;;;;;;;;;EAGE,0BAAA;EACI,sBAAA;CrBiiGT;AoB7gGD;ECfI,eAAA;EACA,uBAAA;CrB+hGH;AoB7gGD;EClEE,YAAA;EACA,0BAAA;EACA,sBAAA;CrBklGD;AqBhlGC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBklGP;AqBhlGC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBklGP;AqBhlGC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBklGP;AqBhlGG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBwlGT;AqBrlGC;;;EAGE,uBAAA;CrBulGH;AqBllGG;;;;;;;;;EAGE,0BAAA;EACI,sBAAA;CrB0lGT;AoBlkGD;ECnBI,eAAA;EACA,uBAAA;CrBwlGH;AoBlkGD;ECtEE,YAAA;EACA,0BAAA;EACA,sBAAA;CrB2oGD;AqBzoGC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB2oGP;AqBzoGC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB2oGP;AqBzoGC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB2oGP;AqBzoGG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBipGT;AqB9oGC;;;EAGE,uBAAA;CrBgpGH;AqB3oGG;;;;;;;;;EAGE,0BAAA;EACI,sBAAA;CrBmpGT;AoBvnGD;ECvBI,eAAA;EACA,uBAAA;CrBipGH;AoBvnGD;EC1EE,YAAA;EACA,0BAAA;EACA,sBAAA;CrBosGD;AqBlsGC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBosGP;AqBlsGC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBosGP;AqBlsGC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBosGP;AqBlsGG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB0sGT;AqBvsGC;;;EAGE,uBAAA;CrBysGH;AqBpsGG;;;;;;;;;EAGE,0BAAA;EACI,sBAAA;CrB4sGT;AoB5qGD;EC3BI,eAAA;EACA,uBAAA;CrB0sGH;AoB5qGD;EC9EE,YAAA;EACA,0BAAA;EACA,sBAAA;CrB6vGD;AqB3vGC;;EAEE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB6vGP;AqB3vGC;EACE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB6vGP;AqB3vGC;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrB6vGP;AqB3vGG;;;;;;;;;EAGE,YAAA;EACA,0BAAA;EACI,sBAAA;CrBmwGT;AqBhwGC;;;EAGE,uBAAA;CrBkwGH;AqB7vGG;;;;;;;;;EAGE,0BAAA;EACI,sBAAA;CrBqwGT;AoBjuGD;EC/BI,eAAA;EACA,uBAAA;CrBmwGH;AoB5tGD;EACE,eAAA;EACA,oBAAA;EACA,iBAAA;CpB8tGD;AoB5tGC;;;;;EAKE,8BAAA;EfnCF,yBAAA;EACQ,iBAAA;CLkwGT;AoB7tGC;;;;EAIE,0BAAA;CpB+tGH;AoB7tGC;;EAEE,eAAA;EACA,2BAAA;EACA,8BAAA;CpB+tGH;AoB3tGG;;;;EAEE,eAAA;EACA,sBAAA;CpB+tGL;AoBttGD;;ECxEE,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;CrBkyGD;AoBztGD;;EC5EE,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CrByyGD;AoB5tGD;;EChFE,iBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CrBgzGD;AoB3tGD;EACE,eAAA;EACA,YAAA;CpB6tGD;AoBztGD;EACE,gBAAA;CpB2tGD;AoBptGC;;;EACE,YAAA;CpBwtGH;AuBl3GD;EACE,WAAA;ElBoLA,yCAAA;EACK,oCAAA;EACG,iCAAA;CLisGT;AuBr3GC;EACE,WAAA;CvBu3GH;AuBn3GD;EACE,cAAA;CvBq3GD;AuBn3GC;EAAY,eAAA;CvBs3Gb;AuBr3GC;EAAY,mBAAA;CvBw3Gb;AuBv3GC;EAAY,yBAAA;CvB03Gb;AuBv3GD;EACE,mBAAA;EACA,UAAA;EACA,iBAAA;ElBuKA,gDAAA;EACQ,2CAAA;KAAA,wCAAA;EAOR,mCAAA;EACQ,8BAAA;KAAA,2BAAA;EAGR,yCAAA;EACQ,oCAAA;KAAA,iCAAA;CL2sGT;AwBr5GD;EACE,sBAAA;EACA,SAAA;EACA,UAAA;EACA,iBAAA;EACA,uBAAA;EACA,uBAAA;EACA,yBAAA;EACA,oCAAA;EACA,mCAAA;CxBu5GD;AwBn5GD;;EAEE,mBAAA;CxBq5GD;AwBj5GD;EACE,WAAA;CxBm5GD;AwB/4GD;EACE,mBAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,cAAA;EACA,YAAA;EACA,iBAAA;EACA,eAAA;EACA,gBAAA;EACA,iBAAA;EACA,gBAAA;EACA,iBAAA;EACA,uBAAA;EACA,uBAAA;EACA,sCAAA;EACA,mBAAA;EnBsBA,oDAAA;EACQ,4CAAA;EmBrBR,qCAAA;UAAA,6BAAA;CxBk5GD;AwB74GC;EACE,SAAA;EACA,WAAA;CxB+4GH;AwBx6GD;ECzBE,YAAA;EACA,cAAA;EACA,iBAAA;EACA,0BAAA;CzBo8GD;AwB96GD;EAmCI,eAAA;EACA,kBAAA;EACA,YAAA;EACA,oBAAA;EACA,wBAAA;EACA,eAAA;EACA,oBAAA;CxB84GH;AwBx4GC;;EAEE,sBAAA;EACA,eAAA;EACA,0BAAA;CxB04GH;AwBp4GC;;;EAGE,YAAA;EACA,sBAAA;EACA,WAAA;EACA,0BAAA;CxBs4GH;AwB73GC;;;EAGE,eAAA;CxB+3GH;AwB33GC;;EAEE,sBAAA;EACA,8BAAA;EACA,uBAAA;EE3GF,oEAAA;EF6GE,oBAAA;CxB63GH;AwBx3GD;EAGI,eAAA;CxBw3GH;AwB33GD;EAQI,WAAA;CxBs3GH;AwB92GD;EACE,WAAA;EACA,SAAA;CxBg3GD;AwBx2GD;EACE,QAAA;EACA,YAAA;CxB02GD;AwBt2GD;EACE,eAAA;EACA,kBAAA;EACA,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,oBAAA;CxBw2GD;AwBp2GD;EACE,gBAAA;EACA,QAAA;EACA,SAAA;EACA,UAAA;EACA,OAAA;EACA,aAAA;CxBs2GD;AwBl2GD;EACE,SAAA;EACA,WAAA;CxBo2GD;AwB51GD;;EAII,cAAA;EACA,0BAAA;EACA,4BAAA;EACA,YAAA;CxB41GH;AwBn2GD;;EAWI,UAAA;EACA,aAAA;EACA,mBAAA;CxB41GH;AwBv0GD;EAXE;IApEA,WAAA;IACA,SAAA;GxB05GC;EwBv1GD;IA1DA,QAAA;IACA,YAAA;GxBo5GC;CACF;A2BpiHD;;EAEE,mBAAA;EACA,sBAAA;EACA,uBAAA;C3BsiHD;A2B1iHD;;EAMI,mBAAA;EACA,YAAA;C3BwiHH;A2BtiHG;;;;;;;;EAIE,WAAA;C3B4iHL;A2BtiHD;;;;EAKI,kBAAA;C3BuiHH;A2BliHD;EACE,kBAAA;C3BoiHD;A2BriHD;;;EAOI,YAAA;C3BmiHH;A2B1iHD;;;EAYI,iBAAA;C3BmiHH;A2B/hHD;EACE,iBAAA;C3BiiHD;A2B7hHD;EACE,eAAA;C3B+hHD;A2B9hHC;EClDA,8BAAA;EACG,2BAAA;C5BmlHJ;A2B7hHD;;EC/CE,6BAAA;EACG,0BAAA;C5BglHJ;A2B5hHD;EACE,YAAA;C3B8hHD;A2B5hHD;EACE,iBAAA;C3B8hHD;A2B5hHD;;ECnEE,8BAAA;EACG,2BAAA;C5BmmHJ;A2B3hHD;ECjEE,6BAAA;EACG,0BAAA;C5B+lHJ;A2B1hHD;;EAEE,WAAA;C3B4hHD;A2B3gHD;EACE,kBAAA;EACA,mBAAA;C3B6gHD;A2B3gHD;EACE,mBAAA;EACA,oBAAA;C3B6gHD;A2BxgHD;EtB/CE,yDAAA;EACQ,iDAAA;CL0jHT;A2BxgHC;EtBnDA,yBAAA;EACQ,iBAAA;CL8jHT;A2BrgHD;EACE,eAAA;C3BugHD;A2BpgHD;EACE,wBAAA;EACA,uBAAA;C3BsgHD;A2BngHD;EACE,wBAAA;C3BqgHD;A2B9/GD;;;EAII,eAAA;EACA,YAAA;EACA,YAAA;EACA,gBAAA;C3B+/GH;A2BtgHD;EAcM,YAAA;C3B2/GL;A2BzgHD;;;;EAsBI,iBAAA;EACA,eAAA;C3By/GH;A2Bp/GC;EACE,iBAAA;C3Bs/GH;A2Bp/GC;EC3KA,6BAAA;EACC,4BAAA;EAOD,8BAAA;EACC,6BAAA;C5B4pHF;A2Bt/GC;EC/KA,2BAAA;EACC,0BAAA;EAOD,gCAAA;EACC,+BAAA;C5BkqHF;A2Bv/GD;EACE,iBAAA;C3By/GD;A2Bv/GD;;EC/KE,8BAAA;EACC,6BAAA;C5B0qHF;A2Bt/GD;EC7LE,2BAAA;EACC,0BAAA;C5BsrHF;A2Bl/GD;EACE,eAAA;EACA,YAAA;EACA,oBAAA;EACA,0BAAA;C3Bo/GD;A2Bx/GD;;EAOI,YAAA;EACA,oBAAA;EACA,UAAA;C3Bq/GH;A2B9/GD;EAYI,YAAA;C3Bq/GH;A2BjgHD;EAgBI,WAAA;C3Bo/GH;A2Bn+GD;;;;EAKM,mBAAA;EACA,uBAAA;EACA,qBAAA;C3Bo+GL;A6B9sHD;EACE,mBAAA;EACA,eAAA;EACA,0BAAA;C7BgtHD;A6B7sHC;EACE,YAAA;EACA,gBAAA;EACA,iBAAA;C7B+sHH;A6BxtHD;EAeI,mBAAA;EACA,WAAA;EAKA,YAAA;EAEA,YAAA;EACA,iBAAA;C7BusHH;A6BrsHG;EACE,WAAA;C7BusHL;A6B7rHD;;;EV0BE,aAAA;EACA,mBAAA;EACA,gBAAA;EACA,uBAAA;EACA,mBAAA;CnBwqHD;AmBtqHC;;;EACE,aAAA;EACA,kBAAA;CnB0qHH;AmBvqHC;;;;;;EAEE,aAAA;CnB6qHH;A6B/sHD;;;EVqBE,aAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;CnB+rHD;AmB7rHC;;;EACE,aAAA;EACA,kBAAA;CnBisHH;AmB9rHC;;;;;;EAEE,aAAA;CnBosHH;A6B7tHD;;;EAGE,oBAAA;C7B+tHD;A6B7tHC;;;EACE,iBAAA;C7BiuHH;A6B7tHD;;EAEE,UAAA;EACA,oBAAA;EACA,uBAAA;C7B+tHD;A6B1tHD;EACE,kBAAA;EACA,gBAAA;EACA,oBAAA;EACA,eAAA;EACA,eAAA;EACA,mBAAA;EACA,0BAAA;EACA,uBAAA;EACA,mBAAA;C7B4tHD;A6BztHC;EACE,kBAAA;EACA,gBAAA;EACA,mBAAA;C7B2tHH;A6BztHC;EACE,mBAAA;EACA,gBAAA;EACA,mBAAA;C7B2tHH;A6B/uHD;;EA0BI,cAAA;C7BytHH;A6BptHD;;;;;;;EDpGE,8BAAA;EACG,2BAAA;C5Bi0HJ;A6BrtHD;EACE,gBAAA;C7ButHD;A6BrtHD;;;;;;;EDxGE,6BAAA;EACG,0BAAA;C5Bs0HJ;A6BttHD;EACE,eAAA;C7BwtHD;A6BntHD;EACE,mBAAA;EAGA,aAAA;EACA,oBAAA;C7BmtHD;A6BxtHD;EAUI,mBAAA;C7BitHH;A6B3tHD;EAYM,kBAAA;C7BktHL;A6B/sHG;;;EAGE,WAAA;C7BitHL;A6B5sHC;;EAGI,mBAAA;C7B6sHL;A6B1sHC;;EAGI,WAAA;EACA,kBAAA;C7B2sHL;A8B12HD;EACE,iBAAA;EACA,gBAAA;EACA,iBAAA;C9B42HD;A8B/2HD;EAOI,mBAAA;EACA,eAAA;C9B22HH;A8Bn3HD;EAWM,mBAAA;EACA,eAAA;EACA,mBAAA;C9B22HL;A8B12HK;;EAEE,sBAAA;EACA,0BAAA;C9B42HP;A8Bv2HG;EACE,eAAA;C9By2HL;A8Bv2HK;;EAEE,eAAA;EACA,sBAAA;EACA,8BAAA;EACA,oBAAA;C9By2HP;A8Bl2HG;;;EAGE,0BAAA;EACA,sBAAA;C9Bo2HL;A8B74HD;ELHE,YAAA;EACA,cAAA;EACA,iBAAA;EACA,0BAAA;CzBm5HD;A8Bn5HD;EA0DI,gBAAA;C9B41HH;A8Bn1HD;EACE,8BAAA;C9Bq1HD;A8Bt1HD;EAGI,YAAA;EAEA,oBAAA;C9Bq1HH;A8B11HD;EASM,kBAAA;EACA,wBAAA;EACA,8BAAA;EACA,2BAAA;C9Bo1HL;A8Bn1HK;EACE,mCAAA;C9Bq1HP;A8B/0HK;;;EAGE,eAAA;EACA,uBAAA;EACA,uBAAA;EACA,iCAAA;EACA,gBAAA;C9Bi1HP;A8B50HC;EAqDA,YAAA;EA8BA,iBAAA;C9B6vHD;A8Bh1HC;EAwDE,YAAA;C9B2xHH;A8Bn1HC;EA0DI,mBAAA;EACA,mBAAA;C9B4xHL;A8Bv1HC;EAgEE,UAAA;EACA,WAAA;C9B0xHH;A8B9wHD;EA0DA;IAjEM,oBAAA;IACA,UAAA;G9ByxHH;E8BztHH;IA9DQ,iBAAA;G9B0xHL;CACF;A8Bp2HC;EAuFE,gBAAA;EACA,mBAAA;C9BgxHH;A8Bx2HC;;;EA8FE,uBAAA;C9B+wHH;A8BjwHD;EA2BA;IApCM,8BAAA;IACA,2BAAA;G9B8wHH;E8B3uHH;;;IA9BM,0BAAA;G9B8wHH;CACF;A8B/2HD;EAEI,YAAA;C9Bg3HH;A8Bl3HD;EAMM,mBAAA;C9B+2HL;A8Br3HD;EASM,iBAAA;C9B+2HL;A8B12HK;;;EAGE,YAAA;EACA,0BAAA;C9B42HP;A8Bp2HD;EAEI,YAAA;C9Bq2HH;A8Bv2HD;EAIM,gBAAA;EACA,eAAA;C9Bs2HL;A8B11HD;EACE,YAAA;C9B41HD;A8B71HD;EAII,YAAA;C9B41HH;A8Bh2HD;EAMM,mBAAA;EACA,mBAAA;C9B61HL;A8Bp2HD;EAYI,UAAA;EACA,WAAA;C9B21HH;A8B/0HD;EA0DA;IAjEM,oBAAA;IACA,UAAA;G9B01HH;E8B1xHH;IA9DQ,iBAAA;G9B21HL;CACF;A8Bn1HD;EACE,iBAAA;C9Bq1HD;A8Bt1HD;EAKI,gBAAA;EACA,mBAAA;C9Bo1HH;A8B11HD;;;EAYI,uBAAA;C9Bm1HH;A8Br0HD;EA2BA;IApCM,8BAAA;IACA,2BAAA;G9Bk1HH;E8B/yHH;;;IA9BM,0BAAA;G9Bk1HH;CACF;A8Bz0HD;EAEI,cAAA;C9B00HH;A8B50HD;EAKI,eAAA;C9B00HH;A8Bj0HD;EAEE,iBAAA;EF3OA,2BAAA;EACC,0BAAA;C5B8iIF;A+BxiID;EACE,mBAAA;EACA,iBAAA;EACA,oBAAA;EACA,8BAAA;C/B0iID;A+BliID;EA8nBA;IAhoBI,mBAAA;G/BwiID;CACF;A+BzhID;EAgnBA;IAlnBI,YAAA;G/B+hID;CACF;A+BjhID;EACE,oBAAA;EACA,oBAAA;EACA,mBAAA;EACA,kCAAA;EACA,2DAAA;UAAA,mDAAA;EAEA,kCAAA;C/BkhID;A+BhhIC;EACE,iBAAA;C/BkhIH;A+Bt/HD;EA6jBA;IArlBI,YAAA;IACA,cAAA;IACA,yBAAA;YAAA,iBAAA;G/BkhID;E+BhhIC;IACE,0BAAA;IACA,wBAAA;IACA,kBAAA;IACA,6BAAA;G/BkhIH;E+B/gIC;IACE,oBAAA;G/BihIH;E+B5gIC;;;IAGE,gBAAA;IACA,iBAAA;G/B8gIH;CACF;A+B1gID;;EAGI,kBAAA;C/B2gIH;A+BtgIC;EAmjBF;;IArjBM,kBAAA;G/B6gIH;CACF;A+BpgID;;;;EAII,oBAAA;EACA,mBAAA;C/BsgIH;A+BhgIC;EAgiBF;;;;IAniBM,gBAAA;IACA,eAAA;G/B0gIH;CACF;A+B9/HD;EACE,cAAA;EACA,sBAAA;C/BggID;A+B3/HD;EA8gBA;IAhhBI,iBAAA;G/BigID;CACF;A+B7/HD;;EAEE,gBAAA;EACA,SAAA;EACA,QAAA;EACA,cAAA;C/B+/HD;A+Bz/HD;EAggBA;;IAlgBI,iBAAA;G/BggID;CACF;A+B9/HD;EACE,OAAA;EACA,sBAAA;C/BggID;A+B9/HD;EACE,UAAA;EACA,iBAAA;EACA,sBAAA;C/BggID;A+B1/HD;EACE,YAAA;EACA,mBAAA;EACA,gBAAA;EACA,kBAAA;EACA,aAAA;C/B4/HD;A+B1/HC;;EAEE,sBAAA;C/B4/HH;A+BrgID;EAaI,eAAA;C/B2/HH;A+Bl/HD;EALI;;IAEE,mBAAA;G/B0/HH;CACF;A+Bh/HD;EACE,mBAAA;EACA,aAAA;EACA,mBAAA;EACA,kBAAA;EC9LA,gBAAA;EACA,mBAAA;ED+LA,8BAAA;EACA,uBAAA;EACA,8BAAA;EACA,mBAAA;C/Bm/HD;A+B/+HC;EACE,WAAA;C/Bi/HH;A+B//HD;EAmBI,eAAA;EACA,YAAA;EACA,YAAA;EACA,mBAAA;C/B++HH;A+BrgID;EAyBI,gBAAA;C/B++HH;A+Bz+HD;EAqbA;IAvbI,cAAA;G/B++HD;CACF;A+Bt+HD;EACE,oBAAA;C/Bw+HD;A+Bz+HD;EAII,kBAAA;EACA,qBAAA;EACA,kBAAA;C/Bw+HH;A+B58HC;EA2YF;IAjaM,iBAAA;IACA,YAAA;IACA,YAAA;IACA,cAAA;IACA,8BAAA;IACA,UAAA;IACA,yBAAA;YAAA,iBAAA;G/Bs+HH;E+B3kHH;;IAxZQ,2BAAA;G/Bu+HL;E+B/kHH;IArZQ,kBAAA;G/Bu+HL;E+Bt+HK;;IAEE,uBAAA;G/Bw+HP;CACF;A+Bt9HD;EA+XA;IA1YI,YAAA;IACA,UAAA;G/Bq+HD;E+B5lHH;IAtYM,YAAA;G/Bq+HH;E+B/lHH;IApYQ,kBAAA;IACA,qBAAA;G/Bs+HL;CACF;A+B39HD;EACE,mBAAA;EACA,oBAAA;EACA,mBAAA;EACA,kCAAA;EACA,qCAAA;E1B9NA,6FAAA;EACQ,qFAAA;E2B/DR,gBAAA;EACA,mBAAA;ChC4vID;AkBtuHD;EAwEA;IAtIM,sBAAA;IACA,iBAAA;IACA,uBAAA;GlBwyHH;EkBpqHH;IA/HM,sBAAA;IACA,YAAA;IACA,uBAAA;GlBsyHH;EkBzqHH;IAxHM,sBAAA;GlBoyHH;EkB5qHH;IApHM,sBAAA;IACA,uBAAA;GlBmyHH;EkBhrHH;;;IA9GQ,YAAA;GlBmyHL;EkBrrHH;IAxGM,YAAA;GlBgyHH;EkBxrHH;IApGM,iBAAA;IACA,uBAAA;GlB+xHH;EkB5rHH;;IA5FM,sBAAA;IACA,cAAA;IACA,iBAAA;IACA,uBAAA;GlB4xHH;EkBnsHH;;IAtFQ,gBAAA;GlB6xHL;EkBvsHH;;IAjFM,mBAAA;IACA,eAAA;GlB4xHH;EkB5sHH;IA3EM,OAAA;GlB0xHH;CACF;A+BpgIC;EAmWF;IAzWM,mBAAA;G/B8gIH;E+B5gIG;IACE,iBAAA;G/B8gIL;CACF;A+B7/HD;EAoVA;IA5VI,YAAA;IACA,UAAA;IACA,eAAA;IACA,gBAAA;IACA,eAAA;IACA,kBAAA;I1BzPF,yBAAA;IACQ,iBAAA;GLmwIP;CACF;A+BngID;EACE,cAAA;EHpUA,2BAAA;EACC,0BAAA;C5B00IF;A+BngID;EACE,iBAAA;EHzUA,6BAAA;EACC,4BAAA;EAOD,8BAAA;EACC,6BAAA;C5By0IF;A+B//HD;EChVE,gBAAA;EACA,mBAAA;ChCk1ID;A+BhgIC;ECnVA,iBAAA;EACA,oBAAA;ChCs1ID;A+BjgIC;ECtVA,iBAAA;EACA,oBAAA;ChC01ID;A+B3/HD;EChWE,iBAAA;EACA,oBAAA;ChC81ID;A+Bv/HD;EAsSA;IA1SI,YAAA;IACA,kBAAA;IACA,mBAAA;G/B+/HD;CACF;A+Bl+HD;EAhBE;IExWA,uBAAA;GjC81IC;E+Br/HD;IE5WA,wBAAA;IF8WE,oBAAA;G/Bu/HD;E+Bz/HD;IAKI,gBAAA;G/Bu/HH;CACF;A+B9+HD;EACE,0BAAA;EACA,sBAAA;C/Bg/HD;A+Bl/HD;EAKI,YAAA;C/Bg/HH;A+B/+HG;;EAEE,eAAA;EACA,8BAAA;C/Bi/HL;A+B1/HD;EAcI,YAAA;C/B++HH;A+B7/HD;EAmBM,YAAA;C/B6+HL;A+B3+HK;;EAEE,YAAA;EACA,8BAAA;C/B6+HP;A+Bz+HK;;;EAGE,YAAA;EACA,0BAAA;C/B2+HP;A+Bv+HK;;;EAGE,YAAA;EACA,8BAAA;C/By+HP;A+BjhID;EA8CI,mBAAA;C/Bs+HH;A+Br+HG;;EAEE,uBAAA;C/Bu+HL;A+BxhID;EAoDM,uBAAA;C/Bu+HL;A+B3hID;;EA0DI,sBAAA;C/Bq+HH;A+B99HK;;;EAGE,0BAAA;EACA,YAAA;C/Bg+HP;A+B/7HC;EAoKF;IA7LU,YAAA;G/B49HP;E+B39HO;;IAEE,YAAA;IACA,8BAAA;G/B69HT;E+Bz9HO;;;IAGE,YAAA;IACA,0BAAA;G/B29HT;E+Bv9HO;;;IAGE,YAAA;IACA,8BAAA;G/By9HT;CACF;A+B3jID;EA8GI,YAAA;C/Bg9HH;A+B/8HG;EACE,YAAA;C/Bi9HL;A+BjkID;EAqHI,YAAA;C/B+8HH;A+B98HG;;EAEE,YAAA;C/Bg9HL;A+B58HK;;;;EAEE,YAAA;C/Bg9HP;A+Bx8HD;EACE,uBAAA;EACA,sBAAA;C/B08HD;A+B58HD;EAKI,eAAA;C/B08HH;A+Bz8HG;;EAEE,YAAA;EACA,8BAAA;C/B28HL;A+Bp9HD;EAcI,eAAA;C/By8HH;A+Bv9HD;EAmBM,eAAA;C/Bu8HL;A+Br8HK;;EAEE,YAAA;EACA,8BAAA;C/Bu8HP;A+Bn8HK;;;EAGE,YAAA;EACA,0BAAA;C/Bq8HP;A+Bj8HK;;;EAGE,YAAA;EACA,8BAAA;C/Bm8HP;A+B3+HD;EA+CI,mBAAA;C/B+7HH;A+B97HG;;EAEE,uBAAA;C/Bg8HL;A+Bl/HD;EAqDM,uBAAA;C/Bg8HL;A+Br/HD;;EA2DI,sBAAA;C/B87HH;A+Bx7HK;;;EAGE,0BAAA;EACA,YAAA;C/B07HP;A+Bn5HC;EAwBF;IAvDU,sBAAA;G/Bs7HP;E+B/3HH;IApDU,0BAAA;G/Bs7HP;E+Bl4HH;IAjDU,eAAA;G/Bs7HP;E+Br7HO;;IAEE,YAAA;IACA,8BAAA;G/Bu7HT;E+Bn7HO;;;IAGE,YAAA;IACA,0BAAA;G/Bq7HT;E+Bj7HO;;;IAGE,YAAA;IACA,8BAAA;G/Bm7HT;CACF;A+B3hID;EA+GI,eAAA;C/B+6HH;A+B96HG;EACE,YAAA;C/Bg7HL;A+BjiID;EAsHI,eAAA;C/B86HH;A+B76HG;;EAEE,YAAA;C/B+6HL;A+B36HK;;;;EAEE,YAAA;C/B+6HP;AkCzjJD;EACE,kBAAA;EACA,oBAAA;EACA,iBAAA;EACA,0BAAA;EACA,mBAAA;ClC2jJD;AkChkJD;EAQI,sBAAA;ClC2jJH;AkCnkJD;EAWM,kBAAA;EACA,eAAA;EACA,YAAA;ClC2jJL;AkCxkJD;EAkBI,eAAA;ClCyjJH;AmC7kJD;EACE,sBAAA;EACA,gBAAA;EACA,eAAA;EACA,mBAAA;CnC+kJD;AmCnlJD;EAOI,gBAAA;CnC+kJH;AmCtlJD;;EAUM,mBAAA;EACA,YAAA;EACA,kBAAA;EACA,wBAAA;EACA,sBAAA;EACA,eAAA;EACA,uBAAA;EACA,uBAAA;EACA,kBAAA;CnCglJL;AmC9kJG;;EAGI,eAAA;EPXN,+BAAA;EACG,4BAAA;C5B2lJJ;AmC7kJG;;EPvBF,gCAAA;EACG,6BAAA;C5BwmJJ;AmCxkJG;;;;EAEE,WAAA;EACA,eAAA;EACA,0BAAA;EACA,mBAAA;CnC4kJL;AmCtkJG;;;;;;EAGE,WAAA;EACA,YAAA;EACA,0BAAA;EACA,sBAAA;EACA,gBAAA;CnC2kJL;AmCloJD;;;;;;EAkEM,eAAA;EACA,uBAAA;EACA,mBAAA;EACA,oBAAA;CnCwkJL;AmC/jJD;;EC3EM,mBAAA;EACA,gBAAA;EACA,uBAAA;CpC8oJL;AoC5oJG;;ERKF,+BAAA;EACG,4BAAA;C5B2oJJ;AoC3oJG;;ERTF,gCAAA;EACG,6BAAA;C5BwpJJ;AmC1kJD;;EChFM,kBAAA;EACA,gBAAA;EACA,iBAAA;CpC8pJL;AoC5pJG;;ERKF,+BAAA;EACG,4BAAA;C5B2pJJ;AoC3pJG;;ERTF,gCAAA;EACG,6BAAA;C5BwqJJ;AqC3qJD;EACE,gBAAA;EACA,eAAA;EACA,iBAAA;EACA,mBAAA;CrC6qJD;AqCjrJD;EAOI,gBAAA;CrC6qJH;AqCprJD;;EAUM,sBAAA;EACA,kBAAA;EACA,uBAAA;EACA,uBAAA;EACA,oBAAA;CrC8qJL;AqC5rJD;;EAmBM,sBAAA;EACA,0BAAA;CrC6qJL;AqCjsJD;;EA2BM,aAAA;CrC0qJL;AqCrsJD;;EAkCM,YAAA;CrCuqJL;AqCzsJD;;;;EA2CM,eAAA;EACA,uBAAA;EACA,oBAAA;CrCoqJL;AsCltJD;EACE,gBAAA;EACA,wBAAA;EACA,eAAA;EACA,kBAAA;EACA,eAAA;EACA,YAAA;EACA,mBAAA;EACA,oBAAA;EACA,yBAAA;EACA,qBAAA;CtCotJD;AsChtJG;;EAEE,YAAA;EACA,sBAAA;EACA,gBAAA;CtCktJL;AsC7sJC;EACE,cAAA;CtC+sJH;AsC3sJC;EACE,mBAAA;EACA,UAAA;CtC6sJH;AsCtsJD;ECtCE,0BAAA;CvC+uJD;AuC5uJG;;EAEE,0BAAA;CvC8uJL;AsCzsJD;EC1CE,0BAAA;CvCsvJD;AuCnvJG;;EAEE,0BAAA;CvCqvJL;AsC5sJD;EC9CE,0BAAA;CvC6vJD;AuC1vJG;;EAEE,0BAAA;CvC4vJL;AsC/sJD;EClDE,0BAAA;CvCowJD;AuCjwJG;;EAEE,0BAAA;CvCmwJL;AsCltJD;ECtDE,0BAAA;CvC2wJD;AuCxwJG;;EAEE,0BAAA;CvC0wJL;AsCrtJD;EC1DE,0BAAA;CvCkxJD;AuC/wJG;;EAEE,0BAAA;CvCixJL;AwCnxJD;EACE,sBAAA;EACA,gBAAA;EACA,iBAAA;EACA,gBAAA;EACA,kBAAA;EACA,YAAA;EACA,eAAA;EACA,uBAAA;EACA,oBAAA;EACA,mBAAA;EACA,0BAAA;EACA,oBAAA;CxCqxJD;AwClxJC;EACE,cAAA;CxCoxJH;AwChxJC;EACE,mBAAA;EACA,UAAA;CxCkxJH;AwC/wJC;;EAEE,OAAA;EACA,iBAAA;CxCixJH;AwC5wJG;;EAEE,YAAA;EACA,sBAAA;EACA,gBAAA;CxC8wJL;AwCzwJC;;EAEE,eAAA;EACA,uBAAA;CxC2wJH;AwCxwJC;EACE,aAAA;CxC0wJH;AwCvwJC;EACE,kBAAA;CxCywJH;AwCtwJC;EACE,iBAAA;CxCwwJH;AyCl0JD;EACE,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,eAAA;EACA,0BAAA;CzCo0JD;AyCz0JD;;EASI,eAAA;CzCo0JH;AyC70JD;EAaI,oBAAA;EACA,gBAAA;EACA,iBAAA;CzCm0JH;AyCl1JD;EAmBI,0BAAA;CzCk0JH;AyC/zJC;;EAEE,mBAAA;EACA,mBAAA;EACA,oBAAA;CzCi0JH;AyC31JD;EA8BI,gBAAA;CzCg0JH;AyC9yJD;EACA;IAfI,kBAAA;IACA,qBAAA;GzCg0JD;EyC9zJC;;IAEE,mBAAA;IACA,oBAAA;GzCg0JH;EyCvzJH;;IAJM,gBAAA;GzC+zJH;CACF;A0C52JD;EACE,eAAA;EACA,aAAA;EACA,oBAAA;EACA,wBAAA;EACA,uBAAA;EACA,uBAAA;EACA,mBAAA;ErCiLA,4CAAA;EACK,uCAAA;EACG,oCAAA;CL8rJT;A0Cx3JD;;EAaI,kBAAA;EACA,mBAAA;C1C+2JH;A0C32JC;;;EAGE,sBAAA;C1C62JH;A0Cl4JD;EA0BI,aAAA;EACA,eAAA;C1C22JH;A2Cp4JD;EACE,cAAA;EACA,oBAAA;EACA,8BAAA;EACA,mBAAA;C3Cs4JD;A2C14JD;EAQI,cAAA;EAEA,eAAA;C3Co4JH;A2C94JD;EAeI,kBAAA;C3Ck4JH;A2Cj5JD;;EAqBI,iBAAA;C3Cg4JH;A2Cr5JD;EAyBI,gBAAA;C3C+3JH;A2Cv3JD;;EAEE,oBAAA;C3Cy3JD;A2C33JD;;EAMI,mBAAA;EACA,UAAA;EACA,aAAA;EACA,eAAA;C3Cy3JH;A2Cj3JD;ECvDE,0BAAA;EACA,sBAAA;EACA,eAAA;C5C26JD;A2Ct3JD;EClDI,0BAAA;C5C26JH;A2Cz3JD;EC/CI,eAAA;C5C26JH;A2Cx3JD;EC3DE,0BAAA;EACA,sBAAA;EACA,eAAA;C5Cs7JD;A2C73JD;ECtDI,0BAAA;C5Cs7JH;A2Ch4JD;ECnDI,eAAA;C5Cs7JH;A2C/3JD;EC/DE,0BAAA;EACA,sBAAA;EACA,eAAA;C5Ci8JD;A2Cp4JD;EC1DI,0BAAA;C5Ci8JH;A2Cv4JD;ECvDI,eAAA;C5Ci8JH;A2Ct4JD;ECnEE,0BAAA;EACA,sBAAA;EACA,eAAA;C5C48JD;A2C34JD;EC9DI,0BAAA;C5C48JH;A2C94JD;EC3DI,eAAA;C5C48JH;A6C98JD;EACE;IAAQ,4BAAA;G7Ci9JP;E6Ch9JD;IAAQ,yBAAA;G7Cm9JP;CACF;A6Ch9JD;EACE;IAAQ,4BAAA;G7Cm9JP;E6Cl9JD;IAAQ,yBAAA;G7Cq9JP;CACF;A6Cx9JD;EACE;IAAQ,4BAAA;G7Cm9JP;E6Cl9JD;IAAQ,yBAAA;G7Cq9JP;CACF;A6C98JD;EACE,iBAAA;EACA,aAAA;EACA,oBAAA;EACA,0BAAA;EACA,mBAAA;ExCsCA,uDAAA;EACQ,+CAAA;CL26JT;A6C78JD;EACE,YAAA;EACA,UAAA;EACA,aAAA;EACA,gBAAA;EACA,kBAAA;EACA,YAAA;EACA,mBAAA;EACA,0BAAA;ExCyBA,uDAAA;EACQ,+CAAA;EAyHR,oCAAA;EACK,+BAAA;EACG,4BAAA;CL+zJT;A6C18JD;;ECCI,8MAAA;EACA,yMAAA;EACA,sMAAA;EDAF,mCAAA;UAAA,2BAAA;C7C88JD;A6Cv8JD;;ExC5CE,2DAAA;EACK,sDAAA;EACG,mDAAA;CLu/JT;A6Cp8JD;EErEE,0BAAA;C/C4gKD;A+CzgKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9C49JH;A6Cx8JD;EEzEE,0BAAA;C/CohKD;A+CjhKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9Co+JH;A6C58JD;EE7EE,0BAAA;C/C4hKD;A+CzhKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9C4+JH;A6Ch9JD;EEjFE,0BAAA;C/CoiKD;A+CjiKC;EDgDE,8MAAA;EACA,yMAAA;EACA,sMAAA;C9Co/JH;AgD5iKD;EAEE,iBAAA;ChD6iKD;AgD3iKC;EACE,cAAA;ChD6iKH;AgDziKD;;EAEE,QAAA;EACA,iBAAA;ChD2iKD;AgDxiKD;EACE,eAAA;ChD0iKD;AgDviKD;EACE,eAAA;ChDyiKD;AgDtiKC;EACE,gBAAA;ChDwiKH;AgDpiKD;;EAEE,mBAAA;ChDsiKD;AgDniKD;;EAEE,oBAAA;ChDqiKD;AgDliKD;;;EAGE,oBAAA;EACA,oBAAA;ChDoiKD;AgDjiKD;EACE,uBAAA;ChDmiKD;AgDhiKD;EACE,uBAAA;ChDkiKD;AgD9hKD;EACE,cAAA;EACA,mBAAA;ChDgiKD;AgD1hKD;EACE,gBAAA;EACA,iBAAA;ChD4hKD;AiDnlKD;EAEE,oBAAA;EACA,gBAAA;CjDolKD;AiD5kKD;EACE,mBAAA;EACA,eAAA;EACA,mBAAA;EAEA,oBAAA;EACA,uBAAA;EACA,uBAAA;CjD6kKD;AiD1kKC;ErB3BA,6BAAA;EACC,4BAAA;C5BwmKF;AiD3kKC;EACE,iBAAA;ErBvBF,gCAAA;EACC,+BAAA;C5BqmKF;AiDpkKD;;EAEE,YAAA;CjDskKD;AiDxkKD;;EAKI,YAAA;CjDukKH;AiDnkKC;;;;EAEE,sBAAA;EACA,YAAA;EACA,0BAAA;CjDukKH;AiDnkKD;EACE,YAAA;EACA,iBAAA;CjDqkKD;AiDhkKC;;;EAGE,0BAAA;EACA,eAAA;EACA,oBAAA;CjDkkKH;AiDvkKC;;;EASI,eAAA;CjDmkKL;AiD5kKC;;;EAYI,eAAA;CjDqkKL;AiDhkKC;;;EAGE,WAAA;EACA,YAAA;EACA,0BAAA;EACA,sBAAA;CjDkkKH;AiDxkKC;;;;;;;;;EAYI,eAAA;CjDukKL;AiDnlKC;;;EAeI,eAAA;CjDykKL;AkD3qKC;EACE,eAAA;EACA,0BAAA;ClD6qKH;AkD3qKG;;EAEE,eAAA;ClD6qKL;AkD/qKG;;EAKI,eAAA;ClD8qKP;AkD3qKK;;;;EAEE,eAAA;EACA,0BAAA;ClD+qKP;AkD7qKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClDkrKP;AkDxsKC;EACE,eAAA;EACA,0BAAA;ClD0sKH;AkDxsKG;;EAEE,eAAA;ClD0sKL;AkD5sKG;;EAKI,eAAA;ClD2sKP;AkDxsKK;;;;EAEE,eAAA;EACA,0BAAA;ClD4sKP;AkD1sKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClD+sKP;AkDruKC;EACE,eAAA;EACA,0BAAA;ClDuuKH;AkDruKG;;EAEE,eAAA;ClDuuKL;AkDzuKG;;EAKI,eAAA;ClDwuKP;AkDruKK;;;;EAEE,eAAA;EACA,0BAAA;ClDyuKP;AkDvuKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClD4uKP;AkDlwKC;EACE,eAAA;EACA,0BAAA;ClDowKH;AkDlwKG;;EAEE,eAAA;ClDowKL;AkDtwKG;;EAKI,eAAA;ClDqwKP;AkDlwKK;;;;EAEE,eAAA;EACA,0BAAA;ClDswKP;AkDpwKK;;;;;;EAGE,YAAA;EACA,0BAAA;EACA,sBAAA;ClDywKP;AiDxqKD;EACE,cAAA;EACA,mBAAA;CjD0qKD;AiDxqKD;EACE,iBAAA;EACA,iBAAA;CjD0qKD;AmDpyKD;EACE,oBAAA;EACA,uBAAA;EACA,8BAAA;EACA,mBAAA;E9C0DA,kDAAA;EACQ,0CAAA;CL6uKT;AmDnyKD;EACE,cAAA;CnDqyKD;AmDhyKD;EACE,mBAAA;EACA,qCAAA;EvBpBA,6BAAA;EACC,4BAAA;C5BuzKF;AmDtyKD;EAMI,eAAA;CnDmyKH;AmD9xKD;EACE,cAAA;EACA,iBAAA;EACA,gBAAA;EACA,eAAA;CnDgyKD;AmDpyKD;;;;;EAWI,eAAA;CnDgyKH;AmD3xKD;EACE,mBAAA;EACA,0BAAA;EACA,2BAAA;EvBxCA,gCAAA;EACC,+BAAA;C5Bs0KF;AmDrxKD;;EAGI,iBAAA;CnDsxKH;AmDzxKD;;EAMM,oBAAA;EACA,iBAAA;CnDuxKL;AmDnxKG;;EAEI,cAAA;EvBvEN,6BAAA;EACC,4BAAA;C5B61KF;AmDjxKG;;EAEI,iBAAA;EvBvEN,gCAAA;EACC,+BAAA;C5B21KF;AmD1yKD;EvB1DE,2BAAA;EACC,0BAAA;C5Bu2KF;AmD7wKD;EAEI,oBAAA;CnD8wKH;AmD3wKD;EACE,oBAAA;CnD6wKD;AmDrwKD;;;EAII,iBAAA;CnDswKH;AmD1wKD;;;EAOM,mBAAA;EACA,oBAAA;CnDwwKL;AmDhxKD;;EvBzGE,6BAAA;EACC,4BAAA;C5B63KF;AmDrxKD;;;;EAmBQ,4BAAA;EACA,6BAAA;CnDwwKP;AmD5xKD;;;;;;;;EAwBU,4BAAA;CnD8wKT;AmDtyKD;;;;;;;;EA4BU,6BAAA;CnDoxKT;AmDhzKD;;EvBjGE,gCAAA;EACC,+BAAA;C5Bq5KF;AmDrzKD;;;;EAyCQ,+BAAA;EACA,gCAAA;CnDkxKP;AmD5zKD;;;;;;;;EA8CU,+BAAA;CnDwxKT;AmDt0KD;;;;;;;;EAkDU,gCAAA;CnD8xKT;AmDh1KD;;;;EA2DI,2BAAA;CnD2xKH;AmDt1KD;;EA+DI,cAAA;CnD2xKH;AmD11KD;;EAmEI,UAAA;CnD2xKH;AmD91KD;;;;;;;;;;;;EA0EU,eAAA;CnDkyKT;AmD52KD;;;;;;;;;;;;EA8EU,gBAAA;CnD4yKT;AmD13KD;;;;;;;;EAuFU,iBAAA;CnD6yKT;AmDp4KD;;;;;;;;EAgGU,iBAAA;CnD8yKT;AmD94KD;EAsGI,UAAA;EACA,iBAAA;CnD2yKH;AmDjyKD;EACE,oBAAA;CnDmyKD;AmDpyKD;EAKI,iBAAA;EACA,mBAAA;CnDkyKH;AmDxyKD;EASM,gBAAA;CnDkyKL;AmD3yKD;EAcI,iBAAA;CnDgyKH;AmD9yKD;;EAkBM,2BAAA;CnDgyKL;AmDlzKD;EAuBI,cAAA;CnD8xKH;AmDrzKD;EAyBM,8BAAA;CnD+xKL;AmDxxKD;EC1PE,mBAAA;CpDqhLD;AoDnhLC;EACE,eAAA;EACA,0BAAA;EACA,mBAAA;CpDqhLH;AoDxhLC;EAMI,uBAAA;CpDqhLL;AoD3hLC;EASI,eAAA;EACA,0BAAA;CpDqhLL;AoDlhLC;EAEI,0BAAA;CpDmhLL;AmDvyKD;EC7PE,sBAAA;CpDuiLD;AoDriLC;EACE,YAAA;EACA,0BAAA;EACA,sBAAA;CpDuiLH;AoD1iLC;EAMI,0BAAA;CpDuiLL;AoD7iLC;EASI,eAAA;EACA,uBAAA;CpDuiLL;AoDpiLC;EAEI,6BAAA;CpDqiLL;AmDtzKD;EChQE,sBAAA;CpDyjLD;AoDvjLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpDyjLH;AoD5jLC;EAMI,0BAAA;CpDyjLL;AoD/jLC;EASI,eAAA;EACA,0BAAA;CpDyjLL;AoDtjLC;EAEI,6BAAA;CpDujLL;AmDr0KD;ECnQE,sBAAA;CpD2kLD;AoDzkLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpD2kLH;AoD9kLC;EAMI,0BAAA;CpD2kLL;AoDjlLC;EASI,eAAA;EACA,0BAAA;CpD2kLL;AoDxkLC;EAEI,6BAAA;CpDykLL;AmDp1KD;ECtQE,sBAAA;CpD6lLD;AoD3lLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpD6lLH;AoDhmLC;EAMI,0BAAA;CpD6lLL;AoDnmLC;EASI,eAAA;EACA,0BAAA;CpD6lLL;AoD1lLC;EAEI,6BAAA;CpD2lLL;AmDn2KD;ECzQE,sBAAA;CpD+mLD;AoD7mLC;EACE,eAAA;EACA,0BAAA;EACA,sBAAA;CpD+mLH;AoDlnLC;EAMI,0BAAA;CpD+mLL;AoDrnLC;EASI,eAAA;EACA,0BAAA;CpD+mLL;AoD5mLC;EAEI,6BAAA;CpD6mLL;AqD7nLD;EACE,mBAAA;EACA,eAAA;EACA,UAAA;EACA,WAAA;EACA,iBAAA;CrD+nLD;AqDpoLD;;;;;EAYI,mBAAA;EACA,OAAA;EACA,QAAA;EACA,UAAA;EACA,aAAA;EACA,YAAA;EACA,UAAA;CrD+nLH;AqD1nLD;EACE,uBAAA;CrD4nLD;AqDxnLD;EACE,oBAAA;CrD0nLD;AsDrpLD;EACE,iBAAA;EACA,cAAA;EACA,oBAAA;EACA,0BAAA;EACA,0BAAA;EACA,mBAAA;EjDwDA,wDAAA;EACQ,gDAAA;CLgmLT;AsD/pLD;EASI,mBAAA;EACA,kCAAA;CtDypLH;AsDppLD;EACE,cAAA;EACA,mBAAA;CtDspLD;AsDppLD;EACE,aAAA;EACA,mBAAA;CtDspLD;AuD5qLD;EACE,aAAA;EACA,gBAAA;EACA,kBAAA;EACA,eAAA;EACA,YAAA;EACA,0BAAA;EjCRA,aAAA;EAGA,0BAAA;CtBqrLD;AuD7qLC;;EAEE,YAAA;EACA,sBAAA;EACA,gBAAA;EjCfF,aAAA;EAGA,0BAAA;CtB6rLD;AuDzqLC;EACE,WAAA;EACA,gBAAA;EACA,wBAAA;EACA,UAAA;EACA,yBAAA;CvD2qLH;AwDhsLD;EACE,iBAAA;CxDksLD;AwD9rLD;EACE,cAAA;EACA,iBAAA;EACA,gBAAA;EACA,OAAA;EACA,SAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,kCAAA;EAIA,WAAA;CxD6rLD;AwD1rLC;EnD+GA,sCAAA;EACI,kCAAA;EACC,iCAAA;EACG,8BAAA;EAkER,oDAAA;EAEK,0CAAA;EACG,oCAAA;CL6gLT;AwDhsLC;EnD2GA,mCAAA;EACI,+BAAA;EACC,8BAAA;EACG,2BAAA;CLwlLT;AwDpsLD;EACE,mBAAA;EACA,iBAAA;CxDssLD;AwDlsLD;EACE,mBAAA;EACA,YAAA;EACA,aAAA;CxDosLD;AwDhsLD;EACE,mBAAA;EACA,uBAAA;EACA,uBAAA;EACA,qCAAA;EACA,mBAAA;EnDaA,iDAAA;EACQ,yCAAA;EmDZR,qCAAA;UAAA,6BAAA;EAEA,WAAA;CxDksLD;AwD9rLD;EACE,gBAAA;EACA,OAAA;EACA,SAAA;EACA,UAAA;EACA,QAAA;EACA,cAAA;EACA,uBAAA;CxDgsLD;AwD9rLC;ElCrEA,WAAA;EAGA,yBAAA;CtBowLD;AwDjsLC;ElCtEA,aAAA;EAGA,0BAAA;CtBwwLD;AwDhsLD;EACE,cAAA;EACA,iCAAA;CxDksLD;AwD9rLD;EACE,iBAAA;CxDgsLD;AwD5rLD;EACE,UAAA;EACA,wBAAA;CxD8rLD;AwDzrLD;EACE,mBAAA;EACA,cAAA;CxD2rLD;AwDvrLD;EACE,cAAA;EACA,kBAAA;EACA,8BAAA;CxDyrLD;AwD5rLD;EAQI,iBAAA;EACA,iBAAA;CxDurLH;AwDhsLD;EAaI,kBAAA;CxDsrLH;AwDnsLD;EAiBI,eAAA;CxDqrLH;AwDhrLD;EACE,mBAAA;EACA,aAAA;EACA,YAAA;EACA,aAAA;EACA,iBAAA;CxDkrLD;AwDhqLD;EAZE;IACE,aAAA;IACA,kBAAA;GxD+qLD;EwD7qLD;InDvEA,kDAAA;IACQ,0CAAA;GLuvLP;EwD5qLD;IAAY,aAAA;GxD+qLX;CACF;AwD1qLD;EAFE;IAAY,aAAA;GxDgrLX;CACF;AyD/zLD;EACE,mBAAA;EACA,cAAA;EACA,eAAA;ECRA,4DAAA;EAEA,mBAAA;EACA,oBAAA;EACA,uBAAA;EACA,iBAAA;EACA,wBAAA;EACA,iBAAA;EACA,kBAAA;EACA,sBAAA;EACA,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,mBAAA;EACA,qBAAA;EACA,kBAAA;EDHA,gBAAA;EnCVA,WAAA;EAGA,yBAAA;CtBs1LD;AyD30LC;EnCdA,aAAA;EAGA,0BAAA;CtB01LD;AyD90LC;EAAW,iBAAA;EAAmB,eAAA;CzDk1L/B;AyDj1LC;EAAW,iBAAA;EAAmB,eAAA;CzDq1L/B;AyDp1LC;EAAW,gBAAA;EAAmB,eAAA;CzDw1L/B;AyDv1LC;EAAW,kBAAA;EAAmB,eAAA;CzD21L/B;AyDv1LD;EACE,iBAAA;EACA,iBAAA;EACA,YAAA;EACA,mBAAA;EACA,uBAAA;EACA,mBAAA;CzDy1LD;AyDr1LD;EACE,mBAAA;EACA,SAAA;EACA,UAAA;EACA,0BAAA;EACA,oBAAA;CzDu1LD;AyDn1LC;EACE,UAAA;EACA,UAAA;EACA,kBAAA;EACA,wBAAA;EACA,uBAAA;CzDq1LH;AyDn1LC;EACE,UAAA;EACA,WAAA;EACA,oBAAA;EACA,wBAAA;EACA,uBAAA;CzDq1LH;AyDn1LC;EACE,UAAA;EACA,UAAA;EACA,oBAAA;EACA,wBAAA;EACA,uBAAA;CzDq1LH;AyDn1LC;EACE,SAAA;EACA,QAAA;EACA,iBAAA;EACA,4BAAA;EACA,yBAAA;CzDq1LH;AyDn1LC;EACE,SAAA;EACA,SAAA;EACA,iBAAA;EACA,4BAAA;EACA,wBAAA;CzDq1LH;AyDn1LC;EACE,OAAA;EACA,UAAA;EACA,kBAAA;EACA,wBAAA;EACA,0BAAA;CzDq1LH;AyDn1LC;EACE,OAAA;EACA,WAAA;EACA,iBAAA;EACA,wBAAA;EACA,0BAAA;CzDq1LH;AyDn1LC;EACE,OAAA;EACA,UAAA;EACA,iBAAA;EACA,wBAAA;EACA,0BAAA;CzDq1LH;A2Dl7LD;EACE,mBAAA;EACA,OAAA;EACA,QAAA;EACA,cAAA;EACA,cAAA;EACA,iBAAA;EACA,aAAA;EDXA,4DAAA;EAEA,mBAAA;EACA,oBAAA;EACA,uBAAA;EACA,iBAAA;EACA,wBAAA;EACA,iBAAA;EACA,kBAAA;EACA,sBAAA;EACA,kBAAA;EACA,qBAAA;EACA,oBAAA;EACA,mBAAA;EACA,qBAAA;EACA,kBAAA;ECAA,gBAAA;EAEA,uBAAA;EACA,qCAAA;UAAA,6BAAA;EACA,uBAAA;EACA,qCAAA;EACA,mBAAA;EtD8CA,kDAAA;EACQ,0CAAA;CLk5LT;A2D77LC;EAAY,kBAAA;C3Dg8Lb;A2D/7LC;EAAY,kBAAA;C3Dk8Lb;A2Dj8LC;EAAY,iBAAA;C3Do8Lb;A2Dn8LC;EAAY,mBAAA;C3Ds8Lb;A2Dn8LD;EACE,UAAA;EACA,kBAAA;EACA,gBAAA;EACA,0BAAA;EACA,iCAAA;EACA,2BAAA;C3Dq8LD;A2Dl8LD;EACE,kBAAA;C3Do8LD;A2D57LC;;EAEE,mBAAA;EACA,eAAA;EACA,SAAA;EACA,UAAA;EACA,0BAAA;EACA,oBAAA;C3D87LH;A2D37LD;EACE,mBAAA;C3D67LD;A2D37LD;EACE,mBAAA;EACA,YAAA;C3D67LD;A2Dz7LC;EACE,UAAA;EACA,mBAAA;EACA,uBAAA;EACA,0BAAA;EACA,sCAAA;EACA,cAAA;C3D27LH;A2D17LG;EACE,aAAA;EACA,YAAA;EACA,mBAAA;EACA,uBAAA;EACA,uBAAA;C3D47LL;A2Dz7LC;EACE,SAAA;EACA,YAAA;EACA,kBAAA;EACA,qBAAA;EACA,4BAAA;EACA,wCAAA;C3D27LH;A2D17LG;EACE,aAAA;EACA,UAAA;EACA,cAAA;EACA,qBAAA;EACA,yBAAA;C3D47LL;A2Dz7LC;EACE,UAAA;EACA,mBAAA;EACA,oBAAA;EACA,6BAAA;EACA,yCAAA;EACA,WAAA;C3D27LH;A2D17LG;EACE,aAAA;EACA,SAAA;EACA,mBAAA;EACA,oBAAA;EACA,0BAAA;C3D47LL;A2Dx7LC;EACE,SAAA;EACA,aAAA;EACA,kBAAA;EACA,sBAAA;EACA,2BAAA;EACA,uCAAA;C3D07LH;A2Dz7LG;EACE,aAAA;EACA,WAAA;EACA,sBAAA;EACA,wBAAA;EACA,cAAA;C3D27LL;A4DpjMD;EACE,mBAAA;C5DsjMD;A4DnjMD;EACE,mBAAA;EACA,iBAAA;EACA,YAAA;C5DqjMD;A4DxjMD;EAMI,cAAA;EACA,mBAAA;EvD6KF,0CAAA;EACK,qCAAA;EACG,kCAAA;CLy4LT;A4D/jMD;;EAcM,eAAA;C5DqjML;A4D3hMC;EA4NF;IvD3DE,uDAAA;IAEK,6CAAA;IACG,uCAAA;IA7JR,oCAAA;IAEQ,4BAAA;IA+GR,4BAAA;IAEQ,oBAAA;GL86LP;E4DzjMG;;IvDmHJ,2CAAA;IACQ,mCAAA;IuDjHF,QAAA;G5D4jML;E4D1jMG;;IvD8GJ,4CAAA;IACQ,oCAAA;IuD5GF,QAAA;G5D6jML;E4D3jMG;;;IvDyGJ,wCAAA;IACQ,gCAAA;IuDtGF,QAAA;G5D8jML;CACF;A4DpmMD;;;EA6CI,eAAA;C5D4jMH;A4DzmMD;EAiDI,QAAA;C5D2jMH;A4D5mMD;;EAsDI,mBAAA;EACA,OAAA;EACA,YAAA;C5D0jMH;A4DlnMD;EA4DI,WAAA;C5DyjMH;A4DrnMD;EA+DI,YAAA;C5DyjMH;A4DxnMD;;EAmEI,QAAA;C5DyjMH;A4D5nMD;EAuEI,YAAA;C5DwjMH;A4D/nMD;EA0EI,WAAA;C5DwjMH;A4DhjMD;EACE,mBAAA;EACA,OAAA;EACA,QAAA;EACA,UAAA;EACA,WAAA;EtC9FA,aAAA;EAGA,0BAAA;EsC6FA,gBAAA;EACA,YAAA;EACA,mBAAA;EACA,0CAAA;EACA,mCAAA;C5DmjMD;A4D9iMC;EdnGE,mGAAA;EACA,8FAAA;EACA,qHAAA;EAAA,+FAAA;EACA,4BAAA;EACA,uHAAA;C9CopMH;A4DljMC;EACE,WAAA;EACA,SAAA;EdxGA,mGAAA;EACA,8FAAA;EACA,qHAAA;EAAA,+FAAA;EACA,4BAAA;EACA,uHAAA;C9C6pMH;A4DpjMC;;EAEE,WAAA;EACA,YAAA;EACA,sBAAA;EtCvHF,aAAA;EAGA,0BAAA;CtB4qMD;A4DtlMD;;;;EAuCI,mBAAA;EACA,SAAA;EACA,kBAAA;EACA,WAAA;EACA,sBAAA;C5DqjMH;A4DhmMD;;EA+CI,UAAA;EACA,mBAAA;C5DqjMH;A4DrmMD;;EAoDI,WAAA;EACA,oBAAA;C5DqjMH;A4D1mMD;;EAyDI,YAAA;EACA,aAAA;EACA,eAAA;EACA,mBAAA;C5DqjMH;A4DhjMG;EACE,iBAAA;C5DkjML;A4D9iMG;EACE,iBAAA;C5DgjML;A4DtiMD;EACE,mBAAA;EACA,aAAA;EACA,UAAA;EACA,YAAA;EACA,WAAA;EACA,kBAAA;EACA,gBAAA;EACA,iBAAA;EACA,mBAAA;C5DwiMD;A4DjjMD;EAYI,sBAAA;EACA,YAAA;EACA,aAAA;EACA,YAAA;EACA,oBAAA;EACA,uBAAA;EACA,oBAAA;EACA,gBAAA;EAWA,0BAAA;EACA,mCAAA;C5D8hMH;A4D7jMD;EAkCI,UAAA;EACA,YAAA;EACA,aAAA;EACA,uBAAA;C5D8hMH;A4DvhMD;EACE,mBAAA;EACA,UAAA;EACA,WAAA;EACA,aAAA;EACA,YAAA;EACA,kBAAA;EACA,qBAAA;EACA,YAAA;EACA,mBAAA;EACA,0CAAA;C5DyhMD;A4DxhMC;EACE,kBAAA;C5D0hMH;A4Dj/LD;EAhCE;;;;IAKI,YAAA;IACA,aAAA;IACA,kBAAA;IACA,gBAAA;G5DmhMH;E4D3hMD;;IAYI,mBAAA;G5DmhMH;E4D/hMD;;IAgBI,oBAAA;G5DmhMH;E4D9gMD;IACE,UAAA;IACA,WAAA;IACA,qBAAA;G5DghMD;E4D5gMD;IACE,aAAA;G5D8gMD;CACF;A6D7wMC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAEE,aAAA;EACA,eAAA;C7D6yMH;A6D3yMC;;;;;;;;;;;;;;;;EACE,YAAA;C7D4zMH;AiCp0MD;E6BRE,eAAA;EACA,kBAAA;EACA,mBAAA;C9D+0MD;AiCt0MD;EACE,wBAAA;CjCw0MD;AiCt0MD;EACE,uBAAA;CjCw0MD;AiCh0MD;EACE,yBAAA;CjCk0MD;AiCh0MD;EACE,0BAAA;CjCk0MD;AiCh0MD;EACE,mBAAA;CjCk0MD;AiCh0MD;E8BzBE,YAAA;EACA,mBAAA;EACA,kBAAA;EACA,8BAAA;EACA,UAAA;C/D41MD;AiC9zMD;EACE,yBAAA;CjCg0MD;AiCzzMD;EACE,gBAAA;CjC2zMD;AgE51MD;EACE,oBAAA;ChE81MD;AgEx1MD;;;;ECdE,yBAAA;CjE42MD;AgEv1MD;;;;;;;;;;;;EAYE,yBAAA;ChEy1MD;AgEl1MD;EA6IA;IC7LE,0BAAA;GjEs4MC;EiEr4MD;IAAU,0BAAA;GjEw4MT;EiEv4MD;IAAU,8BAAA;GjE04MT;EiEz4MD;;IACU,+BAAA;GjE44MT;CACF;AgE51MD;EAwIA;IA1II,0BAAA;GhEk2MD;CACF;AgE51MD;EAmIA;IArII,2BAAA;GhEk2MD;CACF;AgE51MD;EA8HA;IAhII,iCAAA;GhEk2MD;CACF;AgE31MD;EAwHA;IC7LE,0BAAA;GjEo6MC;EiEn6MD;IAAU,0BAAA;GjEs6MT;EiEr6MD;IAAU,8BAAA;GjEw6MT;EiEv6MD;;IACU,+BAAA;GjE06MT;CACF;AgEr2MD;EAmHA;IArHI,0BAAA;GhE22MD;CACF;AgEr2MD;EA8GA;IAhHI,2BAAA;GhE22MD;CACF;AgEr2MD;EAyGA;IA3GI,iCAAA;GhE22MD;CACF;AgEp2MD;EAmGA;IC7LE,0BAAA;GjEk8MC;EiEj8MD;IAAU,0BAAA;GjEo8MT;EiEn8MD;IAAU,8BAAA;GjEs8MT;EiEr8MD;;IACU,+BAAA;GjEw8MT;CACF;AgE92MD;EA8FA;IAhGI,0BAAA;GhEo3MD;CACF;AgE92MD;EAyFA;IA3FI,2BAAA;GhEo3MD;CACF;AgE92MD;EAoFA;IAtFI,iCAAA;GhEo3MD;CACF;AgE72MD;EA8EA;IC7LE,0BAAA;GjEg+MC;EiE/9MD;IAAU,0BAAA;GjEk+MT;EiEj+MD;IAAU,8BAAA;GjEo+MT;EiEn+MD;;IACU,+BAAA;GjEs+MT;CACF;AgEv3MD;EAyEA;IA3EI,0BAAA;GhE63MD;CACF;AgEv3MD;EAoEA;IAtEI,2BAAA;GhE63MD;CACF;AgEv3MD;EA+DA;IAjEI,iCAAA;GhE63MD;CACF;AgEt3MD;EAyDA;ICrLE,yBAAA;GjEs/MC;CACF;AgEt3MD;EAoDA;ICrLE,yBAAA;GjE2/MC;CACF;AgEt3MD;EA+CA;ICrLE,yBAAA;GjEggNC;CACF;AgEt3MD;EA0CA;ICrLE,yBAAA;GjEqgNC;CACF;AgEn3MD;ECnJE,yBAAA;CjEygND;AgEh3MD;EA4BA;IC7LE,0BAAA;GjEqhNC;EiEphND;IAAU,0BAAA;GjEuhNT;EiEthND;IAAU,8BAAA;GjEyhNT;EiExhND;;IACU,+BAAA;GjE2hNT;CACF;AgE93MD;EACE,yBAAA;ChEg4MD;AgE33MD;EAqBA;IAvBI,0BAAA;GhEi4MD;CACF;AgE/3MD;EACE,yBAAA;ChEi4MD;AgE53MD;EAcA;IAhBI,2BAAA;GhEk4MD;CACF;AgEh4MD;EACE,yBAAA;ChEk4MD;AgE73MD;EAOA;IATI,iCAAA;GhEm4MD;CACF;AgE53MD;EACA;ICrLE,yBAAA;GjEojNC;CACF","file":"bootstrap.css","sourcesContent":["/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: 1px dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important;\n box-shadow: none !important;\n text-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('../fonts/glyphicons-halflings-regular.eot');\n src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\002a\";\n}\n.glyphicon-plus:before {\n content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n background-color: #fcf8e3;\n padding: .2em;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777777;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: '\\00A0 \\2014';\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n word-break: break-all;\n word-wrap: break-word;\n color: #333333;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n.row {\n margin-left: -15px;\n margin-right: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #ddd;\n}\n.table .table {\n background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n min-width: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999;\n}\n.form-control::-ms-expand {\n border: 0;\n background-color: transparent;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.form-control-static {\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n min-height: 34px;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-left: 0;\n padding-right: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n border-color: #3c763d;\n background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n border-color: #8a6d3b;\n background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n border-color: #a94442;\n background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-left: -15px;\n margin-right: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: 7px;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n white-space: nowrap;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n outline: 0;\n background-image: none;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n opacity: 0.65;\n filter: alpha(opacity=65);\n -webkit-box-shadow: none;\n box-shadow: none;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333;\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n background-image: none;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default .badge {\n color: #fff;\n background-color: #333;\n}\n.btn-primary {\n color: #fff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #fff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #fff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n background-image: none;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #fff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #fff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n background-image: none;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #fff;\n}\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #fff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #fff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n background-image: none;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #fff;\n}\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #fff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #fff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n background-image: none;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #fff;\n}\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #fff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #fff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n background-image: none;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #fff;\n}\n.btn-link {\n color: #337ab7;\n font-weight: normal;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n list-style: none;\n font-size: 14px;\n text-align: left;\n background-color: #fff;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n text-decoration: none;\n color: #262626;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n background-color: #337ab7;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n cursor: not-allowed;\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n left: auto;\n right: 0;\n}\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n left: auto;\n right: 0;\n }\n .navbar-right .dropdown-menu-left {\n left: 0;\n right: auto;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group .form-control:focus {\n z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n margin-bottom: 0;\n padding-left: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n cursor: default;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n overflow-x: visible;\n padding-right: 15px;\n padding-left: 15px;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-left: 0;\n padding-right: 0;\n }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.navbar-brand {\n float: left;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n height: 50px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: 15px;\n padding: 9px 10px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n margin-left: -15px;\n margin-right: -15px;\n padding: 10px 15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-left: 15px;\n margin-right: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n background-color: #e7e7e7;\n color: #555;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-link {\n color: #777;\n}\n.navbar-default .navbar-link:hover {\n color: #333;\n}\n.navbar-default .btn-link {\n color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #ccc;\n}\n.navbar-inverse {\n background-color: #222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #fff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n background-color: #080808;\n color: #fff;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #fff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #fff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n content: \"/\\00a0\";\n padding: 0 5px;\n color: #ccc;\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n line-height: 1.42857143;\n text-decoration: none;\n color: #337ab7;\n background-color: #fff;\n border: 1px solid #ddd;\n margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-bottom-left-radius: 4px;\n border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-bottom-right-radius: 4px;\n border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 2;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n background-color: #fff;\n border-color: #ddd;\n cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-bottom-left-radius: 6px;\n border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-bottom-right-radius: 6px;\n border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-bottom-left-radius: 3px;\n border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-bottom-right-radius: 3px;\n border-top-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n list-style: none;\n text-align: center;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n background-color: #fff;\n cursor: not-allowed;\n}\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n color: #fff;\n line-height: 1;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n border-radius: 6px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-left: 60px;\n padding-right: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-left: auto;\n margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n background-color: #dff0d8;\n border-color: #d6e9c6;\n color: #3c763d;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n background-color: #d9edf7;\n border-color: #bce8f1;\n color: #31708f;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n background-color: #fcf8e3;\n border-color: #faebcc;\n color: #8a6d3b;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n background-color: #f2dede;\n border-color: #ebccd1;\n color: #a94442;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n overflow: hidden;\n height: 20px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n margin-bottom: 20px;\n padding-left: 0;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n text-decoration: none;\n color: #555;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n background-color: #eeeeee;\n color: #777777;\n cursor: not-allowed;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #ddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-left: 15px;\n padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-left-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n border: 0;\n margin-bottom: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ddd;\n}\n.panel-default {\n border-color: #ddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: 0.2;\n filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #fff;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n background-clip: padding-box;\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n.modal-backdrop.fade {\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 12px;\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.tooltip.in {\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.tooltip.top {\n margin-top: -3px;\n padding: 5px 0;\n}\n.tooltip.right {\n margin-left: 3px;\n padding: 0 5px;\n}\n.tooltip.bottom {\n margin-top: 3px;\n padding: 5px 0;\n}\n.tooltip.left {\n margin-left: -3px;\n padding: 0 5px;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n bottom: 0;\n right: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 14px;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover-title {\n margin: 0;\n padding: 8px 14px;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow:after {\n border-width: 10px;\n content: \"\";\n}\n.popover.top > .arrow {\n left: 50%;\n margin-left: -11px;\n border-bottom-width: 0;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n bottom: -11px;\n}\n.popover.top > .arrow:after {\n content: \" \";\n bottom: 1px;\n margin-left: -10px;\n border-bottom-width: 0;\n border-top-color: #fff;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-left-width: 0;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n content: \" \";\n left: 1px;\n bottom: -10px;\n border-left-width: 0;\n border-right-color: #fff;\n}\n.popover.bottom > .arrow {\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n top: -11px;\n}\n.popover.bottom > .arrow:after {\n content: \" \";\n top: 1px;\n margin-left: -10px;\n border-top-width: 0;\n border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: #fff;\n bottom: -10px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n}\n.carousel-inner > .item {\n display: none;\n position: relative;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -moz-transition: -moz-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n -moz-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n -moz-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: 15%;\n opacity: 0.5;\n filter: alpha(opacity=50);\n font-size: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n left: auto;\n right: 0;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n outline: 0;\n color: #fff;\n text-decoration: none;\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n}\n.carousel-control .icon-prev:before {\n content: '\\2039';\n}\n.carousel-control .icon-next:before {\n content: '\\203a';\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid #fff;\n border-radius: 10px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: #fff;\n}\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -10px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -10px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -10px;\n }\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n content: \" \";\n display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n// without disabling user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n box-shadow: none !important;\n text-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n // Bootstrap specific changes end\n}\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// Star\n\n// Import the fonts\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('@{icon-font-path}@{icon-font-name}.eot');\n src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n url('@{icon-font-path}@{icon-font-name}.woff2') format('woff2'),\n url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\002a\"; } }\n.glyphicon-plus { &:before { content: \"\\002b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n.glyphicon-cd { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up { &:before { content: \"\\e204\"; } }\n.glyphicon-copy { &:before { content: \"\\e205\"; } }\n.glyphicon-paste { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer { &:before { content: \"\\e210\"; } }\n.glyphicon-king { &:before { content: \"\\e211\"; } }\n.glyphicon-queen { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop { &:before { content: \"\\e214\"; } }\n.glyphicon-knight { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula { &:before { content: \"\\e216\"; } }\n.glyphicon-tent { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard { &:before { content: \"\\e218\"; } }\n.glyphicon-bed { &:before { content: \"\\e219\"; } }\n.glyphicon-apple { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin { &:before { content: \"\\e227\"; } }\n.glyphicon-btc { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt { &:before { content: \"\\e227\"; } }\n.glyphicon-yen { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted { &:before { content: \"\\e232\"; } }\n.glyphicon-education { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window { &:before { content: \"\\e237\"; } }\n.glyphicon-oil { &:before { content: \"\\e238\"; } }\n.glyphicon-grain { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top { &:before { content: \"\\e253\"; } }\n.glyphicon-console { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n cursor: pointer;\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // WebKit-specific. Other browsers will keep their default outline style.\n // (Initially tried to also force default via `outline: initial`,\n // but that seems to erroneously remove the outline in Firefox altogether.)\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n background-color: @state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @dl-horizontal-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n .text-uppercase();\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover,\n a&:focus {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover,\n a&:focus {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n margin-right: auto;\n margin-left: auto;\n padding-left: floor((@gutter / 2));\n padding-right: ceil((@gutter / 2));\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: ceil((@gutter / -2));\n margin-right: floor((@gutter / -2));\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: ceil((@grid-gutter-width / 2));\n padding-right: floor((@grid-gutter-width / 2));\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n}\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * 0.75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius; // Note: This has no effect on s in CSS.\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Unstyle the caret on ``\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n display: inline-block;\n margin-bottom: 0; // For input.btn\n font-weight: @btn-font-weight;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n white-space: nowrap;\n .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @btn-border-radius-base);\n .user-select(none);\n\n &,\n &:active,\n &.active {\n &:focus,\n &.focus {\n .tab-focus();\n }\n }\n\n &:hover,\n &:focus,\n &.focus {\n color: @btn-default-color;\n text-decoration: none;\n }\n\n &:active,\n &.active {\n outline: 0;\n background-image: none;\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n .opacity(.65);\n .box-shadow(none);\n }\n\n a& {\n &.disabled,\n fieldset[disabled] & {\n pointer-events: none; // Future-proof disabling of clicks on `` elements\n }\n }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n color: @link-color;\n font-weight: normal;\n border-radius: 0;\n\n &,\n &:active,\n &.active,\n &[disabled],\n fieldset[disabled] & {\n background-color: transparent;\n .box-shadow(none);\n }\n &,\n &:hover,\n &:focus,\n &:active {\n border-color: transparent;\n }\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n background-color: transparent;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @btn-link-disabled-color;\n text-decoration: none;\n }\n }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n // line-height: ensure even-numbered height of button next to large input\n .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @btn-border-radius-large);\n}\n.btn-sm {\n // line-height: ensure proper height of button next to small input\n .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n.btn-xs {\n .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n color: @color;\n background-color: @background;\n border-color: @border;\n\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 25%);\n }\n &:hover {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n\n &:hover,\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 17%);\n border-color: darken(@border, 25%);\n }\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus,\n &.focus {\n background-color: @background;\n border-color: @border;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n}\n","// Opacity\n\n.opacity(@opacity) {\n opacity: @opacity;\n // IE8 filter\n @opacity-ie: (@opacity * 100);\n filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n opacity: 0;\n .transition(opacity .15s linear);\n &.in {\n opacity: 1;\n }\n}\n\n.collapse {\n display: none;\n\n &.in { display: block; }\n tr&.in { display: table-row; }\n tbody&.in { display: table-row-group; }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n .transition-property(~\"height, visibility\");\n .transition-duration(.35s);\n .transition-timing-function(ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: @caret-width-base dashed;\n border-top: @caret-width-base solid ~\"\\9\"; // IE8\n border-right: @caret-width-base solid transparent;\n border-left: @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropup,\n.dropdown {\n position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: @zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0; // override default ul\n list-style: none;\n font-size: @font-size-base;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n background-color: @dropdown-bg;\n border: 1px solid @dropdown-fallback-border; // IE8 fallback\n border: 1px solid @dropdown-border;\n border-radius: @border-radius-base;\n .box-shadow(0 6px 12px rgba(0,0,0,.175));\n background-clip: padding-box;\n\n // Aligns the dropdown menu to right\n //\n // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n &.pull-right {\n right: 0;\n left: auto;\n }\n\n // Dividers (basically an hr) within the dropdown\n .divider {\n .nav-divider(@dropdown-divider-bg);\n }\n\n // Links within the dropdown menu\n > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: @line-height-base;\n color: @dropdown-link-color;\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n &:hover,\n &:focus {\n text-decoration: none;\n color: @dropdown-link-hover-color;\n background-color: @dropdown-link-hover-bg;\n }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-active-color;\n text-decoration: none;\n outline: 0;\n background-color: @dropdown-link-active-bg;\n }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-disabled-color;\n }\n\n // Nuke hover/focus effects\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none; // Remove CSS gradient\n .reset-filter();\n cursor: @cursor-disabled;\n }\n}\n\n// Open state for the dropdown\n.open {\n // Show the menu\n > .dropdown-menu {\n display: block;\n }\n\n // Remove the outline when :focus is triggered\n > a {\n outline: 0;\n }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n left: auto; // Reset the default from `.dropdown-menu`\n right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: @font-size-small;\n line-height: @line-height-base;\n color: @dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n // Reverse the caret\n .caret {\n border-top: 0;\n border-bottom: @caret-width-base dashed;\n border-bottom: @caret-width-base solid ~\"\\9\"; // IE8\n content: \"\";\n }\n // Different positioning for bottom up menu\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-right {\n .dropdown-menu {\n .dropdown-menu-right();\n }\n // Necessary for overrides of the default right aligned menu.\n // Will remove come v4 in all likelihood.\n .dropdown-menu-left {\n .dropdown-menu-left();\n }\n }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; // match .btn alignment given font-size hack above\n > .btn {\n position: relative;\n float: left;\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active,\n &.active {\n z-index: 2;\n }\n }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n .btn + .btn,\n .btn + .btn-group,\n .btn-group + .btn,\n .btn-group + .btn-group {\n margin-left: -1px;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n margin-left: -5px; // Offset the first child's margin\n &:extend(.clearfix all);\n\n .btn,\n .btn-group,\n .input-group {\n float: left;\n }\n > .btn,\n > .btn-group,\n > .input-group {\n margin-left: 5px;\n }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n margin-left: 0;\n &:not(:last-child):not(.dropdown-toggle) {\n .border-right-radius(0);\n }\n}\n// Need .dropdown-toggle since :last-child doesn't apply, given that a .dropdown-menu is used immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-right-radius(0);\n }\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n .box-shadow(none);\n }\n}\n\n\n// Reposition the caret\n.btn .caret {\n margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n border-width: @caret-width-large @caret-width-large 0;\n border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n > .btn,\n > .btn-group,\n > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n }\n\n // Clear floats so dropdown menus can be properly placed\n > .btn-group {\n &:extend(.clearfix all);\n > .btn {\n float: none;\n }\n }\n\n > .btn + .btn,\n > .btn + .btn-group,\n > .btn-group + .btn,\n > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n }\n}\n\n.btn-group-vertical > .btn {\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n &:first-child:not(:last-child) {\n .border-top-radius(@btn-border-radius-base);\n .border-bottom-radius(0);\n }\n &:last-child:not(:first-child) {\n .border-top-radius(0);\n .border-bottom-radius(@btn-border-radius-base);\n }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-bottom-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n > .btn,\n > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n }\n > .btn-group .btn {\n width: 100%;\n }\n\n > .btn-group .dropdown-menu {\n left: auto;\n }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n > .btn,\n > .btn-group > .btn {\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0,0,0,0);\n pointer-events: none;\n }\n }\n}\n","// Single side border-radius\n\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n position: relative; // For dropdowns\n display: table;\n border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n // Undo padding and float of grid classes\n &[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n }\n\n .form-control {\n // Ensure that the input is always above the *appended* addon button for\n // proper border colors.\n position: relative;\n z-index: 2;\n\n // IE9 fubars the placeholder attribute in text inputs and the arrows on\n // select elements in input groups. To fix it, we float the input. Details:\n // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n float: left;\n\n width: 100%;\n margin-bottom: 0;\n\n &:focus {\n z-index: 3;\n }\n }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n .input-lg();\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n .input-sm();\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 1;\n color: @input-color;\n text-align: center;\n background-color: @input-group-addon-bg;\n border: 1px solid @input-group-addon-border-color;\n border-radius: @input-border-radius;\n\n // Sizing\n &.input-sm {\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n border-radius: @input-border-radius-small;\n }\n &.input-lg {\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n border-radius: @input-border-radius-large;\n }\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n .border-right-radius(0);\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n .border-left-radius(0);\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n position: relative;\n // Jankily prevent input button groups from wrapping with `white-space` and\n // `font-size` in combination with `inline-block` on buttons.\n font-size: 0;\n white-space: nowrap;\n\n // Negative margin for spacing, position for bringing hovered/focused/actived\n // element above the siblings.\n > .btn {\n position: relative;\n + .btn {\n margin-left: -1px;\n }\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active {\n z-index: 2;\n }\n }\n\n // Negative margin to only have a 1px border between the two\n &:first-child {\n > .btn,\n > .btn-group {\n margin-right: -1px;\n }\n }\n &:last-child {\n > .btn,\n > .btn-group {\n z-index: 2;\n margin-left: -1px;\n }\n }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n margin-bottom: 0;\n padding-left: 0; // Override default ul/ol\n list-style: none;\n &:extend(.clearfix all);\n\n > li {\n position: relative;\n display: block;\n\n > a {\n position: relative;\n display: block;\n padding: @nav-link-padding;\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @nav-link-hover-bg;\n }\n }\n\n // Disabled state sets text to gray and nukes hover/tab effects\n &.disabled > a {\n color: @nav-disabled-link-color;\n\n &:hover,\n &:focus {\n color: @nav-disabled-link-hover-color;\n text-decoration: none;\n background-color: transparent;\n cursor: @cursor-disabled;\n }\n }\n }\n\n // Open dropdowns\n .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @nav-link-hover-bg;\n border-color: @link-color;\n }\n }\n\n // Nav dividers (deprecated with v3.0.1)\n //\n // This should have been removed in v3 with the dropping of `.nav-list`, but\n // we missed it. We don't currently support this anywhere, but in the interest\n // of maintaining backward compatibility in case you use it, it's deprecated.\n .nav-divider {\n .nav-divider();\n }\n\n // Prevent IE8 from misplacing imgs\n //\n // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n > li > a > img {\n max-width: none;\n }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n border-bottom: 1px solid @nav-tabs-border-color;\n > li {\n float: left;\n // Make the list-items overlay the bottom border\n margin-bottom: -1px;\n\n // Actual tabs (as links)\n > a {\n margin-right: 2px;\n line-height: @line-height-base;\n border: 1px solid transparent;\n border-radius: @border-radius-base @border-radius-base 0 0;\n &:hover {\n border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n }\n }\n\n // Active state, and its :hover to override normal :hover\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-tabs-active-link-hover-color;\n background-color: @nav-tabs-active-link-hover-bg;\n border: 1px solid @nav-tabs-active-link-hover-border-color;\n border-bottom-color: transparent;\n cursor: default;\n }\n }\n }\n // pulling this in mainly for less shorthand\n &.nav-justified {\n .nav-justified();\n .nav-tabs-justified();\n }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n > li {\n float: left;\n\n // Links rendered as pills\n > a {\n border-radius: @nav-pills-border-radius;\n }\n + li {\n margin-left: 2px;\n }\n\n // Active state\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-pills-active-link-hover-color;\n background-color: @nav-pills-active-link-hover-bg;\n }\n }\n }\n}\n\n\n// Stacked pills\n.nav-stacked {\n > li {\n float: none;\n + li {\n margin-top: 2px;\n margin-left: 0; // no need for this gap between nav items\n }\n }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n width: 100%;\n\n > li {\n float: none;\n > a {\n text-align: center;\n margin-bottom: 5px;\n }\n }\n\n > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n }\n\n @media (min-width: @screen-sm-min) {\n > li {\n display: table-cell;\n width: 1%;\n > a {\n margin-bottom: 0;\n }\n }\n }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n border-bottom: 0;\n\n > li > a {\n // Override margin from .nav-tabs\n margin-right: 0;\n border-radius: @border-radius-base;\n }\n\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border: 1px solid @nav-tabs-justified-link-border-color;\n }\n\n @media (min-width: @screen-sm-min) {\n > li > a {\n border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n border-radius: @border-radius-base @border-radius-base 0 0;\n }\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border-bottom-color: @nav-tabs-justified-active-link-border-color;\n }\n }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n // make dropdown border overlap tab border\n margin-top: -1px;\n // Remove the top rounded corners here since there is a hard edge above the menu\n .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n margin-bottom: @navbar-margin-bottom;\n border: 1px solid transparent;\n\n // Prevent floats from breaking the navbar\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: @navbar-border-radius;\n }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n overflow-x: visible;\n padding-right: @navbar-padding-horizontal;\n padding-left: @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n &:extend(.clearfix all);\n -webkit-overflow-scrolling: touch;\n\n &.in {\n overflow-y: auto;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border-top: 0;\n box-shadow: none;\n\n &.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0; // Override default setting\n overflow: visible !important;\n }\n\n &.in {\n overflow-y: visible;\n }\n\n // Undo the collapse side padding for navbars with containers to ensure\n // alignment of right-aligned contents.\n .navbar-fixed-top &,\n .navbar-static-top &,\n .navbar-fixed-bottom & {\n padding-left: 0;\n padding-right: 0;\n }\n }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n .navbar-collapse {\n max-height: @navbar-collapse-max-height;\n\n @media (max-device-width: @screen-xs-min) and (orientation: landscape) {\n max-height: 200px;\n }\n }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n > .navbar-header,\n > .navbar-collapse {\n margin-right: -@navbar-padding-horizontal;\n margin-left: -@navbar-padding-horizontal;\n\n @media (min-width: @grid-float-breakpoint) {\n margin-right: 0;\n margin-left: 0;\n }\n }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n z-index: @zindex-navbar;\n border-width: 0 0 1px;\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: @zindex-navbar-fixed;\n\n // Undo the rounded corners\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0; // override .navbar defaults\n border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n float: left;\n padding: @navbar-padding-vertical @navbar-padding-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-computed;\n height: @navbar-height;\n\n &:hover,\n &:focus {\n text-decoration: none;\n }\n\n > img {\n display: block;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n .navbar > .container &,\n .navbar > .container-fluid & {\n margin-left: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: @navbar-padding-horizontal;\n padding: 9px 10px;\n .navbar-vertical-align(34px);\n background-color: transparent;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n border-radius: @border-radius-base;\n\n // We remove the `outline` here, but later compensate by attaching `:hover`\n // styles to `:focus`.\n &:focus {\n outline: 0;\n }\n\n // Bars\n .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n }\n .icon-bar + .icon-bar {\n margin-top: 4px;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n display: none;\n }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: @line-height-computed;\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n > li > a,\n .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n > li > a {\n line-height: @line-height-computed;\n &:hover,\n &:focus {\n background-image: none;\n }\n }\n }\n }\n\n // Uncollapse the nav\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin: 0;\n\n > li {\n float: left;\n > a {\n padding-top: @navbar-padding-vertical;\n padding-bottom: @navbar-padding-vertical;\n }\n }\n }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n margin-left: -@navbar-padding-horizontal;\n margin-right: -@navbar-padding-horizontal;\n padding: 10px @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n\n // Mixin behavior for optimum display\n .form-inline();\n\n .form-group {\n @media (max-width: @grid-float-breakpoint-max) {\n margin-bottom: 5px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n }\n\n // Vertically center in expanded, horizontal navbar\n .navbar-vertical-align(@input-height-base);\n\n // Undo 100% width for pull classes\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n .box-shadow(none);\n }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n .border-top-radius(@navbar-border-radius);\n .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n .navbar-vertical-align(@input-height-base);\n\n &.btn-sm {\n .navbar-vertical-align(@input-height-small);\n }\n &.btn-xs {\n .navbar-vertical-align(22);\n }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n .navbar-vertical-align(@line-height-computed);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin-left: @navbar-padding-horizontal;\n margin-right: @navbar-padding-horizontal;\n }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-left { .pull-left(); }\n .navbar-right {\n .pull-right();\n margin-right: -@navbar-padding-horizontal;\n\n ~ .navbar-right {\n margin-right: 0;\n }\n }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n background-color: @navbar-default-bg;\n border-color: @navbar-default-border;\n\n .navbar-brand {\n color: @navbar-default-brand-color;\n &:hover,\n &:focus {\n color: @navbar-default-brand-hover-color;\n background-color: @navbar-default-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-default-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-default-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n\n .navbar-toggle {\n border-color: @navbar-default-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-default-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-default-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: @navbar-default-border;\n }\n\n // Dropdown menu items\n .navbar-nav {\n // Remove background color from open dropdown\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-default-link-active-bg;\n color: @navbar-default-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n > li > a {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n }\n }\n\n\n // Links in navbars\n //\n // Add a class to ensure links outside the navbar nav are colored correctly.\n\n .navbar-link {\n color: @navbar-default-link-color;\n &:hover {\n color: @navbar-default-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n }\n }\n }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n background-color: @navbar-inverse-bg;\n border-color: @navbar-inverse-border;\n\n .navbar-brand {\n color: @navbar-inverse-brand-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-brand-hover-color;\n background-color: @navbar-inverse-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-inverse-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-inverse-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n\n // Darken the responsive nav toggle\n .navbar-toggle {\n border-color: @navbar-inverse-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-inverse-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-inverse-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: darken(@navbar-inverse-bg, 7%);\n }\n\n // Dropdowns\n .navbar-nav {\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-inverse-link-active-bg;\n color: @navbar-inverse-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display\n .open .dropdown-menu {\n > .dropdown-header {\n border-color: @navbar-inverse-border;\n }\n .divider {\n background-color: @navbar-inverse-border;\n }\n > li > a {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n }\n }\n\n .navbar-link {\n color: @navbar-inverse-link-color;\n &:hover {\n color: @navbar-inverse-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n }\n }\n }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n.navbar-vertical-align(@element-height) {\n margin-top: ((@navbar-height - @element-height) / 2);\n margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n .clearfix();\n}\n.center-block {\n .center-block();\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n display: none !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n position: fixed;\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n margin-bottom: @line-height-computed;\n list-style: none;\n background-color: @breadcrumb-bg;\n border-radius: @border-radius-base;\n\n > li {\n display: inline-block;\n\n + li:before {\n content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n padding: 0 5px;\n color: @breadcrumb-color;\n }\n }\n\n > .active {\n color: @breadcrumb-active-color;\n }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: @line-height-computed 0;\n border-radius: @border-radius-base;\n\n > li {\n display: inline; // Remove list-style and block-level defaults\n > a,\n > span {\n position: relative;\n float: left; // Collapse white-space\n padding: @padding-base-vertical @padding-base-horizontal;\n line-height: @line-height-base;\n text-decoration: none;\n color: @pagination-color;\n background-color: @pagination-bg;\n border: 1px solid @pagination-border;\n margin-left: -1px;\n }\n &:first-child {\n > a,\n > span {\n margin-left: 0;\n .border-left-radius(@border-radius-base);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius-base);\n }\n }\n }\n\n > li > a,\n > li > span {\n &:hover,\n &:focus {\n z-index: 2;\n color: @pagination-hover-color;\n background-color: @pagination-hover-bg;\n border-color: @pagination-hover-border;\n }\n }\n\n > .active > a,\n > .active > span {\n &,\n &:hover,\n &:focus {\n z-index: 3;\n color: @pagination-active-color;\n background-color: @pagination-active-bg;\n border-color: @pagination-active-border;\n cursor: default;\n }\n }\n\n > .disabled {\n > span,\n > span:hover,\n > span:focus,\n > a,\n > a:hover,\n > a:focus {\n color: @pagination-disabled-color;\n background-color: @pagination-disabled-bg;\n border-color: @pagination-disabled-border;\n cursor: @cursor-disabled;\n }\n }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n","// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n > li {\n > a,\n > span {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n }\n &:first-child {\n > a,\n > span {\n .border-left-radius(@border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius);\n }\n }\n }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n padding-left: 0;\n margin: @line-height-computed 0;\n list-style: none;\n text-align: center;\n &:extend(.clearfix all);\n li {\n display: inline;\n > a,\n > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: @pager-bg;\n border: 1px solid @pager-border;\n border-radius: @pager-border-radius;\n }\n\n > a:hover,\n > a:focus {\n text-decoration: none;\n background-color: @pager-hover-bg;\n }\n }\n\n .next {\n > a,\n > span {\n float: right;\n }\n }\n\n .previous {\n > a,\n > span {\n float: left;\n }\n }\n\n .disabled {\n > a,\n > a:hover,\n > a:focus,\n > span {\n color: @pager-disabled-color;\n background-color: @pager-bg;\n cursor: @cursor-disabled;\n }\n }\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: @label-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n\n // Add hover effects, but only for links\n a& {\n &:hover,\n &:focus {\n color: @label-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Empty labels collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for labels in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n .label-variant(@label-default-bg);\n}\n\n.label-primary {\n .label-variant(@label-primary-bg);\n}\n\n.label-success {\n .label-variant(@label-success-bg);\n}\n\n.label-info {\n .label-variant(@label-info-bg);\n}\n\n.label-warning {\n .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n .label-variant(@label-danger-bg);\n}\n","// Labels\n\n.label-variant(@color) {\n background-color: @color;\n\n &[href] {\n &:hover,\n &:focus {\n background-color: darken(@color, 10%);\n }\n }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: @font-size-small;\n font-weight: @badge-font-weight;\n color: @badge-color;\n line-height: @badge-line-height;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: @badge-bg;\n border-radius: @badge-border-radius;\n\n // Empty badges collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for badges in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n\n .btn-xs &,\n .btn-group-xs > .btn & {\n top: 0;\n padding: 1px 5px;\n }\n\n // Hover state, but only for links\n a& {\n &:hover,\n &:focus {\n color: @badge-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Account for badges in navs\n .list-group-item.active > &,\n .nav-pills > .active > a > & {\n color: @badge-active-color;\n background-color: @badge-active-bg;\n }\n\n .list-group-item > & {\n float: right;\n }\n\n .list-group-item > & + & {\n margin-right: 5px;\n }\n\n .nav-pills > li > a > & {\n margin-left: 3px;\n }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n padding-top: @jumbotron-padding;\n padding-bottom: @jumbotron-padding;\n margin-bottom: @jumbotron-padding;\n color: @jumbotron-color;\n background-color: @jumbotron-bg;\n\n h1,\n .h1 {\n color: @jumbotron-heading-color;\n }\n\n p {\n margin-bottom: (@jumbotron-padding / 2);\n font-size: @jumbotron-font-size;\n font-weight: 200;\n }\n\n > hr {\n border-top-color: darken(@jumbotron-bg, 10%);\n }\n\n .container &,\n .container-fluid & {\n border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n }\n\n .container {\n max-width: 100%;\n }\n\n @media screen and (min-width: @screen-sm-min) {\n padding-top: (@jumbotron-padding * 1.6);\n padding-bottom: (@jumbotron-padding * 1.6);\n\n .container &,\n .container-fluid & {\n padding-left: (@jumbotron-padding * 2);\n padding-right: (@jumbotron-padding * 2);\n }\n\n h1,\n .h1 {\n font-size: @jumbotron-heading-font-size;\n }\n }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n display: block;\n padding: @thumbnail-padding;\n margin-bottom: @line-height-computed;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(border .2s ease-in-out);\n\n > img,\n a > img {\n &:extend(.img-responsive);\n margin-left: auto;\n margin-right: auto;\n }\n\n // Add a hover state for linked versions only\n a&:hover,\n a&:focus,\n a&.active {\n border-color: @link-color;\n }\n\n // Image captions\n .caption {\n padding: @thumbnail-caption-padding;\n color: @thumbnail-caption-color;\n }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n padding: @alert-padding;\n margin-bottom: @line-height-computed;\n border: 1px solid transparent;\n border-radius: @alert-border-radius;\n\n // Headings for larger alerts\n h4 {\n margin-top: 0;\n // Specified for the h4 to prevent conflicts of changing @headings-color\n color: inherit;\n }\n\n // Provide class for links that match alerts\n .alert-link {\n font-weight: @alert-link-font-weight;\n }\n\n // Improve alignment and spacing of inner content\n > p,\n > ul {\n margin-bottom: 0;\n }\n\n > p + p {\n margin-top: 5px;\n }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n padding-right: (@alert-padding + 20);\n\n // Adjust close link position\n .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n\n.alert-info {\n .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n\n.alert-warning {\n .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n\n.alert-danger {\n .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","// Alerts\n\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n overflow: hidden;\n height: @line-height-computed;\n margin-bottom: @line-height-computed;\n background-color: @progress-bg;\n border-radius: @progress-border-radius;\n .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: @font-size-small;\n line-height: @line-height-computed;\n color: @progress-bar-color;\n text-align: center;\n background-color: @progress-bar-bg;\n .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n .transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n #gradient > .striped();\n background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Progress bars\n\n.progress-bar-variant(@color) {\n background-color: @color;\n\n // Deprecated parent class requirement as of v3.2.0\n .progress-striped & {\n #gradient > .striped();\n }\n}\n",".media {\n // Proper spacing between instances of .media\n margin-top: 15px;\n\n &:first-child {\n margin-top: 0;\n }\n}\n\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n\n.media-body {\n width: 10000px;\n}\n\n.media-object {\n display: block;\n\n // Fix collapse in webkit from max-width: 100% and display: table-cell.\n &.img-thumbnail {\n max-width: none;\n }\n}\n\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n\n.media-middle {\n vertical-align: middle;\n}\n\n.media-bottom {\n vertical-align: bottom;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n\n// Media list variation\n//\n// Undo default ul/ol styles\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on
    ,
      , or
      .\n\n.list-group {\n // No need to set list-style: none; since .list-group-item is block level\n margin-bottom: 20px;\n padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: @list-group-bg;\n border: 1px solid @list-group-border;\n\n // Round the first and last items\n &:first-child {\n .border-top-radius(@list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n .border-bottom-radius(@list-group-border-radius);\n }\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item,\nbutton.list-group-item {\n color: @list-group-link-color;\n\n .list-group-item-heading {\n color: @list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n text-decoration: none;\n color: @list-group-link-hover-color;\n background-color: @list-group-hover-bg;\n }\n}\n\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n\n.list-group-item {\n // Disabled state\n &.disabled,\n &.disabled:hover,\n &.disabled:focus {\n background-color: @list-group-disabled-bg;\n color: @list-group-disabled-color;\n cursor: @cursor-disabled;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-disabled-text-color;\n }\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: @list-group-active-color;\n background-color: @list-group-active-bg;\n border-color: @list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading,\n .list-group-item-heading > small,\n .list-group-item-heading > .small {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-active-text-color;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n","// List Groups\n\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;\n background-color: @background;\n\n a&,\n button& {\n color: @color;\n\n .list-group-item-heading {\n color: inherit;\n }\n\n &:hover,\n &:focus {\n color: @color;\n background-color: darken(@background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: @color;\n border-color: @color;\n }\n }\n }\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: @line-height-computed;\n background-color: @panel-bg;\n border: 1px solid transparent;\n border-radius: @panel-border-radius;\n .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n padding: @panel-body-padding;\n &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n padding: @panel-heading-padding;\n border-bottom: 1px solid transparent;\n .border-top-radius((@panel-border-radius - 1));\n\n > .dropdown .dropdown-toggle {\n color: inherit;\n }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: ceil((@font-size-base * 1.125));\n color: inherit;\n\n > a,\n > small,\n > .small,\n > small > a,\n > .small > a {\n color: inherit;\n }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n padding: @panel-footer-padding;\n background-color: @panel-footer-bg;\n border-top: 1px solid @panel-inner-border;\n .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n > .list-group,\n > .panel-collapse > .list-group {\n margin-bottom: 0;\n\n .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n }\n\n // Add border top radius for first one\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n .border-top-radius((@panel-border-radius - 1));\n }\n }\n\n // Add border bottom radius for last one\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n .border-bottom-radius((@panel-border-radius - 1));\n }\n }\n }\n > .panel-heading + .panel-collapse > .list-group {\n .list-group-item:first-child {\n .border-top-radius(0);\n }\n }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n .list-group-item:first-child {\n border-top-width: 0;\n }\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n > .table,\n > .table-responsive > .table,\n > .panel-collapse > .table {\n margin-bottom: 0;\n\n caption {\n padding-left: @panel-body-padding;\n padding-right: @panel-body-padding;\n }\n }\n // Add border top radius for first one\n > .table:first-child,\n > .table-responsive:first-child > .table:first-child {\n .border-top-radius((@panel-border-radius - 1));\n\n > thead:first-child,\n > tbody:first-child {\n > tr:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n border-top-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-top-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n // Add border bottom radius for last one\n > .table:last-child,\n > .table-responsive:last-child > .table:last-child {\n .border-bottom-radius((@panel-border-radius - 1));\n\n > tbody:last-child,\n > tfoot:last-child {\n > tr:last-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n border-bottom-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-bottom-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n > .panel-body + .table,\n > .panel-body + .table-responsive,\n > .table + .panel-body,\n > .table-responsive + .panel-body {\n border-top: 1px solid @table-border-color;\n }\n > .table > tbody:first-child > tr:first-child th,\n > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n }\n > .table-bordered,\n > .table-responsive > .table-bordered {\n border: 0;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n > thead,\n > tbody {\n > tr:first-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n > tbody,\n > tfoot {\n > tr:last-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n }\n > .table-responsive {\n border: 0;\n margin-bottom: 0;\n }\n}\n\n\n// Collapsible panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n margin-bottom: @line-height-computed;\n\n // Tighten up margin so it's only between panels\n .panel {\n margin-bottom: 0;\n border-radius: @panel-border-radius;\n\n + .panel {\n margin-top: 5px;\n }\n }\n\n .panel-heading {\n border-bottom: 0;\n\n + .panel-collapse > .panel-body,\n + .panel-collapse > .list-group {\n border-top: 1px solid @panel-inner-border;\n }\n }\n\n .panel-footer {\n border-top: 0;\n + .panel-collapse .panel-body {\n border-bottom: 1px solid @panel-inner-border;\n }\n }\n}\n\n\n// Contextual variations\n.panel-default {\n .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n","// Panels\n\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n border-color: @border;\n\n & > .panel-heading {\n color: @heading-text-color;\n background-color: @heading-bg-color;\n border-color: @heading-border;\n\n + .panel-collapse > .panel-body {\n border-top-color: @border;\n }\n .badge {\n color: @heading-bg-color;\n background-color: @heading-text-color;\n }\n }\n & > .panel-footer {\n + .panel-collapse > .panel-body {\n border-bottom-color: @border;\n }\n }\n}\n","// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n\n .embed-responsive-item,\n iframe,\n embed,\n object,\n video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n }\n}\n\n// Modifier class for 16:9 aspect ratio\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n\n// Modifier class for 4:3 aspect ratio\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: @well-bg;\n border: 1px solid @well-border;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0,0,0,.15);\n }\n}\n\n// Sizes\n.well-lg {\n padding: 24px;\n border-radius: @border-radius-large;\n}\n.well-sm {\n padding: 9px;\n border-radius: @border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: (@font-size-base * 1.5);\n font-weight: @close-font-weight;\n line-height: 1;\n color: @close-color;\n text-shadow: @close-text-shadow;\n .opacity(.2);\n\n &:hover,\n &:focus {\n color: @close-color;\n text-decoration: none;\n cursor: pointer;\n .opacity(.5);\n }\n\n // Additional properties for button version\n // iOS requires the button element instead of an anchor tag.\n // If you want the anchor version, it requires `href=\"#\"`.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n button& {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n }\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal;\n -webkit-overflow-scrolling: touch;\n\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n .translate(0, -25%);\n .transition-transform(~\"0.3s ease-out\");\n }\n &.in .modal-dialog { .translate(0, 0) }\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n background-color: @modal-content-bg;\n border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid @modal-content-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 3px 9px rgba(0,0,0,.5));\n background-clip: padding-box;\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal-background;\n background-color: @modal-backdrop-bg;\n // Fade for backdrop\n &.fade { .opacity(0); }\n &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n padding: @modal-title-padding;\n border-bottom: 1px solid @modal-header-border-color;\n &:extend(.clearfix all);\n}\n// Close icon\n.modal-header .close {\n margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n margin: 0;\n line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n padding: @modal-inner-padding;\n text-align: right; // right align buttons\n border-top: 1px solid @modal-footer-border-color;\n &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n // Properly space out buttons\n .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n }\n // but override that for button groups\n .btn-group .btn + .btn {\n margin-left: -1px;\n }\n // and override it for block buttons as well\n .btn-block + .btn-block {\n margin-left: 0;\n }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n width: @modal-md;\n margin: 30px auto;\n }\n .modal-content {\n .box-shadow(0 5px 15px rgba(0,0,0,.5));\n }\n\n // Modal sizes\n .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n .modal-lg { width: @modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n z-index: @zindex-tooltip;\n display: block;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n .reset-text();\n font-size: @font-size-small;\n\n .opacity(0);\n\n &.in { .opacity(@tooltip-opacity); }\n &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; }\n &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; }\n &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; }\n &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: @tooltip-max-width;\n padding: 3px 8px;\n color: @tooltip-color;\n text-align: center;\n background-color: @tooltip-bg;\n border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1\n.tooltip {\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n bottom: 0;\n right: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n left: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n border-right-color: @tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-left-color: @tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n right: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n left: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n}\n",".reset-text() {\n font-family: @font-family-base;\n // We deliberately do NOT reset font-size.\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: @line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: @zindex-popover;\n display: none;\n max-width: @popover-max-width;\n padding: 1px;\n // Our parent element can be arbitrary since popovers are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n .reset-text();\n font-size: @font-size-base;\n\n background-color: @popover-bg;\n background-clip: padding-box;\n border: 1px solid @popover-fallback-border-color;\n border: 1px solid @popover-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n // Offset the popover to account for the popover arrow\n &.top { margin-top: -@popover-arrow-width; }\n &.right { margin-left: @popover-arrow-width; }\n &.bottom { margin-top: @popover-arrow-width; }\n &.left { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n margin: 0; // reset heading margin\n padding: 8px 14px;\n font-size: @font-size-base;\n background-color: @popover-title-bg;\n border-bottom: 1px solid darken(@popover-title-bg, 5%);\n border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n &,\n &:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n }\n}\n.popover > .arrow {\n border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n border-width: @popover-arrow-width;\n content: \"\";\n}\n\n.popover {\n &.top > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-top-color: @popover-arrow-outer-color;\n bottom: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n bottom: 1px;\n margin-left: -@popover-arrow-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-color;\n }\n }\n &.right > .arrow {\n top: 50%;\n left: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-right-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n left: 1px;\n bottom: -@popover-arrow-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-color;\n }\n }\n &.bottom > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-bottom-color: @popover-arrow-outer-color;\n top: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n top: 1px;\n margin-left: -@popover-arrow-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-color;\n }\n }\n\n &.left > .arrow {\n top: 50%;\n right: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-right-width: 0;\n border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-left-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: @popover-arrow-color;\n bottom: -@popover-arrow-width;\n }\n }\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n\n > .item {\n display: none;\n position: relative;\n .transition(.6s ease-in-out left);\n\n // Account for jankitude on images\n > img,\n > a > img {\n &:extend(.img-responsive);\n line-height: 1;\n }\n\n // WebKit CSS3 transforms for supported devices\n @media all and (transform-3d), (-webkit-transform-3d) {\n .transition-transform(~'0.6s ease-in-out');\n .backface-visibility(~'hidden');\n .perspective(1000px);\n\n &.next,\n &.active.right {\n .translate3d(100%, 0, 0);\n left: 0;\n }\n &.prev,\n &.active.left {\n .translate3d(-100%, 0, 0);\n left: 0;\n }\n &.next.left,\n &.prev.right,\n &.active {\n .translate3d(0, 0, 0);\n left: 0;\n }\n }\n }\n\n > .active,\n > .next,\n > .prev {\n display: block;\n }\n\n > .active {\n left: 0;\n }\n\n > .next,\n > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n }\n\n > .next {\n left: 100%;\n }\n > .prev {\n left: -100%;\n }\n > .next.left,\n > .prev.right {\n left: 0;\n }\n\n > .active.left {\n left: -100%;\n }\n > .active.right {\n left: 100%;\n }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: @carousel-control-width;\n .opacity(@carousel-control-opacity);\n font-size: @carousel-control-font-size;\n color: @carousel-control-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n background-color: rgba(0, 0, 0, 0); // Fix IE9 click-thru bug\n // We can't have this transition here because WebKit cancels the carousel\n // animation if you trip this while in the middle of another animation.\n\n // Set gradients for backgrounds\n &.left {\n #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n }\n &.right {\n left: auto;\n right: 0;\n #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n }\n\n // Hover/focus state\n &:hover,\n &:focus {\n outline: 0;\n color: @carousel-control-color;\n text-decoration: none;\n .opacity(.9);\n }\n\n // Toggles\n .icon-prev,\n .icon-next,\n .glyphicon-chevron-left,\n .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n }\n .icon-prev,\n .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n }\n .icon-next,\n .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n }\n .icon-prev,\n .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n }\n\n\n .icon-prev {\n &:before {\n content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n }\n }\n .icon-next {\n &:before {\n content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n }\n }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n\n li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid @carousel-indicator-border-color;\n border-radius: 10px;\n cursor: pointer;\n\n // IE8-9 hack for event handling\n //\n // Internet Explorer 8-9 does not support clicks on elements without a set\n // `background-color`. We cannot use `filter` since that's not viewed as a\n // background color by the browser. Thus, a hack is needed.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer\n //\n // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n // set alpha transparency for the best results possible.\n background-color: #000 \\9; // IE8\n background-color: rgba(0,0,0,0); // IE9\n }\n .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: @carousel-indicator-active-bg;\n }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: @carousel-caption-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n & .btn {\n text-shadow: none; // No shadow for button elements in carousel-caption\n }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n // Scale up the controls a smidge\n .carousel-control {\n .glyphicon-chevron-left,\n .glyphicon-chevron-right,\n .icon-prev,\n .icon-next {\n width: (@carousel-control-font-size * 1.5);\n height: (@carousel-control-font-size * 1.5);\n margin-top: (@carousel-control-font-size / -2);\n font-size: (@carousel-control-font-size * 1.5);\n }\n .glyphicon-chevron-left,\n .icon-prev {\n margin-left: (@carousel-control-font-size / -2);\n }\n .glyphicon-chevron-right,\n .icon-next {\n margin-right: (@carousel-control-font-size / -2);\n }\n }\n\n // Show and left align the captions\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n\n // Move up the indicators\n .carousel-indicators {\n bottom: 20px;\n }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n","// Center-align a block level element\n\n.center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n","// CSS image replacement\n//\n// Heads up! v3 launched with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (has been removed in v4)\n.hide-text() {\n font: ~\"0/0\" a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n// New mixin to use as of v3.0.1\n.text-hide() {\n .hide-text();\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n width: device-width;\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n .responsive-invisibility();\n}\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n\n.visible-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-visibility();\n }\n}\n.visible-xs-block {\n @media (max-width: @screen-xs-max) {\n display: block !important;\n }\n}\n.visible-xs-inline {\n @media (max-width: @screen-xs-max) {\n display: inline !important;\n }\n}\n.visible-xs-inline-block {\n @media (max-width: @screen-xs-max) {\n display: inline-block !important;\n }\n}\n\n.visible-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-visibility();\n }\n}\n.visible-sm-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: block !important;\n }\n}\n.visible-sm-inline {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline !important;\n }\n}\n.visible-sm-inline-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline-block !important;\n }\n}\n\n.visible-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-visibility();\n }\n}\n.visible-md-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: block !important;\n }\n}\n.visible-md-inline {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline !important;\n }\n}\n.visible-md-inline-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline-block !important;\n }\n}\n\n.visible-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-visibility();\n }\n}\n.visible-lg-block {\n @media (min-width: @screen-lg-min) {\n display: block !important;\n }\n}\n.visible-lg-inline {\n @media (min-width: @screen-lg-min) {\n display: inline !important;\n }\n}\n.visible-lg-inline-block {\n @media (min-width: @screen-lg-min) {\n display: inline-block !important;\n }\n}\n\n.hidden-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-invisibility();\n }\n}\n.hidden-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-invisibility();\n }\n}\n.hidden-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-invisibility();\n }\n}\n.hidden-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-invisibility();\n }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n.visible-print {\n .responsive-invisibility();\n\n @media print {\n .responsive-visibility();\n }\n}\n.visible-print-block {\n display: none !important;\n\n @media print {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n\n @media print {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n\n @media print {\n display: inline-block !important;\n }\n}\n\n.hidden-print {\n @media print {\n .responsive-invisibility();\n }\n}\n","// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n display: block !important;\n table& { display: table !important; }\n tr& { display: table-row !important; }\n th&,\n td& { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n display: none !important;\n}\n"]} diff --git a/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/css/bootstrap.min.css b/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/css/bootstrap.min.css new file mode 100644 index 0000000..348c022 --- /dev/null +++ b/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/css/bootstrap.min.css @@ -0,0 +1,7403 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */ +html { + font-family: sans-serif; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100% +} + +body { + margin: 0 +} + +article, aside, details, figcaption, figure, footer, header, hgroup, + main, menu, nav, section, summary { + display: block +} + +audio, canvas, progress, video { + display: inline-block; + vertical-align: baseline +} + +audio:not ([controls] ){ + display: none; + height: 0 +} + +[hidden], template { + display: none +} + +a { + background-color: transparent +} + +a:active, a:hover { + outline: 0 +} + +abbr[title] { + border-bottom: 1px dotted +} + +b, strong { + font-weight: 700 +} + +dfn { + font-style: italic +} + +h1 { + margin: .67em 0; + font-size: 2em +} + +mark { + color: #000; + background: #ff0 +} + +small { + font-size: 80% +} + +sub, sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline +} + +sup { + top: -.5em +} + +sub { + bottom: -.25em +} + +img { + border: 0 +} + +svg:not (:root ){ + overflow: hidden +} + +figure { + margin: 1em 40px +} + +hr { + height: 0; + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box +} + +pre { + overflow: auto +} + +code, kbd, pre, samp { + font-family: monospace, monospace; + font-size: 1em +} + +button, input, optgroup, select, textarea { + margin: 0; + font: inherit; + color: inherit +} + +button { + overflow: visible +} + +button, select { + text-transform: none +} + +button, html input[type=button], input[type=reset], input[type=submit] { + -webkit-appearance: button; + cursor: pointer +} + +button[disabled], html input[disabled] { + cursor: default +} + +button::-moz-focus-inner, input::-moz-focus-inner { + padding: 0; + border: 0 +} + +input { + line-height: normal +} + +input[type=checkbox], input[type=radio] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0 +} + +input[type=number]::-webkit-inner-spin-button, input[type=number]::-webkit-outer-spin-button + { + height: auto +} + +input[type=search] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield +} + +input[type=search]::-webkit-search-cancel-button, input[type=search]::-webkit-search-decoration + { + -webkit-appearance: none +} + +fieldset { + padding: .35em .625em .75em; + margin: 0 2px; + border: 1px solid silver +} + +legend { + padding: 0; + border: 0 +} + +textarea { + overflow: auto +} + +optgroup { + font-weight: 700 +} + +table { + border-spacing: 0; + border-collapse: collapse +} + +td, th { + padding: 0 +} + /*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */ +@media print { + *, :after, :before { + color: #000 !important; + text-shadow: none !important; + background: 0 0 !important; + -webkit-box-shadow: none !important; + box-shadow: none !important + } + a, a:visited { + text-decoration: underline + } + a[href]:after { + content: " (" attr(href) ")" + } + abbr[title]:after { + content: " (" attr(title) ")" + } + a[href^="javascript:"]:after, a[href^="#"]:after { + content: "" + } + blockquote, pre { + border: 1px solid #999; + page-break-inside: avoid + } + thead { + display: table-header-group + } + img, tr { + page-break-inside: avoid + } + img { + max-width: 100% !important + } + h2, h3, p { + orphans: 3; + widows: 3 + } + h2, h3 { + page-break-after: avoid + } + .navbar { + display: none + } + .btn>.caret, .dropup>.btn>.caret { + border-top-color: #000 !important + } + .label { + border: 1px solid #000 + } + .table { + border-collapse: collapse !important + } + .table td, .table th { + background-color: #fff !important + } + .table-bordered td, .table-bordered th { + border: 1px solid #ddd !important + } +} + +@font-face { + font-family: 'Glyphicons Halflings'; + src: url(../fonts/glyphicons-halflings-regular.eot); + src: url(../fonts/glyphicons-halflings-regular.eot?#iefix) + format('embedded-opentype'), + url(../fonts/glyphicons-halflings-regular.woff2) format('woff2'), + url(../fonts/glyphicons-halflings-regular.woff) format('woff'), + url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'), + url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) + format('svg') +} + +.glyphicon { + position: relative; + top: 1px; + display: inline-block; + font-family: 'Glyphicons Halflings'; + font-style: normal; + font-weight: 400; + line-height: 1; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale +} + +.glyphicon-asterisk:before { + content: "\002a" +} + +.glyphicon-plus:before { + content: "\002b" +} + +.glyphicon-eur:before, .glyphicon-euro:before { + content: "\20ac" +} + +.glyphicon-minus:before { + content: "\2212" +} + +.glyphicon-cloud:before { + content: "\2601" +} + +.glyphicon-envelope:before { + content: "\2709" +} + +.glyphicon-pencil:before { + content: "\270f" +} + +.glyphicon-glass:before { + content: "\e001" +} + +.glyphicon-music:before { + content: "\e002" +} + +.glyphicon-search:before { + content: "\e003" +} + +.glyphicon-heart:before { + content: "\e005" +} + +.glyphicon-star:before { + content: "\e006" +} + +.glyphicon-star-empty:before { + content: "\e007" +} + +.glyphicon-user:before { + content: "\e008" +} + +.glyphicon-film:before { + content: "\e009" +} + +.glyphicon-th-large:before { + content: "\e010" +} + +.glyphicon-th:before { + content: "\e011" +} + +.glyphicon-th-list:before { + content: "\e012" +} + +.glyphicon-ok:before { + content: "\e013" +} + +.glyphicon-remove:before { + content: "\e014" +} + +.glyphicon-zoom-in:before { + content: "\e015" +} + +.glyphicon-zoom-out:before { + content: "\e016" +} + +.glyphicon-off:before { + content: "\e017" +} + +.glyphicon-signal:before { + content: "\e018" +} + +.glyphicon-cog:before { + content: "\e019" +} + +.glyphicon-trash:before { + content: "\e020" +} + +.glyphicon-home:before { + content: "\e021" +} + +.glyphicon-file:before { + content: "\e022" +} + +.glyphicon-time:before { + content: "\e023" +} + +.glyphicon-road:before { + content: "\e024" +} + +.glyphicon-download-alt:before { + content: "\e025" +} + +.glyphicon-download:before { + content: "\e026" +} + +.glyphicon-upload:before { + content: "\e027" +} + +.glyphicon-inbox:before { + content: "\e028" +} + +.glyphicon-play-circle:before { + content: "\e029" +} + +.glyphicon-repeat:before { + content: "\e030" +} + +.glyphicon-refresh:before { + content: "\e031" +} + +.glyphicon-list-alt:before { + content: "\e032" +} + +.glyphicon-lock:before { + content: "\e033" +} + +.glyphicon-flag:before { + content: "\e034" +} + +.glyphicon-headphones:before { + content: "\e035" +} + +.glyphicon-volume-off:before { + content: "\e036" +} + +.glyphicon-volume-down:before { + content: "\e037" +} + +.glyphicon-volume-up:before { + content: "\e038" +} + +.glyphicon-qrcode:before { + content: "\e039" +} + +.glyphicon-barcode:before { + content: "\e040" +} + +.glyphicon-tag:before { + content: "\e041" +} + +.glyphicon-tags:before { + content: "\e042" +} + +.glyphicon-book:before { + content: "\e043" +} + +.glyphicon-bookmark:before { + content: "\e044" +} + +.glyphicon-print:before { + content: "\e045" +} + +.glyphicon-camera:before { + content: "\e046" +} + +.glyphicon-font:before { + content: "\e047" +} + +.glyphicon-bold:before { + content: "\e048" +} + +.glyphicon-italic:before { + content: "\e049" +} + +.glyphicon-text-height:before { + content: "\e050" +} + +.glyphicon-text-width:before { + content: "\e051" +} + +.glyphicon-align-left:before { + content: "\e052" +} + +.glyphicon-align-center:before { + content: "\e053" +} + +.glyphicon-align-right:before { + content: "\e054" +} + +.glyphicon-align-justify:before { + content: "\e055" +} + +.glyphicon-list:before { + content: "\e056" +} + +.glyphicon-indent-left:before { + content: "\e057" +} + +.glyphicon-indent-right:before { + content: "\e058" +} + +.glyphicon-facetime-video:before { + content: "\e059" +} + +.glyphicon-picture:before { + content: "\e060" +} + +.glyphicon-map-marker:before { + content: "\e062" +} + +.glyphicon-adjust:before { + content: "\e063" +} + +.glyphicon-tint:before { + content: "\e064" +} + +.glyphicon-edit:before { + content: "\e065" +} + +.glyphicon-share:before { + content: "\e066" +} + +.glyphicon-check:before { + content: "\e067" +} + +.glyphicon-move:before { + content: "\e068" +} + +.glyphicon-step-backward:before { + content: "\e069" +} + +.glyphicon-fast-backward:before { + content: "\e070" +} + +.glyphicon-backward:before { + content: "\e071" +} + +.glyphicon-play:before { + content: "\e072" +} + +.glyphicon-pause:before { + content: "\e073" +} + +.glyphicon-stop:before { + content: "\e074" +} + +.glyphicon-forward:before { + content: "\e075" +} + +.glyphicon-fast-forward:before { + content: "\e076" +} + +.glyphicon-step-forward:before { + content: "\e077" +} + +.glyphicon-eject:before { + content: "\e078" +} + +.glyphicon-chevron-left:before { + content: "\e079" +} + +.glyphicon-chevron-right:before { + content: "\e080" +} + +.glyphicon-plus-sign:before { + content: "\e081" +} + +.glyphicon-minus-sign:before { + content: "\e082" +} + +.glyphicon-remove-sign:before { + content: "\e083" +} + +.glyphicon-ok-sign:before { + content: "\e084" +} + +.glyphicon-question-sign:before { + content: "\e085" +} + +.glyphicon-info-sign:before { + content: "\e086" +} + +.glyphicon-screenshot:before { + content: "\e087" +} + +.glyphicon-remove-circle:before { + content: "\e088" +} + +.glyphicon-ok-circle:before { + content: "\e089" +} + +.glyphicon-ban-circle:before { + content: "\e090" +} + +.glyphicon-arrow-left:before { + content: "\e091" +} + +.glyphicon-arrow-right:before { + content: "\e092" +} + +.glyphicon-arrow-up:before { + content: "\e093" +} + +.glyphicon-arrow-down:before { + content: "\e094" +} + +.glyphicon-share-alt:before { + content: "\e095" +} + +.glyphicon-resize-full:before { + content: "\e096" +} + +.glyphicon-resize-small:before { + content: "\e097" +} + +.glyphicon-exclamation-sign:before { + content: "\e101" +} + +.glyphicon-gift:before { + content: "\e102" +} + +.glyphicon-leaf:before { + content: "\e103" +} + +.glyphicon-fire:before { + content: "\e104" +} + +.glyphicon-eye-open:before { + content: "\e105" +} + +.glyphicon-eye-close:before { + content: "\e106" +} + +.glyphicon-warning-sign:before { + content: "\e107" +} + +.glyphicon-plane:before { + content: "\e108" +} + +.glyphicon-calendar:before { + content: "\e109" +} + +.glyphicon-random:before { + content: "\e110" +} + +.glyphicon-comment:before { + content: "\e111" +} + +.glyphicon-magnet:before { + content: "\e112" +} + +.glyphicon-chevron-up:before { + content: "\e113" +} + +.glyphicon-chevron-down:before { + content: "\e114" +} + +.glyphicon-retweet:before { + content: "\e115" +} + +.glyphicon-shopping-cart:before { + content: "\e116" +} + +.glyphicon-folder-close:before { + content: "\e117" +} + +.glyphicon-folder-open:before { + content: "\e118" +} + +.glyphicon-resize-vertical:before { + content: "\e119" +} + +.glyphicon-resize-horizontal:before { + content: "\e120" +} + +.glyphicon-hdd:before { + content: "\e121" +} + +.glyphicon-bullhorn:before { + content: "\e122" +} + +.glyphicon-bell:before { + content: "\e123" +} + +.glyphicon-certificate:before { + content: "\e124" +} + +.glyphicon-thumbs-up:before { + content: "\e125" +} + +.glyphicon-thumbs-down:before { + content: "\e126" +} + +.glyphicon-hand-right:before { + content: "\e127" +} + +.glyphicon-hand-left:before { + content: "\e128" +} + +.glyphicon-hand-up:before { + content: "\e129" +} + +.glyphicon-hand-down:before { + content: "\e130" +} + +.glyphicon-circle-arrow-right:before { + content: "\e131" +} + +.glyphicon-circle-arrow-left:before { + content: "\e132" +} + +.glyphicon-circle-arrow-up:before { + content: "\e133" +} + +.glyphicon-circle-arrow-down:before { + content: "\e134" +} + +.glyphicon-globe:before { + content: "\e135" +} + +.glyphicon-wrench:before { + content: "\e136" +} + +.glyphicon-tasks:before { + content: "\e137" +} + +.glyphicon-filter:before { + content: "\e138" +} + +.glyphicon-briefcase:before { + content: "\e139" +} + +.glyphicon-fullscreen:before { + content: "\e140" +} + +.glyphicon-dashboard:before { + content: "\e141" +} + +.glyphicon-paperclip:before { + content: "\e142" +} + +.glyphicon-heart-empty:before { + content: "\e143" +} + +.glyphicon-link:before { + content: "\e144" +} + +.glyphicon-phone:before { + content: "\e145" +} + +.glyphicon-pushpin:before { + content: "\e146" +} + +.glyphicon-usd:before { + content: "\e148" +} + +.glyphicon-gbp:before { + content: "\e149" +} + +.glyphicon-sort:before { + content: "\e150" +} + +.glyphicon-sort-by-alphabet:before { + content: "\e151" +} + +.glyphicon-sort-by-alphabet-alt:before { + content: "\e152" +} + +.glyphicon-sort-by-order:before { + content: "\e153" +} + +.glyphicon-sort-by-order-alt:before { + content: "\e154" +} + +.glyphicon-sort-by-attributes:before { + content: "\e155" +} + +.glyphicon-sort-by-attributes-alt:before { + content: "\e156" +} + +.glyphicon-unchecked:before { + content: "\e157" +} + +.glyphicon-expand:before { + content: "\e158" +} + +.glyphicon-collapse-down:before { + content: "\e159" +} + +.glyphicon-collapse-up:before { + content: "\e160" +} + +.glyphicon-log-in:before { + content: "\e161" +} + +.glyphicon-flash:before { + content: "\e162" +} + +.glyphicon-log-out:before { + content: "\e163" +} + +.glyphicon-new-window:before { + content: "\e164" +} + +.glyphicon-record:before { + content: "\e165" +} + +.glyphicon-save:before { + content: "\e166" +} + +.glyphicon-open:before { + content: "\e167" +} + +.glyphicon-saved:before { + content: "\e168" +} + +.glyphicon-import:before { + content: "\e169" +} + +.glyphicon-export:before { + content: "\e170" +} + +.glyphicon-send:before { + content: "\e171" +} + +.glyphicon-floppy-disk:before { + content: "\e172" +} + +.glyphicon-floppy-saved:before { + content: "\e173" +} + +.glyphicon-floppy-remove:before { + content: "\e174" +} + +.glyphicon-floppy-save:before { + content: "\e175" +} + +.glyphicon-floppy-open:before { + content: "\e176" +} + +.glyphicon-credit-card:before { + content: "\e177" +} + +.glyphicon-transfer:before { + content: "\e178" +} + +.glyphicon-cutlery:before { + content: "\e179" +} + +.glyphicon-header:before { + content: "\e180" +} + +.glyphicon-compressed:before { + content: "\e181" +} + +.glyphicon-earphone:before { + content: "\e182" +} + +.glyphicon-phone-alt:before { + content: "\e183" +} + +.glyphicon-tower:before { + content: "\e184" +} + +.glyphicon-stats:before { + content: "\e185" +} + +.glyphicon-sd-video:before { + content: "\e186" +} + +.glyphicon-hd-video:before { + content: "\e187" +} + +.glyphicon-subtitles:before { + content: "\e188" +} + +.glyphicon-sound-stereo:before { + content: "\e189" +} + +.glyphicon-sound-dolby:before { + content: "\e190" +} + +.glyphicon-sound-5-1:before { + content: "\e191" +} + +.glyphicon-sound-6-1:before { + content: "\e192" +} + +.glyphicon-sound-7-1:before { + content: "\e193" +} + +.glyphicon-copyright-mark:before { + content: "\e194" +} + +.glyphicon-registration-mark:before { + content: "\e195" +} + +.glyphicon-cloud-download:before { + content: "\e197" +} + +.glyphicon-cloud-upload:before { + content: "\e198" +} + +.glyphicon-tree-conifer:before { + content: "\e199" +} + +.glyphicon-tree-deciduous:before { + content: "\e200" +} + +.glyphicon-cd:before { + content: "\e201" +} + +.glyphicon-save-file:before { + content: "\e202" +} + +.glyphicon-open-file:before { + content: "\e203" +} + +.glyphicon-level-up:before { + content: "\e204" +} + +.glyphicon-copy:before { + content: "\e205" +} + +.glyphicon-paste:before { + content: "\e206" +} + +.glyphicon-alert:before { + content: "\e209" +} + +.glyphicon-equalizer:before { + content: "\e210" +} + +.glyphicon-king:before { + content: "\e211" +} + +.glyphicon-queen:before { + content: "\e212" +} + +.glyphicon-pawn:before { + content: "\e213" +} + +.glyphicon-bishop:before { + content: "\e214" +} + +.glyphicon-knight:before { + content: "\e215" +} + +.glyphicon-baby-formula:before { + content: "\e216" +} + +.glyphicon-tent:before { + content: "\26fa" +} + +.glyphicon-blackboard:before { + content: "\e218" +} + +.glyphicon-bed:before { + content: "\e219" +} + +.glyphicon-apple:before { + content: "\f8ff" +} + +.glyphicon-erase:before { + content: "\e221" +} + +.glyphicon-hourglass:before { + content: "\231b" +} + +.glyphicon-lamp:before { + content: "\e223" +} + +.glyphicon-duplicate:before { + content: "\e224" +} + +.glyphicon-piggy-bank:before { + content: "\e225" +} + +.glyphicon-scissors:before { + content: "\e226" +} + +.glyphicon-bitcoin:before { + content: "\e227" +} + +.glyphicon-btc:before { + content: "\e227" +} + +.glyphicon-xbt:before { + content: "\e227" +} + +.glyphicon-yen:before { + content: "\00a5" +} + +.glyphicon-jpy:before { + content: "\00a5" +} + +.glyphicon-ruble:before { + content: "\20bd" +} + +.glyphicon-rub:before { + content: "\20bd" +} + +.glyphicon-scale:before { + content: "\e230" +} + +.glyphicon-ice-lolly:before { + content: "\e231" +} + +.glyphicon-ice-lolly-tasted:before { + content: "\e232" +} + +.glyphicon-education:before { + content: "\e233" +} + +.glyphicon-option-horizontal:before { + content: "\e234" +} + +.glyphicon-option-vertical:before { + content: "\e235" +} + +.glyphicon-menu-hamburger:before { + content: "\e236" +} + +.glyphicon-modal-window:before { + content: "\e237" +} + +.glyphicon-oil:before { + content: "\e238" +} + +.glyphicon-grain:before { + content: "\e239" +} + +.glyphicon-sunglasses:before { + content: "\e240" +} + +.glyphicon-text-size:before { + content: "\e241" +} + +.glyphicon-text-color:before { + content: "\e242" +} + +.glyphicon-text-background:before { + content: "\e243" +} + +.glyphicon-object-align-top:before { + content: "\e244" +} + +.glyphicon-object-align-bottom:before { + content: "\e245" +} + +.glyphicon-object-align-horizontal:before { + content: "\e246" +} + +.glyphicon-object-align-left:before { + content: "\e247" +} + +.glyphicon-object-align-vertical:before { + content: "\e248" +} + +.glyphicon-object-align-right:before { + content: "\e249" +} + +.glyphicon-triangle-right:before { + content: "\e250" +} + +.glyphicon-triangle-left:before { + content: "\e251" +} + +.glyphicon-triangle-bottom:before { + content: "\e252" +} + +.glyphicon-triangle-top:before { + content: "\e253" +} + +.glyphicon-console:before { + content: "\e254" +} + +.glyphicon-superscript:before { + content: "\e255" +} + +.glyphicon-subscript:before { + content: "\e256" +} + +.glyphicon-menu-left:before { + content: "\e257" +} + +.glyphicon-menu-right:before { + content: "\e258" +} + +.glyphicon-menu-down:before { + content: "\e259" +} + +.glyphicon-menu-up:before { + content: "\e260" +} + +* { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box +} + +:after, :before { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box +} + +html { + font-size: 10px; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0) +} + +body { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + line-height: 1.42857143; + color:#1e2225; + background-color: #fff +} + +button, input, select, textarea { + font-family: inherit; + font-size: inherit; + line-height: inherit +} + +a { + color: #337ab7; + text-decoration: none +} + +a:focus, a:hover { + color: #23527c; + text-decoration: underline +} + +a:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px +} + +figure { + margin: 0 +} + +img { + vertical-align: middle +} + +.carousel-inner>.item>a>img, .carousel-inner>.item>img, .img-responsive, + .thumbnail a>img, .thumbnail>img { + display: block; + max-width: 100%; + height: auto +} + +.img-rounded { + border-radius: 6px +} + +.img-thumbnail { + display: inline-block; + max-width: 100%; + height: auto; + padding: 4px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: all .2s ease-in-out; + -o-transition: all .2s ease-in-out; + transition: all .2s ease-in-out +} + +.img-circle { + border-radius: 50% +} + +hr { + margin-top: 20px; + margin-bottom: 20px; + border: 0; + border-top: 1px solid #eee +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + border: 0 +} + +.sr-only-focusable:active, .sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + margin: 0; + overflow: visible; + clip: auto +} + +[role=button] { + cursor: pointer +} + +.h1, .h2, .h3, .h4, .h5, .h6, h1, h2, h3, h4, h5, h6 { + font-family: inherit; + font-weight: 500; + line-height: 1.1; + color: inherit +} + +.h1 .small, .h1 small, .h2 .small, .h2 small, .h3 .small, .h3 small, .h4 .small, + .h4 small, .h5 .small, .h5 small, .h6 .small, .h6 small, h1 .small, h1 small, + h2 .small, h2 small, h3 .small, h3 small, h4 .small, h4 small, h5 .small, + h5 small, h6 .small, h6 small { + font-weight: 400; + line-height: 1; + color: #777 +} + +.h1, .h2, .h3, h1, h2, h3 { + margin-top: 20px; + margin-bottom: 10px +} + +.h1 .small, .h1 small, .h2 .small, .h2 small, .h3 .small, .h3 small, h1 .small, + h1 small, h2 .small, h2 small, h3 .small, h3 small { + font-size: 65% +} + +.h4, .h5, .h6, h4, h5, h6 { + margin-top: 10px; + margin-bottom: 10px +} + +.h4 .small, .h4 small, .h5 .small, .h5 small, .h6 .small, .h6 small, h4 .small, + h4 small, h5 .small, h5 small, h6 .small, h6 small { + font-size: 75% +} + +.h1, h1 { + font-size: 36px +} + +.h2, h2 { + font-size: 30px +} + +.h3, h3 { + font-size: 24px +} + +.h4, h4 { + font-size: 18px +} + +.h5, h5 { + font-size: 14px +} + +.h6, h6 { + font-size: 12px +} + +p { + margin: 0 0 10px +} + +.lead { + margin-bottom: 20px; + font-size: 16px; + font-weight: 300; + line-height: 1.4 +} + +@media ( min-width :768px) { + .lead { + font-size: 21px + } +} + +.small, small { + font-size: 85% +} + +.mark, mark { + padding: .2em; + background-color: #fcf8e3 +} + +.text-left { + text-align: left +} + +.text-right { + text-align: right +} + +.text-center { + text-align: center +} + +.text-justify { + text-align: justify +} + +.text-nowrap { + white-space: nowrap +} + +.text-lowercase { + text-transform: lowercase +} + +.text-uppercase { + text-transform: uppercase +} + +.text-capitalize { + text-transform: capitalize +} + +.text-muted { + color: #777 +} + +.text-primary { + color: #337ab7 +} + +a.text-primary:focus, a.text-primary:hover { + color: #286090 +} + +.text-success { + color: #3c763d +} + +a.text-success:focus, a.text-success:hover { + color: #2b542c +} + +.text-info { + color: #31708f +} + +a.text-info:focus, a.text-info:hover { + color: #245269 +} + +.text-warning { + color: #8a6d3b +} + +a.text-warning:focus, a.text-warning:hover { + color: #66512c +} + +.text-danger { + color: #a94442 +} + +a.text-danger:focus, a.text-danger:hover { + color: #843534 +} + +.bg-primary { + color: #fff; + background-color: #337ab7 +} + +a.bg-primary:focus, a.bg-primary:hover { + background-color: #286090 +} + +.bg-success { + background-color: #dff0d8 +} + +a.bg-success:focus, a.bg-success:hover { + background-color: #c1e2b3 +} + +.bg-info { + background-color: #d9edf7 +} + +a.bg-info:focus, a.bg-info:hover { + background-color: #afd9ee +} + +.bg-warning { + background-color: #fcf8e3 +} + +a.bg-warning:focus, a.bg-warning:hover { + background-color: #f7ecb5 +} + +.bg-danger { + background-color: #f2dede +} + +a.bg-danger:focus, a.bg-danger:hover { + background-color: #e4b9b9 +} + +.page-header { + padding-bottom: 9px; + margin: 40px 0 20px; + border-bottom: 1px solid #eee +} + +ol, ul { + margin-top: 0; + margin-bottom: 10px +} + +ol ol, ol ul, ul ol, ul ul { + margin-bottom: 0 +} + +.list-unstyled { + padding-left: 0; + list-style: none +} + +.list-inline { + padding-left: 0; + margin-left: -5px; + list-style: none +} + +.list-inline>li { + display: inline-block; + padding-right: 5px; + padding-left: 5px +} + +dl { + margin-top: 0; + margin-bottom: 20px +} + +dd, dt { + line-height: 1.42857143 +} + +dt { + font-weight: 700 +} + +dd { + margin-left: 0 +} + +@media ( min-width :768px) { + .dl-horizontal dt { + float: left; + width: 160px; + overflow: hidden; + clear: left; + text-align: right; + text-overflow: ellipsis; + white-space: nowrap + } + .dl-horizontal dd { + margin-left: 180px + } +} + +abbr[data-original-title], abbr[title] { + cursor: help; + border-bottom: 1px dotted #777 +} + +.initialism { + font-size: 90%; + text-transform: uppercase +} + +blockquote { + padding: 10px 20px; + margin: 0 0 20px; + font-size: 17.5px; + border-left: 5px solid #eee +} + +blockquote ol:last-child, blockquote p:last-child, blockquote ul:last-child + { + margin-bottom: 0 +} + +blockquote .small, blockquote footer, blockquote small { + display: block; + font-size: 80%; + line-height: 1.42857143; + color: #777 +} + +blockquote .small:before, blockquote footer:before, blockquote small:before + { + content: '\2014 \00A0' +} + +.blockquote-reverse, blockquote.pull-right { + padding-right: 15px; + padding-left: 0; + text-align: right; + border-right: 5px solid #eee; + border-left: 0 +} + +.blockquote-reverse .small:before, .blockquote-reverse footer:before, + .blockquote-reverse small:before, blockquote.pull-right .small:before, + blockquote.pull-right footer:before, blockquote.pull-right small:before + { + content: '' +} + +.blockquote-reverse .small:after, .blockquote-reverse footer:after, + .blockquote-reverse small:after, blockquote.pull-right .small:after, + blockquote.pull-right footer:after, blockquote.pull-right small:after { + content: '\00A0 \2014' +} + +address { + margin-bottom: 20px; + font-style: normal; + line-height: 1.42857143 +} + +code, kbd, pre, samp { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace +} + +code { + padding: 2px 4px; + font-size: 90%; + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px +} + +kbd { + padding: 2px 4px; + font-size: 90%; + color: #fff; + background-color: #333; + border-radius: 3px; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25) +} + +kbd kbd { + padding: 0; + font-size: 100%; + font-weight: 700; + -webkit-box-shadow: none; + box-shadow: none +} + +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 13px; + line-height: 1.42857143; + color: #333; + word-break: break-all; + word-wrap: break-word; + background-color: #f5f5f5; + border: 1px solid #ccc; + border-radius: 4px +} + +pre code { + padding: 0; + font-size: inherit; + color: inherit; + white-space: pre-wrap; + background-color: transparent; + border-radius: 0 +} + +.pre-scrollable { + max-height: 340px; + overflow-y: scroll +} + +.container { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto +} + +@media ( min-width :768px) { + .container { + width: 750px + } +} + +@media ( min-width :992px) { + .container { + width: 970px + } +} + +@media ( min-width :1200px) { + .container { + width: 1170px + } +} + +.container-fluid { + padding-right: 15px; + padding-left: 15px; + margin-right: auto; + margin-left: auto +} + +.row { + margin-right: -15px; + margin-left: -15px +} + +.col-lg-1, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg-2, .col-lg-3, + .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, + .col-md-1, .col-md-10, .col-md-11, .col-md-12, .col-md-2, .col-md-3, + .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, + .col-sm-1, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm-2, .col-sm-3, + .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, + .col-xs-1, .col-xs-10, .col-xs-11, .col-xs-12, .col-xs-2, .col-xs-3, + .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9 { + position: relative; + min-height: 1px; + padding-right: 15px; + padding-left: 15px +} + +.col-xs-1, .col-xs-10, .col-xs-11, .col-xs-12, .col-xs-2, .col-xs-3, + .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9 { + float: left +} + +.col-xs-12 { + width: 100% +} + +.col-xs-11 { + width: 91.66666667% +} + +.col-xs-10 { + width: 83.33333333% +} + +.col-xs-9 { + width: 75% +} + +.col-xs-8 { + width: 66.66666667% +} + +.col-xs-7 { + width: 58.33333333% +} + +.col-xs-6 { + width: 50% +} + +.col-xs-5 { + width: 41.66666667% +} + +.col-xs-4 { + width: 33.33333333% +} + +.col-xs-3 { + width: 25% +} + +.col-xs-2 { + width: 16.66666667% +} + +.col-xs-1 { + width: 8.33333333% +} + +.col-xs-pull-12 { + right: 100% +} + +.col-xs-pull-11 { + right: 91.66666667% +} + +.col-xs-pull-10 { + right: 83.33333333% +} + +.col-xs-pull-9 { + right: 75% +} + +.col-xs-pull-8 { + right: 66.66666667% +} + +.col-xs-pull-7 { + right: 58.33333333% +} + +.col-xs-pull-6 { + right: 50% +} + +.col-xs-pull-5 { + right: 41.66666667% +} + +.col-xs-pull-4 { + right: 33.33333333% +} + +.col-xs-pull-3 { + right: 25% +} + +.col-xs-pull-2 { + right: 16.66666667% +} + +.col-xs-pull-1 { + right: 8.33333333% +} + +.col-xs-pull-0 { + right: auto +} + +.col-xs-push-12 { + left: 100% +} + +.col-xs-push-11 { + left: 91.66666667% +} + +.col-xs-push-10 { + left: 83.33333333% +} + +.col-xs-push-9 { + left: 75% +} + +.col-xs-push-8 { + left: 66.66666667% +} + +.col-xs-push-7 { + left: 58.33333333% +} + +.col-xs-push-6 { + left: 50% +} + +.col-xs-push-5 { + left: 41.66666667% +} + +.col-xs-push-4 { + left: 33.33333333% +} + +.col-xs-push-3 { + left: 25% +} + +.col-xs-push-2 { + left: 16.66666667% +} + +.col-xs-push-1 { + left: 8.33333333% +} + +.col-xs-push-0 { + left: auto +} + +.col-xs-offset-12 { + margin-left: 100% +} + +.col-xs-offset-11 { + margin-left: 91.66666667% +} + +.col-xs-offset-10 { + margin-left: 83.33333333% +} + +.col-xs-offset-9 { + margin-left: 75% +} + +.col-xs-offset-8 { + margin-left: 66.66666667% +} + +.col-xs-offset-7 { + margin-left: 58.33333333% +} + +.col-xs-offset-6 { + margin-left: 50% +} + +.col-xs-offset-5 { + margin-left: 41.66666667% +} + +.col-xs-offset-4 { + margin-left: 33.33333333% +} + +.col-xs-offset-3 { + margin-left: 25% +} + +.col-xs-offset-2 { + margin-left: 16.66666667% +} + +.col-xs-offset-1 { + margin-left: 8.33333333% +} + +.col-xs-offset-0 { + margin-left: 0 +} + +@media ( min-width :768px) { + .col-sm-1, .col-sm-10, .col-sm-11, .col-sm-12, .col-sm-2, .col-sm-3, + .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9 { + float: left + } + .col-sm-12 { + width: 100% + } + .col-sm-11 { + width: 91.66666667% + } + .col-sm-10 { + width: 83.33333333% + } + .col-sm-9 { + width: 75% + } + .col-sm-8 { + width: 66.66666667% + } + .col-sm-7 { + width: 58.33333333% + } + .col-sm-6 { + width: 50% + } + .col-sm-5 { + width: 41.66666667% + } + .col-sm-4 { + width: 33.33333333% + } + .col-sm-3 { + width: 25% + } + .col-sm-2 { + width: 16.66666667% + } + .col-sm-1 { + width: 8.33333333% + } + .col-sm-pull-12 { + right: 100% + } + .col-sm-pull-11 { + right: 91.66666667% + } + .col-sm-pull-10 { + right: 83.33333333% + } + .col-sm-pull-9 { + right: 75% + } + .col-sm-pull-8 { + right: 66.66666667% + } + .col-sm-pull-7 { + right: 58.33333333% + } + .col-sm-pull-6 { + right: 50% + } + .col-sm-pull-5 { + right: 41.66666667% + } + .col-sm-pull-4 { + right: 33.33333333% + } + .col-sm-pull-3 { + right: 25% + } + .col-sm-pull-2 { + right: 16.66666667% + } + .col-sm-pull-1 { + right: 8.33333333% + } + .col-sm-pull-0 { + right: auto + } + .col-sm-push-12 { + left: 100% + } + .col-sm-push-11 { + left: 91.66666667% + } + .col-sm-push-10 { + left: 83.33333333% + } + .col-sm-push-9 { + left: 75% + } + .col-sm-push-8 { + left: 66.66666667% + } + .col-sm-push-7 { + left: 58.33333333% + } + .col-sm-push-6 { + left: 50% + } + .col-sm-push-5 { + left: 41.66666667% + } + .col-sm-push-4 { + left: 33.33333333% + } + .col-sm-push-3 { + left: 25% + } + .col-sm-push-2 { + left: 16.66666667% + } + .col-sm-push-1 { + left: 8.33333333% + } + .col-sm-push-0 { + left: auto + } + .col-sm-offset-12 { + margin-left: 100% + } + .col-sm-offset-11 { + margin-left: 91.66666667% + } + .col-sm-offset-10 { + margin-left: 83.33333333% + } + .col-sm-offset-9 { + margin-left: 75% + } + .col-sm-offset-8 { + margin-left: 66.66666667% + } + .col-sm-offset-7 { + margin-left: 58.33333333% + } + .col-sm-offset-6 { + margin-left: 50% + } + .col-sm-offset-5 { + margin-left: 41.66666667% + } + .col-sm-offset-4 { + margin-left: 33.33333333% + } + .col-sm-offset-3 { + margin-left: 25% + } + .col-sm-offset-2 { + margin-left: 16.66666667% + } + .col-sm-offset-1 { + margin-left: 8.33333333% + } + .col-sm-offset-0 { + margin-left: 0 + } +} + +@media ( min-width :992px) { + .col-md-1, .col-md-10, .col-md-11, .col-md-12, .col-md-2, .col-md-3, + .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9 { + float: left + } + .col-md-12 { + width: 100% + } + .col-md-11 { + width: 91.66666667% + } + .col-md-10 { + width: 83.33333333% + } + .col-md-9 { + width: 75% + } + .col-md-8 { + width: 66.66666667% + } + .col-md-7 { + width: 58.33333333% + } + .col-md-6 { + width: 50% + } + .col-md-5 { + width: 41.66666667% + } + .col-md-4 { + width: 33.33333333% + } + .col-md-3 { + width: 25% + } + .col-md-2 { + width: 16.66666667% + } + .col-md-1 { + width: 8.33333333% + } + .col-md-pull-12 { + right: 100% + } + .col-md-pull-11 { + right: 91.66666667% + } + .col-md-pull-10 { + right: 83.33333333% + } + .col-md-pull-9 { + right: 75% + } + .col-md-pull-8 { + right: 66.66666667% + } + .col-md-pull-7 { + right: 58.33333333% + } + .col-md-pull-6 { + right: 50% + } + .col-md-pull-5 { + right: 41.66666667% + } + .col-md-pull-4 { + right: 33.33333333% + } + .col-md-pull-3 { + right: 25% + } + .col-md-pull-2 { + right: 16.66666667% + } + .col-md-pull-1 { + right: 8.33333333% + } + .col-md-pull-0 { + right: auto + } + .col-md-push-12 { + left: 100% + } + .col-md-push-11 { + left: 91.66666667% + } + .col-md-push-10 { + left: 83.33333333% + } + .col-md-push-9 { + left: 75% + } + .col-md-push-8 { + left: 66.66666667% + } + .col-md-push-7 { + left: 58.33333333% + } + .col-md-push-6 { + left: 50% + } + .col-md-push-5 { + left: 41.66666667% + } + .col-md-push-4 { + left: 33.33333333% + } + .col-md-push-3 { + left: 25% + } + .col-md-push-2 { + left: 16.66666667% + } + .col-md-push-1 { + left: 8.33333333% + } + .col-md-push-0 { + left: auto + } + .col-md-offset-12 { + margin-left: 100% + } + .col-md-offset-11 { + margin-left: 91.66666667% + } + .col-md-offset-10 { + margin-left: 83.33333333% + } + .col-md-offset-9 { + margin-left: 75% + } + .col-md-offset-8 { + margin-left: 66.66666667% + } + .col-md-offset-7 { + margin-left: 58.33333333% + } + .col-md-offset-6 { + margin-left: 50% + } + .col-md-offset-5 { + margin-left: 41.66666667% + } + .col-md-offset-4 { + margin-left: 33.33333333% + } + .col-md-offset-3 { + margin-left: 25% + } + .col-md-offset-2 { + margin-left: 16.66666667% + } + .col-md-offset-1 { + margin-left: 8.33333333% + } + .col-md-offset-0 { + margin-left: 0 + } +} + +@media ( min-width :1200px) { + .col-lg-1, .col-lg-10, .col-lg-11, .col-lg-12, .col-lg-2, .col-lg-3, + .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9 { + float: left + } + .col-lg-12 { + width: 100% + } + .col-lg-11 { + width: 91.66666667% + } + .col-lg-10 { + width: 83.33333333% + } + .col-lg-9 { + width: 75% + } + .col-lg-8 { + width: 66.66666667% + } + .col-lg-7 { + width: 58.33333333% + } + .col-lg-6 { + width: 50% + } + .col-lg-5 { + width: 41.66666667% + } + .col-lg-4 { + width: 33.33333333% + } + .col-lg-3 { + width: 25% + } + .col-lg-2 { + width: 16.66666667% + } + .col-lg-1 { + width: 8.33333333% + } + .col-lg-pull-12 { + right: 100% + } + .col-lg-pull-11 { + right: 91.66666667% + } + .col-lg-pull-10 { + right: 83.33333333% + } + .col-lg-pull-9 { + right: 75% + } + .col-lg-pull-8 { + right: 66.66666667% + } + .col-lg-pull-7 { + right: 58.33333333% + } + .col-lg-pull-6 { + right: 50% + } + .col-lg-pull-5 { + right: 41.66666667% + } + .col-lg-pull-4 { + right: 33.33333333% + } + .col-lg-pull-3 { + right: 25% + } + .col-lg-pull-2 { + right: 16.66666667% + } + .col-lg-pull-1 { + right: 8.33333333% + } + .col-lg-pull-0 { + right: auto + } + .col-lg-push-12 { + left: 100% + } + .col-lg-push-11 { + left: 91.66666667% + } + .col-lg-push-10 { + left: 83.33333333% + } + .col-lg-push-9 { + left: 75% + } + .col-lg-push-8 { + left: 66.66666667% + } + .col-lg-push-7 { + left: 58.33333333% + } + .col-lg-push-6 { + left: 50% + } + .col-lg-push-5 { + left: 41.66666667% + } + .col-lg-push-4 { + left: 33.33333333% + } + .col-lg-push-3 { + left: 25% + } + .col-lg-push-2 { + left: 16.66666667% + } + .col-lg-push-1 { + left: 8.33333333% + } + .col-lg-push-0 { + left: auto + } + .col-lg-offset-12 { + margin-left: 100% + } + .col-lg-offset-11 { + margin-left: 91.66666667% + } + .col-lg-offset-10 { + margin-left: 83.33333333% + } + .col-lg-offset-9 { + margin-left: 75% + } + .col-lg-offset-8 { + margin-left: 66.66666667% + } + .col-lg-offset-7 { + margin-left: 58.33333333% + } + .col-lg-offset-6 { + margin-left: 50% + } + .col-lg-offset-5 { + margin-left: 41.66666667% + } + .col-lg-offset-4 { + margin-left: 33.33333333% + } + .col-lg-offset-3 { + margin-left: 25% + } + .col-lg-offset-2 { + margin-left: 16.66666667% + } + .col-lg-offset-1 { + margin-left: 8.33333333% + } + .col-lg-offset-0 { + margin-left: 0 + } +} + +table { + background-color: transparent +} + +caption { + padding-top: 8px; + padding-bottom: 8px; + color: #777; + text-align: left +} + +th { + text-align: left +} + +.table { + width: 100%; + max-width: 100%; + margin-bottom: 20px +} + +.table>tbody>tr>td, .table>tbody>tr>th, .table>tfoot>tr>td, .table>tfoot>tr>th, + .table>thead>tr>td, .table>thead>tr>th { + padding: 8px; + line-height: 1.42857143; + vertical-align: top; + border-top: 1px solid #ddd +} + +.table>thead>tr>th { + vertical-align: bottom; + border-bottom: 2px solid #ddd +} + +.table>caption+thead>tr:first-child>td, .table>caption+thead>tr:first-child>th, + .table>colgroup+thead>tr:first-child>td, .table>colgroup+thead>tr:first-child>th, + .table>thead:first-child>tr:first-child>td, .table>thead:first-child>tr:first-child>th + { + border-top: 0 +} + +.table>tbody+tbody { + border-top: 2px solid #000000 +} + +.table .table { + background-color: #fff +} + +.table-condensed>tbody>tr>td, .table-condensed>tbody>tr>th, + .table-condensed>tfoot>tr>td, .table-condensed>tfoot>tr>th, + .table-condensed>thead>tr>td, .table-condensed>thead>tr>th { + padding: 5px +} + +.table-bordered { + border: 1px solid #ddd +} + +.table-bordered>tbody>tr>td, .table-bordered>tbody>tr>th, + .table-bordered>tfoot>tr>td, .table-bordered>tfoot>tr>th, + .table-bordered>thead>tr>td, .table-bordered>thead>tr>th { + border: 1px solid #ddd +} + +.table-bordered>thead>tr>td, .table-bordered>thead>tr>th { + border-bottom-width: 2px +} + +.table-striped>tbody>tr:nth-of-type(odd) { + +} + +.table-hover>tbody>tr:hover { + +} + +table col[class*=col-] { + position: static; + display: table-column; + float: none +} + +table td[class*=col-], table th[class*=col-] { + position: static; + display: table-cell; + float: none +} + +.table>tbody>tr.active>td, .table>tbody>tr.active>th, .table>tbody>tr>td.active, + .table>tbody>tr>th.active, .table>tfoot>tr.active>td, .table>tfoot>tr.active>th, + .table>tfoot>tr>td.active, .table>tfoot>tr>th.active, .table>thead>tr.active>td, + .table>thead>tr.active>th, .table>thead>tr>td.active, .table>thead>tr>th.active + { + background-color: #f5f5f5 +} + +.table-hover>tbody>tr.active:hover>td, .table-hover>tbody>tr.active:hover>th, + .table-hover>tbody>tr:hover>.active, .table-hover>tbody>tr>td.active:hover, + .table-hover>tbody>tr>th.active:hover { + background-color: #e8e8e8 +} + +.table>tbody>tr.success>td, .table>tbody>tr.success>th, .table>tbody>tr>td.success, + .table>tbody>tr>th.success, .table>tfoot>tr.success>td, .table>tfoot>tr.success>th, + .table>tfoot>tr>td.success, .table>tfoot>tr>th.success, .table>thead>tr.success>td, + .table>thead>tr.success>th, .table>thead>tr>td.success, .table>thead>tr>th.success + { + background-color: #dff0d8 +} + +.table-hover>tbody>tr.success:hover>td, .table-hover>tbody>tr.success:hover>th, + .table-hover>tbody>tr:hover>.success, .table-hover>tbody>tr>td.success:hover, + .table-hover>tbody>tr>th.success:hover { + background-color: #d0e9c6 +} + +.table>tbody>tr.info>td, .table>tbody>tr.info>th, .table>tbody>tr>td.info, + .table>tbody>tr>th.info, .table>tfoot>tr.info>td, .table>tfoot>tr.info>th, + .table>tfoot>tr>td.info, .table>tfoot>tr>th.info, .table>thead>tr.info>td, + .table>thead>tr.info>th, .table>thead>tr>td.info, .table>thead>tr>th.info + { + background-color: #d9edf7 +} + +.table-hover>tbody>tr.info:hover>td, .table-hover>tbody>tr.info:hover>th, + .table-hover>tbody>tr:hover>.info, .table-hover>tbody>tr>td.info:hover, + .table-hover>tbody>tr>th.info:hover { + background-color: #c4e3f3 +} + +.table>tbody>tr.warning>td, .table>tbody>tr.warning>th, .table>tbody>tr>td.warning, + .table>tbody>tr>th.warning, .table>tfoot>tr.warning>td, .table>tfoot>tr.warning>th, + .table>tfoot>tr>td.warning, .table>tfoot>tr>th.warning, .table>thead>tr.warning>td, + .table>thead>tr.warning>th, .table>thead>tr>td.warning, .table>thead>tr>th.warning + { + background-color: #fcf8e3 +} + +.table-hover>tbody>tr.warning:hover>td, .table-hover>tbody>tr.warning:hover>th, + .table-hover>tbody>tr:hover>.warning, .table-hover>tbody>tr>td.warning:hover, + .table-hover>tbody>tr>th.warning:hover { + background-color: #faf2cc +} + +.table>tbody>tr.danger>td, .table>tbody>tr.danger>th, .table>tbody>tr>td.danger, + .table>tbody>tr>th.danger, .table>tfoot>tr.danger>td, .table>tfoot>tr.danger>th, + .table>tfoot>tr>td.danger, .table>tfoot>tr>th.danger, .table>thead>tr.danger>td, + .table>thead>tr.danger>th, .table>thead>tr>td.danger, .table>thead>tr>th.danger + { + background-color: #f2dede +} + +.table-hover>tbody>tr.danger:hover>td, .table-hover>tbody>tr.danger:hover>th, + .table-hover>tbody>tr:hover>.danger, .table-hover>tbody>tr>td.danger:hover, + .table-hover>tbody>tr>th.danger:hover { + background-color: #ebcccc +} + +.table-responsive { + min-height: .01%; + overflow-x: auto +} + +@media screen and (max-width:767px) { + .table-responsive { + width: 100%; + margin-bottom: 15px; + overflow-y: hidden; + -ms-overflow-style: -ms-autohiding-scrollbar; + border: 1px solid #ddd + } + .table-responsive>.table { + margin-bottom: 0 + } + .table-responsive>.table>tbody>tr>td, .table-responsive>.table>tbody>tr>th, + .table-responsive>.table>tfoot>tr>td, .table-responsive>.table>tfoot>tr>th, + .table-responsive>.table>thead>tr>td, .table-responsive>.table>thead>tr>th + { + white-space: nowrap + } + .table-responsive>.table-bordered { + border: 0 + } + .table-responsive>.table-bordered>tbody>tr>td:first-child, + .table-responsive>.table-bordered>tbody>tr>th:first-child, + .table-responsive>.table-bordered>tfoot>tr>td:first-child, + .table-responsive>.table-bordered>tfoot>tr>th:first-child, + .table-responsive>.table-bordered>thead>tr>td:first-child, + .table-responsive>.table-bordered>thead>tr>th:first-child { + border-left: 0 + } + .table-responsive>.table-bordered>tbody>tr>td:last-child, + .table-responsive>.table-bordered>tbody>tr>th:last-child, + .table-responsive>.table-bordered>tfoot>tr>td:last-child, + .table-responsive>.table-bordered>tfoot>tr>th:last-child, + .table-responsive>.table-bordered>thead>tr>td:last-child, + .table-responsive>.table-bordered>thead>tr>th:last-child { + border-right: 0 + } + .table-responsive>.table-bordered>tbody>tr:last-child>td, + .table-responsive>.table-bordered>tbody>tr:last-child>th, + .table-responsive>.table-bordered>tfoot>tr:last-child>td, + .table-responsive>.table-bordered>tfoot>tr:last-child>th { + border-bottom: 0 + } +} + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0 +} + +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 21px; + line-height: inherit; + color: #333; + border: 0; + border-bottom: 1px solid #e5e5e5 +} + +label { + display: inline-block; + max-width: 100%; + margin-bottom: 5px; + font-weight: 700 +} + +input[type=search] { + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box +} + +input[type=checkbox], input[type=radio] { + margin: 4px 0 0; + margin-top: 1px\9; + line-height: normal +} + +input[type=file] { + display: block +} + +input[type=range] { + display: block; + width: 100% +} + +select[multiple], select[size] { + height: auto +} + +input[type=file]:focus, input[type=checkbox]:focus, input[type=radio]:focus + { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px +} + +output { + display: block; + padding-top: 7px; + font-size: 14px; + line-height: 1.42857143; + color: #555 +} + +.form-control { + display: block; + width: 100%; + height: 34px; + padding: 6px 12px; + font-size: 14px; + line-height: 1.42857143; + color: #555; + background-color: #fff; + background-image: none; + border: 1px solid #ccc; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow + ease-in-out .15s; + -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out + .15s; + transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s +} + +.form-control:focus { + border-color: #66afe9; + outline: 0; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px + rgba(102, 175, 233, .6); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 8px + rgba(102, 175, 233, .6) +} + +.form-control::-moz-placeholder { + color: #999; + opacity: 1 +} + +.form-control:-ms-input-placeholder { + color: #999 +} + +.form-control::-webkit-input-placeholder { + color: #999 +} + +.form-control::-ms-expand { + background-color: transparent; + border: 0 +} + +.form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control + { + background-color: #eee; + opacity: 1 +} + +.form-control[disabled], fieldset[disabled] .form-control { + cursor: not-allowed +} + +textarea.form-control { + height: auto +} + +input[type=search] { + -webkit-appearance: none +} + +@media screen and (-webkit-min-device-pixel-ratio:0) { + input[type=date].form-control, input[type=time].form-control, input[type=datetime-local].form-control, + input[type=month].form-control { + line-height: 34px + } + .input-group-sm input[type=date], .input-group-sm input[type=time], + .input-group-sm input[type=datetime-local], .input-group-sm input[type=month], + input[type=date].input-sm, input[type=time].input-sm, input[type=datetime-local].input-sm, + input[type=month].input-sm { + line-height: 30px + } + .input-group-lg input[type=date], .input-group-lg input[type=time], + .input-group-lg input[type=datetime-local], .input-group-lg input[type=month], + input[type=date].input-lg, input[type=time].input-lg, input[type=datetime-local].input-lg, + input[type=month].input-lg { + line-height: 46px + } +} + +.form-group { + margin-bottom: 15px +} + +.checkbox, .radio { + position: relative; + display: block; + margin-top: 10px; + margin-bottom: 10px +} + +.checkbox label, .radio label { + min-height: 20px; + padding-left: 20px; + margin-bottom: 0; + font-weight: 400; + cursor: pointer +} + +.checkbox input[type=checkbox], .checkbox-inline input[type=checkbox], + .radio input[type=radio], .radio-inline input[type=radio] { + position: absolute; + margin-top: 4px\9; + margin-left: -20px +} + +.checkbox+.checkbox, .radio+.radio { + margin-top: -5px +} + +.checkbox-inline, .radio-inline { + position: relative; + display: inline-block; + padding-left: 20px; + margin-bottom: 0; + font-weight: 400; + vertical-align: middle; + cursor: pointer +} + +.checkbox-inline+.checkbox-inline, .radio-inline+.radio-inline { + margin-top: 0; + margin-left: 10px +} + +fieldset[disabled] input[type=checkbox], fieldset[disabled] input[type=radio], + input[type=checkbox].disabled, input[type=checkbox][disabled], input[type=radio].disabled, + input[type=radio][disabled] { + cursor: not-allowed +} + +.checkbox-inline.disabled, .radio-inline.disabled, fieldset[disabled] .checkbox-inline, + fieldset[disabled] .radio-inline { + cursor: not-allowed +} + +.checkbox.disabled label, .radio.disabled label, fieldset[disabled] .checkbox label, + fieldset[disabled] .radio label { + cursor: not-allowed +} + +.form-control-static { + min-height: 34px; + padding-top: 7px; + padding-bottom: 7px; + margin-bottom: 0 +} + +.form-control-static.input-lg, .form-control-static.input-sm { + padding-right: 0; + padding-left: 0 +} + +.input-sm { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px +} + +select.input-sm { + height: 30px; + line-height: 30px +} + +select[multiple].input-sm, textarea.input-sm { + height: auto +} + +.form-group-sm .form-control { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px +} + +.form-group-sm select.form-control { + height: 30px; + line-height: 30px +} + +.form-group-sm select[multiple].form-control, .form-group-sm textarea.form-control + { + height: auto +} + +.form-group-sm .form-control-static { + height: 30px; + min-height: 32px; + padding: 6px 10px; + font-size: 12px; + line-height: 1.5 +} + +.input-lg { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px +} + +select.input-lg { + height: 46px; + line-height: 46px +} + +select[multiple].input-lg, textarea.input-lg { + height: auto +} + +.form-group-lg .form-control { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px +} + +.form-group-lg select.form-control { + height: 46px; + line-height: 46px +} + +.form-group-lg select[multiple].form-control, .form-group-lg textarea.form-control + { + height: auto +} + +.form-group-lg .form-control-static { + height: 46px; + min-height: 38px; + padding: 11px 16px; + font-size: 18px; + line-height: 1.3333333 +} + +.has-feedback { + position: relative +} + +.has-feedback .form-control { + padding-right: 42.5px +} + +.form-control-feedback { + position: absolute; + top: 0; + right: 0; + z-index: 2; + display: block; + width: 34px; + height: 34px; + line-height: 34px; + text-align: center; + pointer-events: none +} + +.form-group-lg .form-control+.form-control-feedback, .input-group-lg+.form-control-feedback, + .input-lg+.form-control-feedback { + width: 46px; + height: 46px; + line-height: 46px +} + +.form-group-sm .form-control+.form-control-feedback, .input-group-sm+.form-control-feedback, + .input-sm+.form-control-feedback { + width: 30px; + height: 30px; + line-height: 30px +} + +.has-success .checkbox, .has-success .checkbox-inline, .has-success .control-label, + .has-success .help-block, .has-success .radio, .has-success .radio-inline, + .has-success.checkbox label, .has-success.checkbox-inline label, + .has-success.radio label, .has-success.radio-inline label { + color: #3c763d +} + +.has-success .form-control { + border-color: #3c763d; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075) +} + +.has-success .form-control:focus { + border-color: #2b542c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168 +} + +.has-success .input-group-addon { + color: #3c763d; + background-color: #dff0d8; + border-color: #3c763d +} + +.has-success .form-control-feedback { + color: #3c763d +} + +.has-warning .checkbox, .has-warning .checkbox-inline, .has-warning .control-label, + .has-warning .help-block, .has-warning .radio, .has-warning .radio-inline, + .has-warning.checkbox label, .has-warning.checkbox-inline label, + .has-warning.radio label, .has-warning.radio-inline label { + color: #8a6d3b +} + +.has-warning .form-control { + border-color: #8a6d3b; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075) +} + +.has-warning .form-control:focus { + border-color: #66512c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b +} + +.has-warning .input-group-addon { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #8a6d3b +} + +.has-warning .form-control-feedback { + color: #8a6d3b +} + +.has-error .checkbox, .has-error .checkbox-inline, .has-error .control-label, + .has-error .help-block, .has-error .radio, .has-error .radio-inline, + .has-error.checkbox label, .has-error.checkbox-inline label, .has-error.radio label, + .has-error.radio-inline label { + color: #a94442 +} + +.has-error .form-control { + border-color: #a94442; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075) +} + +.has-error .form-control:focus { + border-color: #843534; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483 +} + +.has-error .input-group-addon { + color: #a94442; + background-color: #f2dede; + border-color: #a94442 +} + +.has-error .form-control-feedback { + color: #a94442 +} + +.has-feedback label ~.form-control-feedback { + top: 25px +} + +.has-feedback label.sr-only ~.form-control-feedback { + top: 0 +} + +.help-block { + display: block; + margin-top: 5px; + margin-bottom: 10px; + color: #737373 +} + +@media ( min-width :768px) { + .form-inline .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle + } + .form-inline .form-control { + display: inline-block; + width: auto; + vertical-align: middle + } + .form-inline .form-control-static { + display: inline-block + } + .form-inline .input-group { + display: inline-table; + vertical-align: middle + } + .form-inline .input-group .form-control, .form-inline .input-group .input-group-addon, + .form-inline .input-group .input-group-btn { + width: auto + } + .form-inline .input-group>.form-control { + width: 100% + } + .form-inline .control-label { + margin-bottom: 0; + vertical-align: middle + } + .form-inline .checkbox, .form-inline .radio { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle + } + .form-inline .checkbox label, .form-inline .radio label { + padding-left: 0 + } + .form-inline .checkbox input[type=checkbox], .form-inline .radio input[type=radio] + { + position: relative; + margin-left: 0 + } + .form-inline .has-feedback .form-control-feedback { + top: 0 + } +} + +.form-horizontal .checkbox, .form-horizontal .checkbox-inline, + .form-horizontal .radio, .form-horizontal .radio-inline { + padding-top: 7px; + margin-top: 0; + margin-bottom: 0 +} + +.form-horizontal .checkbox, .form-horizontal .radio { + min-height: 27px +} + +.form-horizontal .form-group { + margin-right: -15px; + margin-left: -15px +} + +@media ( min-width :768px) { + .form-horizontal .control-label { + padding-top: 7px; + margin-bottom: 0; + text-align: right + } +} + +.form-horizontal .has-feedback .form-control-feedback { + right: 15px +} + +@media ( min-width :768px) { + .form-horizontal .form-group-lg .control-label { + padding-top: 11px; + font-size: 18px + } +} + +@media ( min-width :768px) { + .form-horizontal .form-group-sm .control-label { + padding-top: 6px; + font-size: 12px + } +} + +.btn { + display: inline-block; + padding: 6px 12px; + margin-bottom: 0; + font-size: 14px; + font-weight: 400; + line-height: 1.42857143; + text-align: center; + white-space: nowrap; + vertical-align: middle; + -ms-touch-action: manipulation; + touch-action: manipulation; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + background-image: none; + border: 1px solid transparent; + border-radius: 4px +} + +.btn.active.focus, .btn.active:focus, .btn.focus, .btn:active.focus, + .btn:active:focus, .btn:focus { + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px +} + +.btn.focus, .btn:focus, .btn:hover { + color: #333; + text-decoration: none +} + +.btn.active, .btn:active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125) +} + +.btn.disabled, .btn[disabled], fieldset[disabled] .btn { + cursor: not-allowed; + filter: alpha(opacity = 65); + -webkit-box-shadow: none; + box-shadow: none; + opacity: .65 +} + +a.btn.disabled, fieldset[disabled] a.btn { + pointer-events: none +} + +.btn-default { + color: #333; + background-color: #fff; + border-color: #ccc +} + +.btn-default.focus, .btn-default:focus { + color: #333; + background-color: #e6e6e6; + border-color: #8c8c8c +} + +.btn-default:hover { + color: #333; + background-color: #e6e6e6; + border-color: #adadad +} + +.btn-default.active, .btn-default:active, .open>.dropdown-toggle.btn-default + { + color: #333; + background-color: #e6e6e6; + border-color: #adadad +} + +.btn-default.active.focus, .btn-default.active:focus, .btn-default.active:hover, + .btn-default:active.focus, .btn-default:active:focus, .btn-default:active:hover, + .open>.dropdown-toggle.btn-default.focus, .open>.dropdown-toggle.btn-default:focus, + .open>.dropdown-toggle.btn-default:hover { + color: #333; + background-color: #d4d4d4; + border-color: #8c8c8c +} + +.btn-default.active, .btn-default:active, .open>.dropdown-toggle.btn-default + { + background-image: none +} + +.btn-default.disabled.focus, .btn-default.disabled:focus, .btn-default.disabled:hover, + .btn-default[disabled].focus, .btn-default[disabled]:focus, + .btn-default[disabled]:hover, fieldset[disabled] .btn-default.focus, + fieldset[disabled] .btn-default:focus, fieldset[disabled] .btn-default:hover + { + background-color: #fff; + border-color: #ccc +} + +.btn-default .badge { + color: #fff; + background-color: #333 +} + +.btn-primary { + color: #fff; + background-color: #337ab7; + border-color: #2e6da4 +} + +.btn-primary.focus, .btn-primary:focus { + color: #fff; + background-color: #286090; + border-color: #122b40 +} + +.btn-primary:hover { + color: #fff; + background-color: #286090; + border-color: #204d74 +} + +.btn-primary.active, .btn-primary:active, .open>.dropdown-toggle.btn-primary + { + color: #fff; + background-color: #286090; + border-color: #204d74 +} + +.btn-primary.active.focus, .btn-primary.active:focus, .btn-primary.active:hover, + .btn-primary:active.focus, .btn-primary:active:focus, .btn-primary:active:hover, + .open>.dropdown-toggle.btn-primary.focus, .open>.dropdown-toggle.btn-primary:focus, + .open>.dropdown-toggle.btn-primary:hover { + color: #fff; + background-color: #204d74; + border-color: #122b40 +} + +.btn-primary.active, .btn-primary:active, .open>.dropdown-toggle.btn-primary + { + background-image: none +} + +.btn-primary.disabled.focus, .btn-primary.disabled:focus, .btn-primary.disabled:hover, + .btn-primary[disabled].focus, .btn-primary[disabled]:focus, + .btn-primary[disabled]:hover, fieldset[disabled] .btn-primary.focus, + fieldset[disabled] .btn-primary:focus, fieldset[disabled] .btn-primary:hover + { + background-color: #337ab7; + border-color: #2e6da4 +} + +.btn-primary .badge { + color: #337ab7; + background-color: #fff +} + +.btn-success { + color: #fff; + background-color: #5cb85c; + border-color: #4cae4c +} + +.btn-success.focus, .btn-success:focus { + color: #fff; + background-color: #449d44; + border-color: #255625 +} + +.btn-success:hover { + color: #fff; + background-color: #449d44; + border-color: #398439 +} + +.btn-success.active, .btn-success:active, .open>.dropdown-toggle.btn-success + { + color: #fff; + background-color: #449d44; + border-color: #398439 +} + +.btn-success.active.focus, .btn-success.active:focus, .btn-success.active:hover, + .btn-success:active.focus, .btn-success:active:focus, .btn-success:active:hover, + .open>.dropdown-toggle.btn-success.focus, .open>.dropdown-toggle.btn-success:focus, + .open>.dropdown-toggle.btn-success:hover { + color: #fff; + background-color: #398439; + border-color: #255625 +} + +.btn-success.active, .btn-success:active, .open>.dropdown-toggle.btn-success + { + background-image: none +} + +.btn-success.disabled.focus, .btn-success.disabled:focus, .btn-success.disabled:hover, + .btn-success[disabled].focus, .btn-success[disabled]:focus, + .btn-success[disabled]:hover, fieldset[disabled] .btn-success.focus, + fieldset[disabled] .btn-success:focus, fieldset[disabled] .btn-success:hover + { + background-color: #5cb85c; + border-color: #4cae4c +} + +.btn-success .badge { + color: #5cb85c; + background-color: #fff +} + +.btn-info { + color: #fff; + background-color: #5bc0de; + border-color: #46b8da +} + +.btn-info.focus, .btn-info:focus { + color: #fff; + background-color: #31b0d5; + border-color: #1b6d85 +} + +.btn-info:hover { + color: #fff; + background-color: #31b0d5; + border-color: #269abc +} + +.btn-info.active, .btn-info:active, .open>.dropdown-toggle.btn-info { + color: #fff; + background-color: #31b0d5; + border-color: #269abc +} + +.btn-info.active.focus, .btn-info.active:focus, .btn-info.active:hover, + .btn-info:active.focus, .btn-info:active:focus, .btn-info:active:hover, + .open>.dropdown-toggle.btn-info.focus, .open>.dropdown-toggle.btn-info:focus, + .open>.dropdown-toggle.btn-info:hover { + color: #fff; + background-color: #269abc; + border-color: #1b6d85 +} + +.btn-info.active, .btn-info:active, .open>.dropdown-toggle.btn-info { + background-image: none +} + +.btn-info.disabled.focus, .btn-info.disabled:focus, .btn-info.disabled:hover, + .btn-info[disabled].focus, .btn-info[disabled]:focus, .btn-info[disabled]:hover, + fieldset[disabled] .btn-info.focus, fieldset[disabled] .btn-info:focus, + fieldset[disabled] .btn-info:hover { + background-color: #5bc0de; + border-color: #46b8da +} + +.btn-info .badge { + color: #5bc0de; + background-color: #fff +} + +.btn-warning { + color: #fff; + background-color: #f0ad4e; + border-color: #eea236 +} + +.btn-warning.focus, .btn-warning:focus { + color: #fff; + background-color: #ec971f; + border-color: #985f0d +} + +.btn-warning:hover { + color: #fff; + background-color: #ec971f; + border-color: #d58512 +} + +.btn-warning.active, .btn-warning:active, .open>.dropdown-toggle.btn-warning + { + color: #fff; + background-color: #ec971f; + border-color: #d58512 +} + +.btn-warning.active.focus, .btn-warning.active:focus, .btn-warning.active:hover, + .btn-warning:active.focus, .btn-warning:active:focus, .btn-warning:active:hover, + .open>.dropdown-toggle.btn-warning.focus, .open>.dropdown-toggle.btn-warning:focus, + .open>.dropdown-toggle.btn-warning:hover { + color: #fff; + background-color: #d58512; + border-color: #985f0d +} + +.btn-warning.active, .btn-warning:active, .open>.dropdown-toggle.btn-warning + { + background-image: none +} + +.btn-warning.disabled.focus, .btn-warning.disabled:focus, .btn-warning.disabled:hover, + .btn-warning[disabled].focus, .btn-warning[disabled]:focus, + .btn-warning[disabled]:hover, fieldset[disabled] .btn-warning.focus, + fieldset[disabled] .btn-warning:focus, fieldset[disabled] .btn-warning:hover + { + background-color: #f0ad4e; + border-color: #eea236 +} + +.btn-warning .badge { + color: #f0ad4e; + background-color: #fff +} + +.btn-danger { + color: #fff; + background-color: #d9534f; + border-color: #d43f3a +} + +.btn-danger.focus, .btn-danger:focus { + color: #fff; + background-color: #c9302c; + border-color: #761c19 +} + +.btn-danger:hover { + color: #fff; + background-color: #c9302c; + border-color: #ac2925 +} + +.btn-danger.active, .btn-danger:active, .open>.dropdown-toggle.btn-danger + { + color: #fff; + background-color: #c9302c; + border-color: #ac2925 +} + +.btn-danger.active.focus, .btn-danger.active:focus, .btn-danger.active:hover, + .btn-danger:active.focus, .btn-danger:active:focus, .btn-danger:active:hover, + .open>.dropdown-toggle.btn-danger.focus, .open>.dropdown-toggle.btn-danger:focus, + .open>.dropdown-toggle.btn-danger:hover { + color: #fff; + background-color: #ac2925; + border-color: #761c19 +} + +.btn-danger.active, .btn-danger:active, .open>.dropdown-toggle.btn-danger + { + background-image: none +} + +.btn-danger.disabled.focus, .btn-danger.disabled:focus, .btn-danger.disabled:hover, + .btn-danger[disabled].focus, .btn-danger[disabled]:focus, .btn-danger[disabled]:hover, + fieldset[disabled] .btn-danger.focus, fieldset[disabled] .btn-danger:focus, + fieldset[disabled] .btn-danger:hover { + background-color: #d9534f; + border-color: #d43f3a +} + +.btn-danger .badge { + color: #d9534f; + background-color: #fff +} + +.btn-link { + font-weight: 400; + color: #337ab7; + border-radius: 0 +} + +.btn-link, .btn-link.active, .btn-link:active, .btn-link[disabled], + fieldset[disabled] .btn-link { + background-color: transparent; + -webkit-box-shadow: none; + box-shadow: none +} + +.btn-link, .btn-link:active, .btn-link:focus, .btn-link:hover { + border-color: transparent +} + +.btn-link:focus, .btn-link:hover { + color: #23527c; + text-decoration: underline; + background-color: transparent +} + +.btn-link[disabled]:focus, .btn-link[disabled]:hover, fieldset[disabled] .btn-link:focus, + fieldset[disabled] .btn-link:hover { + color: #777; + text-decoration: none +} + +.btn-group-lg>.btn, .btn-lg { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px +} + +.btn-group-sm>.btn, .btn-sm { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px +} + +.btn-group-xs>.btn, .btn-xs { + padding: 1px 5px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px +} + +.btn-block { + display: block; + width: 100% +} + +.btn-block+.btn-block { + margin-top: 5px +} + +input[type=button].btn-block, input[type=reset].btn-block, input[type=submit].btn-block + { + width: 100% +} + +.fade { + opacity: 0; + -webkit-transition: opacity .15s linear; + -o-transition: opacity .15s linear; + transition: opacity .15s linear +} + +.fade.in { + opacity: 1 +} + +.collapse { + display: none +} + +.collapse.in { + display: block +} + +tr.collapse.in { + display: table-row +} + +tbody.collapse.in { + display: table-row-group +} + +.collapsing { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition-timing-function: ease; + -o-transition-timing-function: ease; + transition-timing-function: ease; + -webkit-transition-duration: .35s; + -o-transition-duration: .35s; + transition-duration: .35s; + -webkit-transition-property: height, visibility; + -o-transition-property: height, visibility; + transition-property: height, visibility +} + +.caret { + display: inline-block; + width: 0; + height: 0; + margin-left: 2px; + vertical-align: middle; + border-top: 4px dashed; + border-top: 4px solid\9; + border-right: 4px solid transparent; + border-left: 4px solid transparent +} + +.dropdown, .dropup { + position: relative +} + +.dropdown-toggle:focus { + outline: 0 +} + +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + font-size: 14px; + text-align: left; + list-style: none; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .15); + border-radius: 4px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175); + box-shadow: 0 6px 12px rgba(0, 0, 0, .175) +} + +.dropdown-menu.pull-right { + right: 0; + left: auto +} + +.dropdown-menu .divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5 +} + +.dropdown-menu>li>a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: 400; + line-height: 1.42857143; + color: #333; + white-space: nowrap +} + +.dropdown-menu>li>a:focus, .dropdown-menu>li>a:hover { + color: #262626; + text-decoration: none; + background-color: #f5f5f5 +} + +.dropdown-menu>.active>a, .dropdown-menu>.active>a:focus, .dropdown-menu>.active>a:hover + { + color: #fff; + text-decoration: none; + background-color: #337ab7; + outline: 0 +} + +.dropdown-menu>.disabled>a, .dropdown-menu>.disabled>a:focus, + .dropdown-menu>.disabled>a:hover { + color: #777 +} + +.dropdown-menu>.disabled>a:focus, .dropdown-menu>.disabled>a:hover { + text-decoration: none; + cursor: not-allowed; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled=false) +} + +.open>.dropdown-menu { + display: block +} + +.open>a { + outline: 0 +} + +.dropdown-menu-right { + right: 0; + left: auto +} + +.dropdown-menu-left { + right: auto; + left: 0 +} + +.dropdown-header { + display: block; + padding: 3px 20px; + font-size: 12px; + line-height: 1.42857143; + color: #777; + white-space: nowrap +} + +.dropdown-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 990 +} + +.pull-right>.dropdown-menu { + right: 0; + left: auto +} + +.dropup .caret, .navbar-fixed-bottom .dropdown .caret { + content: ""; + border-top: 0; + border-bottom: 4px dashed; + border-bottom: 4px solid\9 +} + +.dropup .dropdown-menu, .navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 2px +} + +@media ( min-width :768px) { + .navbar-right .dropdown-menu { + right: 0; + left: auto + } + .navbar-right .dropdown-menu-left { + right: auto; + left: 0 + } +} + +.btn-group, .btn-group-vertical { + position: relative; + display: inline-block; + vertical-align: middle +} + +.btn-group-vertical>.btn, .btn-group>.btn { + position: relative; + float: left +} + +.btn-group-vertical>.btn.active, .btn-group-vertical>.btn:active, + .btn-group-vertical>.btn:focus, .btn-group-vertical>.btn:hover, + .btn-group>.btn.active, .btn-group>.btn:active, .btn-group>.btn:focus, + .btn-group>.btn:hover { + z-index: 2 +} + +.btn-group .btn+.btn, .btn-group .btn+.btn-group, .btn-group .btn-group+.btn, + .btn-group .btn-group+.btn-group { + margin-left: -1px +} + +.btn-toolbar { + margin-left: -5px +} + +.btn-toolbar .btn, .btn-toolbar .btn-group, .btn-toolbar .input-group { + float: left +} + +.btn-toolbar>.btn, .btn-toolbar>.btn-group, .btn-toolbar>.input-group { + margin-left: 5px +} + +.btn-group>.btn:not (:first-child ):not (:last-child ):not (.dropdown-toggle + ){ + border-radius: 0 +} + +.btn-group>.btn:first-child { + margin-left: 0 +} + +.btn-group>.btn:first-child:not (:last-child ):not (.dropdown-toggle ){ + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.btn-group>.btn:last-child:not (:first-child ), .btn-group>.dropdown-toggle:not + (:first-child ){ + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} + +.btn-group>.btn-group { + float: left +} + +.btn-group>.btn-group:not (:first-child ):not (:last-child )>.btn { + border-radius: 0 +} + +.btn-group>.btn-group:first-child:not (:last-child )>.btn:last-child, + .btn-group>.btn-group:first-child:not (:last-child )>.dropdown-toggle { + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.btn-group>.btn-group:last-child:not (:first-child )>.btn:first-child { + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} + +.btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { + outline: 0 +} + +.btn-group>.btn+.dropdown-toggle { + padding-right: 8px; + padding-left: 8px +} + +.btn-group>.btn-lg+.dropdown-toggle { + padding-right: 12px; + padding-left: 12px +} + +.btn-group.open .dropdown-toggle { + -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125); + box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125) +} + +.btn-group.open .dropdown-toggle.btn-link { + -webkit-box-shadow: none; + box-shadow: none +} + +.btn .caret { + margin-left: 0 +} + +.btn-lg .caret { + border-width: 5px 5px 0; + border-bottom-width: 0 +} + +.dropup .btn-lg .caret { + border-width: 0 5px 5px +} + +.btn-group-vertical>.btn, .btn-group-vertical>.btn-group, + .btn-group-vertical>.btn-group>.btn { + display: block; + float: none; + width: 100%; + max-width: 100% +} + +.btn-group-vertical>.btn-group>.btn { + float: none +} + +.btn-group-vertical>.btn+.btn, .btn-group-vertical>.btn+.btn-group, + .btn-group-vertical>.btn-group+.btn, .btn-group-vertical>.btn-group+.btn-group + { + margin-top: -1px; + margin-left: 0 +} + +.btn-group-vertical>.btn:not (:first-child ):not (:last-child ){ + border-radius: 0 +} + +.btn-group-vertical>.btn:first-child:not (:last-child ){ + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0 +} + +.btn-group-vertical>.btn:last-child:not (:first-child ){ + border-top-left-radius: 0; + border-top-right-radius: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px +} + +.btn-group-vertical>.btn-group:not (:first-child ):not (:last-child )>.btn + { + border-radius: 0 +} + +.btn-group-vertical>.btn-group:first-child:not (:last-child )>.btn:last-child, + .btn-group-vertical>.btn-group:first-child:not (:last-child )>.dropdown-toggle + { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0 +} + +.btn-group-vertical>.btn-group:last-child:not (:first-child )>.btn:first-child + { + border-top-left-radius: 0; + border-top-right-radius: 0 +} + +.btn-group-justified { + display: table; + width: 100%; + table-layout: fixed; + border-collapse: separate +} + +.btn-group-justified>.btn, .btn-group-justified>.btn-group { + display: table-cell; + float: none; + width: 1% +} + +.btn-group-justified>.btn-group .btn { + width: 100% +} + +.btn-group-justified>.btn-group .dropdown-menu { + left: auto +} + +[data-toggle=buttons]>.btn input[type=checkbox], [data-toggle=buttons]>.btn input[type=radio], + [data-toggle=buttons]>.btn-group>.btn input[type=checkbox], [data-toggle=buttons]>.btn-group>.btn input[type=radio] + { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none +} + +.input-group { + position: relative; + display: table; + border-collapse: separate +} + +.input-group[class*=col-] { + float: none; + padding-right: 0; + padding-left: 0 +} + +.input-group .form-control { + position: relative; + z-index: 2; + float: left; + width: 100%; + margin-bottom: 0 +} + +.input-group .form-control:focus { + z-index: 3 +} + +.input-group-lg>.form-control, .input-group-lg>.input-group-addon, + .input-group-lg>.input-group-btn>.btn { + height: 46px; + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333; + border-radius: 6px +} + +select.input-group-lg>.form-control, select.input-group-lg>.input-group-addon, + select.input-group-lg>.input-group-btn>.btn { + height: 46px; + line-height: 46px +} + +select[multiple].input-group-lg>.form-control, select[multiple].input-group-lg>.input-group-addon, + select[multiple].input-group-lg>.input-group-btn>.btn, textarea.input-group-lg>.form-control, + textarea.input-group-lg>.input-group-addon, textarea.input-group-lg>.input-group-btn>.btn + { + height: auto +} + +.input-group-sm>.form-control, .input-group-sm>.input-group-addon, + .input-group-sm>.input-group-btn>.btn { + height: 30px; + padding: 5px 10px; + font-size: 12px; + line-height: 1.5; + border-radius: 3px +} + +select.input-group-sm>.form-control, select.input-group-sm>.input-group-addon, + select.input-group-sm>.input-group-btn>.btn { + height: 30px; + line-height: 30px +} + +select[multiple].input-group-sm>.form-control, select[multiple].input-group-sm>.input-group-addon, + select[multiple].input-group-sm>.input-group-btn>.btn, textarea.input-group-sm>.form-control, + textarea.input-group-sm>.input-group-addon, textarea.input-group-sm>.input-group-btn>.btn + { + height: auto +} + +.input-group .form-control, .input-group-addon, .input-group-btn { + display: table-cell +} + +.input-group .form-control:not (:first-child ):not (:last-child ), + .input-group-addon:not (:first-child ):not (:last-child ), + .input-group-btn:not (:first-child ):not (:last-child ){ + border-radius: 0 +} + +.input-group-addon, .input-group-btn { + width: 1%; + white-space: nowrap; + vertical-align: middle +} + +.input-group-addon { + padding: 6px 12px; + font-size: 14px; + font-weight: 400; + line-height: 1; + color: #555; + text-align: center; + background-color: #eee; + border: 1px solid #ccc; + border-radius: 4px +} + +.input-group-addon.input-sm { + padding: 5px 10px; + font-size: 12px; + border-radius: 3px +} + +.input-group-addon.input-lg { + padding: 10px 16px; + font-size: 18px; + border-radius: 6px +} + +.input-group-addon input[type=checkbox], .input-group-addon input[type=radio] + { + margin-top: 0 +} + +.input-group .form-control:first-child, .input-group-addon:first-child, + .input-group-btn:first-child>.btn, .input-group-btn:first-child>.btn-group>.btn, + .input-group-btn:first-child>.dropdown-toggle, .input-group-btn:last-child>.btn-group:not + (:last-child )>.btn, .input-group-btn:last-child>.btn:not (:last-child + ):not (.dropdown-toggle ){ + border-top-right-radius: 0; + border-bottom-right-radius: 0 +} + +.input-group-addon:first-child { + border-right: 0 +} + +.input-group .form-control:last-child, .input-group-addon:last-child, + .input-group-btn:first-child>.btn-group:not (:first-child )>.btn, + .input-group-btn:first-child>.btn:not (:first-child ), .input-group-btn:last-child>.btn, + .input-group-btn:last-child>.btn-group>.btn, .input-group-btn:last-child>.dropdown-toggle + { + border-top-left-radius: 0; + border-bottom-left-radius: 0 +} + +.input-group-addon:last-child { + border-left: 0 +} + +.input-group-btn { + position: relative; + font-size: 0; + white-space: nowrap +} + +.input-group-btn>.btn { + position: relative +} + +.input-group-btn>.btn+.btn { + margin-left: -1px +} + +.input-group-btn>.btn:active, .input-group-btn>.btn:focus, + .input-group-btn>.btn:hover { + z-index: 2 +} + +.input-group-btn:first-child>.btn, .input-group-btn:first-child>.btn-group + { + margin-right: -1px +} + +.input-group-btn:last-child>.btn, .input-group-btn:last-child>.btn-group + { + z-index: 2; + margin-left: -1px +} + +.nav { + padding-left: 0; + margin-bottom: 0; + list-style: none +} + +.nav>li { + position: relative; + display: block +} + +.nav>li>a { + position: relative; + display: block; + padding: 10px 15px +} + +.nav>li>a:focus, .nav>li>a:hover { + text-decoration: none; + background-color: #eee +} + +.nav>li.disabled>a { + color: #777 +} + +.nav>li.disabled>a:focus, .nav>li.disabled>a:hover { + color: #777; + text-decoration: none; + cursor: not-allowed; + background-color: transparent +} + +.nav .open>a, .nav .open>a:focus, .nav .open>a:hover { + background-color: #eee; + border-color: #337ab7 +} + +.nav .nav-divider { + height: 1px; + margin: 9px 0; + overflow: hidden; + background-color: #e5e5e5 +} + +.nav>li>a>img { + max-width: none +} + +.nav-tabs { + border-bottom: 1px solid #ddd +} + +.nav-tabs>li { + float: left; + margin-bottom: -1px +} + +.nav-tabs>li>a { + margin-right: 2px; + line-height: 1.42857143; + border: 1px solid transparent; + border-radius: 4px 4px 0 0 +} + +.nav-tabs>li>a:hover { + border-color: #eee #eee #ddd +} + +.nav-tabs>li.active>a, .nav-tabs>li.active>a:focus, .nav-tabs>li.active>a:hover + { + color: #555; + cursor: default; + background-color: #fff; + border: 1px solid #ddd; + border-bottom-color: transparent +} + +.nav-tabs.nav-justified { + width: 100%; + border-bottom: 0 +} + +.nav-tabs.nav-justified>li { + float: none +} + +.nav-tabs.nav-justified>li>a { + margin-bottom: 5px; + text-align: center +} + +.nav-tabs.nav-justified>.dropdown .dropdown-menu { + top: auto; + left: auto +} + +@media ( min-width :768px) { + .nav-tabs.nav-justified>li { + display: table-cell; + width: 1% + } + .nav-tabs.nav-justified>li>a { + margin-bottom: 0 + } +} + +.nav-tabs.nav-justified>li>a { + margin-right: 0; + border-radius: 4px +} + +.nav-tabs.nav-justified>.active>a, .nav-tabs.nav-justified>.active>a:focus, + .nav-tabs.nav-justified>.active>a:hover { + border: 1px solid #ddd +} + +@media ( min-width :768px) { + .nav-tabs.nav-justified>li>a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0 + } + .nav-tabs.nav-justified>.active>a, .nav-tabs.nav-justified>.active>a:focus, + .nav-tabs.nav-justified>.active>a:hover { + border-bottom-color: #fff + } +} + +.nav-pills>li { + float: left +} + +.nav-pills>li>a { + border-radius: 4px +} + +.nav-pills>li+li { + margin-left: 2px +} + +.nav-pills>li.active>a, .nav-pills>li.active>a:focus, .nav-pills>li.active>a:hover + { + color: #fff; + background-color: #337ab7 +} + +.nav-stacked>li { + float: none +} + +.nav-stacked>li+li { + margin-top: 2px; + margin-left: 0 +} + +.nav-justified { + width: 100% +} + +.nav-justified>li { + float: none +} + +.nav-justified>li>a { + margin-bottom: 5px; + text-align: center +} + +.nav-justified>.dropdown .dropdown-menu { + top: auto; + left: auto +} + +@media ( min-width :768px) { + .nav-justified>li { + display: table-cell; + width: 1% + } + .nav-justified>li>a { + margin-bottom: 0 + } +} + +.nav-tabs-justified { + border-bottom: 0 +} + +.nav-tabs-justified>li>a { + margin-right: 0; + border-radius: 4px +} + +.nav-tabs-justified>.active>a, .nav-tabs-justified>.active>a:focus, + .nav-tabs-justified>.active>a:hover { + border: 1px solid #ddd +} + +@media ( min-width :768px) { + .nav-tabs-justified>li>a { + border-bottom: 1px solid #ddd; + border-radius: 4px 4px 0 0 + } + .nav-tabs-justified>.active>a, .nav-tabs-justified>.active>a:focus, + .nav-tabs-justified>.active>a:hover { + border-bottom-color: #fff + } +} + +.tab-content>.tab-pane { + display: none +} + +.tab-content>.active { + display: block +} + +.nav-tabs .dropdown-menu { + margin-top: -1px; + border-top-left-radius: 0; + border-top-right-radius: 0 +} + +.navbar { + position: relative; + min-height: 50px; + margin-bottom: 20px; + border: 1px solid transparent +} + +@media ( min-width :768px) { + .navbar { + border-radius: 4px + } +} + +@media ( min-width :768px) { + .navbar-header { + float: left + } +} + +.navbar-collapse { + padding-right: 15px; + padding-left: 15px; + overflow-x: visible; + -webkit-overflow-scrolling: touch; + border-top: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1) +} + +.navbar-collapse.in { + overflow-y: auto +} + +@media ( min-width :768px) { + .navbar-collapse { + width: auto; + border-top: 0; + -webkit-box-shadow: none; + box-shadow: none + } + .navbar-collapse.collapse { + display: block !important; + height: auto !important; + padding-bottom: 0; + overflow: visible !important + } + .navbar-collapse.in { + overflow-y: visible + } + .navbar-fixed-bottom .navbar-collapse, .navbar-fixed-top .navbar-collapse, + .navbar-static-top .navbar-collapse { + padding-right: 0; + padding-left: 0 + } +} + +.navbar-fixed-bottom .navbar-collapse, .navbar-fixed-top .navbar-collapse + { + max-height: 340px +} + +@media ( max-device-width :480px) and (orientation:landscape) { + .navbar-fixed-bottom .navbar-collapse, .navbar-fixed-top .navbar-collapse + { + max-height: 200px + } +} + +.container-fluid>.navbar-collapse, .container-fluid>.navbar-header, + .container>.navbar-collapse, .container>.navbar-header { + margin-right: -15px; + margin-left: -15px +} + +@media ( min-width :768px) { + .container-fluid>.navbar-collapse, .container-fluid>.navbar-header, + .container>.navbar-collapse, .container>.navbar-header { + margin-right: 0; + margin-left: 0 + } +} + +.navbar-static-top { + z-index: 1000; + border-width: 0 0 1px +} + +@media ( min-width :768px) { + .navbar-static-top { + border-radius: 0 + } +} + +.navbar-fixed-bottom, .navbar-fixed-top { + position: fixed; + right: 0; + left: 0; + z-index: 1030 +} + +@media ( min-width :768px) { + .navbar-fixed-bottom, .navbar-fixed-top { + border-radius: 0 + } +} + +.navbar-fixed-top { + top: 0; + border-width: 0 0 1px +} + +.navbar-fixed-bottom { + bottom: 0; + margin-bottom: 0; + border-width: 1px 0 0 +} + +.navbar-brand { + float: left; + height: 50px; + padding: 15px 15px; + font-size: 18px; + line-height: 20px +} + +.navbar-brand:focus, .navbar-brand:hover { + text-decoration: none +} + +.navbar-brand>img { + display: block +} + +@media ( min-width :768px) { + .navbar>.container .navbar-brand, .navbar>.container-fluid .navbar-brand + { + margin-left: -15px + } +} + +.navbar-toggle { + position: relative; + float: right; + padding: 9px 10px; + margin-top: 8px; + margin-right: 15px; + margin-bottom: 8px; + background-color: transparent; + background-image: none; + border: 1px solid transparent; + border-radius: 4px +} + +.navbar-toggle:focus { + outline: 0 +} + +.navbar-toggle .icon-bar { + display: block; + width: 22px; + height: 2px; + border-radius: 1px +} + +.navbar-toggle .icon-bar+.icon-bar { + margin-top: 4px +} + +@media ( min-width :768px) { + .navbar-toggle { + display: none + } +} + +.navbar-nav { + margin: 7.5px -15px +} + +.navbar-nav>li>a { + padding-top: 10px; + padding-bottom: 10px; + line-height: 20px +} + +@media ( max-width :767px) { + .navbar-nav .open .dropdown-menu { + position: static; + float: none; + width: auto; + margin-top: 0; + background-color: transparent; + border: 0; + -webkit-box-shadow: none; + box-shadow: none + } + .navbar-nav .open .dropdown-menu .dropdown-header, .navbar-nav .open .dropdown-menu>li>a + { + padding: 5px 15px 5px 25px + } + .navbar-nav .open .dropdown-menu>li>a { + line-height: 20px + } + .navbar-nav .open .dropdown-menu>li>a:focus, .navbar-nav .open .dropdown-menu>li>a:hover + { + background-image: none + } +} + +@media ( min-width :768px) { + .navbar-nav { + float: left; + margin: 0 + } + .navbar-nav>li { + float: left + } + .navbar-nav>li>a { + padding-top: 15px; + padding-bottom: 15px + } +} + +.navbar-form { + padding: 10px 15px; + margin-top: 8px; + margin-right: -15px; + margin-bottom: 8px; + margin-left: -15px; + border-top: 1px solid transparent; + border-bottom: 1px solid transparent; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 + rgba(255, 255, 255, .1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 + rgba(255, 255, 255, .1) +} + +@media ( min-width :768px) { + .navbar-form .form-group { + display: inline-block; + margin-bottom: 0; + vertical-align: middle + } + .navbar-form .form-control { + display: inline-block; + width: auto; + vertical-align: middle + } + .navbar-form .form-control-static { + display: inline-block + } + .navbar-form .input-group { + display: inline-table; + vertical-align: middle + } + .navbar-form .input-group .form-control, .navbar-form .input-group .input-group-addon, + .navbar-form .input-group .input-group-btn { + width: auto + } + .navbar-form .input-group>.form-control { + width: 100% + } + .navbar-form .control-label { + margin-bottom: 0; + vertical-align: middle + } + .navbar-form .checkbox, .navbar-form .radio { + display: inline-block; + margin-top: 0; + margin-bottom: 0; + vertical-align: middle + } + .navbar-form .checkbox label, .navbar-form .radio label { + padding-left: 0 + } + .navbar-form .checkbox input[type=checkbox], .navbar-form .radio input[type=radio] + { + position: relative; + margin-left: 0 + } + .navbar-form .has-feedback .form-control-feedback { + top: 0 + } +} + +@media ( max-width :767px) { + .navbar-form .form-group { + margin-bottom: 5px + } + .navbar-form .form-group:last-child { + margin-bottom: 0 + } +} + +@media ( min-width :768px) { + .navbar-form { + width: auto; + padding-top: 0; + padding-bottom: 0; + margin-right: 0; + margin-left: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none + } +} + +.navbar-nav>li>.dropdown-menu { + margin-top: 0; + border-top-left-radius: 0; + border-top-right-radius: 0 +} + +.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu { + margin-bottom: 0; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-right-radius: 0; + border-bottom-left-radius: 0 +} + +.navbar-btn { + margin-top: 8px; + margin-bottom: 8px +} + +.navbar-btn.btn-sm { + margin-top: 10px; + margin-bottom: 10px +} + +.navbar-btn.btn-xs { + margin-top: 14px; + margin-bottom: 14px +} + +.navbar-text { + margin-top: 15px; + margin-bottom: 15px +} + +@media ( min-width :768px) { + .navbar-text { + float: left; + margin-right: 15px; + margin-left: 15px + } +} + +@media ( min-width :768px) { + .navbar-left { + float: left !important + } + .navbar-right { + float: right !important; + margin-right: -15px + } + .navbar-right ~.navbar-right { + margin-right: 0 + } +} + +.navbar-default { + background-color: #f8f8f8; + border-color: #e7e7e7 +} + +.navbar-default .navbar-brand { + color: #777 +} + +.navbar-default .navbar-brand:focus, .navbar-default .navbar-brand:hover + { + color: #5e5e5e; + background-color: transparent +} + +.navbar-default .navbar-text { + color: #777 +} + +.navbar-default .navbar-nav>li>a { + color: #777 +} + +.navbar-default .navbar-nav>li>a:focus, .navbar-default .navbar-nav>li>a:hover + { + color: #333; + background-color: transparent +} + +.navbar-default .navbar-nav>.active>a, .navbar-default .navbar-nav>.active>a:focus, + .navbar-default .navbar-nav>.active>a:hover { + color: #555; + background-color: #e7e7e7 +} + +.navbar-default .navbar-nav>.disabled>a, .navbar-default .navbar-nav>.disabled>a:focus, + .navbar-default .navbar-nav>.disabled>a:hover { + color: #ccc; + background-color: transparent +} + +.navbar-default .navbar-toggle { + border-color: #ddd +} + +.navbar-default .navbar-toggle:focus, .navbar-default .navbar-toggle:hover + { + background-color: #ddd +} + +.navbar-default .navbar-toggle .icon-bar { + background-color: #888 +} + +.navbar-default .navbar-collapse, .navbar-default .navbar-form { + border-color: #e7e7e7 +} + +.navbar-default .navbar-nav>.open>a, .navbar-default .navbar-nav>.open>a:focus, + .navbar-default .navbar-nav>.open>a:hover { + color: #555; + background-color: #e7e7e7 +} + +@media ( max-width :767px) { + .navbar-default .navbar-nav .open .dropdown-menu>li>a { + color: #777 + } + .navbar-default .navbar-nav .open .dropdown-menu>li>a:focus, + .navbar-default .navbar-nav .open .dropdown-menu>li>a:hover { + color: #333; + background-color: transparent + } + .navbar-default .navbar-nav .open .dropdown-menu>.active>a, + .navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus, + .navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover { + color: #555; + background-color: #e7e7e7 + } + .navbar-default .navbar-nav .open .dropdown-menu>.disabled>a, + .navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus, + .navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover { + color: #ccc; + background-color: transparent + } +} + +.navbar-default .navbar-link { + color: #777 +} + +.navbar-default .navbar-link:hover { + color: #333 +} + +.navbar-default .btn-link { + color: #777 +} + +.navbar-default .btn-link:focus, .navbar-default .btn-link:hover { + color: #333 +} + +.navbar-default .btn-link[disabled]:focus, .navbar-default .btn-link[disabled]:hover, + fieldset[disabled] .navbar-default .btn-link:focus, fieldset[disabled] .navbar-default .btn-link:hover + { + color: #ccc +} + +.navbar-inverse { + background-color: #222; + border-color: #080808 +} + +.navbar-inverse .navbar-brand { + color: #9d9d9d +} + +.navbar-inverse .navbar-brand:focus, .navbar-inverse .navbar-brand:hover + { + color: #fff; + background-color: transparent +} + +.navbar-inverse .navbar-text { + color: #9d9d9d +} + +.navbar-inverse .navbar-nav>li>a { + color: #9d9d9d +} + +.navbar-inverse .navbar-nav>li>a:focus, .navbar-inverse .navbar-nav>li>a:hover + { + color: #fff; + background-color: transparent +} + +.navbar-inverse .navbar-nav>.active>a, .navbar-inverse .navbar-nav>.active>a:focus, + .navbar-inverse .navbar-nav>.active>a:hover { + color: #fff; + background-color: #080808 +} + +.navbar-inverse .navbar-nav>.disabled>a, .navbar-inverse .navbar-nav>.disabled>a:focus, + .navbar-inverse .navbar-nav>.disabled>a:hover { + color: #444; + background-color: transparent +} + +.navbar-inverse .navbar-toggle { + border-color: #333 +} + +.navbar-inverse .navbar-toggle:focus, .navbar-inverse .navbar-toggle:hover + { + background-color: #333 +} + +.navbar-inverse .navbar-toggle .icon-bar { + background-color: #fff +} + +.navbar-inverse .navbar-collapse, .navbar-inverse .navbar-form { + border-color: #101010 +} + +.navbar-inverse .navbar-nav>.open>a, .navbar-inverse .navbar-nav>.open>a:focus, + .navbar-inverse .navbar-nav>.open>a:hover { + color: #fff; + background-color: #080808 +} + +@media ( max-width :767px) { + .navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header { + border-color: #080808 + } + .navbar-inverse .navbar-nav .open .dropdown-menu .divider { + background-color: #080808 + } + .navbar-inverse .navbar-nav .open .dropdown-menu>li>a { + color: #9d9d9d + } + .navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus, + .navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover { + color: #fff; + background-color: transparent + } + .navbar-inverse .navbar-nav .open .dropdown-menu>.active>a, + .navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus, + .navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover { + color: #fff; + background-color: #080808 + } + .navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a, + .navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus, + .navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover { + color: #444; + background-color: transparent + } +} + +.navbar-inverse .navbar-link { + color: #9d9d9d +} + +.navbar-inverse .navbar-link:hover { + color: #fff +} + +.navbar-inverse .btn-link { + color: #9d9d9d +} + +.navbar-inverse .btn-link:focus, .navbar-inverse .btn-link:hover { + color: #fff +} + +.navbar-inverse .btn-link[disabled]:focus, .navbar-inverse .btn-link[disabled]:hover, + fieldset[disabled] .navbar-inverse .btn-link:focus, fieldset[disabled] .navbar-inverse .btn-link:hover + { + color: #444 +} + +.breadcrumb { + padding: 8px 15px; + margin-bottom: 20px; + list-style: none; + background-color: #f5f5f5; + border-radius: 4px +} + +.breadcrumb>li { + display: inline-block +} + +.breadcrumb>li+li:before { + padding: 0 5px; + color: #ccc; + content: "/\00a0" +} + +.breadcrumb>.active { + color: #777 +} + +.pagination { + display: inline-block; + padding-left: 0; + margin: 20px 0; + border-radius: 4px +} + +.pagination>li { + display: inline +} + +.pagination>li>a, .pagination>li>span { + position: relative; + float: left; + padding: 6px 12px; + margin-left: -1px; + line-height: 1.42857143; + color: #337ab7; + text-decoration: none; + background-color: #fff; + border: 1px solid #ddd +} + +.pagination>li:first-child>a, .pagination>li:first-child>span { + margin-left: 0; + border-top-left-radius: 4px; + border-bottom-left-radius: 4px +} + +.pagination>li:last-child>a, .pagination>li:last-child>span { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px +} + +.pagination>li>a:focus, .pagination>li>a:hover, .pagination>li>span:focus, + .pagination>li>span:hover { + z-index: 2; + color: #23527c; + background-color: #eee; + border-color: #ddd +} + +.pagination>.active>a, .pagination>.active>a:focus, .pagination>.active>a:hover, + .pagination>.active>span, .pagination>.active>span:focus, .pagination>.active>span:hover + { + z-index: 3; + color: #fff; + cursor: default; + background-color: #337ab7; + border-color: #337ab7 +} + +.pagination>.disabled>a, .pagination>.disabled>a:focus, .pagination>.disabled>a:hover, + .pagination>.disabled>span, .pagination>.disabled>span:focus, + .pagination>.disabled>span:hover { + color: #777; + cursor: not-allowed; + background-color: #fff; + border-color: #ddd +} + +.pagination-lg>li>a, .pagination-lg>li>span { + padding: 10px 16px; + font-size: 18px; + line-height: 1.3333333 +} + +.pagination-lg>li:first-child>a, .pagination-lg>li:first-child>span { + border-top-left-radius: 6px; + border-bottom-left-radius: 6px +} + +.pagination-lg>li:last-child>a, .pagination-lg>li:last-child>span { + border-top-right-radius: 6px; + border-bottom-right-radius: 6px +} + +.pagination-sm>li>a, .pagination-sm>li>span { + padding: 5px 10px; + font-size: 12px; + line-height: 1.5 +} + +.pagination-sm>li:first-child>a, .pagination-sm>li:first-child>span { + border-top-left-radius: 3px; + border-bottom-left-radius: 3px +} + +.pagination-sm>li:last-child>a, .pagination-sm>li:last-child>span { + border-top-right-radius: 3px; + border-bottom-right-radius: 3px +} + +.pager { + padding-left: 0; + margin: 20px 0; + text-align: center; + list-style: none +} + +.pager li { + display: inline +} + +.pager li>a, .pager li>span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 15px +} + +.pager li>a:focus, .pager li>a:hover { + text-decoration: none; + background-color: #eee +} + +.pager .next>a, .pager .next>span { + float: right +} + +.pager .previous>a, .pager .previous>span { + float: left +} + +.pager .disabled>a, .pager .disabled>a:focus, .pager .disabled>a:hover, + .pager .disabled>span { + color: #777; + cursor: not-allowed; + background-color: #fff +} + +.label { + display: inline; + padding: .2em .6em .3em; + font-size: 75%; + font-weight: 700; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: .25em +} + +a.label:focus, a.label:hover { + color: #fff; + text-decoration: none; + cursor: pointer +} + +.label:empty { + display: none +} + +.btn .label { + position: relative; + top: -1px +} + +.label-default { + background-color: #777 +} + +.label-default[href]:focus, .label-default[href]:hover { + background-color: #5e5e5e +} + +.label-primary { + background-color: #337ab7 +} + +.label-primary[href]:focus, .label-primary[href]:hover { + background-color: #286090 +} + +.label-success { + background-color: #5cb85c +} + +.label-success[href]:focus, .label-success[href]:hover { + background-color: #449d44 +} + +.label-info { + background-color: #5bc0de +} + +.label-info[href]:focus, .label-info[href]:hover { + background-color: #31b0d5 +} + +.label-warning { + background-color: #f0ad4e +} + +.label-warning[href]:focus, .label-warning[href]:hover { + background-color: #ec971f +} + +.label-danger { + background-color: #d9534f +} + +.label-danger[href]:focus, .label-danger[href]:hover { + background-color: #c9302c +} + +.badge { + display: inline-block; + min-width: 10px; + padding: 3px 7px; + font-size: 12px; + font-weight: 700; + line-height: 1; + color: #fff; + text-align: center; + white-space: nowrap; + vertical-align: middle; + background-color: #777; + border-radius: 10px +} + +.badge:empty { + display: none +} + +.btn .badge { + position: relative; + top: -1px +} + +.btn-group-xs>.btn .badge, .btn-xs .badge { + top: 0; + padding: 1px 5px +} + +a.badge:focus, a.badge:hover { + color: #fff; + text-decoration: none; + cursor: pointer +} + +.list-group-item.active>.badge, .nav-pills>.active>a>.badge { + color: #337ab7; + background-color: #fff +} + +.list-group-item>.badge { + float: right +} + +.list-group-item>.badge+.badge { + margin-right: 5px +} + +.nav-pills>li>a>.badge { + margin-left: 3px +} + +.jumbotron { + padding-top: 30px; + padding-bottom: 30px; + margin-bottom: 30px; + color: inherit; + background-color: #eee +} + +.jumbotron .h1, .jumbotron h1 { + color: inherit +} + +.jumbotron p { + margin-bottom: 15px; + font-size: 21px; + font-weight: 200 +} + +.jumbotron>hr { + border-top-color: #d5d5d5 +} + +.container .jumbotron, .container-fluid .jumbotron { + padding-right: 15px; + padding-left: 15px; + border-radius: 6px +} + +.jumbotron .container { + max-width: 100% +} + +@media screen and (min-width:768px) { + .jumbotron { + padding-top: 48px; + padding-bottom: 48px + } + .container .jumbotron, .container-fluid .jumbotron { + padding-right: 60px; + padding-left: 60px + } + .jumbotron .h1, .jumbotron h1 { + font-size: 63px + } +} + +.thumbnail { + display: block; + padding: 4px; + margin-bottom: 20px; + line-height: 1.42857143; + background-color: #fff; + border: 1px solid #ddd; + border-radius: 4px; + -webkit-transition: border .2s ease-in-out; + -o-transition: border .2s ease-in-out; + transition: border .2s ease-in-out +} + +.thumbnail a>img, .thumbnail>img { + margin-right: auto; + margin-left: auto +} + +a.thumbnail.active, a.thumbnail:focus, a.thumbnail:hover { + border-color: #337ab7 +} + +.thumbnail .caption { + padding: 9px; + color: #333 +} + +.alert { + padding: 15px; + margin-bottom: 20px; + border: 1px solid transparent; + border-radius: 4px +} + +.alert h4 { + margin-top: 0; + color: inherit +} + +.alert .alert-link { + font-weight: 700 +} + +.alert>p, .alert>ul { + margin-bottom: 0 +} + +.alert>p+p { + margin-top: 5px +} + +.alert-dismissable, .alert-dismissible { + padding-right: 35px +} + +.alert-dismissable .close, .alert-dismissible .close { + position: relative; + top: -2px; + right: -21px; + color: inherit +} + +.alert-success { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6 +} + +.alert-success hr { + border-top-color: #c9e2b3 +} + +.alert-success .alert-link { + color: #2b542c +} + +.alert-info { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1 +} + +.alert-info hr { + border-top-color: #a6e1ec +} + +.alert-info .alert-link { + color: #245269 +} + +.alert-warning { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc +} + +.alert-warning hr { + border-top-color: #f7e1b5 +} + +.alert-warning .alert-link { + color: #66512c +} + +.alert-danger { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1 +} + +.alert-danger hr { + border-top-color: #e4b9c0 +} + +.alert-danger .alert-link { + color: #843534 +} + +@ +-webkit-keyframes progress-bar-stripes { + from {background-position: 40px 0 +} + +to { + background-position: 0 0 +} + +} +@ +-o-keyframes progress-bar-stripes { + from {background-position: 40px 0 +} + +to { + background-position: 0 0 +} + +} +@ +keyframes progress-bar-stripes { + from {background-position: 40px 0 +} + +to { + background-position: 0 0 +} + +} +.progress { + height: 20px; + margin-bottom: 20px; + overflow: hidden; + background-color: #f5f5f5; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1) +} + +.progress-bar { + float: left; + width: 0; + height: 100%; + font-size: 12px; + line-height: 20px; + color: #fff; + text-align: center; + background-color: #337ab7; + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15); + -webkit-transition: width .6s ease; + -o-transition: width .6s ease; + transition: width .6s ease +} + +.progress-bar-striped, .progress-striped .progress-bar { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) + 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, + rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, + transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, + rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, + transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, + rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + background-size: 40px 40px +} + +.progress-bar.active, .progress.active .progress-bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite +} + +.progress-bar-success { + background-color: #5cb85c +} + +.progress-striped .progress-bar-success { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) + 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, + rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, + transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, + rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, + transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, + rgba(255, 255, 255, .15) 75%, transparent 75%, transparent) +} + +.progress-bar-info { + background-color: #5bc0de +} + +.progress-striped .progress-bar-info { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) + 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, + rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, + transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, + rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, + transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, + rgba(255, 255, 255, .15) 75%, transparent 75%, transparent) +} + +.progress-bar-warning { + background-color: #f0ad4e +} + +.progress-striped .progress-bar-warning { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) + 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, + rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, + transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, + rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, + transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, + rgba(255, 255, 255, .15) 75%, transparent 75%, transparent) +} + +.progress-bar-danger { + background-color: #d9534f +} + +.progress-striped .progress-bar-danger { + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, .15) + 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, + rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, + transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, + rgba(255, 255, 255, .15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, .15) 25%, + transparent 25%, transparent 50%, rgba(255, 255, 255, .15) 50%, + rgba(255, 255, 255, .15) 75%, transparent 75%, transparent) +} + +.media { + margin-top: 15px +} + +.media:first-child { + margin-top: 0 +} + +.media, .media-body { + overflow: hidden; + zoom: 1 +} + +.media-body { + width: 10000px +} + +.media-object { + display: block +} + +.media-object.img-thumbnail { + max-width: none +} + +.media-right, .media>.pull-right { + padding-left: 10px +} + +.media-left, .media>.pull-left { + padding-right: 10px +} + +.media-body, .media-left, .media-right { + display: table-cell; + vertical-align: top +} + +.media-middle { + vertical-align: middle +} + +.media-bottom { + vertical-align: bottom +} + +.media-heading { + margin-top: 0; + margin-bottom: 5px +} + +.media-list { + padding-left: 0; + list-style: none +} + +.list-group { + padding-left: 0; + margin-bottom: 20px +} + +.list-group-item { + position: relative; + display: block; + padding: 10px 15px; + margin-bottom: -1px; + background-color: #fff; + border: 1px solid #ddd +} + +.list-group-item:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px +} + +.list-group-item:last-child { + margin-bottom: 0; + border-bottom-right-radius: 4px; + border-bottom-left-radius: 4px +} + +a.list-group-item, button.list-group-item { + color: #555 +} + +a.list-group-item .list-group-item-heading, button.list-group-item .list-group-item-heading + { + color: #333 +} + +a.list-group-item:focus, a.list-group-item:hover, button.list-group-item:focus, + button.list-group-item:hover { + color: #555; + text-decoration: none; + background-color: #f5f5f5 +} + +button.list-group-item { + width: 100%; + text-align: left +} + +.list-group-item.disabled, .list-group-item.disabled:focus, + .list-group-item.disabled:hover { + color: #777; + cursor: not-allowed; + background-color: #eee +} + +.list-group-item.disabled .list-group-item-heading, .list-group-item.disabled:focus .list-group-item-heading, + .list-group-item.disabled:hover .list-group-item-heading { + color: inherit +} + +.list-group-item.disabled .list-group-item-text, .list-group-item.disabled:focus .list-group-item-text, + .list-group-item.disabled:hover .list-group-item-text { + color: #777 +} + +.list-group-item.active, .list-group-item.active:focus, .list-group-item.active:hover + { + z-index: 2; + color: #fff; + background-color: #337ab7; + border-color: #337ab7 +} + +.list-group-item.active .list-group-item-heading, .list-group-item.active .list-group-item-heading>.small, + .list-group-item.active .list-group-item-heading>small, + .list-group-item.active:focus .list-group-item-heading, + .list-group-item.active:focus .list-group-item-heading>.small, + .list-group-item.active:focus .list-group-item-heading>small, + .list-group-item.active:hover .list-group-item-heading, + .list-group-item.active:hover .list-group-item-heading>.small, + .list-group-item.active:hover .list-group-item-heading>small { + color: inherit +} + +.list-group-item.active .list-group-item-text, .list-group-item.active:focus .list-group-item-text, + .list-group-item.active:hover .list-group-item-text { + color: #c7ddef +} + +.list-group-item-success { + color: #3c763d; + background-color: #dff0d8 +} + +a.list-group-item-success, button.list-group-item-success { + color: #3c763d +} + +a.list-group-item-success .list-group-item-heading, button.list-group-item-success .list-group-item-heading + { + color: inherit +} + +a.list-group-item-success:focus, a.list-group-item-success:hover, button.list-group-item-success:focus, + button.list-group-item-success:hover { + color: #3c763d; + background-color: #d0e9c6 +} + +a.list-group-item-success.active, a.list-group-item-success.active:focus, + a.list-group-item-success.active:hover, button.list-group-item-success.active, + button.list-group-item-success.active:focus, button.list-group-item-success.active:hover + { + color: #fff; + background-color: #3c763d; + border-color: #3c763d +} + +.list-group-item-info { + color: #31708f; + background-color: #d9edf7 +} + +a.list-group-item-info, button.list-group-item-info { + color: #31708f +} + +a.list-group-item-info .list-group-item-heading, button.list-group-item-info .list-group-item-heading + { + color: inherit +} + +a.list-group-item-info:focus, a.list-group-item-info:hover, button.list-group-item-info:focus, + button.list-group-item-info:hover { + color: #31708f; + background-color: #c4e3f3 +} + +a.list-group-item-info.active, a.list-group-item-info.active:focus, a.list-group-item-info.active:hover, + button.list-group-item-info.active, button.list-group-item-info.active:focus, + button.list-group-item-info.active:hover { + color: #fff; + background-color: #31708f; + border-color: #31708f +} + +.list-group-item-warning { + color: #8a6d3b; + background-color: #fcf8e3 +} + +a.list-group-item-warning, button.list-group-item-warning { + color: #8a6d3b +} + +a.list-group-item-warning .list-group-item-heading, button.list-group-item-warning .list-group-item-heading + { + color: inherit +} + +a.list-group-item-warning:focus, a.list-group-item-warning:hover, button.list-group-item-warning:focus, + button.list-group-item-warning:hover { + color: #8a6d3b; + background-color: #faf2cc +} + +a.list-group-item-warning.active, a.list-group-item-warning.active:focus, + a.list-group-item-warning.active:hover, button.list-group-item-warning.active, + button.list-group-item-warning.active:focus, button.list-group-item-warning.active:hover + { + color: #fff; + background-color: #8a6d3b; + border-color: #8a6d3b +} + +.list-group-item-danger { + color: #a94442; + background-color: #f2dede +} + +a.list-group-item-danger, button.list-group-item-danger { + color: #a94442 +} + +a.list-group-item-danger .list-group-item-heading, button.list-group-item-danger .list-group-item-heading + { + color: inherit +} + +a.list-group-item-danger:focus, a.list-group-item-danger:hover, button.list-group-item-danger:focus, + button.list-group-item-danger:hover { + color: #a94442; + background-color: #ebcccc +} + +a.list-group-item-danger.active, a.list-group-item-danger.active:focus, + a.list-group-item-danger.active:hover, button.list-group-item-danger.active, + button.list-group-item-danger.active:focus, button.list-group-item-danger.active:hover + { + color: #fff; + background-color: #a94442; + border-color: #a94442 +} + +.list-group-item-heading { + margin-top: 0; + margin-bottom: 5px +} + +.list-group-item-text { + margin-bottom: 0; + line-height: 1.3 +} + +.panel { + margin-bottom: 20px; + background-color: #fff; + border: 1px solid transparent; + border-radius: 4px; + -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: 0 1px 1px rgba(0, 0, 0, .05) +} + +.panel-body { + padding: 15px +} + +.panel-heading { + padding: 10px 15px; + border-bottom: 1px solid transparent; + border-top-left-radius: 3px; + border-top-right-radius: 3px +} + +.panel-heading>.dropdown .dropdown-toggle { + color: inherit +} + +.panel-title { + margin-top: 0; + margin-bottom: 0; + font-size: 16px; + color: inherit +} + +.panel-title>.small, .panel-title>.small>a, .panel-title>a, .panel-title>small, + .panel-title>small>a { + color: inherit +} + +.panel-footer { + padding: 10px 15px; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px +} + +.panel>.list-group, .panel>.panel-collapse>.list-group { + margin-bottom: 0 +} + +.panel>.list-group .list-group-item, .panel>.panel-collapse>.list-group .list-group-item + { + border-width: 1px 0; + border-radius: 0 +} + +.panel>.list-group:first-child .list-group-item:first-child, .panel>.panel-collapse>.list-group:first-child .list-group-item:first-child + { + border-top: 0; + border-top-left-radius: 3px; + border-top-right-radius: 3px +} + +.panel>.list-group:last-child .list-group-item:last-child, .panel>.panel-collapse>.list-group:last-child .list-group-item:last-child + { + border-bottom: 0; + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px +} + +.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child + { + border-top-left-radius: 0; + border-top-right-radius: 0 +} + +.panel-heading+.list-group .list-group-item:first-child { + border-top-width: 0 +} + +.list-group+.panel-footer { + border-top-width: 0 +} + +.panel>.panel-collapse>.table, .panel>.table, .panel>.table-responsive>.table + { + margin-bottom: 0 +} + +.panel>.panel-collapse>.table caption, .panel>.table caption, .panel>.table-responsive>.table caption + { + padding-right: 15px; + padding-left: 15px +} + +.panel>.table-responsive:first-child>.table:first-child, .panel>.table:first-child + { + border-top-left-radius: 3px; + border-top-right-radius: 3px +} + +.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child, + .panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child, + .panel>.table:first-child>tbody:first-child>tr:first-child, .panel>.table:first-child>thead:first-child>tr:first-child + { + border-top-left-radius: 3px; + border-top-right-radius: 3px +} + +.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child, + .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child, + .panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child, + .panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child, + .panel>.table:first-child>tbody:first-child>tr:first-child td:first-child, + .panel>.table:first-child>tbody:first-child>tr:first-child th:first-child, + .panel>.table:first-child>thead:first-child>tr:first-child td:first-child, + .panel>.table:first-child>thead:first-child>tr:first-child th:first-child + { + border-top-left-radius: 3px +} + +.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child, + .panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child, + .panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child, + .panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child, + .panel>.table:first-child>tbody:first-child>tr:first-child td:last-child, + .panel>.table:first-child>tbody:first-child>tr:first-child th:last-child, + .panel>.table:first-child>thead:first-child>tr:first-child td:last-child, + .panel>.table:first-child>thead:first-child>tr:first-child th:last-child + { + border-top-right-radius: 3px +} + +.panel>.table-responsive:last-child>.table:last-child, .panel>.table:last-child + { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px +} + +.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child, + .panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child, + .panel>.table:last-child>tbody:last-child>tr:last-child, .panel>.table:last-child>tfoot:last-child>tr:last-child + { + border-bottom-right-radius: 3px; + border-bottom-left-radius: 3px +} + +.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child, + .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child, + .panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child, + .panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child, + .panel>.table:last-child>tbody:last-child>tr:last-child td:first-child, + .panel>.table:last-child>tbody:last-child>tr:last-child th:first-child, + .panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child, + .panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child + { + border-bottom-left-radius: 3px +} + +.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child, + .panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child, + .panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child, + .panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child, + .panel>.table:last-child>tbody:last-child>tr:last-child td:last-child, + .panel>.table:last-child>tbody:last-child>tr:last-child th:last-child, + .panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child, + .panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child { + border-bottom-right-radius: 3px +} + +.panel>.panel-body+.table, .panel>.panel-body+.table-responsive, .panel>.table+.panel-body, + .panel>.table-responsive+.panel-body { + border-top: 1px solid #ddd +} + +.panel>.table>tbody:first-child>tr:first-child td, .panel>.table>tbody:first-child>tr:first-child th + { + border-top: 0 +} + +.panel>.table-bordered, .panel>.table-responsive>.table-bordered { + border: 0 +} + +.panel>.table-bordered>tbody>tr>td:first-child, .panel>.table-bordered>tbody>tr>th:first-child, + .panel>.table-bordered>tfoot>tr>td:first-child, .panel>.table-bordered>tfoot>tr>th:first-child, + .panel>.table-bordered>thead>tr>td:first-child, .panel>.table-bordered>thead>tr>th:first-child, + .panel>.table-responsive>.table-bordered>tbody>tr>td:first-child, + .panel>.table-responsive>.table-bordered>tbody>tr>th:first-child, + .panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child, + .panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child, + .panel>.table-responsive>.table-bordered>thead>tr>td:first-child, + .panel>.table-responsive>.table-bordered>thead>tr>th:first-child { + border-left: 0 +} + +.panel>.table-bordered>tbody>tr>td:last-child, .panel>.table-bordered>tbody>tr>th:last-child, + .panel>.table-bordered>tfoot>tr>td:last-child, .panel>.table-bordered>tfoot>tr>th:last-child, + .panel>.table-bordered>thead>tr>td:last-child, .panel>.table-bordered>thead>tr>th:last-child, + .panel>.table-responsive>.table-bordered>tbody>tr>td:last-child, .panel>.table-responsive>.table-bordered>tbody>tr>th:last-child, + .panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child, .panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child, + .panel>.table-responsive>.table-bordered>thead>tr>td:last-child, .panel>.table-responsive>.table-bordered>thead>tr>th:last-child + { + border-right: 0 +} + +.panel>.table-bordered>tbody>tr:first-child>td, .panel>.table-bordered>tbody>tr:first-child>th, + .panel>.table-bordered>thead>tr:first-child>td, .panel>.table-bordered>thead>tr:first-child>th, + .panel>.table-responsive>.table-bordered>tbody>tr:first-child>td, + .panel>.table-responsive>.table-bordered>tbody>tr:first-child>th, + .panel>.table-responsive>.table-bordered>thead>tr:first-child>td, + .panel>.table-responsive>.table-bordered>thead>tr:first-child>th { + border-bottom: 0 +} + +.panel>.table-bordered>tbody>tr:last-child>td, .panel>.table-bordered>tbody>tr:last-child>th, + .panel>.table-bordered>tfoot>tr:last-child>td, .panel>.table-bordered>tfoot>tr:last-child>th, + .panel>.table-responsive>.table-bordered>tbody>tr:last-child>td, .panel>.table-responsive>.table-bordered>tbody>tr:last-child>th, + .panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td, .panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th + { + border-bottom: 0 +} + +.panel>.table-responsive { + margin-bottom: 0; + border: 0 +} + +.panel-group { + margin-bottom: 20px +} + +.panel-group .panel { + margin-bottom: 0; + border-radius: 4px +} + +.panel-group .panel+.panel { + margin-top: 5px +} + +.panel-group .panel-heading { + border-bottom: 0 +} + +.panel-group .panel-heading+.panel-collapse>.list-group, .panel-group .panel-heading+.panel-collapse>.panel-body + { + border-top: 1px solid #ddd +} + +.panel-group .panel-footer { + border-top: 0 +} + +.panel-group .panel-footer+.panel-collapse .panel-body { + border-bottom: 1px solid #ddd +} + +.panel-default { + border-color: #ddd +} + +.panel-default>.panel-heading { + color: #333; + background-color: #f5f5f5; + border-color: #ddd +} + +.panel-default>.panel-heading+.panel-collapse>.panel-body { + border-top-color: #ddd +} + +.panel-default>.panel-heading .badge { + color: #f5f5f5; + background-color: #333 +} + +.panel-default>.panel-footer+.panel-collapse>.panel-body { + border-bottom-color: #ddd +} + +.panel-primary { + border-color: #337ab7 +} + +.panel-primary>.panel-heading { + color: #fff; + background-color: #337ab7; + border-color: #337ab7 +} + +.panel-primary>.panel-heading+.panel-collapse>.panel-body { + border-top-color: #337ab7 +} + +.panel-primary>.panel-heading .badge { + color: #337ab7; + background-color: #fff +} + +.panel-primary>.panel-footer+.panel-collapse>.panel-body { + border-bottom-color: #337ab7 +} + +.panel-success { + border-color: #d6e9c6 +} + +.panel-success>.panel-heading { + color: #3c763d; + background-color: #dff0d8; + border-color: #d6e9c6 +} + +.panel-success>.panel-heading+.panel-collapse>.panel-body { + border-top-color: #d6e9c6 +} + +.panel-success>.panel-heading .badge { + color: #dff0d8; + background-color: #3c763d +} + +.panel-success>.panel-footer+.panel-collapse>.panel-body { + border-bottom-color: #d6e9c6 +} + +.panel-info { + border-color: #bce8f1 +} + +.panel-info>.panel-heading { + color: #31708f; + background-color: #d9edf7; + border-color: #bce8f1 +} + +.panel-info>.panel-heading+.panel-collapse>.panel-body { + border-top-color: #bce8f1 +} + +.panel-info>.panel-heading .badge { + color: #d9edf7; + background-color: #31708f +} + +.panel-info>.panel-footer+.panel-collapse>.panel-body { + border-bottom-color: #bce8f1 +} + +.panel-warning { + border-color: #faebcc +} + +.panel-warning>.panel-heading { + color: #8a6d3b; + background-color: #fcf8e3; + border-color: #faebcc +} + +.panel-warning>.panel-heading+.panel-collapse>.panel-body { + border-top-color: #faebcc +} + +.panel-warning>.panel-heading .badge { + color: #fcf8e3; + background-color: #8a6d3b +} + +.panel-warning>.panel-footer+.panel-collapse>.panel-body { + border-bottom-color: #faebcc +} + +.panel-danger { + border-color: #ebccd1 +} + +.panel-danger>.panel-heading { + color: #a94442; + background-color: #f2dede; + border-color: #ebccd1 +} + +.panel-danger>.panel-heading+.panel-collapse>.panel-body { + border-top-color: #ebccd1 +} + +.panel-danger>.panel-heading .badge { + color: #f2dede; + background-color: #a94442 +} + +.panel-danger>.panel-footer+.panel-collapse>.panel-body { + border-bottom-color: #ebccd1 +} + +.embed-responsive { + position: relative; + display: block; + height: 0; + padding: 0; + overflow: hidden +} + +.embed-responsive .embed-responsive-item, .embed-responsive embed, + .embed-responsive iframe, .embed-responsive object, .embed-responsive video + { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0 +} + +.embed-responsive-16by9 { + padding-bottom: 56.25% +} + +.embed-responsive-4by3 { + padding-bottom: 75% +} + +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05) +} + +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, .15) +} + +.well-lg { + padding: 24px; + border-radius: 6px +} + +.well-sm { + padding: 9px; + border-radius: 3px +} + +.close { + float: right; + font-size: 21px; + font-weight: 700; + line-height: 1; + color: #000; + text-shadow: 0 1px 0 #fff; + filter: alpha(opacity = 20); + opacity: .2 +} + +.close:focus, .close:hover { + color: #000; + text-decoration: none; + cursor: pointer; + filter: alpha(opacity = 50); + opacity: .5 +} + +button.close { + -webkit-appearance: none; + padding: 0; + cursor: pointer; + background: 0 0; + border: 0 +} + +.modal-open { + overflow: hidden +} + +.modal { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1050; + display: none; + overflow: hidden; + -webkit-overflow-scrolling: touch; + outline: 0 +} + +.modal.fade .modal-dialog { + -webkit-transition: -webkit-transform .3s ease-out; + -o-transition: -o-transform .3s ease-out; + transition: transform .3s ease-out; + -webkit-transform: translate(0, -25%); + -ms-transform: translate(0, -25%); + -o-transform: translate(0, -25%); + transform: translate(0, -25%) +} + +.modal.in .modal-dialog { + -webkit-transform: translate(0, 0); + -ms-transform: translate(0, 0); + -o-transform: translate(0, 0); + transform: translate(0, 0) +} + +.modal-open .modal { + overflow-x: hidden; + overflow-y: auto +} + +.modal-dialog { + position: relative; + width: auto; + margin: 10px +} + +.modal-content { + position: relative; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + outline: 0; + -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5); + box-shadow: 0 3px 9px rgba(0, 0, 0, .5) +} + +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000 +} + +.modal-backdrop.fade { + filter: alpha(opacity = 0); + opacity: 0 +} + +.modal-backdrop.in { + filter: alpha(opacity = 50); + opacity: .5 +} + +.modal-header { + padding: 15px; + border-bottom: 1px solid #e5e5e5 +} + +.modal-header .close { + margin-top: -2px +} + +.modal-title { + margin: 0; + line-height: 1.42857143 +} + +.modal-body { + position: relative; + padding: 15px +} + +.modal-footer { + padding: 15px; + text-align: right; + border-top: 1px solid #e5e5e5 +} + +.modal-footer .btn+.btn { + margin-bottom: 0; + margin-left: 5px +} + +.modal-footer .btn-group .btn+.btn { + margin-left: -1px +} + +.modal-footer .btn-block+.btn-block { + margin-left: 0 +} + +.modal-scrollbar-measure { + position: absolute; + top: -9999px; + width: 50px; + height: 50px; + overflow: scroll +} + +@media ( min-width :768px) { + .modal-dialog { + width: 600px; + margin: 30px auto + } + .modal-content { + -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5); + box-shadow: 0 5px 15px rgba(0, 0, 0, .5) + } + .modal-sm { + width: 300px + } +} + +@media ( min-width :992px) { + .modal-lg { + width: 900px + } +} + +.tooltip { + position: absolute; + z-index: 1070; + display: block; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 12px; + font-style: normal; + font-weight: 400; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + filter: alpha(opacity = 0); + opacity: 0; + line-break: auto +} + +.tooltip.in { + filter: alpha(opacity = 90); + opacity: .9 +} + +.tooltip.top { + padding: 5px 0; + margin-top: -3px +} + +.tooltip.right { + padding: 0 5px; + margin-left: 3px +} + +.tooltip.bottom { + padding: 5px 0; + margin-top: 3px +} + +.tooltip.left { + padding: 0 5px; + margin-left: -3px +} + +.tooltip-inner { + max-width: 200px; + padding: 3px 8px; + color: #fff; + text-align: center; + background-color: #000; + border-radius: 4px +} + +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid +} + +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000 +} + +.tooltip.top-left .tooltip-arrow { + right: 5px; + bottom: 0; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000 +} + +.tooltip.top-right .tooltip-arrow { + bottom: 0; + left: 5px; + margin-bottom: -5px; + border-width: 5px 5px 0; + border-top-color: #000 +} + +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000 +} + +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000 +} + +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000 +} + +.tooltip.bottom-left .tooltip-arrow { + top: 0; + right: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000 +} + +.tooltip.bottom-right .tooltip-arrow { + top: 0; + left: 5px; + margin-top: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000 +} + +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1060; + display: none; + max-width: 276px; + padding: 1px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 14px; + font-style: normal; + font-weight: 400; + line-height: 1.42857143; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + word-spacing: normal; + word-wrap: normal; + white-space: normal; + background-color: #fff; + -webkit-background-clip: padding-box; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, .2); + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + box-shadow: 0 5px 10px rgba(0, 0, 0, .2); + line-break: auto +} + +.popover.top { + margin-top: -10px +} + +.popover.right { + margin-left: 10px +} + +.popover.bottom { + margin-top: 10px +} + +.popover.left { + margin-left: -10px +} + +.popover-title { + padding: 8px 14px; + margin: 0; + font-size: 14px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + border-radius: 5px 5px 0 0 +} + +.popover-content { + padding: 9px 14px +} + +.popover>.arrow, .popover>.arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid +} + +.popover>.arrow { + border-width: 11px +} + +.popover>.arrow:after { + content: ""; + border-width: 10px +} + +.popover.top>.arrow { + bottom: -11px; + left: 50%; + margin-left: -11px; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, .25); + border-bottom-width: 0 +} + +.popover.top>.arrow:after { + bottom: 1px; + margin-left: -10px; + content: " "; + border-top-color: #fff; + border-bottom-width: 0 +} + +.popover.right>.arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, .25); + border-left-width: 0 +} + +.popover.right>.arrow:after { + bottom: -10px; + left: 1px; + content: " "; + border-right-color: #fff; + border-left-width: 0 +} + +.popover.bottom>.arrow { + top: -11px; + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, .25) +} + +.popover.bottom>.arrow:after { + top: 1px; + margin-left: -10px; + content: " "; + border-top-width: 0; + border-bottom-color: #fff +} + +.popover.left>.arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, .25) +} + +.popover.left>.arrow:after { + right: 1px; + bottom: -10px; + content: " "; + border-right-width: 0; + border-left-color: #fff +} + +.carousel { + position: relative +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden +} + +.carousel-inner>.item { + position: relative; + display: none; + -webkit-transition: .6s ease-in-out left; + -o-transition: .6s ease-in-out left; + transition: .6s ease-in-out left +} + +.carousel-inner>.item>a>img, .carousel-inner>.item>img { + line-height: 1 +} + +@media all and (transform-3d) , ( -webkit-transform-3d ) { + .carousel-inner>.item { + -webkit-transition: -webkit-transform .6s ease-in-out; + -o-transition: -o-transform .6s ease-in-out; + transition: transform .6s ease-in-out; + -webkit-backface-visibility: hidden; + backface-visibility: hidden; + -webkit-perspective: 1000px; + perspective: 1000px + } + .carousel-inner>.item.active.right, .carousel-inner>.item.next { + left: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0) + } + .carousel-inner>.item.active.left, .carousel-inner>.item.prev { + left: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0) + } + .carousel-inner>.item.active, .carousel-inner>.item.next.left, + .carousel-inner>.item.prev.right { + left: 0; + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0) + } +} + +.carousel-inner>.active, .carousel-inner>.next, .carousel-inner>.prev { + display: block +} + +.carousel-inner>.active { + left: 0 +} + +.carousel-inner>.next, .carousel-inner>.prev { + position: absolute; + top: 0; + width: 100% +} + +.carousel-inner>.next { + left: 100% +} + +.carousel-inner>.prev { + left: -100% +} + +.carousel-inner>.next.left, .carousel-inner>.prev.right { + left: 0 +} + +.carousel-inner>.active.left { + left: -100% +} + +.carousel-inner>.active.right { + left: 100% +} + +.carousel-control { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 15%; + font-size: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6); + background-color: rgba(0, 0, 0, 0); + filter: alpha(opacity = 50); + opacity: .5 +} + +.carousel-control.left { + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0, + rgba(0, 0, 0, .0001) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0, + rgba(0, 0, 0, .0001) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), + to(rgba(0, 0, 0, .0001))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0, + rgba(0, 0, 0, .0001) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', + endColorstr='#00000000', GradientType=1); + background-repeat: repeat-x +} + +.carousel-control.right { + right: 0; + left: auto; + background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0, + rgba(0, 0, 0, .5) 100%); + background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0, + rgba(0, 0, 0, .5) 100%); + background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), + to(rgba(0, 0, 0, .5))); + background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0, + rgba(0, 0, 0, .5) 100%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', + endColorstr='#80000000', GradientType=1); + background-repeat: repeat-x +} + +.carousel-control:focus, .carousel-control:hover { + color: #fff; + text-decoration: none; + filter: alpha(opacity = 90); + outline: 0; + opacity: .9 +} + +.carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next, .carousel-control .icon-prev { + position: absolute; + top: 50%; + z-index: 5; + display: inline-block; + margin-top: -10px +} + +.carousel-control .glyphicon-chevron-left, .carousel-control .icon-prev + { + left: 50%; + margin-left: -10px +} + +.carousel-control .glyphicon-chevron-right, .carousel-control .icon-next + { + right: 50%; + margin-right: -10px +} + +.carousel-control .icon-next, .carousel-control .icon-prev { + width: 20px; + height: 20px; + font-family: serif; + line-height: 1 +} + +.carousel-control .icon-prev:before { + content: '\2039' +} + +.carousel-control .icon-next:before { + content: '\203a' +} + +.carousel-indicators { + position: absolute; + bottom: 10px; + left: 50%; + z-index: 15; + width: 60%; + padding-left: 0; + margin-left: -30%; + text-align: center; + list-style: none +} + +.carousel-indicators li { + display: inline-block; + width: 10px; + height: 10px; + margin: 1px; + text-indent: -999px; + cursor: pointer; + background-color: #000\9; + background-color: rgba(0, 0, 0, 0); + border: 1px solid #fff; + border-radius: 10px +} + +.carousel-indicators .active { + width: 12px; + height: 12px; + margin: 0; + background-color: #fff +} + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 20px; + left: 15%; + z-index: 10; + padding-top: 20px; + padding-bottom: 20px; + color: #fff; + text-align: center; + text-shadow: 0 1px 2px rgba(0, 0, 0, .6) +} + +.carousel-caption .btn { + text-shadow: none +} + +@media screen and (min-width:768px) { + .carousel-control .glyphicon-chevron-left, .carousel-control .glyphicon-chevron-right, + .carousel-control .icon-next, .carousel-control .icon-prev { + width: 30px; + height: 30px; + margin-top: -10px; + font-size: 30px + } + .carousel-control .glyphicon-chevron-left, .carousel-control .icon-prev + { + margin-left: -10px + } + .carousel-control .glyphicon-chevron-right, .carousel-control .icon-next + { + margin-right: -10px + } + .carousel-caption { + right: 20%; + left: 20%; + padding-bottom: 30px + } + .carousel-indicators { + bottom: 20px + } +} + +.btn-group-vertical>.btn-group:after, .btn-group-vertical>.btn-group:before, + .btn-toolbar:after, .btn-toolbar:before, .clearfix:after, .clearfix:before, + .container-fluid:after, .container-fluid:before, .container:after, + .container:before, .dl-horizontal dd:after, .dl-horizontal dd:before, + .form-horizontal .form-group:after, .form-horizontal .form-group:before, + .modal-footer:after, .modal-footer:before, .modal-header:after, + .modal-header:before, .nav:after, .nav:before, .navbar-collapse:after, + .navbar-collapse:before, .navbar-header:after, .navbar-header:before, + .navbar:after, .navbar:before, .pager:after, .pager:before, .panel-body:after, + .panel-body:before, .row:after, .row:before { + display: table; + content: " " +} + +.btn-group-vertical>.btn-group:after, .btn-toolbar:after, .clearfix:after, + .container-fluid:after, .container:after, .dl-horizontal dd:after, + .form-horizontal .form-group:after, .modal-footer:after, .modal-header:after, + .nav:after, .navbar-collapse:after, .navbar-header:after, .navbar:after, + .pager:after, .panel-body:after, .row:after { + clear: both +} + +.center-block { + display: block; + margin-right: auto; + margin-left: auto +} + +.pull-right { + float: right !important +} + +.pull-left { + float: left !important +} + +.hide { + display: none !important +} + +.show { + display: block !important +} + +.invisible { + visibility: hidden +} + +.text-hide { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0 +} + +.hidden { + display: none !important +} + +.affix { + position: fixed +} + +@ +-ms-viewport { + width: device-width +} + +.visible-lg, .visible-md, .visible-sm, .visible-xs { + display: none !important +} + +.visible-lg-block, .visible-lg-inline, .visible-lg-inline-block, + .visible-md-block, .visible-md-inline, .visible-md-inline-block, + .visible-sm-block, .visible-sm-inline, .visible-sm-inline-block, + .visible-xs-block, .visible-xs-inline, .visible-xs-inline-block { + display: none !important +} + +@media ( max-width :767px) { + .visible-xs { + display: block !important + } + table.visible-xs { + display: table !important + } + tr.visible-xs { + display: table-row !important + } + td.visible-xs, th.visible-xs { + display: table-cell !important + } +} + +@media ( max-width :767px) { + .visible-xs-block { + display: block !important + } +} + +@media ( max-width :767px) { + .visible-xs-inline { + display: inline !important + } +} + +@media ( max-width :767px) { + .visible-xs-inline-block { + display: inline-block !important + } +} + +@media ( min-width :768px) and (max-width:991px) { + .visible-sm { + display: block !important + } + table.visible-sm { + display: table !important + } + tr.visible-sm { + display: table-row !important + } + td.visible-sm, th.visible-sm { + display: table-cell !important + } +} + +@media ( min-width :768px) and (max-width:991px) { + .visible-sm-block { + display: block !important + } +} + +@media ( min-width :768px) and (max-width:991px) { + .visible-sm-inline { + display: inline !important + } +} + +@media ( min-width :768px) and (max-width:991px) { + .visible-sm-inline-block { + display: inline-block !important + } +} + +@media ( min-width :992px) and (max-width:1199px) { + .visible-md { + display: block !important + } + table.visible-md { + display: table !important + } + tr.visible-md { + display: table-row !important + } + td.visible-md, th.visible-md { + display: table-cell !important + } +} + +@media ( min-width :992px) and (max-width:1199px) { + .visible-md-block { + display: block !important + } +} + +@media ( min-width :992px) and (max-width:1199px) { + .visible-md-inline { + display: inline !important + } +} + +@media ( min-width :992px) and (max-width:1199px) { + .visible-md-inline-block { + display: inline-block !important + } +} + +@media ( min-width :1200px) { + .visible-lg { + display: block !important + } + table.visible-lg { + display: table !important + } + tr.visible-lg { + display: table-row !important + } + td.visible-lg, th.visible-lg { + display: table-cell !important + } +} + +@media ( min-width :1200px) { + .visible-lg-block { + display: block !important + } +} + +@media ( min-width :1200px) { + .visible-lg-inline { + display: inline !important + } +} + +@media ( min-width :1200px) { + .visible-lg-inline-block { + display: inline-block !important + } +} + +@media ( max-width :767px) { + .hidden-xs { + display: none !important + } +} + +@media ( min-width :768px) and (max-width:991px) { + .hidden-sm { + display: none !important + } +} + +@media ( min-width :992px) and (max-width:1199px) { + .hidden-md { + display: none !important + } +} + +@media ( min-width :1200px) { + .hidden-lg { + display: none !important + } +} + +.visible-print { + display: none !important +} + +@media print { + .visible-print { + display: block !important + } + table.visible-print { + display: table !important + } + tr.visible-print { + display: table-row !important + } + td.visible-print, th.visible-print { + display: table-cell !important + } +} + +.visible-print-block { + display: none !important +} + +@media print { + .visible-print-block { + display: block !important + } +} + +.visible-print-inline { + display: none !important +} + +@media print { + .visible-print-inline { + display: inline !important + } +} + +.visible-print-inline-block { + display: none !important +} + +@media print { + .visible-print-inline-block { + display: inline-block !important + } +} + +@media print { + .hidden-print { + display: none !important + } +} +/*# sourceMappingURL=bootstrap.min.css.map */ diff --git a/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/css/bootstrap.min.css.map b/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/css/bootstrap.min.css.map new file mode 100644 index 0000000..0f25943 --- /dev/null +++ b/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/css/bootstrap.min.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["less/normalize.less","less/print.less","bootstrap.css","dist/css/bootstrap.css","less/glyphicons.less","less/scaffolding.less","less/mixins/vendor-prefixes.less","less/mixins/tab-focus.less","less/mixins/image.less","less/type.less","less/mixins/text-emphasis.less","less/mixins/background-variant.less","less/mixins/text-overflow.less","less/code.less","less/grid.less","less/mixins/grid.less","less/mixins/grid-framework.less","less/tables.less","less/mixins/table-row.less","less/forms.less","less/mixins/forms.less","less/buttons.less","less/mixins/buttons.less","less/mixins/opacity.less","less/component-animations.less","less/dropdowns.less","less/mixins/nav-divider.less","less/mixins/reset-filter.less","less/button-groups.less","less/mixins/border-radius.less","less/input-groups.less","less/navs.less","less/navbar.less","less/mixins/nav-vertical-align.less","less/utilities.less","less/breadcrumbs.less","less/pagination.less","less/mixins/pagination.less","less/pager.less","less/labels.less","less/mixins/labels.less","less/badges.less","less/jumbotron.less","less/thumbnails.less","less/alerts.less","less/mixins/alerts.less","less/progress-bars.less","less/mixins/gradients.less","less/mixins/progress-bar.less","less/media.less","less/list-group.less","less/mixins/list-group.less","less/panels.less","less/mixins/panels.less","less/responsive-embed.less","less/wells.less","less/close.less","less/modals.less","less/tooltip.less","less/mixins/reset-text.less","less/popovers.less","less/carousel.less","less/mixins/clearfix.less","less/mixins/center-block.less","less/mixins/hide-text.less","less/responsive-utilities.less","less/mixins/responsive-visibility.less"],"names":[],"mappings":";;;;4EAQA,KACE,YAAA,WACA,yBAAA,KACA,qBAAA,KAOF,KACE,OAAA,EAaF,QAAA,MAAA,QAAA,WAAA,OAAA,OAAA,OAAA,OAAA,KAAA,KAAA,IAAA,QAAA,QAaE,QAAA,MAQF,MAAA,OAAA,SAAA,MAIE,QAAA,aACA,eAAA,SAQF,sBACE,QAAA,KACA,OAAA,EAQF,SAAA,SAEE,QAAA,KAUF,EACE,iBAAA,YAQF,SAAA,QAEE,QAAA,EAUF,YACE,cAAA,IAAA,OAOF,EAAA,OAEE,YAAA,IAOF,IACE,WAAA,OAQF,GACE,OAAA,MAAA,EACA,UAAA,IAOF,KACE,MAAA,KACA,WAAA,KAOF,MACE,UAAA,IAOF,IAAA,IAEE,SAAA,SACA,UAAA,IACA,YAAA,EACA,eAAA,SAGF,IACE,IAAA,MAGF,IACE,OAAA,OAUF,IACE,OAAA,EAOF,eACE,SAAA,OAUF,OACE,OAAA,IAAA,KAOF,GACE,OAAA,EAAA,mBAAA,YAAA,gBAAA,YACA,WAAA,YAOF,IACE,SAAA,KAOF,KAAA,IAAA,IAAA,KAIE,YAAA,UAAA,UACA,UAAA,IAkBF,OAAA,MAAA,SAAA,OAAA,SAKE,OAAA,EACA,KAAA,QACA,MAAA,QAOF,OACE,SAAA,QAUF,OAAA,OAEE,eAAA,KAWF,OAAA,wBAAA,kBAAA,mBAIE,mBAAA,OACA,OAAA,QAOF,iBAAA,qBAEE,OAAA,QAOF,yBAAA,wBAEE,QAAA,EACA,OAAA,EAQF,MACE,YAAA,OAWF,qBAAA,kBAEE,mBAAA,WAAA,gBAAA,WAAA,WAAA,WACA,QAAA,EASF,8CAAA,8CAEE,OAAA,KAQF,mBACE,mBAAA,YACA,gBAAA,YAAA,WAAA,YAAA,mBAAA,UASF,iDAAA,8CAEE,mBAAA,KAOF,SACE,QAAA,MAAA,OAAA,MACA,OAAA,EAAA,IACA,OAAA,IAAA,MAAA,OAQF,OACE,QAAA,EACA,OAAA,EAOF,SACE,SAAA,KAQF,SACE,YAAA,IAUF,MACE,eAAA,EACA,gBAAA,SAGF,GAAA,GAEE,QAAA,uFCjUF,aA7FI,EAAA,OAAA,QAGI,MAAA,eACA,YAAA,eACA,WAAA,cAAA,mBAAA,eACA,WAAA,eAGJ,EAAA,UAEI,gBAAA,UAGJ,cACI,QAAA,KAAA,WAAA,IAGJ,kBACI,QAAA,KAAA,YAAA,IAKJ,6BAAA,mBAEI,QAAA,GAGJ,WAAA,IAEI,OAAA,IAAA,MAAA,KC4KL,kBAAA,MDvKK,MC0KL,QAAA,mBDrKK,IE8KN,GDLC,kBAAA,MDrKK,ICwKL,UAAA,eCUD,GF5KM,GE2KN,EF1KM,QAAA,ECuKL,OAAA,ECSD,GF3KM,GCsKL,iBAAA,MD/JK,QCkKL,QAAA,KCSD,YFtKU,oBCiKT,iBAAA,eD7JK,OCgKL,OAAA,IAAA,MAAA,KD5JK,OC+JL,gBAAA,mBCSD,UFpKU,UC+JT,iBAAA,eDzJS,mBEkKV,mBDLC,OAAA,IAAA,MAAA,gBEjPD,WACA,YAAA,uBFsPD,IAAA,+CE7OC,IAAK,sDAAuD,4BAA6B,iDAAkD,gBAAiB,gDAAiD,eAAgB,+CAAgD,mBAAoB,2EAA4E,cAE7W,WACA,SAAA,SACA,IAAA,IACA,QAAA,aACA,YAAA,uBACA,WAAA,OACA,YAAA,IACA,YAAA,EAIkC,uBAAA,YAAW,wBAAA,UACX,2BAAW,QAAA,QAEX,uBDuPlC,QAAS,QCtPyB,sBFiPnC,uBEjP8C,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,2BAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,6BAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,2BAAW,QAAA,QACX,qBAAW,QAAA,QACX,0BAAW,QAAA,QACX,qBAAW,QAAA,QACX,yBAAW,QAAA,QACX,0BAAW,QAAA,QACX,2BAAW,QAAA,QACX,sBAAW,QAAA,QACX,yBAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,+BAAW,QAAA,QACX,2BAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,8BAAW,QAAA,QACX,yBAAW,QAAA,QACX,0BAAW,QAAA,QACX,2BAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,6BAAW,QAAA,QACX,6BAAW,QAAA,QACX,8BAAW,QAAA,QACX,4BAAW,QAAA,QACX,yBAAW,QAAA,QACX,0BAAW,QAAA,QACX,sBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,2BAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,yBAAW,QAAA,QACX,8BAAW,QAAA,QACX,6BAAW,QAAA,QACX,6BAAW,QAAA,QACX,+BAAW,QAAA,QACX,8BAAW,QAAA,QACX,gCAAW,QAAA,QACX,uBAAW,QAAA,QACX,8BAAW,QAAA,QACX,+BAAW,QAAA,QACX,iCAAW,QAAA,QACX,0BAAW,QAAA,QACX,6BAAW,QAAA,QACX,yBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,gCAAW,QAAA,QACX,gCAAW,QAAA,QACX,2BAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,0BAAW,QAAA,QACX,+BAAW,QAAA,QACX,+BAAW,QAAA,QACX,wBAAW,QAAA,QACX,+BAAW,QAAA,QACX,gCAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,8BAAW,QAAA,QACX,0BAAW,QAAA,QACX,gCAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,gCAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,6BAAW,QAAA,QACX,8BAAW,QAAA,QACX,2BAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QACX,8BAAW,QAAA,QACX,+BAAW,QAAA,QACX,mCAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,2BAAW,QAAA,QACX,4BAAW,QAAA,QACX,+BAAW,QAAA,QACX,wBAAW,QAAA,QACX,2BAAW,QAAA,QACX,yBAAW,QAAA,QACX,0BAAW,QAAA,QACX,yBAAW,QAAA,QACX,6BAAW,QAAA,QACX,+BAAW,QAAA,QACX,0BAAW,QAAA,QACX,gCAAW,QAAA,QACX,+BAAW,QAAA,QACX,8BAAW,QAAA,QACX,kCAAW,QAAA,QACX,oCAAW,QAAA,QACX,sBAAW,QAAA,QACX,2BAAW,QAAA,QACX,uBAAW,QAAA,QACX,8BAAW,QAAA,QACX,4BAAW,QAAA,QACX,8BAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QACX,0BAAW,QAAA,QACX,4BAAW,QAAA,QACX,qCAAW,QAAA,QACX,oCAAW,QAAA,QACX,kCAAW,QAAA,QACX,oCAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,8BAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,0BAAW,QAAA,QACX,sBAAW,QAAA,QACX,sBAAW,QAAA,QACX,uBAAW,QAAA,QACX,mCAAW,QAAA,QACX,uCAAW,QAAA,QACX,gCAAW,QAAA,QACX,oCAAW,QAAA,QACX,qCAAW,QAAA,QACX,yCAAW,QAAA,QACX,4BAAW,QAAA,QACX,yBAAW,QAAA,QACX,gCAAW,QAAA,QACX,8BAAW,QAAA,QACX,yBAAW,QAAA,QACX,wBAAW,QAAA,QACX,0BAAW,QAAA,QACX,6BAAW,QAAA,QACX,yBAAW,QAAA,QACX,uBAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,yBAAW,QAAA,QACX,yBAAW,QAAA,QACX,uBAAW,QAAA,QACX,8BAAW,QAAA,QACX,+BAAW,QAAA,QACX,gCAAW,QAAA,QACX,8BAAW,QAAA,QACX,8BAAW,QAAA,QACX,8BAAW,QAAA,QACX,2BAAW,QAAA,QACX,0BAAW,QAAA,QACX,yBAAW,QAAA,QACX,6BAAW,QAAA,QACX,2BAAW,QAAA,QACX,4BAAW,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,2BAAW,QAAA,QACX,2BAAW,QAAA,QACX,4BAAW,QAAA,QACX,+BAAW,QAAA,QACX,8BAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,iCAAW,QAAA,QACX,oCAAW,QAAA,QACX,iCAAW,QAAA,QACX,+BAAW,QAAA,QACX,+BAAW,QAAA,QACX,iCAAW,QAAA,QACX,qBAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,2BAAW,QAAA,QACX,uBAAW,QAAA,QASX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,4BAAW,QAAA,QACX,uBAAW,QAAA,QACX,wBAAW,QAAA,QACX,uBAAW,QAAA,QACX,yBAAW,QAAA,QACX,yBAAW,QAAA,QACX,+BAAW,QAAA,QACX,uBAAW,QAAA,QACX,6BAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,wBAAW,QAAA,QACX,4BAAW,QAAA,QACX,uBAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,2BAAW,QAAA,QACX,0BAAW,QAAA,QACX,sBAAW,QAAA,QACX,sBAAW,QAAA,QACX,sBAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,4BAAW,QAAA,QACX,mCAAW,QAAA,QACX,4BAAW,QAAA,QACX,oCAAW,QAAA,QACX,kCAAW,QAAA,QACX,iCAAW,QAAA,QACX,+BAAW,QAAA,QACX,sBAAW,QAAA,QACX,wBAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,kCAAW,QAAA,QACX,mCAAW,QAAA,QACX,sCAAW,QAAA,QACX,0CAAW,QAAA,QACX,oCAAW,QAAA,QACX,wCAAW,QAAA,QACX,qCAAW,QAAA,QACX,iCAAW,QAAA,QACX,gCAAW,QAAA,QACX,kCAAW,QAAA,QACX,+BAAW,QAAA,QACX,0BAAW,QAAA,QACX,8BAAW,QAAA,QACX,4BAAW,QAAA,QACX,4BAAW,QAAA,QACX,6BAAW,QAAA,QACX,4BAAW,QAAA,QCtS/C,0BCgEE,QAAA,QHi+BF,EDNC,mBAAA,WGxhCI,gBAAiB,WFiiCZ,WAAY,WGl+BZ,OADL,QJg+BJ,mBAAA,WGthCI,gBAAiB,WACpB,WAAA,WHyhCD,KGrhCC,UAAW,KAEX,4BAAA,cAEA,KACA,YAAA,iBAAA,UAAA,MAAA,WHuhCD,UAAA,KGnhCC,YAAa,WF4hCb,MAAO,KACP,iBAAkB,KExhClB,OADA,MAEA,OHqhCD,SG/gCC,YAAa,QACb,UAAA,QACA,YAAA,QAEA,EFwhCA,MAAO,QEthCL,gBAAA,KAIF,QH8gCD,QKjkCC,MAAA,QACA,gBAAA,UF6DF,QACE,QAAA,IAAA,KAAA,yBHygCD,eAAA,KGlgCC,OHqgCD,OAAA,ECSD,IACE,eAAgB,ODDjB,4BM/kCC,0BLklCF,gBKnlCE,iBADA,eH4EA,QAAS,MACT,UAAA,KHugCD,OAAA,KGhgCC,aACA,cAAA,IAEA,eACA,QAAA,aC6FA,UAAA,KACK,OAAA,KACG,QAAA,IEvLR,YAAA,WACA,iBAAA,KACA,OAAA,IAAA,MAAA,KN+lCD,cAAA,IGjgCC,mBAAoB,IAAI,IAAI,YAC5B,cAAA,IAAA,IAAA,YHmgCD,WAAA,IAAA,IAAA,YG5/BC,YACA,cAAA,IAEA,GH+/BD,WAAA,KGv/BC,cAAe,KACf,OAAA,EACA,WAAA,IAAA,MAAA,KAEA,SACA,SAAA,SACA,MAAA,IACA,OAAA,IACA,QAAA,EHy/BD,OAAA,KGj/BC,SAAA,OF0/BA,KAAM,cEx/BJ,OAAA,EAEA,0BACA,yBACA,SAAA,OACA,MAAA,KHm/BH,OAAA,KGx+BC,OAAQ,EACR,SAAA,QH0+BD,KAAA,KCSD,cACE,OAAQ,QAQV,IACA,IMlpCE,IACA,IACA,IACA,INwoCF,GACA,GACA,GACA,GACA,GACA,GDAC,YAAA,QOlpCC,YAAa,IN2pCb,YAAa,IACb,MAAO,QAoBT,WAZA,UAaA,WAZA,UM5pCI,WN6pCJ,UM5pCI,WN6pCJ,UM5pCI,WN6pCJ,UDMC,WCLD,UACA,UAZA,SAaA,UAZA,SAaA,UAZA,SAaA,UAZA,SAaA,UAZA,SAaA,UAZA,SMppCE,YAAa,INwqCb,YAAa,EACb,MAAO,KAGT,IMxqCE,IAJF,IN2qCA,GAEA,GDLC,GCSC,WAAY,KACZ,cAAe,KASjB,WANA,UDCC,WCCD,UM5qCA,WN8qCA,UACA,UANA,SM5qCI,UN8qCJ,SM3qCA,UN6qCA,SAQE,UAAW,IAGb,IMprCE,IAJF,INurCA,GAEA,GDLC,GCSC,WAAY,KACZ,cAAe,KASjB,WANA,UDCC,WCCD,UMvrCA,WNyrCA,UACA,UANA,SMxrCI,UN0rCJ,SMtrCA,UNwrCA,SMxrCU,UAAA,IACV,IAAA,GAAU,UAAA,KACV,IAAA,GAAU,UAAA,KACV,IAAA,GAAU,UAAA,KACV,IAAA,GAAU,UAAA,KACV,IAAA,GAAU,UAAA,KAOR,IADF,GPssCC,UAAA,KCSD,EMzsCE,OAAA,EAAA,EAAA,KAEA,MPosCD,cAAA,KO/rCC,UAAW,KAwOX,YAAa,IA1OX,YAAA,IPssCH,yBO7rCC,MNssCE,UAAW,MMjsCf,OAAA,MAEE,UAAA,IAKF,MP0rCC,KO1rCsB,QAAA,KP6rCtB,iBAAA,QO5rCsB,WP+rCtB,WAAA,KO9rCsB,YPisCtB,WAAA,MOhsCsB,aPmsCtB,WAAA,OOlsCsB,cPqsCtB,WAAA,QOlsCsB,aPqsCtB,YAAA,OOpsCsB,gBPusCtB,eAAA,UOtsCsB,gBPysCtB,eAAA,UOrsCC,iBPwsCD,eAAA,WQ3yCC,YR8yCD,MAAA,KCSD,cOpzCI,MAAA,QAHF,qBDwGF,qBP6sCC,MAAA,QCSD,cO3zCI,MAAA,QAHF,qBD2GF,qBPitCC,MAAA,QCSD,WOl0CI,MAAA,QAHF,kBD8GF,kBPqtCC,MAAA,QCSD,cOz0CI,MAAA,QAHF,qBDiHF,qBPytCC,MAAA,QCSD,aOh1CI,MAAA,QDwHF,oBAHF,oBExHE,MAAA,QACA,YR01CA,MAAO,KQx1CL,iBAAA,QAHF,mBF8HF,mBP2tCC,iBAAA,QCSD,YQ/1CI,iBAAA,QAHF,mBFiIF,mBP+tCC,iBAAA,QCSD,SQt2CI,iBAAA,QAHF,gBFoIF,gBPmuCC,iBAAA,QCSD,YQ72CI,iBAAA,QAHF,mBFuIF,mBPuuCC,iBAAA,QCSD,WQp3CI,iBAAA,QF6IF,kBADF,kBAEE,iBAAA,QPsuCD,aO7tCC,eAAgB,INsuChB,OAAQ,KAAK,EAAE,KMpuCf,cAAA,IAAA,MAAA,KAFF,GPkuCC,GCSC,WAAY,EACZ,cAAe,KM9tCf,MP0tCD,MO3tCD,MAPI,MASF,cAAA,EAIF,eALE,aAAA,EACA,WAAA,KPkuCD,aO9tCC,aAAc,EAKZ,YAAA,KACA,WAAA,KP6tCH,gBOvtCC,QAAS,aACT,cAAA,IACA,aAAA,IAEF,GNguCE,WAAY,EM9tCZ,cAAA,KAGA,GADF,GP0tCC,YAAA,WOttCC,GPytCD,YAAA,IOnnCD,GAvFM,YAAA,EAEA,yBACA,kBGtNJ,MAAA,KACA,MAAA,MACA,SAAA,OVq6CC,MAAA,KO7nCC,WAAY,MAhFV,cAAA,SPgtCH,YAAA,OOtsCD,kBNgtCE,YAAa,OM1sCjB,0BPssCC,YOrsCC,OAAA,KA9IqB,cAAA,IAAA,OAAA,KAmJvB,YACE,UAAA,IACA,eAAA,UAEA,WPssCD,QAAA,KAAA,KOjsCG,OAAA,EAAA,EAAA,KN0sCF,UAAW,OACX,YAAa,IAAI,MAAM,KMptCzB,yBP+sCC,wBO/sCD,yBNytCE,cAAe,EMnsCb,kBAFA,kBACA,iBPksCH,QAAA,MO/rCG,UAAA,INwsCF,YAAa,WACb,MAAO,KMhsCT,yBP2rCC,yBO3rCD,wBAEE,QAAA,cAEA,oBACA,sBACA,cAAA,KP6rCD,aAAA,EOvrCG,WAAA,MNgsCF,aAAc,IAAI,MAAM,KACxB,YAAa,EMhsCX,kCNksCJ,kCMnsCe,iCACX,oCNmsCJ,oCDLC,mCCUC,QAAS,GMjsCX,iCNmsCA,iCMzsCM,gCAOJ,mCNmsCF,mCDLC,kCO7rCC,QAAA,cPksCD,QWv+CC,cAAe,KVg/Cf,WAAY,OACZ,YAAa,WU7+Cb,KXy+CD,IWr+CD,IACE,KACA,YAAA,MAAA,OAAA,SAAA,cAAA,UAEA,KACA,QAAA,IAAA,IXu+CD,UAAA,IWn+CC,MAAO,QACP,iBAAA,QACA,cAAA,IAEA,IACA,QAAA,IAAA,IACA,UAAA,IV4+CA,MU5+CA,KXq+CD,iBAAA,KW3+CC,cAAe,IASb,mBAAA,MAAA,EAAA,KAAA,EAAA,gBACA,WAAA,MAAA,EAAA,KAAA,EAAA,gBAEA,QV6+CF,QU7+CE,EXq+CH,UAAA,KWh+CC,YAAa,IACb,mBAAA,KACA,WAAA,KAEA,IACA,QAAA,MACA,QAAA,MACA,OAAA,EAAA,EAAA,KACA,UAAA,KACA,YAAA,WACA,MAAA,KACA,WAAA,UXk+CD,UAAA,WW7+CC,iBAAkB,QAehB,OAAA,IAAA,MAAA,KACA,cAAA,IAEA,SACA,QAAA,EACA,UAAA,QXi+CH,MAAA,QW59CC,YAAa,SACb,iBAAA,YACA,cAAA,EC1DF,gBCHE,WAAA,MACA,WAAA,OAEA,Wb8hDD,cAAA,KYxhDC,aAAA,KAqEA,aAAc,KAvEZ,YAAA,KZ+hDH,yBY1hDC,WAkEE,MAAO,OZ69CV,yBY5hDC,WA+DE,MAAO,OZk+CV,0BYzhDC,WCvBA,MAAA,QAGA,iBbmjDD,cAAA,KYthDC,aAAc,KCvBd,aAAA,KACA,YAAA,KCAE,KACE,aAAA,MAEA,YAAA,MAGA,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UdgjDL,SAAA,SchiDG,WAAA,IACE,cAAA,KdkiDL,aAAA,Kc1hDG,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Ud6hDH,MAAA,Kc7hDG,WdgiDH,MAAA,KchiDG,WdmiDH,MAAA,acniDG,WdsiDH,MAAA,actiDG,UdyiDH,MAAA,IcziDG,Ud4iDH,MAAA,ac5iDG,Ud+iDH,MAAA,ac/iDG,UdkjDH,MAAA,IcljDG,UdqjDH,MAAA,acrjDG,UdwjDH,MAAA,acxjDG,Ud2jDH,MAAA,Ic3jDG,Ud8jDH,MAAA,ac/iDG,UdkjDH,MAAA,YcljDG,gBdqjDH,MAAA,KcrjDG,gBdwjDH,MAAA,acxjDG,gBd2jDH,MAAA,ac3jDG,ed8jDH,MAAA,Ic9jDG,edikDH,MAAA,acjkDG,edokDH,MAAA,acpkDG,edukDH,MAAA,IcvkDG,ed0kDH,MAAA,ac1kDG,ed6kDH,MAAA,ac7kDG,edglDH,MAAA,IchlDG,edmlDH,MAAA,ac9kDG,edilDH,MAAA,YchmDG,edmmDH,MAAA,KcnmDG,gBdsmDH,KAAA,KctmDG,gBdymDH,KAAA,aczmDG,gBd4mDH,KAAA,ac5mDG,ed+mDH,KAAA,Ic/mDG,edknDH,KAAA,aclnDG,edqnDH,KAAA,acrnDG,edwnDH,KAAA,IcxnDG,ed2nDH,KAAA,ac3nDG,ed8nDH,KAAA,ac9nDG,edioDH,KAAA,IcjoDG,edooDH,KAAA,ac/nDG,edkoDH,KAAA,YcnnDG,edsnDH,KAAA,KctnDG,kBdynDH,YAAA,KcznDG,kBd4nDH,YAAA,ac5nDG,kBd+nDH,YAAA,ac/nDG,iBdkoDH,YAAA,IcloDG,iBdqoDH,YAAA,acroDG,iBdwoDH,YAAA,acxoDG,iBd2oDH,YAAA,Ic3oDG,iBd8oDH,YAAA,ac9oDG,iBdipDH,YAAA,acjpDG,iBdopDH,YAAA,IcppDG,iBdupDH,YAAA,acvpDG,iBd0pDH,YAAA,Yc5rDG,iBACE,YAAA,EAOJ,yBACE,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Ud0rDD,MAAA,Kc1rDC,Wd6rDD,MAAA,Kc7rDC,WdgsDD,MAAA,achsDC,WdmsDD,MAAA,acnsDC,UdssDD,MAAA,IctsDC,UdysDD,MAAA,aczsDC,Ud4sDD,MAAA,ac5sDC,Ud+sDD,MAAA,Ic/sDC,UdktDD,MAAA,acltDC,UdqtDD,MAAA,acrtDC,UdwtDD,MAAA,IcxtDC,Ud2tDD,MAAA,ac5sDC,Ud+sDD,MAAA,Yc/sDC,gBdktDD,MAAA,KcltDC,gBdqtDD,MAAA,acrtDC,gBdwtDD,MAAA,acxtDC,ed2tDD,MAAA,Ic3tDC,ed8tDD,MAAA,ac9tDC,ediuDD,MAAA,acjuDC,edouDD,MAAA,IcpuDC,eduuDD,MAAA,acvuDC,ed0uDD,MAAA,ac1uDC,ed6uDD,MAAA,Ic7uDC,edgvDD,MAAA,ac3uDC,ed8uDD,MAAA,Yc7vDC,edgwDD,MAAA,KchwDC,gBdmwDD,KAAA,KcnwDC,gBdswDD,KAAA,actwDC,gBdywDD,KAAA,aczwDC,ed4wDD,KAAA,Ic5wDC,ed+wDD,KAAA,ac/wDC,edkxDD,KAAA,aclxDC,edqxDD,KAAA,IcrxDC,edwxDD,KAAA,acxxDC,ed2xDD,KAAA,ac3xDC,ed8xDD,KAAA,Ic9xDC,ediyDD,KAAA,ac5xDC,ed+xDD,KAAA,YchxDC,edmxDD,KAAA,KcnxDC,kBdsxDD,YAAA,KctxDC,kBdyxDD,YAAA,aczxDC,kBd4xDD,YAAA,ac5xDC,iBd+xDD,YAAA,Ic/xDC,iBdkyDD,YAAA,aclyDC,iBdqyDD,YAAA,acryDC,iBdwyDD,YAAA,IcxyDC,iBd2yDD,YAAA,ac3yDC,iBd8yDD,YAAA,ac9yDC,iBdizDD,YAAA,IcjzDC,iBdozDD,YAAA,acpzDC,iBduzDD,YAAA,YY9yDD,iBE3CE,YAAA,GAQF,yBACE,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Udw1DD,MAAA,Kcx1DC,Wd21DD,MAAA,Kc31DC,Wd81DD,MAAA,ac91DC,Wdi2DD,MAAA,acj2DC,Udo2DD,MAAA,Icp2DC,Udu2DD,MAAA,acv2DC,Ud02DD,MAAA,ac12DC,Ud62DD,MAAA,Ic72DC,Udg3DD,MAAA,ach3DC,Udm3DD,MAAA,acn3DC,Uds3DD,MAAA,Ict3DC,Udy3DD,MAAA,ac12DC,Ud62DD,MAAA,Yc72DC,gBdg3DD,MAAA,Kch3DC,gBdm3DD,MAAA,acn3DC,gBds3DD,MAAA,act3DC,edy3DD,MAAA,Icz3DC,ed43DD,MAAA,ac53DC,ed+3DD,MAAA,ac/3DC,edk4DD,MAAA,Icl4DC,edq4DD,MAAA,acr4DC,edw4DD,MAAA,acx4DC,ed24DD,MAAA,Ic34DC,ed84DD,MAAA,acz4DC,ed44DD,MAAA,Yc35DC,ed85DD,MAAA,Kc95DC,gBdi6DD,KAAA,Kcj6DC,gBdo6DD,KAAA,acp6DC,gBdu6DD,KAAA,acv6DC,ed06DD,KAAA,Ic16DC,ed66DD,KAAA,ac76DC,edg7DD,KAAA,ach7DC,edm7DD,KAAA,Icn7DC,eds7DD,KAAA,act7DC,edy7DD,KAAA,acz7DC,ed47DD,KAAA,Ic57DC,ed+7DD,KAAA,ac17DC,ed67DD,KAAA,Yc96DC,edi7DD,KAAA,Kcj7DC,kBdo7DD,YAAA,Kcp7DC,kBdu7DD,YAAA,acv7DC,kBd07DD,YAAA,ac17DC,iBd67DD,YAAA,Ic77DC,iBdg8DD,YAAA,ach8DC,iBdm8DD,YAAA,acn8DC,iBds8DD,YAAA,Ict8DC,iBdy8DD,YAAA,acz8DC,iBd48DD,YAAA,ac58DC,iBd+8DD,YAAA,Ic/8DC,iBdk9DD,YAAA,acl9DC,iBdq9DD,YAAA,YYz8DD,iBE9CE,YAAA,GAQF,0BACE,UAAA,WAAA,WAAA,WAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,UAAA,Uds/DD,MAAA,Kct/DC,Wdy/DD,MAAA,Kcz/DC,Wd4/DD,MAAA,ac5/DC,Wd+/DD,MAAA,ac//DC,UdkgED,MAAA,IclgEC,UdqgED,MAAA,acrgEC,UdwgED,MAAA,acxgEC,Ud2gED,MAAA,Ic3gEC,Ud8gED,MAAA,ac9gEC,UdihED,MAAA,acjhEC,UdohED,MAAA,IcphEC,UduhED,MAAA,acxgEC,Ud2gED,MAAA,Yc3gEC,gBd8gED,MAAA,Kc9gEC,gBdihED,MAAA,acjhEC,gBdohED,MAAA,acphEC,eduhED,MAAA,IcvhEC,ed0hED,MAAA,ac1hEC,ed6hED,MAAA,ac7hEC,edgiED,MAAA,IchiEC,edmiED,MAAA,acniEC,edsiED,MAAA,actiEC,edyiED,MAAA,IcziEC,ed4iED,MAAA,acviEC,ed0iED,MAAA,YczjEC,ed4jED,MAAA,Kc5jEC,gBd+jED,KAAA,Kc/jEC,gBdkkED,KAAA,aclkEC,gBdqkED,KAAA,acrkEC,edwkED,KAAA,IcxkEC,ed2kED,KAAA,ac3kEC,ed8kED,KAAA,ac9kEC,edilED,KAAA,IcjlEC,edolED,KAAA,acplEC,edulED,KAAA,acvlEC,ed0lED,KAAA,Ic1lEC,ed6lED,KAAA,acxlEC,ed2lED,KAAA,Yc5kEC,ed+kED,KAAA,Kc/kEC,kBdklED,YAAA,KcllEC,kBdqlED,YAAA,acrlEC,kBdwlED,YAAA,acxlEC,iBd2lED,YAAA,Ic3lEC,iBd8lED,YAAA,ac9lEC,iBdimED,YAAA,acjmEC,iBdomED,YAAA,IcpmEC,iBdumED,YAAA,acvmEC,iBd0mED,YAAA,ac1mEC,iBd6mED,YAAA,Ic7mEC,iBdgnED,YAAA,achnEC,iBdmnED,YAAA,YetrED,iBACA,YAAA,GAGA,MACA,iBAAA,YAEA,QfyrED,YAAA,IevrEC,eAAgB,IAChB,MAAA,KfyrED,WAAA,KelrEC,GACA,WAAA,KfsrED,OexrEC,MAAO,KdmsEP,UAAW,KACX,cAAe,KcvrET,mBd0rER,mBczrEQ,mBAHA,mBACA,mBd0rER,mBDHC,QAAA,IensEC,YAAa,WAoBX,eAAA,IACA,WAAA,IAAA,MAAA,KArBJ,mBdktEE,eAAgB,OAChB,cAAe,IAAI,MAAM,KDJ1B,uCCMD,uCcrtEA,wCdstEA,wCclrEI,2CANI,2CforEP,WAAA,EezqEG,mBf4qEH,WAAA,IAAA,MAAA,KCWD,cACE,iBAAkB,Kc/pEpB,6BdkqEA,6BcjqEE,6BAZM,6BfsqEP,6BCMD,6BDHC,QAAA,ICWD,gBACE,OAAQ,IAAI,MAAM,Kc1qEpB,4Bd6qEA,4Bc7qEA,4BAQQ,4Bf8pEP,4BCMD,4Bc7pEM,OAAA,IAAA,MAAA,KAYF,4BAFJ,4BfopEC,oBAAA,IevoEG,yCf0oEH,iBAAA,QehoEC,4BACA,iBAAA,QfooED,uBe9nEG,SAAA,OdyoEF,QAAS,acxoEL,MAAA,KAEA,sBfioEL,sBgB7wEC,SAAA,OfwxEA,QAAS,WACT,MAAO,KAST,0BerxEE,0Bf+wEF,0BAGA,0BexxEM,0BAMJ,0BfgxEF,0BAGA,0BACA,0BDNC,0BCAD,0BAGA,0BASE,iBAAkB,QDLnB,sCgBlyEC,sCAAA,oCfyyEF,sCetxEM,sCf2xEJ,iBAAkB,QASpB,2Be1yEE,2BfoyEF,2BAGA,2Be7yEM,2BAMJ,2BfqyEF,2BAGA,2BACA,2BDNC,2BCAD,2BAGA,2BASE,iBAAkB,QDLnB,uCgBvzEC,uCAAA,qCf8zEF,uCe3yEM,uCfgzEJ,iBAAkB,QASpB,wBe/zEE,wBfyzEF,wBAGA,wBel0EM,wBAMJ,wBf0zEF,wBAGA,wBACA,wBDNC,wBCAD,wBAGA,wBASE,iBAAkB,QDLnB,oCgB50EC,oCAAA,kCfm1EF,oCeh0EM,oCfq0EJ,iBAAkB,QASpB,2Bep1EE,2Bf80EF,2BAGA,2Bev1EM,2BAMJ,2Bf+0EF,2BAGA,2BACA,2BDNC,2BCAD,2BAGA,2BASE,iBAAkB,QDLnB,uCgBj2EC,uCAAA,qCfw2EF,uCer1EM,uCf01EJ,iBAAkB,QASpB,0Bez2EE,0Bfm2EF,0BAGA,0Be52EM,0BAMJ,0Bfo2EF,0BAGA,0BACA,0BDNC,0BCAD,0BAGA,0BASE,iBAAkB,QDLnB,sCehtEC,sCADF,oCdwtEA,sCe12EM,sCDoJJ,iBAAA,QA6DF,kBACE,WAAY,KA3DV,WAAA,KAEA,oCACA,kBACA,MAAA,KfotED,cAAA,Ke7pEC,WAAY,OAnDV,mBAAA,yBfmtEH,OAAA,IAAA,MAAA,KCWD,yBACE,cAAe,Ec5qEjB,qCd+qEA,qCcjtEI,qCARM,qCfktET,qCCMD,qCDHC,YAAA,OCWD,kCACE,OAAQ,EcvrEV,0Dd0rEA,0Dc1rEA,0DAzBU,0Df4sET,0DCMD,0DAME,YAAa,Ec/rEf,yDdksEA,yDclsEA,yDArBU,yDfgtET,yDCMD,yDAME,aAAc,EDLjB,yDe1sEW,yDEzNV,yDjBk6EC,yDiBj6ED,cAAA,GAMA,SjBk6ED,UAAA,EiB/5EC,QAAS,EACT,OAAA,EACA,OAAA,EAEA,OACA,QAAA,MACA,MAAA,KACA,QAAA,EACA,cAAA,KACA,UAAA,KjBi6ED,YAAA,QiB95EC,MAAO,KACP,OAAA,EACA,cAAA,IAAA,MAAA,QAEA,MjBg6ED,QAAA,aiBr5EC,UAAW,Kb4BX,cAAA,IACG,YAAA,IJ63EJ,mBiBr5EC,mBAAoB,WhBg6EjB,gBAAiB,WgB95EpB,WAAA,WjBy5ED,qBiBv5EC,kBAGA,OAAQ,IAAI,EAAE,EACd,WAAA,MjBs5ED,YAAA,OiBj5EC,iBACA,QAAA,MAIF,kBhB25EE,QAAS,MgBz5ET,MAAA,KAIF,iBAAA,ahB05EE,OAAQ,KI99ER,uBY2EF,2BjB64EC,wBiB54EC,QAAA,IAAA,KAAA,yBACA,eAAA,KAEA,OACA,QAAA,MjB+4ED,YAAA,IiBr3EC,UAAW,KACX,YAAA,WACA,MAAA,KAEA,cACA,QAAA,MACA,MAAA,KACA,OAAA,KACA,QAAA,IAAA,KACA,UAAA,KACA,YAAA,WACA,MAAA,KbxDA,iBAAA,KACQ,iBAAA,KAyHR,OAAA,IAAA,MAAA,KACK,cAAA,IACG,mBAAA,MAAA,EAAA,IAAA,IAAA,iBJwzET,WAAA,MAAA,EAAA,IAAA,IAAA,iBkBh8EC,mBAAA,aAAA,YAAA,KAAA,mBAAA,YAAA,KACE,cAAA,aAAA,YAAA,KAAA,WAAA,YAAA,KACA,WAAA,aAAA,YAAA,KAAA,WAAA,YAAA,KdWM,oBJy7ET,aAAA,QIx5EC,QAAA,EACE,mBAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,qBACA,WAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,qBAEF,gCAA0B,MAAA,KJ25E3B,QAAA,EI15EiC,oCJ65EjC,MAAA,KiBh4EG,yCACA,MAAA,KAQF,0BhBs4EA,iBAAkB,YAClB,OAAQ,EgBn4EN,wBjB63EH,wBiB13EC,iChBq4EA,iBAAkB,KgBn4EhB,QAAA,EAIF,wBACE,iCjB03EH,OAAA,YiB72EC,sBjBg3ED,OAAA,KiB91EG,mBhB02EF,mBAAoB,KAEtB,qDgB32EM,8BjBo2EH,8BiBj2EC,wCAAA,+BhB62EA,YAAa,KgB32EX,iCjBy2EH,iCiBt2EC,2CAAA,kChB02EF,0BACA,0BACA,oCACA,2BAKE,YAAa,KgBh3EX,iCjB82EH,iCACF,2CiBp2EC,kChBu2EA,0BACA,0BACA,oCACA,2BgBz2EA,YAAA,MhBi3EF,YgBv2EE,cAAA,KAGA,UADA,OjBi2ED,SAAA,SiBr2EC,QAAS,MhBg3ET,WAAY,KgBx2EV,cAAA,KAGA,gBADA,aAEA,WAAA,KjBi2EH,aAAA,KiB91EC,cAAe,EhBy2Ef,YAAa,IACb,OAAQ,QgBp2ER,+BjBg2ED,sCiBl2EC,yBACA,gCAIA,SAAU,ShBw2EV,WAAY,MgBt2EZ,YAAA,MAIF,oBAAA,cAEE,WAAA,KAGA,iBADA,cAEA,SAAA,SACA,QAAA,aACA,aAAA,KjB61ED,cAAA,EiB31EC,YAAa,IhBs2Eb,eAAgB,OgBp2EhB,OAAA,QAUA,kCjBo1ED,4BCWC,WAAY,EACZ,YAAa,KgBv1Eb,wCAAA,qCjBm1ED,8BCOD,+BgBh2EI,2BhB+1EJ,4BAME,OAAQ,YDNT,0BiBv1EG,uBAMF,oCAAA,iChB61EA,OAAQ,YDNT,yBiBp1EK,sBAaJ,mCAFF,gCAGE,OAAA,YAGA,qBjBy0ED,WAAA,KiBv0EC,YAAA,IhBk1EA,eAAgB,IgBh1Ed,cAAA,EjB00EH,8BiB5zED,8BCnQE,cAAA,EACA,aAAA,EAEA,UACA,OAAA,KlBkkFD,QAAA,IAAA,KkBhkFC,UAAA,KACE,YAAA,IACA,cAAA,IAGF,gBjB0kFA,OAAQ,KiBxkFN,YAAA,KD2PA,0BAFJ,kBAGI,OAAA,KAEA,6BACA,OAAA,KjBy0EH,QAAA,IAAA,KiB/0EC,UAAW,KAST,YAAA,IACA,cAAA,IAVJ,mChB81EE,OAAQ,KgBh1EN,YAAA,KAGA,6CAjBJ,qCAkBI,OAAA,KAEA,oCACA,OAAA,KjBy0EH,WAAA,KiBr0EC,QAAS,IAAI,KC/Rb,UAAA,KACA,YAAA,IAEA,UACA,OAAA,KlBumFD,QAAA,KAAA,KkBrmFC,UAAA,KACE,YAAA,UACA,cAAA,IAGF,gBjB+mFA,OAAQ,KiB7mFN,YAAA,KDuRA,0BAFJ,kBAGI,OAAA,KAEA,6BACA,OAAA,KjBk1EH,QAAA,KAAA,KiBx1EC,UAAW,KAST,YAAA,UACA,cAAA,IAVJ,mChBu2EE,OAAQ,KgBz1EN,YAAA,KAGA,6CAjBJ,qCAkBI,OAAA,KAEA,oCACA,OAAA,KjBk1EH,WAAA,KiBz0EC,QAAS,KAAK,KAEd,UAAA,KjB00ED,YAAA,UiBt0EG,cjBy0EH,SAAA,SiBp0EC,4BACA,cAAA,OAEA,uBACA,SAAA,SACA,IAAA,EACA,MAAA,EACA,QAAA,EACA,QAAA,MACA,MAAA,KjBu0ED,OAAA,KiBr0EC,YAAa,KhBg1Eb,WAAY,OACZ,eAAgB,KDLjB,oDiBv0EC,uCADA,iCAGA,MAAO,KhBg1EP,OAAQ,KACR,YAAa,KDLd,oDiBv0EC,uCADA,iCAKA,MAAO,KhB80EP,OAAQ,KACR,YAAa,KAKf,uBAEA,8BAJA,4BADA,yBAEA,oBAEA,2BDNC,4BkBruFG,mCAJA,yBD0ZJ,gCbvWE,MAAA,QJ2rFD,2BkBxuFG,aAAA,QACE,mBAAA,MAAA,EAAA,IAAA,IAAA,iBd4CJ,WAAA,MAAA,EAAA,IAAA,IAAA,iBJgsFD,iCiBz1EC,aAAc,QC5YZ,mBAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QACA,WAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QlByuFH,gCiB91EC,MAAO,QCtYL,iBAAA,QlBuuFH,aAAA,QCWD,oCACE,MAAO,QAKT,uBAEA,8BAJA,4BADA,yBAEA,oBAEA,2BDNC,4BkBnwFG,mCAJA,yBD6ZJ,gCb1WE,MAAA,QJytFD,2BkBtwFG,aAAA,QACE,mBAAA,MAAA,EAAA,IAAA,IAAA,iBd4CJ,WAAA,MAAA,EAAA,IAAA,IAAA,iBJ8tFD,iCiBp3EC,aAAc,QC/YZ,mBAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QACA,WAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QlBuwFH,gCiBz3EC,MAAO,QCzYL,iBAAA,QlBqwFH,aAAA,QCWD,oCACE,MAAO,QAKT,qBAEA,4BAJA,0BADA,uBAEA,kBAEA,yBDNC,0BkBjyFG,iCAJA,uBDgaJ,8Bb7WE,MAAA,QJuvFD,yBkBpyFG,aAAA,QACE,mBAAA,MAAA,EAAA,IAAA,IAAA,iBd4CJ,WAAA,MAAA,EAAA,IAAA,IAAA,iBJ4vFD,+BiB/4EC,aAAc,QClZZ,mBAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QACA,WAAA,MAAA,EAAA,IAAA,IAAA,iBAAA,EAAA,EAAA,IAAA,QlBqyFH,8BiBp5EC,MAAO,QC5YL,iBAAA,QlBmyFH,aAAA,QiB/4EG,kCjBk5EH,MAAA,QiB/4EG,2CjBk5EH,IAAA,KiBv4EC,mDACA,IAAA,EAEA,YjB04ED,QAAA,MiBvzEC,WAAY,IAwEZ,cAAe,KAtIX,MAAA,QAEA,yBjBy3EH,yBiBrvEC,QAAS,aA/HP,cAAA,EACA,eAAA,OjBw3EH,2BiB1vEC,QAAS,aAxHP,MAAA,KjBq3EH,eAAA,OiBj3EG,kCACA,QAAA,aAmHJ,0BhB4wEE,QAAS,aACT,eAAgB,OgBr3Ed,wCjB82EH,6CiBtwED,2CjBywEC,MAAA,KiB72EG,wCACA,MAAA,KAmGJ,4BhBwxEE,cAAe,EgBp3Eb,eAAA,OAGA,uBADA,oBjB82EH,QAAA,aiBpxEC,WAAY,EhB+xEZ,cAAe,EgBr3EX,eAAA,OAsFN,6BAAA,0BAjFI,aAAA,EAiFJ,4CjB6xEC,sCiBx2EG,SAAA,SjB22EH,YAAA,EiBh2ED,kDhB42EE,IAAK,GgBl2EL,2BjB+1EH,kCiBh2EG,wBAEA,+BAXF,YAAa,IhBo3Eb,WAAY,EgBn2EV,cAAA,EJviBF,2BIshBF,wBJrhBE,WAAA,KI4jBA,6BAyBA,aAAc,MAnCV,YAAA,MAEA,yBjBw1EH,gCACF,YAAA,IiBx3EG,cAAe,EAwCf,WAAA,OAwBJ,sDAdQ,MAAA,KjB80EL,yBACF,+CiBn0EC,YAAA,KAEE,UAAW,MjBs0EZ,yBACF,+CmBp6FG,YAAa,IACf,UAAA,MAGA,KACA,QAAA,aACA,QAAA,IAAA,KAAA,cAAA,EACA,UAAA,KACA,YAAA,IACA,YAAA,WACA,WAAA,OC0CA,YAAA,OACA,eAAA,OACA,iBAAA,aACA,aAAA,ahB+JA,OAAA,QACG,oBAAA,KACC,iBAAA,KACI,gBAAA,KJ+tFT,YAAA,KmBv6FG,iBAAA,KlBm7FF,OAAQ,IAAI,MAAM,YAClB,cAAe,IkB96Ff,kBdzBA,kBACA,WLk8FD,kBCOD,kBADA,WAME,QAAS,IAAI,KAAK,yBAClB,eAAgB,KkBh7FhB,WnBy6FD,WmB56FG,WlBw7FF,MAAO,KkBn7FL,gBAAA,Kf6BM,YADR,YJk5FD,iBAAA,KmBz6FC,QAAA,ElBq7FA,mBAAoB,MAAM,EAAE,IAAI,IAAI,iBAC5B,WAAY,MAAM,EAAE,IAAI,IAAI,iBoBh+FpC,cAGA,ejB8DA,wBACQ,OAAA,YJ05FT,OAAA,kBmBz6FG,mBAAA,KlBq7FM,WAAY,KkBn7FhB,QAAA,IASN,eC3DE,yBACA,eAAA,KpBi+FD,aoB99FC,MAAA,KnB0+FA,iBAAkB,KmBx+FhB,aAAA,KpBk+FH,mBoBh+FO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpBi+FH,mBoB99FC,MAAA,KnB0+FA,iBAAkB,QAClB,aAAc,QmBt+FR,oBADJ,oBpBi+FH,mCoB99FG,MAAA,KnB0+FF,iBAAkB,QAClB,aAAc,QmBt+FN,0BnB4+FV,0BAHA,0BmB1+FM,0BnB4+FN,0BAHA,0BDFC,yCoBx+FK,yCnB4+FN,yCmBv+FE,MAAA,KnB++FA,iBAAkB,QAClB,aAAc,QmBx+FZ,oBpBg+FH,oBoBh+FG,mCnB6+FF,iBAAkB,KmBz+FV,4BnB8+FV,4BAHA,4BDHC,6BCOD,6BAHA,6BkB39FA,sCClBM,sCnB8+FN,sCmBx+FI,iBAAA,KACA,aAAA,KDcJ,oBC9DE,MAAA,KACA,iBAAA,KpB0hGD,aoBvhGC,MAAA,KnBmiGA,iBAAkB,QmBjiGhB,aAAA,QpB2hGH,mBoBzhGO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpB0hGH,mBoBvhGC,MAAA,KnBmiGA,iBAAkB,QAClB,aAAc,QmB/hGR,oBADJ,oBpB0hGH,mCoBvhGG,MAAA,KnBmiGF,iBAAkB,QAClB,aAAc,QmB/hGN,0BnBqiGV,0BAHA,0BmBniGM,0BnBqiGN,0BAHA,0BDFC,yCoBjiGK,yCnBqiGN,yCmBhiGE,MAAA,KnBwiGA,iBAAkB,QAClB,aAAc,QmBjiGZ,oBpByhGH,oBoBzhGG,mCnBsiGF,iBAAkB,KmBliGV,4BnBuiGV,4BAHA,4BDHC,6BCOD,6BAHA,6BkBjhGA,sCCrBM,sCnBuiGN,sCmBjiGI,iBAAA,QACA,aAAA,QDkBJ,oBClEE,MAAA,QACA,iBAAA,KpBmlGD,aoBhlGC,MAAA,KnB4lGA,iBAAkB,QmB1lGhB,aAAA,QpBolGH,mBoBllGO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpBmlGH,mBoBhlGC,MAAA,KnB4lGA,iBAAkB,QAClB,aAAc,QmBxlGR,oBADJ,oBpBmlGH,mCoBhlGG,MAAA,KnB4lGF,iBAAkB,QAClB,aAAc,QmBxlGN,0BnB8lGV,0BAHA,0BmB5lGM,0BnB8lGN,0BAHA,0BDFC,yCoB1lGK,yCnB8lGN,yCmBzlGE,MAAA,KnBimGA,iBAAkB,QAClB,aAAc,QmB1lGZ,oBpBklGH,oBoBllGG,mCnB+lGF,iBAAkB,KmB3lGV,4BnBgmGV,4BAHA,4BDHC,6BCOD,6BAHA,6BkBtkGA,sCCzBM,sCnBgmGN,sCmB1lGI,iBAAA,QACA,aAAA,QDsBJ,oBCtEE,MAAA,QACA,iBAAA,KpB4oGD,UoBzoGC,MAAA,KnBqpGA,iBAAkB,QmBnpGhB,aAAA,QpB6oGH,gBoB3oGO,gBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpB4oGH,gBoBzoGC,MAAA,KnBqpGA,iBAAkB,QAClB,aAAc,QmBjpGR,iBADJ,iBpB4oGH,gCoBzoGG,MAAA,KnBqpGF,iBAAkB,QAClB,aAAc,QmBjpGN,uBnBupGV,uBAHA,uBmBrpGM,uBnBupGN,uBAHA,uBDFC,sCoBnpGK,sCnBupGN,sCmBlpGE,MAAA,KnB0pGA,iBAAkB,QAClB,aAAc,QmBnpGZ,iBpB2oGH,iBoB3oGG,gCnBwpGF,iBAAkB,KmBppGV,yBnBypGV,yBAHA,yBDHC,0BCOD,0BAHA,0BkB3nGA,mCC7BM,mCnBypGN,mCmBnpGI,iBAAA,QACA,aAAA,QD0BJ,iBC1EE,MAAA,QACA,iBAAA,KpBqsGD,aoBlsGC,MAAA,KnB8sGA,iBAAkB,QmB5sGhB,aAAA,QpBssGH,mBoBpsGO,mBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpBqsGH,mBoBlsGC,MAAA,KnB8sGA,iBAAkB,QAClB,aAAc,QmB1sGR,oBADJ,oBpBqsGH,mCoBlsGG,MAAA,KnB8sGF,iBAAkB,QAClB,aAAc,QmB1sGN,0BnBgtGV,0BAHA,0BmB9sGM,0BnBgtGN,0BAHA,0BDFC,yCoB5sGK,yCnBgtGN,yCmB3sGE,MAAA,KnBmtGA,iBAAkB,QAClB,aAAc,QmB5sGZ,oBpBosGH,oBoBpsGG,mCnBitGF,iBAAkB,KmB7sGV,4BnBktGV,4BAHA,4BDHC,6BCOD,6BAHA,6BkBhrGA,sCCjCM,sCnBktGN,sCmB5sGI,iBAAA,QACA,aAAA,QD8BJ,oBC9EE,MAAA,QACA,iBAAA,KpB8vGD,YoB3vGC,MAAA,KnBuwGA,iBAAkB,QmBrwGhB,aAAA,QpB+vGH,kBoB7vGO,kBAEN,MAAA,KACE,iBAAA,QACA,aAAA,QpB8vGH,kBoB3vGC,MAAA,KnBuwGA,iBAAkB,QAClB,aAAc,QmBnwGR,mBADJ,mBpB8vGH,kCoB3vGG,MAAA,KnBuwGF,iBAAkB,QAClB,aAAc,QmBnwGN,yBnBywGV,yBAHA,yBmBvwGM,yBnBywGN,yBAHA,yBDFC,wCoBrwGK,wCnBywGN,wCmBpwGE,MAAA,KnB4wGA,iBAAkB,QAClB,aAAc,QmBrwGZ,mBpB6vGH,mBoB7vGG,kCnB0wGF,iBAAkB,KmBtwGV,2BnB2wGV,2BAHA,2BDHC,4BCOD,4BAHA,4BkBruGA,qCCrCM,qCnB2wGN,qCmBrwGI,iBAAA,QACA,aAAA,QDuCJ,mBACE,MAAA,QACA,iBAAA,KnB+tGD,UmB5tGC,YAAA,IlBwuGA,MAAO,QACP,cAAe,EAEjB,UGzwGE,iBemCE,iBflCM,oBJkwGT,6BmB7tGC,iBAAA,YlByuGA,mBAAoB,KACZ,WAAY,KkBtuGlB,UAEF,iBAAA,gBnB6tGD,gBmB3tGG,aAAA,YnBiuGH,gBmB/tGG,gBAIA,MAAA,QlBuuGF,gBAAiB,UACjB,iBAAkB,YDNnB,0BmBhuGK,0BAUN,mCATM,mClB2uGJ,MAAO,KmB1yGP,gBAAA,KAGA,mBADA,QpBmyGD,QAAA,KAAA,KmBztGC,UAAW,KlBquGX,YAAa,UmBjzGb,cAAA,IAGA,mBADA,QpB0yGD,QAAA,IAAA,KmB5tGC,UAAW,KlBwuGX,YAAa,ImBxzGb,cAAA,IAGA,mBADA,QpBizGD,QAAA,IAAA,ImB3tGC,UAAW,KACX,YAAA,IACA,cAAA,IAIF,WACE,QAAA,MnB2tGD,MAAA,KCYD,sBACE,WAAY,IqBz3GZ,6BADF,4BtBk3GC,6BI7rGC,MAAA,KAEQ,MJisGT,QAAA,EsBr3GC,mBAAA,QAAA,KAAA,OACE,cAAA,QAAA,KAAA,OtBu3GH,WAAA,QAAA,KAAA,OsBl3GC,StBq3GD,QAAA,EsBn3Ga,UtBs3Gb,QAAA,KsBr3Ga,atBw3Gb,QAAA,MsBv3Ga,etB03Gb,QAAA,UsBt3GC,kBACA,QAAA,gBlBwKA,YACQ,SAAA,SAAA,OAAA,EAOR,SAAA,OACQ,mCAAA,KAAA,8BAAA,KAGR,2BAAA,KACQ,4BAAA,KAAA,uBAAA,KJ2sGT,oBAAA,KuBr5GC,4BAA6B,OAAQ,WACrC,uBAAA,OAAA,WACA,oBAAA,OAAA,WAEA,OACA,QAAA,aACA,MAAA,EACA,OAAA,EACA,YAAA,IACA,eAAA,OvBu5GD,WAAA,IAAA,OuBn5GC,WAAY,IAAI,QtBk6GhB,aAAc,IAAI,MAAM,YsBh6GxB,YAAA,IAAA,MAAA,YAKA,UADF,QvBo5GC,SAAA,SuB94GC,uBACA,QAAA,EAEA,eACA,SAAA,SACA,IAAA,KACA,KAAA,EACA,QAAA,KACA,QAAA,KACA,MAAA,KACA,UAAA,MACA,QAAA,IAAA,EACA,OAAA,IAAA,EAAA,EACA,UAAA,KACA,WAAA,KACA,WAAA,KnBsBA,iBAAA,KACQ,wBAAA,YmBrBR,gBAAA,YtB+5GA,OsB/5GA,IAAA,MAAA,KvBk5GD,OAAA,IAAA,MAAA,gBuB74GC,cAAA,IACE,mBAAA,EAAA,IAAA,KAAA,iBACA,WAAA,EAAA,IAAA,KAAA,iBAzBJ,0BCzBE,MAAA,EACA,KAAA,KAEA,wBxBo8GD,OAAA,IuB96GC,OAAQ,IAAI,EAmCV,SAAA,OACA,iBAAA,QAEA,oBACA,QAAA,MACA,QAAA,IAAA,KACA,MAAA,KvB84GH,YAAA,IuBx4GC,YAAA,WtBw5GA,MAAO,KsBt5GL,YAAA,OvB44GH,0BuB14GG,0BAMF,MAAA,QtBo5GA,gBAAiB,KACjB,iBAAkB,QsBj5GhB,yBAEA,+BADA,+BvBu4GH,MAAA,KuB73GC,gBAAA,KtB64GA,iBAAkB,QAClB,QAAS,EDZV,2BuB33GC,iCAAA,iCAEE,MAAA,KEzGF,iCF2GE,iCAEA,gBAAA,KvB63GH,OAAA,YuBx3GC,iBAAkB,YAGhB,iBAAA,KvBw3GH,OAAA,0DuBn3GG,qBvBs3GH,QAAA,MuB72GC,QACA,QAAA,EAQF,qBACE,MAAA,EACA,KAAA,KAIF,oBACE,MAAA,KACA,KAAA,EAEA,iBACA,QAAA,MACA,QAAA,IAAA,KvBw2GD,UAAA,KuBp2GC,YAAa,WACb,MAAA,KACA,YAAA,OAEA,mBACA,SAAA,MACA,IAAA,EvBs2GD,MAAA,EuBl2GC,OAAQ,EACR,KAAA,EACA,QAAA,IAQF,2BtB42GE,MAAO,EsBx2GL,KAAA,KAEA,eACA,sCvB41GH,QAAA,GuBn2GC,WAAY,EtBm3GZ,cAAe,IAAI,OsBx2GjB,cAAA,IAAA,QAEA,uBvB41GH,8CuBv0GC,IAAK,KAXL,OAAA,KApEA,cAAA,IvB25GC,yBuBv1GD,6BA1DA,MAAA,EACA,KAAA,KvBq5GD,kC0BpiHG,MAAO,KzBojHP,KAAM,GyBhjHR,W1BsiHD,oB0B1iHC,SAAU,SzB0jHV,QAAS,ayBpjHP,eAAA,OAGA,yB1BsiHH,gBCgBC,SAAU,SACV,MAAO,KyB7iHT,gC1BsiHC,gCCYD,+BAFA,+ByBhjHA,uBANM,uBzBujHN,sBAFA,sBAQE,QAAS,EyBljHP,qB1BuiHH,2B0BliHD,2BACE,iC1BoiHD,YAAA,KCgBD,aACE,YAAa,KDZd,kB0B1iHD,wBAAA,0BzB2jHE,MAAO,KDZR,kB0B/hHD,wBACE,0B1BiiHD,YAAA,I0B5hHC,yE1B+hHD,cAAA,E2BhlHC,4BACG,YAAA,EDsDL,mEzB6iHE,wBAAyB,E0B5lHzB,2BAAA,E3BilHD,6C0B5hHD,8CACE,uBAAA,E1B8hHD,0BAAA,E0B3hHC,sB1B8hHD,MAAA,KCgBD,8D0B/mHE,cAAA,E3BomHD,mE0B3hHD,oECjEE,wBAAA,EACG,2BAAA,EDqEL,oEzB0iHE,uBAAwB,EyBxiHxB,0BAAA,EAiBF,mCACE,iCACA,QAAA,EAEF,iCACE,cAAA,IACA,aAAA,IAKF,oCtB/CE,cAAA,KACQ,aAAA,KsBkDR,iCtBnDA,mBAAA,MAAA,EAAA,IAAA,IAAA,iBACQ,WAAA,MAAA,EAAA,IAAA,IAAA,iBsByDV,0CACE,mBAAA,K1BugHD,WAAA,K0BngHC,YACA,YAAA,EAGF,eACE,aAAA,IAAA,IAAA,E1BqgHD,oBAAA,ECgBD,uBACE,aAAc,EAAE,IAAI,IyB1gHlB,yBACA,+BACA,oC1B+/GH,QAAA,M0BtgHC,MAAO,KAcH,MAAA,K1B2/GL,UAAA,KCgBD,oCACE,MAAO,KyBpgHL,8BACA,oC1By/GH,oC0Bp/GC,0CACE,WAAA,K1Bs/GH,YAAA,E2B/pHC,4DACC,cAAA,EAQA,sD3B4pHF,uBAAA,I0Bt/GC,wBAAA,IC/KA,2BAAA,EACC,0BAAA,EAQA,sD3BkqHF,uBAAA,E0Bv/GC,wBAAyB,EACzB,2BAAA,I1By/GD,0BAAA,ICgBD,uE0BtrHE,cAAA,E3B2qHD,4E0Bt/GD,6EC7LE,2BAAA,EACC,0BAAA,EDoMH,6EACE,uBAAA,EACA,wBAAA,EAEA,qB1Bo/GD,QAAA,M0Bx/GC,MAAO,KzBwgHP,aAAc,MyBjgHZ,gBAAA,SAEA,0B1Bq/GH,gC0B9/GC,QAAS,WAYP,MAAA,K1Bq/GH,MAAA,G0Bj/GG,qC1Bo/GH,MAAA,KCgBD,+CACE,KAAM,KyB7+GF,gDAFA,6C1Bs+GL,2D0Br+GK,wDEzOJ,SAAU,SACV,KAAA,cACA,eAAA,K5BitHD,a4B7sHC,SAAA,SACE,QAAA,MACA,gBAAA,S5BgtHH,0B4BxtHC,MAAO,KAeL,cAAA,EACA,aAAA,EAOA,2BACA,SAAA,S5BusHH,QAAA,E4BrsHG,MAAA,KACE,MAAA,K5BusHL,cAAA,ECgBD,iCACE,QAAS,EiBnrHT,8BACA,mCACA,sCACA,OAAA,KlBwqHD,QAAA,KAAA,KkBtqHC,UAAA,KjBsrHA,YAAa,UACb,cAAe,IiBrrHb,oClB0qHH,yCkBvqHC,4CjBurHA,OAAQ,KACR,YAAa,KDTd,8C4B/sHD,mDAAA,sD3B0tHA,sCACA,2CiBzrHI,8CjB8rHF,OAAQ,KiB1sHR,8BACA,mCACA,sCACA,OAAA,KlB+rHD,QAAA,IAAA,KkB7rHC,UAAA,KjB6sHA,YAAa,IACb,cAAe,IiB5sHb,oClBisHH,yCkB9rHC,4CjB8sHA,OAAQ,KACR,YAAa,KDTd,8C4B7tHD,mDAAA,sD3BwuHA,sCACA,2CiBhtHI,8CjBqtHF,OAAQ,K2BzuHR,2B5B6tHD,mB4B7tHC,iB3B8uHA,QAAS,W2BzuHX,8D5B6tHC,sD4B7tHD,oDAEE,cAAA,EAEA,mB5B+tHD,iB4B1tHC,MAAO,GACP,YAAA,OACA,eAAA,OAEA,mBACA,QAAA,IAAA,KACA,UAAA,KACA,YAAA,IACA,YAAA,EACA,MAAA,K5B4tHD,WAAA,O4BztHC,iBAAA,KACE,OAAA,IAAA,MAAA,KACA,cAAA,I5B4tHH,4B4BztHC,QAAA,IAAA,KACE,UAAA,KACA,cAAA,I5B4tHH,4B4B/uHC,QAAS,KAAK,K3B+vHd,UAAW,K2BruHT,cAAA,IAKJ,wCAAA,qC3BquHE,WAAY,EAEd,uCACA,+BACA,kC0B70HE,6CACG,8CC4GL,6D5BqtHC,wE4BptHC,wBAAA,E5ButHD,2BAAA,ECgBD,+BACE,aAAc,EAEhB,sCACA,8B2BhuHA,+D5BstHC,oDCWD,iC0Bl1HE,4CACG,6CCiHH,uBAAA,E5BwtHD,0BAAA,E4BltHC,8BAGA,YAAA,E5BotHD,iB4BxtHC,SAAU,SAUR,UAAA,E5BitHH,YAAA,O4B/sHK,sB5BktHL,SAAA,SCgBD,2BACE,YAAa,K2BxtHb,6BAAA,4B5B4sHD,4B4BzsHK,QAAA,EAGJ,kCAAA,wCAGI,aAAA,K5B4sHL,iC6B12HD,uCACE,QAAA,EACA,YAAA,K7B62HD,K6B/2HC,aAAc,EAOZ,cAAA,EACA,WAAA,KARJ,QAWM,SAAA,SACA,QAAA,M7B42HL,U6B12HK,SAAA,S5B03HJ,QAAS,M4Bx3HH,QAAA,KAAA,KAMJ,gB7Bu2HH,gB6Bt2HK,gBAAA,K7By2HL,iBAAA,KCgBD,mB4Br3HQ,MAAA,KAGA,yBADA,yB7B02HP,MAAA,K6Bl2HG,gBAAA,K5Bk3HF,OAAQ,YACR,iBAAkB,Y4B/2Hd,aAzCN,mB7B64HC,mBwBh5HC,iBAAA,KACA,aAAA,QAEA,kBxBm5HD,OAAA,I6Bn5HC,OAAQ,IAAI,EA0DV,SAAA,O7B41HH,iBAAA,Q6Bl1HC,c7Bq1HD,UAAA,K6Bn1HG,UAEA,cAAA,IAAA,MAAA,KALJ,aASM,MAAA,KACA,cAAA,KAEA,e7Bo1HL,aAAA,I6Bn1HK,YAAA,WACE,OAAA,IAAA,MAAA,Y7Bq1HP,cAAA,IAAA,IAAA,EAAA,ECgBD,qBACE,aAAc,KAAK,KAAK,K4B51HlB,sBAEA,4BADA,4BAEA,MAAA,K7Bi1HP,OAAA,Q6B50HC,iBAAA,KAqDA,OAAA,IAAA,MAAA,KA8BA,oBAAA,YAnFA,wBAwDE,MAAA,K7B2xHH,cAAA,E6BzxHK,2BACA,MAAA,KA3DJ,6BAgEE,cAAA,IACA,WAAA,OAYJ,iDA0DE,IAAK,KAjED,KAAA,K7B0xHH,yB6BztHD,2BA9DM,QAAA,W7B0xHL,MAAA,G6Bn2HD,6BAuFE,cAAA,GAvFF,6B5Bw3HA,aAAc,EACd,cAAe,IDZhB,kC6BtuHD,wCA3BA,wCATM,OAAA,IAAA,MAAA,K7B+wHH,yB6B3uHD,6B5B2vHE,cAAe,IAAI,MAAM,KACzB,cAAe,IAAI,IAAI,EAAE,EDZ1B,kC6B92HD,wC7B+2HD,wC6B72HG,oBAAA,MAIE,c7B+2HL,MAAA,K6B52HK,gB7B+2HL,cAAA,ICgBD,iBACE,YAAa,I4Bv3HP,uBAQR,6B7Bo2HC,6B6Bl2HG,MAAA,K7Bq2HH,iBAAA,Q6Bn2HK,gBACA,MAAA,KAYN,mBACE,WAAA,I7B41HD,YAAA,E6Bz1HG,e7B41HH,MAAA,K6B11HK,kBACA,MAAA,KAPN,oBAYI,cAAA,IACA,WAAA,OAYJ,wCA0DE,IAAK,KAjED,KAAA,K7B21HH,yB6B1xHD,kBA9DM,QAAA,W7B21HL,MAAA,G6Bl1HD,oBACA,cAAA,GAIE,oBACA,cAAA,EANJ,yB5B02HE,aAAc,EACd,cAAe,IDZhB,8B6B1yHD,oCA3BA,oCATM,OAAA,IAAA,MAAA,K7Bm1HH,yB6B/yHD,yB5B+zHE,cAAe,IAAI,MAAM,KACzB,cAAe,IAAI,IAAI,EAAE,EDZ1B,8B6Bx0HD,oC7By0HD,oC6Bv0HG,oBAAA,MAGA,uB7B00HH,QAAA,K6B/zHC,qBF3OA,QAAA,M3B+iID,yB8BxiIC,WAAY,KACZ,uBAAA,EACA,wBAAA,EAEA,Q9B0iID,SAAA,S8BliIC,WAAY,KA8nBZ,cAAe,KAhoBb,OAAA,IAAA,MAAA,Y9ByiIH,yB8BzhIC,QAgnBE,cAAe,K9B86GlB,yB8BjhIC,eACA,MAAA,MAGA,iBACA,cAAA,KAAA,aAAA,KAEA,WAAA,Q9BkhID,2BAAA,M8BhhIC,WAAA,IAAA,MAAA,YACE,mBAAA,MAAA,EAAA,IAAA,EAAA,qB9BkhIH,WAAA,MAAA,EAAA,IAAA,EAAA,qB8Bz7GD,oBArlBI,WAAA,KAEA,yBAAA,iB9BkhID,MAAA,K8BhhIC,WAAA,EACE,mBAAA,KACA,WAAA,KAEA,0B9BkhIH,QAAA,gB8B/gIC,OAAA,eACE,eAAA,E9BihIH,SAAA,kBCkBD,oBACE,WAAY,QDZf,sC8B/gIK,mC9B8gIH,oC8BzgIC,cAAe,E7B4hIf,aAAc,G6Bj+GlB,sCAnjBE,mC7ByhIA,WAAY,MDdX,4D8BngID,sC9BogID,mCCkBG,WAAY,O6B3gId,kCANE,gC9BsgIH,4B8BvgIG,0BAuiBF,aAAc,M7Bm/Gd,YAAa,MAEf,yBDZC,kC8B3gIK,gC9B0gIH,4B8B3gIG,0BAcF,aAAc,EAChB,YAAA,GAMF,mBA8gBE,QAAS,KAhhBP,aAAA,EAAA,EAAA,I9BkgIH,yB8B7/HC,mB7B+gIE,cAAe,G6B1gIjB,qBADA,kB9BggID,SAAA,M8Bz/HC,MAAO,EAggBP,KAAM,E7B4gHN,QAAS,KDdR,yB8B7/HD,qB9B8/HD,kB8B7/HC,cAAA,GAGF,kBACE,IAAA,EACA,aAAA,EAAA,EAAA,I9BigID,qB8B1/HC,OAAQ,EACR,cAAA,EACA,aAAA,IAAA,EAAA,EAEA,cACA,MAAA,K9B4/HD,OAAA,K8B1/HC,QAAA,KAAA,K7B4gIA,UAAW,K6B1gIT,YAAA,KAIA,oBAbJ,oB9BwgIC,gBAAA,K8Bv/HG,kB7B0gIF,QAAS,MDdR,yBACF,iC8Bh/HC,uCACA,YAAA,OAGA,eC9LA,SAAA,SACA,MAAA,MD+LA,QAAA,IAAA,KACA,WAAA,IACA,aAAA,KACA,cAAA,I9Bm/HD,iBAAA,Y8B/+HC,iBAAA,KACE,OAAA,IAAA,MAAA,Y9Bi/HH,cAAA,I8B5+HG,qBACA,QAAA,EAEA,yB9B++HH,QAAA,M8BrgIC,MAAO,KAyBL,OAAA,I9B++HH,cAAA,I8BpjHD,mCAvbI,WAAA,I9Bg/HH,yB8Bt+HC,eACA,QAAA,MAGE,YACA,OAAA,MAAA,M9By+HH,iB8B58HC,YAAA,KA2YA,eAAgB,KAjaZ,YAAA,KAEA,yBACA,iCACA,SAAA,OACA,MAAA,KACA,MAAA,KAAA,WAAA,E9Bs+HH,iBAAA,Y8B3kHC,OAAQ,E7B8lHR,mBAAoB,K6Bt/HhB,WAAA,KAGA,kDAqZN,sC9BklHC,QAAA,IAAA,KAAA,IAAA,KCmBD,sC6Bv/HQ,YAAA,KAmBR,4C9Bs9HD,4C8BvlHG,iBAAkB,M9B4lHnB,yB8B5lHD,YAtYI,MAAA,K9Bq+HH,OAAA,E8Bn+HK,eACA,MAAA,K9Bu+HP,iB8B39HG,YAAa,KACf,eAAA,MAGA,aACA,QAAA,KAAA,K1B9NA,WAAA,IACQ,aAAA,M2B/DR,cAAA,IACA,YAAA,M/B4vID,WAAA,IAAA,MAAA,YiBtuHC,cAAe,IAAI,MAAM,YAwEzB,mBAAoB,MAAM,EAAE,IAAI,EAAE,qBAAyB,EAAE,IAAI,EAAE,qBAtI/D,WAAA,MAAA,EAAA,IAAA,EAAA,qBAAA,EAAA,IAAA,EAAA,qBAEA,yBjBwyHH,yBiBpqHC,QAAS,aA/HP,cAAA,EACA,eAAA,OjBuyHH,2BiBzqHC,QAAS,aAxHP,MAAA,KjBoyHH,eAAA,OiBhyHG,kCACA,QAAA,aAmHJ,0BhBmsHE,QAAS,aACT,eAAgB,OgB5yHd,wCjB6xHH,6CiBrrHD,2CjBwrHC,MAAA,KiB5xHG,wCACA,MAAA,KAmGJ,4BhB+sHE,cAAe,EgB3yHb,eAAA,OAGA,uBADA,oBjB6xHH,QAAA,aiBnsHC,WAAY,EhBstHZ,cAAe,EgB5yHX,eAAA,OAsFN,6BAAA,0BAjFI,aAAA,EAiFJ,4CjB4sHC,sCiBvxHG,SAAA,SjB0xHH,YAAA,E8BngID,kDAmWE,IAAK,GAvWH,yBACE,yB9B8gIL,cAAA,I8B5/HD,oCAoVE,cAAe,GA1Vf,yBACA,aACA,MAAA,KACA,YAAA,E1BzPF,eAAA,EACQ,aAAA,EJmwIP,YAAA,EACF,OAAA,E8BngIG,mBAAoB,KACtB,WAAA,M9BugID,8B8BngIC,WAAY,EACZ,uBAAA,EHzUA,wBAAA,EAQA,mDACC,cAAA,E3By0IF,uBAAA,I8B//HC,wBAAyB,IChVzB,2BAAA,EACA,0BAAA,EDkVA,YCnVA,WAAA,IACA,cAAA,IDqVA,mBCtVA,WAAA,KACA,cAAA,KD+VF,mBChWE,WAAA,KACA,cAAA,KDuWF,aAsSE,WAAY,KA1SV,cAAA,KAEA,yB9B+/HD,aACF,MAAA,K8Bl+HG,aAAc,KAhBhB,YAAA,MACA,yBE5WA,aF8WE,MAAA,eAFF,cAKI,MAAA,gB9Bu/HH,aAAA,M8B7+HD,4BACA,aAAA,GADF,gBAKI,iBAAA,Q9Bg/HH,aAAA,QCmBD,8B6BhgIM,MAAA,KARN,oC9B0/HC,oC8B5+HG,MAAA,Q9B++HH,iBAAA,Y8B1+HK,6B9B6+HL,MAAA,KCmBD,iC6B5/HQ,MAAA,KAKF,uC9By+HL,uCCmBC,MAAO,KACP,iBAAkB,Y6Bz/HZ,sCAIF,4C9Bu+HL,4CCmBC,MAAO,KACP,iBAAkB,Q6Bv/HZ,wCAxCR,8C9BihIC,8C8Bn+HG,MAAA,K9Bs+HH,iBAAA,YCmBD,+B6Bt/HM,aAAA,KAGA,qCApDN,qC9B2hIC,iBAAA,KCmBD,yC6Bp/HI,iBAAA,KAOE,iCAAA,6B7Bk/HJ,aAAc,Q6B9+HR,oCAiCN,0C9B+7HD,0C8B3xHC,MAAO,KA7LC,iBAAA,QACA,yB7B8+HR,sD6B5+HU,MAAA,KAKF,4D9By9HP,4DCmBC,MAAO,KACP,iBAAkB,Y6Bz+HV,2DAIF,iE9Bu9HP,iECmBC,MAAO,KACP,iBAAkB,Q6Bv+HV,6D9B09HX,mEADE,mE8B1jIC,MAAO,KA8GP,iBAAA,aAEE,6B9Bi9HL,MAAA,K8B58HG,mC9B+8HH,MAAA,KCmBD,0B6B/9HM,MAAA,KAIA,gCAAA,gC7Bg+HJ,MAAO,K6Bt9HT,0CARQ,0CASN,mD9Bu8HD,mD8Bt8HC,MAAA,KAFF,gBAKI,iBAAA,K9B08HH,aAAA,QCmBD,8B6B19HM,MAAA,QARN,oC9Bo9HC,oC8Bt8HG,MAAA,K9By8HH,iBAAA,Y8Bp8HK,6B9Bu8HL,MAAA,QCmBD,iC6Bt9HQ,MAAA,QAKF,uC9Bm8HL,uCCmBC,MAAO,KACP,iBAAkB,Y6Bn9HZ,sCAIF,4C9Bi8HL,4CCmBC,MAAO,KACP,iBAAkB,Q6Bj9HZ,wCAxCR,8C9B2+HC,8C8B57HG,MAAA,K9B+7HH,iBAAA,YCmBD,+B6B/8HM,aAAA,KAGA,qCArDN,qC9Bq/HC,iBAAA,KCmBD,yC6B78HI,iBAAA,KAME,iCAAA,6B7B48HJ,aAAc,Q6Bx8HR,oCAuCN,0C9Bm5HD,0C8B33HC,MAAO,KAvDC,iBAAA,QAuDV,yBApDU,kE9Bs7HP,aAAA,Q8Bn7HO,0D9Bs7HP,iBAAA,QCmBD,sD6Bt8HU,MAAA,QAKF,4D9Bm7HP,4DCmBC,MAAO,KACP,iBAAkB,Y6Bn8HV,2DAIF,iE9Bi7HP,iECmBC,MAAO,KACP,iBAAkB,Q6Bj8HV,6D9Bo7HX,mEADE,mE8B1hIC,MAAO,KA+GP,iBAAA,aAEE,6B9Bg7HL,MAAA,Q8B36HG,mC9B86HH,MAAA,KCmBD,0B6B97HM,MAAA,QAIA,gCAAA,gC7B+7HJ,MAAO,KgCvkJT,0CH0oBQ,0CGzoBN,mDjCwjJD,mDiCvjJC,MAAA,KAEA,YACA,QAAA,IAAA,KjC2jJD,cAAA,KiChkJC,WAAY,KAQV,iBAAA,QjC2jJH,cAAA,IiCxjJK,eACA,QAAA,ajC4jJL,yBiCxkJC,QAAS,EAAE,IAkBT,MAAA,KjCyjJH,QAAA,SkC5kJC,oBACA,MAAA,KAEA,YlC+kJD,QAAA,akCnlJC,aAAc,EAOZ,OAAA,KAAA,ElC+kJH,cAAA,ICmBD,eiC/lJM,QAAA,OAEA,iBACA,oBACA,SAAA,SACA,MAAA,KACA,QAAA,IAAA,KACA,YAAA,KACA,YAAA,WlCglJL,MAAA,QkC9kJG,gBAAA,KjCimJF,iBAAkB,KiC9lJZ,OAAA,IAAA,MAAA,KPVH,6B3B2lJJ,gCkC7kJG,YAAA,EjCgmJF,uBAAwB,I0BvnJxB,0BAAA,I3BymJD,4BkCxkJG,+BjC2lJF,wBAAyB,IACzB,2BAA4B,IiCxlJxB,uBAFA,uBAGA,0BAFA,0BlC8kJL,QAAA,EkCtkJG,MAAA,QjCylJF,iBAAkB,KAClB,aAAc,KAEhB,sBiCvlJM,4BAFA,4BjC0lJN,yBiCvlJM,+BAFA,+BAGA,QAAA,ElC2kJL,MAAA,KkCloJC,OAAQ,QjCqpJR,iBAAkB,QAClB,aAAc,QiCnlJV,wBAEA,8BADA,8BjColJN,2BiCtlJM,iCjCulJN,iCDZC,MAAA,KkC/jJC,OAAQ,YjCklJR,iBAAkB,KkC7pJd,aAAA,KAEA,oBnC8oJL,uBmC5oJG,QAAA,KAAA,KlC+pJF,UAAW,K0B1pJX,YAAA,U3B4oJD,gCmC3oJG,mClC8pJF,uBAAwB,I0BvqJxB,0BAAA,I3BypJD,+BkC1kJD,kCjC6lJE,wBAAyB,IkC7qJrB,2BAAA,IAEA,oBnC8pJL,uBmC5pJG,QAAA,IAAA,KlC+qJF,UAAW,K0B1qJX,YAAA,I3B4pJD,gCmC3pJG,mClC8qJF,uBAAwB,I0BvrJxB,0BAAA,I3ByqJD,+BoC3qJD,kCACE,wBAAA,IACA,2BAAA,IAEA,OpC6qJD,aAAA,EoCjrJC,OAAQ,KAAK,EAOX,WAAA,OpC6qJH,WAAA,KCmBD,UmC7rJM,QAAA,OAEA,YACA,eACA,QAAA,apC8qJL,QAAA,IAAA,KoC5rJC,iBAAkB,KnC+sJlB,OAAQ,IAAI,MAAM,KmC5rJd,cAAA,KAnBN,kBpCisJC,kBCmBC,gBAAiB,KmCzrJb,iBAAA,KA3BN,eAAA,kBAkCM,MAAA,MAlCN,mBAAA,sBnC6tJE,MAAO,KmClrJH,mBAEA,yBADA,yBpCqqJL,sBqCltJC,MAAO,KACP,OAAA,YACA,iBAAA,KAEA,OACA,QAAA,OACA,QAAA,KAAA,KAAA,KACA,UAAA,IACA,YAAA,IACA,YAAA,EACA,MAAA,KrCotJD,WAAA,OqChtJG,YAAA,OpCmuJF,eAAgB,SoCjuJZ,cAAA,MrCotJL,cqCltJK,cAKJ,MAAA,KACE,gBAAA,KrC+sJH,OAAA,QqC1sJG,aACA,QAAA,KAOJ,YCtCE,SAAA,StC+uJD,IAAA,KCmBD,eqC7vJM,iBAAA,KALJ,2BD0CF,2BrC4sJC,iBAAA,QCmBD,eqCpwJM,iBAAA,QALJ,2BD8CF,2BrC+sJC,iBAAA,QCmBD,eqC3wJM,iBAAA,QALJ,2BDkDF,2BrCktJC,iBAAA,QCmBD,YqClxJM,iBAAA,QALJ,wBDsDF,wBrCqtJC,iBAAA,QCmBD,eqCzxJM,iBAAA,QALJ,2BD0DF,2BrCwtJC,iBAAA,QCmBD,cqChyJM,iBAAA,QCDJ,0BADF,0BAEE,iBAAA,QAEA,OACA,QAAA,aACA,UAAA,KACA,QAAA,IAAA,IACA,UAAA,KACA,YAAA,IACA,YAAA,EACA,MAAA,KACA,WAAA,OvCqxJD,YAAA,OuClxJC,eAAA,OACE,iBAAA,KvCoxJH,cAAA,KuC/wJG,aACA,QAAA,KAGF,YtCkyJA,SAAU,SsChyJR,IAAA,KAMA,0BvC4wJH,eCmBC,IAAK,EsC7xJD,QAAA,IAAA,IvCgxJL,cuC9wJK,cAKJ,MAAA,KtC4xJA,gBAAiB,KsC1xJf,OAAA,QvC4wJH,+BuCxwJC,4BACE,MAAA,QvC0wJH,iBAAA,KuCtwJG,wBvCywJH,MAAA,MuCrwJG,+BvCwwJH,aAAA,IwCj0JC,uBACA,YAAA,IAEA,WACA,YAAA,KxCo0JD,eAAA,KwCz0JC,cAAe,KvC41Jf,MAAO,QuCn1JL,iBAAA,KAIA,eAbJ,cAcI,MAAA,QxCo0JH,awCl1JC,cAAe,KAmBb,UAAA,KxCk0JH,YAAA,ICmBD,cuCh1JI,iBAAA,QAEA,sBxCi0JH,4BwC31JC,cAAe,KA8Bb,aAAA,KxCg0JH,cAAA,IwC7yJD,sBAfI,UAAA,KxCi0JD,oCwC9zJC,WvCi1JA,YAAa,KuC/0JX,eAAA,KxCi0JH,sBwCvzJD,4BvC00JE,cAAe,KuC90Jb,aAAA,KC5CJ,ezC42JD,cyC32JC,UAAA,MAGA,WACA,QAAA,MACA,QAAA,IACA,cAAA,KrCiLA,YAAA,WACK,iBAAA,KACG,OAAA,IAAA,MAAA,KJ8rJT,cAAA,IyCx3JC,mBAAoB,OAAO,IAAI,YxC24J1B,cAAe,OAAO,IAAI,YwC93J7B,WAAA,OAAA,IAAA,YAKF,iBzC22JD,eCmBC,aAAc,KACd,YAAa,KwCv3JX,mBA1BJ,kBzCk4JC,kByCv2JG,aAAA,QCzBJ,oBACE,QAAA,IACA,MAAA,KAEA,O1Cs4JD,QAAA,K0C14JC,cAAe,KAQb,OAAA,IAAA,MAAA,YAEA,cAAA,IAVJ,UAeI,WAAA,E1Ck4JH,MAAA,QCmBD,mByC/4JI,YAAA,IArBJ,SAyBI,U1C+3JH,cAAA,ECmBD,WyCx4JE,WAAA,IAFF,mBAAA,mBAMI,cAAA,KAEA,0BACA,0B1Cy3JH,SAAA,S0Cj3JC,IAAK,KCvDL,MAAA,MACA,MAAA,Q3C46JD,e0Ct3JC,MAAO,QClDL,iBAAA,Q3C26JH,aAAA,Q2Cx6JG,kB3C26JH,iBAAA,Q2Cn7JC,2BACA,MAAA,Q3Cu7JD,Y0C73JC,MAAO,QCtDL,iBAAA,Q3Cs7JH,aAAA,Q2Cn7JG,e3Cs7JH,iBAAA,Q2C97JC,wBACA,MAAA,Q3Ck8JD,e0Cp4JC,MAAO,QC1DL,iBAAA,Q3Ci8JH,aAAA,Q2C97JG,kB3Ci8JH,iBAAA,Q2Cz8JC,2BACA,MAAA,Q3C68JD,c0C34JC,MAAO,QC9DL,iBAAA,Q3C48JH,aAAA,Q2Cz8JG,iB3C48JH,iBAAA,Q4C78JC,0BAAQ,MAAA,QACR,wCAAQ,K5Cm9JP,oBAAA,KAAA,E4C/8JD,GACA,oBAAA,EAAA,GACA,mCAAQ,K5Cq9JP,oBAAA,KAAA,E4Cv9JD,GACA,oBAAA,EAAA,GACA,gCAAQ,K5Cq9JP,oBAAA,KAAA,E4C78JD,GACA,oBAAA,EAAA,GAGA,UACA,OAAA,KxCsCA,cAAA,KACQ,SAAA,OJ26JT,iBAAA,Q4C78JC,cAAe,IACf,mBAAA,MAAA,EAAA,IAAA,IAAA,eACA,WAAA,MAAA,EAAA,IAAA,IAAA,eAEA,cACA,MAAA,KACA,MAAA,EACA,OAAA,KACA,UAAA,KxCyBA,YAAA,KACQ,MAAA,KAyHR,WAAA,OACK,iBAAA,QACG,mBAAA,MAAA,EAAA,KAAA,EAAA,gBJ+zJT,WAAA,MAAA,EAAA,KAAA,EAAA,gB4C18JC,mBAAoB,MAAM,IAAI,K3Cq+JzB,cAAe,MAAM,IAAI,K4Cp+J5B,WAAA,MAAA,IAAA,KDEF,sBCAE,gCDAF,iBAAA,yK5C88JD,iBAAA,oK4Cv8JC,iBAAiB,iK3Cm+JjB,wBAAyB,KAAK,KG/gK9B,gBAAA,KAAA,KJy/JD,qBIv/JS,+BwCmDR,kBAAmB,qBAAqB,GAAG,OAAO,SErElD,aAAA,qBAAA,GAAA,OAAA,S9C4gKD,UAAA,qBAAA,GAAA,OAAA,S6Cz9JG,sBACA,iBAAA,Q7C69JH,wC4Cx8JC,iBAAkB,yKEzElB,iBAAA,oK9CohKD,iBAAA,iK6Cj+JG,mBACA,iBAAA,Q7Cq+JH,qC4C58JC,iBAAkB,yKE7ElB,iBAAA,oK9C4hKD,iBAAA,iK6Cz+JG,sBACA,iBAAA,Q7C6+JH,wC4Ch9JC,iBAAkB,yKEjFlB,iBAAA,oK9CoiKD,iBAAA,iK6Cj/JG,qBACA,iBAAA,Q7Cq/JH,uC+C5iKC,iBAAkB,yKAElB,iBAAA,oK/C6iKD,iBAAA,iK+C1iKG,O/C6iKH,WAAA,KC4BD,mB8CnkKE,WAAA,E/C4iKD,O+CxiKD,YACE,SAAA,O/C0iKD,KAAA,E+CtiKC,Y/CyiKD,MAAA,Q+CriKG,c/CwiKH,QAAA,MC4BD,4B8C9jKE,UAAA,KAGF,aAAA,mBAEE,aAAA,KAGF,YAAA,kB9C+jKE,cAAe,K8CxjKjB,YAHE,Y/CoiKD,a+ChiKC,QAAA,W/CmiKD,eAAA,I+C/hKC,c/CkiKD,eAAA,O+C7hKC,cACA,eAAA,OAMF,eACE,WAAA,EACA,cAAA,ICvDF,YAEE,aAAA,EACA,WAAA,KAQF,YACE,aAAA,EACA,cAAA,KAGA,iBACA,SAAA,SACA,QAAA,MhD6kKD,QAAA,KAAA,KgD1kKC,cAAA,KrB3BA,iBAAA,KACC,OAAA,IAAA,MAAA,KqB6BD,6BACE,uBAAA,IrBvBF,wBAAA,I3BsmKD,4BgDpkKC,cAAe,E/CgmKf,2BAA4B,I+C9lK5B,0BAAA,IAFF,kBAAA,uBAKI,MAAA,KAIF,2CAAA,gD/CgmKA,MAAO,K+C5lKL,wBAFA,wBhDykKH,6BgDxkKG,6BAKF,MAAO,KACP,gBAAA,KACA,iBAAA,QAKA,uB/C4lKA,MAAO,KACP,WAAY,K+CzlKV,0BhDmkKH,gCgDlkKG,gCALF,MAAA,K/CmmKA,OAAQ,YACR,iBAAkB,KDxBnB,mDgD5kKC,yDAAA,yD/CymKA,MAAO,QDxBR,gDgDhkKC,sDAAA,sD/C6lKA,MAAO,K+CzlKL,wBAEA,8BADA,8BhDmkKH,QAAA,EgDxkKC,MAAA,K/ComKA,iBAAkB,QAClB,aAAc,QAEhB,iDDpBC,wDCuBD,uDADA,uD+CzmKE,8DAYI,6D/C4lKN,uD+CxmKE,8D/C2mKF,6DAKE,MAAO,QDxBR,8CiD1qKG,oDADF,oDAEE,MAAA,QAEA,yBhDusKF,MAAO,QgDrsKH,iBAAA,QAFF,0BAAA,+BAKI,MAAA,QAGF,mDAAA,wDhDwsKJ,MAAO,QDtBR,gCiDhrKO,gCAGF,qCAFE,qChD2sKN,MAAO,QACP,iBAAkB,QAEpB,iCgDvsKQ,uCAFA,uChD0sKR,sCDtBC,4CiDnrKO,4CArBN,MAAA,KACE,iBAAA,QACA,aAAA,QAEA,sBhDouKF,MAAO,QgDluKH,iBAAA,QAFF,uBAAA,4BAKI,MAAA,QAGF,gDAAA,qDhDquKJ,MAAO,QDtBR,6BiD7sKO,6BAGF,kCAFE,kChDwuKN,MAAO,QACP,iBAAkB,QAEpB,8BgDpuKQ,oCAFA,oChDuuKR,mCDtBC,yCiDhtKO,yCArBN,MAAA,KACE,iBAAA,QACA,aAAA,QAEA,yBhDiwKF,MAAO,QgD/vKH,iBAAA,QAFF,0BAAA,+BAKI,MAAA,QAGF,mDAAA,wDhDkwKJ,MAAO,QDtBR,gCiD1uKO,gCAGF,qCAFE,qChDqwKN,MAAO,QACP,iBAAkB,QAEpB,iCgDjwKQ,uCAFA,uChDowKR,sCDtBC,4CiD7uKO,4CArBN,MAAA,KACE,iBAAA,QACA,aAAA,QAEA,wBhD8xKF,MAAO,QgD5xKH,iBAAA,QAFF,yBAAA,8BAKI,MAAA,QAGF,kDAAA,uDhD+xKJ,MAAO,QDtBR,+BiDvwKO,+BAGF,oCAFE,oChDkyKN,MAAO,QACP,iBAAkB,QAEpB,gCgD9xKQ,sCAFA,sChDiyKR,qCDtBC,2CiD1wKO,2CDkGN,MAAO,KACP,iBAAA,QACA,aAAA,QAEF,yBACE,WAAA,EACA,cAAA,IE1HF,sBACE,cAAA,EACA,YAAA,IAEA,O9C0DA,cAAA,KACQ,iBAAA,KJ6uKT,OAAA,IAAA,MAAA,YkDnyKC,cAAe,IACf,mBAAA,EAAA,IAAA,IAAA,gBlDqyKD,WAAA,EAAA,IAAA,IAAA,gBkD/xKC,YACA,QAAA,KvBnBC,e3BuzKF,QAAA,KAAA,KkDtyKC,cAAe,IAAI,MAAM,YAMvB,uBAAA,IlDmyKH,wBAAA,IkD7xKC,0CACA,MAAA,QAEA,alDgyKD,WAAA,EkDpyKC,cAAe,EjDg0Kf,UAAW,KACX,MAAO,QDtBR,oBkD1xKC,sBjDkzKF,eiDxzKI,mBAKJ,qBAEE,MAAA,QvBvCA,cACC,QAAA,KAAA,K3Bs0KF,iBAAA,QkDrxKC,WAAY,IAAI,MAAM,KjDizKtB,2BAA4B,IiD9yK1B,0BAAA,IAHJ,mBAAA,mCAMM,cAAA,ElDwxKL,oCkDnxKG,oDjD+yKF,aAAc,IAAI,EiD7yKZ,cAAA,EvBtEL,4D3B61KF,4EkDjxKG,WAAA,EjD6yKF,uBAAwB,IiD3yKlB,wBAAA,IvBtEL,0D3B21KF,0EkD1yKC,cAAe,EvB1Df,2BAAA,IACC,0BAAA,IuB0FH,+EAEI,uBAAA,ElD8wKH,wBAAA,EkD1wKC,wDlD6wKD,iBAAA,EC4BD,0BACE,iBAAkB,EiDlyKpB,8BlD0wKC,ckD1wKD,gCjDuyKE,cAAe,EiDvyKjB,sCAQM,sBlDwwKL,wCC4BC,cAAe,K0Br5Kf,aAAA,KuByGF,wDlDqxKC,0BC4BC,uBAAwB,IACxB,wBAAyB,IiDlzK3B,yFAoBQ,yFlDwwKP,2DkDzwKO,2DjDqyKN,uBAAwB,IACxB,wBAAyB,IAK3B,wGiD9zKA,wGjD4zKA,wGDtBC,wGCuBD,0EiD7zKA,0EjD2zKA,0EiDnyKU,0EjD2yKR,uBAAwB,IAK1B,uGiDx0KA,uGjDs0KA,uGDtBC,uGCuBD,yEiDv0KA,yEjDq0KA,yEiDzyKU,yEvB7HR,wBAAA,IuBiGF,sDlDqzKC,yBC4BC,2BAA4B,IAC5B,0BAA2B,IiDxyKrB,qFA1CR,qFAyCQ,wDlDmxKP,wDC4BC,2BAA4B,IAC5B,0BAA2B,IAG7B,oGDtBC,oGCwBD,oGiD91KA,oGjD21KA,uEiD7yKU,uEjD+yKV,uEiD71KA,uEjDm2KE,0BAA2B,IAG7B,mGDtBC,mGCwBD,mGiDx2KA,mGjDq2KA,sEiDnzKU,sEjDqzKV,sEiDv2KA,sEjD62KE,2BAA4B,IiDlzK1B,0BlD2xKH,qCkDt1KD,0BAAA,qCA+DI,WAAA,IAAA,MAAA,KA/DJ,kDAAA,kDAmEI,WAAA,EAnEJ,uBAAA,yCjD23KE,OAAQ,EiDjzKA,+CjDqzKV,+CiD/3KA,+CjDi4KA,+CAEA,+CANA,+CDjBC,iECoBD,iEiDh4KA,iEjDk4KA,iEAEA,iEANA,iEAWE,YAAa,EiD3zKL,8CjD+zKV,8CiD74KA,8CjD+4KA,8CAEA,8CANA,8CDjBC,gECoBD,gEiD94KA,gEjDg5KA,gEAEA,gEANA,gEAWE,aAAc,EAIhB,+CiD35KA,+CjDy5KA,+CiDl0KU,+CjDq0KV,iEiD55KA,iEjD05KA,iEDtBC,iEC6BC,cAAe,EAEjB,8CiDn0KU,8CjDq0KV,8CiDr6KA,8CjDo6KA,gEDtBC,gECwBD,gEiDh0KI,gEACA,cAAA,EAUJ,yBACE,cAAA,ElDmyKD,OAAA,EkD/xKG,aACA,cAAA,KANJ,oBASM,cAAA,ElDkyKL,cAAA,IkD7xKG,2BlDgyKH,WAAA,IC4BD,4BiDxzKM,cAAA,EAKF,wDAvBJ,wDlDqzKC,WAAA,IAAA,MAAA,KkD5xKK,2BlD+xKL,WAAA,EmDlhLC,uDnDqhLD,cAAA,IAAA,MAAA,KmDlhLG,eACA,aAAA,KnDshLH,8BmDxhLC,MAAA,KAMI,iBAAA,QnDqhLL,aAAA,KmDlhLK,0DACA,iBAAA,KAGJ,qCAEI,MAAA,QnDmhLL,iBAAA,KmDpiLC,yDnDuiLD,oBAAA,KmDpiLG,eACA,aAAA,QnDwiLH,8BmD1iLC,MAAA,KAMI,iBAAA,QnDuiLL,aAAA,QmDpiLK,0DACA,iBAAA,QAGJ,qCAEI,MAAA,QnDqiLL,iBAAA,KmDtjLC,yDnDyjLD,oBAAA,QmDtjLG,eACA,aAAA,QnD0jLH,8BmD5jLC,MAAA,QAMI,iBAAA,QnDyjLL,aAAA,QmDtjLK,0DACA,iBAAA,QAGJ,qCAEI,MAAA,QnDujLL,iBAAA,QmDxkLC,yDnD2kLD,oBAAA,QmDxkLG,YACA,aAAA,QnD4kLH,2BmD9kLC,MAAA,QAMI,iBAAA,QnD2kLL,aAAA,QmDxkLK,uDACA,iBAAA,QAGJ,kCAEI,MAAA,QnDykLL,iBAAA,QmD1lLC,sDnD6lLD,oBAAA,QmD1lLG,eACA,aAAA,QnD8lLH,8BmDhmLC,MAAA,QAMI,iBAAA,QnD6lLL,aAAA,QmD1lLK,0DACA,iBAAA,QAGJ,qCAEI,MAAA,QnD2lLL,iBAAA,QmD5mLC,yDnD+mLD,oBAAA,QmD5mLG,cACA,aAAA,QnDgnLH,6BmDlnLC,MAAA,QAMI,iBAAA,QnD+mLL,aAAA,QmD5mLK,yDACA,iBAAA,QAGJ,oCAEI,MAAA,QnD6mLL,iBAAA,QoD5nLC,wDACA,oBAAA,QAEA,kBACA,SAAA,SpD+nLD,QAAA,MoDpoLC,OAAQ,EnDgqLR,QAAS,EACT,SAAU,OAEZ,yCmDtpLI,wBADA,yBAEA,yBACA,wBACA,SAAA,SACA,IAAA,EACA,OAAA,EpD+nLH,KAAA,EoD1nLC,MAAO,KACP,OAAA,KpD4nLD,OAAA,EoDvnLC,wBpD0nLD,eAAA,OqDppLC,uBACA,eAAA,IAEA,MACA,WAAA,KACA,QAAA,KjDwDA,cAAA,KACQ,iBAAA,QJgmLT,OAAA,IAAA,MAAA,QqD/pLC,cAAe,IASb,mBAAA,MAAA,EAAA,IAAA,IAAA,gBACA,WAAA,MAAA,EAAA,IAAA,IAAA,gBAKJ,iBACE,aAAA,KACA,aAAA,gBAEF,SACE,QAAA,KACA,cAAA,ICtBF,SACE,QAAA,IACA,cAAA,IAEA,OACA,MAAA,MACA,UAAA,KjCRA,YAAA,IAGA,YAAA,ErBqrLD,MAAA,KsD7qLC,YAAA,EAAA,IAAA,EAAA,KrDysLA,OAAQ,kBqDvsLN,QAAA,GjCbF,aiCeE,ajCZF,MAAA,KrB6rLD,gBAAA,KsDzqLC,OAAA,QACE,OAAA,kBACA,QAAA,GAEA,aACA,mBAAA,KtD2qLH,QAAA,EuDhsLC,OAAQ,QACR,WAAA,IvDksLD,OAAA,EuD7rLC,YACA,SAAA,OAEA,OACA,SAAA,MACA,IAAA,EACA,MAAA,EACA,OAAA,EACA,KAAA,EAIA,QAAA,KvD6rLD,QAAA,KuD1rLC,SAAA,OnD+GA,2BAAA,MACI,QAAA,EAEI,0BAkER,mBAAA,kBAAA,IAAA,SAEK,cAAA,aAAA,IAAA,SACG,WAAA,UAAA,IAAA,SJ6gLT,kBAAA,kBuDhsLC,cAAA,kBnD2GA,aAAA,kBACI,UAAA,kBAEI,wBJwlLT,kBAAA,euDpsLK,cAAe,eACnB,aAAA,eACA,UAAA,eAIF,mBACE,WAAA,OACA,WAAA,KvDqsLD,cuDhsLC,SAAU,SACV,MAAA,KACA,OAAA,KAEA,eACA,SAAA,SnDaA,iBAAA,KACQ,wBAAA,YmDZR,gBAAA,YtD4tLA,OsD5tLA,IAAA,MAAA,KAEA,OAAA,IAAA,MAAA,evDksLD,cAAA,IuD9rLC,QAAS,EACT,mBAAA,EAAA,IAAA,IAAA,eACA,WAAA,EAAA,IAAA,IAAA,eAEA,gBACA,SAAA,MACA,IAAA,EACA,MAAA,EvDgsLD,OAAA,EuD9rLC,KAAA,ElCrEA,QAAA,KAGA,iBAAA,KkCmEA,qBlCtEA,OAAA,iBAGA,QAAA,EkCwEF,mBACE,OAAA,kBACA,QAAA,GAIF,cACE,QAAA,KvDgsLD,cAAA,IAAA,MAAA,QuD3rLC,qBACA,WAAA,KAKF,aACE,OAAA,EACA,YAAA,WAIF,YACE,SAAA,SACA,QAAA,KvD0rLD,cuD5rLC,QAAS,KAQP,WAAA,MACA,WAAA,IAAA,MAAA,QATJ,wBAaI,cAAA,EvDsrLH,YAAA,IuDlrLG,mCvDqrLH,YAAA,KuD/qLC,oCACA,YAAA,EAEA,yBACA,SAAA,SvDkrLD,IAAA,QuDhqLC,MAAO,KAZP,OAAA,KACE,SAAA,OvDgrLD,yBuD7qLD,cnDvEA,MAAA,MACQ,OAAA,KAAA,KmD2ER,eAAY,mBAAA,EAAA,IAAA,KAAA,evD+qLX,WAAA,EAAA,IAAA,KAAA,euDzqLD,UAFA,MAAA,OvDirLD,yBwD/zLC,UACA,MAAA,OCNA,SAEA,SAAA,SACA,QAAA,KACA,QAAA,MACA,YAAA,iBAAA,UAAA,MAAA,WACA,UAAA,KACA,WAAA,OACA,YAAA,IACA,YAAA,WACA,WAAA,KACA,WAAA,MACA,gBAAA,KACA,YAAA,KACA,eAAA,KACA,eAAA,ODHA,WAAA,OnCVA,aAAA,OAGA,UAAA,OrBs1LD,YAAA,OwD30LC,OAAA,iBnCdA,QAAA,ErB61LD,WAAA,KwD90LY,YAAmB,OAAA,kBxDk1L/B,QAAA,GwDj1LY,aAAmB,QAAA,IAAA,ExDq1L/B,WAAA,KwDp1LY,eAAmB,QAAA,EAAA,IxDw1L/B,YAAA,IwDv1LY,gBAAmB,QAAA,IAAA,ExD21L/B,WAAA,IwDt1LC,cACA,QAAA,EAAA,IACA,YAAA,KAEA,eACA,UAAA,MxDy1LD,QAAA,IAAA,IwDr1LC,MAAO,KACP,WAAA,OACA,iBAAA,KACA,cAAA,IAEA,exDu1LD,SAAA,SwDn1LC,MAAA,EACE,OAAA,EACA,aAAA,YACA,aAAA,MAEA,4BxDq1LH,OAAA,EwDn1LC,KAAA,IACE,YAAA,KACA,aAAA,IAAA,IAAA,EACA,iBAAA,KAEA,iCxDq1LH,MAAA,IwDn1LC,OAAA,EACE,cAAA,KACA,aAAA,IAAA,IAAA,EACA,iBAAA,KAEA,kCxDq1LH,OAAA,EwDn1LC,KAAA,IACE,cAAA,KACA,aAAA,IAAA,IAAA,EACA,iBAAA,KAEA,8BxDq1LH,IAAA,IwDn1LC,KAAA,EACE,WAAA,KACA,aAAA,IAAA,IAAA,IAAA,EACA,mBAAA,KAEA,6BxDq1LH,IAAA,IwDn1LC,MAAA,EACE,WAAA,KACA,aAAA,IAAA,EAAA,IAAA,IACA,kBAAA,KAEA,+BxDq1LH,IAAA,EwDn1LC,KAAA,IACE,YAAA,KACA,aAAA,EAAA,IAAA,IACA,oBAAA,KAEA,oCxDq1LH,IAAA,EwDn1LC,MAAA,IACE,WAAA,KACA,aAAA,EAAA,IAAA,IACA,oBAAA,KAEA,qCxDq1LH,IAAA,E0Dl7LC,KAAM,IACN,WAAA,KACA,aAAA,EAAA,IAAA,IACA,oBAAA,KAEA,SACA,SAAA,SACA,IAAA,EDXA,KAAA,EAEA,QAAA,KACA,QAAA,KACA,UAAA,MACA,QAAA,IACA,YAAA,iBAAA,UAAA,MAAA,WACA,UAAA,KACA,WAAA,OACA,YAAA,IACA,YAAA,WACA,WAAA,KACA,WAAA,MACA,gBAAA,KACA,YAAA,KACA,eAAA,KCAA,eAAA,OAEA,WAAA,OACA,aAAA,OAAA,UAAA,OACA,YAAA,OACA,iBAAA,KACA,wBAAA,YtD8CA,gBAAA,YACQ,OAAA,IAAA,MAAA,KJk5LT,OAAA,IAAA,MAAA,e0D77LC,cAAA,IAAY,mBAAA,EAAA,IAAA,KAAA,e1Dg8Lb,WAAA,EAAA,IAAA,KAAA,e0D/7La,WAAA,KACZ,aAAY,WAAA,MACZ,eAAY,YAAA,KAGd,gBACE,WAAA,KAEA,cACA,YAAA,MAEA,e1Dq8LD,QAAA,IAAA,K0Dl8LC,OAAQ,EACR,UAAA,K1Do8LD,iBAAA,Q0D57LC,cAAA,IAAA,MAAA,QzDy9LA,cAAe,IAAI,IAAI,EAAE,EyDt9LvB,iBACA,QAAA,IAAA,KAEA,gBACA,sB1D87LH,SAAA,S0D37LC,QAAS,MACT,MAAA,E1D67LD,OAAA,E0D37LC,aAAc,YACd,aAAA,M1D87LD,gB0Dz7LC,aAAA,KAEE,sBACA,QAAA,GACA,aAAA,KAEA,oB1D27LH,OAAA,M0D17LG,KAAA,IACE,YAAA,MACA,iBAAA,KACA,iBAAA,gBACA,oBAAA,E1D67LL,0B0Dz7LC,OAAA,IACE,YAAA,MACA,QAAA,IACA,iBAAA,KACA,oBAAA,EAEA,sB1D27LH,IAAA,I0D17LG,KAAA,MACE,WAAA,MACA,mBAAA,KACA,mBAAA,gBACA,kBAAA,E1D67LL,4B0Dz7LC,OAAA,MACE,KAAA,IACA,QAAA,IACA,mBAAA,KACA,kBAAA,EAEA,uB1D27LH,IAAA,M0D17LG,KAAA,IACE,YAAA,MACA,iBAAA,EACA,oBAAA,KACA,oBAAA,gB1D67LL,6B0Dx7LC,IAAA,IACE,YAAA,MACA,QAAA,IACA,iBAAA,EACA,oBAAA,KAEA,qB1D07LH,IAAA,I0Dz7LG,MAAA,MACE,WAAA,MACA,mBAAA,EACA,kBAAA,KACA,kBAAA,gB1D47LL,2B2DpjMC,MAAO,IACP,OAAA,M3DsjMD,QAAA,I2DnjMC,mBAAoB,EACpB,kBAAA,KAEA,U3DqjMD,SAAA,S2DljMG,gBACA,SAAA,SvD6KF,MAAA,KACK,SAAA,OJ04LN,sB2D/jMC,SAAU,S1D4lMV,QAAS,K0D9kML,mBAAA,IAAA,YAAA,K3DqjML,cAAA,IAAA,YAAA,K2D3hMC,WAAA,IAAA,YAAA,KvDmKK,4BAFL,0BAGQ,YAAA,EA3JA,qDA+GR,sBAEQ,mBAAA,kBAAA,IAAA,YJ86LP,cAAA,aAAA,IAAA,Y2DzjMG,WAAA,UAAA,IAAA,YvDmHJ,4BAAA,OACQ,oBAAA,OuDjHF,oBAAA,O3D4jML,YAAA,OI58LD,mCHs+LA,2BGr+LQ,KAAA,EuD5GF,kBAAA,sB3D6jML,UAAA,sBC2BD,kCADA,2BG5+LA,KAAA,EACQ,kBAAA,uBuDtGF,UAAA,uBArCN,6B3DomMD,gC2DpmMC,iC1D+nME,KAAM,E0DllMN,kBAAA,mB3D4jMH,UAAA,oBAGA,wB2D5mMD,sBAAA,sBAsDI,QAAA,MAEA,wB3D0jMH,KAAA,E2DtjMG,sB3DyjMH,sB2DrnMC,SAAU,SA+DR,IAAA,E3DyjMH,MAAA,KC0BD,sB0D/kMI,KAAA,KAnEJ,sBAuEI,KAAA,MAvEJ,2BA0EI,4B3DwjMH,KAAA,E2D/iMC,6BACA,KAAA,MAEA,8BACA,KAAA,KtC3FA,kBsC6FA,SAAA,SACA,IAAA,EACA,OAAA,EACA,KAAA,EACA,MAAA,I3DmjMD,UAAA,K2D9iMC,MAAA,KdnGE,WAAA,OACA,YAAA,EAAA,IAAA,IAAA,eACA,iBAAA,cAAA,OAAA,kBACA,QAAA,G7CqpMH,uB2DljMC,iBAAA,sEACE,iBAAA,iEACA,iBAAA,uFdxGA,iBAAA,kEACA,OAAA,+GACA,kBAAA,SACA,wBACA,MAAA,E7C6pMH,KAAA,K2DpjMC,iBAAA,sE1DglMA,iBAAiB,iE0D9kMf,iBAAA,uFACA,iBAAA,kEACA,OAAA,+GtCvHF,kBAAA,SsCyFF,wB3DslMC,wBC4BC,MAAO,KACP,gBAAiB,KACjB,OAAQ,kB0D7kMN,QAAA,EACA,QAAA,G3DwjMH,0C2DhmMD,2CA2CI,6BADA,6B1DklMF,SAAU,S0D7kMR,IAAA,IACA,QAAA,E3DqjMH,QAAA,a2DrmMC,WAAY,MAqDV,0CADA,6B3DsjMH,KAAA,I2D1mMC,YAAa,MA0DX,2CADA,6BAEA,MAAA,IACA,aAAA,MAME,6BADF,6B3DmjMH,MAAA,K2D9iMG,OAAA,KACE,YAAA,M3DgjML,YAAA,E2DriMC,oCACA,QAAA,QAEA,oCACA,QAAA,QAEA,qBACA,SAAA,SACA,OAAA,K3DwiMD,KAAA,I2DjjMC,QAAS,GAYP,MAAA,IACA,aAAA,EACA,YAAA,KACA,WAAA,OACA,WAAA,KAEA,wBACA,QAAA,aAWA,MAAA,KACA,OAAA,K3D8hMH,OAAA,I2D7jMC,YAAa,OAkCX,OAAA,QACA,iBAAA,OACA,iBAAA,cACA,OAAA,IAAA,MAAA,K3D8hMH,cAAA,K2DthMC,6BACA,MAAA,KACA,OAAA,KACA,OAAA,EACA,iBAAA,KAEA,kBACA,SAAA,SACA,MAAA,IACA,OAAA,K3DyhMD,KAAA,I2DxhMC,QAAA,GACE,YAAA,K3D0hMH,eAAA,K2Dj/LC,MAAO,KAhCP,WAAA,O1D8iMA,YAAa,EAAE,IAAI,IAAI,eAEzB,uB0D3iMM,YAAA,KAEA,oCACA,0C3DmhMH,2C2D3hMD,6BAAA,6BAYI,MAAA,K3DmhMH,OAAA,K2D/hMD,WAAA,M1D2jME,UAAW,KDxBZ,0C2D9gMD,6BACE,YAAA,MAEA,2C3DghMD,6B2D5gMD,aAAA,M3D+gMC,kBACF,MAAA,I4D7wMC,KAAA,I3DyyME,eAAgB,KAElB,qBACE,OAAQ,MAkBZ,qCADA,sCADA,mBADA,oBAXA,gBADA,iBAOA,uBADA,wBADA,iBADA,kBADA,wBADA,yBASA,mCADA,oC2DpzME,oBAAA,qBAAA,oBAAA,qB3D2zMF,WADA,YAOA,uBADA,wBADA,qBADA,sBADA,cADA,e2D/zMI,a3Dq0MJ,cDvBC,kB4D7yMG,mB3DqzMJ,WADA,YAwBE,QAAS,MACT,QAAS,IASX,qCADA,mBANA,gBAGA,uBADA,iBADA,wBAIA,mCDhBC,oB6D/0MC,oB5Dk2MF,W+B51MA,uBhCo0MC,qB4D5zMG,cChBF,aACA,kB5D+1MF,W+Br1ME,MAAO,KhCy0MR,cgCt0MC,QAAS,MACT,aAAA,KhCw0MD,YAAA,KgC/zMC,YhCk0MD,MAAA,gBgC/zMC,WhCk0MD,MAAA,egC/zMC,MhCk0MD,QAAA,e8Dz1MC,MACA,QAAA,gBAEA,WACA,WAAA,O9B8BF,WACE,KAAA,EAAA,EAAA,EhCg0MD,MAAA,YgCzzMC,YAAa,KACb,iBAAA,YhC2zMD,OAAA,E+D31MC,Q/D81MD,QAAA,eC4BD,OACE,SAAU,M+Dn4MV,chE42MD,MAAA,aC+BD,YADA,YADA,YADA,YAIE,QAAS,e+Dp5MT,kBhEs4MC,mBgEr4MD,yBhEi4MD,kB+Dl1MD,mBA6IA,yB9D4tMA,kBACA,mB8Dj3ME,yB9D62MF,kBACA,mBACA,yB+Dv5MY,QAAA,eACV,yBAAU,YhE04MT,QAAA,gBC4BD,iB+Dp6MU,QAAA,gBhE64MX,c+D51MG,QAAS,oB/Dg2MV,c+Dl2MC,c/Dm2MH,QAAA,sB+D91MG,yB/Dk2MD,kBACF,QAAA,iB+D91MG,yB/Dk2MD,mBACF,QAAA,kBgEh6MC,yBhEo6MC,yBgEn6MD,QAAA,wBACA,+CAAU,YhEw6MT,QAAA,gBC4BD,iB+Dl8MU,QAAA,gBhE26MX,c+Dr2MG,QAAS,oB/Dy2MV,c+D32MC,c/D42MH,QAAA,sB+Dv2MG,+C/D22MD,kBACF,QAAA,iB+Dv2MG,+C/D22MD,mBACF,QAAA,kBgE97MC,+ChEk8MC,yBgEj8MD,QAAA,wBACA,gDAAU,YhEs8MT,QAAA,gBC4BD,iB+Dh+MU,QAAA,gBhEy8MX,c+D92MG,QAAS,oB/Dk3MV,c+Dp3MC,c/Dq3MH,QAAA,sB+Dh3MG,gD/Do3MD,kBACF,QAAA,iB+Dh3MG,gD/Do3MD,mBACF,QAAA,kBgE59MC,gDhEg+MC,yBgE/9MD,QAAA,wBACA,0BAAU,YhEo+MT,QAAA,gBC4BD,iB+D9/MU,QAAA,gBhEu+MX,c+Dv3MG,QAAS,oB/D23MV,c+D73MC,c/D83MH,QAAA,sB+Dz3MG,0B/D63MD,kBACF,QAAA,iB+Dz3MG,0B/D63MD,mBACF,QAAA,kBgEl/MC,0BhEs/MC,yBACF,QAAA,wBgEv/MC,yBhE2/MC,WACF,QAAA,gBgE5/MC,+ChEggNC,WACF,QAAA,gBgEjgNC,gDhEqgNC,WACF,QAAA,gBAGA,0B+Dh3MC,WA4BE,QAAS,gBC5LX,eAAU,QAAA,eACV,aAAU,ehEyhNT,QAAA,gBC4BD,oB+DnjNU,QAAA,gBhE4hNX,iB+D93MG,QAAS,oBAMX,iB/D23MD,iB+Dt2MG,QAAS,sB/D22MZ,qB+D/3MC,QAAS,e/Dk4MV,a+D53MC,qBAcE,QAAS,iB/Dm3MZ,sB+Dh4MC,QAAS,e/Dm4MV,a+D73MC,sBAOE,QAAS,kB/D23MZ,4B+D53MC,QAAS,eCpLT,ahEojNC,4BACF,QAAA,wBC6BD,aACE,cACE,QAAS","sourcesContent":["/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n\n//\n// 1. Set default font family to sans-serif.\n// 2. Prevent iOS and IE text size adjust after device orientation change,\n// without disabling user zoom.\n//\n\nhtml {\n font-family: sans-serif; // 1\n -ms-text-size-adjust: 100%; // 2\n -webkit-text-size-adjust: 100%; // 2\n}\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// Correct `block` display not defined for any HTML5 element in IE 8/9.\n// Correct `block` display not defined for `details` or `summary` in IE 10/11\n// and Firefox.\n// Correct `block` display not defined for `main` in IE 11.\n//\n\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\n\n//\n// 1. Correct `inline-block` display not defined in IE 8/9.\n// 2. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block; // 1\n vertical-align: baseline; // 2\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n// Remove excess height in iOS 5 devices.\n//\n\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n\n//\n// Address `[hidden]` styling not present in IE 8/9/10.\n// Hide the `template` element in IE 8/9/10/11, Safari, and Firefox < 22.\n//\n\n[hidden],\ntemplate {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Remove the gray background color from active links in IE 10.\n//\n\na {\n background-color: transparent;\n}\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address styling not present in IE 8/9.\n//\n\nmark {\n background: #ff0;\n color: #000;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Embedded content\n// ==========================================================================\n\n//\n// Remove border when inside `a` element in IE 8/9/10.\n//\n\nimg {\n border: 0;\n}\n\n//\n// Correct overflow not hidden in IE 9/10/11.\n//\n\nsvg:not(:root) {\n overflow: hidden;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address margin not present in IE 8/9 and Safari.\n//\n\nfigure {\n margin: 1em 40px;\n}\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address `overflow` set to `hidden` in IE 8/9/10/11.\n//\n\nbutton {\n overflow: visible;\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n// Correct `button` style inheritance in Firefox, IE 8/9/10/11, and Opera.\n// Correct `select` style inheritance in Firefox.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Avoid the WebKit bug in Android 4.0.* where (2) destroys native `audio`\n// and `video` controls.\n// 2. Correct inability to style clickable `input` types in iOS.\n// 3. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\nhtml input[type=\"button\"], // 1\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button; // 2\n cursor: pointer; // 3\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Remove inner padding and border in Firefox 4+.\n//\n\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\n\n//\n// Address Firefox 4+ setting `line-height` on `input` using `!important` in\n// the UA stylesheet.\n//\n\ninput {\n line-height: normal;\n}\n\n//\n// It's recommended that you don't attempt to style these elements.\n// Firefox's implementation doesn't respect box-sizing, padding, or width.\n//\n// 1. Address box sizing set to `content-box` in IE 8/9/10.\n// 2. Remove excess padding in IE 8/9/10.\n//\n\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box; // 1\n padding: 0; // 2\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Correct `color` not being inherited in IE 8/9/10/11.\n// 2. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n border: 0; // 1\n padding: 0; // 2\n}\n\n//\n// Remove default vertical scrollbar in IE 8/9/10/11.\n//\n\ntextarea {\n overflow: auto;\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n\n// ==========================================================================\n// Print styles.\n// Inlined to avoid the additional HTTP request: h5bp.com/r\n// ==========================================================================\n\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important; // Black prints faster: h5bp.com/s\n box-shadow: none !important;\n text-shadow: none !important;\n }\n\n a,\n a:visited {\n text-decoration: underline;\n }\n\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n\n // Don't show links that are fragment identifiers,\n // or use the `javascript:` pseudo protocol\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n\n thead {\n display: table-header-group; // h5bp.com/t\n }\n\n tr,\n img {\n page-break-inside: avoid;\n }\n\n img {\n max-width: 100% !important;\n }\n\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n\n h2,\n h3 {\n page-break-after: avoid;\n }\n\n // Bootstrap specific changes start\n\n // Bootstrap components\n .navbar {\n display: none;\n }\n .btn,\n .dropup > .btn {\n > .caret {\n border-top-color: #000 !important;\n }\n }\n .label {\n border: 1px solid #000;\n }\n\n .table {\n border-collapse: collapse !important;\n\n td,\n th {\n background-color: #fff !important;\n }\n }\n .table-bordered {\n th,\n td {\n border: 1px solid #ddd !important;\n }\n }\n\n // Bootstrap specific changes end\n}\n","/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -ms-text-size-adjust: 100%;\n -webkit-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: 1px dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\nmark {\n background: #ff0;\n color: #000;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\nsup {\n top: -0.5em;\n}\nsub {\n bottom: -0.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n box-sizing: content-box;\n height: 0;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit;\n font: inherit;\n margin: 0;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n border: 0;\n padding: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: textfield;\n box-sizing: content-box;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n border: 1px solid #c0c0c0;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\nlegend {\n border: 0;\n padding: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n background: transparent !important;\n color: #000 !important;\n box-shadow: none !important;\n text-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('../fonts/glyphicons-halflings-regular.eot');\n src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\002a\";\n}\n.glyphicon-plus:before {\n content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333333;\n background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n padding: 4px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: all 0.2s ease-in-out;\n -o-transition: all 0.2s ease-in-out;\n transition: all 0.2s ease-in-out;\n display: inline-block;\n max-width: 100%;\n height: auto;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eeeeee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n background-color: #fcf8e3;\n padding: .2em;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eeeeee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n list-style: none;\n margin-left: -5px;\n}\n.list-inline > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n clear: left;\n text-align: right;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777777;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eeeeee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid #eeeeee;\n border-left: 0;\n text-align: right;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: '\\00A0 \\2014';\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n word-break: break-all;\n word-wrap: break-word;\n color: #333333;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n margin-right: auto;\n margin-left: auto;\n padding-left: 15px;\n padding-right: 15px;\n}\n.row {\n margin-left: -15px;\n margin-right: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0%;\n}\n@media (min-width: 768px) {\n .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 992px) {\n .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0%;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0%;\n }\n}\ntable {\n background-color: transparent;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #ddd;\n}\n.table .table {\n background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-column;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n float: none;\n display: table-cell;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n min-width: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555555;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n -webkit-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);\n}\n.form-control::-moz-placeholder {\n color: #999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999;\n}\n.form-control::-ms-expand {\n border: 0;\n background-color: transparent;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eeeeee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.form-control-static {\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n min-height: 34px;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-left: 0;\n padding-right: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n border-color: #3c763d;\n background-color: #dff0d8;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n border-color: #8a6d3b;\n background-color: #fcf8e3;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n border-color: #a94442;\n background-color: #f2dede;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: 7px;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-left: -15px;\n margin-right: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: 7px;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n margin-bottom: 0;\n font-weight: normal;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none;\n border: 1px solid transparent;\n white-space: nowrap;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n border-radius: 4px;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n outline: 0;\n background-image: none;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n opacity: 0.65;\n filter: alpha(opacity=65);\n -webkit-box-shadow: none;\n box-shadow: none;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333;\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n background-image: none;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default .badge {\n color: #fff;\n background-color: #333;\n}\n.btn-primary {\n color: #fff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #fff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #fff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n background-image: none;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #fff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #fff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n background-image: none;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #fff;\n}\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #fff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #fff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n background-image: none;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #fff;\n}\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #fff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #fff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n background-image: none;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #fff;\n}\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #fff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #fff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n background-image: none;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #fff;\n}\n.btn-link {\n color: #337ab7;\n font-weight: normal;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity 0.15s linear;\n -o-transition: opacity 0.15s linear;\n transition: opacity 0.15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-property: height, visibility;\n transition-property: height, visibility;\n -webkit-transition-duration: 0.35s;\n transition-duration: 0.35s;\n -webkit-transition-timing-function: ease;\n transition-timing-function: ease;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n list-style: none;\n font-size: 14px;\n text-align: left;\n background-color: #fff;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);\n background-clip: padding-box;\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857143;\n color: #333333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n text-decoration: none;\n color: #262626;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n outline: 0;\n background-color: #337ab7;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n cursor: not-allowed;\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n left: auto;\n right: 0;\n}\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n content: \"\";\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n left: auto;\n right: 0;\n }\n .navbar-right .dropdown-menu-left {\n left: 0;\n right: auto;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group .form-control:focus {\n z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555555;\n text-align: center;\n background-color: #eeeeee;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-bottom-right-radius: 0;\n border-top-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-bottom-left-radius: 0;\n border-top-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n margin-bottom: 0;\n padding-left: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.nav > li.disabled > a {\n color: #777777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777777;\n text-decoration: none;\n background-color: transparent;\n cursor: not-allowed;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eeeeee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eeeeee #eeeeee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555555;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n cursor: default;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n text-align: center;\n margin-bottom: 5px;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n overflow-x: visible;\n padding-right: 15px;\n padding-left: 15px;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);\n -webkit-overflow-scrolling: touch;\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-left: 0;\n padding-right: 0;\n }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.navbar-brand {\n float: left;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n height: 50px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: 15px;\n padding: 9px 10px;\n margin-top: 8px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n margin-left: -15px;\n margin-right: -15px;\n padding: 10px 15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);\n margin-top: 8px;\n margin-bottom: 8px;\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-left: 15px;\n margin-right: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n background-color: #e7e7e7;\n color: #555;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-link {\n color: #777;\n}\n.navbar-default .navbar-link:hover {\n color: #333;\n}\n.navbar-default .btn-link {\n color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #ccc;\n}\n.navbar-inverse {\n background-color: #222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #fff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n background-color: #080808;\n color: #fff;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #fff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #fff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n content: \"/\\00a0\";\n padding: 0 5px;\n color: #ccc;\n}\n.breadcrumb > .active {\n color: #777777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n line-height: 1.42857143;\n text-decoration: none;\n color: #337ab7;\n background-color: #fff;\n border: 1px solid #ddd;\n margin-left: -1px;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-bottom-left-radius: 4px;\n border-top-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-bottom-right-radius: 4px;\n border-top-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 2;\n color: #23527c;\n background-color: #eeeeee;\n border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n cursor: default;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777777;\n background-color: #fff;\n border-color: #ddd;\n cursor: not-allowed;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-bottom-left-radius: 6px;\n border-top-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-bottom-right-radius: 6px;\n border-top-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-bottom-left-radius: 3px;\n border-top-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-bottom-right-radius: 3px;\n border-top-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n list-style: none;\n text-align: center;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eeeeee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777777;\n background-color: #fff;\n cursor: not-allowed;\n}\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n color: #fff;\n line-height: 1;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: #777777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eeeeee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n border-radius: 6px;\n padding-left: 15px;\n padding-right: 15px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-left: 60px;\n padding-right: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: border 0.2s ease-in-out;\n -o-transition: border 0.2s ease-in-out;\n transition: border 0.2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-left: auto;\n margin-right: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n background-color: #dff0d8;\n border-color: #d6e9c6;\n color: #3c763d;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n background-color: #d9edf7;\n border-color: #bce8f1;\n color: #31708f;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n background-color: #fcf8e3;\n border-color: #faebcc;\n color: #8a6d3b;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n background-color: #f2dede;\n border-color: #ebccd1;\n color: #a94442;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n overflow: hidden;\n height: 20px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);\n}\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);\n -webkit-transition: width 0.6s ease;\n -o-transition: width 0.6s ease;\n transition: width 0.6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n margin-bottom: 20px;\n padding-left: 0;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n border-top-right-radius: 4px;\n border-top-left-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n text-decoration: none;\n color: #555;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n background-color: #eeeeee;\n color: #777777;\n cursor: not-allowed;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #ddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-right-radius: 0;\n border-top-left-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-left: 15px;\n padding-right: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-right-radius: 3px;\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-left-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n border: 0;\n margin-bottom: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ddd;\n}\n.panel-default {\n border-color: #ddd;\n}\n.panel-default > .panel-heading {\n color: #333333;\n background-color: #f5f5f5;\n border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, 0.15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n opacity: 0.2;\n filter: alpha(opacity=20);\n}\n.close:hover,\n.close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\nbutton.close {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n -webkit-transition: -webkit-transform 0.3s ease-out;\n -moz-transition: -moz-transform 0.3s ease-out;\n -o-transition: -o-transform 0.3s ease-out;\n transition: transform 0.3s ease-out;\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #fff;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, 0.5);\n background-clip: padding-box;\n outline: 0;\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n.modal-backdrop.fade {\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.modal-backdrop.in {\n opacity: 0.5;\n filter: alpha(opacity=50);\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, 0.5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 12px;\n opacity: 0;\n filter: alpha(opacity=0);\n}\n.tooltip.in {\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.tooltip.top {\n margin-top: -3px;\n padding: 5px 0;\n}\n.tooltip.right {\n margin-left: 3px;\n padding: 0 5px;\n}\n.tooltip.bottom {\n margin-top: 3px;\n padding: 5px 0;\n}\n.tooltip.left {\n margin-left: -3px;\n padding: 0 5px;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n bottom: 0;\n right: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n font-size: 14px;\n background-color: #fff;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, 0.2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover-title {\n margin: 0;\n padding: 8px 14px;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow:after {\n border-width: 10px;\n content: \"\";\n}\n.popover.top > .arrow {\n left: 50%;\n margin-left: -11px;\n border-bottom-width: 0;\n border-top-color: #999999;\n border-top-color: rgba(0, 0, 0, 0.25);\n bottom: -11px;\n}\n.popover.top > .arrow:after {\n content: \" \";\n bottom: 1px;\n margin-left: -10px;\n border-bottom-width: 0;\n border-top-color: #fff;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-left-width: 0;\n border-right-color: #999999;\n border-right-color: rgba(0, 0, 0, 0.25);\n}\n.popover.right > .arrow:after {\n content: \" \";\n left: 1px;\n bottom: -10px;\n border-left-width: 0;\n border-right-color: #fff;\n}\n.popover.bottom > .arrow {\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999999;\n border-bottom-color: rgba(0, 0, 0, 0.25);\n top: -11px;\n}\n.popover.bottom > .arrow:after {\n content: \" \";\n top: 1px;\n margin-left: -10px;\n border-top-width: 0;\n border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999999;\n border-left-color: rgba(0, 0, 0, 0.25);\n}\n.popover.left > .arrow:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: #fff;\n bottom: -10px;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n}\n.carousel-inner > .item {\n display: none;\n position: relative;\n -webkit-transition: 0.6s ease-in-out left;\n -o-transition: 0.6s ease-in-out left;\n transition: 0.6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform 0.6s ease-in-out;\n -moz-transition: -moz-transform 0.6s ease-in-out;\n -o-transition: -o-transform 0.6s ease-in-out;\n transition: transform 0.6s ease-in-out;\n -webkit-backface-visibility: hidden;\n -moz-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n -moz-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n left: 0;\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n left: 0;\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: 15%;\n opacity: 0.5;\n filter: alpha(opacity=50);\n font-size: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.5) 0%, rgba(0, 0, 0, 0.0001) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n}\n.carousel-control.right {\n left: auto;\n right: 0;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-image: linear-gradient(to right, rgba(0, 0, 0, 0.0001) 0%, rgba(0, 0, 0, 0.5) 100%);\n background-repeat: repeat-x;\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n}\n.carousel-control:hover,\n.carousel-control:focus {\n outline: 0;\n color: #fff;\n text-decoration: none;\n opacity: 0.9;\n filter: alpha(opacity=90);\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n}\n.carousel-control .icon-prev:before {\n content: '\\2039';\n}\n.carousel-control .icon-next:before {\n content: '\\203a';\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid #fff;\n border-radius: 10px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n}\n.carousel-indicators .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: #fff;\n}\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -10px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -10px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -10px;\n }\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n content: \" \";\n display: table;\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */","/*!\n * Bootstrap v3.3.7 (http://getbootstrap.com)\n * Copyright 2011-2016 Twitter, Inc.\n * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)\n */\n/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\nhtml {\n font-family: sans-serif;\n -webkit-text-size-adjust: 100%;\n -ms-text-size-adjust: 100%;\n}\nbody {\n margin: 0;\n}\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmain,\nmenu,\nnav,\nsection,\nsummary {\n display: block;\n}\naudio,\ncanvas,\nprogress,\nvideo {\n display: inline-block;\n vertical-align: baseline;\n}\naudio:not([controls]) {\n display: none;\n height: 0;\n}\n[hidden],\ntemplate {\n display: none;\n}\na {\n background-color: transparent;\n}\na:active,\na:hover {\n outline: 0;\n}\nabbr[title] {\n border-bottom: 1px dotted;\n}\nb,\nstrong {\n font-weight: bold;\n}\ndfn {\n font-style: italic;\n}\nh1 {\n margin: .67em 0;\n font-size: 2em;\n}\nmark {\n color: #000;\n background: #ff0;\n}\nsmall {\n font-size: 80%;\n}\nsub,\nsup {\n position: relative;\n font-size: 75%;\n line-height: 0;\n vertical-align: baseline;\n}\nsup {\n top: -.5em;\n}\nsub {\n bottom: -.25em;\n}\nimg {\n border: 0;\n}\nsvg:not(:root) {\n overflow: hidden;\n}\nfigure {\n margin: 1em 40px;\n}\nhr {\n height: 0;\n -webkit-box-sizing: content-box;\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n}\npre {\n overflow: auto;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n margin: 0;\n font: inherit;\n color: inherit;\n}\nbutton {\n overflow: visible;\n}\nbutton,\nselect {\n text-transform: none;\n}\nbutton,\nhtml input[type=\"button\"],\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n -webkit-appearance: button;\n cursor: pointer;\n}\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\nbutton::-moz-focus-inner,\ninput::-moz-focus-inner {\n padding: 0;\n border: 0;\n}\ninput {\n line-height: normal;\n}\ninput[type=\"checkbox\"],\ninput[type=\"radio\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n padding: 0;\n}\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: content-box;\n -moz-box-sizing: content-box;\n box-sizing: content-box;\n -webkit-appearance: textfield;\n}\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\nfieldset {\n padding: .35em .625em .75em;\n margin: 0 2px;\n border: 1px solid #c0c0c0;\n}\nlegend {\n padding: 0;\n border: 0;\n}\ntextarea {\n overflow: auto;\n}\noptgroup {\n font-weight: bold;\n}\ntable {\n border-spacing: 0;\n border-collapse: collapse;\n}\ntd,\nth {\n padding: 0;\n}\n/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */\n@media print {\n *,\n *:before,\n *:after {\n color: #000 !important;\n text-shadow: none !important;\n background: transparent !important;\n -webkit-box-shadow: none !important;\n box-shadow: none !important;\n }\n a,\n a:visited {\n text-decoration: underline;\n }\n a[href]:after {\n content: \" (\" attr(href) \")\";\n }\n abbr[title]:after {\n content: \" (\" attr(title) \")\";\n }\n a[href^=\"#\"]:after,\n a[href^=\"javascript:\"]:after {\n content: \"\";\n }\n pre,\n blockquote {\n border: 1px solid #999;\n\n page-break-inside: avoid;\n }\n thead {\n display: table-header-group;\n }\n tr,\n img {\n page-break-inside: avoid;\n }\n img {\n max-width: 100% !important;\n }\n p,\n h2,\n h3 {\n orphans: 3;\n widows: 3;\n }\n h2,\n h3 {\n page-break-after: avoid;\n }\n .navbar {\n display: none;\n }\n .btn > .caret,\n .dropup > .btn > .caret {\n border-top-color: #000 !important;\n }\n .label {\n border: 1px solid #000;\n }\n .table {\n border-collapse: collapse !important;\n }\n .table td,\n .table th {\n background-color: #fff !important;\n }\n .table-bordered th,\n .table-bordered td {\n border: 1px solid #ddd !important;\n }\n}\n@font-face {\n font-family: 'Glyphicons Halflings';\n\n src: url('../fonts/glyphicons-halflings-regular.eot');\n src: url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'), url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'), url('../fonts/glyphicons-halflings-regular.woff') format('woff'), url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'), url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg');\n}\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n.glyphicon-asterisk:before {\n content: \"\\002a\";\n}\n.glyphicon-plus:before {\n content: \"\\002b\";\n}\n.glyphicon-euro:before,\n.glyphicon-eur:before {\n content: \"\\20ac\";\n}\n.glyphicon-minus:before {\n content: \"\\2212\";\n}\n.glyphicon-cloud:before {\n content: \"\\2601\";\n}\n.glyphicon-envelope:before {\n content: \"\\2709\";\n}\n.glyphicon-pencil:before {\n content: \"\\270f\";\n}\n.glyphicon-glass:before {\n content: \"\\e001\";\n}\n.glyphicon-music:before {\n content: \"\\e002\";\n}\n.glyphicon-search:before {\n content: \"\\e003\";\n}\n.glyphicon-heart:before {\n content: \"\\e005\";\n}\n.glyphicon-star:before {\n content: \"\\e006\";\n}\n.glyphicon-star-empty:before {\n content: \"\\e007\";\n}\n.glyphicon-user:before {\n content: \"\\e008\";\n}\n.glyphicon-film:before {\n content: \"\\e009\";\n}\n.glyphicon-th-large:before {\n content: \"\\e010\";\n}\n.glyphicon-th:before {\n content: \"\\e011\";\n}\n.glyphicon-th-list:before {\n content: \"\\e012\";\n}\n.glyphicon-ok:before {\n content: \"\\e013\";\n}\n.glyphicon-remove:before {\n content: \"\\e014\";\n}\n.glyphicon-zoom-in:before {\n content: \"\\e015\";\n}\n.glyphicon-zoom-out:before {\n content: \"\\e016\";\n}\n.glyphicon-off:before {\n content: \"\\e017\";\n}\n.glyphicon-signal:before {\n content: \"\\e018\";\n}\n.glyphicon-cog:before {\n content: \"\\e019\";\n}\n.glyphicon-trash:before {\n content: \"\\e020\";\n}\n.glyphicon-home:before {\n content: \"\\e021\";\n}\n.glyphicon-file:before {\n content: \"\\e022\";\n}\n.glyphicon-time:before {\n content: \"\\e023\";\n}\n.glyphicon-road:before {\n content: \"\\e024\";\n}\n.glyphicon-download-alt:before {\n content: \"\\e025\";\n}\n.glyphicon-download:before {\n content: \"\\e026\";\n}\n.glyphicon-upload:before {\n content: \"\\e027\";\n}\n.glyphicon-inbox:before {\n content: \"\\e028\";\n}\n.glyphicon-play-circle:before {\n content: \"\\e029\";\n}\n.glyphicon-repeat:before {\n content: \"\\e030\";\n}\n.glyphicon-refresh:before {\n content: \"\\e031\";\n}\n.glyphicon-list-alt:before {\n content: \"\\e032\";\n}\n.glyphicon-lock:before {\n content: \"\\e033\";\n}\n.glyphicon-flag:before {\n content: \"\\e034\";\n}\n.glyphicon-headphones:before {\n content: \"\\e035\";\n}\n.glyphicon-volume-off:before {\n content: \"\\e036\";\n}\n.glyphicon-volume-down:before {\n content: \"\\e037\";\n}\n.glyphicon-volume-up:before {\n content: \"\\e038\";\n}\n.glyphicon-qrcode:before {\n content: \"\\e039\";\n}\n.glyphicon-barcode:before {\n content: \"\\e040\";\n}\n.glyphicon-tag:before {\n content: \"\\e041\";\n}\n.glyphicon-tags:before {\n content: \"\\e042\";\n}\n.glyphicon-book:before {\n content: \"\\e043\";\n}\n.glyphicon-bookmark:before {\n content: \"\\e044\";\n}\n.glyphicon-print:before {\n content: \"\\e045\";\n}\n.glyphicon-camera:before {\n content: \"\\e046\";\n}\n.glyphicon-font:before {\n content: \"\\e047\";\n}\n.glyphicon-bold:before {\n content: \"\\e048\";\n}\n.glyphicon-italic:before {\n content: \"\\e049\";\n}\n.glyphicon-text-height:before {\n content: \"\\e050\";\n}\n.glyphicon-text-width:before {\n content: \"\\e051\";\n}\n.glyphicon-align-left:before {\n content: \"\\e052\";\n}\n.glyphicon-align-center:before {\n content: \"\\e053\";\n}\n.glyphicon-align-right:before {\n content: \"\\e054\";\n}\n.glyphicon-align-justify:before {\n content: \"\\e055\";\n}\n.glyphicon-list:before {\n content: \"\\e056\";\n}\n.glyphicon-indent-left:before {\n content: \"\\e057\";\n}\n.glyphicon-indent-right:before {\n content: \"\\e058\";\n}\n.glyphicon-facetime-video:before {\n content: \"\\e059\";\n}\n.glyphicon-picture:before {\n content: \"\\e060\";\n}\n.glyphicon-map-marker:before {\n content: \"\\e062\";\n}\n.glyphicon-adjust:before {\n content: \"\\e063\";\n}\n.glyphicon-tint:before {\n content: \"\\e064\";\n}\n.glyphicon-edit:before {\n content: \"\\e065\";\n}\n.glyphicon-share:before {\n content: \"\\e066\";\n}\n.glyphicon-check:before {\n content: \"\\e067\";\n}\n.glyphicon-move:before {\n content: \"\\e068\";\n}\n.glyphicon-step-backward:before {\n content: \"\\e069\";\n}\n.glyphicon-fast-backward:before {\n content: \"\\e070\";\n}\n.glyphicon-backward:before {\n content: \"\\e071\";\n}\n.glyphicon-play:before {\n content: \"\\e072\";\n}\n.glyphicon-pause:before {\n content: \"\\e073\";\n}\n.glyphicon-stop:before {\n content: \"\\e074\";\n}\n.glyphicon-forward:before {\n content: \"\\e075\";\n}\n.glyphicon-fast-forward:before {\n content: \"\\e076\";\n}\n.glyphicon-step-forward:before {\n content: \"\\e077\";\n}\n.glyphicon-eject:before {\n content: \"\\e078\";\n}\n.glyphicon-chevron-left:before {\n content: \"\\e079\";\n}\n.glyphicon-chevron-right:before {\n content: \"\\e080\";\n}\n.glyphicon-plus-sign:before {\n content: \"\\e081\";\n}\n.glyphicon-minus-sign:before {\n content: \"\\e082\";\n}\n.glyphicon-remove-sign:before {\n content: \"\\e083\";\n}\n.glyphicon-ok-sign:before {\n content: \"\\e084\";\n}\n.glyphicon-question-sign:before {\n content: \"\\e085\";\n}\n.glyphicon-info-sign:before {\n content: \"\\e086\";\n}\n.glyphicon-screenshot:before {\n content: \"\\e087\";\n}\n.glyphicon-remove-circle:before {\n content: \"\\e088\";\n}\n.glyphicon-ok-circle:before {\n content: \"\\e089\";\n}\n.glyphicon-ban-circle:before {\n content: \"\\e090\";\n}\n.glyphicon-arrow-left:before {\n content: \"\\e091\";\n}\n.glyphicon-arrow-right:before {\n content: \"\\e092\";\n}\n.glyphicon-arrow-up:before {\n content: \"\\e093\";\n}\n.glyphicon-arrow-down:before {\n content: \"\\e094\";\n}\n.glyphicon-share-alt:before {\n content: \"\\e095\";\n}\n.glyphicon-resize-full:before {\n content: \"\\e096\";\n}\n.glyphicon-resize-small:before {\n content: \"\\e097\";\n}\n.glyphicon-exclamation-sign:before {\n content: \"\\e101\";\n}\n.glyphicon-gift:before {\n content: \"\\e102\";\n}\n.glyphicon-leaf:before {\n content: \"\\e103\";\n}\n.glyphicon-fire:before {\n content: \"\\e104\";\n}\n.glyphicon-eye-open:before {\n content: \"\\e105\";\n}\n.glyphicon-eye-close:before {\n content: \"\\e106\";\n}\n.glyphicon-warning-sign:before {\n content: \"\\e107\";\n}\n.glyphicon-plane:before {\n content: \"\\e108\";\n}\n.glyphicon-calendar:before {\n content: \"\\e109\";\n}\n.glyphicon-random:before {\n content: \"\\e110\";\n}\n.glyphicon-comment:before {\n content: \"\\e111\";\n}\n.glyphicon-magnet:before {\n content: \"\\e112\";\n}\n.glyphicon-chevron-up:before {\n content: \"\\e113\";\n}\n.glyphicon-chevron-down:before {\n content: \"\\e114\";\n}\n.glyphicon-retweet:before {\n content: \"\\e115\";\n}\n.glyphicon-shopping-cart:before {\n content: \"\\e116\";\n}\n.glyphicon-folder-close:before {\n content: \"\\e117\";\n}\n.glyphicon-folder-open:before {\n content: \"\\e118\";\n}\n.glyphicon-resize-vertical:before {\n content: \"\\e119\";\n}\n.glyphicon-resize-horizontal:before {\n content: \"\\e120\";\n}\n.glyphicon-hdd:before {\n content: \"\\e121\";\n}\n.glyphicon-bullhorn:before {\n content: \"\\e122\";\n}\n.glyphicon-bell:before {\n content: \"\\e123\";\n}\n.glyphicon-certificate:before {\n content: \"\\e124\";\n}\n.glyphicon-thumbs-up:before {\n content: \"\\e125\";\n}\n.glyphicon-thumbs-down:before {\n content: \"\\e126\";\n}\n.glyphicon-hand-right:before {\n content: \"\\e127\";\n}\n.glyphicon-hand-left:before {\n content: \"\\e128\";\n}\n.glyphicon-hand-up:before {\n content: \"\\e129\";\n}\n.glyphicon-hand-down:before {\n content: \"\\e130\";\n}\n.glyphicon-circle-arrow-right:before {\n content: \"\\e131\";\n}\n.glyphicon-circle-arrow-left:before {\n content: \"\\e132\";\n}\n.glyphicon-circle-arrow-up:before {\n content: \"\\e133\";\n}\n.glyphicon-circle-arrow-down:before {\n content: \"\\e134\";\n}\n.glyphicon-globe:before {\n content: \"\\e135\";\n}\n.glyphicon-wrench:before {\n content: \"\\e136\";\n}\n.glyphicon-tasks:before {\n content: \"\\e137\";\n}\n.glyphicon-filter:before {\n content: \"\\e138\";\n}\n.glyphicon-briefcase:before {\n content: \"\\e139\";\n}\n.glyphicon-fullscreen:before {\n content: \"\\e140\";\n}\n.glyphicon-dashboard:before {\n content: \"\\e141\";\n}\n.glyphicon-paperclip:before {\n content: \"\\e142\";\n}\n.glyphicon-heart-empty:before {\n content: \"\\e143\";\n}\n.glyphicon-link:before {\n content: \"\\e144\";\n}\n.glyphicon-phone:before {\n content: \"\\e145\";\n}\n.glyphicon-pushpin:before {\n content: \"\\e146\";\n}\n.glyphicon-usd:before {\n content: \"\\e148\";\n}\n.glyphicon-gbp:before {\n content: \"\\e149\";\n}\n.glyphicon-sort:before {\n content: \"\\e150\";\n}\n.glyphicon-sort-by-alphabet:before {\n content: \"\\e151\";\n}\n.glyphicon-sort-by-alphabet-alt:before {\n content: \"\\e152\";\n}\n.glyphicon-sort-by-order:before {\n content: \"\\e153\";\n}\n.glyphicon-sort-by-order-alt:before {\n content: \"\\e154\";\n}\n.glyphicon-sort-by-attributes:before {\n content: \"\\e155\";\n}\n.glyphicon-sort-by-attributes-alt:before {\n content: \"\\e156\";\n}\n.glyphicon-unchecked:before {\n content: \"\\e157\";\n}\n.glyphicon-expand:before {\n content: \"\\e158\";\n}\n.glyphicon-collapse-down:before {\n content: \"\\e159\";\n}\n.glyphicon-collapse-up:before {\n content: \"\\e160\";\n}\n.glyphicon-log-in:before {\n content: \"\\e161\";\n}\n.glyphicon-flash:before {\n content: \"\\e162\";\n}\n.glyphicon-log-out:before {\n content: \"\\e163\";\n}\n.glyphicon-new-window:before {\n content: \"\\e164\";\n}\n.glyphicon-record:before {\n content: \"\\e165\";\n}\n.glyphicon-save:before {\n content: \"\\e166\";\n}\n.glyphicon-open:before {\n content: \"\\e167\";\n}\n.glyphicon-saved:before {\n content: \"\\e168\";\n}\n.glyphicon-import:before {\n content: \"\\e169\";\n}\n.glyphicon-export:before {\n content: \"\\e170\";\n}\n.glyphicon-send:before {\n content: \"\\e171\";\n}\n.glyphicon-floppy-disk:before {\n content: \"\\e172\";\n}\n.glyphicon-floppy-saved:before {\n content: \"\\e173\";\n}\n.glyphicon-floppy-remove:before {\n content: \"\\e174\";\n}\n.glyphicon-floppy-save:before {\n content: \"\\e175\";\n}\n.glyphicon-floppy-open:before {\n content: \"\\e176\";\n}\n.glyphicon-credit-card:before {\n content: \"\\e177\";\n}\n.glyphicon-transfer:before {\n content: \"\\e178\";\n}\n.glyphicon-cutlery:before {\n content: \"\\e179\";\n}\n.glyphicon-header:before {\n content: \"\\e180\";\n}\n.glyphicon-compressed:before {\n content: \"\\e181\";\n}\n.glyphicon-earphone:before {\n content: \"\\e182\";\n}\n.glyphicon-phone-alt:before {\n content: \"\\e183\";\n}\n.glyphicon-tower:before {\n content: \"\\e184\";\n}\n.glyphicon-stats:before {\n content: \"\\e185\";\n}\n.glyphicon-sd-video:before {\n content: \"\\e186\";\n}\n.glyphicon-hd-video:before {\n content: \"\\e187\";\n}\n.glyphicon-subtitles:before {\n content: \"\\e188\";\n}\n.glyphicon-sound-stereo:before {\n content: \"\\e189\";\n}\n.glyphicon-sound-dolby:before {\n content: \"\\e190\";\n}\n.glyphicon-sound-5-1:before {\n content: \"\\e191\";\n}\n.glyphicon-sound-6-1:before {\n content: \"\\e192\";\n}\n.glyphicon-sound-7-1:before {\n content: \"\\e193\";\n}\n.glyphicon-copyright-mark:before {\n content: \"\\e194\";\n}\n.glyphicon-registration-mark:before {\n content: \"\\e195\";\n}\n.glyphicon-cloud-download:before {\n content: \"\\e197\";\n}\n.glyphicon-cloud-upload:before {\n content: \"\\e198\";\n}\n.glyphicon-tree-conifer:before {\n content: \"\\e199\";\n}\n.glyphicon-tree-deciduous:before {\n content: \"\\e200\";\n}\n.glyphicon-cd:before {\n content: \"\\e201\";\n}\n.glyphicon-save-file:before {\n content: \"\\e202\";\n}\n.glyphicon-open-file:before {\n content: \"\\e203\";\n}\n.glyphicon-level-up:before {\n content: \"\\e204\";\n}\n.glyphicon-copy:before {\n content: \"\\e205\";\n}\n.glyphicon-paste:before {\n content: \"\\e206\";\n}\n.glyphicon-alert:before {\n content: \"\\e209\";\n}\n.glyphicon-equalizer:before {\n content: \"\\e210\";\n}\n.glyphicon-king:before {\n content: \"\\e211\";\n}\n.glyphicon-queen:before {\n content: \"\\e212\";\n}\n.glyphicon-pawn:before {\n content: \"\\e213\";\n}\n.glyphicon-bishop:before {\n content: \"\\e214\";\n}\n.glyphicon-knight:before {\n content: \"\\e215\";\n}\n.glyphicon-baby-formula:before {\n content: \"\\e216\";\n}\n.glyphicon-tent:before {\n content: \"\\26fa\";\n}\n.glyphicon-blackboard:before {\n content: \"\\e218\";\n}\n.glyphicon-bed:before {\n content: \"\\e219\";\n}\n.glyphicon-apple:before {\n content: \"\\f8ff\";\n}\n.glyphicon-erase:before {\n content: \"\\e221\";\n}\n.glyphicon-hourglass:before {\n content: \"\\231b\";\n}\n.glyphicon-lamp:before {\n content: \"\\e223\";\n}\n.glyphicon-duplicate:before {\n content: \"\\e224\";\n}\n.glyphicon-piggy-bank:before {\n content: \"\\e225\";\n}\n.glyphicon-scissors:before {\n content: \"\\e226\";\n}\n.glyphicon-bitcoin:before {\n content: \"\\e227\";\n}\n.glyphicon-btc:before {\n content: \"\\e227\";\n}\n.glyphicon-xbt:before {\n content: \"\\e227\";\n}\n.glyphicon-yen:before {\n content: \"\\00a5\";\n}\n.glyphicon-jpy:before {\n content: \"\\00a5\";\n}\n.glyphicon-ruble:before {\n content: \"\\20bd\";\n}\n.glyphicon-rub:before {\n content: \"\\20bd\";\n}\n.glyphicon-scale:before {\n content: \"\\e230\";\n}\n.glyphicon-ice-lolly:before {\n content: \"\\e231\";\n}\n.glyphicon-ice-lolly-tasted:before {\n content: \"\\e232\";\n}\n.glyphicon-education:before {\n content: \"\\e233\";\n}\n.glyphicon-option-horizontal:before {\n content: \"\\e234\";\n}\n.glyphicon-option-vertical:before {\n content: \"\\e235\";\n}\n.glyphicon-menu-hamburger:before {\n content: \"\\e236\";\n}\n.glyphicon-modal-window:before {\n content: \"\\e237\";\n}\n.glyphicon-oil:before {\n content: \"\\e238\";\n}\n.glyphicon-grain:before {\n content: \"\\e239\";\n}\n.glyphicon-sunglasses:before {\n content: \"\\e240\";\n}\n.glyphicon-text-size:before {\n content: \"\\e241\";\n}\n.glyphicon-text-color:before {\n content: \"\\e242\";\n}\n.glyphicon-text-background:before {\n content: \"\\e243\";\n}\n.glyphicon-object-align-top:before {\n content: \"\\e244\";\n}\n.glyphicon-object-align-bottom:before {\n content: \"\\e245\";\n}\n.glyphicon-object-align-horizontal:before {\n content: \"\\e246\";\n}\n.glyphicon-object-align-left:before {\n content: \"\\e247\";\n}\n.glyphicon-object-align-vertical:before {\n content: \"\\e248\";\n}\n.glyphicon-object-align-right:before {\n content: \"\\e249\";\n}\n.glyphicon-triangle-right:before {\n content: \"\\e250\";\n}\n.glyphicon-triangle-left:before {\n content: \"\\e251\";\n}\n.glyphicon-triangle-bottom:before {\n content: \"\\e252\";\n}\n.glyphicon-triangle-top:before {\n content: \"\\e253\";\n}\n.glyphicon-console:before {\n content: \"\\e254\";\n}\n.glyphicon-superscript:before {\n content: \"\\e255\";\n}\n.glyphicon-subscript:before {\n content: \"\\e256\";\n}\n.glyphicon-menu-left:before {\n content: \"\\e257\";\n}\n.glyphicon-menu-right:before {\n content: \"\\e258\";\n}\n.glyphicon-menu-down:before {\n content: \"\\e259\";\n}\n.glyphicon-menu-up:before {\n content: \"\\e260\";\n}\n* {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\n*:before,\n*:after {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\nhtml {\n font-size: 10px;\n\n -webkit-tap-highlight-color: rgba(0, 0, 0, 0);\n}\nbody {\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n line-height: 1.42857143;\n color: #333;\n background-color: #fff;\n}\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\na {\n color: #337ab7;\n text-decoration: none;\n}\na:hover,\na:focus {\n color: #23527c;\n text-decoration: underline;\n}\na:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\nfigure {\n margin: 0;\n}\nimg {\n vertical-align: middle;\n}\n.img-responsive,\n.thumbnail > img,\n.thumbnail a > img,\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n display: block;\n max-width: 100%;\n height: auto;\n}\n.img-rounded {\n border-radius: 6px;\n}\n.img-thumbnail {\n display: inline-block;\n max-width: 100%;\n height: auto;\n padding: 4px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: all .2s ease-in-out;\n -o-transition: all .2s ease-in-out;\n transition: all .2s ease-in-out;\n}\n.img-circle {\n border-radius: 50%;\n}\nhr {\n margin-top: 20px;\n margin-bottom: 20px;\n border: 0;\n border-top: 1px solid #eee;\n}\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n padding: 0;\n margin: -1px;\n overflow: hidden;\n clip: rect(0, 0, 0, 0);\n border: 0;\n}\n.sr-only-focusable:active,\n.sr-only-focusable:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n}\n[role=\"button\"] {\n cursor: pointer;\n}\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\n.h1,\n.h2,\n.h3,\n.h4,\n.h5,\n.h6 {\n font-family: inherit;\n font-weight: 500;\n line-height: 1.1;\n color: inherit;\n}\nh1 small,\nh2 small,\nh3 small,\nh4 small,\nh5 small,\nh6 small,\n.h1 small,\n.h2 small,\n.h3 small,\n.h4 small,\n.h5 small,\n.h6 small,\nh1 .small,\nh2 .small,\nh3 .small,\nh4 .small,\nh5 .small,\nh6 .small,\n.h1 .small,\n.h2 .small,\n.h3 .small,\n.h4 .small,\n.h5 .small,\n.h6 .small {\n font-weight: normal;\n line-height: 1;\n color: #777;\n}\nh1,\n.h1,\nh2,\n.h2,\nh3,\n.h3 {\n margin-top: 20px;\n margin-bottom: 10px;\n}\nh1 small,\n.h1 small,\nh2 small,\n.h2 small,\nh3 small,\n.h3 small,\nh1 .small,\n.h1 .small,\nh2 .small,\n.h2 .small,\nh3 .small,\n.h3 .small {\n font-size: 65%;\n}\nh4,\n.h4,\nh5,\n.h5,\nh6,\n.h6 {\n margin-top: 10px;\n margin-bottom: 10px;\n}\nh4 small,\n.h4 small,\nh5 small,\n.h5 small,\nh6 small,\n.h6 small,\nh4 .small,\n.h4 .small,\nh5 .small,\n.h5 .small,\nh6 .small,\n.h6 .small {\n font-size: 75%;\n}\nh1,\n.h1 {\n font-size: 36px;\n}\nh2,\n.h2 {\n font-size: 30px;\n}\nh3,\n.h3 {\n font-size: 24px;\n}\nh4,\n.h4 {\n font-size: 18px;\n}\nh5,\n.h5 {\n font-size: 14px;\n}\nh6,\n.h6 {\n font-size: 12px;\n}\np {\n margin: 0 0 10px;\n}\n.lead {\n margin-bottom: 20px;\n font-size: 16px;\n font-weight: 300;\n line-height: 1.4;\n}\n@media (min-width: 768px) {\n .lead {\n font-size: 21px;\n }\n}\nsmall,\n.small {\n font-size: 85%;\n}\nmark,\n.mark {\n padding: .2em;\n background-color: #fcf8e3;\n}\n.text-left {\n text-align: left;\n}\n.text-right {\n text-align: right;\n}\n.text-center {\n text-align: center;\n}\n.text-justify {\n text-align: justify;\n}\n.text-nowrap {\n white-space: nowrap;\n}\n.text-lowercase {\n text-transform: lowercase;\n}\n.text-uppercase {\n text-transform: uppercase;\n}\n.text-capitalize {\n text-transform: capitalize;\n}\n.text-muted {\n color: #777;\n}\n.text-primary {\n color: #337ab7;\n}\na.text-primary:hover,\na.text-primary:focus {\n color: #286090;\n}\n.text-success {\n color: #3c763d;\n}\na.text-success:hover,\na.text-success:focus {\n color: #2b542c;\n}\n.text-info {\n color: #31708f;\n}\na.text-info:hover,\na.text-info:focus {\n color: #245269;\n}\n.text-warning {\n color: #8a6d3b;\n}\na.text-warning:hover,\na.text-warning:focus {\n color: #66512c;\n}\n.text-danger {\n color: #a94442;\n}\na.text-danger:hover,\na.text-danger:focus {\n color: #843534;\n}\n.bg-primary {\n color: #fff;\n background-color: #337ab7;\n}\na.bg-primary:hover,\na.bg-primary:focus {\n background-color: #286090;\n}\n.bg-success {\n background-color: #dff0d8;\n}\na.bg-success:hover,\na.bg-success:focus {\n background-color: #c1e2b3;\n}\n.bg-info {\n background-color: #d9edf7;\n}\na.bg-info:hover,\na.bg-info:focus {\n background-color: #afd9ee;\n}\n.bg-warning {\n background-color: #fcf8e3;\n}\na.bg-warning:hover,\na.bg-warning:focus {\n background-color: #f7ecb5;\n}\n.bg-danger {\n background-color: #f2dede;\n}\na.bg-danger:hover,\na.bg-danger:focus {\n background-color: #e4b9b9;\n}\n.page-header {\n padding-bottom: 9px;\n margin: 40px 0 20px;\n border-bottom: 1px solid #eee;\n}\nul,\nol {\n margin-top: 0;\n margin-bottom: 10px;\n}\nul ul,\nol ul,\nul ol,\nol ol {\n margin-bottom: 0;\n}\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n.list-inline {\n padding-left: 0;\n margin-left: -5px;\n list-style: none;\n}\n.list-inline > li {\n display: inline-block;\n padding-right: 5px;\n padding-left: 5px;\n}\ndl {\n margin-top: 0;\n margin-bottom: 20px;\n}\ndt,\ndd {\n line-height: 1.42857143;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .dl-horizontal dt {\n float: left;\n width: 160px;\n overflow: hidden;\n clear: left;\n text-align: right;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n .dl-horizontal dd {\n margin-left: 180px;\n }\n}\nabbr[title],\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted #777;\n}\n.initialism {\n font-size: 90%;\n text-transform: uppercase;\n}\nblockquote {\n padding: 10px 20px;\n margin: 0 0 20px;\n font-size: 17.5px;\n border-left: 5px solid #eee;\n}\nblockquote p:last-child,\nblockquote ul:last-child,\nblockquote ol:last-child {\n margin-bottom: 0;\n}\nblockquote footer,\nblockquote small,\nblockquote .small {\n display: block;\n font-size: 80%;\n line-height: 1.42857143;\n color: #777;\n}\nblockquote footer:before,\nblockquote small:before,\nblockquote .small:before {\n content: '\\2014 \\00A0';\n}\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n text-align: right;\n border-right: 5px solid #eee;\n border-left: 0;\n}\n.blockquote-reverse footer:before,\nblockquote.pull-right footer:before,\n.blockquote-reverse small:before,\nblockquote.pull-right small:before,\n.blockquote-reverse .small:before,\nblockquote.pull-right .small:before {\n content: '';\n}\n.blockquote-reverse footer:after,\nblockquote.pull-right footer:after,\n.blockquote-reverse small:after,\nblockquote.pull-right small:after,\n.blockquote-reverse .small:after,\nblockquote.pull-right .small:after {\n content: '\\00A0 \\2014';\n}\naddress {\n margin-bottom: 20px;\n font-style: normal;\n line-height: 1.42857143;\n}\ncode,\nkbd,\npre,\nsamp {\n font-family: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n}\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: #c7254e;\n background-color: #f9f2f4;\n border-radius: 4px;\n}\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: #fff;\n background-color: #333;\n border-radius: 3px;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);\n}\nkbd kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\npre {\n display: block;\n padding: 9.5px;\n margin: 0 0 10px;\n font-size: 13px;\n line-height: 1.42857143;\n color: #333;\n word-break: break-all;\n word-wrap: break-word;\n background-color: #f5f5f5;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\npre code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n}\n.pre-scrollable {\n max-height: 340px;\n overflow-y: scroll;\n}\n.container {\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n@media (min-width: 768px) {\n .container {\n width: 750px;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: 970px;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: 1170px;\n }\n}\n.container-fluid {\n padding-right: 15px;\n padding-left: 15px;\n margin-right: auto;\n margin-left: auto;\n}\n.row {\n margin-right: -15px;\n margin-left: -15px;\n}\n.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12 {\n position: relative;\n min-height: 1px;\n padding-right: 15px;\n padding-left: 15px;\n}\n.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12 {\n float: left;\n}\n.col-xs-12 {\n width: 100%;\n}\n.col-xs-11 {\n width: 91.66666667%;\n}\n.col-xs-10 {\n width: 83.33333333%;\n}\n.col-xs-9 {\n width: 75%;\n}\n.col-xs-8 {\n width: 66.66666667%;\n}\n.col-xs-7 {\n width: 58.33333333%;\n}\n.col-xs-6 {\n width: 50%;\n}\n.col-xs-5 {\n width: 41.66666667%;\n}\n.col-xs-4 {\n width: 33.33333333%;\n}\n.col-xs-3 {\n width: 25%;\n}\n.col-xs-2 {\n width: 16.66666667%;\n}\n.col-xs-1 {\n width: 8.33333333%;\n}\n.col-xs-pull-12 {\n right: 100%;\n}\n.col-xs-pull-11 {\n right: 91.66666667%;\n}\n.col-xs-pull-10 {\n right: 83.33333333%;\n}\n.col-xs-pull-9 {\n right: 75%;\n}\n.col-xs-pull-8 {\n right: 66.66666667%;\n}\n.col-xs-pull-7 {\n right: 58.33333333%;\n}\n.col-xs-pull-6 {\n right: 50%;\n}\n.col-xs-pull-5 {\n right: 41.66666667%;\n}\n.col-xs-pull-4 {\n right: 33.33333333%;\n}\n.col-xs-pull-3 {\n right: 25%;\n}\n.col-xs-pull-2 {\n right: 16.66666667%;\n}\n.col-xs-pull-1 {\n right: 8.33333333%;\n}\n.col-xs-pull-0 {\n right: auto;\n}\n.col-xs-push-12 {\n left: 100%;\n}\n.col-xs-push-11 {\n left: 91.66666667%;\n}\n.col-xs-push-10 {\n left: 83.33333333%;\n}\n.col-xs-push-9 {\n left: 75%;\n}\n.col-xs-push-8 {\n left: 66.66666667%;\n}\n.col-xs-push-7 {\n left: 58.33333333%;\n}\n.col-xs-push-6 {\n left: 50%;\n}\n.col-xs-push-5 {\n left: 41.66666667%;\n}\n.col-xs-push-4 {\n left: 33.33333333%;\n}\n.col-xs-push-3 {\n left: 25%;\n}\n.col-xs-push-2 {\n left: 16.66666667%;\n}\n.col-xs-push-1 {\n left: 8.33333333%;\n}\n.col-xs-push-0 {\n left: auto;\n}\n.col-xs-offset-12 {\n margin-left: 100%;\n}\n.col-xs-offset-11 {\n margin-left: 91.66666667%;\n}\n.col-xs-offset-10 {\n margin-left: 83.33333333%;\n}\n.col-xs-offset-9 {\n margin-left: 75%;\n}\n.col-xs-offset-8 {\n margin-left: 66.66666667%;\n}\n.col-xs-offset-7 {\n margin-left: 58.33333333%;\n}\n.col-xs-offset-6 {\n margin-left: 50%;\n}\n.col-xs-offset-5 {\n margin-left: 41.66666667%;\n}\n.col-xs-offset-4 {\n margin-left: 33.33333333%;\n}\n.col-xs-offset-3 {\n margin-left: 25%;\n}\n.col-xs-offset-2 {\n margin-left: 16.66666667%;\n}\n.col-xs-offset-1 {\n margin-left: 8.33333333%;\n}\n.col-xs-offset-0 {\n margin-left: 0;\n}\n@media (min-width: 768px) {\n .col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12 {\n float: left;\n }\n .col-sm-12 {\n width: 100%;\n }\n .col-sm-11 {\n width: 91.66666667%;\n }\n .col-sm-10 {\n width: 83.33333333%;\n }\n .col-sm-9 {\n width: 75%;\n }\n .col-sm-8 {\n width: 66.66666667%;\n }\n .col-sm-7 {\n width: 58.33333333%;\n }\n .col-sm-6 {\n width: 50%;\n }\n .col-sm-5 {\n width: 41.66666667%;\n }\n .col-sm-4 {\n width: 33.33333333%;\n }\n .col-sm-3 {\n width: 25%;\n }\n .col-sm-2 {\n width: 16.66666667%;\n }\n .col-sm-1 {\n width: 8.33333333%;\n }\n .col-sm-pull-12 {\n right: 100%;\n }\n .col-sm-pull-11 {\n right: 91.66666667%;\n }\n .col-sm-pull-10 {\n right: 83.33333333%;\n }\n .col-sm-pull-9 {\n right: 75%;\n }\n .col-sm-pull-8 {\n right: 66.66666667%;\n }\n .col-sm-pull-7 {\n right: 58.33333333%;\n }\n .col-sm-pull-6 {\n right: 50%;\n }\n .col-sm-pull-5 {\n right: 41.66666667%;\n }\n .col-sm-pull-4 {\n right: 33.33333333%;\n }\n .col-sm-pull-3 {\n right: 25%;\n }\n .col-sm-pull-2 {\n right: 16.66666667%;\n }\n .col-sm-pull-1 {\n right: 8.33333333%;\n }\n .col-sm-pull-0 {\n right: auto;\n }\n .col-sm-push-12 {\n left: 100%;\n }\n .col-sm-push-11 {\n left: 91.66666667%;\n }\n .col-sm-push-10 {\n left: 83.33333333%;\n }\n .col-sm-push-9 {\n left: 75%;\n }\n .col-sm-push-8 {\n left: 66.66666667%;\n }\n .col-sm-push-7 {\n left: 58.33333333%;\n }\n .col-sm-push-6 {\n left: 50%;\n }\n .col-sm-push-5 {\n left: 41.66666667%;\n }\n .col-sm-push-4 {\n left: 33.33333333%;\n }\n .col-sm-push-3 {\n left: 25%;\n }\n .col-sm-push-2 {\n left: 16.66666667%;\n }\n .col-sm-push-1 {\n left: 8.33333333%;\n }\n .col-sm-push-0 {\n left: auto;\n }\n .col-sm-offset-12 {\n margin-left: 100%;\n }\n .col-sm-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-sm-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-sm-offset-9 {\n margin-left: 75%;\n }\n .col-sm-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-sm-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-sm-offset-6 {\n margin-left: 50%;\n }\n .col-sm-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-sm-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-sm-offset-3 {\n margin-left: 25%;\n }\n .col-sm-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-sm-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-sm-offset-0 {\n margin-left: 0;\n }\n}\n@media (min-width: 992px) {\n .col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12 {\n float: left;\n }\n .col-md-12 {\n width: 100%;\n }\n .col-md-11 {\n width: 91.66666667%;\n }\n .col-md-10 {\n width: 83.33333333%;\n }\n .col-md-9 {\n width: 75%;\n }\n .col-md-8 {\n width: 66.66666667%;\n }\n .col-md-7 {\n width: 58.33333333%;\n }\n .col-md-6 {\n width: 50%;\n }\n .col-md-5 {\n width: 41.66666667%;\n }\n .col-md-4 {\n width: 33.33333333%;\n }\n .col-md-3 {\n width: 25%;\n }\n .col-md-2 {\n width: 16.66666667%;\n }\n .col-md-1 {\n width: 8.33333333%;\n }\n .col-md-pull-12 {\n right: 100%;\n }\n .col-md-pull-11 {\n right: 91.66666667%;\n }\n .col-md-pull-10 {\n right: 83.33333333%;\n }\n .col-md-pull-9 {\n right: 75%;\n }\n .col-md-pull-8 {\n right: 66.66666667%;\n }\n .col-md-pull-7 {\n right: 58.33333333%;\n }\n .col-md-pull-6 {\n right: 50%;\n }\n .col-md-pull-5 {\n right: 41.66666667%;\n }\n .col-md-pull-4 {\n right: 33.33333333%;\n }\n .col-md-pull-3 {\n right: 25%;\n }\n .col-md-pull-2 {\n right: 16.66666667%;\n }\n .col-md-pull-1 {\n right: 8.33333333%;\n }\n .col-md-pull-0 {\n right: auto;\n }\n .col-md-push-12 {\n left: 100%;\n }\n .col-md-push-11 {\n left: 91.66666667%;\n }\n .col-md-push-10 {\n left: 83.33333333%;\n }\n .col-md-push-9 {\n left: 75%;\n }\n .col-md-push-8 {\n left: 66.66666667%;\n }\n .col-md-push-7 {\n left: 58.33333333%;\n }\n .col-md-push-6 {\n left: 50%;\n }\n .col-md-push-5 {\n left: 41.66666667%;\n }\n .col-md-push-4 {\n left: 33.33333333%;\n }\n .col-md-push-3 {\n left: 25%;\n }\n .col-md-push-2 {\n left: 16.66666667%;\n }\n .col-md-push-1 {\n left: 8.33333333%;\n }\n .col-md-push-0 {\n left: auto;\n }\n .col-md-offset-12 {\n margin-left: 100%;\n }\n .col-md-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-md-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-md-offset-9 {\n margin-left: 75%;\n }\n .col-md-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-md-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-md-offset-6 {\n margin-left: 50%;\n }\n .col-md-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-md-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-md-offset-3 {\n margin-left: 25%;\n }\n .col-md-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-md-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-md-offset-0 {\n margin-left: 0;\n }\n}\n@media (min-width: 1200px) {\n .col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12 {\n float: left;\n }\n .col-lg-12 {\n width: 100%;\n }\n .col-lg-11 {\n width: 91.66666667%;\n }\n .col-lg-10 {\n width: 83.33333333%;\n }\n .col-lg-9 {\n width: 75%;\n }\n .col-lg-8 {\n width: 66.66666667%;\n }\n .col-lg-7 {\n width: 58.33333333%;\n }\n .col-lg-6 {\n width: 50%;\n }\n .col-lg-5 {\n width: 41.66666667%;\n }\n .col-lg-4 {\n width: 33.33333333%;\n }\n .col-lg-3 {\n width: 25%;\n }\n .col-lg-2 {\n width: 16.66666667%;\n }\n .col-lg-1 {\n width: 8.33333333%;\n }\n .col-lg-pull-12 {\n right: 100%;\n }\n .col-lg-pull-11 {\n right: 91.66666667%;\n }\n .col-lg-pull-10 {\n right: 83.33333333%;\n }\n .col-lg-pull-9 {\n right: 75%;\n }\n .col-lg-pull-8 {\n right: 66.66666667%;\n }\n .col-lg-pull-7 {\n right: 58.33333333%;\n }\n .col-lg-pull-6 {\n right: 50%;\n }\n .col-lg-pull-5 {\n right: 41.66666667%;\n }\n .col-lg-pull-4 {\n right: 33.33333333%;\n }\n .col-lg-pull-3 {\n right: 25%;\n }\n .col-lg-pull-2 {\n right: 16.66666667%;\n }\n .col-lg-pull-1 {\n right: 8.33333333%;\n }\n .col-lg-pull-0 {\n right: auto;\n }\n .col-lg-push-12 {\n left: 100%;\n }\n .col-lg-push-11 {\n left: 91.66666667%;\n }\n .col-lg-push-10 {\n left: 83.33333333%;\n }\n .col-lg-push-9 {\n left: 75%;\n }\n .col-lg-push-8 {\n left: 66.66666667%;\n }\n .col-lg-push-7 {\n left: 58.33333333%;\n }\n .col-lg-push-6 {\n left: 50%;\n }\n .col-lg-push-5 {\n left: 41.66666667%;\n }\n .col-lg-push-4 {\n left: 33.33333333%;\n }\n .col-lg-push-3 {\n left: 25%;\n }\n .col-lg-push-2 {\n left: 16.66666667%;\n }\n .col-lg-push-1 {\n left: 8.33333333%;\n }\n .col-lg-push-0 {\n left: auto;\n }\n .col-lg-offset-12 {\n margin-left: 100%;\n }\n .col-lg-offset-11 {\n margin-left: 91.66666667%;\n }\n .col-lg-offset-10 {\n margin-left: 83.33333333%;\n }\n .col-lg-offset-9 {\n margin-left: 75%;\n }\n .col-lg-offset-8 {\n margin-left: 66.66666667%;\n }\n .col-lg-offset-7 {\n margin-left: 58.33333333%;\n }\n .col-lg-offset-6 {\n margin-left: 50%;\n }\n .col-lg-offset-5 {\n margin-left: 41.66666667%;\n }\n .col-lg-offset-4 {\n margin-left: 33.33333333%;\n }\n .col-lg-offset-3 {\n margin-left: 25%;\n }\n .col-lg-offset-2 {\n margin-left: 16.66666667%;\n }\n .col-lg-offset-1 {\n margin-left: 8.33333333%;\n }\n .col-lg-offset-0 {\n margin-left: 0;\n }\n}\ntable {\n background-color: transparent;\n}\ncaption {\n padding-top: 8px;\n padding-bottom: 8px;\n color: #777;\n text-align: left;\n}\nth {\n text-align: left;\n}\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: 20px;\n}\n.table > thead > tr > th,\n.table > tbody > tr > th,\n.table > tfoot > tr > th,\n.table > thead > tr > td,\n.table > tbody > tr > td,\n.table > tfoot > tr > td {\n padding: 8px;\n line-height: 1.42857143;\n vertical-align: top;\n border-top: 1px solid #ddd;\n}\n.table > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid #ddd;\n}\n.table > caption + thead > tr:first-child > th,\n.table > colgroup + thead > tr:first-child > th,\n.table > thead:first-child > tr:first-child > th,\n.table > caption + thead > tr:first-child > td,\n.table > colgroup + thead > tr:first-child > td,\n.table > thead:first-child > tr:first-child > td {\n border-top: 0;\n}\n.table > tbody + tbody {\n border-top: 2px solid #ddd;\n}\n.table .table {\n background-color: #fff;\n}\n.table-condensed > thead > tr > th,\n.table-condensed > tbody > tr > th,\n.table-condensed > tfoot > tr > th,\n.table-condensed > thead > tr > td,\n.table-condensed > tbody > tr > td,\n.table-condensed > tfoot > tr > td {\n padding: 5px;\n}\n.table-bordered {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > tbody > tr > th,\n.table-bordered > tfoot > tr > th,\n.table-bordered > thead > tr > td,\n.table-bordered > tbody > tr > td,\n.table-bordered > tfoot > tr > td {\n border: 1px solid #ddd;\n}\n.table-bordered > thead > tr > th,\n.table-bordered > thead > tr > td {\n border-bottom-width: 2px;\n}\n.table-striped > tbody > tr:nth-of-type(odd) {\n background-color: #f9f9f9;\n}\n.table-hover > tbody > tr:hover {\n background-color: #f5f5f5;\n}\ntable col[class*=\"col-\"] {\n position: static;\n display: table-column;\n float: none;\n}\ntable td[class*=\"col-\"],\ntable th[class*=\"col-\"] {\n position: static;\n display: table-cell;\n float: none;\n}\n.table > thead > tr > td.active,\n.table > tbody > tr > td.active,\n.table > tfoot > tr > td.active,\n.table > thead > tr > th.active,\n.table > tbody > tr > th.active,\n.table > tfoot > tr > th.active,\n.table > thead > tr.active > td,\n.table > tbody > tr.active > td,\n.table > tfoot > tr.active > td,\n.table > thead > tr.active > th,\n.table > tbody > tr.active > th,\n.table > tfoot > tr.active > th {\n background-color: #f5f5f5;\n}\n.table-hover > tbody > tr > td.active:hover,\n.table-hover > tbody > tr > th.active:hover,\n.table-hover > tbody > tr.active:hover > td,\n.table-hover > tbody > tr:hover > .active,\n.table-hover > tbody > tr.active:hover > th {\n background-color: #e8e8e8;\n}\n.table > thead > tr > td.success,\n.table > tbody > tr > td.success,\n.table > tfoot > tr > td.success,\n.table > thead > tr > th.success,\n.table > tbody > tr > th.success,\n.table > tfoot > tr > th.success,\n.table > thead > tr.success > td,\n.table > tbody > tr.success > td,\n.table > tfoot > tr.success > td,\n.table > thead > tr.success > th,\n.table > tbody > tr.success > th,\n.table > tfoot > tr.success > th {\n background-color: #dff0d8;\n}\n.table-hover > tbody > tr > td.success:hover,\n.table-hover > tbody > tr > th.success:hover,\n.table-hover > tbody > tr.success:hover > td,\n.table-hover > tbody > tr:hover > .success,\n.table-hover > tbody > tr.success:hover > th {\n background-color: #d0e9c6;\n}\n.table > thead > tr > td.info,\n.table > tbody > tr > td.info,\n.table > tfoot > tr > td.info,\n.table > thead > tr > th.info,\n.table > tbody > tr > th.info,\n.table > tfoot > tr > th.info,\n.table > thead > tr.info > td,\n.table > tbody > tr.info > td,\n.table > tfoot > tr.info > td,\n.table > thead > tr.info > th,\n.table > tbody > tr.info > th,\n.table > tfoot > tr.info > th {\n background-color: #d9edf7;\n}\n.table-hover > tbody > tr > td.info:hover,\n.table-hover > tbody > tr > th.info:hover,\n.table-hover > tbody > tr.info:hover > td,\n.table-hover > tbody > tr:hover > .info,\n.table-hover > tbody > tr.info:hover > th {\n background-color: #c4e3f3;\n}\n.table > thead > tr > td.warning,\n.table > tbody > tr > td.warning,\n.table > tfoot > tr > td.warning,\n.table > thead > tr > th.warning,\n.table > tbody > tr > th.warning,\n.table > tfoot > tr > th.warning,\n.table > thead > tr.warning > td,\n.table > tbody > tr.warning > td,\n.table > tfoot > tr.warning > td,\n.table > thead > tr.warning > th,\n.table > tbody > tr.warning > th,\n.table > tfoot > tr.warning > th {\n background-color: #fcf8e3;\n}\n.table-hover > tbody > tr > td.warning:hover,\n.table-hover > tbody > tr > th.warning:hover,\n.table-hover > tbody > tr.warning:hover > td,\n.table-hover > tbody > tr:hover > .warning,\n.table-hover > tbody > tr.warning:hover > th {\n background-color: #faf2cc;\n}\n.table > thead > tr > td.danger,\n.table > tbody > tr > td.danger,\n.table > tfoot > tr > td.danger,\n.table > thead > tr > th.danger,\n.table > tbody > tr > th.danger,\n.table > tfoot > tr > th.danger,\n.table > thead > tr.danger > td,\n.table > tbody > tr.danger > td,\n.table > tfoot > tr.danger > td,\n.table > thead > tr.danger > th,\n.table > tbody > tr.danger > th,\n.table > tfoot > tr.danger > th {\n background-color: #f2dede;\n}\n.table-hover > tbody > tr > td.danger:hover,\n.table-hover > tbody > tr > th.danger:hover,\n.table-hover > tbody > tr.danger:hover > td,\n.table-hover > tbody > tr:hover > .danger,\n.table-hover > tbody > tr.danger:hover > th {\n background-color: #ebcccc;\n}\n.table-responsive {\n min-height: .01%;\n overflow-x: auto;\n}\n@media screen and (max-width: 767px) {\n .table-responsive {\n width: 100%;\n margin-bottom: 15px;\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid #ddd;\n }\n .table-responsive > .table {\n margin-bottom: 0;\n }\n .table-responsive > .table > thead > tr > th,\n .table-responsive > .table > tbody > tr > th,\n .table-responsive > .table > tfoot > tr > th,\n .table-responsive > .table > thead > tr > td,\n .table-responsive > .table > tbody > tr > td,\n .table-responsive > .table > tfoot > tr > td {\n white-space: nowrap;\n }\n .table-responsive > .table-bordered {\n border: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:first-child,\n .table-responsive > .table-bordered > tbody > tr > th:first-child,\n .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n .table-responsive > .table-bordered > thead > tr > td:first-child,\n .table-responsive > .table-bordered > tbody > tr > td:first-child,\n .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n }\n .table-responsive > .table-bordered > thead > tr > th:last-child,\n .table-responsive > .table-bordered > tbody > tr > th:last-child,\n .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n .table-responsive > .table-bordered > thead > tr > td:last-child,\n .table-responsive > .table-bordered > tbody > tr > td:last-child,\n .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n }\n .table-responsive > .table-bordered > tbody > tr:last-child > th,\n .table-responsive > .table-bordered > tfoot > tr:last-child > th,\n .table-responsive > .table-bordered > tbody > tr:last-child > td,\n .table-responsive > .table-bordered > tfoot > tr:last-child > td {\n border-bottom: 0;\n }\n}\nfieldset {\n min-width: 0;\n padding: 0;\n margin: 0;\n border: 0;\n}\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: 20px;\n font-size: 21px;\n line-height: inherit;\n color: #333;\n border: 0;\n border-bottom: 1px solid #e5e5e5;\n}\nlabel {\n display: inline-block;\n max-width: 100%;\n margin-bottom: 5px;\n font-weight: bold;\n}\ninput[type=\"search\"] {\n -webkit-box-sizing: border-box;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n}\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9;\n line-height: normal;\n}\ninput[type=\"file\"] {\n display: block;\n}\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\nselect[multiple],\nselect[size] {\n height: auto;\n}\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\noutput {\n display: block;\n padding-top: 7px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555;\n}\n.form-control {\n display: block;\n width: 100%;\n height: 34px;\n padding: 6px 12px;\n font-size: 14px;\n line-height: 1.42857143;\n color: #555;\n background-color: #fff;\n background-image: none;\n border: 1px solid #ccc;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n -webkit-transition: border-color ease-in-out .15s, -webkit-box-shadow ease-in-out .15s;\n -o-transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n}\n.form-control:focus {\n border-color: #66afe9;\n outline: 0;\n -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, .6);\n}\n.form-control::-moz-placeholder {\n color: #999;\n opacity: 1;\n}\n.form-control:-ms-input-placeholder {\n color: #999;\n}\n.form-control::-webkit-input-placeholder {\n color: #999;\n}\n.form-control::-ms-expand {\n background-color: transparent;\n border: 0;\n}\n.form-control[disabled],\n.form-control[readonly],\nfieldset[disabled] .form-control {\n background-color: #eee;\n opacity: 1;\n}\n.form-control[disabled],\nfieldset[disabled] .form-control {\n cursor: not-allowed;\n}\ntextarea.form-control {\n height: auto;\n}\ninput[type=\"search\"] {\n -webkit-appearance: none;\n}\n@media screen and (-webkit-min-device-pixel-ratio: 0) {\n input[type=\"date\"].form-control,\n input[type=\"time\"].form-control,\n input[type=\"datetime-local\"].form-control,\n input[type=\"month\"].form-control {\n line-height: 34px;\n }\n input[type=\"date\"].input-sm,\n input[type=\"time\"].input-sm,\n input[type=\"datetime-local\"].input-sm,\n input[type=\"month\"].input-sm,\n .input-group-sm input[type=\"date\"],\n .input-group-sm input[type=\"time\"],\n .input-group-sm input[type=\"datetime-local\"],\n .input-group-sm input[type=\"month\"] {\n line-height: 30px;\n }\n input[type=\"date\"].input-lg,\n input[type=\"time\"].input-lg,\n input[type=\"datetime-local\"].input-lg,\n input[type=\"month\"].input-lg,\n .input-group-lg input[type=\"date\"],\n .input-group-lg input[type=\"time\"],\n .input-group-lg input[type=\"datetime-local\"],\n .input-group-lg input[type=\"month\"] {\n line-height: 46px;\n }\n}\n.form-group {\n margin-bottom: 15px;\n}\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.radio label,\n.checkbox label {\n min-height: 20px;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-top: 4px \\9;\n margin-left: -20px;\n}\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px;\n}\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n vertical-align: middle;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px;\n}\ninput[type=\"radio\"][disabled],\ninput[type=\"checkbox\"][disabled],\ninput[type=\"radio\"].disabled,\ninput[type=\"checkbox\"].disabled,\nfieldset[disabled] input[type=\"radio\"],\nfieldset[disabled] input[type=\"checkbox\"] {\n cursor: not-allowed;\n}\n.radio-inline.disabled,\n.checkbox-inline.disabled,\nfieldset[disabled] .radio-inline,\nfieldset[disabled] .checkbox-inline {\n cursor: not-allowed;\n}\n.radio.disabled label,\n.checkbox.disabled label,\nfieldset[disabled] .radio label,\nfieldset[disabled] .checkbox label {\n cursor: not-allowed;\n}\n.form-control-static {\n min-height: 34px;\n padding-top: 7px;\n padding-bottom: 7px;\n margin-bottom: 0;\n}\n.form-control-static.input-lg,\n.form-control-static.input-sm {\n padding-right: 0;\n padding-left: 0;\n}\n.input-sm {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-sm {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-sm,\nselect[multiple].input-sm {\n height: auto;\n}\n.form-group-sm .form-control {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.form-group-sm select.form-control {\n height: 30px;\n line-height: 30px;\n}\n.form-group-sm textarea.form-control,\n.form-group-sm select[multiple].form-control {\n height: auto;\n}\n.form-group-sm .form-control-static {\n height: 30px;\n min-height: 32px;\n padding: 6px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.input-lg {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-lg {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-lg,\nselect[multiple].input-lg {\n height: auto;\n}\n.form-group-lg .form-control {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.form-group-lg select.form-control {\n height: 46px;\n line-height: 46px;\n}\n.form-group-lg textarea.form-control,\n.form-group-lg select[multiple].form-control {\n height: auto;\n}\n.form-group-lg .form-control-static {\n height: 46px;\n min-height: 38px;\n padding: 11px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.has-feedback {\n position: relative;\n}\n.has-feedback .form-control {\n padding-right: 42.5px;\n}\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2;\n display: block;\n width: 34px;\n height: 34px;\n line-height: 34px;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: 46px;\n height: 46px;\n line-height: 46px;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: 30px;\n height: 30px;\n line-height: 30px;\n}\n.has-success .help-block,\n.has-success .control-label,\n.has-success .radio,\n.has-success .checkbox,\n.has-success .radio-inline,\n.has-success .checkbox-inline,\n.has-success.radio label,\n.has-success.checkbox label,\n.has-success.radio-inline label,\n.has-success.checkbox-inline label {\n color: #3c763d;\n}\n.has-success .form-control {\n border-color: #3c763d;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-success .form-control:focus {\n border-color: #2b542c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;\n}\n.has-success .input-group-addon {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #3c763d;\n}\n.has-success .form-control-feedback {\n color: #3c763d;\n}\n.has-warning .help-block,\n.has-warning .control-label,\n.has-warning .radio,\n.has-warning .checkbox,\n.has-warning .radio-inline,\n.has-warning .checkbox-inline,\n.has-warning.radio label,\n.has-warning.checkbox label,\n.has-warning.radio-inline label,\n.has-warning.checkbox-inline label {\n color: #8a6d3b;\n}\n.has-warning .form-control {\n border-color: #8a6d3b;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-warning .form-control:focus {\n border-color: #66512c;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;\n}\n.has-warning .input-group-addon {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #8a6d3b;\n}\n.has-warning .form-control-feedback {\n color: #8a6d3b;\n}\n.has-error .help-block,\n.has-error .control-label,\n.has-error .radio,\n.has-error .checkbox,\n.has-error .radio-inline,\n.has-error .checkbox-inline,\n.has-error.radio label,\n.has-error.checkbox label,\n.has-error.radio-inline label,\n.has-error.checkbox-inline label {\n color: #a94442;\n}\n.has-error .form-control {\n border-color: #a94442;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n}\n.has-error .form-control:focus {\n border-color: #843534;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;\n}\n.has-error .input-group-addon {\n color: #a94442;\n background-color: #f2dede;\n border-color: #a94442;\n}\n.has-error .form-control-feedback {\n color: #a94442;\n}\n.has-feedback label ~ .form-control-feedback {\n top: 25px;\n}\n.has-feedback label.sr-only ~ .form-control-feedback {\n top: 0;\n}\n.help-block {\n display: block;\n margin-top: 5px;\n margin-bottom: 10px;\n color: #737373;\n}\n@media (min-width: 768px) {\n .form-inline .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .form-inline .form-control-static {\n display: inline-block;\n }\n .form-inline .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .form-inline .input-group .input-group-addon,\n .form-inline .input-group .input-group-btn,\n .form-inline .input-group .form-control {\n width: auto;\n }\n .form-inline .input-group > .form-control {\n width: 100%;\n }\n .form-inline .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio,\n .form-inline .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .form-inline .radio label,\n .form-inline .checkbox label {\n padding-left: 0;\n }\n .form-inline .radio input[type=\"radio\"],\n .form-inline .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .form-inline .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox,\n.form-horizontal .radio-inline,\n.form-horizontal .checkbox-inline {\n padding-top: 7px;\n margin-top: 0;\n margin-bottom: 0;\n}\n.form-horizontal .radio,\n.form-horizontal .checkbox {\n min-height: 27px;\n}\n.form-horizontal .form-group {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .control-label {\n padding-top: 7px;\n margin-bottom: 0;\n text-align: right;\n }\n}\n.form-horizontal .has-feedback .form-control-feedback {\n right: 15px;\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-lg .control-label {\n padding-top: 11px;\n font-size: 18px;\n }\n}\n@media (min-width: 768px) {\n .form-horizontal .form-group-sm .control-label {\n padding-top: 6px;\n font-size: 12px;\n }\n}\n.btn {\n display: inline-block;\n padding: 6px 12px;\n margin-bottom: 0;\n font-size: 14px;\n font-weight: normal;\n line-height: 1.42857143;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n -ms-touch-action: manipulation;\n touch-action: manipulation;\n cursor: pointer;\n -webkit-user-select: none;\n -moz-user-select: none;\n -ms-user-select: none;\n user-select: none;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.btn:focus,\n.btn:active:focus,\n.btn.active:focus,\n.btn.focus,\n.btn:active.focus,\n.btn.active.focus {\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n.btn:hover,\n.btn:focus,\n.btn.focus {\n color: #333;\n text-decoration: none;\n}\n.btn:active,\n.btn.active {\n background-image: none;\n outline: 0;\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn.disabled,\n.btn[disabled],\nfieldset[disabled] .btn {\n cursor: not-allowed;\n filter: alpha(opacity=65);\n -webkit-box-shadow: none;\n box-shadow: none;\n opacity: .65;\n}\na.btn.disabled,\nfieldset[disabled] a.btn {\n pointer-events: none;\n}\n.btn-default {\n color: #333;\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default:focus,\n.btn-default.focus {\n color: #333;\n background-color: #e6e6e6;\n border-color: #8c8c8c;\n}\n.btn-default:hover {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n color: #333;\n background-color: #e6e6e6;\n border-color: #adadad;\n}\n.btn-default:active:hover,\n.btn-default.active:hover,\n.open > .dropdown-toggle.btn-default:hover,\n.btn-default:active:focus,\n.btn-default.active:focus,\n.open > .dropdown-toggle.btn-default:focus,\n.btn-default:active.focus,\n.btn-default.active.focus,\n.open > .dropdown-toggle.btn-default.focus {\n color: #333;\n background-color: #d4d4d4;\n border-color: #8c8c8c;\n}\n.btn-default:active,\n.btn-default.active,\n.open > .dropdown-toggle.btn-default {\n background-image: none;\n}\n.btn-default.disabled:hover,\n.btn-default[disabled]:hover,\nfieldset[disabled] .btn-default:hover,\n.btn-default.disabled:focus,\n.btn-default[disabled]:focus,\nfieldset[disabled] .btn-default:focus,\n.btn-default.disabled.focus,\n.btn-default[disabled].focus,\nfieldset[disabled] .btn-default.focus {\n background-color: #fff;\n border-color: #ccc;\n}\n.btn-default .badge {\n color: #fff;\n background-color: #333;\n}\n.btn-primary {\n color: #fff;\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary:focus,\n.btn-primary.focus {\n color: #fff;\n background-color: #286090;\n border-color: #122b40;\n}\n.btn-primary:hover {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n color: #fff;\n background-color: #286090;\n border-color: #204d74;\n}\n.btn-primary:active:hover,\n.btn-primary.active:hover,\n.open > .dropdown-toggle.btn-primary:hover,\n.btn-primary:active:focus,\n.btn-primary.active:focus,\n.open > .dropdown-toggle.btn-primary:focus,\n.btn-primary:active.focus,\n.btn-primary.active.focus,\n.open > .dropdown-toggle.btn-primary.focus {\n color: #fff;\n background-color: #204d74;\n border-color: #122b40;\n}\n.btn-primary:active,\n.btn-primary.active,\n.open > .dropdown-toggle.btn-primary {\n background-image: none;\n}\n.btn-primary.disabled:hover,\n.btn-primary[disabled]:hover,\nfieldset[disabled] .btn-primary:hover,\n.btn-primary.disabled:focus,\n.btn-primary[disabled]:focus,\nfieldset[disabled] .btn-primary:focus,\n.btn-primary.disabled.focus,\n.btn-primary[disabled].focus,\nfieldset[disabled] .btn-primary.focus {\n background-color: #337ab7;\n border-color: #2e6da4;\n}\n.btn-primary .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.btn-success {\n color: #fff;\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success:focus,\n.btn-success.focus {\n color: #fff;\n background-color: #449d44;\n border-color: #255625;\n}\n.btn-success:hover {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n color: #fff;\n background-color: #449d44;\n border-color: #398439;\n}\n.btn-success:active:hover,\n.btn-success.active:hover,\n.open > .dropdown-toggle.btn-success:hover,\n.btn-success:active:focus,\n.btn-success.active:focus,\n.open > .dropdown-toggle.btn-success:focus,\n.btn-success:active.focus,\n.btn-success.active.focus,\n.open > .dropdown-toggle.btn-success.focus {\n color: #fff;\n background-color: #398439;\n border-color: #255625;\n}\n.btn-success:active,\n.btn-success.active,\n.open > .dropdown-toggle.btn-success {\n background-image: none;\n}\n.btn-success.disabled:hover,\n.btn-success[disabled]:hover,\nfieldset[disabled] .btn-success:hover,\n.btn-success.disabled:focus,\n.btn-success[disabled]:focus,\nfieldset[disabled] .btn-success:focus,\n.btn-success.disabled.focus,\n.btn-success[disabled].focus,\nfieldset[disabled] .btn-success.focus {\n background-color: #5cb85c;\n border-color: #4cae4c;\n}\n.btn-success .badge {\n color: #5cb85c;\n background-color: #fff;\n}\n.btn-info {\n color: #fff;\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info:focus,\n.btn-info.focus {\n color: #fff;\n background-color: #31b0d5;\n border-color: #1b6d85;\n}\n.btn-info:hover {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n color: #fff;\n background-color: #31b0d5;\n border-color: #269abc;\n}\n.btn-info:active:hover,\n.btn-info.active:hover,\n.open > .dropdown-toggle.btn-info:hover,\n.btn-info:active:focus,\n.btn-info.active:focus,\n.open > .dropdown-toggle.btn-info:focus,\n.btn-info:active.focus,\n.btn-info.active.focus,\n.open > .dropdown-toggle.btn-info.focus {\n color: #fff;\n background-color: #269abc;\n border-color: #1b6d85;\n}\n.btn-info:active,\n.btn-info.active,\n.open > .dropdown-toggle.btn-info {\n background-image: none;\n}\n.btn-info.disabled:hover,\n.btn-info[disabled]:hover,\nfieldset[disabled] .btn-info:hover,\n.btn-info.disabled:focus,\n.btn-info[disabled]:focus,\nfieldset[disabled] .btn-info:focus,\n.btn-info.disabled.focus,\n.btn-info[disabled].focus,\nfieldset[disabled] .btn-info.focus {\n background-color: #5bc0de;\n border-color: #46b8da;\n}\n.btn-info .badge {\n color: #5bc0de;\n background-color: #fff;\n}\n.btn-warning {\n color: #fff;\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning:focus,\n.btn-warning.focus {\n color: #fff;\n background-color: #ec971f;\n border-color: #985f0d;\n}\n.btn-warning:hover {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n color: #fff;\n background-color: #ec971f;\n border-color: #d58512;\n}\n.btn-warning:active:hover,\n.btn-warning.active:hover,\n.open > .dropdown-toggle.btn-warning:hover,\n.btn-warning:active:focus,\n.btn-warning.active:focus,\n.open > .dropdown-toggle.btn-warning:focus,\n.btn-warning:active.focus,\n.btn-warning.active.focus,\n.open > .dropdown-toggle.btn-warning.focus {\n color: #fff;\n background-color: #d58512;\n border-color: #985f0d;\n}\n.btn-warning:active,\n.btn-warning.active,\n.open > .dropdown-toggle.btn-warning {\n background-image: none;\n}\n.btn-warning.disabled:hover,\n.btn-warning[disabled]:hover,\nfieldset[disabled] .btn-warning:hover,\n.btn-warning.disabled:focus,\n.btn-warning[disabled]:focus,\nfieldset[disabled] .btn-warning:focus,\n.btn-warning.disabled.focus,\n.btn-warning[disabled].focus,\nfieldset[disabled] .btn-warning.focus {\n background-color: #f0ad4e;\n border-color: #eea236;\n}\n.btn-warning .badge {\n color: #f0ad4e;\n background-color: #fff;\n}\n.btn-danger {\n color: #fff;\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger:focus,\n.btn-danger.focus {\n color: #fff;\n background-color: #c9302c;\n border-color: #761c19;\n}\n.btn-danger:hover {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n color: #fff;\n background-color: #c9302c;\n border-color: #ac2925;\n}\n.btn-danger:active:hover,\n.btn-danger.active:hover,\n.open > .dropdown-toggle.btn-danger:hover,\n.btn-danger:active:focus,\n.btn-danger.active:focus,\n.open > .dropdown-toggle.btn-danger:focus,\n.btn-danger:active.focus,\n.btn-danger.active.focus,\n.open > .dropdown-toggle.btn-danger.focus {\n color: #fff;\n background-color: #ac2925;\n border-color: #761c19;\n}\n.btn-danger:active,\n.btn-danger.active,\n.open > .dropdown-toggle.btn-danger {\n background-image: none;\n}\n.btn-danger.disabled:hover,\n.btn-danger[disabled]:hover,\nfieldset[disabled] .btn-danger:hover,\n.btn-danger.disabled:focus,\n.btn-danger[disabled]:focus,\nfieldset[disabled] .btn-danger:focus,\n.btn-danger.disabled.focus,\n.btn-danger[disabled].focus,\nfieldset[disabled] .btn-danger.focus {\n background-color: #d9534f;\n border-color: #d43f3a;\n}\n.btn-danger .badge {\n color: #d9534f;\n background-color: #fff;\n}\n.btn-link {\n font-weight: normal;\n color: #337ab7;\n border-radius: 0;\n}\n.btn-link,\n.btn-link:active,\n.btn-link.active,\n.btn-link[disabled],\nfieldset[disabled] .btn-link {\n background-color: transparent;\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn-link,\n.btn-link:hover,\n.btn-link:focus,\n.btn-link:active {\n border-color: transparent;\n}\n.btn-link:hover,\n.btn-link:focus {\n color: #23527c;\n text-decoration: underline;\n background-color: transparent;\n}\n.btn-link[disabled]:hover,\nfieldset[disabled] .btn-link:hover,\n.btn-link[disabled]:focus,\nfieldset[disabled] .btn-link:focus {\n color: #777;\n text-decoration: none;\n}\n.btn-lg,\n.btn-group-lg > .btn {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-xs,\n.btn-group-xs > .btn {\n padding: 1px 5px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\n.btn-block {\n display: block;\n width: 100%;\n}\n.btn-block + .btn-block {\n margin-top: 5px;\n}\ninput[type=\"submit\"].btn-block,\ninput[type=\"reset\"].btn-block,\ninput[type=\"button\"].btn-block {\n width: 100%;\n}\n.fade {\n opacity: 0;\n -webkit-transition: opacity .15s linear;\n -o-transition: opacity .15s linear;\n transition: opacity .15s linear;\n}\n.fade.in {\n opacity: 1;\n}\n.collapse {\n display: none;\n}\n.collapse.in {\n display: block;\n}\ntr.collapse.in {\n display: table-row;\n}\ntbody.collapse.in {\n display: table-row-group;\n}\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n -webkit-transition-timing-function: ease;\n -o-transition-timing-function: ease;\n transition-timing-function: ease;\n -webkit-transition-duration: .35s;\n -o-transition-duration: .35s;\n transition-duration: .35s;\n -webkit-transition-property: height, visibility;\n -o-transition-property: height, visibility;\n transition-property: height, visibility;\n}\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: 4px dashed;\n border-top: 4px solid \\9;\n border-right: 4px solid transparent;\n border-left: 4px solid transparent;\n}\n.dropup,\n.dropdown {\n position: relative;\n}\n.dropdown-toggle:focus {\n outline: 0;\n}\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: 1000;\n display: none;\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0;\n font-size: 14px;\n text-align: left;\n list-style: none;\n background-color: #fff;\n -webkit-background-clip: padding-box;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, .15);\n border-radius: 4px;\n -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n box-shadow: 0 6px 12px rgba(0, 0, 0, .175);\n}\n.dropdown-menu.pull-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu .divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.dropdown-menu > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: 1.42857143;\n color: #333;\n white-space: nowrap;\n}\n.dropdown-menu > li > a:hover,\n.dropdown-menu > li > a:focus {\n color: #262626;\n text-decoration: none;\n background-color: #f5f5f5;\n}\n.dropdown-menu > .active > a,\n.dropdown-menu > .active > a:hover,\n.dropdown-menu > .active > a:focus {\n color: #fff;\n text-decoration: none;\n background-color: #337ab7;\n outline: 0;\n}\n.dropdown-menu > .disabled > a,\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n color: #777;\n}\n.dropdown-menu > .disabled > a:hover,\n.dropdown-menu > .disabled > a:focus {\n text-decoration: none;\n cursor: not-allowed;\n background-color: transparent;\n background-image: none;\n filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);\n}\n.open > .dropdown-menu {\n display: block;\n}\n.open > a {\n outline: 0;\n}\n.dropdown-menu-right {\n right: 0;\n left: auto;\n}\n.dropdown-menu-left {\n right: auto;\n left: 0;\n}\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: 12px;\n line-height: 1.42857143;\n color: #777;\n white-space: nowrap;\n}\n.dropdown-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 990;\n}\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n.dropup .caret,\n.navbar-fixed-bottom .dropdown .caret {\n content: \"\";\n border-top: 0;\n border-bottom: 4px dashed;\n border-bottom: 4px solid \\9;\n}\n.dropup .dropdown-menu,\n.navbar-fixed-bottom .dropdown .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n}\n@media (min-width: 768px) {\n .navbar-right .dropdown-menu {\n right: 0;\n left: auto;\n }\n .navbar-right .dropdown-menu-left {\n right: auto;\n left: 0;\n }\n}\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n}\n.btn-group > .btn,\n.btn-group-vertical > .btn {\n position: relative;\n float: left;\n}\n.btn-group > .btn:hover,\n.btn-group-vertical > .btn:hover,\n.btn-group > .btn:focus,\n.btn-group-vertical > .btn:focus,\n.btn-group > .btn:active,\n.btn-group-vertical > .btn:active,\n.btn-group > .btn.active,\n.btn-group-vertical > .btn.active {\n z-index: 2;\n}\n.btn-group .btn + .btn,\n.btn-group .btn + .btn-group,\n.btn-group .btn-group + .btn,\n.btn-group .btn-group + .btn-group {\n margin-left: -1px;\n}\n.btn-toolbar {\n margin-left: -5px;\n}\n.btn-toolbar .btn,\n.btn-toolbar .btn-group,\n.btn-toolbar .input-group {\n float: left;\n}\n.btn-toolbar > .btn,\n.btn-toolbar > .btn-group,\n.btn-toolbar > .input-group {\n margin-left: 5px;\n}\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n.btn-group > .btn:first-child {\n margin-left: 0;\n}\n.btn-group > .btn:first-child:not(:last-child):not(.dropdown-toggle) {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n.btn-group > .btn + .dropdown-toggle {\n padding-right: 8px;\n padding-left: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-right: 12px;\n padding-left: 12px;\n}\n.btn-group.open .dropdown-toggle {\n -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n}\n.btn-group.open .dropdown-toggle.btn-link {\n -webkit-box-shadow: none;\n box-shadow: none;\n}\n.btn .caret {\n margin-left: 0;\n}\n.btn-lg .caret {\n border-width: 5px 5px 0;\n border-bottom-width: 0;\n}\n.dropup .btn-lg .caret {\n border-width: 0 5px 5px;\n}\n.btn-group-vertical > .btn,\n.btn-group-vertical > .btn-group,\n.btn-group-vertical > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n}\n.btn-group-vertical > .btn-group > .btn {\n float: none;\n}\n.btn-group-vertical > .btn + .btn,\n.btn-group-vertical > .btn + .btn-group,\n.btn-group-vertical > .btn-group + .btn,\n.btn-group-vertical > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n}\n.btn-group-vertical > .btn:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.btn-group-vertical > .btn:first-child:not(:last-child) {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn:last-child:not(:first-child) {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,\n.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n}\n.btn-group-justified > .btn,\n.btn-group-justified > .btn-group {\n display: table-cell;\n float: none;\n width: 1%;\n}\n.btn-group-justified > .btn-group .btn {\n width: 100%;\n}\n.btn-group-justified > .btn-group .dropdown-menu {\n left: auto;\n}\n[data-toggle=\"buttons\"] > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"radio\"],\n[data-toggle=\"buttons\"] > .btn input[type=\"checkbox\"],\n[data-toggle=\"buttons\"] > .btn-group > .btn input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0, 0, 0, 0);\n pointer-events: none;\n}\n.input-group {\n position: relative;\n display: table;\n border-collapse: separate;\n}\n.input-group[class*=\"col-\"] {\n float: none;\n padding-right: 0;\n padding-left: 0;\n}\n.input-group .form-control {\n position: relative;\n z-index: 2;\n float: left;\n width: 100%;\n margin-bottom: 0;\n}\n.input-group .form-control:focus {\n z-index: 3;\n}\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n border-radius: 6px;\n}\nselect.input-group-lg > .form-control,\nselect.input-group-lg > .input-group-addon,\nselect.input-group-lg > .input-group-btn > .btn {\n height: 46px;\n line-height: 46px;\n}\ntextarea.input-group-lg > .form-control,\ntextarea.input-group-lg > .input-group-addon,\ntextarea.input-group-lg > .input-group-btn > .btn,\nselect[multiple].input-group-lg > .form-control,\nselect[multiple].input-group-lg > .input-group-addon,\nselect[multiple].input-group-lg > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n border-radius: 3px;\n}\nselect.input-group-sm > .form-control,\nselect.input-group-sm > .input-group-addon,\nselect.input-group-sm > .input-group-btn > .btn {\n height: 30px;\n line-height: 30px;\n}\ntextarea.input-group-sm > .form-control,\ntextarea.input-group-sm > .input-group-addon,\ntextarea.input-group-sm > .input-group-btn > .btn,\nselect[multiple].input-group-sm > .form-control,\nselect[multiple].input-group-sm > .input-group-addon,\nselect[multiple].input-group-sm > .input-group-btn > .btn {\n height: auto;\n}\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n}\n.input-group-addon:not(:first-child):not(:last-child),\n.input-group-btn:not(:first-child):not(:last-child),\n.input-group .form-control:not(:first-child):not(:last-child) {\n border-radius: 0;\n}\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle;\n}\n.input-group-addon {\n padding: 6px 12px;\n font-size: 14px;\n font-weight: normal;\n line-height: 1;\n color: #555;\n text-align: center;\n background-color: #eee;\n border: 1px solid #ccc;\n border-radius: 4px;\n}\n.input-group-addon.input-sm {\n padding: 5px 10px;\n font-size: 12px;\n border-radius: 3px;\n}\n.input-group-addon.input-lg {\n padding: 10px 16px;\n font-size: 18px;\n border-radius: 6px;\n}\n.input-group-addon input[type=\"radio\"],\n.input-group-addon input[type=\"checkbox\"] {\n margin-top: 0;\n}\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n border-top-right-radius: 0;\n border-bottom-right-radius: 0;\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n border-top-left-radius: 0;\n border-bottom-left-radius: 0;\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n.input-group-btn {\n position: relative;\n font-size: 0;\n white-space: nowrap;\n}\n.input-group-btn > .btn {\n position: relative;\n}\n.input-group-btn > .btn + .btn {\n margin-left: -1px;\n}\n.input-group-btn > .btn:hover,\n.input-group-btn > .btn:focus,\n.input-group-btn > .btn:active {\n z-index: 2;\n}\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group {\n margin-right: -1px;\n}\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group {\n z-index: 2;\n margin-left: -1px;\n}\n.nav {\n padding-left: 0;\n margin-bottom: 0;\n list-style: none;\n}\n.nav > li {\n position: relative;\n display: block;\n}\n.nav > li > a {\n position: relative;\n display: block;\n padding: 10px 15px;\n}\n.nav > li > a:hover,\n.nav > li > a:focus {\n text-decoration: none;\n background-color: #eee;\n}\n.nav > li.disabled > a {\n color: #777;\n}\n.nav > li.disabled > a:hover,\n.nav > li.disabled > a:focus {\n color: #777;\n text-decoration: none;\n cursor: not-allowed;\n background-color: transparent;\n}\n.nav .open > a,\n.nav .open > a:hover,\n.nav .open > a:focus {\n background-color: #eee;\n border-color: #337ab7;\n}\n.nav .nav-divider {\n height: 1px;\n margin: 9px 0;\n overflow: hidden;\n background-color: #e5e5e5;\n}\n.nav > li > a > img {\n max-width: none;\n}\n.nav-tabs {\n border-bottom: 1px solid #ddd;\n}\n.nav-tabs > li {\n float: left;\n margin-bottom: -1px;\n}\n.nav-tabs > li > a {\n margin-right: 2px;\n line-height: 1.42857143;\n border: 1px solid transparent;\n border-radius: 4px 4px 0 0;\n}\n.nav-tabs > li > a:hover {\n border-color: #eee #eee #ddd;\n}\n.nav-tabs > li.active > a,\n.nav-tabs > li.active > a:hover,\n.nav-tabs > li.active > a:focus {\n color: #555;\n cursor: default;\n background-color: #fff;\n border: 1px solid #ddd;\n border-bottom-color: transparent;\n}\n.nav-tabs.nav-justified {\n width: 100%;\n border-bottom: 0;\n}\n.nav-tabs.nav-justified > li {\n float: none;\n}\n.nav-tabs.nav-justified > li > a {\n margin-bottom: 5px;\n text-align: center;\n}\n.nav-tabs.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-tabs.nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs.nav-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs.nav-justified > .active > a,\n.nav-tabs.nav-justified > .active > a:hover,\n.nav-tabs.nav-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs.nav-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs.nav-justified > .active > a,\n .nav-tabs.nav-justified > .active > a:hover,\n .nav-tabs.nav-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.nav-pills > li {\n float: left;\n}\n.nav-pills > li > a {\n border-radius: 4px;\n}\n.nav-pills > li + li {\n margin-left: 2px;\n}\n.nav-pills > li.active > a,\n.nav-pills > li.active > a:hover,\n.nav-pills > li.active > a:focus {\n color: #fff;\n background-color: #337ab7;\n}\n.nav-stacked > li {\n float: none;\n}\n.nav-stacked > li + li {\n margin-top: 2px;\n margin-left: 0;\n}\n.nav-justified {\n width: 100%;\n}\n.nav-justified > li {\n float: none;\n}\n.nav-justified > li > a {\n margin-bottom: 5px;\n text-align: center;\n}\n.nav-justified > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n}\n@media (min-width: 768px) {\n .nav-justified > li {\n display: table-cell;\n width: 1%;\n }\n .nav-justified > li > a {\n margin-bottom: 0;\n }\n}\n.nav-tabs-justified {\n border-bottom: 0;\n}\n.nav-tabs-justified > li > a {\n margin-right: 0;\n border-radius: 4px;\n}\n.nav-tabs-justified > .active > a,\n.nav-tabs-justified > .active > a:hover,\n.nav-tabs-justified > .active > a:focus {\n border: 1px solid #ddd;\n}\n@media (min-width: 768px) {\n .nav-tabs-justified > li > a {\n border-bottom: 1px solid #ddd;\n border-radius: 4px 4px 0 0;\n }\n .nav-tabs-justified > .active > a,\n .nav-tabs-justified > .active > a:hover,\n .nav-tabs-justified > .active > a:focus {\n border-bottom-color: #fff;\n }\n}\n.tab-content > .tab-pane {\n display: none;\n}\n.tab-content > .active {\n display: block;\n}\n.nav-tabs .dropdown-menu {\n margin-top: -1px;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.navbar {\n position: relative;\n min-height: 50px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n}\n@media (min-width: 768px) {\n .navbar {\n border-radius: 4px;\n }\n}\n@media (min-width: 768px) {\n .navbar-header {\n float: left;\n }\n}\n.navbar-collapse {\n padding-right: 15px;\n padding-left: 15px;\n overflow-x: visible;\n -webkit-overflow-scrolling: touch;\n border-top: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);\n}\n.navbar-collapse.in {\n overflow-y: auto;\n}\n@media (min-width: 768px) {\n .navbar-collapse {\n width: auto;\n border-top: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n .navbar-collapse.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0;\n overflow: visible !important;\n }\n .navbar-collapse.in {\n overflow-y: visible;\n }\n .navbar-fixed-top .navbar-collapse,\n .navbar-static-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n padding-right: 0;\n padding-left: 0;\n }\n}\n.navbar-fixed-top .navbar-collapse,\n.navbar-fixed-bottom .navbar-collapse {\n max-height: 340px;\n}\n@media (max-device-width: 480px) and (orientation: landscape) {\n .navbar-fixed-top .navbar-collapse,\n .navbar-fixed-bottom .navbar-collapse {\n max-height: 200px;\n }\n}\n.container > .navbar-header,\n.container-fluid > .navbar-header,\n.container > .navbar-collapse,\n.container-fluid > .navbar-collapse {\n margin-right: -15px;\n margin-left: -15px;\n}\n@media (min-width: 768px) {\n .container > .navbar-header,\n .container-fluid > .navbar-header,\n .container > .navbar-collapse,\n .container-fluid > .navbar-collapse {\n margin-right: 0;\n margin-left: 0;\n }\n}\n.navbar-static-top {\n z-index: 1000;\n border-width: 0 0 1px;\n}\n@media (min-width: 768px) {\n .navbar-static-top {\n border-radius: 0;\n }\n}\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: 1030;\n}\n@media (min-width: 768px) {\n .navbar-fixed-top,\n .navbar-fixed-bottom {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0;\n border-width: 1px 0 0;\n}\n.navbar-brand {\n float: left;\n height: 50px;\n padding: 15px 15px;\n font-size: 18px;\n line-height: 20px;\n}\n.navbar-brand:hover,\n.navbar-brand:focus {\n text-decoration: none;\n}\n.navbar-brand > img {\n display: block;\n}\n@media (min-width: 768px) {\n .navbar > .container .navbar-brand,\n .navbar > .container-fluid .navbar-brand {\n margin-left: -15px;\n }\n}\n.navbar-toggle {\n position: relative;\n float: right;\n padding: 9px 10px;\n margin-top: 8px;\n margin-right: 15px;\n margin-bottom: 8px;\n background-color: transparent;\n background-image: none;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.navbar-toggle:focus {\n outline: 0;\n}\n.navbar-toggle .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n}\n.navbar-toggle .icon-bar + .icon-bar {\n margin-top: 4px;\n}\n@media (min-width: 768px) {\n .navbar-toggle {\n display: none;\n }\n}\n.navbar-nav {\n margin: 7.5px -15px;\n}\n.navbar-nav > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: 20px;\n}\n@media (max-width: 767px) {\n .navbar-nav .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n .navbar-nav .open .dropdown-menu > li > a,\n .navbar-nav .open .dropdown-menu .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n .navbar-nav .open .dropdown-menu > li > a {\n line-height: 20px;\n }\n .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-nav .open .dropdown-menu > li > a:focus {\n background-image: none;\n }\n}\n@media (min-width: 768px) {\n .navbar-nav {\n float: left;\n margin: 0;\n }\n .navbar-nav > li {\n float: left;\n }\n .navbar-nav > li > a {\n padding-top: 15px;\n padding-bottom: 15px;\n }\n}\n.navbar-form {\n padding: 10px 15px;\n margin-top: 8px;\n margin-right: -15px;\n margin-bottom: 8px;\n margin-left: -15px;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);\n box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1), 0 1px 0 rgba(255, 255, 255, .1);\n}\n@media (min-width: 768px) {\n .navbar-form .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .form-control {\n display: inline-block;\n width: auto;\n vertical-align: middle;\n }\n .navbar-form .form-control-static {\n display: inline-block;\n }\n .navbar-form .input-group {\n display: inline-table;\n vertical-align: middle;\n }\n .navbar-form .input-group .input-group-addon,\n .navbar-form .input-group .input-group-btn,\n .navbar-form .input-group .form-control {\n width: auto;\n }\n .navbar-form .input-group > .form-control {\n width: 100%;\n }\n .navbar-form .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio,\n .navbar-form .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n }\n .navbar-form .radio label,\n .navbar-form .checkbox label {\n padding-left: 0;\n }\n .navbar-form .radio input[type=\"radio\"],\n .navbar-form .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n .navbar-form .has-feedback .form-control-feedback {\n top: 0;\n }\n}\n@media (max-width: 767px) {\n .navbar-form .form-group {\n margin-bottom: 5px;\n }\n .navbar-form .form-group:last-child {\n margin-bottom: 0;\n }\n}\n@media (min-width: 768px) {\n .navbar-form {\n width: auto;\n padding-top: 0;\n padding-bottom: 0;\n margin-right: 0;\n margin-left: 0;\n border: 0;\n -webkit-box-shadow: none;\n box-shadow: none;\n }\n}\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-right-radius: 0;\n border-bottom-left-radius: 0;\n}\n.navbar-btn {\n margin-top: 8px;\n margin-bottom: 8px;\n}\n.navbar-btn.btn-sm {\n margin-top: 10px;\n margin-bottom: 10px;\n}\n.navbar-btn.btn-xs {\n margin-top: 14px;\n margin-bottom: 14px;\n}\n.navbar-text {\n margin-top: 15px;\n margin-bottom: 15px;\n}\n@media (min-width: 768px) {\n .navbar-text {\n float: left;\n margin-right: 15px;\n margin-left: 15px;\n }\n}\n@media (min-width: 768px) {\n .navbar-left {\n float: left !important;\n }\n .navbar-right {\n float: right !important;\n margin-right: -15px;\n }\n .navbar-right ~ .navbar-right {\n margin-right: 0;\n }\n}\n.navbar-default {\n background-color: #f8f8f8;\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-brand {\n color: #777;\n}\n.navbar-default .navbar-brand:hover,\n.navbar-default .navbar-brand:focus {\n color: #5e5e5e;\n background-color: transparent;\n}\n.navbar-default .navbar-text {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a {\n color: #777;\n}\n.navbar-default .navbar-nav > li > a:hover,\n.navbar-default .navbar-nav > li > a:focus {\n color: #333;\n background-color: transparent;\n}\n.navbar-default .navbar-nav > .active > a,\n.navbar-default .navbar-nav > .active > a:hover,\n.navbar-default .navbar-nav > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .disabled > a,\n.navbar-default .navbar-nav > .disabled > a:hover,\n.navbar-default .navbar-nav > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n}\n.navbar-default .navbar-toggle {\n border-color: #ddd;\n}\n.navbar-default .navbar-toggle:hover,\n.navbar-default .navbar-toggle:focus {\n background-color: #ddd;\n}\n.navbar-default .navbar-toggle .icon-bar {\n background-color: #888;\n}\n.navbar-default .navbar-collapse,\n.navbar-default .navbar-form {\n border-color: #e7e7e7;\n}\n.navbar-default .navbar-nav > .open > a,\n.navbar-default .navbar-nav > .open > a:hover,\n.navbar-default .navbar-nav > .open > a:focus {\n color: #555;\n background-color: #e7e7e7;\n}\n@media (max-width: 767px) {\n .navbar-default .navbar-nav .open .dropdown-menu > li > a {\n color: #777;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #333;\n background-color: transparent;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #555;\n background-color: #e7e7e7;\n }\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #ccc;\n background-color: transparent;\n }\n}\n.navbar-default .navbar-link {\n color: #777;\n}\n.navbar-default .navbar-link:hover {\n color: #333;\n}\n.navbar-default .btn-link {\n color: #777;\n}\n.navbar-default .btn-link:hover,\n.navbar-default .btn-link:focus {\n color: #333;\n}\n.navbar-default .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-default .btn-link:hover,\n.navbar-default .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-default .btn-link:focus {\n color: #ccc;\n}\n.navbar-inverse {\n background-color: #222;\n border-color: #080808;\n}\n.navbar-inverse .navbar-brand {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-brand:hover,\n.navbar-inverse .navbar-brand:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-text {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-nav > li > a:hover,\n.navbar-inverse .navbar-nav > li > a:focus {\n color: #fff;\n background-color: transparent;\n}\n.navbar-inverse .navbar-nav > .active > a,\n.navbar-inverse .navbar-nav > .active > a:hover,\n.navbar-inverse .navbar-nav > .active > a:focus {\n color: #fff;\n background-color: #080808;\n}\n.navbar-inverse .navbar-nav > .disabled > a,\n.navbar-inverse .navbar-nav > .disabled > a:hover,\n.navbar-inverse .navbar-nav > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n}\n.navbar-inverse .navbar-toggle {\n border-color: #333;\n}\n.navbar-inverse .navbar-toggle:hover,\n.navbar-inverse .navbar-toggle:focus {\n background-color: #333;\n}\n.navbar-inverse .navbar-toggle .icon-bar {\n background-color: #fff;\n}\n.navbar-inverse .navbar-collapse,\n.navbar-inverse .navbar-form {\n border-color: #101010;\n}\n.navbar-inverse .navbar-nav > .open > a,\n.navbar-inverse .navbar-nav > .open > a:hover,\n.navbar-inverse .navbar-nav > .open > a:focus {\n color: #fff;\n background-color: #080808;\n}\n@media (max-width: 767px) {\n .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {\n border-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu .divider {\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {\n color: #9d9d9d;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {\n color: #fff;\n background-color: transparent;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {\n color: #fff;\n background-color: #080808;\n }\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover,\n .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {\n color: #444;\n background-color: transparent;\n }\n}\n.navbar-inverse .navbar-link {\n color: #9d9d9d;\n}\n.navbar-inverse .navbar-link:hover {\n color: #fff;\n}\n.navbar-inverse .btn-link {\n color: #9d9d9d;\n}\n.navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link:focus {\n color: #fff;\n}\n.navbar-inverse .btn-link[disabled]:hover,\nfieldset[disabled] .navbar-inverse .btn-link:hover,\n.navbar-inverse .btn-link[disabled]:focus,\nfieldset[disabled] .navbar-inverse .btn-link:focus {\n color: #444;\n}\n.breadcrumb {\n padding: 8px 15px;\n margin-bottom: 20px;\n list-style: none;\n background-color: #f5f5f5;\n border-radius: 4px;\n}\n.breadcrumb > li {\n display: inline-block;\n}\n.breadcrumb > li + li:before {\n padding: 0 5px;\n color: #ccc;\n content: \"/\\00a0\";\n}\n.breadcrumb > .active {\n color: #777;\n}\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: 20px 0;\n border-radius: 4px;\n}\n.pagination > li {\n display: inline;\n}\n.pagination > li > a,\n.pagination > li > span {\n position: relative;\n float: left;\n padding: 6px 12px;\n margin-left: -1px;\n line-height: 1.42857143;\n color: #337ab7;\n text-decoration: none;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.pagination > li:first-child > a,\n.pagination > li:first-child > span {\n margin-left: 0;\n border-top-left-radius: 4px;\n border-bottom-left-radius: 4px;\n}\n.pagination > li:last-child > a,\n.pagination > li:last-child > span {\n border-top-right-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.pagination > li > a:hover,\n.pagination > li > span:hover,\n.pagination > li > a:focus,\n.pagination > li > span:focus {\n z-index: 2;\n color: #23527c;\n background-color: #eee;\n border-color: #ddd;\n}\n.pagination > .active > a,\n.pagination > .active > span,\n.pagination > .active > a:hover,\n.pagination > .active > span:hover,\n.pagination > .active > a:focus,\n.pagination > .active > span:focus {\n z-index: 3;\n color: #fff;\n cursor: default;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.pagination > .disabled > span,\n.pagination > .disabled > span:hover,\n.pagination > .disabled > span:focus,\n.pagination > .disabled > a,\n.pagination > .disabled > a:hover,\n.pagination > .disabled > a:focus {\n color: #777;\n cursor: not-allowed;\n background-color: #fff;\n border-color: #ddd;\n}\n.pagination-lg > li > a,\n.pagination-lg > li > span {\n padding: 10px 16px;\n font-size: 18px;\n line-height: 1.3333333;\n}\n.pagination-lg > li:first-child > a,\n.pagination-lg > li:first-child > span {\n border-top-left-radius: 6px;\n border-bottom-left-radius: 6px;\n}\n.pagination-lg > li:last-child > a,\n.pagination-lg > li:last-child > span {\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n}\n.pagination-sm > li > a,\n.pagination-sm > li > span {\n padding: 5px 10px;\n font-size: 12px;\n line-height: 1.5;\n}\n.pagination-sm > li:first-child > a,\n.pagination-sm > li:first-child > span {\n border-top-left-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.pagination-sm > li:last-child > a,\n.pagination-sm > li:last-child > span {\n border-top-right-radius: 3px;\n border-bottom-right-radius: 3px;\n}\n.pager {\n padding-left: 0;\n margin: 20px 0;\n text-align: center;\n list-style: none;\n}\n.pager li {\n display: inline;\n}\n.pager li > a,\n.pager li > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 15px;\n}\n.pager li > a:hover,\n.pager li > a:focus {\n text-decoration: none;\n background-color: #eee;\n}\n.pager .next > a,\n.pager .next > span {\n float: right;\n}\n.pager .previous > a,\n.pager .previous > span {\n float: left;\n}\n.pager .disabled > a,\n.pager .disabled > a:hover,\n.pager .disabled > a:focus,\n.pager .disabled > span {\n color: #777;\n cursor: not-allowed;\n background-color: #fff;\n}\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n}\na.label:hover,\na.label:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.label:empty {\n display: none;\n}\n.btn .label {\n position: relative;\n top: -1px;\n}\n.label-default {\n background-color: #777;\n}\n.label-default[href]:hover,\n.label-default[href]:focus {\n background-color: #5e5e5e;\n}\n.label-primary {\n background-color: #337ab7;\n}\n.label-primary[href]:hover,\n.label-primary[href]:focus {\n background-color: #286090;\n}\n.label-success {\n background-color: #5cb85c;\n}\n.label-success[href]:hover,\n.label-success[href]:focus {\n background-color: #449d44;\n}\n.label-info {\n background-color: #5bc0de;\n}\n.label-info[href]:hover,\n.label-info[href]:focus {\n background-color: #31b0d5;\n}\n.label-warning {\n background-color: #f0ad4e;\n}\n.label-warning[href]:hover,\n.label-warning[href]:focus {\n background-color: #ec971f;\n}\n.label-danger {\n background-color: #d9534f;\n}\n.label-danger[href]:hover,\n.label-danger[href]:focus {\n background-color: #c9302c;\n}\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: 12px;\n font-weight: bold;\n line-height: 1;\n color: #fff;\n text-align: center;\n white-space: nowrap;\n vertical-align: middle;\n background-color: #777;\n border-radius: 10px;\n}\n.badge:empty {\n display: none;\n}\n.btn .badge {\n position: relative;\n top: -1px;\n}\n.btn-xs .badge,\n.btn-group-xs > .btn .badge {\n top: 0;\n padding: 1px 5px;\n}\na.badge:hover,\na.badge:focus {\n color: #fff;\n text-decoration: none;\n cursor: pointer;\n}\n.list-group-item.active > .badge,\n.nav-pills > .active > a > .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.list-group-item > .badge {\n float: right;\n}\n.list-group-item > .badge + .badge {\n margin-right: 5px;\n}\n.nav-pills > li > a > .badge {\n margin-left: 3px;\n}\n.jumbotron {\n padding-top: 30px;\n padding-bottom: 30px;\n margin-bottom: 30px;\n color: inherit;\n background-color: #eee;\n}\n.jumbotron h1,\n.jumbotron .h1 {\n color: inherit;\n}\n.jumbotron p {\n margin-bottom: 15px;\n font-size: 21px;\n font-weight: 200;\n}\n.jumbotron > hr {\n border-top-color: #d5d5d5;\n}\n.container .jumbotron,\n.container-fluid .jumbotron {\n padding-right: 15px;\n padding-left: 15px;\n border-radius: 6px;\n}\n.jumbotron .container {\n max-width: 100%;\n}\n@media screen and (min-width: 768px) {\n .jumbotron {\n padding-top: 48px;\n padding-bottom: 48px;\n }\n .container .jumbotron,\n .container-fluid .jumbotron {\n padding-right: 60px;\n padding-left: 60px;\n }\n .jumbotron h1,\n .jumbotron .h1 {\n font-size: 63px;\n }\n}\n.thumbnail {\n display: block;\n padding: 4px;\n margin-bottom: 20px;\n line-height: 1.42857143;\n background-color: #fff;\n border: 1px solid #ddd;\n border-radius: 4px;\n -webkit-transition: border .2s ease-in-out;\n -o-transition: border .2s ease-in-out;\n transition: border .2s ease-in-out;\n}\n.thumbnail > img,\n.thumbnail a > img {\n margin-right: auto;\n margin-left: auto;\n}\na.thumbnail:hover,\na.thumbnail:focus,\na.thumbnail.active {\n border-color: #337ab7;\n}\n.thumbnail .caption {\n padding: 9px;\n color: #333;\n}\n.alert {\n padding: 15px;\n margin-bottom: 20px;\n border: 1px solid transparent;\n border-radius: 4px;\n}\n.alert h4 {\n margin-top: 0;\n color: inherit;\n}\n.alert .alert-link {\n font-weight: bold;\n}\n.alert > p,\n.alert > ul {\n margin-bottom: 0;\n}\n.alert > p + p {\n margin-top: 5px;\n}\n.alert-dismissable,\n.alert-dismissible {\n padding-right: 35px;\n}\n.alert-dismissable .close,\n.alert-dismissible .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n}\n.alert-success {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.alert-success hr {\n border-top-color: #c9e2b3;\n}\n.alert-success .alert-link {\n color: #2b542c;\n}\n.alert-info {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.alert-info hr {\n border-top-color: #a6e1ec;\n}\n.alert-info .alert-link {\n color: #245269;\n}\n.alert-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.alert-warning hr {\n border-top-color: #f7e1b5;\n}\n.alert-warning .alert-link {\n color: #66512c;\n}\n.alert-danger {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.alert-danger hr {\n border-top-color: #e4b9c0;\n}\n.alert-danger .alert-link {\n color: #843534;\n}\n@-webkit-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@-o-keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n@keyframes progress-bar-stripes {\n from {\n background-position: 40px 0;\n }\n to {\n background-position: 0 0;\n }\n}\n.progress {\n height: 20px;\n margin-bottom: 20px;\n overflow: hidden;\n background-color: #f5f5f5;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);\n box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);\n}\n.progress-bar {\n float: left;\n width: 0;\n height: 100%;\n font-size: 12px;\n line-height: 20px;\n color: #fff;\n text-align: center;\n background-color: #337ab7;\n -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);\n box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .15);\n -webkit-transition: width .6s ease;\n -o-transition: width .6s ease;\n transition: width .6s ease;\n}\n.progress-striped .progress-bar,\n.progress-bar-striped {\n 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);\n 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);\n 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);\n -webkit-background-size: 40px 40px;\n background-size: 40px 40px;\n}\n.progress.active .progress-bar,\n.progress-bar.active {\n -webkit-animation: progress-bar-stripes 2s linear infinite;\n -o-animation: progress-bar-stripes 2s linear infinite;\n animation: progress-bar-stripes 2s linear infinite;\n}\n.progress-bar-success {\n background-color: #5cb85c;\n}\n.progress-striped .progress-bar-success {\n 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);\n 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);\n 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);\n}\n.progress-bar-info {\n background-color: #5bc0de;\n}\n.progress-striped .progress-bar-info {\n 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);\n 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);\n 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);\n}\n.progress-bar-warning {\n background-color: #f0ad4e;\n}\n.progress-striped .progress-bar-warning {\n 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);\n 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);\n 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);\n}\n.progress-bar-danger {\n background-color: #d9534f;\n}\n.progress-striped .progress-bar-danger {\n 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);\n 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);\n 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);\n}\n.media {\n margin-top: 15px;\n}\n.media:first-child {\n margin-top: 0;\n}\n.media,\n.media-body {\n overflow: hidden;\n zoom: 1;\n}\n.media-body {\n width: 10000px;\n}\n.media-object {\n display: block;\n}\n.media-object.img-thumbnail {\n max-width: none;\n}\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n.media-middle {\n vertical-align: middle;\n}\n.media-bottom {\n vertical-align: bottom;\n}\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n.list-group {\n padding-left: 0;\n margin-bottom: 20px;\n}\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n margin-bottom: -1px;\n background-color: #fff;\n border: 1px solid #ddd;\n}\n.list-group-item:first-child {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n}\n.list-group-item:last-child {\n margin-bottom: 0;\n border-bottom-right-radius: 4px;\n border-bottom-left-radius: 4px;\n}\na.list-group-item,\nbutton.list-group-item {\n color: #555;\n}\na.list-group-item .list-group-item-heading,\nbutton.list-group-item .list-group-item-heading {\n color: #333;\n}\na.list-group-item:hover,\nbutton.list-group-item:hover,\na.list-group-item:focus,\nbutton.list-group-item:focus {\n color: #555;\n text-decoration: none;\n background-color: #f5f5f5;\n}\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n.list-group-item.disabled,\n.list-group-item.disabled:hover,\n.list-group-item.disabled:focus {\n color: #777;\n cursor: not-allowed;\n background-color: #eee;\n}\n.list-group-item.disabled .list-group-item-heading,\n.list-group-item.disabled:hover .list-group-item-heading,\n.list-group-item.disabled:focus .list-group-item-heading {\n color: inherit;\n}\n.list-group-item.disabled .list-group-item-text,\n.list-group-item.disabled:hover .list-group-item-text,\n.list-group-item.disabled:focus .list-group-item-text {\n color: #777;\n}\n.list-group-item.active,\n.list-group-item.active:hover,\n.list-group-item.active:focus {\n z-index: 2;\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.list-group-item.active .list-group-item-heading,\n.list-group-item.active:hover .list-group-item-heading,\n.list-group-item.active:focus .list-group-item-heading,\n.list-group-item.active .list-group-item-heading > small,\n.list-group-item.active:hover .list-group-item-heading > small,\n.list-group-item.active:focus .list-group-item-heading > small,\n.list-group-item.active .list-group-item-heading > .small,\n.list-group-item.active:hover .list-group-item-heading > .small,\n.list-group-item.active:focus .list-group-item-heading > .small {\n color: inherit;\n}\n.list-group-item.active .list-group-item-text,\n.list-group-item.active:hover .list-group-item-text,\n.list-group-item.active:focus .list-group-item-text {\n color: #c7ddef;\n}\n.list-group-item-success {\n color: #3c763d;\n background-color: #dff0d8;\n}\na.list-group-item-success,\nbutton.list-group-item-success {\n color: #3c763d;\n}\na.list-group-item-success .list-group-item-heading,\nbutton.list-group-item-success .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-success:hover,\nbutton.list-group-item-success:hover,\na.list-group-item-success:focus,\nbutton.list-group-item-success:focus {\n color: #3c763d;\n background-color: #d0e9c6;\n}\na.list-group-item-success.active,\nbutton.list-group-item-success.active,\na.list-group-item-success.active:hover,\nbutton.list-group-item-success.active:hover,\na.list-group-item-success.active:focus,\nbutton.list-group-item-success.active:focus {\n color: #fff;\n background-color: #3c763d;\n border-color: #3c763d;\n}\n.list-group-item-info {\n color: #31708f;\n background-color: #d9edf7;\n}\na.list-group-item-info,\nbutton.list-group-item-info {\n color: #31708f;\n}\na.list-group-item-info .list-group-item-heading,\nbutton.list-group-item-info .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-info:hover,\nbutton.list-group-item-info:hover,\na.list-group-item-info:focus,\nbutton.list-group-item-info:focus {\n color: #31708f;\n background-color: #c4e3f3;\n}\na.list-group-item-info.active,\nbutton.list-group-item-info.active,\na.list-group-item-info.active:hover,\nbutton.list-group-item-info.active:hover,\na.list-group-item-info.active:focus,\nbutton.list-group-item-info.active:focus {\n color: #fff;\n background-color: #31708f;\n border-color: #31708f;\n}\n.list-group-item-warning {\n color: #8a6d3b;\n background-color: #fcf8e3;\n}\na.list-group-item-warning,\nbutton.list-group-item-warning {\n color: #8a6d3b;\n}\na.list-group-item-warning .list-group-item-heading,\nbutton.list-group-item-warning .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-warning:hover,\nbutton.list-group-item-warning:hover,\na.list-group-item-warning:focus,\nbutton.list-group-item-warning:focus {\n color: #8a6d3b;\n background-color: #faf2cc;\n}\na.list-group-item-warning.active,\nbutton.list-group-item-warning.active,\na.list-group-item-warning.active:hover,\nbutton.list-group-item-warning.active:hover,\na.list-group-item-warning.active:focus,\nbutton.list-group-item-warning.active:focus {\n color: #fff;\n background-color: #8a6d3b;\n border-color: #8a6d3b;\n}\n.list-group-item-danger {\n color: #a94442;\n background-color: #f2dede;\n}\na.list-group-item-danger,\nbutton.list-group-item-danger {\n color: #a94442;\n}\na.list-group-item-danger .list-group-item-heading,\nbutton.list-group-item-danger .list-group-item-heading {\n color: inherit;\n}\na.list-group-item-danger:hover,\nbutton.list-group-item-danger:hover,\na.list-group-item-danger:focus,\nbutton.list-group-item-danger:focus {\n color: #a94442;\n background-color: #ebcccc;\n}\na.list-group-item-danger.active,\nbutton.list-group-item-danger.active,\na.list-group-item-danger.active:hover,\nbutton.list-group-item-danger.active:hover,\na.list-group-item-danger.active:focus,\nbutton.list-group-item-danger.active:focus {\n color: #fff;\n background-color: #a94442;\n border-color: #a94442;\n}\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n.panel {\n margin-bottom: 20px;\n background-color: #fff;\n border: 1px solid transparent;\n border-radius: 4px;\n -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, .05);\n box-shadow: 0 1px 1px rgba(0, 0, 0, .05);\n}\n.panel-body {\n padding: 15px;\n}\n.panel-heading {\n padding: 10px 15px;\n border-bottom: 1px solid transparent;\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel-heading > .dropdown .dropdown-toggle {\n color: inherit;\n}\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: 16px;\n color: inherit;\n}\n.panel-title > a,\n.panel-title > small,\n.panel-title > .small,\n.panel-title > small > a,\n.panel-title > .small > a {\n color: inherit;\n}\n.panel-footer {\n padding: 10px 15px;\n background-color: #f5f5f5;\n border-top: 1px solid #ddd;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .list-group,\n.panel > .panel-collapse > .list-group {\n margin-bottom: 0;\n}\n.panel > .list-group .list-group-item,\n.panel > .panel-collapse > .list-group .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n}\n.panel > .list-group:first-child .list-group-item:first-child,\n.panel > .panel-collapse > .list-group:first-child .list-group-item:first-child {\n border-top: 0;\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .list-group:last-child .list-group-item:last-child,\n.panel > .panel-collapse > .list-group:last-child .list-group-item:last-child {\n border-bottom: 0;\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .panel-heading + .panel-collapse > .list-group .list-group-item:first-child {\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n.panel-heading + .list-group .list-group-item:first-child {\n border-top-width: 0;\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n.panel > .table,\n.panel > .table-responsive > .table,\n.panel > .panel-collapse > .table {\n margin-bottom: 0;\n}\n.panel > .table caption,\n.panel > .table-responsive > .table caption,\n.panel > .panel-collapse > .table caption {\n padding-right: 15px;\n padding-left: 15px;\n}\n.panel > .table:first-child,\n.panel > .table-responsive:first-child > .table:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child {\n border-top-left-radius: 3px;\n border-top-right-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {\n border-top-left-radius: 3px;\n}\n.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,\n.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,\n.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,\n.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {\n border-top-right-radius: 3px;\n}\n.panel > .table:last-child,\n.panel > .table-responsive:last-child > .table:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child {\n border-bottom-right-radius: 3px;\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {\n border-bottom-left-radius: 3px;\n}\n.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,\n.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,\n.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,\n.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {\n border-bottom-right-radius: 3px;\n}\n.panel > .panel-body + .table,\n.panel > .panel-body + .table-responsive,\n.panel > .table + .panel-body,\n.panel > .table-responsive + .panel-body {\n border-top: 1px solid #ddd;\n}\n.panel > .table > tbody:first-child > tr:first-child th,\n.panel > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n}\n.panel > .table-bordered,\n.panel > .table-responsive > .table-bordered {\n border: 0;\n}\n.panel > .table-bordered > thead > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,\n.panel > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,\n.panel > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,\n.panel > .table-bordered > thead > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,\n.panel > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,\n.panel > .table-bordered > tfoot > tr > td:first-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {\n border-left: 0;\n}\n.panel > .table-bordered > thead > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,\n.panel > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,\n.panel > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,\n.panel > .table-bordered > thead > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,\n.panel > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,\n.panel > .table-bordered > tfoot > tr > td:last-child,\n.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {\n border-right: 0;\n}\n.panel > .table-bordered > thead > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,\n.panel > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,\n.panel > .table-bordered > thead > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,\n.panel > .table-bordered > tbody > tr:first-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {\n border-bottom: 0;\n}\n.panel > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,\n.panel > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,\n.panel > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,\n.panel > .table-bordered > tfoot > tr:last-child > th,\n.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {\n border-bottom: 0;\n}\n.panel > .table-responsive {\n margin-bottom: 0;\n border: 0;\n}\n.panel-group {\n margin-bottom: 20px;\n}\n.panel-group .panel {\n margin-bottom: 0;\n border-radius: 4px;\n}\n.panel-group .panel + .panel {\n margin-top: 5px;\n}\n.panel-group .panel-heading {\n border-bottom: 0;\n}\n.panel-group .panel-heading + .panel-collapse > .panel-body,\n.panel-group .panel-heading + .panel-collapse > .list-group {\n border-top: 1px solid #ddd;\n}\n.panel-group .panel-footer {\n border-top: 0;\n}\n.panel-group .panel-footer + .panel-collapse .panel-body {\n border-bottom: 1px solid #ddd;\n}\n.panel-default {\n border-color: #ddd;\n}\n.panel-default > .panel-heading {\n color: #333;\n background-color: #f5f5f5;\n border-color: #ddd;\n}\n.panel-default > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ddd;\n}\n.panel-default > .panel-heading .badge {\n color: #f5f5f5;\n background-color: #333;\n}\n.panel-default > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ddd;\n}\n.panel-primary {\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading {\n color: #fff;\n background-color: #337ab7;\n border-color: #337ab7;\n}\n.panel-primary > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #337ab7;\n}\n.panel-primary > .panel-heading .badge {\n color: #337ab7;\n background-color: #fff;\n}\n.panel-primary > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #337ab7;\n}\n.panel-success {\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading {\n color: #3c763d;\n background-color: #dff0d8;\n border-color: #d6e9c6;\n}\n.panel-success > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #d6e9c6;\n}\n.panel-success > .panel-heading .badge {\n color: #dff0d8;\n background-color: #3c763d;\n}\n.panel-success > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #d6e9c6;\n}\n.panel-info {\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading {\n color: #31708f;\n background-color: #d9edf7;\n border-color: #bce8f1;\n}\n.panel-info > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #bce8f1;\n}\n.panel-info > .panel-heading .badge {\n color: #d9edf7;\n background-color: #31708f;\n}\n.panel-info > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #bce8f1;\n}\n.panel-warning {\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading {\n color: #8a6d3b;\n background-color: #fcf8e3;\n border-color: #faebcc;\n}\n.panel-warning > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #faebcc;\n}\n.panel-warning > .panel-heading .badge {\n color: #fcf8e3;\n background-color: #8a6d3b;\n}\n.panel-warning > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #faebcc;\n}\n.panel-danger {\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading {\n color: #a94442;\n background-color: #f2dede;\n border-color: #ebccd1;\n}\n.panel-danger > .panel-heading + .panel-collapse > .panel-body {\n border-top-color: #ebccd1;\n}\n.panel-danger > .panel-heading .badge {\n color: #f2dede;\n background-color: #a94442;\n}\n.panel-danger > .panel-footer + .panel-collapse > .panel-body {\n border-bottom-color: #ebccd1;\n}\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n}\n.embed-responsive .embed-responsive-item,\n.embed-responsive iframe,\n.embed-responsive embed,\n.embed-responsive object,\n.embed-responsive video {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 100%;\n height: 100%;\n border: 0;\n}\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: #f5f5f5;\n border: 1px solid #e3e3e3;\n border-radius: 4px;\n -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .05);\n}\n.well blockquote {\n border-color: #ddd;\n border-color: rgba(0, 0, 0, .15);\n}\n.well-lg {\n padding: 24px;\n border-radius: 6px;\n}\n.well-sm {\n padding: 9px;\n border-radius: 3px;\n}\n.close {\n float: right;\n font-size: 21px;\n font-weight: bold;\n line-height: 1;\n color: #000;\n text-shadow: 0 1px 0 #fff;\n filter: alpha(opacity=20);\n opacity: .2;\n}\n.close:hover,\n.close:focus {\n color: #000;\n text-decoration: none;\n cursor: pointer;\n filter: alpha(opacity=50);\n opacity: .5;\n}\nbutton.close {\n -webkit-appearance: none;\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n}\n.modal-open {\n overflow: hidden;\n}\n.modal {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1050;\n display: none;\n overflow: hidden;\n -webkit-overflow-scrolling: touch;\n outline: 0;\n}\n.modal.fade .modal-dialog {\n -webkit-transition: -webkit-transform .3s ease-out;\n -o-transition: -o-transform .3s ease-out;\n transition: transform .3s ease-out;\n -webkit-transform: translate(0, -25%);\n -ms-transform: translate(0, -25%);\n -o-transform: translate(0, -25%);\n transform: translate(0, -25%);\n}\n.modal.in .modal-dialog {\n -webkit-transform: translate(0, 0);\n -ms-transform: translate(0, 0);\n -o-transform: translate(0, 0);\n transform: translate(0, 0);\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n.modal-content {\n position: relative;\n background-color: #fff;\n -webkit-background-clip: padding-box;\n background-clip: padding-box;\n border: 1px solid #999;\n border: 1px solid rgba(0, 0, 0, .2);\n border-radius: 6px;\n outline: 0;\n -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);\n box-shadow: 0 3px 9px rgba(0, 0, 0, .5);\n}\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 1040;\n background-color: #000;\n}\n.modal-backdrop.fade {\n filter: alpha(opacity=0);\n opacity: 0;\n}\n.modal-backdrop.in {\n filter: alpha(opacity=50);\n opacity: .5;\n}\n.modal-header {\n padding: 15px;\n border-bottom: 1px solid #e5e5e5;\n}\n.modal-header .close {\n margin-top: -2px;\n}\n.modal-title {\n margin: 0;\n line-height: 1.42857143;\n}\n.modal-body {\n position: relative;\n padding: 15px;\n}\n.modal-footer {\n padding: 15px;\n text-align: right;\n border-top: 1px solid #e5e5e5;\n}\n.modal-footer .btn + .btn {\n margin-bottom: 0;\n margin-left: 5px;\n}\n.modal-footer .btn-group .btn + .btn {\n margin-left: -1px;\n}\n.modal-footer .btn-block + .btn-block {\n margin-left: 0;\n}\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n@media (min-width: 768px) {\n .modal-dialog {\n width: 600px;\n margin: 30px auto;\n }\n .modal-content {\n -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);\n box-shadow: 0 5px 15px rgba(0, 0, 0, .5);\n }\n .modal-sm {\n width: 300px;\n }\n}\n@media (min-width: 992px) {\n .modal-lg {\n width: 900px;\n }\n}\n.tooltip {\n position: absolute;\n z-index: 1070;\n display: block;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 12px;\n font-style: normal;\n font-weight: normal;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n white-space: normal;\n filter: alpha(opacity=0);\n opacity: 0;\n\n line-break: auto;\n}\n.tooltip.in {\n filter: alpha(opacity=90);\n opacity: .9;\n}\n.tooltip.top {\n padding: 5px 0;\n margin-top: -3px;\n}\n.tooltip.right {\n padding: 0 5px;\n margin-left: 3px;\n}\n.tooltip.bottom {\n padding: 5px 0;\n margin-top: 3px;\n}\n.tooltip.left {\n padding: 0 5px;\n margin-left: -3px;\n}\n.tooltip-inner {\n max-width: 200px;\n padding: 3px 8px;\n color: #fff;\n text-align: center;\n background-color: #000;\n border-radius: 4px;\n}\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.tooltip.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-left .tooltip-arrow {\n right: 5px;\n bottom: 0;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.top-right .tooltip-arrow {\n bottom: 0;\n left: 5px;\n margin-bottom: -5px;\n border-width: 5px 5px 0;\n border-top-color: #000;\n}\n.tooltip.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -5px;\n border-width: 5px 5px 5px 0;\n border-right-color: #000;\n}\n.tooltip.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -5px;\n border-width: 5px 0 5px 5px;\n border-left-color: #000;\n}\n.tooltip.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-left .tooltip-arrow {\n top: 0;\n right: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.tooltip.bottom-right .tooltip-arrow {\n top: 0;\n left: 5px;\n margin-top: -5px;\n border-width: 0 5px 5px;\n border-bottom-color: #000;\n}\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 1060;\n display: none;\n max-width: 276px;\n padding: 1px;\n font-family: \"Helvetica Neue\", Helvetica, Arial, sans-serif;\n font-size: 14px;\n font-style: normal;\n font-weight: normal;\n line-height: 1.42857143;\n text-align: left;\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n letter-spacing: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n white-space: normal;\n background-color: #fff;\n -webkit-background-clip: padding-box;\n background-clip: padding-box;\n border: 1px solid #ccc;\n border: 1px solid rgba(0, 0, 0, .2);\n border-radius: 6px;\n -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, .2);\n box-shadow: 0 5px 10px rgba(0, 0, 0, .2);\n\n line-break: auto;\n}\n.popover.top {\n margin-top: -10px;\n}\n.popover.right {\n margin-left: 10px;\n}\n.popover.bottom {\n margin-top: 10px;\n}\n.popover.left {\n margin-left: -10px;\n}\n.popover-title {\n padding: 8px 14px;\n margin: 0;\n font-size: 14px;\n background-color: #f7f7f7;\n border-bottom: 1px solid #ebebeb;\n border-radius: 5px 5px 0 0;\n}\n.popover-content {\n padding: 9px 14px;\n}\n.popover > .arrow,\n.popover > .arrow:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n.popover > .arrow {\n border-width: 11px;\n}\n.popover > .arrow:after {\n content: \"\";\n border-width: 10px;\n}\n.popover.top > .arrow {\n bottom: -11px;\n left: 50%;\n margin-left: -11px;\n border-top-color: #999;\n border-top-color: rgba(0, 0, 0, .25);\n border-bottom-width: 0;\n}\n.popover.top > .arrow:after {\n bottom: 1px;\n margin-left: -10px;\n content: \" \";\n border-top-color: #fff;\n border-bottom-width: 0;\n}\n.popover.right > .arrow {\n top: 50%;\n left: -11px;\n margin-top: -11px;\n border-right-color: #999;\n border-right-color: rgba(0, 0, 0, .25);\n border-left-width: 0;\n}\n.popover.right > .arrow:after {\n bottom: -10px;\n left: 1px;\n content: \" \";\n border-right-color: #fff;\n border-left-width: 0;\n}\n.popover.bottom > .arrow {\n top: -11px;\n left: 50%;\n margin-left: -11px;\n border-top-width: 0;\n border-bottom-color: #999;\n border-bottom-color: rgba(0, 0, 0, .25);\n}\n.popover.bottom > .arrow:after {\n top: 1px;\n margin-left: -10px;\n content: \" \";\n border-top-width: 0;\n border-bottom-color: #fff;\n}\n.popover.left > .arrow {\n top: 50%;\n right: -11px;\n margin-top: -11px;\n border-right-width: 0;\n border-left-color: #999;\n border-left-color: rgba(0, 0, 0, .25);\n}\n.popover.left > .arrow:after {\n right: 1px;\n bottom: -10px;\n content: \" \";\n border-right-width: 0;\n border-left-color: #fff;\n}\n.carousel {\n position: relative;\n}\n.carousel-inner {\n position: relative;\n width: 100%;\n overflow: hidden;\n}\n.carousel-inner > .item {\n position: relative;\n display: none;\n -webkit-transition: .6s ease-in-out left;\n -o-transition: .6s ease-in-out left;\n transition: .6s ease-in-out left;\n}\n.carousel-inner > .item > img,\n.carousel-inner > .item > a > img {\n line-height: 1;\n}\n@media all and (transform-3d), (-webkit-transform-3d) {\n .carousel-inner > .item {\n -webkit-transition: -webkit-transform .6s ease-in-out;\n -o-transition: -o-transform .6s ease-in-out;\n transition: transform .6s ease-in-out;\n\n -webkit-backface-visibility: hidden;\n backface-visibility: hidden;\n -webkit-perspective: 1000px;\n perspective: 1000px;\n }\n .carousel-inner > .item.next,\n .carousel-inner > .item.active.right {\n left: 0;\n -webkit-transform: translate3d(100%, 0, 0);\n transform: translate3d(100%, 0, 0);\n }\n .carousel-inner > .item.prev,\n .carousel-inner > .item.active.left {\n left: 0;\n -webkit-transform: translate3d(-100%, 0, 0);\n transform: translate3d(-100%, 0, 0);\n }\n .carousel-inner > .item.next.left,\n .carousel-inner > .item.prev.right,\n .carousel-inner > .item.active {\n left: 0;\n -webkit-transform: translate3d(0, 0, 0);\n transform: translate3d(0, 0, 0);\n }\n}\n.carousel-inner > .active,\n.carousel-inner > .next,\n.carousel-inner > .prev {\n display: block;\n}\n.carousel-inner > .active {\n left: 0;\n}\n.carousel-inner > .next,\n.carousel-inner > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n}\n.carousel-inner > .next {\n left: 100%;\n}\n.carousel-inner > .prev {\n left: -100%;\n}\n.carousel-inner > .next.left,\n.carousel-inner > .prev.right {\n left: 0;\n}\n.carousel-inner > .active.left {\n left: -100%;\n}\n.carousel-inner > .active.right {\n left: 100%;\n}\n.carousel-control {\n position: absolute;\n top: 0;\n bottom: 0;\n left: 0;\n width: 15%;\n font-size: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n background-color: rgba(0, 0, 0, 0);\n filter: alpha(opacity=50);\n opacity: .5;\n}\n.carousel-control.left {\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .5)), to(rgba(0, 0, 0, .0001)));\n background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);\n background-repeat: repeat-x;\n}\n.carousel-control.right {\n right: 0;\n left: auto;\n background-image: -webkit-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n background-image: -o-linear-gradient(left, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n background-image: -webkit-gradient(linear, left top, right top, from(rgba(0, 0, 0, .0001)), to(rgba(0, 0, 0, .5)));\n background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);\n filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);\n background-repeat: repeat-x;\n}\n.carousel-control:hover,\n.carousel-control:focus {\n color: #fff;\n text-decoration: none;\n filter: alpha(opacity=90);\n outline: 0;\n opacity: .9;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-left,\n.carousel-control .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n z-index: 5;\n display: inline-block;\n margin-top: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n}\n.carousel-control .icon-next,\n.carousel-control .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n}\n.carousel-control .icon-prev,\n.carousel-control .icon-next {\n width: 20px;\n height: 20px;\n font-family: serif;\n line-height: 1;\n}\n.carousel-control .icon-prev:before {\n content: '\\2039';\n}\n.carousel-control .icon-next:before {\n content: '\\203a';\n}\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n padding-left: 0;\n margin-left: -30%;\n text-align: center;\n list-style: none;\n}\n.carousel-indicators li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n cursor: pointer;\n background-color: #000 \\9;\n background-color: rgba(0, 0, 0, 0);\n border: 1px solid #fff;\n border-radius: 10px;\n}\n.carousel-indicators .active {\n width: 12px;\n height: 12px;\n margin: 0;\n background-color: #fff;\n}\n.carousel-caption {\n position: absolute;\n right: 15%;\n bottom: 20px;\n left: 15%;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: #fff;\n text-align: center;\n text-shadow: 0 1px 2px rgba(0, 0, 0, .6);\n}\n.carousel-caption .btn {\n text-shadow: none;\n}\n@media screen and (min-width: 768px) {\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-prev,\n .carousel-control .icon-next {\n width: 30px;\n height: 30px;\n margin-top: -10px;\n font-size: 30px;\n }\n .carousel-control .glyphicon-chevron-left,\n .carousel-control .icon-prev {\n margin-left: -10px;\n }\n .carousel-control .glyphicon-chevron-right,\n .carousel-control .icon-next {\n margin-right: -10px;\n }\n .carousel-caption {\n right: 20%;\n left: 20%;\n padding-bottom: 30px;\n }\n .carousel-indicators {\n bottom: 20px;\n }\n}\n.clearfix:before,\n.clearfix:after,\n.dl-horizontal dd:before,\n.dl-horizontal dd:after,\n.container:before,\n.container:after,\n.container-fluid:before,\n.container-fluid:after,\n.row:before,\n.row:after,\n.form-horizontal .form-group:before,\n.form-horizontal .form-group:after,\n.btn-toolbar:before,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:before,\n.btn-group-vertical > .btn-group:after,\n.nav:before,\n.nav:after,\n.navbar:before,\n.navbar:after,\n.navbar-header:before,\n.navbar-header:after,\n.navbar-collapse:before,\n.navbar-collapse:after,\n.pager:before,\n.pager:after,\n.panel-body:before,\n.panel-body:after,\n.modal-header:before,\n.modal-header:after,\n.modal-footer:before,\n.modal-footer:after {\n display: table;\n content: \" \";\n}\n.clearfix:after,\n.dl-horizontal dd:after,\n.container:after,\n.container-fluid:after,\n.row:after,\n.form-horizontal .form-group:after,\n.btn-toolbar:after,\n.btn-group-vertical > .btn-group:after,\n.nav:after,\n.navbar:after,\n.navbar-header:after,\n.navbar-collapse:after,\n.pager:after,\n.panel-body:after,\n.modal-header:after,\n.modal-footer:after {\n clear: both;\n}\n.center-block {\n display: block;\n margin-right: auto;\n margin-left: auto;\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n font: 0/0 a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n.hidden {\n display: none !important;\n}\n.affix {\n position: fixed;\n}\n@-ms-viewport {\n width: device-width;\n}\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n display: none !important;\n}\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n@media (max-width: 767px) {\n .visible-xs {\n display: block !important;\n }\n table.visible-xs {\n display: table !important;\n }\n tr.visible-xs {\n display: table-row !important;\n }\n th.visible-xs,\n td.visible-xs {\n display: table-cell !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-block {\n display: block !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline {\n display: inline !important;\n }\n}\n@media (max-width: 767px) {\n .visible-xs-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm {\n display: block !important;\n }\n table.visible-sm {\n display: table !important;\n }\n tr.visible-sm {\n display: table-row !important;\n }\n th.visible-sm,\n td.visible-sm {\n display: table-cell !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-block {\n display: block !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline {\n display: inline !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .visible-sm-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md {\n display: block !important;\n }\n table.visible-md {\n display: table !important;\n }\n tr.visible-md {\n display: table-row !important;\n }\n th.visible-md,\n td.visible-md {\n display: table-cell !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-block {\n display: block !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline {\n display: inline !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .visible-md-inline-block {\n display: inline-block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg {\n display: block !important;\n }\n table.visible-lg {\n display: table !important;\n }\n tr.visible-lg {\n display: table-row !important;\n }\n th.visible-lg,\n td.visible-lg {\n display: table-cell !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-block {\n display: block !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline {\n display: inline !important;\n }\n}\n@media (min-width: 1200px) {\n .visible-lg-inline-block {\n display: inline-block !important;\n }\n}\n@media (max-width: 767px) {\n .hidden-xs {\n display: none !important;\n }\n}\n@media (min-width: 768px) and (max-width: 991px) {\n .hidden-sm {\n display: none !important;\n }\n}\n@media (min-width: 992px) and (max-width: 1199px) {\n .hidden-md {\n display: none !important;\n }\n}\n@media (min-width: 1200px) {\n .hidden-lg {\n display: none !important;\n }\n}\n.visible-print {\n display: none !important;\n}\n@media print {\n .visible-print {\n display: block !important;\n }\n table.visible-print {\n display: table !important;\n }\n tr.visible-print {\n display: table-row !important;\n }\n th.visible-print,\n td.visible-print {\n display: table-cell !important;\n }\n}\n.visible-print-block {\n display: none !important;\n}\n@media print {\n .visible-print-block {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n}\n@media print {\n .visible-print-inline {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n}\n@media print {\n .visible-print-inline-block {\n display: inline-block !important;\n }\n}\n@media print {\n .hidden-print {\n display: none !important;\n }\n}\n/*# sourceMappingURL=bootstrap.css.map */\n","//\n// Glyphicons for Bootstrap\n//\n// Since icons are fonts, they can be placed anywhere text is placed and are\n// thus automatically sized to match the surrounding child. To use, create an\n// inline element with the appropriate classes, like so:\n//\n// Star\n\n// Import the fonts\n@font-face {\n font-family: 'Glyphicons Halflings';\n src: url('@{icon-font-path}@{icon-font-name}.eot');\n src: url('@{icon-font-path}@{icon-font-name}.eot?#iefix') format('embedded-opentype'),\n url('@{icon-font-path}@{icon-font-name}.woff2') format('woff2'),\n url('@{icon-font-path}@{icon-font-name}.woff') format('woff'),\n url('@{icon-font-path}@{icon-font-name}.ttf') format('truetype'),\n url('@{icon-font-path}@{icon-font-name}.svg#@{icon-font-svg-id}') format('svg');\n}\n\n// Catchall baseclass\n.glyphicon {\n position: relative;\n top: 1px;\n display: inline-block;\n font-family: 'Glyphicons Halflings';\n font-style: normal;\n font-weight: normal;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n}\n\n// Individual icons\n.glyphicon-asterisk { &:before { content: \"\\002a\"; } }\n.glyphicon-plus { &:before { content: \"\\002b\"; } }\n.glyphicon-euro,\n.glyphicon-eur { &:before { content: \"\\20ac\"; } }\n.glyphicon-minus { &:before { content: \"\\2212\"; } }\n.glyphicon-cloud { &:before { content: \"\\2601\"; } }\n.glyphicon-envelope { &:before { content: \"\\2709\"; } }\n.glyphicon-pencil { &:before { content: \"\\270f\"; } }\n.glyphicon-glass { &:before { content: \"\\e001\"; } }\n.glyphicon-music { &:before { content: \"\\e002\"; } }\n.glyphicon-search { &:before { content: \"\\e003\"; } }\n.glyphicon-heart { &:before { content: \"\\e005\"; } }\n.glyphicon-star { &:before { content: \"\\e006\"; } }\n.glyphicon-star-empty { &:before { content: \"\\e007\"; } }\n.glyphicon-user { &:before { content: \"\\e008\"; } }\n.glyphicon-film { &:before { content: \"\\e009\"; } }\n.glyphicon-th-large { &:before { content: \"\\e010\"; } }\n.glyphicon-th { &:before { content: \"\\e011\"; } }\n.glyphicon-th-list { &:before { content: \"\\e012\"; } }\n.glyphicon-ok { &:before { content: \"\\e013\"; } }\n.glyphicon-remove { &:before { content: \"\\e014\"; } }\n.glyphicon-zoom-in { &:before { content: \"\\e015\"; } }\n.glyphicon-zoom-out { &:before { content: \"\\e016\"; } }\n.glyphicon-off { &:before { content: \"\\e017\"; } }\n.glyphicon-signal { &:before { content: \"\\e018\"; } }\n.glyphicon-cog { &:before { content: \"\\e019\"; } }\n.glyphicon-trash { &:before { content: \"\\e020\"; } }\n.glyphicon-home { &:before { content: \"\\e021\"; } }\n.glyphicon-file { &:before { content: \"\\e022\"; } }\n.glyphicon-time { &:before { content: \"\\e023\"; } }\n.glyphicon-road { &:before { content: \"\\e024\"; } }\n.glyphicon-download-alt { &:before { content: \"\\e025\"; } }\n.glyphicon-download { &:before { content: \"\\e026\"; } }\n.glyphicon-upload { &:before { content: \"\\e027\"; } }\n.glyphicon-inbox { &:before { content: \"\\e028\"; } }\n.glyphicon-play-circle { &:before { content: \"\\e029\"; } }\n.glyphicon-repeat { &:before { content: \"\\e030\"; } }\n.glyphicon-refresh { &:before { content: \"\\e031\"; } }\n.glyphicon-list-alt { &:before { content: \"\\e032\"; } }\n.glyphicon-lock { &:before { content: \"\\e033\"; } }\n.glyphicon-flag { &:before { content: \"\\e034\"; } }\n.glyphicon-headphones { &:before { content: \"\\e035\"; } }\n.glyphicon-volume-off { &:before { content: \"\\e036\"; } }\n.glyphicon-volume-down { &:before { content: \"\\e037\"; } }\n.glyphicon-volume-up { &:before { content: \"\\e038\"; } }\n.glyphicon-qrcode { &:before { content: \"\\e039\"; } }\n.glyphicon-barcode { &:before { content: \"\\e040\"; } }\n.glyphicon-tag { &:before { content: \"\\e041\"; } }\n.glyphicon-tags { &:before { content: \"\\e042\"; } }\n.glyphicon-book { &:before { content: \"\\e043\"; } }\n.glyphicon-bookmark { &:before { content: \"\\e044\"; } }\n.glyphicon-print { &:before { content: \"\\e045\"; } }\n.glyphicon-camera { &:before { content: \"\\e046\"; } }\n.glyphicon-font { &:before { content: \"\\e047\"; } }\n.glyphicon-bold { &:before { content: \"\\e048\"; } }\n.glyphicon-italic { &:before { content: \"\\e049\"; } }\n.glyphicon-text-height { &:before { content: \"\\e050\"; } }\n.glyphicon-text-width { &:before { content: \"\\e051\"; } }\n.glyphicon-align-left { &:before { content: \"\\e052\"; } }\n.glyphicon-align-center { &:before { content: \"\\e053\"; } }\n.glyphicon-align-right { &:before { content: \"\\e054\"; } }\n.glyphicon-align-justify { &:before { content: \"\\e055\"; } }\n.glyphicon-list { &:before { content: \"\\e056\"; } }\n.glyphicon-indent-left { &:before { content: \"\\e057\"; } }\n.glyphicon-indent-right { &:before { content: \"\\e058\"; } }\n.glyphicon-facetime-video { &:before { content: \"\\e059\"; } }\n.glyphicon-picture { &:before { content: \"\\e060\"; } }\n.glyphicon-map-marker { &:before { content: \"\\e062\"; } }\n.glyphicon-adjust { &:before { content: \"\\e063\"; } }\n.glyphicon-tint { &:before { content: \"\\e064\"; } }\n.glyphicon-edit { &:before { content: \"\\e065\"; } }\n.glyphicon-share { &:before { content: \"\\e066\"; } }\n.glyphicon-check { &:before { content: \"\\e067\"; } }\n.glyphicon-move { &:before { content: \"\\e068\"; } }\n.glyphicon-step-backward { &:before { content: \"\\e069\"; } }\n.glyphicon-fast-backward { &:before { content: \"\\e070\"; } }\n.glyphicon-backward { &:before { content: \"\\e071\"; } }\n.glyphicon-play { &:before { content: \"\\e072\"; } }\n.glyphicon-pause { &:before { content: \"\\e073\"; } }\n.glyphicon-stop { &:before { content: \"\\e074\"; } }\n.glyphicon-forward { &:before { content: \"\\e075\"; } }\n.glyphicon-fast-forward { &:before { content: \"\\e076\"; } }\n.glyphicon-step-forward { &:before { content: \"\\e077\"; } }\n.glyphicon-eject { &:before { content: \"\\e078\"; } }\n.glyphicon-chevron-left { &:before { content: \"\\e079\"; } }\n.glyphicon-chevron-right { &:before { content: \"\\e080\"; } }\n.glyphicon-plus-sign { &:before { content: \"\\e081\"; } }\n.glyphicon-minus-sign { &:before { content: \"\\e082\"; } }\n.glyphicon-remove-sign { &:before { content: \"\\e083\"; } }\n.glyphicon-ok-sign { &:before { content: \"\\e084\"; } }\n.glyphicon-question-sign { &:before { content: \"\\e085\"; } }\n.glyphicon-info-sign { &:before { content: \"\\e086\"; } }\n.glyphicon-screenshot { &:before { content: \"\\e087\"; } }\n.glyphicon-remove-circle { &:before { content: \"\\e088\"; } }\n.glyphicon-ok-circle { &:before { content: \"\\e089\"; } }\n.glyphicon-ban-circle { &:before { content: \"\\e090\"; } }\n.glyphicon-arrow-left { &:before { content: \"\\e091\"; } }\n.glyphicon-arrow-right { &:before { content: \"\\e092\"; } }\n.glyphicon-arrow-up { &:before { content: \"\\e093\"; } }\n.glyphicon-arrow-down { &:before { content: \"\\e094\"; } }\n.glyphicon-share-alt { &:before { content: \"\\e095\"; } }\n.glyphicon-resize-full { &:before { content: \"\\e096\"; } }\n.glyphicon-resize-small { &:before { content: \"\\e097\"; } }\n.glyphicon-exclamation-sign { &:before { content: \"\\e101\"; } }\n.glyphicon-gift { &:before { content: \"\\e102\"; } }\n.glyphicon-leaf { &:before { content: \"\\e103\"; } }\n.glyphicon-fire { &:before { content: \"\\e104\"; } }\n.glyphicon-eye-open { &:before { content: \"\\e105\"; } }\n.glyphicon-eye-close { &:before { content: \"\\e106\"; } }\n.glyphicon-warning-sign { &:before { content: \"\\e107\"; } }\n.glyphicon-plane { &:before { content: \"\\e108\"; } }\n.glyphicon-calendar { &:before { content: \"\\e109\"; } }\n.glyphicon-random { &:before { content: \"\\e110\"; } }\n.glyphicon-comment { &:before { content: \"\\e111\"; } }\n.glyphicon-magnet { &:before { content: \"\\e112\"; } }\n.glyphicon-chevron-up { &:before { content: \"\\e113\"; } }\n.glyphicon-chevron-down { &:before { content: \"\\e114\"; } }\n.glyphicon-retweet { &:before { content: \"\\e115\"; } }\n.glyphicon-shopping-cart { &:before { content: \"\\e116\"; } }\n.glyphicon-folder-close { &:before { content: \"\\e117\"; } }\n.glyphicon-folder-open { &:before { content: \"\\e118\"; } }\n.glyphicon-resize-vertical { &:before { content: \"\\e119\"; } }\n.glyphicon-resize-horizontal { &:before { content: \"\\e120\"; } }\n.glyphicon-hdd { &:before { content: \"\\e121\"; } }\n.glyphicon-bullhorn { &:before { content: \"\\e122\"; } }\n.glyphicon-bell { &:before { content: \"\\e123\"; } }\n.glyphicon-certificate { &:before { content: \"\\e124\"; } }\n.glyphicon-thumbs-up { &:before { content: \"\\e125\"; } }\n.glyphicon-thumbs-down { &:before { content: \"\\e126\"; } }\n.glyphicon-hand-right { &:before { content: \"\\e127\"; } }\n.glyphicon-hand-left { &:before { content: \"\\e128\"; } }\n.glyphicon-hand-up { &:before { content: \"\\e129\"; } }\n.glyphicon-hand-down { &:before { content: \"\\e130\"; } }\n.glyphicon-circle-arrow-right { &:before { content: \"\\e131\"; } }\n.glyphicon-circle-arrow-left { &:before { content: \"\\e132\"; } }\n.glyphicon-circle-arrow-up { &:before { content: \"\\e133\"; } }\n.glyphicon-circle-arrow-down { &:before { content: \"\\e134\"; } }\n.glyphicon-globe { &:before { content: \"\\e135\"; } }\n.glyphicon-wrench { &:before { content: \"\\e136\"; } }\n.glyphicon-tasks { &:before { content: \"\\e137\"; } }\n.glyphicon-filter { &:before { content: \"\\e138\"; } }\n.glyphicon-briefcase { &:before { content: \"\\e139\"; } }\n.glyphicon-fullscreen { &:before { content: \"\\e140\"; } }\n.glyphicon-dashboard { &:before { content: \"\\e141\"; } }\n.glyphicon-paperclip { &:before { content: \"\\e142\"; } }\n.glyphicon-heart-empty { &:before { content: \"\\e143\"; } }\n.glyphicon-link { &:before { content: \"\\e144\"; } }\n.glyphicon-phone { &:before { content: \"\\e145\"; } }\n.glyphicon-pushpin { &:before { content: \"\\e146\"; } }\n.glyphicon-usd { &:before { content: \"\\e148\"; } }\n.glyphicon-gbp { &:before { content: \"\\e149\"; } }\n.glyphicon-sort { &:before { content: \"\\e150\"; } }\n.glyphicon-sort-by-alphabet { &:before { content: \"\\e151\"; } }\n.glyphicon-sort-by-alphabet-alt { &:before { content: \"\\e152\"; } }\n.glyphicon-sort-by-order { &:before { content: \"\\e153\"; } }\n.glyphicon-sort-by-order-alt { &:before { content: \"\\e154\"; } }\n.glyphicon-sort-by-attributes { &:before { content: \"\\e155\"; } }\n.glyphicon-sort-by-attributes-alt { &:before { content: \"\\e156\"; } }\n.glyphicon-unchecked { &:before { content: \"\\e157\"; } }\n.glyphicon-expand { &:before { content: \"\\e158\"; } }\n.glyphicon-collapse-down { &:before { content: \"\\e159\"; } }\n.glyphicon-collapse-up { &:before { content: \"\\e160\"; } }\n.glyphicon-log-in { &:before { content: \"\\e161\"; } }\n.glyphicon-flash { &:before { content: \"\\e162\"; } }\n.glyphicon-log-out { &:before { content: \"\\e163\"; } }\n.glyphicon-new-window { &:before { content: \"\\e164\"; } }\n.glyphicon-record { &:before { content: \"\\e165\"; } }\n.glyphicon-save { &:before { content: \"\\e166\"; } }\n.glyphicon-open { &:before { content: \"\\e167\"; } }\n.glyphicon-saved { &:before { content: \"\\e168\"; } }\n.glyphicon-import { &:before { content: \"\\e169\"; } }\n.glyphicon-export { &:before { content: \"\\e170\"; } }\n.glyphicon-send { &:before { content: \"\\e171\"; } }\n.glyphicon-floppy-disk { &:before { content: \"\\e172\"; } }\n.glyphicon-floppy-saved { &:before { content: \"\\e173\"; } }\n.glyphicon-floppy-remove { &:before { content: \"\\e174\"; } }\n.glyphicon-floppy-save { &:before { content: \"\\e175\"; } }\n.glyphicon-floppy-open { &:before { content: \"\\e176\"; } }\n.glyphicon-credit-card { &:before { content: \"\\e177\"; } }\n.glyphicon-transfer { &:before { content: \"\\e178\"; } }\n.glyphicon-cutlery { &:before { content: \"\\e179\"; } }\n.glyphicon-header { &:before { content: \"\\e180\"; } }\n.glyphicon-compressed { &:before { content: \"\\e181\"; } }\n.glyphicon-earphone { &:before { content: \"\\e182\"; } }\n.glyphicon-phone-alt { &:before { content: \"\\e183\"; } }\n.glyphicon-tower { &:before { content: \"\\e184\"; } }\n.glyphicon-stats { &:before { content: \"\\e185\"; } }\n.glyphicon-sd-video { &:before { content: \"\\e186\"; } }\n.glyphicon-hd-video { &:before { content: \"\\e187\"; } }\n.glyphicon-subtitles { &:before { content: \"\\e188\"; } }\n.glyphicon-sound-stereo { &:before { content: \"\\e189\"; } }\n.glyphicon-sound-dolby { &:before { content: \"\\e190\"; } }\n.glyphicon-sound-5-1 { &:before { content: \"\\e191\"; } }\n.glyphicon-sound-6-1 { &:before { content: \"\\e192\"; } }\n.glyphicon-sound-7-1 { &:before { content: \"\\e193\"; } }\n.glyphicon-copyright-mark { &:before { content: \"\\e194\"; } }\n.glyphicon-registration-mark { &:before { content: \"\\e195\"; } }\n.glyphicon-cloud-download { &:before { content: \"\\e197\"; } }\n.glyphicon-cloud-upload { &:before { content: \"\\e198\"; } }\n.glyphicon-tree-conifer { &:before { content: \"\\e199\"; } }\n.glyphicon-tree-deciduous { &:before { content: \"\\e200\"; } }\n.glyphicon-cd { &:before { content: \"\\e201\"; } }\n.glyphicon-save-file { &:before { content: \"\\e202\"; } }\n.glyphicon-open-file { &:before { content: \"\\e203\"; } }\n.glyphicon-level-up { &:before { content: \"\\e204\"; } }\n.glyphicon-copy { &:before { content: \"\\e205\"; } }\n.glyphicon-paste { &:before { content: \"\\e206\"; } }\n// The following 2 Glyphicons are omitted for the time being because\n// they currently use Unicode codepoints that are outside the\n// Basic Multilingual Plane (BMP). Older buggy versions of WebKit can't handle\n// non-BMP codepoints in CSS string escapes, and thus can't display these two icons.\n// Notably, the bug affects some older versions of the Android Browser.\n// More info: https://github.com/twbs/bootstrap/issues/10106\n// .glyphicon-door { &:before { content: \"\\1f6aa\"; } }\n// .glyphicon-key { &:before { content: \"\\1f511\"; } }\n.glyphicon-alert { &:before { content: \"\\e209\"; } }\n.glyphicon-equalizer { &:before { content: \"\\e210\"; } }\n.glyphicon-king { &:before { content: \"\\e211\"; } }\n.glyphicon-queen { &:before { content: \"\\e212\"; } }\n.glyphicon-pawn { &:before { content: \"\\e213\"; } }\n.glyphicon-bishop { &:before { content: \"\\e214\"; } }\n.glyphicon-knight { &:before { content: \"\\e215\"; } }\n.glyphicon-baby-formula { &:before { content: \"\\e216\"; } }\n.glyphicon-tent { &:before { content: \"\\26fa\"; } }\n.glyphicon-blackboard { &:before { content: \"\\e218\"; } }\n.glyphicon-bed { &:before { content: \"\\e219\"; } }\n.glyphicon-apple { &:before { content: \"\\f8ff\"; } }\n.glyphicon-erase { &:before { content: \"\\e221\"; } }\n.glyphicon-hourglass { &:before { content: \"\\231b\"; } }\n.glyphicon-lamp { &:before { content: \"\\e223\"; } }\n.glyphicon-duplicate { &:before { content: \"\\e224\"; } }\n.glyphicon-piggy-bank { &:before { content: \"\\e225\"; } }\n.glyphicon-scissors { &:before { content: \"\\e226\"; } }\n.glyphicon-bitcoin { &:before { content: \"\\e227\"; } }\n.glyphicon-btc { &:before { content: \"\\e227\"; } }\n.glyphicon-xbt { &:before { content: \"\\e227\"; } }\n.glyphicon-yen { &:before { content: \"\\00a5\"; } }\n.glyphicon-jpy { &:before { content: \"\\00a5\"; } }\n.glyphicon-ruble { &:before { content: \"\\20bd\"; } }\n.glyphicon-rub { &:before { content: \"\\20bd\"; } }\n.glyphicon-scale { &:before { content: \"\\e230\"; } }\n.glyphicon-ice-lolly { &:before { content: \"\\e231\"; } }\n.glyphicon-ice-lolly-tasted { &:before { content: \"\\e232\"; } }\n.glyphicon-education { &:before { content: \"\\e233\"; } }\n.glyphicon-option-horizontal { &:before { content: \"\\e234\"; } }\n.glyphicon-option-vertical { &:before { content: \"\\e235\"; } }\n.glyphicon-menu-hamburger { &:before { content: \"\\e236\"; } }\n.glyphicon-modal-window { &:before { content: \"\\e237\"; } }\n.glyphicon-oil { &:before { content: \"\\e238\"; } }\n.glyphicon-grain { &:before { content: \"\\e239\"; } }\n.glyphicon-sunglasses { &:before { content: \"\\e240\"; } }\n.glyphicon-text-size { &:before { content: \"\\e241\"; } }\n.glyphicon-text-color { &:before { content: \"\\e242\"; } }\n.glyphicon-text-background { &:before { content: \"\\e243\"; } }\n.glyphicon-object-align-top { &:before { content: \"\\e244\"; } }\n.glyphicon-object-align-bottom { &:before { content: \"\\e245\"; } }\n.glyphicon-object-align-horizontal{ &:before { content: \"\\e246\"; } }\n.glyphicon-object-align-left { &:before { content: \"\\e247\"; } }\n.glyphicon-object-align-vertical { &:before { content: \"\\e248\"; } }\n.glyphicon-object-align-right { &:before { content: \"\\e249\"; } }\n.glyphicon-triangle-right { &:before { content: \"\\e250\"; } }\n.glyphicon-triangle-left { &:before { content: \"\\e251\"; } }\n.glyphicon-triangle-bottom { &:before { content: \"\\e252\"; } }\n.glyphicon-triangle-top { &:before { content: \"\\e253\"; } }\n.glyphicon-console { &:before { content: \"\\e254\"; } }\n.glyphicon-superscript { &:before { content: \"\\e255\"; } }\n.glyphicon-subscript { &:before { content: \"\\e256\"; } }\n.glyphicon-menu-left { &:before { content: \"\\e257\"; } }\n.glyphicon-menu-right { &:before { content: \"\\e258\"; } }\n.glyphicon-menu-down { &:before { content: \"\\e259\"; } }\n.glyphicon-menu-up { &:before { content: \"\\e260\"; } }\n","//\n// Scaffolding\n// --------------------------------------------------\n\n\n// Reset the box-sizing\n//\n// Heads up! This reset may cause conflicts with some third-party widgets.\n// For recommendations on resolving such conflicts, see\n// http://getbootstrap.com/getting-started/#third-box-sizing\n* {\n .box-sizing(border-box);\n}\n*:before,\n*:after {\n .box-sizing(border-box);\n}\n\n\n// Body reset\n\nhtml {\n font-size: 10px;\n -webkit-tap-highlight-color: rgba(0,0,0,0);\n}\n\nbody {\n font-family: @font-family-base;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @text-color;\n background-color: @body-bg;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Links\n\na {\n color: @link-color;\n text-decoration: none;\n\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n }\n\n &:focus {\n .tab-focus();\n }\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n .img-responsive();\n}\n\n// Rounded corners\n.img-rounded {\n border-radius: @border-radius-large;\n}\n\n// Image thumbnails\n//\n// Heads up! This is mixin-ed into thumbnails.less for `.thumbnail`.\n.img-thumbnail {\n padding: @thumbnail-padding;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(all .2s ease-in-out);\n\n // Keep them at most 100% wide\n .img-responsive(inline-block);\n}\n\n// Perfect circle\n.img-circle {\n border-radius: 50%; // set radius in percents\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n\n\n// iOS \"clickable elements\" fix for role=\"button\"\n//\n// Fixes \"clickability\" issue (and more generally, the firing of events such as focus as well)\n// for traditionally non-focusable elements with role=\"button\"\n// see https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n\n[role=\"button\"] {\n cursor: pointer;\n}\n","// Vendor Prefixes\n//\n// All vendor mixins are deprecated as of v3.2.0 due to the introduction of\n// Autoprefixer in our Gruntfile. They have been removed in v4.\n\n// - Animations\n// - Backface visibility\n// - Box shadow\n// - Box sizing\n// - Content columns\n// - Hyphens\n// - Placeholder text\n// - Transformations\n// - Transitions\n// - User Select\n\n\n// Animations\n.animation(@animation) {\n -webkit-animation: @animation;\n -o-animation: @animation;\n animation: @animation;\n}\n.animation-name(@name) {\n -webkit-animation-name: @name;\n animation-name: @name;\n}\n.animation-duration(@duration) {\n -webkit-animation-duration: @duration;\n animation-duration: @duration;\n}\n.animation-timing-function(@timing-function) {\n -webkit-animation-timing-function: @timing-function;\n animation-timing-function: @timing-function;\n}\n.animation-delay(@delay) {\n -webkit-animation-delay: @delay;\n animation-delay: @delay;\n}\n.animation-iteration-count(@iteration-count) {\n -webkit-animation-iteration-count: @iteration-count;\n animation-iteration-count: @iteration-count;\n}\n.animation-direction(@direction) {\n -webkit-animation-direction: @direction;\n animation-direction: @direction;\n}\n.animation-fill-mode(@fill-mode) {\n -webkit-animation-fill-mode: @fill-mode;\n animation-fill-mode: @fill-mode;\n}\n\n// Backface visibility\n// Prevent browsers from flickering when using CSS 3D transforms.\n// Default value is `visible`, but can be changed to `hidden`\n\n.backface-visibility(@visibility) {\n -webkit-backface-visibility: @visibility;\n -moz-backface-visibility: @visibility;\n backface-visibility: @visibility;\n}\n\n// Drop shadows\n//\n// Note: Deprecated `.box-shadow()` as of v3.1.0 since all of Bootstrap's\n// supported browsers that have box shadow capabilities now support it.\n\n.box-shadow(@shadow) {\n -webkit-box-shadow: @shadow; // iOS <4.3 & Android <4.1\n box-shadow: @shadow;\n}\n\n// Box sizing\n.box-sizing(@boxmodel) {\n -webkit-box-sizing: @boxmodel;\n -moz-box-sizing: @boxmodel;\n box-sizing: @boxmodel;\n}\n\n// CSS3 Content Columns\n.content-columns(@column-count; @column-gap: @grid-gutter-width) {\n -webkit-column-count: @column-count;\n -moz-column-count: @column-count;\n column-count: @column-count;\n -webkit-column-gap: @column-gap;\n -moz-column-gap: @column-gap;\n column-gap: @column-gap;\n}\n\n// Optional hyphenation\n.hyphens(@mode: auto) {\n word-wrap: break-word;\n -webkit-hyphens: @mode;\n -moz-hyphens: @mode;\n -ms-hyphens: @mode; // IE10+\n -o-hyphens: @mode;\n hyphens: @mode;\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n // Firefox\n &::-moz-placeholder {\n color: @color;\n opacity: 1; // Override Firefox's unusual default opacity; see https://github.com/twbs/bootstrap/pull/11526\n }\n &:-ms-input-placeholder { color: @color; } // Internet Explorer 10+\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Transformations\n.scale(@ratio) {\n -webkit-transform: scale(@ratio);\n -ms-transform: scale(@ratio); // IE9 only\n -o-transform: scale(@ratio);\n transform: scale(@ratio);\n}\n.scale(@ratioX; @ratioY) {\n -webkit-transform: scale(@ratioX, @ratioY);\n -ms-transform: scale(@ratioX, @ratioY); // IE9 only\n -o-transform: scale(@ratioX, @ratioY);\n transform: scale(@ratioX, @ratioY);\n}\n.scaleX(@ratio) {\n -webkit-transform: scaleX(@ratio);\n -ms-transform: scaleX(@ratio); // IE9 only\n -o-transform: scaleX(@ratio);\n transform: scaleX(@ratio);\n}\n.scaleY(@ratio) {\n -webkit-transform: scaleY(@ratio);\n -ms-transform: scaleY(@ratio); // IE9 only\n -o-transform: scaleY(@ratio);\n transform: scaleY(@ratio);\n}\n.skew(@x; @y) {\n -webkit-transform: skewX(@x) skewY(@y);\n -ms-transform: skewX(@x) skewY(@y); // See https://github.com/twbs/bootstrap/issues/4885; IE9+\n -o-transform: skewX(@x) skewY(@y);\n transform: skewX(@x) skewY(@y);\n}\n.translate(@x; @y) {\n -webkit-transform: translate(@x, @y);\n -ms-transform: translate(@x, @y); // IE9 only\n -o-transform: translate(@x, @y);\n transform: translate(@x, @y);\n}\n.translate3d(@x; @y; @z) {\n -webkit-transform: translate3d(@x, @y, @z);\n transform: translate3d(@x, @y, @z);\n}\n.rotate(@degrees) {\n -webkit-transform: rotate(@degrees);\n -ms-transform: rotate(@degrees); // IE9 only\n -o-transform: rotate(@degrees);\n transform: rotate(@degrees);\n}\n.rotateX(@degrees) {\n -webkit-transform: rotateX(@degrees);\n -ms-transform: rotateX(@degrees); // IE9 only\n -o-transform: rotateX(@degrees);\n transform: rotateX(@degrees);\n}\n.rotateY(@degrees) {\n -webkit-transform: rotateY(@degrees);\n -ms-transform: rotateY(@degrees); // IE9 only\n -o-transform: rotateY(@degrees);\n transform: rotateY(@degrees);\n}\n.perspective(@perspective) {\n -webkit-perspective: @perspective;\n -moz-perspective: @perspective;\n perspective: @perspective;\n}\n.perspective-origin(@perspective) {\n -webkit-perspective-origin: @perspective;\n -moz-perspective-origin: @perspective;\n perspective-origin: @perspective;\n}\n.transform-origin(@origin) {\n -webkit-transform-origin: @origin;\n -moz-transform-origin: @origin;\n -ms-transform-origin: @origin; // IE9 only\n transform-origin: @origin;\n}\n\n\n// Transitions\n\n.transition(@transition) {\n -webkit-transition: @transition;\n -o-transition: @transition;\n transition: @transition;\n}\n.transition-property(@transition-property) {\n -webkit-transition-property: @transition-property;\n transition-property: @transition-property;\n}\n.transition-delay(@transition-delay) {\n -webkit-transition-delay: @transition-delay;\n transition-delay: @transition-delay;\n}\n.transition-duration(@transition-duration) {\n -webkit-transition-duration: @transition-duration;\n transition-duration: @transition-duration;\n}\n.transition-timing-function(@timing-function) {\n -webkit-transition-timing-function: @timing-function;\n transition-timing-function: @timing-function;\n}\n.transition-transform(@transition) {\n -webkit-transition: -webkit-transform @transition;\n -moz-transition: -moz-transform @transition;\n -o-transition: -o-transform @transition;\n transition: transform @transition;\n}\n\n\n// User select\n// For selecting text on the page\n\n.user-select(@select) {\n -webkit-user-select: @select;\n -moz-user-select: @select;\n -ms-user-select: @select; // IE10+\n user-select: @select;\n}\n","// WebKit-style focus\n\n.tab-focus() {\n // WebKit-specific. Other browsers will keep their default outline style.\n // (Initially tried to also force default via `outline: initial`,\n // but that seems to erroneously remove the outline in Firefox altogether.)\n outline: 5px auto -webkit-focus-ring-color;\n outline-offset: -2px;\n}\n","// Image Mixins\n// - Responsive image\n// - Retina image\n\n\n// Responsive image\n//\n// Keep images from scaling beyond the width of their parents.\n.img-responsive(@display: block) {\n display: @display;\n max-width: 100%; // Part 1: Set a maximum relative to the parent\n height: auto; // Part 2: Scale the height according to the width, otherwise you get stretching\n}\n\n\n// Retina image\n//\n// Short retina mixin for setting background-image and -size. Note that the\n// spelling of `min--moz-device-pixel-ratio` is intentional.\n.img-retina(@file-1x; @file-2x; @width-1x; @height-1x) {\n background-image: url(\"@{file-1x}\");\n\n @media\n only screen and (-webkit-min-device-pixel-ratio: 2),\n only screen and ( min--moz-device-pixel-ratio: 2),\n only screen and ( -o-min-device-pixel-ratio: 2/1),\n only screen and ( min-device-pixel-ratio: 2),\n only screen and ( min-resolution: 192dpi),\n only screen and ( min-resolution: 2dppx) {\n background-image: url(\"@{file-2x}\");\n background-size: @width-1x @height-1x;\n }\n}\n","//\n// Typography\n// --------------------------------------------------\n\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n.lead {\n margin-bottom: @line-height-computed;\n font-size: floor((@font-size-base * 1.15));\n font-weight: 300;\n line-height: 1.4;\n\n @media (min-width: @screen-sm-min) {\n font-size: (@font-size-base * 1.5);\n }\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n background-color: @state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// Contextual colors\n.text-muted {\n color: @text-muted;\n}\n.text-primary {\n .text-emphasis-variant(@brand-primary);\n}\n.text-success {\n .text-emphasis-variant(@state-success-text);\n}\n.text-info {\n .text-emphasis-variant(@state-info-text);\n}\n.text-warning {\n .text-emphasis-variant(@state-warning-text);\n}\n.text-danger {\n .text-emphasis-variant(@state-danger-text);\n}\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Page header\n// -------------------------\n\n.page-header {\n padding-bottom: ((@line-height-computed / 2) - 1);\n margin: (@line-height-computed * 2) 0 @line-height-computed;\n border-bottom: 1px solid @page-header-border-color;\n}\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// List options\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n// Horizontal description lists\n//\n// Defaults to being stacked without any of the below styles applied, until the\n// grid breakpoint is reached (default of ~768px).\n\n.dl-horizontal {\n dd {\n &:extend(.clearfix all); // Clear the floated `dt` if an empty `dd` is present\n }\n\n @media (min-width: @dl-horizontal-breakpoint) {\n dt {\n float: left;\n width: (@dl-horizontal-offset - 20);\n clear: left;\n text-align: right;\n .text-overflow();\n }\n dd {\n margin-left: @dl-horizontal-offset;\n }\n }\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n.initialism {\n font-size: 90%;\n .text-uppercase();\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n\n // Note: Deprecated small and .small as of v3.1.0\n // Context: https://github.com/twbs/bootstrap/issues/11660\n footer,\n small,\n .small {\n display: block;\n font-size: 80%; // back to default font-size\n line-height: @line-height-base;\n color: @blockquote-small-color;\n\n &:before {\n content: '\\2014 \\00A0'; // em dash, nbsp\n }\n }\n}\n\n// Opposite alignment of blockquote\n//\n// Heads up: `blockquote.pull-right` has been deprecated as of v3.1.0.\n.blockquote-reverse,\nblockquote.pull-right {\n padding-right: 15px;\n padding-left: 0;\n border-right: 5px solid @blockquote-border-color;\n border-left: 0;\n text-align: right;\n\n // Account for citation\n footer,\n small,\n .small {\n &:before { content: ''; }\n &:after {\n content: '\\00A0 \\2014'; // nbsp, em dash\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","// Typography\n\n.text-emphasis-variant(@color) {\n color: @color;\n a&:hover,\n a&:focus {\n color: darken(@color, 10%);\n }\n}\n","// Contextual backgrounds\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover,\n a&:focus {\n background-color: darken(@color, 10%);\n }\n}\n","// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","//\n// Code (inline and block)\n// --------------------------------------------------\n\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @kbd-color;\n background-color: @kbd-bg;\n border-radius: @border-radius-small;\n box-shadow: inset 0 -1px 0 rgba(0,0,0,.25);\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n box-shadow: none;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","//\n// Grid system\n// --------------------------------------------------\n\n\n// Container widths\n//\n// Set the container width, and override it for fixed navbars in media queries.\n\n.container {\n .container-fixed();\n\n @media (min-width: @screen-sm-min) {\n width: @container-sm;\n }\n @media (min-width: @screen-md-min) {\n width: @container-md;\n }\n @media (min-width: @screen-lg-min) {\n width: @container-lg;\n }\n}\n\n\n// Fluid container\n//\n// Utilizes the mixin meant for fixed width containers, but without any defined\n// width for fluid, full width layouts.\n\n.container-fluid {\n .container-fixed();\n}\n\n\n// Row\n//\n// Rows contain and clear the floats of your columns.\n\n.row {\n .make-row();\n}\n\n\n// Columns\n//\n// Common styles for small and large grid columns\n\n.make-grid-columns();\n\n\n// Extra small grid\n//\n// Columns, offsets, pushes, and pulls for extra small devices like\n// smartphones.\n\n.make-grid(xs);\n\n\n// Small grid\n//\n// Columns, offsets, pushes, and pulls for the small device range, from phones\n// to tablets.\n\n@media (min-width: @screen-sm-min) {\n .make-grid(sm);\n}\n\n\n// Medium grid\n//\n// Columns, offsets, pushes, and pulls for the desktop device range.\n\n@media (min-width: @screen-md-min) {\n .make-grid(md);\n}\n\n\n// Large grid\n//\n// Columns, offsets, pushes, and pulls for the large desktop device range.\n\n@media (min-width: @screen-lg-min) {\n .make-grid(lg);\n}\n","// Grid system\n//\n// Generate semantic grid columns with these mixins.\n\n// Centered container element\n.container-fixed(@gutter: @grid-gutter-width) {\n margin-right: auto;\n margin-left: auto;\n padding-left: floor((@gutter / 2));\n padding-right: ceil((@gutter / 2));\n &:extend(.clearfix all);\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: ceil((@gutter / -2));\n margin-right: floor((@gutter / -2));\n &:extend(.clearfix all);\n}\n\n// Generate the extra small columns\n.make-xs-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n float: left;\n width: percentage((@columns / @grid-columns));\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n}\n.make-xs-column-offset(@columns) {\n margin-left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-push(@columns) {\n left: percentage((@columns / @grid-columns));\n}\n.make-xs-column-pull(@columns) {\n right: percentage((@columns / @grid-columns));\n}\n\n// Generate the small columns\n.make-sm-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-sm-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-offset(@columns) {\n @media (min-width: @screen-sm-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-push(@columns) {\n @media (min-width: @screen-sm-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-sm-column-pull(@columns) {\n @media (min-width: @screen-sm-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the medium columns\n.make-md-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-md-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-offset(@columns) {\n @media (min-width: @screen-md-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-push(@columns) {\n @media (min-width: @screen-md-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-md-column-pull(@columns) {\n @media (min-width: @screen-md-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n\n// Generate the large columns\n.make-lg-column(@columns; @gutter: @grid-gutter-width) {\n position: relative;\n min-height: 1px;\n padding-left: (@gutter / 2);\n padding-right: (@gutter / 2);\n\n @media (min-width: @screen-lg-min) {\n float: left;\n width: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-offset(@columns) {\n @media (min-width: @screen-lg-min) {\n margin-left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-push(@columns) {\n @media (min-width: @screen-lg-min) {\n left: percentage((@columns / @grid-columns));\n }\n}\n.make-lg-column-pull(@columns) {\n @media (min-width: @screen-lg-min) {\n right: percentage((@columns / @grid-columns));\n }\n}\n","// Framework grid generation\n//\n// Used only by Bootstrap to generate the correct number of grid classes given\n// any value of `@grid-columns`.\n\n.make-grid-columns() {\n // Common styles for all sizes of grid columns, widths 1-12\n .col(@index) { // initial\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general; \"=<\" isn't a typo\n @item: ~\".col-xs-@{index}, .col-sm-@{index}, .col-md-@{index}, .col-lg-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n position: relative;\n // Prevent columns from collapsing when empty\n min-height: 1px;\n // Inner gutter via padding\n padding-left: ceil((@grid-gutter-width / 2));\n padding-right: floor((@grid-gutter-width / 2));\n }\n }\n .col(1); // kickstart it\n}\n\n.float-grid-columns(@class) {\n .col(@index) { // initial\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), @item);\n }\n .col(@index, @list) when (@index =< @grid-columns) { // general\n @item: ~\".col-@{class}-@{index}\";\n .col((@index + 1), ~\"@{list}, @{item}\");\n }\n .col(@index, @list) when (@index > @grid-columns) { // terminal\n @{list} {\n float: left;\n }\n }\n .col(1); // kickstart it\n}\n\n.calc-grid-column(@index, @class, @type) when (@type = width) and (@index > 0) {\n .col-@{class}-@{index} {\n width: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index > 0) {\n .col-@{class}-push-@{index} {\n left: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = push) and (@index = 0) {\n .col-@{class}-push-0 {\n left: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index > 0) {\n .col-@{class}-pull-@{index} {\n right: percentage((@index / @grid-columns));\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = pull) and (@index = 0) {\n .col-@{class}-pull-0 {\n right: auto;\n }\n}\n.calc-grid-column(@index, @class, @type) when (@type = offset) {\n .col-@{class}-offset-@{index} {\n margin-left: percentage((@index / @grid-columns));\n }\n}\n\n// Basic looping in LESS\n.loop-grid-columns(@index, @class, @type) when (@index >= 0) {\n .calc-grid-column(@index, @class, @type);\n // next iteration\n .loop-grid-columns((@index - 1), @class, @type);\n}\n\n// Create grid for specific class\n.make-grid(@class) {\n .float-grid-columns(@class);\n .loop-grid-columns(@grid-columns, @class, width);\n .loop-grid-columns(@grid-columns, @class, pull);\n .loop-grid-columns(@grid-columns, @class, push);\n .loop-grid-columns(@grid-columns, @class, offset);\n}\n","//\n// Tables\n// --------------------------------------------------\n\n\ntable {\n background-color: @table-bg;\n}\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n\n\n// Responsive tables\n//\n// Wrap your tables in `.table-responsive` and we'll make them mobile friendly\n// by enabling horizontal scrolling. Only applies <768px. Everything above that\n// will display normally.\n\n.table-responsive {\n overflow-x: auto;\n min-height: 0.01%; // Workaround for IE9 bug (see https://github.com/twbs/bootstrap/issues/14837)\n\n @media screen and (max-width: @screen-xs-max) {\n width: 100%;\n margin-bottom: (@line-height-computed * 0.75);\n overflow-y: hidden;\n -ms-overflow-style: -ms-autohiding-scrollbar;\n border: 1px solid @table-border-color;\n\n // Tighten up spacing\n > .table {\n margin-bottom: 0;\n\n // Ensure the content doesn't wrap\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n white-space: nowrap;\n }\n }\n }\n }\n\n // Special overrides for the bordered tables\n > .table-bordered {\n border: 0;\n\n // Nuke the appropriate borders so that the parent can handle them\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n\n // Only nuke the last row's bottom-border in `tbody` and `tfoot` since\n // chances are there will be only one `tr` in a `thead` and that would\n // remove the border altogether.\n > tbody,\n > tfoot {\n > tr:last-child {\n > th,\n > td {\n border-bottom: 0;\n }\n }\n }\n\n }\n }\n}\n","// Tables\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n","//\n// Forms\n// --------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n .box-sizing(border-box);\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius; // Note: This has no effect on s in CSS.\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.075));\n .transition(~\"border-color ease-in-out .15s, box-shadow ease-in-out .15s\");\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Unstyle the caret on ``\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n","//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n display: inline-block;\n margin-bottom: 0; // For input.btn\n font-weight: @btn-font-weight;\n text-align: center;\n vertical-align: middle;\n touch-action: manipulation;\n cursor: pointer;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n white-space: nowrap;\n .button-size(@padding-base-vertical; @padding-base-horizontal; @font-size-base; @line-height-base; @btn-border-radius-base);\n .user-select(none);\n\n &,\n &:active,\n &.active {\n &:focus,\n &.focus {\n .tab-focus();\n }\n }\n\n &:hover,\n &:focus,\n &.focus {\n color: @btn-default-color;\n text-decoration: none;\n }\n\n &:active,\n &.active {\n outline: 0;\n background-image: none;\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n .opacity(.65);\n .box-shadow(none);\n }\n\n a& {\n &.disabled,\n fieldset[disabled] & {\n pointer-events: none; // Future-proof disabling of clicks on `` elements\n }\n }\n}\n\n\n// Alternate buttons\n// --------------------------------------------------\n\n.btn-default {\n .button-variant(@btn-default-color; @btn-default-bg; @btn-default-border);\n}\n.btn-primary {\n .button-variant(@btn-primary-color; @btn-primary-bg; @btn-primary-border);\n}\n// Success appears as green\n.btn-success {\n .button-variant(@btn-success-color; @btn-success-bg; @btn-success-border);\n}\n// Info appears as blue-green\n.btn-info {\n .button-variant(@btn-info-color; @btn-info-bg; @btn-info-border);\n}\n// Warning appears as orange\n.btn-warning {\n .button-variant(@btn-warning-color; @btn-warning-bg; @btn-warning-border);\n}\n// Danger and error appear as red\n.btn-danger {\n .button-variant(@btn-danger-color; @btn-danger-bg; @btn-danger-border);\n}\n\n\n// Link buttons\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n color: @link-color;\n font-weight: normal;\n border-radius: 0;\n\n &,\n &:active,\n &.active,\n &[disabled],\n fieldset[disabled] & {\n background-color: transparent;\n .box-shadow(none);\n }\n &,\n &:hover,\n &:focus,\n &:active {\n border-color: transparent;\n }\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n background-color: transparent;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @btn-link-disabled-color;\n text-decoration: none;\n }\n }\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-lg {\n // line-height: ensure even-numbered height of button next to large input\n .button-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @btn-border-radius-large);\n}\n.btn-sm {\n // line-height: ensure proper height of button next to small input\n .button-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n.btn-xs {\n .button-size(@padding-xs-vertical; @padding-xs-horizontal; @font-size-small; @line-height-small; @btn-border-radius-small);\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n","// Button variants\n//\n// Easily pump out default styles, as well as :hover, :focus, :active,\n// and disabled options for all buttons\n\n.button-variant(@color; @background; @border) {\n color: @color;\n background-color: @background;\n border-color: @border;\n\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 25%);\n }\n &:hover {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n color: @color;\n background-color: darken(@background, 10%);\n border-color: darken(@border, 12%);\n\n &:hover,\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 17%);\n border-color: darken(@border, 25%);\n }\n }\n &:active,\n &.active,\n .open > .dropdown-toggle& {\n background-image: none;\n }\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus,\n &.focus {\n background-color: @background;\n border-color: @border;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n// Button sizes\n.button-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n}\n","// Opacity\n\n.opacity(@opacity) {\n opacity: @opacity;\n // IE8 filter\n @opacity-ie: (@opacity * 100);\n filter: ~\"alpha(opacity=@{opacity-ie})\";\n}\n","//\n// Component animations\n// --------------------------------------------------\n\n// Heads up!\n//\n// We don't use the `.opacity()` mixin here since it causes a bug with text\n// fields in IE7-8. Source: https://github.com/twbs/bootstrap/pull/3552.\n\n.fade {\n opacity: 0;\n .transition(opacity .15s linear);\n &.in {\n opacity: 1;\n }\n}\n\n.collapse {\n display: none;\n\n &.in { display: block; }\n tr&.in { display: table-row; }\n tbody&.in { display: table-row-group; }\n}\n\n.collapsing {\n position: relative;\n height: 0;\n overflow: hidden;\n .transition-property(~\"height, visibility\");\n .transition-duration(.35s);\n .transition-timing-function(ease);\n}\n","//\n// Dropdown menus\n// --------------------------------------------------\n\n\n// Dropdown arrow/caret\n.caret {\n display: inline-block;\n width: 0;\n height: 0;\n margin-left: 2px;\n vertical-align: middle;\n border-top: @caret-width-base dashed;\n border-top: @caret-width-base solid ~\"\\9\"; // IE8\n border-right: @caret-width-base solid transparent;\n border-left: @caret-width-base solid transparent;\n}\n\n// The dropdown wrapper (div)\n.dropup,\n.dropdown {\n position: relative;\n}\n\n// Prevent the focus on the dropdown toggle when closing dropdowns\n.dropdown-toggle:focus {\n outline: 0;\n}\n\n// The dropdown menu (ul)\n.dropdown-menu {\n position: absolute;\n top: 100%;\n left: 0;\n z-index: @zindex-dropdown;\n display: none; // none by default, but block on \"open\" of the menu\n float: left;\n min-width: 160px;\n padding: 5px 0;\n margin: 2px 0 0; // override default ul\n list-style: none;\n font-size: @font-size-base;\n text-align: left; // Ensures proper alignment if parent has it changed (e.g., modal footer)\n background-color: @dropdown-bg;\n border: 1px solid @dropdown-fallback-border; // IE8 fallback\n border: 1px solid @dropdown-border;\n border-radius: @border-radius-base;\n .box-shadow(0 6px 12px rgba(0,0,0,.175));\n background-clip: padding-box;\n\n // Aligns the dropdown menu to right\n //\n // Deprecated as of 3.1.0 in favor of `.dropdown-menu-[dir]`\n &.pull-right {\n right: 0;\n left: auto;\n }\n\n // Dividers (basically an hr) within the dropdown\n .divider {\n .nav-divider(@dropdown-divider-bg);\n }\n\n // Links within the dropdown menu\n > li > a {\n display: block;\n padding: 3px 20px;\n clear: both;\n font-weight: normal;\n line-height: @line-height-base;\n color: @dropdown-link-color;\n white-space: nowrap; // prevent links from randomly breaking onto new lines\n }\n}\n\n// Hover/Focus state\n.dropdown-menu > li > a {\n &:hover,\n &:focus {\n text-decoration: none;\n color: @dropdown-link-hover-color;\n background-color: @dropdown-link-hover-bg;\n }\n}\n\n// Active state\n.dropdown-menu > .active > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-active-color;\n text-decoration: none;\n outline: 0;\n background-color: @dropdown-link-active-bg;\n }\n}\n\n// Disabled state\n//\n// Gray out text and ensure the hover/focus state remains gray\n\n.dropdown-menu > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @dropdown-link-disabled-color;\n }\n\n // Nuke hover/focus effects\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: transparent;\n background-image: none; // Remove CSS gradient\n .reset-filter();\n cursor: @cursor-disabled;\n }\n}\n\n// Open state for the dropdown\n.open {\n // Show the menu\n > .dropdown-menu {\n display: block;\n }\n\n // Remove the outline when :focus is triggered\n > a {\n outline: 0;\n }\n}\n\n// Menu positioning\n//\n// Add extra class to `.dropdown-menu` to flip the alignment of the dropdown\n// menu with the parent.\n.dropdown-menu-right {\n left: auto; // Reset the default from `.dropdown-menu`\n right: 0;\n}\n// With v3, we enabled auto-flipping if you have a dropdown within a right\n// aligned nav component. To enable the undoing of that, we provide an override\n// to restore the default dropdown menu alignment.\n//\n// This is only for left-aligning a dropdown menu within a `.navbar-right` or\n// `.pull-right` nav component.\n.dropdown-menu-left {\n left: 0;\n right: auto;\n}\n\n// Dropdown section headers\n.dropdown-header {\n display: block;\n padding: 3px 20px;\n font-size: @font-size-small;\n line-height: @line-height-base;\n color: @dropdown-header-color;\n white-space: nowrap; // as with > li > a\n}\n\n// Backdrop to catch body clicks on mobile, etc.\n.dropdown-backdrop {\n position: fixed;\n left: 0;\n right: 0;\n bottom: 0;\n top: 0;\n z-index: (@zindex-dropdown - 10);\n}\n\n// Right aligned dropdowns\n.pull-right > .dropdown-menu {\n right: 0;\n left: auto;\n}\n\n// Allow for dropdowns to go bottom up (aka, dropup-menu)\n//\n// Just add .dropup after the standard .dropdown class and you're set, bro.\n// TODO: abstract this so that the navbar fixed styles are not placed here?\n\n.dropup,\n.navbar-fixed-bottom .dropdown {\n // Reverse the caret\n .caret {\n border-top: 0;\n border-bottom: @caret-width-base dashed;\n border-bottom: @caret-width-base solid ~\"\\9\"; // IE8\n content: \"\";\n }\n // Different positioning for bottom up menu\n .dropdown-menu {\n top: auto;\n bottom: 100%;\n margin-bottom: 2px;\n }\n}\n\n\n// Component alignment\n//\n// Reiterate per navbar.less and the modified component alignment there.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-right {\n .dropdown-menu {\n .dropdown-menu-right();\n }\n // Necessary for overrides of the default right aligned menu.\n // Will remove come v4 in all likelihood.\n .dropdown-menu-left {\n .dropdown-menu-left();\n }\n }\n}\n","// Horizontal dividers\n//\n// Dividers (basically an hr) within dropdowns and nav lists\n\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n","// Reset filters for IE\n//\n// When you need to remove a gradient background, do not forget to use this to reset\n// the IE filter for IE9 and below.\n\n.reset-filter() {\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(enabled = false)\"));\n}\n","//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; // match .btn alignment given font-size hack above\n > .btn {\n position: relative;\n float: left;\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active,\n &.active {\n z-index: 2;\n }\n }\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n .btn + .btn,\n .btn + .btn-group,\n .btn-group + .btn,\n .btn-group + .btn-group {\n margin-left: -1px;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n margin-left: -5px; // Offset the first child's margin\n &:extend(.clearfix all);\n\n .btn,\n .btn-group,\n .input-group {\n float: left;\n }\n > .btn,\n > .btn-group,\n > .input-group {\n margin-left: 5px;\n }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n margin-left: 0;\n &:not(:last-child):not(.dropdown-toggle) {\n .border-right-radius(0);\n }\n}\n// Need .dropdown-toggle since :last-child doesn't apply, given that a .dropdown-menu is used immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-right-radius(0);\n }\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n .box-shadow(inset 0 3px 5px rgba(0,0,0,.125));\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n .box-shadow(none);\n }\n}\n\n\n// Reposition the caret\n.btn .caret {\n margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n border-width: @caret-width-large @caret-width-large 0;\n border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Vertical button groups\n// ----------------------\n\n.btn-group-vertical {\n > .btn,\n > .btn-group,\n > .btn-group > .btn {\n display: block;\n float: none;\n width: 100%;\n max-width: 100%;\n }\n\n // Clear floats so dropdown menus can be properly placed\n > .btn-group {\n &:extend(.clearfix all);\n > .btn {\n float: none;\n }\n }\n\n > .btn + .btn,\n > .btn + .btn-group,\n > .btn-group + .btn,\n > .btn-group + .btn-group {\n margin-top: -1px;\n margin-left: 0;\n }\n}\n\n.btn-group-vertical > .btn {\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n &:first-child:not(:last-child) {\n .border-top-radius(@btn-border-radius-base);\n .border-bottom-radius(0);\n }\n &:last-child:not(:first-child) {\n .border-top-radius(0);\n .border-bottom-radius(@btn-border-radius-base);\n }\n}\n.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group-vertical > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-bottom-radius(0);\n }\n}\n.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-top-radius(0);\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n > .btn,\n > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n }\n > .btn-group .btn {\n width: 100%;\n }\n\n > .btn-group .dropdown-menu {\n left: auto;\n }\n}\n\n\n// Checkbox and radio options\n//\n// In order to support the browser's form validation feedback, powered by the\n// `required` attribute, we have to \"hide\" the inputs via `clip`. We cannot use\n// `display: none;` or `visibility: hidden;` as that also hides the popover.\n// Simply visually hiding the inputs via `opacity` would leave them clickable in\n// certain cases which is prevented by using `clip` and `pointer-events`.\n// This way, we ensure a DOM element is visible to position the popover from.\n//\n// See https://github.com/twbs/bootstrap/pull/12794 and\n// https://github.com/twbs/bootstrap/pull/14559 for more information.\n\n[data-toggle=\"buttons\"] {\n > .btn,\n > .btn-group > .btn {\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n position: absolute;\n clip: rect(0,0,0,0);\n pointer-events: none;\n }\n }\n}\n","// Single side border-radius\n\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n","//\n// Input groups\n// --------------------------------------------------\n\n// Base styles\n// -------------------------\n.input-group {\n position: relative; // For dropdowns\n display: table;\n border-collapse: separate; // prevent input groups from inheriting border styles from table cells when placed within a table\n\n // Undo padding and float of grid classes\n &[class*=\"col-\"] {\n float: none;\n padding-left: 0;\n padding-right: 0;\n }\n\n .form-control {\n // Ensure that the input is always above the *appended* addon button for\n // proper border colors.\n position: relative;\n z-index: 2;\n\n // IE9 fubars the placeholder attribute in text inputs and the arrows on\n // select elements in input groups. To fix it, we float the input. Details:\n // https://github.com/twbs/bootstrap/issues/11561#issuecomment-28936855\n float: left;\n\n width: 100%;\n margin-bottom: 0;\n\n &:focus {\n z-index: 3;\n }\n }\n}\n\n// Sizing options\n//\n// Remix the default form control sizing classes into new ones for easier\n// manipulation.\n\n.input-group-lg > .form-control,\n.input-group-lg > .input-group-addon,\n.input-group-lg > .input-group-btn > .btn {\n .input-lg();\n}\n.input-group-sm > .form-control,\n.input-group-sm > .input-group-addon,\n.input-group-sm > .input-group-btn > .btn {\n .input-sm();\n}\n\n\n// Display as table-cell\n// -------------------------\n.input-group-addon,\n.input-group-btn,\n.input-group .form-control {\n display: table-cell;\n\n &:not(:first-child):not(:last-child) {\n border-radius: 0;\n }\n}\n// Addon and addon wrapper for buttons\n.input-group-addon,\n.input-group-btn {\n width: 1%;\n white-space: nowrap;\n vertical-align: middle; // Match the inputs\n}\n\n// Text input groups\n// -------------------------\n.input-group-addon {\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n font-weight: normal;\n line-height: 1;\n color: @input-color;\n text-align: center;\n background-color: @input-group-addon-bg;\n border: 1px solid @input-group-addon-border-color;\n border-radius: @input-border-radius;\n\n // Sizing\n &.input-sm {\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n border-radius: @input-border-radius-small;\n }\n &.input-lg {\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n border-radius: @input-border-radius-large;\n }\n\n // Nuke default margins from checkboxes and radios to vertically center within.\n input[type=\"radio\"],\n input[type=\"checkbox\"] {\n margin-top: 0;\n }\n}\n\n// Reset rounded corners\n.input-group .form-control:first-child,\n.input-group-addon:first-child,\n.input-group-btn:first-child > .btn,\n.input-group-btn:first-child > .btn-group > .btn,\n.input-group-btn:first-child > .dropdown-toggle,\n.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),\n.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {\n .border-right-radius(0);\n}\n.input-group-addon:first-child {\n border-right: 0;\n}\n.input-group .form-control:last-child,\n.input-group-addon:last-child,\n.input-group-btn:last-child > .btn,\n.input-group-btn:last-child > .btn-group > .btn,\n.input-group-btn:last-child > .dropdown-toggle,\n.input-group-btn:first-child > .btn:not(:first-child),\n.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {\n .border-left-radius(0);\n}\n.input-group-addon:last-child {\n border-left: 0;\n}\n\n// Button input groups\n// -------------------------\n.input-group-btn {\n position: relative;\n // Jankily prevent input button groups from wrapping with `white-space` and\n // `font-size` in combination with `inline-block` on buttons.\n font-size: 0;\n white-space: nowrap;\n\n // Negative margin for spacing, position for bringing hovered/focused/actived\n // element above the siblings.\n > .btn {\n position: relative;\n + .btn {\n margin-left: -1px;\n }\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active {\n z-index: 2;\n }\n }\n\n // Negative margin to only have a 1px border between the two\n &:first-child {\n > .btn,\n > .btn-group {\n margin-right: -1px;\n }\n }\n &:last-child {\n > .btn,\n > .btn-group {\n z-index: 2;\n margin-left: -1px;\n }\n }\n}\n","//\n// Navs\n// --------------------------------------------------\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n margin-bottom: 0;\n padding-left: 0; // Override default ul/ol\n list-style: none;\n &:extend(.clearfix all);\n\n > li {\n position: relative;\n display: block;\n\n > a {\n position: relative;\n display: block;\n padding: @nav-link-padding;\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @nav-link-hover-bg;\n }\n }\n\n // Disabled state sets text to gray and nukes hover/tab effects\n &.disabled > a {\n color: @nav-disabled-link-color;\n\n &:hover,\n &:focus {\n color: @nav-disabled-link-hover-color;\n text-decoration: none;\n background-color: transparent;\n cursor: @cursor-disabled;\n }\n }\n }\n\n // Open dropdowns\n .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @nav-link-hover-bg;\n border-color: @link-color;\n }\n }\n\n // Nav dividers (deprecated with v3.0.1)\n //\n // This should have been removed in v3 with the dropping of `.nav-list`, but\n // we missed it. We don't currently support this anywhere, but in the interest\n // of maintaining backward compatibility in case you use it, it's deprecated.\n .nav-divider {\n .nav-divider();\n }\n\n // Prevent IE8 from misplacing imgs\n //\n // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n > li > a > img {\n max-width: none;\n }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n border-bottom: 1px solid @nav-tabs-border-color;\n > li {\n float: left;\n // Make the list-items overlay the bottom border\n margin-bottom: -1px;\n\n // Actual tabs (as links)\n > a {\n margin-right: 2px;\n line-height: @line-height-base;\n border: 1px solid transparent;\n border-radius: @border-radius-base @border-radius-base 0 0;\n &:hover {\n border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n }\n }\n\n // Active state, and its :hover to override normal :hover\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-tabs-active-link-hover-color;\n background-color: @nav-tabs-active-link-hover-bg;\n border: 1px solid @nav-tabs-active-link-hover-border-color;\n border-bottom-color: transparent;\n cursor: default;\n }\n }\n }\n // pulling this in mainly for less shorthand\n &.nav-justified {\n .nav-justified();\n .nav-tabs-justified();\n }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n > li {\n float: left;\n\n // Links rendered as pills\n > a {\n border-radius: @nav-pills-border-radius;\n }\n + li {\n margin-left: 2px;\n }\n\n // Active state\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-pills-active-link-hover-color;\n background-color: @nav-pills-active-link-hover-bg;\n }\n }\n }\n}\n\n\n// Stacked pills\n.nav-stacked {\n > li {\n float: none;\n + li {\n margin-top: 2px;\n margin-left: 0; // no need for this gap between nav items\n }\n }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n width: 100%;\n\n > li {\n float: none;\n > a {\n text-align: center;\n margin-bottom: 5px;\n }\n }\n\n > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n }\n\n @media (min-width: @screen-sm-min) {\n > li {\n display: table-cell;\n width: 1%;\n > a {\n margin-bottom: 0;\n }\n }\n }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n border-bottom: 0;\n\n > li > a {\n // Override margin from .nav-tabs\n margin-right: 0;\n border-radius: @border-radius-base;\n }\n\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border: 1px solid @nav-tabs-justified-link-border-color;\n }\n\n @media (min-width: @screen-sm-min) {\n > li > a {\n border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n border-radius: @border-radius-base @border-radius-base 0 0;\n }\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border-bottom-color: @nav-tabs-justified-active-link-border-color;\n }\n }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n // make dropdown border overlap tab border\n margin-top: -1px;\n // Remove the top rounded corners here since there is a hard edge above the menu\n .border-top-radius(0);\n}\n","//\n// Navbars\n// --------------------------------------------------\n\n\n// Wrapper and base class\n//\n// Provide a static navbar from which we expand to create full-width, fixed, and\n// other navbar variations.\n\n.navbar {\n position: relative;\n min-height: @navbar-height; // Ensure a navbar always shows (e.g., without a .navbar-brand in collapsed mode)\n margin-bottom: @navbar-margin-bottom;\n border: 1px solid transparent;\n\n // Prevent floats from breaking the navbar\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: @navbar-border-radius;\n }\n}\n\n\n// Navbar heading\n//\n// Groups `.navbar-brand` and `.navbar-toggle` into a single component for easy\n// styling of responsive aspects.\n\n.navbar-header {\n &:extend(.clearfix all);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n }\n}\n\n\n// Navbar collapse (body)\n//\n// Group your navbar content into this for easy collapsing and expanding across\n// various device sizes. By default, this content is collapsed when <768px, but\n// will expand past that for a horizontal display.\n//\n// To start (on mobile devices) the navbar links, forms, and buttons are stacked\n// vertically and include a `max-height` to overflow in case you have too much\n// content for the user's viewport.\n\n.navbar-collapse {\n overflow-x: visible;\n padding-right: @navbar-padding-horizontal;\n padding-left: @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n box-shadow: inset 0 1px 0 rgba(255,255,255,.1);\n &:extend(.clearfix all);\n -webkit-overflow-scrolling: touch;\n\n &.in {\n overflow-y: auto;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border-top: 0;\n box-shadow: none;\n\n &.collapse {\n display: block !important;\n height: auto !important;\n padding-bottom: 0; // Override default setting\n overflow: visible !important;\n }\n\n &.in {\n overflow-y: visible;\n }\n\n // Undo the collapse side padding for navbars with containers to ensure\n // alignment of right-aligned contents.\n .navbar-fixed-top &,\n .navbar-static-top &,\n .navbar-fixed-bottom & {\n padding-left: 0;\n padding-right: 0;\n }\n }\n}\n\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n .navbar-collapse {\n max-height: @navbar-collapse-max-height;\n\n @media (max-device-width: @screen-xs-min) and (orientation: landscape) {\n max-height: 200px;\n }\n }\n}\n\n\n// Both navbar header and collapse\n//\n// When a container is present, change the behavior of the header and collapse.\n\n.container,\n.container-fluid {\n > .navbar-header,\n > .navbar-collapse {\n margin-right: -@navbar-padding-horizontal;\n margin-left: -@navbar-padding-horizontal;\n\n @media (min-width: @grid-float-breakpoint) {\n margin-right: 0;\n margin-left: 0;\n }\n }\n}\n\n\n//\n// Navbar alignment options\n//\n// Display the navbar across the entirety of the page or fixed it to the top or\n// bottom of the page.\n\n// Static top (unfixed, but 100% wide) navbar\n.navbar-static-top {\n z-index: @zindex-navbar;\n border-width: 0 0 1px;\n\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n\n// Fix the top/bottom navbars when screen real estate supports it\n.navbar-fixed-top,\n.navbar-fixed-bottom {\n position: fixed;\n right: 0;\n left: 0;\n z-index: @zindex-navbar-fixed;\n\n // Undo the rounded corners\n @media (min-width: @grid-float-breakpoint) {\n border-radius: 0;\n }\n}\n.navbar-fixed-top {\n top: 0;\n border-width: 0 0 1px;\n}\n.navbar-fixed-bottom {\n bottom: 0;\n margin-bottom: 0; // override .navbar defaults\n border-width: 1px 0 0;\n}\n\n\n// Brand/project name\n\n.navbar-brand {\n float: left;\n padding: @navbar-padding-vertical @navbar-padding-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-computed;\n height: @navbar-height;\n\n &:hover,\n &:focus {\n text-decoration: none;\n }\n\n > img {\n display: block;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n .navbar > .container &,\n .navbar > .container-fluid & {\n margin-left: -@navbar-padding-horizontal;\n }\n }\n}\n\n\n// Navbar toggle\n//\n// Custom button for toggling the `.navbar-collapse`, powered by the collapse\n// JavaScript plugin.\n\n.navbar-toggle {\n position: relative;\n float: right;\n margin-right: @navbar-padding-horizontal;\n padding: 9px 10px;\n .navbar-vertical-align(34px);\n background-color: transparent;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid transparent;\n border-radius: @border-radius-base;\n\n // We remove the `outline` here, but later compensate by attaching `:hover`\n // styles to `:focus`.\n &:focus {\n outline: 0;\n }\n\n // Bars\n .icon-bar {\n display: block;\n width: 22px;\n height: 2px;\n border-radius: 1px;\n }\n .icon-bar + .icon-bar {\n margin-top: 4px;\n }\n\n @media (min-width: @grid-float-breakpoint) {\n display: none;\n }\n}\n\n\n// Navbar nav links\n//\n// Builds on top of the `.nav` components with its own modifier class to make\n// the nav the full height of the horizontal nav (above 768px).\n\n.navbar-nav {\n margin: (@navbar-padding-vertical / 2) -@navbar-padding-horizontal;\n\n > li > a {\n padding-top: 10px;\n padding-bottom: 10px;\n line-height: @line-height-computed;\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n position: static;\n float: none;\n width: auto;\n margin-top: 0;\n background-color: transparent;\n border: 0;\n box-shadow: none;\n > li > a,\n .dropdown-header {\n padding: 5px 15px 5px 25px;\n }\n > li > a {\n line-height: @line-height-computed;\n &:hover,\n &:focus {\n background-image: none;\n }\n }\n }\n }\n\n // Uncollapse the nav\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin: 0;\n\n > li {\n float: left;\n > a {\n padding-top: @navbar-padding-vertical;\n padding-bottom: @navbar-padding-vertical;\n }\n }\n }\n}\n\n\n// Navbar form\n//\n// Extension of the `.form-inline` with some extra flavor for optimum display in\n// our navbars.\n\n.navbar-form {\n margin-left: -@navbar-padding-horizontal;\n margin-right: -@navbar-padding-horizontal;\n padding: 10px @navbar-padding-horizontal;\n border-top: 1px solid transparent;\n border-bottom: 1px solid transparent;\n @shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);\n .box-shadow(@shadow);\n\n // Mixin behavior for optimum display\n .form-inline();\n\n .form-group {\n @media (max-width: @grid-float-breakpoint-max) {\n margin-bottom: 5px;\n\n &:last-child {\n margin-bottom: 0;\n }\n }\n }\n\n // Vertically center in expanded, horizontal navbar\n .navbar-vertical-align(@input-height-base);\n\n // Undo 100% width for pull classes\n @media (min-width: @grid-float-breakpoint) {\n width: auto;\n border: 0;\n margin-left: 0;\n margin-right: 0;\n padding-top: 0;\n padding-bottom: 0;\n .box-shadow(none);\n }\n}\n\n\n// Dropdown menus\n\n// Menu position and menu carets\n.navbar-nav > li > .dropdown-menu {\n margin-top: 0;\n .border-top-radius(0);\n}\n// Menu position and menu caret support for dropups via extra dropup class\n.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {\n margin-bottom: 0;\n .border-top-radius(@navbar-border-radius);\n .border-bottom-radius(0);\n}\n\n\n// Buttons in navbars\n//\n// Vertically center a button within a navbar (when *not* in a form).\n\n.navbar-btn {\n .navbar-vertical-align(@input-height-base);\n\n &.btn-sm {\n .navbar-vertical-align(@input-height-small);\n }\n &.btn-xs {\n .navbar-vertical-align(22);\n }\n}\n\n\n// Text in navbars\n//\n// Add a class to make any element properly align itself vertically within the navbars.\n\n.navbar-text {\n .navbar-vertical-align(@line-height-computed);\n\n @media (min-width: @grid-float-breakpoint) {\n float: left;\n margin-left: @navbar-padding-horizontal;\n margin-right: @navbar-padding-horizontal;\n }\n}\n\n\n// Component alignment\n//\n// Repurpose the pull utilities as their own navbar utilities to avoid specificity\n// issues with parents and chaining. Only do this when the navbar is uncollapsed\n// though so that navbar contents properly stack and align in mobile.\n//\n// Declared after the navbar components to ensure more specificity on the margins.\n\n@media (min-width: @grid-float-breakpoint) {\n .navbar-left { .pull-left(); }\n .navbar-right {\n .pull-right();\n margin-right: -@navbar-padding-horizontal;\n\n ~ .navbar-right {\n margin-right: 0;\n }\n }\n}\n\n\n// Alternate navbars\n// --------------------------------------------------\n\n// Default navbar\n.navbar-default {\n background-color: @navbar-default-bg;\n border-color: @navbar-default-border;\n\n .navbar-brand {\n color: @navbar-default-brand-color;\n &:hover,\n &:focus {\n color: @navbar-default-brand-hover-color;\n background-color: @navbar-default-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-default-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-default-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n\n .navbar-toggle {\n border-color: @navbar-default-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-default-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-default-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: @navbar-default-border;\n }\n\n // Dropdown menu items\n .navbar-nav {\n // Remove background color from open dropdown\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-default-link-active-bg;\n color: @navbar-default-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display when collapsed\n .open .dropdown-menu {\n > li > a {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n background-color: @navbar-default-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-active-color;\n background-color: @navbar-default-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n background-color: @navbar-default-link-disabled-bg;\n }\n }\n }\n }\n }\n\n\n // Links in navbars\n //\n // Add a class to ensure links outside the navbar nav are colored correctly.\n\n .navbar-link {\n color: @navbar-default-link-color;\n &:hover {\n color: @navbar-default-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-default-link-color;\n &:hover,\n &:focus {\n color: @navbar-default-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-default-link-disabled-color;\n }\n }\n }\n}\n\n// Inverse navbar\n\n.navbar-inverse {\n background-color: @navbar-inverse-bg;\n border-color: @navbar-inverse-border;\n\n .navbar-brand {\n color: @navbar-inverse-brand-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-brand-hover-color;\n background-color: @navbar-inverse-brand-hover-bg;\n }\n }\n\n .navbar-text {\n color: @navbar-inverse-color;\n }\n\n .navbar-nav {\n > li > a {\n color: @navbar-inverse-link-color;\n\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n\n // Darken the responsive nav toggle\n .navbar-toggle {\n border-color: @navbar-inverse-toggle-border-color;\n &:hover,\n &:focus {\n background-color: @navbar-inverse-toggle-hover-bg;\n }\n .icon-bar {\n background-color: @navbar-inverse-toggle-icon-bar-bg;\n }\n }\n\n .navbar-collapse,\n .navbar-form {\n border-color: darken(@navbar-inverse-bg, 7%);\n }\n\n // Dropdowns\n .navbar-nav {\n > .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @navbar-inverse-link-active-bg;\n color: @navbar-inverse-link-active-color;\n }\n }\n\n @media (max-width: @grid-float-breakpoint-max) {\n // Dropdowns get custom display\n .open .dropdown-menu {\n > .dropdown-header {\n border-color: @navbar-inverse-border;\n }\n .divider {\n background-color: @navbar-inverse-border;\n }\n > li > a {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n background-color: @navbar-inverse-link-hover-bg;\n }\n }\n > .active > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-active-color;\n background-color: @navbar-inverse-link-active-bg;\n }\n }\n > .disabled > a {\n &,\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n background-color: @navbar-inverse-link-disabled-bg;\n }\n }\n }\n }\n }\n\n .navbar-link {\n color: @navbar-inverse-link-color;\n &:hover {\n color: @navbar-inverse-link-hover-color;\n }\n }\n\n .btn-link {\n color: @navbar-inverse-link-color;\n &:hover,\n &:focus {\n color: @navbar-inverse-link-hover-color;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @navbar-inverse-link-disabled-color;\n }\n }\n }\n}\n","// Navbar vertical align\n//\n// Vertically center elements in the navbar.\n// Example: an element has a height of 30px, so write out `.navbar-vertical-align(30px);` to calculate the appropriate top margin.\n\n.navbar-vertical-align(@element-height) {\n margin-top: ((@navbar-height - @element-height) / 2);\n margin-bottom: ((@navbar-height - @element-height) / 2);\n}\n","//\n// Utility classes\n// --------------------------------------------------\n\n\n// Floats\n// -------------------------\n\n.clearfix {\n .clearfix();\n}\n.center-block {\n .center-block();\n}\n.pull-right {\n float: right !important;\n}\n.pull-left {\n float: left !important;\n}\n\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n display: none !important;\n}\n\n\n// For Affix plugin\n// -------------------------\n\n.affix {\n position: fixed;\n}\n","//\n// Breadcrumbs\n// --------------------------------------------------\n\n\n.breadcrumb {\n padding: @breadcrumb-padding-vertical @breadcrumb-padding-horizontal;\n margin-bottom: @line-height-computed;\n list-style: none;\n background-color: @breadcrumb-bg;\n border-radius: @border-radius-base;\n\n > li {\n display: inline-block;\n\n + li:before {\n content: \"@{breadcrumb-separator}\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n padding: 0 5px;\n color: @breadcrumb-color;\n }\n }\n\n > .active {\n color: @breadcrumb-active-color;\n }\n}\n","//\n// Pagination (multiple pages)\n// --------------------------------------------------\n.pagination {\n display: inline-block;\n padding-left: 0;\n margin: @line-height-computed 0;\n border-radius: @border-radius-base;\n\n > li {\n display: inline; // Remove list-style and block-level defaults\n > a,\n > span {\n position: relative;\n float: left; // Collapse white-space\n padding: @padding-base-vertical @padding-base-horizontal;\n line-height: @line-height-base;\n text-decoration: none;\n color: @pagination-color;\n background-color: @pagination-bg;\n border: 1px solid @pagination-border;\n margin-left: -1px;\n }\n &:first-child {\n > a,\n > span {\n margin-left: 0;\n .border-left-radius(@border-radius-base);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius-base);\n }\n }\n }\n\n > li > a,\n > li > span {\n &:hover,\n &:focus {\n z-index: 2;\n color: @pagination-hover-color;\n background-color: @pagination-hover-bg;\n border-color: @pagination-hover-border;\n }\n }\n\n > .active > a,\n > .active > span {\n &,\n &:hover,\n &:focus {\n z-index: 3;\n color: @pagination-active-color;\n background-color: @pagination-active-bg;\n border-color: @pagination-active-border;\n cursor: default;\n }\n }\n\n > .disabled {\n > span,\n > span:hover,\n > span:focus,\n > a,\n > a:hover,\n > a:focus {\n color: @pagination-disabled-color;\n background-color: @pagination-disabled-bg;\n border-color: @pagination-disabled-border;\n cursor: @cursor-disabled;\n }\n }\n}\n\n// Sizing\n// --------------------------------------------------\n\n// Large\n.pagination-lg {\n .pagination-size(@padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @border-radius-large);\n}\n\n// Small\n.pagination-sm {\n .pagination-size(@padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @border-radius-small);\n}\n","// Pagination\n\n.pagination-size(@padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n > li {\n > a,\n > span {\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n }\n &:first-child {\n > a,\n > span {\n .border-left-radius(@border-radius);\n }\n }\n &:last-child {\n > a,\n > span {\n .border-right-radius(@border-radius);\n }\n }\n }\n}\n","//\n// Pager pagination\n// --------------------------------------------------\n\n\n.pager {\n padding-left: 0;\n margin: @line-height-computed 0;\n list-style: none;\n text-align: center;\n &:extend(.clearfix all);\n li {\n display: inline;\n > a,\n > span {\n display: inline-block;\n padding: 5px 14px;\n background-color: @pager-bg;\n border: 1px solid @pager-border;\n border-radius: @pager-border-radius;\n }\n\n > a:hover,\n > a:focus {\n text-decoration: none;\n background-color: @pager-hover-bg;\n }\n }\n\n .next {\n > a,\n > span {\n float: right;\n }\n }\n\n .previous {\n > a,\n > span {\n float: left;\n }\n }\n\n .disabled {\n > a,\n > a:hover,\n > a:focus,\n > span {\n color: @pager-disabled-color;\n background-color: @pager-bg;\n cursor: @cursor-disabled;\n }\n }\n}\n","//\n// Labels\n// --------------------------------------------------\n\n.label {\n display: inline;\n padding: .2em .6em .3em;\n font-size: 75%;\n font-weight: bold;\n line-height: 1;\n color: @label-color;\n text-align: center;\n white-space: nowrap;\n vertical-align: baseline;\n border-radius: .25em;\n\n // Add hover effects, but only for links\n a& {\n &:hover,\n &:focus {\n color: @label-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Empty labels collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for labels in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n}\n\n// Colors\n// Contextual variations (linked labels get darker on :hover)\n\n.label-default {\n .label-variant(@label-default-bg);\n}\n\n.label-primary {\n .label-variant(@label-primary-bg);\n}\n\n.label-success {\n .label-variant(@label-success-bg);\n}\n\n.label-info {\n .label-variant(@label-info-bg);\n}\n\n.label-warning {\n .label-variant(@label-warning-bg);\n}\n\n.label-danger {\n .label-variant(@label-danger-bg);\n}\n","// Labels\n\n.label-variant(@color) {\n background-color: @color;\n\n &[href] {\n &:hover,\n &:focus {\n background-color: darken(@color, 10%);\n }\n }\n}\n","//\n// Badges\n// --------------------------------------------------\n\n\n// Base class\n.badge {\n display: inline-block;\n min-width: 10px;\n padding: 3px 7px;\n font-size: @font-size-small;\n font-weight: @badge-font-weight;\n color: @badge-color;\n line-height: @badge-line-height;\n vertical-align: middle;\n white-space: nowrap;\n text-align: center;\n background-color: @badge-bg;\n border-radius: @badge-border-radius;\n\n // Empty badges collapse automatically (not available in IE8)\n &:empty {\n display: none;\n }\n\n // Quick fix for badges in buttons\n .btn & {\n position: relative;\n top: -1px;\n }\n\n .btn-xs &,\n .btn-group-xs > .btn & {\n top: 0;\n padding: 1px 5px;\n }\n\n // Hover state, but only for links\n a& {\n &:hover,\n &:focus {\n color: @badge-link-hover-color;\n text-decoration: none;\n cursor: pointer;\n }\n }\n\n // Account for badges in navs\n .list-group-item.active > &,\n .nav-pills > .active > a > & {\n color: @badge-active-color;\n background-color: @badge-active-bg;\n }\n\n .list-group-item > & {\n float: right;\n }\n\n .list-group-item > & + & {\n margin-right: 5px;\n }\n\n .nav-pills > li > a > & {\n margin-left: 3px;\n }\n}\n","//\n// Jumbotron\n// --------------------------------------------------\n\n\n.jumbotron {\n padding-top: @jumbotron-padding;\n padding-bottom: @jumbotron-padding;\n margin-bottom: @jumbotron-padding;\n color: @jumbotron-color;\n background-color: @jumbotron-bg;\n\n h1,\n .h1 {\n color: @jumbotron-heading-color;\n }\n\n p {\n margin-bottom: (@jumbotron-padding / 2);\n font-size: @jumbotron-font-size;\n font-weight: 200;\n }\n\n > hr {\n border-top-color: darken(@jumbotron-bg, 10%);\n }\n\n .container &,\n .container-fluid & {\n border-radius: @border-radius-large; // Only round corners at higher resolutions if contained in a container\n padding-left: (@grid-gutter-width / 2);\n padding-right: (@grid-gutter-width / 2);\n }\n\n .container {\n max-width: 100%;\n }\n\n @media screen and (min-width: @screen-sm-min) {\n padding-top: (@jumbotron-padding * 1.6);\n padding-bottom: (@jumbotron-padding * 1.6);\n\n .container &,\n .container-fluid & {\n padding-left: (@jumbotron-padding * 2);\n padding-right: (@jumbotron-padding * 2);\n }\n\n h1,\n .h1 {\n font-size: @jumbotron-heading-font-size;\n }\n }\n}\n","//\n// Thumbnails\n// --------------------------------------------------\n\n\n// Mixin and adjust the regular image class\n.thumbnail {\n display: block;\n padding: @thumbnail-padding;\n margin-bottom: @line-height-computed;\n line-height: @line-height-base;\n background-color: @thumbnail-bg;\n border: 1px solid @thumbnail-border;\n border-radius: @thumbnail-border-radius;\n .transition(border .2s ease-in-out);\n\n > img,\n a > img {\n &:extend(.img-responsive);\n margin-left: auto;\n margin-right: auto;\n }\n\n // Add a hover state for linked versions only\n a&:hover,\n a&:focus,\n a&.active {\n border-color: @link-color;\n }\n\n // Image captions\n .caption {\n padding: @thumbnail-caption-padding;\n color: @thumbnail-caption-color;\n }\n}\n","//\n// Alerts\n// --------------------------------------------------\n\n\n// Base styles\n// -------------------------\n\n.alert {\n padding: @alert-padding;\n margin-bottom: @line-height-computed;\n border: 1px solid transparent;\n border-radius: @alert-border-radius;\n\n // Headings for larger alerts\n h4 {\n margin-top: 0;\n // Specified for the h4 to prevent conflicts of changing @headings-color\n color: inherit;\n }\n\n // Provide class for links that match alerts\n .alert-link {\n font-weight: @alert-link-font-weight;\n }\n\n // Improve alignment and spacing of inner content\n > p,\n > ul {\n margin-bottom: 0;\n }\n\n > p + p {\n margin-top: 5px;\n }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n padding-right: (@alert-padding + 20);\n\n // Adjust close link position\n .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n\n.alert-info {\n .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n\n.alert-warning {\n .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n\n.alert-danger {\n .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","// Alerts\n\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n","//\n// Progress bars\n// --------------------------------------------------\n\n\n// Bar animations\n// -------------------------\n\n// WebKit\n@-webkit-keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n// Spec and IE10+\n@keyframes progress-bar-stripes {\n from { background-position: 40px 0; }\n to { background-position: 0 0; }\n}\n\n\n// Bar itself\n// -------------------------\n\n// Outer container\n.progress {\n overflow: hidden;\n height: @line-height-computed;\n margin-bottom: @line-height-computed;\n background-color: @progress-bg;\n border-radius: @progress-border-radius;\n .box-shadow(inset 0 1px 2px rgba(0,0,0,.1));\n}\n\n// Bar of progress\n.progress-bar {\n float: left;\n width: 0%;\n height: 100%;\n font-size: @font-size-small;\n line-height: @line-height-computed;\n color: @progress-bar-color;\n text-align: center;\n background-color: @progress-bar-bg;\n .box-shadow(inset 0 -1px 0 rgba(0,0,0,.15));\n .transition(width .6s ease);\n}\n\n// Striped bars\n//\n// `.progress-striped .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar-striped` class, which you just add to an existing\n// `.progress-bar`.\n.progress-striped .progress-bar,\n.progress-bar-striped {\n #gradient > .striped();\n background-size: 40px 40px;\n}\n\n// Call animation for the active one\n//\n// `.progress.active .progress-bar` is deprecated as of v3.2.0 in favor of the\n// `.progress-bar.active` approach.\n.progress.active .progress-bar,\n.progress-bar.active {\n .animation(progress-bar-stripes 2s linear infinite);\n}\n\n\n// Variations\n// -------------------------\n\n.progress-bar-success {\n .progress-bar-variant(@progress-bar-success-bg);\n}\n\n.progress-bar-info {\n .progress-bar-variant(@progress-bar-info-bg);\n}\n\n.progress-bar-warning {\n .progress-bar-variant(@progress-bar-warning-bg);\n}\n\n.progress-bar-danger {\n .progress-bar-variant(@progress-bar-danger-bg);\n}\n","// Gradients\n\n#gradient {\n\n // Horizontal gradient, from left to right\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .horizontal(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(left, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to right, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n // Vertical gradient, from top to bottom\n //\n // Creates two color stops, start and end, by specifying a color and position for each color stop.\n // Color stops are not available in IE9 and below.\n .vertical(@start-color: #555; @end-color: #333; @start-percent: 0%; @end-percent: 100%) {\n background-image: -webkit-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(top, @start-color @start-percent, @end-color @end-percent); // Opera 12\n background-image: linear-gradient(to bottom, @start-color @start-percent, @end-color @end-percent); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n background-repeat: repeat-x;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down\n }\n\n .directional(@start-color: #555; @end-color: #333; @deg: 45deg) {\n background-repeat: repeat-x;\n background-image: -webkit-linear-gradient(@deg, @start-color, @end-color); // Safari 5.1-6, Chrome 10+\n background-image: -o-linear-gradient(@deg, @start-color, @end-color); // Opera 12\n background-image: linear-gradient(@deg, @start-color, @end-color); // Standard, IE10, Firefox 16+, Opera 12.10+, Safari 7+, Chrome 26+\n }\n .horizontal-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(left, @start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(to right, @start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=1)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .vertical-three-colors(@start-color: #00b3ee; @mid-color: #7a43b6; @color-stop: 50%; @end-color: #c3325f) {\n background-image: -webkit-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: -o-linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-image: linear-gradient(@start-color, @mid-color @color-stop, @end-color);\n background-repeat: no-repeat;\n filter: e(%(\"progid:DXImageTransform.Microsoft.gradient(startColorstr='%d', endColorstr='%d', GradientType=0)\",argb(@start-color),argb(@end-color))); // IE9 and down, gets no color-stop at all for proper fallback\n }\n .radial(@inner-color: #555; @outer-color: #333) {\n background-image: -webkit-radial-gradient(circle, @inner-color, @outer-color);\n background-image: radial-gradient(circle, @inner-color, @outer-color);\n background-repeat: no-repeat;\n }\n .striped(@color: rgba(255,255,255,.15); @angle: 45deg) {\n background-image: -webkit-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: -o-linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n background-image: linear-gradient(@angle, @color 25%, transparent 25%, transparent 50%, @color 50%, @color 75%, transparent 75%, transparent);\n }\n}\n","// Progress bars\n\n.progress-bar-variant(@color) {\n background-color: @color;\n\n // Deprecated parent class requirement as of v3.2.0\n .progress-striped & {\n #gradient > .striped();\n }\n}\n",".media {\n // Proper spacing between instances of .media\n margin-top: 15px;\n\n &:first-child {\n margin-top: 0;\n }\n}\n\n.media,\n.media-body {\n zoom: 1;\n overflow: hidden;\n}\n\n.media-body {\n width: 10000px;\n}\n\n.media-object {\n display: block;\n\n // Fix collapse in webkit from max-width: 100% and display: table-cell.\n &.img-thumbnail {\n max-width: none;\n }\n}\n\n.media-right,\n.media > .pull-right {\n padding-left: 10px;\n}\n\n.media-left,\n.media > .pull-left {\n padding-right: 10px;\n}\n\n.media-left,\n.media-right,\n.media-body {\n display: table-cell;\n vertical-align: top;\n}\n\n.media-middle {\n vertical-align: middle;\n}\n\n.media-bottom {\n vertical-align: bottom;\n}\n\n// Reset margins on headings for tighter default spacing\n.media-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n\n// Media list variation\n//\n// Undo default ul/ol styles\n.media-list {\n padding-left: 0;\n list-style: none;\n}\n","//\n// List groups\n// --------------------------------------------------\n\n\n// Base class\n//\n// Easily usable on
        ,
          , or
          .\n\n.list-group {\n // No need to set list-style: none; since .list-group-item is block level\n margin-bottom: 20px;\n padding-left: 0; // reset padding because ul and ol\n}\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: @list-group-bg;\n border: 1px solid @list-group-border;\n\n // Round the first and last items\n &:first-child {\n .border-top-radius(@list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n .border-bottom-radius(@list-group-border-radius);\n }\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item,\nbutton.list-group-item {\n color: @list-group-link-color;\n\n .list-group-item-heading {\n color: @list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n text-decoration: none;\n color: @list-group-link-hover-color;\n background-color: @list-group-hover-bg;\n }\n}\n\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n\n.list-group-item {\n // Disabled state\n &.disabled,\n &.disabled:hover,\n &.disabled:focus {\n background-color: @list-group-disabled-bg;\n color: @list-group-disabled-color;\n cursor: @cursor-disabled;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-disabled-text-color;\n }\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: @list-group-active-color;\n background-color: @list-group-active-bg;\n border-color: @list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading,\n .list-group-item-heading > small,\n .list-group-item-heading > .small {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-active-text-color;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n","// List Groups\n\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;\n background-color: @background;\n\n a&,\n button& {\n color: @color;\n\n .list-group-item-heading {\n color: inherit;\n }\n\n &:hover,\n &:focus {\n color: @color;\n background-color: darken(@background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: @color;\n border-color: @color;\n }\n }\n }\n}\n","//\n// Panels\n// --------------------------------------------------\n\n\n// Base class\n.panel {\n margin-bottom: @line-height-computed;\n background-color: @panel-bg;\n border: 1px solid transparent;\n border-radius: @panel-border-radius;\n .box-shadow(0 1px 1px rgba(0,0,0,.05));\n}\n\n// Panel contents\n.panel-body {\n padding: @panel-body-padding;\n &:extend(.clearfix all);\n}\n\n// Optional heading\n.panel-heading {\n padding: @panel-heading-padding;\n border-bottom: 1px solid transparent;\n .border-top-radius((@panel-border-radius - 1));\n\n > .dropdown .dropdown-toggle {\n color: inherit;\n }\n}\n\n// Within heading, strip any `h*` tag of its default margins for spacing.\n.panel-title {\n margin-top: 0;\n margin-bottom: 0;\n font-size: ceil((@font-size-base * 1.125));\n color: inherit;\n\n > a,\n > small,\n > .small,\n > small > a,\n > .small > a {\n color: inherit;\n }\n}\n\n// Optional footer (stays gray in every modifier class)\n.panel-footer {\n padding: @panel-footer-padding;\n background-color: @panel-footer-bg;\n border-top: 1px solid @panel-inner-border;\n .border-bottom-radius((@panel-border-radius - 1));\n}\n\n\n// List groups in panels\n//\n// By default, space out list group content from panel headings to account for\n// any kind of custom content between the two.\n\n.panel {\n > .list-group,\n > .panel-collapse > .list-group {\n margin-bottom: 0;\n\n .list-group-item {\n border-width: 1px 0;\n border-radius: 0;\n }\n\n // Add border top radius for first one\n &:first-child {\n .list-group-item:first-child {\n border-top: 0;\n .border-top-radius((@panel-border-radius - 1));\n }\n }\n\n // Add border bottom radius for last one\n &:last-child {\n .list-group-item:last-child {\n border-bottom: 0;\n .border-bottom-radius((@panel-border-radius - 1));\n }\n }\n }\n > .panel-heading + .panel-collapse > .list-group {\n .list-group-item:first-child {\n .border-top-radius(0);\n }\n }\n}\n// Collapse space between when there's no additional content.\n.panel-heading + .list-group {\n .list-group-item:first-child {\n border-top-width: 0;\n }\n}\n.list-group + .panel-footer {\n border-top-width: 0;\n}\n\n// Tables in panels\n//\n// Place a non-bordered `.table` within a panel (not within a `.panel-body`) and\n// watch it go full width.\n\n.panel {\n > .table,\n > .table-responsive > .table,\n > .panel-collapse > .table {\n margin-bottom: 0;\n\n caption {\n padding-left: @panel-body-padding;\n padding-right: @panel-body-padding;\n }\n }\n // Add border top radius for first one\n > .table:first-child,\n > .table-responsive:first-child > .table:first-child {\n .border-top-radius((@panel-border-radius - 1));\n\n > thead:first-child,\n > tbody:first-child {\n > tr:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n border-top-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-top-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-top-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n // Add border bottom radius for last one\n > .table:last-child,\n > .table-responsive:last-child > .table:last-child {\n .border-bottom-radius((@panel-border-radius - 1));\n\n > tbody:last-child,\n > tfoot:last-child {\n > tr:last-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n border-bottom-right-radius: (@panel-border-radius - 1);\n\n td:first-child,\n th:first-child {\n border-bottom-left-radius: (@panel-border-radius - 1);\n }\n td:last-child,\n th:last-child {\n border-bottom-right-radius: (@panel-border-radius - 1);\n }\n }\n }\n }\n > .panel-body + .table,\n > .panel-body + .table-responsive,\n > .table + .panel-body,\n > .table-responsive + .panel-body {\n border-top: 1px solid @table-border-color;\n }\n > .table > tbody:first-child > tr:first-child th,\n > .table > tbody:first-child > tr:first-child td {\n border-top: 0;\n }\n > .table-bordered,\n > .table-responsive > .table-bordered {\n border: 0;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th:first-child,\n > td:first-child {\n border-left: 0;\n }\n > th:last-child,\n > td:last-child {\n border-right: 0;\n }\n }\n }\n > thead,\n > tbody {\n > tr:first-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n > tbody,\n > tfoot {\n > tr:last-child {\n > td,\n > th {\n border-bottom: 0;\n }\n }\n }\n }\n > .table-responsive {\n border: 0;\n margin-bottom: 0;\n }\n}\n\n\n// Collapsible panels (aka, accordion)\n//\n// Wrap a series of panels in `.panel-group` to turn them into an accordion with\n// the help of our collapse JavaScript plugin.\n\n.panel-group {\n margin-bottom: @line-height-computed;\n\n // Tighten up margin so it's only between panels\n .panel {\n margin-bottom: 0;\n border-radius: @panel-border-radius;\n\n + .panel {\n margin-top: 5px;\n }\n }\n\n .panel-heading {\n border-bottom: 0;\n\n + .panel-collapse > .panel-body,\n + .panel-collapse > .list-group {\n border-top: 1px solid @panel-inner-border;\n }\n }\n\n .panel-footer {\n border-top: 0;\n + .panel-collapse .panel-body {\n border-bottom: 1px solid @panel-inner-border;\n }\n }\n}\n\n\n// Contextual variations\n.panel-default {\n .panel-variant(@panel-default-border; @panel-default-text; @panel-default-heading-bg; @panel-default-border);\n}\n.panel-primary {\n .panel-variant(@panel-primary-border; @panel-primary-text; @panel-primary-heading-bg; @panel-primary-border);\n}\n.panel-success {\n .panel-variant(@panel-success-border; @panel-success-text; @panel-success-heading-bg; @panel-success-border);\n}\n.panel-info {\n .panel-variant(@panel-info-border; @panel-info-text; @panel-info-heading-bg; @panel-info-border);\n}\n.panel-warning {\n .panel-variant(@panel-warning-border; @panel-warning-text; @panel-warning-heading-bg; @panel-warning-border);\n}\n.panel-danger {\n .panel-variant(@panel-danger-border; @panel-danger-text; @panel-danger-heading-bg; @panel-danger-border);\n}\n","// Panels\n\n.panel-variant(@border; @heading-text-color; @heading-bg-color; @heading-border) {\n border-color: @border;\n\n & > .panel-heading {\n color: @heading-text-color;\n background-color: @heading-bg-color;\n border-color: @heading-border;\n\n + .panel-collapse > .panel-body {\n border-top-color: @border;\n }\n .badge {\n color: @heading-bg-color;\n background-color: @heading-text-color;\n }\n }\n & > .panel-footer {\n + .panel-collapse > .panel-body {\n border-bottom-color: @border;\n }\n }\n}\n","// Embeds responsive\n//\n// Credit: Nicolas Gallagher and SUIT CSS.\n\n.embed-responsive {\n position: relative;\n display: block;\n height: 0;\n padding: 0;\n overflow: hidden;\n\n .embed-responsive-item,\n iframe,\n embed,\n object,\n video {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n height: 100%;\n width: 100%;\n border: 0;\n }\n}\n\n// Modifier class for 16:9 aspect ratio\n.embed-responsive-16by9 {\n padding-bottom: 56.25%;\n}\n\n// Modifier class for 4:3 aspect ratio\n.embed-responsive-4by3 {\n padding-bottom: 75%;\n}\n","//\n// Wells\n// --------------------------------------------------\n\n\n// Base class\n.well {\n min-height: 20px;\n padding: 19px;\n margin-bottom: 20px;\n background-color: @well-bg;\n border: 1px solid @well-border;\n border-radius: @border-radius-base;\n .box-shadow(inset 0 1px 1px rgba(0,0,0,.05));\n blockquote {\n border-color: #ddd;\n border-color: rgba(0,0,0,.15);\n }\n}\n\n// Sizes\n.well-lg {\n padding: 24px;\n border-radius: @border-radius-large;\n}\n.well-sm {\n padding: 9px;\n border-radius: @border-radius-small;\n}\n","//\n// Close icons\n// --------------------------------------------------\n\n\n.close {\n float: right;\n font-size: (@font-size-base * 1.5);\n font-weight: @close-font-weight;\n line-height: 1;\n color: @close-color;\n text-shadow: @close-text-shadow;\n .opacity(.2);\n\n &:hover,\n &:focus {\n color: @close-color;\n text-decoration: none;\n cursor: pointer;\n .opacity(.5);\n }\n\n // Additional properties for button version\n // iOS requires the button element instead of an anchor tag.\n // If you want the anchor version, it requires `href=\"#\"`.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n button& {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n }\n}\n","//\n// Modals\n// --------------------------------------------------\n\n// .modal-open - body class for killing the scroll\n// .modal - container to scroll within\n// .modal-dialog - positioning shell for the actual modal\n// .modal-content - actual modal w/ bg and corners and shit\n\n// Kill the scroll on the body\n.modal-open {\n overflow: hidden;\n}\n\n// Container that the modal scrolls within\n.modal {\n display: none;\n overflow: hidden;\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal;\n -webkit-overflow-scrolling: touch;\n\n // Prevent Chrome on Windows from adding a focus outline. For details, see\n // https://github.com/twbs/bootstrap/pull/10951.\n outline: 0;\n\n // When fading in the modal, animate it to slide down\n &.fade .modal-dialog {\n .translate(0, -25%);\n .transition-transform(~\"0.3s ease-out\");\n }\n &.in .modal-dialog { .translate(0, 0) }\n}\n.modal-open .modal {\n overflow-x: hidden;\n overflow-y: auto;\n}\n\n// Shell div to position the modal with bottom padding\n.modal-dialog {\n position: relative;\n width: auto;\n margin: 10px;\n}\n\n// Actual modal\n.modal-content {\n position: relative;\n background-color: @modal-content-bg;\n border: 1px solid @modal-content-fallback-border-color; //old browsers fallback (ie8 etc)\n border: 1px solid @modal-content-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 3px 9px rgba(0,0,0,.5));\n background-clip: padding-box;\n // Remove focus outline from opened modal\n outline: 0;\n}\n\n// Modal background\n.modal-backdrop {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: @zindex-modal-background;\n background-color: @modal-backdrop-bg;\n // Fade for backdrop\n &.fade { .opacity(0); }\n &.in { .opacity(@modal-backdrop-opacity); }\n}\n\n// Modal header\n// Top section of the modal w/ title and dismiss\n.modal-header {\n padding: @modal-title-padding;\n border-bottom: 1px solid @modal-header-border-color;\n &:extend(.clearfix all);\n}\n// Close icon\n.modal-header .close {\n margin-top: -2px;\n}\n\n// Title text within header\n.modal-title {\n margin: 0;\n line-height: @modal-title-line-height;\n}\n\n// Modal body\n// Where all modal content resides (sibling of .modal-header and .modal-footer)\n.modal-body {\n position: relative;\n padding: @modal-inner-padding;\n}\n\n// Footer (for actions)\n.modal-footer {\n padding: @modal-inner-padding;\n text-align: right; // right align buttons\n border-top: 1px solid @modal-footer-border-color;\n &:extend(.clearfix all); // clear it in case folks use .pull-* classes on buttons\n\n // Properly space out buttons\n .btn + .btn {\n margin-left: 5px;\n margin-bottom: 0; // account for input[type=\"submit\"] which gets the bottom margin like all other inputs\n }\n // but override that for button groups\n .btn-group .btn + .btn {\n margin-left: -1px;\n }\n // and override it for block buttons as well\n .btn-block + .btn-block {\n margin-left: 0;\n }\n}\n\n// Measure scrollbar width for padding body during modal show/hide\n.modal-scrollbar-measure {\n position: absolute;\n top: -9999px;\n width: 50px;\n height: 50px;\n overflow: scroll;\n}\n\n// Scale up the modal\n@media (min-width: @screen-sm-min) {\n // Automatically set modal's width for larger viewports\n .modal-dialog {\n width: @modal-md;\n margin: 30px auto;\n }\n .modal-content {\n .box-shadow(0 5px 15px rgba(0,0,0,.5));\n }\n\n // Modal sizes\n .modal-sm { width: @modal-sm; }\n}\n\n@media (min-width: @screen-md-min) {\n .modal-lg { width: @modal-lg; }\n}\n","//\n// Tooltips\n// --------------------------------------------------\n\n\n// Base class\n.tooltip {\n position: absolute;\n z-index: @zindex-tooltip;\n display: block;\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n .reset-text();\n font-size: @font-size-small;\n\n .opacity(0);\n\n &.in { .opacity(@tooltip-opacity); }\n &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; }\n &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; }\n &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; }\n &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: @tooltip-max-width;\n padding: 3px 8px;\n color: @tooltip-color;\n text-align: center;\n background-color: @tooltip-bg;\n border-radius: @border-radius-base;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1\n.tooltip {\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n bottom: 0;\n right: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n left: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n border-right-color: @tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-left-color: @tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n right: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n left: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n}\n",".reset-text() {\n font-family: @font-family-base;\n // We deliberately do NOT reset font-size.\n font-style: normal;\n font-weight: normal;\n letter-spacing: normal;\n line-break: auto;\n line-height: @line-height-base;\n text-align: left; // Fallback for where `start` is not supported\n text-align: start;\n text-decoration: none;\n text-shadow: none;\n text-transform: none;\n white-space: normal;\n word-break: normal;\n word-spacing: normal;\n word-wrap: normal;\n}\n","//\n// Popovers\n// --------------------------------------------------\n\n\n.popover {\n position: absolute;\n top: 0;\n left: 0;\n z-index: @zindex-popover;\n display: none;\n max-width: @popover-max-width;\n padding: 1px;\n // Our parent element can be arbitrary since popovers are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n .reset-text();\n font-size: @font-size-base;\n\n background-color: @popover-bg;\n background-clip: padding-box;\n border: 1px solid @popover-fallback-border-color;\n border: 1px solid @popover-border-color;\n border-radius: @border-radius-large;\n .box-shadow(0 5px 10px rgba(0,0,0,.2));\n\n // Offset the popover to account for the popover arrow\n &.top { margin-top: -@popover-arrow-width; }\n &.right { margin-left: @popover-arrow-width; }\n &.bottom { margin-top: @popover-arrow-width; }\n &.left { margin-left: -@popover-arrow-width; }\n}\n\n.popover-title {\n margin: 0; // reset heading margin\n padding: 8px 14px;\n font-size: @font-size-base;\n background-color: @popover-title-bg;\n border-bottom: 1px solid darken(@popover-title-bg, 5%);\n border-radius: (@border-radius-large - 1) (@border-radius-large - 1) 0 0;\n}\n\n.popover-content {\n padding: 9px 14px;\n}\n\n// Arrows\n//\n// .arrow is outer, .arrow:after is inner\n\n.popover > .arrow {\n &,\n &:after {\n position: absolute;\n display: block;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n }\n}\n.popover > .arrow {\n border-width: @popover-arrow-outer-width;\n}\n.popover > .arrow:after {\n border-width: @popover-arrow-width;\n content: \"\";\n}\n\n.popover {\n &.top > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-top-color: @popover-arrow-outer-color;\n bottom: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n bottom: 1px;\n margin-left: -@popover-arrow-width;\n border-bottom-width: 0;\n border-top-color: @popover-arrow-color;\n }\n }\n &.right > .arrow {\n top: 50%;\n left: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-right-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n left: 1px;\n bottom: -@popover-arrow-width;\n border-left-width: 0;\n border-right-color: @popover-arrow-color;\n }\n }\n &.bottom > .arrow {\n left: 50%;\n margin-left: -@popover-arrow-outer-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-bottom-color: @popover-arrow-outer-color;\n top: -@popover-arrow-outer-width;\n &:after {\n content: \" \";\n top: 1px;\n margin-left: -@popover-arrow-width;\n border-top-width: 0;\n border-bottom-color: @popover-arrow-color;\n }\n }\n\n &.left > .arrow {\n top: 50%;\n right: -@popover-arrow-outer-width;\n margin-top: -@popover-arrow-outer-width;\n border-right-width: 0;\n border-left-color: @popover-arrow-outer-fallback-color; // IE8 fallback\n border-left-color: @popover-arrow-outer-color;\n &:after {\n content: \" \";\n right: 1px;\n border-right-width: 0;\n border-left-color: @popover-arrow-color;\n bottom: -@popover-arrow-width;\n }\n }\n}\n","//\n// Carousel\n// --------------------------------------------------\n\n\n// Wrapper for the slide container and indicators\n.carousel {\n position: relative;\n}\n\n.carousel-inner {\n position: relative;\n overflow: hidden;\n width: 100%;\n\n > .item {\n display: none;\n position: relative;\n .transition(.6s ease-in-out left);\n\n // Account for jankitude on images\n > img,\n > a > img {\n &:extend(.img-responsive);\n line-height: 1;\n }\n\n // WebKit CSS3 transforms for supported devices\n @media all and (transform-3d), (-webkit-transform-3d) {\n .transition-transform(~'0.6s ease-in-out');\n .backface-visibility(~'hidden');\n .perspective(1000px);\n\n &.next,\n &.active.right {\n .translate3d(100%, 0, 0);\n left: 0;\n }\n &.prev,\n &.active.left {\n .translate3d(-100%, 0, 0);\n left: 0;\n }\n &.next.left,\n &.prev.right,\n &.active {\n .translate3d(0, 0, 0);\n left: 0;\n }\n }\n }\n\n > .active,\n > .next,\n > .prev {\n display: block;\n }\n\n > .active {\n left: 0;\n }\n\n > .next,\n > .prev {\n position: absolute;\n top: 0;\n width: 100%;\n }\n\n > .next {\n left: 100%;\n }\n > .prev {\n left: -100%;\n }\n > .next.left,\n > .prev.right {\n left: 0;\n }\n\n > .active.left {\n left: -100%;\n }\n > .active.right {\n left: 100%;\n }\n\n}\n\n// Left/right controls for nav\n// ---------------------------\n\n.carousel-control {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: @carousel-control-width;\n .opacity(@carousel-control-opacity);\n font-size: @carousel-control-font-size;\n color: @carousel-control-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n background-color: rgba(0, 0, 0, 0); // Fix IE9 click-thru bug\n // We can't have this transition here because WebKit cancels the carousel\n // animation if you trip this while in the middle of another animation.\n\n // Set gradients for backgrounds\n &.left {\n #gradient > .horizontal(@start-color: rgba(0,0,0,.5); @end-color: rgba(0,0,0,.0001));\n }\n &.right {\n left: auto;\n right: 0;\n #gradient > .horizontal(@start-color: rgba(0,0,0,.0001); @end-color: rgba(0,0,0,.5));\n }\n\n // Hover/focus state\n &:hover,\n &:focus {\n outline: 0;\n color: @carousel-control-color;\n text-decoration: none;\n .opacity(.9);\n }\n\n // Toggles\n .icon-prev,\n .icon-next,\n .glyphicon-chevron-left,\n .glyphicon-chevron-right {\n position: absolute;\n top: 50%;\n margin-top: -10px;\n z-index: 5;\n display: inline-block;\n }\n .icon-prev,\n .glyphicon-chevron-left {\n left: 50%;\n margin-left: -10px;\n }\n .icon-next,\n .glyphicon-chevron-right {\n right: 50%;\n margin-right: -10px;\n }\n .icon-prev,\n .icon-next {\n width: 20px;\n height: 20px;\n line-height: 1;\n font-family: serif;\n }\n\n\n .icon-prev {\n &:before {\n content: '\\2039';// SINGLE LEFT-POINTING ANGLE QUOTATION MARK (U+2039)\n }\n }\n .icon-next {\n &:before {\n content: '\\203a';// SINGLE RIGHT-POINTING ANGLE QUOTATION MARK (U+203A)\n }\n }\n}\n\n// Optional indicator pips\n//\n// Add an unordered list with the following class and add a list item for each\n// slide your carousel holds.\n\n.carousel-indicators {\n position: absolute;\n bottom: 10px;\n left: 50%;\n z-index: 15;\n width: 60%;\n margin-left: -30%;\n padding-left: 0;\n list-style: none;\n text-align: center;\n\n li {\n display: inline-block;\n width: 10px;\n height: 10px;\n margin: 1px;\n text-indent: -999px;\n border: 1px solid @carousel-indicator-border-color;\n border-radius: 10px;\n cursor: pointer;\n\n // IE8-9 hack for event handling\n //\n // Internet Explorer 8-9 does not support clicks on elements without a set\n // `background-color`. We cannot use `filter` since that's not viewed as a\n // background color by the browser. Thus, a hack is needed.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Internet_Explorer\n //\n // For IE8, we set solid black as it doesn't support `rgba()`. For IE9, we\n // set alpha transparency for the best results possible.\n background-color: #000 \\9; // IE8\n background-color: rgba(0,0,0,0); // IE9\n }\n .active {\n margin: 0;\n width: 12px;\n height: 12px;\n background-color: @carousel-indicator-active-bg;\n }\n}\n\n// Optional captions\n// -----------------------------\n// Hidden by default for smaller viewports\n.carousel-caption {\n position: absolute;\n left: 15%;\n right: 15%;\n bottom: 20px;\n z-index: 10;\n padding-top: 20px;\n padding-bottom: 20px;\n color: @carousel-caption-color;\n text-align: center;\n text-shadow: @carousel-text-shadow;\n & .btn {\n text-shadow: none; // No shadow for button elements in carousel-caption\n }\n}\n\n\n// Scale up controls for tablets and up\n@media screen and (min-width: @screen-sm-min) {\n\n // Scale up the controls a smidge\n .carousel-control {\n .glyphicon-chevron-left,\n .glyphicon-chevron-right,\n .icon-prev,\n .icon-next {\n width: (@carousel-control-font-size * 1.5);\n height: (@carousel-control-font-size * 1.5);\n margin-top: (@carousel-control-font-size / -2);\n font-size: (@carousel-control-font-size * 1.5);\n }\n .glyphicon-chevron-left,\n .icon-prev {\n margin-left: (@carousel-control-font-size / -2);\n }\n .glyphicon-chevron-right,\n .icon-next {\n margin-right: (@carousel-control-font-size / -2);\n }\n }\n\n // Show and left align the captions\n .carousel-caption {\n left: 20%;\n right: 20%;\n padding-bottom: 30px;\n }\n\n // Move up the indicators\n .carousel-indicators {\n bottom: 20px;\n }\n}\n","// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n","// Center-align a block level element\n\n.center-block() {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n","// CSS image replacement\n//\n// Heads up! v3 launched with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (has been removed in v4)\n.hide-text() {\n font: ~\"0/0\" a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n// New mixin to use as of v3.0.1\n.text-hide() {\n .hide-text();\n}\n","//\n// Responsive: Utility classes\n// --------------------------------------------------\n\n\n// IE10 in Windows (Phone) 8\n//\n// Support for responsive views via media queries is kind of borked in IE10, for\n// Surface/desktop in split view and for Windows Phone 8. This particular fix\n// must be accompanied by a snippet of JavaScript to sniff the user agent and\n// apply some conditional CSS to *only* the Surface/desktop Windows 8. Look at\n// our Getting Started page for more information on this bug.\n//\n// For more information, see the following:\n//\n// Issue: https://github.com/twbs/bootstrap/issues/10497\n// Docs: http://getbootstrap.com/getting-started/#support-ie10-width\n// Source: http://timkadlec.com/2013/01/windows-phone-8-and-device-width/\n// Source: http://timkadlec.com/2012/10/ie10-snap-mode-and-responsive-design/\n\n@-ms-viewport {\n width: device-width;\n}\n\n\n// Visibility utilities\n// Note: Deprecated .visible-xs, .visible-sm, .visible-md, and .visible-lg as of v3.2.0\n.visible-xs,\n.visible-sm,\n.visible-md,\n.visible-lg {\n .responsive-invisibility();\n}\n\n.visible-xs-block,\n.visible-xs-inline,\n.visible-xs-inline-block,\n.visible-sm-block,\n.visible-sm-inline,\n.visible-sm-inline-block,\n.visible-md-block,\n.visible-md-inline,\n.visible-md-inline-block,\n.visible-lg-block,\n.visible-lg-inline,\n.visible-lg-inline-block {\n display: none !important;\n}\n\n.visible-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-visibility();\n }\n}\n.visible-xs-block {\n @media (max-width: @screen-xs-max) {\n display: block !important;\n }\n}\n.visible-xs-inline {\n @media (max-width: @screen-xs-max) {\n display: inline !important;\n }\n}\n.visible-xs-inline-block {\n @media (max-width: @screen-xs-max) {\n display: inline-block !important;\n }\n}\n\n.visible-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-visibility();\n }\n}\n.visible-sm-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: block !important;\n }\n}\n.visible-sm-inline {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline !important;\n }\n}\n.visible-sm-inline-block {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n display: inline-block !important;\n }\n}\n\n.visible-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-visibility();\n }\n}\n.visible-md-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: block !important;\n }\n}\n.visible-md-inline {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline !important;\n }\n}\n.visible-md-inline-block {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n display: inline-block !important;\n }\n}\n\n.visible-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-visibility();\n }\n}\n.visible-lg-block {\n @media (min-width: @screen-lg-min) {\n display: block !important;\n }\n}\n.visible-lg-inline {\n @media (min-width: @screen-lg-min) {\n display: inline !important;\n }\n}\n.visible-lg-inline-block {\n @media (min-width: @screen-lg-min) {\n display: inline-block !important;\n }\n}\n\n.hidden-xs {\n @media (max-width: @screen-xs-max) {\n .responsive-invisibility();\n }\n}\n.hidden-sm {\n @media (min-width: @screen-sm-min) and (max-width: @screen-sm-max) {\n .responsive-invisibility();\n }\n}\n.hidden-md {\n @media (min-width: @screen-md-min) and (max-width: @screen-md-max) {\n .responsive-invisibility();\n }\n}\n.hidden-lg {\n @media (min-width: @screen-lg-min) {\n .responsive-invisibility();\n }\n}\n\n\n// Print utilities\n//\n// Media queries are placed on the inside to be mixin-friendly.\n\n// Note: Deprecated .visible-print as of v3.2.0\n.visible-print {\n .responsive-invisibility();\n\n @media print {\n .responsive-visibility();\n }\n}\n.visible-print-block {\n display: none !important;\n\n @media print {\n display: block !important;\n }\n}\n.visible-print-inline {\n display: none !important;\n\n @media print {\n display: inline !important;\n }\n}\n.visible-print-inline-block {\n display: none !important;\n\n @media print {\n display: inline-block !important;\n }\n}\n\n.hidden-print {\n @media print {\n .responsive-invisibility();\n }\n}\n","// Responsive utilities\n\n//\n// More easily include all the states for responsive-utilities.less.\n.responsive-visibility() {\n display: block !important;\n table& { display: table !important; }\n tr& { display: table-row !important; }\n th&,\n td& { display: table-cell !important; }\n}\n\n.responsive-invisibility() {\n display: none !important;\n}\n"]} diff --git a/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/fonts/glyphicons-halflings-regular.eot b/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/fonts/glyphicons-halflings-regular.eot new file mode 100644 index 0000000..7ca8afe Binary files /dev/null and b/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/fonts/glyphicons-halflings-regular.eot differ diff --git a/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/fonts/glyphicons-halflings-regular.ttf b/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/fonts/glyphicons-halflings-regular.ttf new file mode 100644 index 0000000..bf57673 Binary files /dev/null and b/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/fonts/glyphicons-halflings-regular.ttf differ diff --git a/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/fonts/glyphicons-halflings-regular.woff b/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/fonts/glyphicons-halflings-regular.woff new file mode 100644 index 0000000..6d2f0cb Binary files /dev/null and b/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/fonts/glyphicons-halflings-regular.woff differ diff --git a/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/fonts/glyphicons-halflings-regular.woff2 b/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/fonts/glyphicons-halflings-regular.woff2 new file mode 100644 index 0000000..0b99a45 Binary files /dev/null and b/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/fonts/glyphicons-halflings-regular.woff2 differ diff --git a/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/js/bootstrap.js b/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/js/bootstrap.js new file mode 100644 index 0000000..8a2e99a --- /dev/null +++ b/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/js/bootstrap.js @@ -0,0 +1,2377 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under the MIT license + */ + +if (typeof jQuery === 'undefined') { + throw new Error('Bootstrap\'s JavaScript requires jQuery') +} + ++function ($) { + 'use strict'; + var version = $.fn.jquery.split(' ')[0].split('.') + if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 3)) { + throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4') + } +}(jQuery); + +/* ======================================================================== + * Bootstrap: transition.js v3.3.7 + * http://getbootstrap.com/javascript/#transitions + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/) + // ============================================================ + + function transitionEnd() { + var el = document.createElement('bootstrap') + + var transEndEventNames = { + WebkitTransition : 'webkitTransitionEnd', + MozTransition : 'transitionend', + OTransition : 'oTransitionEnd otransitionend', + transition : 'transitionend' + } + + for (var name in transEndEventNames) { + if (el.style[name] !== undefined) { + return { end: transEndEventNames[name] } + } + } + + return false // explicit for ie8 ( ._.) + } + + // http://blog.alexmaccaw.com/css-transitions + $.fn.emulateTransitionEnd = function (duration) { + var called = false + var $el = this + $(this).one('bsTransitionEnd', function () { called = true }) + var callback = function () { if (!called) $($el).trigger($.support.transition.end) } + setTimeout(callback, duration) + return this + } + + $(function () { + $.support.transition = transitionEnd() + + if (!$.support.transition) return + + $.event.special.bsTransitionEnd = { + bindType: $.support.transition.end, + delegateType: $.support.transition.end, + handle: function (e) { + if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments) + } + } + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: alert.js v3.3.7 + * http://getbootstrap.com/javascript/#alerts + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // ALERT CLASS DEFINITION + // ====================== + + var dismiss = '[data-dismiss="alert"]' + var Alert = function (el) { + $(el).on('click', dismiss, this.close) + } + + Alert.VERSION = '3.3.7' + + Alert.TRANSITION_DURATION = 150 + + Alert.prototype.close = function (e) { + var $this = $(this) + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = $(selector === '#' ? [] : selector) + + if (e) e.preventDefault() + + if (!$parent.length) { + $parent = $this.closest('.alert') + } + + $parent.trigger(e = $.Event('close.bs.alert')) + + if (e.isDefaultPrevented()) return + + $parent.removeClass('in') + + function removeElement() { + // detach from parent, fire event then clean up data + $parent.detach().trigger('closed.bs.alert').remove() + } + + $.support.transition && $parent.hasClass('fade') ? + $parent + .one('bsTransitionEnd', removeElement) + .emulateTransitionEnd(Alert.TRANSITION_DURATION) : + removeElement() + } + + + // ALERT PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.alert') + + if (!data) $this.data('bs.alert', (data = new Alert(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + var old = $.fn.alert + + $.fn.alert = Plugin + $.fn.alert.Constructor = Alert + + + // ALERT NO CONFLICT + // ================= + + $.fn.alert.noConflict = function () { + $.fn.alert = old + return this + } + + + // ALERT DATA-API + // ============== + + $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: button.js v3.3.7 + * http://getbootstrap.com/javascript/#buttons + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // BUTTON PUBLIC CLASS DEFINITION + // ============================== + + var Button = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Button.DEFAULTS, options) + this.isLoading = false + } + + Button.VERSION = '3.3.7' + + Button.DEFAULTS = { + loadingText: 'loading...' + } + + Button.prototype.setState = function (state) { + var d = 'disabled' + var $el = this.$element + var val = $el.is('input') ? 'val' : 'html' + var data = $el.data() + + state += 'Text' + + if (data.resetText == null) $el.data('resetText', $el[val]()) + + // push to event loop to allow forms to submit + setTimeout($.proxy(function () { + $el[val](data[state] == null ? this.options[state] : data[state]) + + if (state == 'loadingText') { + this.isLoading = true + $el.addClass(d).attr(d, d).prop(d, true) + } else if (this.isLoading) { + this.isLoading = false + $el.removeClass(d).removeAttr(d).prop(d, false) + } + }, this), 0) + } + + Button.prototype.toggle = function () { + var changed = true + var $parent = this.$element.closest('[data-toggle="buttons"]') + + if ($parent.length) { + var $input = this.$element.find('input') + if ($input.prop('type') == 'radio') { + if ($input.prop('checked')) changed = false + $parent.find('.active').removeClass('active') + this.$element.addClass('active') + } else if ($input.prop('type') == 'checkbox') { + if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false + this.$element.toggleClass('active') + } + $input.prop('checked', this.$element.hasClass('active')) + if (changed) $input.trigger('change') + } else { + this.$element.attr('aria-pressed', !this.$element.hasClass('active')) + this.$element.toggleClass('active') + } + } + + + // BUTTON PLUGIN DEFINITION + // ======================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.button') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.button', (data = new Button(this, options))) + + if (option == 'toggle') data.toggle() + else if (option) data.setState(option) + }) + } + + var old = $.fn.button + + $.fn.button = Plugin + $.fn.button.Constructor = Button + + + // BUTTON NO CONFLICT + // ================== + + $.fn.button.noConflict = function () { + $.fn.button = old + return this + } + + + // BUTTON DATA-API + // =============== + + $(document) + .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) { + var $btn = $(e.target).closest('.btn') + Plugin.call($btn, 'toggle') + if (!($(e.target).is('input[type="radio"], input[type="checkbox"]'))) { + // Prevent double click on radios, and the double selections (so cancellation) on checkboxes + e.preventDefault() + // The target component still receive the focus + if ($btn.is('input,button')) $btn.trigger('focus') + else $btn.find('input:visible,button:visible').first().trigger('focus') + } + }) + .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) { + $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type)) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: carousel.js v3.3.7 + * http://getbootstrap.com/javascript/#carousel + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // CAROUSEL CLASS DEFINITION + // ========================= + + var Carousel = function (element, options) { + this.$element = $(element) + this.$indicators = this.$element.find('.carousel-indicators') + this.options = options + this.paused = null + this.sliding = null + this.interval = null + this.$active = null + this.$items = null + + this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this)) + + this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element + .on('mouseenter.bs.carousel', $.proxy(this.pause, this)) + .on('mouseleave.bs.carousel', $.proxy(this.cycle, this)) + } + + Carousel.VERSION = '3.3.7' + + Carousel.TRANSITION_DURATION = 600 + + Carousel.DEFAULTS = { + interval: 5000, + pause: 'hover', + wrap: true, + keyboard: true + } + + Carousel.prototype.keydown = function (e) { + if (/input|textarea/i.test(e.target.tagName)) return + switch (e.which) { + case 37: this.prev(); break + case 39: this.next(); break + default: return + } + + e.preventDefault() + } + + Carousel.prototype.cycle = function (e) { + e || (this.paused = false) + + this.interval && clearInterval(this.interval) + + this.options.interval + && !this.paused + && (this.interval = setInterval($.proxy(this.next, this), this.options.interval)) + + return this + } + + Carousel.prototype.getItemIndex = function (item) { + this.$items = item.parent().children('.item') + return this.$items.index(item || this.$active) + } + + Carousel.prototype.getItemForDirection = function (direction, active) { + var activeIndex = this.getItemIndex(active) + var willWrap = (direction == 'prev' && activeIndex === 0) + || (direction == 'next' && activeIndex == (this.$items.length - 1)) + if (willWrap && !this.options.wrap) return active + var delta = direction == 'prev' ? -1 : 1 + var itemIndex = (activeIndex + delta) % this.$items.length + return this.$items.eq(itemIndex) + } + + Carousel.prototype.to = function (pos) { + var that = this + var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active')) + + if (pos > (this.$items.length - 1) || pos < 0) return + + if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid" + if (activeIndex == pos) return this.pause().cycle() + + return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos)) + } + + Carousel.prototype.pause = function (e) { + e || (this.paused = true) + + if (this.$element.find('.next, .prev').length && $.support.transition) { + this.$element.trigger($.support.transition.end) + this.cycle(true) + } + + this.interval = clearInterval(this.interval) + + return this + } + + Carousel.prototype.next = function () { + if (this.sliding) return + return this.slide('next') + } + + Carousel.prototype.prev = function () { + if (this.sliding) return + return this.slide('prev') + } + + Carousel.prototype.slide = function (type, next) { + var $active = this.$element.find('.item.active') + var $next = next || this.getItemForDirection(type, $active) + var isCycling = this.interval + var direction = type == 'next' ? 'left' : 'right' + var that = this + + if ($next.hasClass('active')) return (this.sliding = false) + + var relatedTarget = $next[0] + var slideEvent = $.Event('slide.bs.carousel', { + relatedTarget: relatedTarget, + direction: direction + }) + this.$element.trigger(slideEvent) + if (slideEvent.isDefaultPrevented()) return + + this.sliding = true + + isCycling && this.pause() + + if (this.$indicators.length) { + this.$indicators.find('.active').removeClass('active') + var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)]) + $nextIndicator && $nextIndicator.addClass('active') + } + + var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid" + if ($.support.transition && this.$element.hasClass('slide')) { + $next.addClass(type) + $next[0].offsetWidth // force reflow + $active.addClass(direction) + $next.addClass(direction) + $active + .one('bsTransitionEnd', function () { + $next.removeClass([type, direction].join(' ')).addClass('active') + $active.removeClass(['active', direction].join(' ')) + that.sliding = false + setTimeout(function () { + that.$element.trigger(slidEvent) + }, 0) + }) + .emulateTransitionEnd(Carousel.TRANSITION_DURATION) + } else { + $active.removeClass('active') + $next.addClass('active') + this.sliding = false + this.$element.trigger(slidEvent) + } + + isCycling && this.cycle() + + return this + } + + + // CAROUSEL PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.carousel') + var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option) + var action = typeof option == 'string' ? option : options.slide + + if (!data) $this.data('bs.carousel', (data = new Carousel(this, options))) + if (typeof option == 'number') data.to(option) + else if (action) data[action]() + else if (options.interval) data.pause().cycle() + }) + } + + var old = $.fn.carousel + + $.fn.carousel = Plugin + $.fn.carousel.Constructor = Carousel + + + // CAROUSEL NO CONFLICT + // ==================== + + $.fn.carousel.noConflict = function () { + $.fn.carousel = old + return this + } + + + // CAROUSEL DATA-API + // ================= + + var clickHandler = function (e) { + var href + var $this = $(this) + var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7 + if (!$target.hasClass('carousel')) return + var options = $.extend({}, $target.data(), $this.data()) + var slideIndex = $this.attr('data-slide-to') + if (slideIndex) options.interval = false + + Plugin.call($target, options) + + if (slideIndex) { + $target.data('bs.carousel').to(slideIndex) + } + + e.preventDefault() + } + + $(document) + .on('click.bs.carousel.data-api', '[data-slide]', clickHandler) + .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler) + + $(window).on('load', function () { + $('[data-ride="carousel"]').each(function () { + var $carousel = $(this) + Plugin.call($carousel, $carousel.data()) + }) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: collapse.js v3.3.7 + * http://getbootstrap.com/javascript/#collapse + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + +/* jshint latedef: false */ + ++function ($) { + 'use strict'; + + // COLLAPSE PUBLIC CLASS DEFINITION + // ================================ + + var Collapse = function (element, options) { + this.$element = $(element) + this.options = $.extend({}, Collapse.DEFAULTS, options) + this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' + + '[data-toggle="collapse"][data-target="#' + element.id + '"]') + this.transitioning = null + + if (this.options.parent) { + this.$parent = this.getParent() + } else { + this.addAriaAndCollapsedClass(this.$element, this.$trigger) + } + + if (this.options.toggle) this.toggle() + } + + Collapse.VERSION = '3.3.7' + + Collapse.TRANSITION_DURATION = 350 + + Collapse.DEFAULTS = { + toggle: true + } + + Collapse.prototype.dimension = function () { + var hasWidth = this.$element.hasClass('width') + return hasWidth ? 'width' : 'height' + } + + Collapse.prototype.show = function () { + if (this.transitioning || this.$element.hasClass('in')) return + + var activesData + var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing') + + if (actives && actives.length) { + activesData = actives.data('bs.collapse') + if (activesData && activesData.transitioning) return + } + + var startEvent = $.Event('show.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + if (actives && actives.length) { + Plugin.call(actives, 'hide') + activesData || actives.data('bs.collapse', null) + } + + var dimension = this.dimension() + + this.$element + .removeClass('collapse') + .addClass('collapsing')[dimension](0) + .attr('aria-expanded', true) + + this.$trigger + .removeClass('collapsed') + .attr('aria-expanded', true) + + this.transitioning = 1 + + var complete = function () { + this.$element + .removeClass('collapsing') + .addClass('collapse in')[dimension]('') + this.transitioning = 0 + this.$element + .trigger('shown.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + var scrollSize = $.camelCase(['scroll', dimension].join('-')) + + this.$element + .one('bsTransitionEnd', $.proxy(complete, this)) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize]) + } + + Collapse.prototype.hide = function () { + if (this.transitioning || !this.$element.hasClass('in')) return + + var startEvent = $.Event('hide.bs.collapse') + this.$element.trigger(startEvent) + if (startEvent.isDefaultPrevented()) return + + var dimension = this.dimension() + + this.$element[dimension](this.$element[dimension]())[0].offsetHeight + + this.$element + .addClass('collapsing') + .removeClass('collapse in') + .attr('aria-expanded', false) + + this.$trigger + .addClass('collapsed') + .attr('aria-expanded', false) + + this.transitioning = 1 + + var complete = function () { + this.transitioning = 0 + this.$element + .removeClass('collapsing') + .addClass('collapse') + .trigger('hidden.bs.collapse') + } + + if (!$.support.transition) return complete.call(this) + + this.$element + [dimension](0) + .one('bsTransitionEnd', $.proxy(complete, this)) + .emulateTransitionEnd(Collapse.TRANSITION_DURATION) + } + + Collapse.prototype.toggle = function () { + this[this.$element.hasClass('in') ? 'hide' : 'show']() + } + + Collapse.prototype.getParent = function () { + return $(this.options.parent) + .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]') + .each($.proxy(function (i, element) { + var $element = $(element) + this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element) + }, this)) + .end() + } + + Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) { + var isOpen = $element.hasClass('in') + + $element.attr('aria-expanded', isOpen) + $trigger + .toggleClass('collapsed', !isOpen) + .attr('aria-expanded', isOpen) + } + + function getTargetFromTrigger($trigger) { + var href + var target = $trigger.attr('data-target') + || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7 + + return $(target) + } + + + // COLLAPSE PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.collapse') + var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false + if (!data) $this.data('bs.collapse', (data = new Collapse(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.collapse + + $.fn.collapse = Plugin + $.fn.collapse.Constructor = Collapse + + + // COLLAPSE NO CONFLICT + // ==================== + + $.fn.collapse.noConflict = function () { + $.fn.collapse = old + return this + } + + + // COLLAPSE DATA-API + // ================= + + $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) { + var $this = $(this) + + if (!$this.attr('data-target')) e.preventDefault() + + var $target = getTargetFromTrigger($this) + var data = $target.data('bs.collapse') + var option = data ? 'toggle' : $this.data() + + Plugin.call($target, option) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: dropdown.js v3.3.7 + * http://getbootstrap.com/javascript/#dropdowns + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // DROPDOWN CLASS DEFINITION + // ========================= + + var backdrop = '.dropdown-backdrop' + var toggle = '[data-toggle="dropdown"]' + var Dropdown = function (element) { + $(element).on('click.bs.dropdown', this.toggle) + } + + Dropdown.VERSION = '3.3.7' + + function getParent($this) { + var selector = $this.attr('data-target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + var $parent = selector && $(selector) + + return $parent && $parent.length ? $parent : $this.parent() + } + + function clearMenus(e) { + if (e && e.which === 3) return + $(backdrop).remove() + $(toggle).each(function () { + var $this = $(this) + var $parent = getParent($this) + var relatedTarget = { relatedTarget: this } + + if (!$parent.hasClass('open')) return + + if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return + + $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget)) + + if (e.isDefaultPrevented()) return + + $this.attr('aria-expanded', 'false') + $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget)) + }) + } + + Dropdown.prototype.toggle = function (e) { + var $this = $(this) + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + clearMenus() + + if (!isActive) { + if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) { + // if mobile we use a backdrop because click events don't delegate + $(document.createElement('div')) + .addClass('dropdown-backdrop') + .insertAfter($(this)) + .on('click', clearMenus) + } + + var relatedTarget = { relatedTarget: this } + $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget)) + + if (e.isDefaultPrevented()) return + + $this + .trigger('focus') + .attr('aria-expanded', 'true') + + $parent + .toggleClass('open') + .trigger($.Event('shown.bs.dropdown', relatedTarget)) + } + + return false + } + + Dropdown.prototype.keydown = function (e) { + if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return + + var $this = $(this) + + e.preventDefault() + e.stopPropagation() + + if ($this.is('.disabled, :disabled')) return + + var $parent = getParent($this) + var isActive = $parent.hasClass('open') + + if (!isActive && e.which != 27 || isActive && e.which == 27) { + if (e.which == 27) $parent.find(toggle).trigger('focus') + return $this.trigger('click') + } + + var desc = ' li:not(.disabled):visible a' + var $items = $parent.find('.dropdown-menu' + desc) + + if (!$items.length) return + + var index = $items.index(e.target) + + if (e.which == 38 && index > 0) index-- // up + if (e.which == 40 && index < $items.length - 1) index++ // down + if (!~index) index = 0 + + $items.eq(index).trigger('focus') + } + + + // DROPDOWN PLUGIN DEFINITION + // ========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.dropdown') + + if (!data) $this.data('bs.dropdown', (data = new Dropdown(this))) + if (typeof option == 'string') data[option].call($this) + }) + } + + var old = $.fn.dropdown + + $.fn.dropdown = Plugin + $.fn.dropdown.Constructor = Dropdown + + + // DROPDOWN NO CONFLICT + // ==================== + + $.fn.dropdown.noConflict = function () { + $.fn.dropdown = old + return this + } + + + // APPLY TO STANDARD DROPDOWN ELEMENTS + // =================================== + + $(document) + .on('click.bs.dropdown.data-api', clearMenus) + .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() }) + .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle) + .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown) + .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: modal.js v3.3.7 + * http://getbootstrap.com/javascript/#modals + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // MODAL CLASS DEFINITION + // ====================== + + var Modal = function (element, options) { + this.options = options + this.$body = $(document.body) + this.$element = $(element) + this.$dialog = this.$element.find('.modal-dialog') + this.$backdrop = null + this.isShown = null + this.originalBodyPad = null + this.scrollbarWidth = 0 + this.ignoreBackdropClick = false + + if (this.options.remote) { + this.$element + .find('.modal-content') + .load(this.options.remote, $.proxy(function () { + this.$element.trigger('loaded.bs.modal') + }, this)) + } + } + + Modal.VERSION = '3.3.7' + + Modal.TRANSITION_DURATION = 300 + Modal.BACKDROP_TRANSITION_DURATION = 150 + + Modal.DEFAULTS = { + backdrop: true, + keyboard: true, + show: true + } + + Modal.prototype.toggle = function (_relatedTarget) { + return this.isShown ? this.hide() : this.show(_relatedTarget) + } + + Modal.prototype.show = function (_relatedTarget) { + var that = this + var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget }) + + this.$element.trigger(e) + + if (this.isShown || e.isDefaultPrevented()) return + + this.isShown = true + + this.checkScrollbar() + this.setScrollbar() + this.$body.addClass('modal-open') + + this.escape() + this.resize() + + this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this)) + + this.$dialog.on('mousedown.dismiss.bs.modal', function () { + that.$element.one('mouseup.dismiss.bs.modal', function (e) { + if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true + }) + }) + + this.backdrop(function () { + var transition = $.support.transition && that.$element.hasClass('fade') + + if (!that.$element.parent().length) { + that.$element.appendTo(that.$body) // don't move modals dom position + } + + that.$element + .show() + .scrollTop(0) + + that.adjustDialog() + + if (transition) { + that.$element[0].offsetWidth // force reflow + } + + that.$element.addClass('in') + + that.enforceFocus() + + var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget }) + + transition ? + that.$dialog // wait for modal to slide in + .one('bsTransitionEnd', function () { + that.$element.trigger('focus').trigger(e) + }) + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : + that.$element.trigger('focus').trigger(e) + }) + } + + Modal.prototype.hide = function (e) { + if (e) e.preventDefault() + + e = $.Event('hide.bs.modal') + + this.$element.trigger(e) + + if (!this.isShown || e.isDefaultPrevented()) return + + this.isShown = false + + this.escape() + this.resize() + + $(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') + + $.support.transition && this.$element.hasClass('fade') ? + this.$element + .one('bsTransitionEnd', $.proxy(this.hideModal, this)) + .emulateTransitionEnd(Modal.TRANSITION_DURATION) : + this.hideModal() + } + + Modal.prototype.enforceFocus = function () { + $(document) + .off('focusin.bs.modal') // guard against infinite focus loop + .on('focusin.bs.modal', $.proxy(function (e) { + if (document !== e.target && + this.$element[0] !== e.target && + !this.$element.has(e.target).length) { + this.$element.trigger('focus') + } + }, this)) + } + + Modal.prototype.escape = function () { + if (this.isShown && this.options.keyboard) { + this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) { + e.which == 27 && this.hide() + }, this)) + } else if (!this.isShown) { + this.$element.off('keydown.dismiss.bs.modal') + } + } + + Modal.prototype.resize = function () { + if (this.isShown) { + $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this)) + } else { + $(window).off('resize.bs.modal') + } + } + + Modal.prototype.hideModal = function () { + var that = this + this.$element.hide() + this.backdrop(function () { + that.$body.removeClass('modal-open') + that.resetAdjustments() + that.resetScrollbar() + that.$element.trigger('hidden.bs.modal') + }) + } + + Modal.prototype.removeBackdrop = function () { + this.$backdrop && this.$backdrop.remove() + this.$backdrop = null + } + + Modal.prototype.backdrop = function (callback) { + var that = this + var animate = this.$element.hasClass('fade') ? 'fade' : '' + + if (this.isShown && this.options.backdrop) { + var doAnimate = $.support.transition && animate + + this.$backdrop = $(document.createElement('div')) + .addClass('modal-backdrop ' + animate) + .appendTo(this.$body) + + this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) { + if (this.ignoreBackdropClick) { + this.ignoreBackdropClick = false + return + } + if (e.target !== e.currentTarget) return + this.options.backdrop == 'static' + ? this.$element[0].focus() + : this.hide() + }, this)) + + if (doAnimate) this.$backdrop[0].offsetWidth // force reflow + + this.$backdrop.addClass('in') + + if (!callback) return + + doAnimate ? + this.$backdrop + .one('bsTransitionEnd', callback) + .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : + callback() + + } else if (!this.isShown && this.$backdrop) { + this.$backdrop.removeClass('in') + + var callbackRemove = function () { + that.removeBackdrop() + callback && callback() + } + $.support.transition && this.$element.hasClass('fade') ? + this.$backdrop + .one('bsTransitionEnd', callbackRemove) + .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) : + callbackRemove() + + } else if (callback) { + callback() + } + } + + // these following methods are used to handle overflowing modals + + Modal.prototype.handleUpdate = function () { + this.adjustDialog() + } + + Modal.prototype.adjustDialog = function () { + var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight + + this.$element.css({ + paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '', + paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : '' + }) + } + + Modal.prototype.resetAdjustments = function () { + this.$element.css({ + paddingLeft: '', + paddingRight: '' + }) + } + + Modal.prototype.checkScrollbar = function () { + var fullWindowWidth = window.innerWidth + if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8 + var documentElementRect = document.documentElement.getBoundingClientRect() + fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left) + } + this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth + this.scrollbarWidth = this.measureScrollbar() + } + + Modal.prototype.setScrollbar = function () { + var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10) + this.originalBodyPad = document.body.style.paddingRight || '' + if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth) + } + + Modal.prototype.resetScrollbar = function () { + this.$body.css('padding-right', this.originalBodyPad) + } + + Modal.prototype.measureScrollbar = function () { // thx walsh + var scrollDiv = document.createElement('div') + scrollDiv.className = 'modal-scrollbar-measure' + this.$body.append(scrollDiv) + var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth + this.$body[0].removeChild(scrollDiv) + return scrollbarWidth + } + + + // MODAL PLUGIN DEFINITION + // ======================= + + function Plugin(option, _relatedTarget) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.modal') + var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option) + + if (!data) $this.data('bs.modal', (data = new Modal(this, options))) + if (typeof option == 'string') data[option](_relatedTarget) + else if (options.show) data.show(_relatedTarget) + }) + } + + var old = $.fn.modal + + $.fn.modal = Plugin + $.fn.modal.Constructor = Modal + + + // MODAL NO CONFLICT + // ================= + + $.fn.modal.noConflict = function () { + $.fn.modal = old + return this + } + + + // MODAL DATA-API + // ============== + + $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) { + var $this = $(this) + var href = $this.attr('href') + var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7 + var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data()) + + if ($this.is('a')) e.preventDefault() + + $target.one('show.bs.modal', function (showEvent) { + if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown + $target.one('hidden.bs.modal', function () { + $this.is(':visible') && $this.trigger('focus') + }) + }) + Plugin.call($target, option, this) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: tooltip.js v3.3.7 + * http://getbootstrap.com/javascript/#tooltip + * Inspired by the original jQuery.tipsy by Jason Frame + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // TOOLTIP PUBLIC CLASS DEFINITION + // =============================== + + var Tooltip = function (element, options) { + this.type = null + this.options = null + this.enabled = null + this.timeout = null + this.hoverState = null + this.$element = null + this.inState = null + + this.init('tooltip', element, options) + } + + Tooltip.VERSION = '3.3.7' + + Tooltip.TRANSITION_DURATION = 150 + + Tooltip.DEFAULTS = { + animation: true, + placement: 'top', + selector: false, + template: '', + trigger: 'hover focus', + title: '', + delay: 0, + html: false, + container: false, + viewport: { + selector: 'body', + padding: 0 + } + } + + Tooltip.prototype.init = function (type, element, options) { + this.enabled = true + this.type = type + this.$element = $(element) + this.options = this.getOptions(options) + this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport)) + this.inState = { click: false, hover: false, focus: false } + + if (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!') + } + + var triggers = this.options.trigger.split(' ') + + for (var i = triggers.length; i--;) { + var trigger = triggers[i] + + if (trigger == 'click') { + this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this)) + } else if (trigger != 'manual') { + var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin' + var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout' + + this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this)) + this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this)) + } + } + + this.options.selector ? + (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) : + this.fixTitle() + } + + Tooltip.prototype.getDefaults = function () { + return Tooltip.DEFAULTS + } + + Tooltip.prototype.getOptions = function (options) { + options = $.extend({}, this.getDefaults(), this.$element.data(), options) + + if (options.delay && typeof options.delay == 'number') { + options.delay = { + show: options.delay, + hide: options.delay + } + } + + return options + } + + Tooltip.prototype.getDelegateOptions = function () { + var options = {} + var defaults = this.getDefaults() + + this._options && $.each(this._options, function (key, value) { + if (defaults[key] != value) options[key] = value + }) + + return options + } + + Tooltip.prototype.enter = function (obj) { + var self = obj instanceof this.constructor ? + obj : $(obj.currentTarget).data('bs.' + this.type) + + if (!self) { + self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) + $(obj.currentTarget).data('bs.' + this.type, self) + } + + if (obj instanceof $.Event) { + self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true + } + + if (self.tip().hasClass('in') || self.hoverState == 'in') { + self.hoverState = 'in' + return + } + + clearTimeout(self.timeout) + + self.hoverState = 'in' + + if (!self.options.delay || !self.options.delay.show) return self.show() + + self.timeout = setTimeout(function () { + if (self.hoverState == 'in') self.show() + }, self.options.delay.show) + } + + Tooltip.prototype.isInStateTrue = function () { + for (var key in this.inState) { + if (this.inState[key]) return true + } + + return false + } + + Tooltip.prototype.leave = function (obj) { + var self = obj instanceof this.constructor ? + obj : $(obj.currentTarget).data('bs.' + this.type) + + if (!self) { + self = new this.constructor(obj.currentTarget, this.getDelegateOptions()) + $(obj.currentTarget).data('bs.' + this.type, self) + } + + if (obj instanceof $.Event) { + self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false + } + + if (self.isInStateTrue()) return + + clearTimeout(self.timeout) + + self.hoverState = 'out' + + if (!self.options.delay || !self.options.delay.hide) return self.hide() + + self.timeout = setTimeout(function () { + if (self.hoverState == 'out') self.hide() + }, self.options.delay.hide) + } + + Tooltip.prototype.show = function () { + var e = $.Event('show.bs.' + this.type) + + if (this.hasContent() && this.enabled) { + this.$element.trigger(e) + + var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0]) + if (e.isDefaultPrevented() || !inDom) return + var that = this + + var $tip = this.tip() + + var tipId = this.getUID(this.type) + + this.setContent() + $tip.attr('id', tipId) + this.$element.attr('aria-describedby', tipId) + + if (this.options.animation) $tip.addClass('fade') + + var placement = typeof this.options.placement == 'function' ? + this.options.placement.call(this, $tip[0], this.$element[0]) : + this.options.placement + + var autoToken = /\s?auto?\s?/i + var autoPlace = autoToken.test(placement) + if (autoPlace) placement = placement.replace(autoToken, '') || 'top' + + $tip + .detach() + .css({ top: 0, left: 0, display: 'block' }) + .addClass(placement) + .data('bs.' + this.type, this) + + this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element) + this.$element.trigger('inserted.bs.' + this.type) + + var pos = this.getPosition() + var actualWidth = $tip[0].offsetWidth + var actualHeight = $tip[0].offsetHeight + + if (autoPlace) { + var orgPlacement = placement + var viewportDim = this.getPosition(this.$viewport) + + placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' : + placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' : + placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' : + placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' : + placement + + $tip + .removeClass(orgPlacement) + .addClass(placement) + } + + var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight) + + this.applyPlacement(calculatedOffset, placement) + + var complete = function () { + var prevHoverState = that.hoverState + that.$element.trigger('shown.bs.' + that.type) + that.hoverState = null + + if (prevHoverState == 'out') that.leave(that) + } + + $.support.transition && this.$tip.hasClass('fade') ? + $tip + .one('bsTransitionEnd', complete) + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : + complete() + } + } + + Tooltip.prototype.applyPlacement = function (offset, placement) { + var $tip = this.tip() + var width = $tip[0].offsetWidth + var height = $tip[0].offsetHeight + + // manually read margins because getBoundingClientRect includes difference + var marginTop = parseInt($tip.css('margin-top'), 10) + var marginLeft = parseInt($tip.css('margin-left'), 10) + + // we must check for NaN for ie 8/9 + if (isNaN(marginTop)) marginTop = 0 + if (isNaN(marginLeft)) marginLeft = 0 + + offset.top += marginTop + offset.left += marginLeft + + // $.fn.offset doesn't round pixel values + // so we use setOffset directly with our own function B-0 + $.offset.setOffset($tip[0], $.extend({ + using: function (props) { + $tip.css({ + top: Math.round(props.top), + left: Math.round(props.left) + }) + } + }, offset), 0) + + $tip.addClass('in') + + // check to see if placing tip in new offset caused the tip to resize itself + var actualWidth = $tip[0].offsetWidth + var actualHeight = $tip[0].offsetHeight + + if (placement == 'top' && actualHeight != height) { + offset.top = offset.top + height - actualHeight + } + + var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight) + + if (delta.left) offset.left += delta.left + else offset.top += delta.top + + var isVertical = /top|bottom/.test(placement) + var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight + var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight' + + $tip.offset(offset) + this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical) + } + + Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) { + this.arrow() + .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%') + .css(isVertical ? 'top' : 'left', '') + } + + Tooltip.prototype.setContent = function () { + var $tip = this.tip() + var title = this.getTitle() + + $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title) + $tip.removeClass('fade in top bottom left right') + } + + Tooltip.prototype.hide = function (callback) { + var that = this + var $tip = $(this.$tip) + var e = $.Event('hide.bs.' + this.type) + + function complete() { + if (that.hoverState != 'in') $tip.detach() + if (that.$element) { // TODO: Check whether guarding this code with this `if` is really necessary. + that.$element + .removeAttr('aria-describedby') + .trigger('hidden.bs.' + that.type) + } + callback && callback() + } + + this.$element.trigger(e) + + if (e.isDefaultPrevented()) return + + $tip.removeClass('in') + + $.support.transition && $tip.hasClass('fade') ? + $tip + .one('bsTransitionEnd', complete) + .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) : + complete() + + this.hoverState = null + + return this + } + + Tooltip.prototype.fixTitle = function () { + var $e = this.$element + if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') { + $e.attr('data-original-title', $e.attr('title') || '').attr('title', '') + } + } + + Tooltip.prototype.hasContent = function () { + return this.getTitle() + } + + Tooltip.prototype.getPosition = function ($element) { + $element = $element || this.$element + + var el = $element[0] + var isBody = el.tagName == 'BODY' + + var elRect = el.getBoundingClientRect() + if (elRect.width == null) { + // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093 + elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top }) + } + var isSvg = window.SVGElement && el instanceof window.SVGElement + // Avoid using $.offset() on SVGs since it gives incorrect results in jQuery 3. + // See https://github.com/twbs/bootstrap/issues/20280 + var elOffset = isBody ? { top: 0, left: 0 } : (isSvg ? null : $element.offset()) + var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() } + var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null + + return $.extend({}, elRect, scroll, outerDims, elOffset) + } + + Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) { + return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } : + placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } : + placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } : + /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width } + + } + + Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) { + var delta = { top: 0, left: 0 } + if (!this.$viewport) return delta + + var viewportPadding = this.options.viewport && this.options.viewport.padding || 0 + var viewportDimensions = this.getPosition(this.$viewport) + + if (/right|left/.test(placement)) { + var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll + var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight + if (topEdgeOffset < viewportDimensions.top) { // top overflow + delta.top = viewportDimensions.top - topEdgeOffset + } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow + delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset + } + } else { + var leftEdgeOffset = pos.left - viewportPadding + var rightEdgeOffset = pos.left + viewportPadding + actualWidth + if (leftEdgeOffset < viewportDimensions.left) { // left overflow + delta.left = viewportDimensions.left - leftEdgeOffset + } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow + delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset + } + } + + return delta + } + + Tooltip.prototype.getTitle = function () { + var title + var $e = this.$element + var o = this.options + + title = $e.attr('data-original-title') + || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title) + + return title + } + + Tooltip.prototype.getUID = function (prefix) { + do prefix += ~~(Math.random() * 1000000) + while (document.getElementById(prefix)) + return prefix + } + + Tooltip.prototype.tip = function () { + if (!this.$tip) { + this.$tip = $(this.options.template) + if (this.$tip.length != 1) { + throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!') + } + } + return this.$tip + } + + Tooltip.prototype.arrow = function () { + return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')) + } + + Tooltip.prototype.enable = function () { + this.enabled = true + } + + Tooltip.prototype.disable = function () { + this.enabled = false + } + + Tooltip.prototype.toggleEnabled = function () { + this.enabled = !this.enabled + } + + Tooltip.prototype.toggle = function (e) { + var self = this + if (e) { + self = $(e.currentTarget).data('bs.' + this.type) + if (!self) { + self = new this.constructor(e.currentTarget, this.getDelegateOptions()) + $(e.currentTarget).data('bs.' + this.type, self) + } + } + + if (e) { + self.inState.click = !self.inState.click + if (self.isInStateTrue()) self.enter(self) + else self.leave(self) + } else { + self.tip().hasClass('in') ? self.leave(self) : self.enter(self) + } + } + + Tooltip.prototype.destroy = function () { + var that = this + clearTimeout(this.timeout) + this.hide(function () { + that.$element.off('.' + that.type).removeData('bs.' + that.type) + if (that.$tip) { + that.$tip.detach() + } + that.$tip = null + that.$arrow = null + that.$viewport = null + that.$element = null + }) + } + + + // TOOLTIP PLUGIN DEFINITION + // ========================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.tooltip') + var options = typeof option == 'object' && option + + if (!data && /destroy|hide/.test(option)) return + if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.tooltip + + $.fn.tooltip = Plugin + $.fn.tooltip.Constructor = Tooltip + + + // TOOLTIP NO CONFLICT + // =================== + + $.fn.tooltip.noConflict = function () { + $.fn.tooltip = old + return this + } + +}(jQuery); + +/* ======================================================================== + * Bootstrap: popover.js v3.3.7 + * http://getbootstrap.com/javascript/#popovers + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // POPOVER PUBLIC CLASS DEFINITION + // =============================== + + var Popover = function (element, options) { + this.init('popover', element, options) + } + + if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js') + + Popover.VERSION = '3.3.7' + + Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, { + placement: 'right', + trigger: 'click', + content: '', + template: '' + }) + + + // NOTE: POPOVER EXTENDS tooltip.js + // ================================ + + Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype) + + Popover.prototype.constructor = Popover + + Popover.prototype.getDefaults = function () { + return Popover.DEFAULTS + } + + Popover.prototype.setContent = function () { + var $tip = this.tip() + var title = this.getTitle() + var content = this.getContent() + + $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title) + $tip.find('.popover-content').children().detach().end()[ // we use append for html objects to maintain js events + this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text' + ](content) + + $tip.removeClass('fade top bottom left right in') + + // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do + // this manually by checking the contents. + if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide() + } + + Popover.prototype.hasContent = function () { + return this.getTitle() || this.getContent() + } + + Popover.prototype.getContent = function () { + var $e = this.$element + var o = this.options + + return $e.attr('data-content') + || (typeof o.content == 'function' ? + o.content.call($e[0]) : + o.content) + } + + Popover.prototype.arrow = function () { + return (this.$arrow = this.$arrow || this.tip().find('.arrow')) + } + + + // POPOVER PLUGIN DEFINITION + // ========================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.popover') + var options = typeof option == 'object' && option + + if (!data && /destroy|hide/.test(option)) return + if (!data) $this.data('bs.popover', (data = new Popover(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.popover + + $.fn.popover = Plugin + $.fn.popover.Constructor = Popover + + + // POPOVER NO CONFLICT + // =================== + + $.fn.popover.noConflict = function () { + $.fn.popover = old + return this + } + +}(jQuery); + +/* ======================================================================== + * Bootstrap: scrollspy.js v3.3.7 + * http://getbootstrap.com/javascript/#scrollspy + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // SCROLLSPY CLASS DEFINITION + // ========================== + + function ScrollSpy(element, options) { + this.$body = $(document.body) + this.$scrollElement = $(element).is(document.body) ? $(window) : $(element) + this.options = $.extend({}, ScrollSpy.DEFAULTS, options) + this.selector = (this.options.target || '') + ' .nav li > a' + this.offsets = [] + this.targets = [] + this.activeTarget = null + this.scrollHeight = 0 + + this.$scrollElement.on('scroll.bs.scrollspy', $.proxy(this.process, this)) + this.refresh() + this.process() + } + + ScrollSpy.VERSION = '3.3.7' + + ScrollSpy.DEFAULTS = { + offset: 10 + } + + ScrollSpy.prototype.getScrollHeight = function () { + return this.$scrollElement[0].scrollHeight || Math.max(this.$body[0].scrollHeight, document.documentElement.scrollHeight) + } + + ScrollSpy.prototype.refresh = function () { + var that = this + var offsetMethod = 'offset' + var offsetBase = 0 + + this.offsets = [] + this.targets = [] + this.scrollHeight = this.getScrollHeight() + + if (!$.isWindow(this.$scrollElement[0])) { + offsetMethod = 'position' + offsetBase = this.$scrollElement.scrollTop() + } + + this.$body + .find(this.selector) + .map(function () { + var $el = $(this) + var href = $el.data('target') || $el.attr('href') + var $href = /^#./.test(href) && $(href) + + return ($href + && $href.length + && $href.is(':visible') + && [[$href[offsetMethod]().top + offsetBase, href]]) || null + }) + .sort(function (a, b) { return a[0] - b[0] }) + .each(function () { + that.offsets.push(this[0]) + that.targets.push(this[1]) + }) + } + + ScrollSpy.prototype.process = function () { + var scrollTop = this.$scrollElement.scrollTop() + this.options.offset + var scrollHeight = this.getScrollHeight() + var maxScroll = this.options.offset + scrollHeight - this.$scrollElement.height() + var offsets = this.offsets + var targets = this.targets + var activeTarget = this.activeTarget + var i + + if (this.scrollHeight != scrollHeight) { + this.refresh() + } + + if (scrollTop >= maxScroll) { + return activeTarget != (i = targets[targets.length - 1]) && this.activate(i) + } + + if (activeTarget && scrollTop < offsets[0]) { + this.activeTarget = null + return this.clear() + } + + for (i = offsets.length; i--;) { + activeTarget != targets[i] + && scrollTop >= offsets[i] + && (offsets[i + 1] === undefined || scrollTop < offsets[i + 1]) + && this.activate(targets[i]) + } + } + + ScrollSpy.prototype.activate = function (target) { + this.activeTarget = target + + this.clear() + + var selector = this.selector + + '[data-target="' + target + '"],' + + this.selector + '[href="' + target + '"]' + + var active = $(selector) + .parents('li') + .addClass('active') + + if (active.parent('.dropdown-menu').length) { + active = active + .closest('li.dropdown') + .addClass('active') + } + + active.trigger('activate.bs.scrollspy') + } + + ScrollSpy.prototype.clear = function () { + $(this.selector) + .parentsUntil(this.options.target, '.active') + .removeClass('active') + } + + + // SCROLLSPY PLUGIN DEFINITION + // =========================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.scrollspy') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.scrollspy + + $.fn.scrollspy = Plugin + $.fn.scrollspy.Constructor = ScrollSpy + + + // SCROLLSPY NO CONFLICT + // ===================== + + $.fn.scrollspy.noConflict = function () { + $.fn.scrollspy = old + return this + } + + + // SCROLLSPY DATA-API + // ================== + + $(window).on('load.bs.scrollspy.data-api', function () { + $('[data-spy="scroll"]').each(function () { + var $spy = $(this) + Plugin.call($spy, $spy.data()) + }) + }) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: tab.js v3.3.7 + * http://getbootstrap.com/javascript/#tabs + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // TAB CLASS DEFINITION + // ==================== + + var Tab = function (element) { + // jscs:disable requireDollarBeforejQueryAssignment + this.element = $(element) + // jscs:enable requireDollarBeforejQueryAssignment + } + + Tab.VERSION = '3.3.7' + + Tab.TRANSITION_DURATION = 150 + + Tab.prototype.show = function () { + var $this = this.element + var $ul = $this.closest('ul:not(.dropdown-menu)') + var selector = $this.data('target') + + if (!selector) { + selector = $this.attr('href') + selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7 + } + + if ($this.parent('li').hasClass('active')) return + + var $previous = $ul.find('.active:last a') + var hideEvent = $.Event('hide.bs.tab', { + relatedTarget: $this[0] + }) + var showEvent = $.Event('show.bs.tab', { + relatedTarget: $previous[0] + }) + + $previous.trigger(hideEvent) + $this.trigger(showEvent) + + if (showEvent.isDefaultPrevented() || hideEvent.isDefaultPrevented()) return + + var $target = $(selector) + + this.activate($this.closest('li'), $ul) + this.activate($target, $target.parent(), function () { + $previous.trigger({ + type: 'hidden.bs.tab', + relatedTarget: $this[0] + }) + $this.trigger({ + type: 'shown.bs.tab', + relatedTarget: $previous[0] + }) + }) + } + + Tab.prototype.activate = function (element, container, callback) { + var $active = container.find('> .active') + var transition = callback + && $.support.transition + && ($active.length && $active.hasClass('fade') || !!container.find('> .fade').length) + + function next() { + $active + .removeClass('active') + .find('> .dropdown-menu > .active') + .removeClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', false) + + element + .addClass('active') + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) + + if (transition) { + element[0].offsetWidth // reflow for transition + element.addClass('in') + } else { + element.removeClass('fade') + } + + if (element.parent('.dropdown-menu').length) { + element + .closest('li.dropdown') + .addClass('active') + .end() + .find('[data-toggle="tab"]') + .attr('aria-expanded', true) + } + + callback && callback() + } + + $active.length && transition ? + $active + .one('bsTransitionEnd', next) + .emulateTransitionEnd(Tab.TRANSITION_DURATION) : + next() + + $active.removeClass('in') + } + + + // TAB PLUGIN DEFINITION + // ===================== + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.tab') + + if (!data) $this.data('bs.tab', (data = new Tab(this))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.tab + + $.fn.tab = Plugin + $.fn.tab.Constructor = Tab + + + // TAB NO CONFLICT + // =============== + + $.fn.tab.noConflict = function () { + $.fn.tab = old + return this + } + + + // TAB DATA-API + // ============ + + var clickHandler = function (e) { + e.preventDefault() + Plugin.call($(this), 'show') + } + + $(document) + .on('click.bs.tab.data-api', '[data-toggle="tab"]', clickHandler) + .on('click.bs.tab.data-api', '[data-toggle="pill"]', clickHandler) + +}(jQuery); + +/* ======================================================================== + * Bootstrap: affix.js v3.3.7 + * http://getbootstrap.com/javascript/#affix + * ======================================================================== + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + * ======================================================================== */ + + ++function ($) { + 'use strict'; + + // AFFIX CLASS DEFINITION + // ====================== + + var Affix = function (element, options) { + this.options = $.extend({}, Affix.DEFAULTS, options) + + this.$target = $(this.options.target) + .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this)) + .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this)) + + this.$element = $(element) + this.affixed = null + this.unpin = null + this.pinnedOffset = null + + this.checkPosition() + } + + Affix.VERSION = '3.3.7' + + Affix.RESET = 'affix affix-top affix-bottom' + + Affix.DEFAULTS = { + offset: 0, + target: window + } + + Affix.prototype.getState = function (scrollHeight, height, offsetTop, offsetBottom) { + var scrollTop = this.$target.scrollTop() + var position = this.$element.offset() + var targetHeight = this.$target.height() + + if (offsetTop != null && this.affixed == 'top') return scrollTop < offsetTop ? 'top' : false + + if (this.affixed == 'bottom') { + if (offsetTop != null) return (scrollTop + this.unpin <= position.top) ? false : 'bottom' + return (scrollTop + targetHeight <= scrollHeight - offsetBottom) ? false : 'bottom' + } + + var initializing = this.affixed == null + var colliderTop = initializing ? scrollTop : position.top + var colliderHeight = initializing ? targetHeight : height + + if (offsetTop != null && scrollTop <= offsetTop) return 'top' + if (offsetBottom != null && (colliderTop + colliderHeight >= scrollHeight - offsetBottom)) return 'bottom' + + return false + } + + Affix.prototype.getPinnedOffset = function () { + if (this.pinnedOffset) return this.pinnedOffset + this.$element.removeClass(Affix.RESET).addClass('affix') + var scrollTop = this.$target.scrollTop() + var position = this.$element.offset() + return (this.pinnedOffset = position.top - scrollTop) + } + + Affix.prototype.checkPositionWithEventLoop = function () { + setTimeout($.proxy(this.checkPosition, this), 1) + } + + Affix.prototype.checkPosition = function () { + if (!this.$element.is(':visible')) return + + var height = this.$element.height() + var offset = this.options.offset + var offsetTop = offset.top + var offsetBottom = offset.bottom + var scrollHeight = Math.max($(document).height(), $(document.body).height()) + + if (typeof offset != 'object') offsetBottom = offsetTop = offset + if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element) + if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element) + + var affix = this.getState(scrollHeight, height, offsetTop, offsetBottom) + + if (this.affixed != affix) { + if (this.unpin != null) this.$element.css('top', '') + + var affixType = 'affix' + (affix ? '-' + affix : '') + var e = $.Event(affixType + '.bs.affix') + + this.$element.trigger(e) + + if (e.isDefaultPrevented()) return + + this.affixed = affix + this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null + + this.$element + .removeClass(Affix.RESET) + .addClass(affixType) + .trigger(affixType.replace('affix', 'affixed') + '.bs.affix') + } + + if (affix == 'bottom') { + this.$element.offset({ + top: scrollHeight - height - offsetBottom + }) + } + } + + + // AFFIX PLUGIN DEFINITION + // ======================= + + function Plugin(option) { + return this.each(function () { + var $this = $(this) + var data = $this.data('bs.affix') + var options = typeof option == 'object' && option + + if (!data) $this.data('bs.affix', (data = new Affix(this, options))) + if (typeof option == 'string') data[option]() + }) + } + + var old = $.fn.affix + + $.fn.affix = Plugin + $.fn.affix.Constructor = Affix + + + // AFFIX NO CONFLICT + // ================= + + $.fn.affix.noConflict = function () { + $.fn.affix = old + return this + } + + + // AFFIX DATA-API + // ============== + + $(window).on('load', function () { + $('[data-spy="affix"]').each(function () { + var $spy = $(this) + var data = $spy.data() + + data.offset = data.offset || {} + + if (data.offsetBottom != null) data.offset.bottom = data.offsetBottom + if (data.offsetTop != null) data.offset.top = data.offsetTop + + Plugin.call($spy, data) + }) + }) + +}(jQuery); diff --git a/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/js/bootstrap.min.js b/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/js/bootstrap.min.js new file mode 100644 index 0000000..be9574d --- /dev/null +++ b/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/js/bootstrap.min.js @@ -0,0 +1,7 @@ +/*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under the MIT license + */ +if("undefined"==typeof jQuery)throw new Error("Bootstrap's JavaScript requires jQuery");+function(a){"use strict";var b=a.fn.jquery.split(" ")[0].split(".");if(b[0]<2&&b[1]<9||1==b[0]&&9==b[1]&&b[2]<1||b[0]>3)throw new Error("Bootstrap's JavaScript requires jQuery version 1.9.1 or higher, but lower than version 4")}(jQuery),+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]};return!1}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one("bsTransitionEnd",function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b(),a.support.transition&&(a.event.special.bsTransitionEnd={bindType:a.support.transition.end,delegateType:a.support.transition.end,handle:function(b){if(a(b.target).is(this))return b.handleObj.handler.apply(this,arguments)}})})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var c=a(this),e=c.data("bs.alert");e||c.data("bs.alert",e=new d(this)),"string"==typeof b&&e[b].call(c)})}var c='[data-dismiss="alert"]',d=function(b){a(b).on("click",c,this.close)};d.VERSION="3.3.7",d.TRANSITION_DURATION=150,d.prototype.close=function(b){function c(){g.detach().trigger("closed.bs.alert").remove()}var e=a(this),f=e.attr("data-target");f||(f=e.attr("href"),f=f&&f.replace(/.*(?=#[^\s]*$)/,""));var g=a("#"===f?[]:f);b&&b.preventDefault(),g.length||(g=e.closest(".alert")),g.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(g.removeClass("in"),a.support.transition&&g.hasClass("fade")?g.one("bsTransitionEnd",c).emulateTransitionEnd(d.TRANSITION_DURATION):c())};var e=a.fn.alert;a.fn.alert=b,a.fn.alert.Constructor=d,a.fn.alert.noConflict=function(){return a.fn.alert=e,this},a(document).on("click.bs.alert.data-api",c,d.prototype.close)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof b&&b;e||d.data("bs.button",e=new c(this,f)),"toggle"==b?e.toggle():b&&e.setState(b)})}var c=function(b,d){this.$element=a(b),this.options=a.extend({},c.DEFAULTS,d),this.isLoading=!1};c.VERSION="3.3.7",c.DEFAULTS={loadingText:"loading..."},c.prototype.setState=function(b){var c="disabled",d=this.$element,e=d.is("input")?"val":"html",f=d.data();b+="Text",null==f.resetText&&d.data("resetText",d[e]()),setTimeout(a.proxy(function(){d[e](null==f[b]?this.options[b]:f[b]),"loadingText"==b?(this.isLoading=!0,d.addClass(c).attr(c,c).prop(c,!0)):this.isLoading&&(this.isLoading=!1,d.removeClass(c).removeAttr(c).prop(c,!1))},this),0)},c.prototype.toggle=function(){var a=!0,b=this.$element.closest('[data-toggle="buttons"]');if(b.length){var c=this.$element.find("input");"radio"==c.prop("type")?(c.prop("checked")&&(a=!1),b.find(".active").removeClass("active"),this.$element.addClass("active")):"checkbox"==c.prop("type")&&(c.prop("checked")!==this.$element.hasClass("active")&&(a=!1),this.$element.toggleClass("active")),c.prop("checked",this.$element.hasClass("active")),a&&c.trigger("change")}else this.$element.attr("aria-pressed",!this.$element.hasClass("active")),this.$element.toggleClass("active")};var d=a.fn.button;a.fn.button=b,a.fn.button.Constructor=c,a.fn.button.noConflict=function(){return a.fn.button=d,this},a(document).on("click.bs.button.data-api",'[data-toggle^="button"]',function(c){var d=a(c.target).closest(".btn");b.call(d,"toggle"),a(c.target).is('input[type="radio"], input[type="checkbox"]')||(c.preventDefault(),d.is("input,button")?d.trigger("focus"):d.find("input:visible,button:visible").first().trigger("focus"))}).on("focus.bs.button.data-api blur.bs.button.data-api",'[data-toggle^="button"]',function(b){a(b.target).closest(".btn").toggleClass("focus",/^focus(in)?$/.test(b.type))})}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},c.DEFAULTS,d.data(),"object"==typeof b&&b),g="string"==typeof b?b:f.slide;e||d.data("bs.carousel",e=new c(this,f)),"number"==typeof b?e.to(b):g?e[g]():f.interval&&e.pause().cycle()})}var c=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=null,this.sliding=null,this.interval=null,this.$active=null,this.$items=null,this.options.keyboard&&this.$element.on("keydown.bs.carousel",a.proxy(this.keydown,this)),"hover"==this.options.pause&&!("ontouchstart"in document.documentElement)&&this.$element.on("mouseenter.bs.carousel",a.proxy(this.pause,this)).on("mouseleave.bs.carousel",a.proxy(this.cycle,this))};c.VERSION="3.3.7",c.TRANSITION_DURATION=600,c.DEFAULTS={interval:5e3,pause:"hover",wrap:!0,keyboard:!0},c.prototype.keydown=function(a){if(!/input|textarea/i.test(a.target.tagName)){switch(a.which){case 37:this.prev();break;case 39:this.next();break;default:return}a.preventDefault()}},c.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},c.prototype.getItemIndex=function(a){return this.$items=a.parent().children(".item"),this.$items.index(a||this.$active)},c.prototype.getItemForDirection=function(a,b){var c=this.getItemIndex(b),d="prev"==a&&0===c||"next"==a&&c==this.$items.length-1;if(d&&!this.options.wrap)return b;var e="prev"==a?-1:1,f=(c+e)%this.$items.length;return this.$items.eq(f)},c.prototype.to=function(a){var b=this,c=this.getItemIndex(this.$active=this.$element.find(".item.active"));if(!(a>this.$items.length-1||a<0))return this.sliding?this.$element.one("slid.bs.carousel",function(){b.to(a)}):c==a?this.pause().cycle():this.slide(a>c?"next":"prev",this.$items.eq(a))},c.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},c.prototype.next=function(){if(!this.sliding)return this.slide("next")},c.prototype.prev=function(){if(!this.sliding)return this.slide("prev")},c.prototype.slide=function(b,d){var e=this.$element.find(".item.active"),f=d||this.getItemForDirection(b,e),g=this.interval,h="next"==b?"left":"right",i=this;if(f.hasClass("active"))return this.sliding=!1;var j=f[0],k=a.Event("slide.bs.carousel",{relatedTarget:j,direction:h});if(this.$element.trigger(k),!k.isDefaultPrevented()){if(this.sliding=!0,g&&this.pause(),this.$indicators.length){this.$indicators.find(".active").removeClass("active");var l=a(this.$indicators.children()[this.getItemIndex(f)]);l&&l.addClass("active")}var m=a.Event("slid.bs.carousel",{relatedTarget:j,direction:h});return a.support.transition&&this.$element.hasClass("slide")?(f.addClass(b),f[0].offsetWidth,e.addClass(h),f.addClass(h),e.one("bsTransitionEnd",function(){f.removeClass([b,h].join(" ")).addClass("active"),e.removeClass(["active",h].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger(m)},0)}).emulateTransitionEnd(c.TRANSITION_DURATION)):(e.removeClass("active"),f.addClass("active"),this.sliding=!1,this.$element.trigger(m)),g&&this.cycle(),this}};var d=a.fn.carousel;a.fn.carousel=b,a.fn.carousel.Constructor=c,a.fn.carousel.noConflict=function(){return a.fn.carousel=d,this};var e=function(c){var d,e=a(this),f=a(e.attr("data-target")||(d=e.attr("href"))&&d.replace(/.*(?=#[^\s]+$)/,""));if(f.hasClass("carousel")){var g=a.extend({},f.data(),e.data()),h=e.attr("data-slide-to");h&&(g.interval=!1),b.call(f,g),h&&f.data("bs.carousel").to(h),c.preventDefault()}};a(document).on("click.bs.carousel.data-api","[data-slide]",e).on("click.bs.carousel.data-api","[data-slide-to]",e),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var c=a(this);b.call(c,c.data())})})}(jQuery),+function(a){"use strict";function b(b){var c,d=b.attr("data-target")||(c=b.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"");return a(d)}function c(b){return this.each(function(){var c=a(this),e=c.data("bs.collapse"),f=a.extend({},d.DEFAULTS,c.data(),"object"==typeof b&&b);!e&&f.toggle&&/show|hide/.test(b)&&(f.toggle=!1),e||c.data("bs.collapse",e=new d(this,f)),"string"==typeof b&&e[b]()})}var d=function(b,c){this.$element=a(b),this.options=a.extend({},d.DEFAULTS,c),this.$trigger=a('[data-toggle="collapse"][href="#'+b.id+'"],[data-toggle="collapse"][data-target="#'+b.id+'"]'),this.transitioning=null,this.options.parent?this.$parent=this.getParent():this.addAriaAndCollapsedClass(this.$element,this.$trigger),this.options.toggle&&this.toggle()};d.VERSION="3.3.7",d.TRANSITION_DURATION=350,d.DEFAULTS={toggle:!0},d.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},d.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b,e=this.$parent&&this.$parent.children(".panel").children(".in, .collapsing");if(!(e&&e.length&&(b=e.data("bs.collapse"),b&&b.transitioning))){var f=a.Event("show.bs.collapse");if(this.$element.trigger(f),!f.isDefaultPrevented()){e&&e.length&&(c.call(e,"hide"),b||e.data("bs.collapse",null));var g=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[g](0).attr("aria-expanded",!0),this.$trigger.removeClass("collapsed").attr("aria-expanded",!0),this.transitioning=1;var h=function(){this.$element.removeClass("collapsing").addClass("collapse in")[g](""),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return h.call(this);var i=a.camelCase(["scroll",g].join("-"));this.$element.one("bsTransitionEnd",a.proxy(h,this)).emulateTransitionEnd(d.TRANSITION_DURATION)[g](this.$element[0][i])}}}},d.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse in").attr("aria-expanded",!1),this.$trigger.addClass("collapsed").attr("aria-expanded",!1),this.transitioning=1;var e=function(){this.transitioning=0,this.$element.removeClass("collapsing").addClass("collapse").trigger("hidden.bs.collapse")};return a.support.transition?void this.$element[c](0).one("bsTransitionEnd",a.proxy(e,this)).emulateTransitionEnd(d.TRANSITION_DURATION):e.call(this)}}},d.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()},d.prototype.getParent=function(){return a(this.options.parent).find('[data-toggle="collapse"][data-parent="'+this.options.parent+'"]').each(a.proxy(function(c,d){var e=a(d);this.addAriaAndCollapsedClass(b(e),e)},this)).end()},d.prototype.addAriaAndCollapsedClass=function(a,b){var c=a.hasClass("in");a.attr("aria-expanded",c),b.toggleClass("collapsed",!c).attr("aria-expanded",c)};var e=a.fn.collapse;a.fn.collapse=c,a.fn.collapse.Constructor=d,a.fn.collapse.noConflict=function(){return a.fn.collapse=e,this},a(document).on("click.bs.collapse.data-api",'[data-toggle="collapse"]',function(d){var e=a(this);e.attr("data-target")||d.preventDefault();var f=b(e),g=f.data("bs.collapse"),h=g?"toggle":e.data();c.call(f,h)})}(jQuery),+function(a){"use strict";function b(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#[A-Za-z]/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}function c(c){c&&3===c.which||(a(e).remove(),a(f).each(function(){var d=a(this),e=b(d),f={relatedTarget:this};e.hasClass("open")&&(c&&"click"==c.type&&/input|textarea/i.test(c.target.tagName)&&a.contains(e[0],c.target)||(e.trigger(c=a.Event("hide.bs.dropdown",f)),c.isDefaultPrevented()||(d.attr("aria-expanded","false"),e.removeClass("open").trigger(a.Event("hidden.bs.dropdown",f)))))}))}function d(b){return this.each(function(){var c=a(this),d=c.data("bs.dropdown");d||c.data("bs.dropdown",d=new g(this)),"string"==typeof b&&d[b].call(c)})}var e=".dropdown-backdrop",f='[data-toggle="dropdown"]',g=function(b){a(b).on("click.bs.dropdown",this.toggle)};g.VERSION="3.3.7",g.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=b(e),g=f.hasClass("open");if(c(),!g){"ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(document.createElement("div")).addClass("dropdown-backdrop").insertAfter(a(this)).on("click",c);var h={relatedTarget:this};if(f.trigger(d=a.Event("show.bs.dropdown",h)),d.isDefaultPrevented())return;e.trigger("focus").attr("aria-expanded","true"),f.toggleClass("open").trigger(a.Event("shown.bs.dropdown",h))}return!1}},g.prototype.keydown=function(c){if(/(38|40|27|32)/.test(c.which)&&!/input|textarea/i.test(c.target.tagName)){var d=a(this);if(c.preventDefault(),c.stopPropagation(),!d.is(".disabled, :disabled")){var e=b(d),g=e.hasClass("open");if(!g&&27!=c.which||g&&27==c.which)return 27==c.which&&e.find(f).trigger("focus"),d.trigger("click");var h=" li:not(.disabled):visible a",i=e.find(".dropdown-menu"+h);if(i.length){var j=i.index(c.target);38==c.which&&j>0&&j--,40==c.which&&jdocument.documentElement.clientHeight;this.$element.css({paddingLeft:!this.bodyIsOverflowing&&a?this.scrollbarWidth:"",paddingRight:this.bodyIsOverflowing&&!a?this.scrollbarWidth:""})},c.prototype.resetAdjustments=function(){this.$element.css({paddingLeft:"",paddingRight:""})},c.prototype.checkScrollbar=function(){var a=window.innerWidth;if(!a){var b=document.documentElement.getBoundingClientRect();a=b.right-Math.abs(b.left)}this.bodyIsOverflowing=document.body.clientWidth
          ',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);if(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())return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null,a.$element=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;!e&&/destroy|hide/.test(b)||(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.7",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.7",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.7",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return e=a-d&&"bottom"},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); diff --git a/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/js/npm.js b/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/js/npm.js new file mode 100644 index 0000000..81f0121 --- /dev/null +++ b/passuser/src/main/resources/META-INF/resources/style/bootstrap-3.3.7-dist/js/npm.js @@ -0,0 +1,13 @@ +// This file is autogenerated via the `commonjs` Grunt task. You can require() this file in a CommonJS environment. +require('../../js/transition.js') +require('../../js/alert.js') +require('../../js/button.js') +require('../../js/carousel.js') +require('../../js/collapse.js') +require('../../js/dropdown.js') +require('../../js/modal.js') +require('../../js/tooltip.js') +require('../../js/popover.js') +require('../../js/scrollspy.js') +require('../../js/tab.js') +require('../../js/affix.js') diff --git a/passuser/src/main/resources/META-INF/resources/style/css/animation_intro.css b/passuser/src/main/resources/META-INF/resources/style/css/animation_intro.css new file mode 100644 index 0000000..55eb5f2 --- /dev/null +++ b/passuser/src/main/resources/META-INF/resources/style/css/animation_intro.css @@ -0,0 +1,173 @@ +body{ + background-color:#FFFFF0; +} + +.head{ + + width:100%; + height:43px; + background-color:rgba(0,139,139,0.8); +} + +.user{ + color:white; + float:right; + letter-spacing:10px; + margin-right:100px; +} + +.nav a{ + text-decoration: none; + color:white; + margin-left:70px; + letter-spacing:10px; + cursor:hand; + float:left + +} + +.wrapper { + width: 950px; + margin: 0 auto; +} + +html h1 { + margin-top:40px; + font-size: 26px; +} + +h1 { + word-wrap: break-word; + display: block; + font-size: 25px; + font-weight: bold; + color: #494949; + margin: 0; + padding: 0 0 15px 0; + line-height: 1.1; +} + +.pic{ + margin: 3px 0 0 0; + float: left; + text-align: center; + margin: 3px 12px 0 0; + max-width: 155px; + overflow: hidden; +} + +.info { + float: left; + max-width: 248px; + word-wrap: break-word; + max-width: 333px; +} + +.info a { + color: #37a; + text-decoration: none; +} + +.score{ + margin-left:180px; + float: left; + width: 155px; + padding: 0 0 0 15px; + border-left: 1px solid #eaeaea; +} + +.rating_num{ + color:#494949; + padding: 0; + min-width: 30%; + font-size: 28px; +} + +.star{ + margin-left:30px; + float: left; + width: 155px; +} + +.mark{ + margin-top:220px; +} + +.introduce{ + float: left; + margin-top:20px; + width:950px; +} + +.introduce span{ + color:#007722; + font-size:17px; +} + +.introduce p{ + text-indent: 2em; + word-break: normal; + color:#111111; + font-size:14px; +} + +.protagonist p{ + margin:0; + +} + +.protagonist img{ + margin-left:2em; + +} + + +.recom{ + float: left; + margin-top:20px; + width:950px; +} + +.recom span{ + color:#007722; + font-size:17px; +} + +.recommend{ + float: left; + margin-top:20px; + width:950px; + height:300px; +} + +.rem_pos1{ + margin-left:0px; + float: left; + width: 120px; +} + +.rem_pos{ + margin-left:40px; + float: left; + width: 120px; + padding: 0 0 0 15px; +} + +.rem_pos a{ + color:#111111; + text-decoration: none; +} + +.rem_pos1 a{ + color:#111111; + text-decoration: none; +} + + + + + + + + + diff --git a/passuser/src/main/resources/META-INF/resources/style/css/article.css b/passuser/src/main/resources/META-INF/resources/style/css/article.css new file mode 100644 index 0000000..851af22 --- /dev/null +++ b/passuser/src/main/resources/META-INF/resources/style/css/article.css @@ -0,0 +1,71 @@ +@charset "UTF-8"; + +body{ + background-color:#FFFFF0; +} + +.mid_bg{ + + margin-left: 180px; + width:70%; + height:100%; +} + +.head{ + width:100%; + height:43px; + background-color:rgba(0,139,139,0.8); +} + +.nav a{ + text-decoration: none; + color:white; + margin-left:70px; + letter-spacing:10px; + cursor:hand; + float:left +} + +.user{ + color:white; + float:right; + letter-spacing:10px; + margin-right:100px; +} + +p{ + margin-left:20px; + line-height:50px; + font-size:17px; + +} + + + +.last{ + margin-left:200px; + +} + +.next{ + margin-left:400px; + +} + + + + + + + + + + + + + + + + + + diff --git a/passuser/src/main/resources/META-INF/resources/style/css/book_intro.css b/passuser/src/main/resources/META-INF/resources/style/css/book_intro.css new file mode 100644 index 0000000..f0cf642 --- /dev/null +++ b/passuser/src/main/resources/META-INF/resources/style/css/book_intro.css @@ -0,0 +1,162 @@ +body{ + background-color:#FFFFF0; +} + +.head{ + + width:100%; + height:43px; + background-color:rgba(0,139,139,0.8); +} + +.user{ + color:white; + float:right; + letter-spacing:10px; + margin-right:100px; +} + +.nav a{ + text-decoration: none; + color:white; + margin-left:70px; + letter-spacing:10px; + cursor:hand; + float:left + +} + +.wrapper { + width: 950px; + margin: 0 auto; +} + +html h1 { + margin-top:40px; + font-size: 26px; +} + +h1 { + word-wrap: break-word; + display: block; + font-size: 25px; + font-weight: bold; + color: #494949; + margin: 0; + padding: 0 0 15px 0; + line-height: 1.1; +} + +.pic{ + margin: 3px 0 0 0; + float: left; + text-align: center; + margin: 3px 12px 0 0; + max-width: 155px; + overflow: hidden; +} + +.info { + float: left; + max-width: 248px; + word-wrap: break-word; + max-width: 333px; +} + +.info a { + color: #37a; + text-decoration: none; +} + +.score{ + margin-left:180px; + float: left; + width: 155px; + padding: 0 0 0 15px; + border-left: 1px solid #eaeaea; +} + +.rating_num{ + color:#494949; + padding: 0; + min-width: 30%; + font-size: 28px; +} + +.star{ + margin-left:30px; + float: left; + width: 155px; +} + +.mark{ + margin-top:220px; +} + +.introduce{ + float: left; + margin-top:20px; + width:950px; +} + +.introduce span{ + color:#007722; + font-size:17px; +} + +.introduce p{ + text-indent: 2em; + word-break: normal; + color:#111111; + font-size:14px; +} + +.recom{ + float: left; + margin-top:20px; + width:950px; +} + +.recom span{ + color:#007722; + font-size:17px; +} + +.recommend{ + float: left; + margin-top:20px; + width:950px; + height:300px; +} + +.rem_pos1{ + margin-left:0px; + float: left; + width: 120px; +} + +.rem_pos{ + margin-left:40px; + float: left; + width: 120px; + padding: 0 0 0 15px; +} + +.rem_pos a{ + color:#111111; + text-decoration: none; +} + +.rem_pos1 a{ + color:#111111; + text-decoration: none; +} + + + + + + + + + diff --git a/passuser/src/main/resources/META-INF/resources/style/css/comic_intro.css b/passuser/src/main/resources/META-INF/resources/style/css/comic_intro.css new file mode 100644 index 0000000..f0cf642 --- /dev/null +++ b/passuser/src/main/resources/META-INF/resources/style/css/comic_intro.css @@ -0,0 +1,162 @@ +body{ + background-color:#FFFFF0; +} + +.head{ + + width:100%; + height:43px; + background-color:rgba(0,139,139,0.8); +} + +.user{ + color:white; + float:right; + letter-spacing:10px; + margin-right:100px; +} + +.nav a{ + text-decoration: none; + color:white; + margin-left:70px; + letter-spacing:10px; + cursor:hand; + float:left + +} + +.wrapper { + width: 950px; + margin: 0 auto; +} + +html h1 { + margin-top:40px; + font-size: 26px; +} + +h1 { + word-wrap: break-word; + display: block; + font-size: 25px; + font-weight: bold; + color: #494949; + margin: 0; + padding: 0 0 15px 0; + line-height: 1.1; +} + +.pic{ + margin: 3px 0 0 0; + float: left; + text-align: center; + margin: 3px 12px 0 0; + max-width: 155px; + overflow: hidden; +} + +.info { + float: left; + max-width: 248px; + word-wrap: break-word; + max-width: 333px; +} + +.info a { + color: #37a; + text-decoration: none; +} + +.score{ + margin-left:180px; + float: left; + width: 155px; + padding: 0 0 0 15px; + border-left: 1px solid #eaeaea; +} + +.rating_num{ + color:#494949; + padding: 0; + min-width: 30%; + font-size: 28px; +} + +.star{ + margin-left:30px; + float: left; + width: 155px; +} + +.mark{ + margin-top:220px; +} + +.introduce{ + float: left; + margin-top:20px; + width:950px; +} + +.introduce span{ + color:#007722; + font-size:17px; +} + +.introduce p{ + text-indent: 2em; + word-break: normal; + color:#111111; + font-size:14px; +} + +.recom{ + float: left; + margin-top:20px; + width:950px; +} + +.recom span{ + color:#007722; + font-size:17px; +} + +.recommend{ + float: left; + margin-top:20px; + width:950px; + height:300px; +} + +.rem_pos1{ + margin-left:0px; + float: left; + width: 120px; +} + +.rem_pos{ + margin-left:40px; + float: left; + width: 120px; + padding: 0 0 0 15px; +} + +.rem_pos a{ + color:#111111; + text-decoration: none; +} + +.rem_pos1 a{ + color:#111111; + text-decoration: none; +} + + + + + + + + + diff --git a/passuser/src/main/resources/META-INF/resources/style/css/game_intro.css b/passuser/src/main/resources/META-INF/resources/style/css/game_intro.css new file mode 100644 index 0000000..f0cf642 --- /dev/null +++ b/passuser/src/main/resources/META-INF/resources/style/css/game_intro.css @@ -0,0 +1,162 @@ +body{ + background-color:#FFFFF0; +} + +.head{ + + width:100%; + height:43px; + background-color:rgba(0,139,139,0.8); +} + +.user{ + color:white; + float:right; + letter-spacing:10px; + margin-right:100px; +} + +.nav a{ + text-decoration: none; + color:white; + margin-left:70px; + letter-spacing:10px; + cursor:hand; + float:left + +} + +.wrapper { + width: 950px; + margin: 0 auto; +} + +html h1 { + margin-top:40px; + font-size: 26px; +} + +h1 { + word-wrap: break-word; + display: block; + font-size: 25px; + font-weight: bold; + color: #494949; + margin: 0; + padding: 0 0 15px 0; + line-height: 1.1; +} + +.pic{ + margin: 3px 0 0 0; + float: left; + text-align: center; + margin: 3px 12px 0 0; + max-width: 155px; + overflow: hidden; +} + +.info { + float: left; + max-width: 248px; + word-wrap: break-word; + max-width: 333px; +} + +.info a { + color: #37a; + text-decoration: none; +} + +.score{ + margin-left:180px; + float: left; + width: 155px; + padding: 0 0 0 15px; + border-left: 1px solid #eaeaea; +} + +.rating_num{ + color:#494949; + padding: 0; + min-width: 30%; + font-size: 28px; +} + +.star{ + margin-left:30px; + float: left; + width: 155px; +} + +.mark{ + margin-top:220px; +} + +.introduce{ + float: left; + margin-top:20px; + width:950px; +} + +.introduce span{ + color:#007722; + font-size:17px; +} + +.introduce p{ + text-indent: 2em; + word-break: normal; + color:#111111; + font-size:14px; +} + +.recom{ + float: left; + margin-top:20px; + width:950px; +} + +.recom span{ + color:#007722; + font-size:17px; +} + +.recommend{ + float: left; + margin-top:20px; + width:950px; + height:300px; +} + +.rem_pos1{ + margin-left:0px; + float: left; + width: 120px; +} + +.rem_pos{ + margin-left:40px; + float: left; + width: 120px; + padding: 0 0 0 15px; +} + +.rem_pos a{ + color:#111111; + text-decoration: none; +} + +.rem_pos1 a{ + color:#111111; + text-decoration: none; +} + + + + + + + + + diff --git a/passuser/src/main/resources/META-INF/resources/style/css/index.css b/passuser/src/main/resources/META-INF/resources/style/css/index.css new file mode 100644 index 0000000..86add55 --- /dev/null +++ b/passuser/src/main/resources/META-INF/resources/style/css/index.css @@ -0,0 +1,117 @@ +@charset "UTF-8"; + +body + { + background-image:url('../image/angel.jpg'); + background-repeat:no-repeat; + background-position:center; + } + + +.head{ + width:100%; + height:43px; + background-color:rgba(0,139,139,0.8); + +} + +.user{ + color:white; + float:right; + letter-spacing:10px; + margin-right:100px; +} + +.nav a{ + text-decoration: none; + color:white; + margin-left:70px; + letter-spacing:10px; + cursor:hand; + float:left +} + + +.column{ + margin-top: 60px; + margin-left: 60px; + position: fixed; + width:260px; + height:430px; + background-color:rgba(240,248,255,0.8); + border:2px solid #C0C0C0; + border-radius: 5px; +} + +.round_icon{ + width:90px; + height: 90px; + display: flex; + border-radius: 100%; + border:3px solid #F0F8FF; + overflow: hidden; + margin: 0 auto; +} + +.column a{ + color:black; + margin-left:20px; + cursor:hand; + float:left +} + +.blog_pub{ + margin-top: 60px; + margin-left: 460px; + width: 845px; + height: 100px; + background-color:white; +} + +.but{ + top: 30px; + margin-left: 1210px; + width: 100px; + height:40px; + background-color:white; + +} + +.content_pos{ + margin-top: 30px; + margin-left: 460px; +} + + +.content{ + top: 90px; + width:850px; + height:100px; + background-color:rgba(255,255,255,0.6); + border-radius: 10px; +} + + +p{ + margin-left:20px; + line-height:50px; + font-size:18px; +} + + + + + + + + + + + + + + + + + + diff --git a/passuser/src/main/resources/META-INF/resources/style/css/jquery-1.10.2.min.js b/passuser/src/main/resources/META-INF/resources/style/css/jquery-1.10.2.min.js new file mode 100644 index 0000000..51aa758 --- /dev/null +++ b/passuser/src/main/resources/META-INF/resources/style/css/jquery-1.10.2.min.js @@ -0,0 +1,23 @@ +/* NUGET: BEGIN LICENSE TEXT + * + * Microsoft grants you the right to use these script files for the sole + * purpose of either: (i) interacting through your browser with the Microsoft + * website or online service, subject to the applicable licensing or use + * terms; or (ii) using the files as included with a Microsoft product subject + * to that product's license terms. Microsoft reserves all other rights to the + * files not expressly granted by Microsoft, whether by implication, estoppel + * or otherwise. Insofar as a script file is dual licensed under GPL, + * Microsoft neither took the code under GPL nor distributes it thereunder but + * under the terms set out in this paragraph. All notices and licenses + * below are for informational purposes only. + * + * JQUERY CORE 1.10.2; Copyright 2005, 2013 jQuery Foundation, Inc. and other contributors; http://jquery.org/license + * Includes Sizzle.js; Copyright 2013 jQuery Foundation, Inc. and other contributors; http://opensource.org/licenses/MIT + * + * NUGET: END LICENSE TEXT */ +/*! jQuery v1.10.2 | (c) 2005, 2013 jQuery Foundation, Inc. | jquery.org/license +//@ sourceMappingURL=jquery-1.10.2.min.map +*/ +(function(e,t){var n,r,i=typeof t,o=e.location,a=e.document,s=a.documentElement,l=e.jQuery,u=e.$,c={},p=[],f="1.10.2",d=p.concat,h=p.push,g=p.slice,m=p.indexOf,y=c.toString,v=c.hasOwnProperty,b=f.trim,x=function(e,t){return new x.fn.init(e,t,r)},w=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,T=/\S+/g,C=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,k=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,E=/^[\],:{}\s]*$/,S=/(?:^|:|,)(?:\s*\[)+/g,A=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,j=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,D=/^-ms-/,L=/-([\da-z])/gi,H=function(e,t){return t.toUpperCase()},q=function(e){(a.addEventListener||"load"===e.type||"complete"===a.readyState)&&(_(),x.ready())},_=function(){a.addEventListener?(a.removeEventListener("DOMContentLoaded",q,!1),e.removeEventListener("load",q,!1)):(a.detachEvent("onreadystatechange",q),e.detachEvent("onload",q))};x.fn=x.prototype={jquery:f,constructor:x,init:function(e,n,r){var i,o;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof x?n[0]:n,x.merge(this,x.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:a,!0)),k.test(i[1])&&x.isPlainObject(n))for(i in n)x.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(o=a.getElementById(i[2]),o&&o.parentNode){if(o.id!==i[2])return r.find(e);this.length=1,this[0]=o}return this.context=a,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):x.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),x.makeArray(e,this))},selector:"",length:0,toArray:function(){return g.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=x.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return x.each(this,e,t)},ready:function(e){return x.ready.promise().done(e),this},slice:function(){return this.pushStack(g.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(x.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:h,sort:[].sort,splice:[].splice},x.fn.init.prototype=x.fn,x.extend=x.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},l=1,u=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},l=2),"object"==typeof s||x.isFunction(s)||(s={}),u===l&&(s=this,--l);u>l;l++)if(null!=(o=arguments[l]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(x.isPlainObject(r)||(n=x.isArray(r)))?(n?(n=!1,a=e&&x.isArray(e)?e:[]):a=e&&x.isPlainObject(e)?e:{},s[i]=x.extend(c,a,r)):r!==t&&(s[i]=r));return s},x.extend({expando:"jQuery"+(f+Math.random()).replace(/\D/g,""),noConflict:function(t){return e.$===x&&(e.$=u),t&&e.jQuery===x&&(e.jQuery=l),x},isReady:!1,readyWait:1,holdReady:function(e){e?x.readyWait++:x.ready(!0)},ready:function(e){if(e===!0?!--x.readyWait:!x.isReady){if(!a.body)return setTimeout(x.ready);x.isReady=!0,e!==!0&&--x.readyWait>0||(n.resolveWith(a,[x]),x.fn.trigger&&x(a).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===x.type(e)},isArray:Array.isArray||function(e){return"array"===x.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?c[y.call(e)]||"object":typeof e},isPlainObject:function(e){var n;if(!e||"object"!==x.type(e)||e.nodeType||x.isWindow(e))return!1;try{if(e.constructor&&!v.call(e,"constructor")&&!v.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(r){return!1}if(x.support.ownLast)for(n in e)return v.call(e,n);for(n in e);return n===t||v.call(e,n)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||a;var r=k.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=x.buildFragment([e],t,i),i&&x(i).remove(),x.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=x.trim(n),n&&E.test(n.replace(A,"@").replace(j,"]").replace(S,"")))?Function("return "+n)():(x.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||x.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&x.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(D,"ms-").replace(L,H)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:b&&!b.call("\ufeff\u00a0")?function(e){return null==e?"":b.call(e)}:function(e){return null==e?"":(e+"").replace(C,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?x.merge(n,"string"==typeof e?[e]:e):h.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(m)return m.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return d.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),x.isFunction(e)?(r=g.call(arguments,2),i=function(){return e.apply(n||this,r.concat(g.call(arguments)))},i.guid=e.guid=e.guid||x.guid++,i):t},access:function(e,n,r,i,o,a,s){var l=0,u=e.length,c=null==r;if("object"===x.type(r)){o=!0;for(l in r)x.access(e,n,l,r[l],!0,a,s)}else if(i!==t&&(o=!0,x.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(x(e),n)})),n))for(;u>l;l++)n(e[l],r,s?i:i.call(e[l],l,n(e[l],r)));return o?e:c?n.call(e):u?n(e[0],r):a},now:function(){return(new Date).getTime()},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),x.ready.promise=function(t){if(!n)if(n=x.Deferred(),"complete"===a.readyState)setTimeout(x.ready);else if(a.addEventListener)a.addEventListener("DOMContentLoaded",q,!1),e.addEventListener("load",q,!1);else{a.attachEvent("onreadystatechange",q),e.attachEvent("onload",q);var r=!1;try{r=null==e.frameElement&&a.documentElement}catch(i){}r&&r.doScroll&&function o(){if(!x.isReady){try{r.doScroll("left")}catch(e){return setTimeout(o,50)}_(),x.ready()}}()}return n.promise(t)},x.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){c["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=x.type(e);return x.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=x(a),function(e,t){var n,r,i,o,a,s,l,u,c,p,f,d,h,g,m,y,v,b="sizzle"+-new Date,w=e.document,T=0,C=0,N=st(),k=st(),E=st(),S=!1,A=function(e,t){return e===t?(S=!0,0):0},j=typeof t,D=1<<31,L={}.hasOwnProperty,H=[],q=H.pop,_=H.push,M=H.push,O=H.slice,F=H.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},B="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",P="[\\x20\\t\\r\\n\\f]",R="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",W=R.replace("w","w#"),$="\\["+P+"*("+R+")"+P+"*(?:([*^$|!~]?=)"+P+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+W+")|)|)"+P+"*\\]",I=":("+R+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+$.replace(3,8)+")*)|.*)\\)|)",z=RegExp("^"+P+"+|((?:^|[^\\\\])(?:\\\\.)*)"+P+"+$","g"),X=RegExp("^"+P+"*,"+P+"*"),U=RegExp("^"+P+"*([>+~]|"+P+")"+P+"*"),V=RegExp(P+"*[+~]"),Y=RegExp("="+P+"*([^\\]'\"]*)"+P+"*\\]","g"),J=RegExp(I),G=RegExp("^"+W+"$"),Q={ID:RegExp("^#("+R+")"),CLASS:RegExp("^\\.("+R+")"),TAG:RegExp("^("+R.replace("w","w*")+")"),ATTR:RegExp("^"+$),PSEUDO:RegExp("^"+I),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+P+"*(even|odd|(([+-]|)(\\d*)n|)"+P+"*(?:([+-]|)"+P+"*(\\d+)|))"+P+"*\\)|)","i"),bool:RegExp("^(?:"+B+")$","i"),needsContext:RegExp("^"+P+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+P+"*((?:-\\d)?\\d*)"+P+"*\\)|)(?=[^-]|$)","i")},K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,et=/^(?:input|select|textarea|button)$/i,tt=/^h\d$/i,nt=/'|\\/g,rt=RegExp("\\\\([\\da-f]{1,6}"+P+"?|("+P+")|.)","ig"),it=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:0>r?String.fromCharCode(r+65536):String.fromCharCode(55296|r>>10,56320|1023&r)};try{M.apply(H=O.call(w.childNodes),w.childNodes),H[w.childNodes.length].nodeType}catch(ot){M={apply:H.length?function(e,t){_.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function at(e,t,n,i){var o,a,s,l,u,c,d,m,y,x;if((t?t.ownerDocument||t:w)!==f&&p(t),t=t||f,n=n||[],!e||"string"!=typeof e)return n;if(1!==(l=t.nodeType)&&9!==l)return[];if(h&&!i){if(o=Z.exec(e))if(s=o[1]){if(9===l){if(a=t.getElementById(s),!a||!a.parentNode)return n;if(a.id===s)return n.push(a),n}else if(t.ownerDocument&&(a=t.ownerDocument.getElementById(s))&&v(t,a)&&a.id===s)return n.push(a),n}else{if(o[2])return M.apply(n,t.getElementsByTagName(e)),n;if((s=o[3])&&r.getElementsByClassName&&t.getElementsByClassName)return M.apply(n,t.getElementsByClassName(s)),n}if(r.qsa&&(!g||!g.test(e))){if(m=d=b,y=t,x=9===l&&e,1===l&&"object"!==t.nodeName.toLowerCase()){c=mt(e),(d=t.getAttribute("id"))?m=d.replace(nt,"\\$&"):t.setAttribute("id",m),m="[id='"+m+"'] ",u=c.length;while(u--)c[u]=m+yt(c[u]);y=V.test(e)&&t.parentNode||t,x=c.join(",")}if(x)try{return M.apply(n,y.querySelectorAll(x)),n}catch(T){}finally{d||t.removeAttribute("id")}}}return kt(e.replace(z,"$1"),t,n,i)}function st(){var e=[];function t(n,r){return e.push(n+=" ")>o.cacheLength&&delete t[e.shift()],t[n]=r}return t}function lt(e){return e[b]=!0,e}function ut(e){var t=f.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function ct(e,t){var n=e.split("|"),r=e.length;while(r--)o.attrHandle[n[r]]=t}function pt(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||D)-(~e.sourceIndex||D);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function ft(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function dt(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function ht(e){return lt(function(t){return t=+t,lt(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}s=at.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},r=at.support={},p=at.setDocument=function(e){var n=e?e.ownerDocument||e:w,i=n.defaultView;return n!==f&&9===n.nodeType&&n.documentElement?(f=n,d=n.documentElement,h=!s(n),i&&i.attachEvent&&i!==i.top&&i.attachEvent("onbeforeunload",function(){p()}),r.attributes=ut(function(e){return e.className="i",!e.getAttribute("className")}),r.getElementsByTagName=ut(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),r.getElementsByClassName=ut(function(e){return e.innerHTML="
          ",e.firstChild.className="i",2===e.getElementsByClassName("i").length}),r.getById=ut(function(e){return d.appendChild(e).id=b,!n.getElementsByName||!n.getElementsByName(b).length}),r.getById?(o.find.ID=function(e,t){if(typeof t.getElementById!==j&&h){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){return e.getAttribute("id")===t}}):(delete o.find.ID,o.filter.ID=function(e){var t=e.replace(rt,it);return function(e){var n=typeof e.getAttributeNode!==j&&e.getAttributeNode("id");return n&&n.value===t}}),o.find.TAG=r.getElementsByTagName?function(e,n){return typeof n.getElementsByTagName!==j?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},o.find.CLASS=r.getElementsByClassName&&function(e,n){return typeof n.getElementsByClassName!==j&&h?n.getElementsByClassName(e):t},m=[],g=[],(r.qsa=K.test(n.querySelectorAll))&&(ut(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||g.push("\\["+P+"*(?:value|"+B+")"),e.querySelectorAll(":checked").length||g.push(":checked")}),ut(function(e){var t=n.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("t",""),e.querySelectorAll("[t^='']").length&&g.push("[*^$]="+P+"*(?:''|\"\")"),e.querySelectorAll(":enabled").length||g.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),g.push(",.*:")})),(r.matchesSelector=K.test(y=d.webkitMatchesSelector||d.mozMatchesSelector||d.oMatchesSelector||d.msMatchesSelector))&&ut(function(e){r.disconnectedMatch=y.call(e,"div"),y.call(e,"[s!='']:x"),m.push("!=",I)}),g=g.length&&RegExp(g.join("|")),m=m.length&&RegExp(m.join("|")),v=K.test(d.contains)||d.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},A=d.compareDocumentPosition?function(e,t){if(e===t)return S=!0,0;var i=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t);return i?1&i||!r.sortDetached&&t.compareDocumentPosition(e)===i?e===n||v(w,e)?-1:t===n||v(w,t)?1:c?F.call(c,e)-F.call(c,t):0:4&i?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return S=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:c?F.call(c,e)-F.call(c,t):0;if(o===a)return pt(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?pt(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},n):f},at.matches=function(e,t){return at(e,null,null,t)},at.matchesSelector=function(e,t){if((e.ownerDocument||e)!==f&&p(e),t=t.replace(Y,"='$1']"),!(!r.matchesSelector||!h||m&&m.test(t)||g&&g.test(t)))try{var n=y.call(e,t);if(n||r.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(i){}return at(t,f,null,[e]).length>0},at.contains=function(e,t){return(e.ownerDocument||e)!==f&&p(e),v(e,t)},at.attr=function(e,n){(e.ownerDocument||e)!==f&&p(e);var i=o.attrHandle[n.toLowerCase()],a=i&&L.call(o.attrHandle,n.toLowerCase())?i(e,n,!h):t;return a===t?r.attributes||!h?e.getAttribute(n):(a=e.getAttributeNode(n))&&a.specified?a.value:null:a},at.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},at.uniqueSort=function(e){var t,n=[],i=0,o=0;if(S=!r.detectDuplicates,c=!r.sortStable&&e.slice(0),e.sort(A),S){while(t=e[o++])t===e[o]&&(i=n.push(o));while(i--)e.splice(n[i],1)}return e},a=at.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=a(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=a(t);return n},o=at.selectors={cacheLength:50,createPseudo:lt,match:Q,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(rt,it),e[3]=(e[4]||e[5]||"").replace(rt,it),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||at.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&at.error(e[0]),e},PSEUDO:function(e){var n,r=!e[5]&&e[2];return Q.CHILD.test(e[0])?null:(e[3]&&e[4]!==t?e[2]=e[4]:r&&J.test(r)&&(n=mt(r,!0))&&(n=r.indexOf(")",r.length-n)-r.length)&&(e[0]=e[0].slice(0,n),e[2]=r.slice(0,n)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(rt,it).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=N[e+" "];return t||(t=RegExp("(^|"+P+")"+e+"("+P+"|$)"))&&N(e,function(e){return t.test("string"==typeof e.className&&e.className||typeof e.getAttribute!==j&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=at.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,l){var u,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!l&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[b]||(m[b]={}),u=c[e]||[],d=u[0]===T&&u[1],f=u[0]===T&&u[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[T,d,f];break}}else if(v&&(u=(t[b]||(t[b]={}))[e])&&u[0]===T)f=u[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[b]||(p[b]={}))[e]=[T,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=o.pseudos[e]||o.setFilters[e.toLowerCase()]||at.error("unsupported pseudo: "+e);return r[b]?r(t):r.length>1?(n=[e,e,"",t],o.setFilters.hasOwnProperty(e.toLowerCase())?lt(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=F.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:lt(function(e){var t=[],n=[],r=l(e.replace(z,"$1"));return r[b]?lt(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:lt(function(e){return function(t){return at(e,t).length>0}}),contains:lt(function(e){return function(t){return(t.textContent||t.innerText||a(t)).indexOf(e)>-1}}),lang:lt(function(e){return G.test(e||"")||at.error("unsupported lang: "+e),e=e.replace(rt,it).toLowerCase(),function(t){var n;do if(n=h?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===d},focus:function(e){return e===f.activeElement&&(!f.hasFocus||f.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!o.pseudos.empty(e)},header:function(e){return tt.test(e.nodeName)},input:function(e){return et.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:ht(function(){return[0]}),last:ht(function(e,t){return[t-1]}),eq:ht(function(e,t,n){return[0>n?n+t:n]}),even:ht(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:ht(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:ht(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:ht(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}},o.pseudos.nth=o.pseudos.eq;for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})o.pseudos[n]=ft(n);for(n in{submit:!0,reset:!0})o.pseudos[n]=dt(n);function gt(){}gt.prototype=o.filters=o.pseudos,o.setFilters=new gt;function mt(e,t){var n,r,i,a,s,l,u,c=k[e+" "];if(c)return t?0:c.slice(0);s=e,l=[],u=o.preFilter;while(s){(!n||(r=X.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),l.push(i=[])),n=!1,(r=U.exec(s))&&(n=r.shift(),i.push({value:n,type:r[0].replace(z," ")}),s=s.slice(n.length));for(a in o.filter)!(r=Q[a].exec(s))||u[a]&&!(r=u[a](r))||(n=r.shift(),i.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?at.error(e):k(e,l).slice(0)}function yt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function vt(e,t,n){var r=t.dir,o=n&&"parentNode"===r,a=C++;return t.first?function(t,n,i){while(t=t[r])if(1===t.nodeType||o)return e(t,n,i)}:function(t,n,s){var l,u,c,p=T+" "+a;if(s){while(t=t[r])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[r])if(1===t.nodeType||o)if(c=t[b]||(t[b]={}),(u=c[r])&&u[0]===p){if((l=u[1])===!0||l===i)return l===!0}else if(u=c[r]=[p],u[1]=e(t,n,s)||i,u[1]===!0)return!0}}function bt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function xt(e,t,n,r,i){var o,a=[],s=0,l=e.length,u=null!=t;for(;l>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),u&&t.push(s));return a}function wt(e,t,n,r,i,o){return r&&!r[b]&&(r=wt(r)),i&&!i[b]&&(i=wt(i,o)),lt(function(o,a,s,l){var u,c,p,f=[],d=[],h=a.length,g=o||Nt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:xt(g,f,e,s,l),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,l),r){u=xt(y,d),r(u,[],s,l),c=u.length;while(c--)(p=u[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){u=[],c=y.length;while(c--)(p=y[c])&&u.push(m[c]=p);i(null,y=[],u,l)}c=y.length;while(c--)(p=y[c])&&(u=i?F.call(o,p):f[c])>-1&&(o[u]=!(a[u]=p))}}else y=xt(y===a?y.splice(h,y.length):y),i?i(null,a,y,l):M.apply(a,y)})}function Tt(e){var t,n,r,i=e.length,a=o.relative[e[0].type],s=a||o.relative[" "],l=a?1:0,c=vt(function(e){return e===t},s,!0),p=vt(function(e){return F.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==u)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;i>l;l++)if(n=o.relative[e[l].type])f=[vt(bt(f),n)];else{if(n=o.filter[e[l].type].apply(null,e[l].matches),n[b]){for(r=++l;i>r;r++)if(o.relative[e[r].type])break;return wt(l>1&&bt(f),l>1&&yt(e.slice(0,l-1).concat({value:" "===e[l-2].type?"*":""})).replace(z,"$1"),n,r>l&&Tt(e.slice(l,r)),i>r&&Tt(e=e.slice(r)),i>r&&yt(e))}f.push(n)}return bt(f)}function Ct(e,t){var n=0,r=t.length>0,a=e.length>0,s=function(s,l,c,p,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,C=u,N=s||a&&o.find.TAG("*",d&&l.parentNode||l),k=T+=null==C?1:Math.random()||.1;for(w&&(u=l!==f&&l,i=n);null!=(h=N[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,l,c)){p.push(h);break}w&&(T=k,i=++n)}r&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,r&&b!==v){g=0;while(m=t[g++])m(x,y,l,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=q.call(p));y=xt(y)}M.apply(p,y),w&&!s&&y.length>0&&v+t.length>1&&at.uniqueSort(p)}return w&&(T=k,u=C),x};return r?lt(s):s}l=at.compile=function(e,t){var n,r=[],i=[],o=E[e+" "];if(!o){t||(t=mt(e)),n=t.length;while(n--)o=Tt(t[n]),o[b]?r.push(o):i.push(o);o=E(e,Ct(i,r))}return o};function Nt(e,t,n){var r=0,i=t.length;for(;i>r;r++)at(e,t[r],n);return n}function kt(e,t,n,i){var a,s,u,c,p,f=mt(e);if(!i&&1===f.length){if(s=f[0]=f[0].slice(0),s.length>2&&"ID"===(u=s[0]).type&&r.getById&&9===t.nodeType&&h&&o.relative[s[1].type]){if(t=(o.find.ID(u.matches[0].replace(rt,it),t)||[])[0],!t)return n;e=e.slice(s.shift().value.length)}a=Q.needsContext.test(e)?0:s.length;while(a--){if(u=s[a],o.relative[c=u.type])break;if((p=o.find[c])&&(i=p(u.matches[0].replace(rt,it),V.test(s[0].type)&&t.parentNode||t))){if(s.splice(a,1),e=i.length&&yt(s),!e)return M.apply(n,i),n;break}}}return l(e,f)(i,t,!h,n,V.test(e)),n}r.sortStable=b.split("").sort(A).join("")===b,r.detectDuplicates=S,p(),r.sortDetached=ut(function(e){return 1&e.compareDocumentPosition(f.createElement("div"))}),ut(function(e){return e.innerHTML="
          ","#"===e.firstChild.getAttribute("href")})||ct("type|href|height|width",function(e,n,r){return r?t:e.getAttribute(n,"type"===n.toLowerCase()?1:2)}),r.attributes&&ut(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||ct("value",function(e,n,r){return r||"input"!==e.nodeName.toLowerCase()?t:e.defaultValue}),ut(function(e){return null==e.getAttribute("disabled")})||ct(B,function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&i.specified?i.value:e[n]===!0?n.toLowerCase():null}),x.find=at,x.expr=at.selectors,x.expr[":"]=x.expr.pseudos,x.unique=at.uniqueSort,x.text=at.getText,x.isXMLDoc=at.isXML,x.contains=at.contains}(e);var O={};function F(e){var t=O[e]={};return x.each(e.match(T)||[],function(e,n){t[n]=!0}),t}x.Callbacks=function(e){e="string"==typeof e?O[e]||F(e):x.extend({},e);var n,r,i,o,a,s,l=[],u=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=l.length,n=!0;l&&o>a;a++)if(l[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,l&&(u?u.length&&c(u.shift()):r?l=[]:p.disable())},p={add:function(){if(l){var t=l.length;(function i(t){x.each(t,function(t,n){var r=x.type(n);"function"===r?e.unique&&p.has(n)||l.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=l.length:r&&(s=t,c(r))}return this},remove:function(){return l&&x.each(arguments,function(e,t){var r;while((r=x.inArray(t,l,r))>-1)l.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?x.inArray(e,l)>-1:!(!l||!l.length)},empty:function(){return l=[],o=0,this},disable:function(){return l=u=r=t,this},disabled:function(){return!l},lock:function(){return u=t,r||p.disable(),this},locked:function(){return!u},fireWith:function(e,t){return!l||i&&!u||(t=t||[],t=[e,t.slice?t.slice():t],n?u.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},x.extend({Deferred:function(e){var t=[["resolve","done",x.Callbacks("once memory"),"resolved"],["reject","fail",x.Callbacks("once memory"),"rejected"],["notify","progress",x.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return x.Deferred(function(n){x.each(t,function(t,o){var a=o[0],s=x.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&x.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?x.extend(e,r):r}},i={};return r.pipe=r.then,x.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=g.call(arguments),r=n.length,i=1!==r||e&&x.isFunction(e.promise)?r:0,o=1===i?e:x.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?g.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,l,u;if(r>1)for(s=Array(r),l=Array(r),u=Array(r);r>t;t++)n[t]&&x.isFunction(n[t].promise)?n[t].promise().done(a(t,u,n)).fail(o.reject).progress(a(t,l,s)):--i;return i||o.resolveWith(u,n),o.promise()}}),x.support=function(t){var n,r,o,s,l,u,c,p,f,d=a.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="
          a",n=d.getElementsByTagName("*")||[],r=d.getElementsByTagName("a")[0],!r||!r.style||!n.length)return t;s=a.createElement("select"),u=s.appendChild(a.createElement("option")),o=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t.getSetAttribute="t"!==d.className,t.leadingWhitespace=3===d.firstChild.nodeType,t.tbody=!d.getElementsByTagName("tbody").length,t.htmlSerialize=!!d.getElementsByTagName("link").length,t.style=/top/.test(r.getAttribute("style")),t.hrefNormalized="/a"===r.getAttribute("href"),t.opacity=/^0.5/.test(r.style.opacity),t.cssFloat=!!r.style.cssFloat,t.checkOn=!!o.value,t.optSelected=u.selected,t.enctype=!!a.createElement("form").enctype,t.html5Clone="<:nav>"!==a.createElement("nav").cloneNode(!0).outerHTML,t.inlineBlockNeedsLayout=!1,t.shrinkWrapBlocks=!1,t.pixelPosition=!1,t.deleteExpando=!0,t.noCloneEvent=!0,t.reliableMarginRight=!0,t.boxSizingReliable=!0,o.checked=!0,t.noCloneChecked=o.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!u.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}o=a.createElement("input"),o.setAttribute("value",""),t.input=""===o.getAttribute("value"),o.value="t",o.setAttribute("type","radio"),t.radioValue="t"===o.value,o.setAttribute("checked","t"),o.setAttribute("name","t"),l=a.createDocumentFragment(),l.appendChild(o),t.appendChecked=o.checked,t.checkClone=l.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip;for(f in x(t))break;return t.ownLast="0"!==f,x(function(){var n,r,o,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",l=a.getElementsByTagName("body")[0];l&&(n=a.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",l.appendChild(n).appendChild(d),d.innerHTML="
          t
          ",o=d.getElementsByTagName("td"),o[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===o[0].offsetHeight,o[0].style.display="",o[1].style.display="none",t.reliableHiddenOffsets=p&&0===o[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",x.swap(l,null!=l.style.zoom?{zoom:1}:{},function(){t.boxSizing=4===d.offsetWidth}),e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(a.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="
          ",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(l.style.zoom=1)),l.removeChild(n),n=d=o=r=null)}),n=s=l=u=r=o=null,t +}({});var B=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,P=/([A-Z])/g;function R(e,n,r,i){if(x.acceptData(e)){var o,a,s=x.expando,l=e.nodeType,u=l?x.cache:e,c=l?e[s]:e[s]&&s;if(c&&u[c]&&(i||u[c].data)||r!==t||"string"!=typeof n)return c||(c=l?e[s]=p.pop()||x.guid++:s),u[c]||(u[c]=l?{}:{toJSON:x.noop}),("object"==typeof n||"function"==typeof n)&&(i?u[c]=x.extend(u[c],n):u[c].data=x.extend(u[c].data,n)),a=u[c],i||(a.data||(a.data={}),a=a.data),r!==t&&(a[x.camelCase(n)]=r),"string"==typeof n?(o=a[n],null==o&&(o=a[x.camelCase(n)])):o=a,o}}function W(e,t,n){if(x.acceptData(e)){var r,i,o=e.nodeType,a=o?x.cache:e,s=o?e[x.expando]:x.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){x.isArray(t)?t=t.concat(x.map(t,x.camelCase)):t in r?t=[t]:(t=x.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;while(i--)delete r[t[i]];if(n?!I(r):!x.isEmptyObject(r))return}(n||(delete a[s].data,I(a[s])))&&(o?x.cleanData([e],!0):x.support.deleteExpando||a!=a.window?delete a[s]:a[s]=null)}}}x.extend({cache:{},noData:{applet:!0,embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?x.cache[e[x.expando]]:e[x.expando],!!e&&!I(e)},data:function(e,t,n){return R(e,t,n)},removeData:function(e,t){return W(e,t)},_data:function(e,t,n){return R(e,t,n,!0)},_removeData:function(e,t){return W(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&x.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),x.fn.extend({data:function(e,n){var r,i,o=null,a=0,s=this[0];if(e===t){if(this.length&&(o=x.data(s),1===s.nodeType&&!x._data(s,"parsedAttrs"))){for(r=s.attributes;r.length>a;a++)i=r[a].name,0===i.indexOf("data-")&&(i=x.camelCase(i.slice(5)),$(s,i,o[i]));x._data(s,"parsedAttrs",!0)}return o}return"object"==typeof e?this.each(function(){x.data(this,e)}):arguments.length>1?this.each(function(){x.data(this,e,n)}):s?$(s,e,x.data(s,e)):null},removeData:function(e){return this.each(function(){x.removeData(this,e)})}});function $(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(P,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:B.test(r)?x.parseJSON(r):r}catch(o){}x.data(e,n,r)}else r=t}return r}function I(e){var t;for(t in e)if(("data"!==t||!x.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}x.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=x._data(e,n),r&&(!i||x.isArray(r)?i=x._data(e,n,x.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=x.queue(e,t),r=n.length,i=n.shift(),o=x._queueHooks(e,t),a=function(){x.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return x._data(e,n)||x._data(e,n,{empty:x.Callbacks("once memory").add(function(){x._removeData(e,t+"queue"),x._removeData(e,n)})})}}),x.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?x.queue(this[0],e):n===t?this:this.each(function(){var t=x.queue(this,e,n);x._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&x.dequeue(this,e)})},dequeue:function(e){return this.each(function(){x.dequeue(this,e)})},delay:function(e,t){return e=x.fx?x.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=x.Deferred(),a=this,s=this.length,l=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=x._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(l));return l(),o.promise(n)}});var z,X,U=/[\t\r\n\f]/g,V=/\r/g,Y=/^(?:input|select|textarea|button|object)$/i,J=/^(?:a|area)$/i,G=/^(?:checked|selected)$/i,Q=x.support.getSetAttribute,K=x.support.input;x.fn.extend({attr:function(e,t){return x.access(this,x.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){x.removeAttr(this,e)})},prop:function(e,t){return x.access(this,x.prop,e,t,arguments.length>1)},removeProp:function(e){return e=x.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,l="string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).addClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=x.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,l=0===arguments.length||"string"==typeof e&&e;if(x.isFunction(e))return this.each(function(t){x(this).removeClass(e.call(this,t,this.className))});if(l)for(t=(e||"").match(T)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(U," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?x.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):x.isFunction(e)?this.each(function(n){x(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var t,r=0,o=x(this),a=e.match(T)||[];while(t=a[r++])o.hasClass(t)?o.removeClass(t):o.addClass(t)}else(n===i||"boolean"===n)&&(this.className&&x._data(this,"__className__",this.className),this.className=this.className||e===!1?"":x._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(U," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=x.isFunction(e),this.each(function(n){var o;1===this.nodeType&&(o=i?e.call(this,n,x(this).val()):e,null==o?o="":"number"==typeof o?o+="":x.isArray(o)&&(o=x.map(o,function(e){return null==e?"":e+""})),r=x.valHooks[this.type]||x.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=x.valHooks[o.type]||x.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(V,""):null==n?"":n)}}}),x.extend({valHooks:{option:{get:function(e){var t=x.find.attr(e,"value");return null!=t?t:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,l=0>i?s:o?i:0;for(;s>l;l++)if(n=r[l],!(!n.selected&&l!==i||(x.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&x.nodeName(n.parentNode,"optgroup"))){if(t=x(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n,r,i=e.options,o=x.makeArray(t),a=i.length;while(a--)r=i[a],(r.selected=x.inArray(x(r).val(),o)>=0)&&(n=!0);return n||(e.selectedIndex=-1),o}}},attr:function(e,n,r){var o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return typeof e.getAttribute===i?x.prop(e,n,r):(1===s&&x.isXMLDoc(e)||(n=n.toLowerCase(),o=x.attrHooks[n]||(x.expr.match.bool.test(n)?X:z)),r===t?o&&"get"in o&&null!==(a=o.get(e,n))?a:(a=x.find.attr(e,n),null==a?t:a):null!==r?o&&"set"in o&&(a=o.set(e,r,n))!==t?a:(e.setAttribute(n,r+""),r):(x.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(T);if(o&&1===e.nodeType)while(n=o[i++])r=x.propFix[n]||n,x.expr.match.bool.test(n)?K&&Q||!G.test(n)?e[r]=!1:e[x.camelCase("default-"+n)]=e[r]=!1:x.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!x.support.radioValue&&"radio"===t&&x.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},propFix:{"for":"htmlFor","class":"className"},prop:function(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!x.isXMLDoc(e),a&&(n=x.propFix[n]||n,o=x.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var t=x.find.attr(e,"tabindex");return t?parseInt(t,10):Y.test(e.nodeName)||J.test(e.nodeName)&&e.href?0:-1}}}}),X={set:function(e,t,n){return t===!1?x.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&x.propFix[n]||n,n):e[x.camelCase("default-"+n)]=e[n]=!0,n}},x.each(x.expr.match.bool.source.match(/\w+/g),function(e,n){var r=x.expr.attrHandle[n]||x.find.attr;x.expr.attrHandle[n]=K&&Q||!G.test(n)?function(e,n,i){var o=x.expr.attrHandle[n],a=i?t:(x.expr.attrHandle[n]=t)!=r(e,n,i)?n.toLowerCase():null;return x.expr.attrHandle[n]=o,a}:function(e,n,r){return r?t:e[x.camelCase("default-"+n)]?n.toLowerCase():null}}),K&&Q||(x.attrHooks.value={set:function(e,n,r){return x.nodeName(e,"input")?(e.defaultValue=n,t):z&&z.set(e,n,r)}}),Q||(z={set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},x.expr.attrHandle.id=x.expr.attrHandle.name=x.expr.attrHandle.coords=function(e,n,r){var i;return r?t:(i=e.getAttributeNode(n))&&""!==i.value?i.value:null},x.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&r.specified?r.value:t},set:z.set},x.attrHooks.contenteditable={set:function(e,t,n){z.set(e,""===t?!1:t,n)}},x.each(["width","height"],function(e,n){x.attrHooks[n]={set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}}})),x.support.hrefNormalized||x.each(["href","src"],function(e,t){x.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),x.support.style||(x.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),x.support.optSelected||(x.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}}),x.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){x.propFix[this.toLowerCase()]=this}),x.support.enctype||(x.propFix.enctype="encoding"),x.each(["radio","checkbox"],function(){x.valHooks[this]={set:function(e,n){return x.isArray(n)?e.checked=x.inArray(x(e).val(),n)>=0:t}},x.support.checkOn||(x.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}function at(){try{return a.activeElement}catch(e){}}x.event={global:{},add:function(e,n,r,o,a){var s,l,u,c,p,f,d,h,g,m,y,v=x._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=x.guid++),(l=v.events)||(l=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof x===i||e&&x.event.triggered===e.type?t:x.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(T)||[""],u=n.length;while(u--)s=rt.exec(n[u])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),g&&(p=x.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=x.event.special[g]||{},d=x.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&x.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=l[g])||(h=l[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),x.event.global[g]=!0);e=null}},remove:function(e,t,n,r,i){var o,a,s,l,u,c,p,f,d,h,g,m=x.hasData(e)&&x._data(e);if(m&&(c=m.events)){t=(t||"").match(T)||[""],u=t.length;while(u--)if(s=rt.exec(t[u])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=x.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),l=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));l&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||x.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)x.event.remove(e,d+t[u],n,r,!0);x.isEmptyObject(c)&&(delete m.handle,x._removeData(e,"events"))}},trigger:function(n,r,i,o){var s,l,u,c,p,f,d,h=[i||a],g=v.call(n,"type")?n.type:n,m=v.call(n,"namespace")?n.namespace.split("."):[];if(u=f=i=i||a,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+x.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),l=0>g.indexOf(":")&&"on"+g,n=n[x.expando]?n:new x.Event(g,"object"==typeof n&&n),n.isTrigger=o?2:3,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:x.makeArray(r,[n]),p=x.event.special[g]||{},o||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!o&&!p.noBubble&&!x.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(u=u.parentNode);u;u=u.parentNode)h.push(u),f=u;f===(i.ownerDocument||a)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((u=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(x._data(u,"events")||{})[n.type]&&x._data(u,"handle"),s&&s.apply(u,r),s=l&&u[l],s&&x.acceptData(u)&&s.apply&&s.apply(u,r)===!1&&n.preventDefault();if(n.type=g,!o&&!n.isDefaultPrevented()&&(!p._default||p._default.apply(h.pop(),r)===!1)&&x.acceptData(i)&&l&&i[g]&&!x.isWindow(i)){f=i[l],f&&(i[l]=null),x.event.triggered=g;try{i[g]()}catch(y){}x.event.triggered=t,f&&(i[l]=f)}return n.result}},dispatch:function(e){e=x.event.fix(e);var n,r,i,o,a,s=[],l=g.call(arguments),u=(x._data(this,"events")||{})[e.type]||[],c=x.event.special[e.type]||{};if(l[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=x.event.handlers.call(this,e,u),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((x.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,l),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],l=n.delegateCount,u=e.target;if(l&&u.nodeType&&(!e.button||"click"!==e.type))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(o=[],a=0;l>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?x(r,this).index(u)>=0:x.find(r,this,null,[u]).length),o[r]&&o.push(i);o.length&&s.push({elem:u,handlers:o})}return n.length>l&&s.push({elem:this,handlers:n.slice(l)}),s},fix:function(e){if(e[x.expando])return e;var t,n,r,i=e.type,o=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new x.Event(o),t=r.length;while(t--)n=r[t],e[n]=o[n];return e.target||(e.target=o.srcElement||a),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,o):e},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,o,s=n.button,l=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||a,o=i.documentElement,r=i.body,e.pageX=n.clientX+(o&&o.scrollLeft||r&&r.scrollLeft||0)-(o&&o.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(o&&o.scrollTop||r&&r.scrollTop||0)-(o&&o.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&l&&(e.relatedTarget=l===e.target?n.toElement:l),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},focus:{trigger:function(){if(this!==at()&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===at()&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},click:{trigger:function(){return x.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t},_default:function(e){return x.nodeName(e.target,"a")}},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=x.extend(new x.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?x.event.trigger(i,null,t):x.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},x.removeEvent=a.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},x.Event=function(e,n){return this instanceof x.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&x.extend(this,n),this.timeStamp=e&&e.timeStamp||x.now(),this[x.expando]=!0,t):new x.Event(e,n)},x.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},x.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){x.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj;return(!i||i!==r&&!x.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),x.support.submitBubbles||(x.event.special.submit={setup:function(){return x.nodeName(this,"form")?!1:(x.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=x.nodeName(n,"input")||x.nodeName(n,"button")?n.form:t;r&&!x._data(r,"submitBubbles")&&(x.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),x._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&x.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return x.nodeName(this,"form")?!1:(x.event.remove(this,"._submit"),t)}}),x.support.changeBubbles||(x.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(x.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),x.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),x.event.simulate("change",this,e,!0)})),!1):(x.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!x._data(t,"changeBubbles")&&(x.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||x.event.simulate("change",this.parentNode,e,!0)}),x._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return x.event.remove(this,"._change"),!Z.test(this.nodeName)}}),x.support.focusinBubbles||x.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){x.event.simulate(t,e.target,x.event.fix(e),!0)};x.event.special[t]={setup:function(){0===n++&&a.addEventListener(e,r,!0)},teardown:function(){0===--n&&a.removeEventListener(e,r,!0)}}}),x.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return x().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=x.guid++)),this.each(function(){x.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,x(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){x.event.remove(this,e,r,n)})},trigger:function(e,t){return this.each(function(){x.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?x.event.trigger(e,n,r,!0):t}});var st=/^.[^:#\[\.,]*$/,lt=/^(?:parents|prev(?:Until|All))/,ut=x.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};x.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(x(e).filter(function(){for(t=0;i>t;t++)if(x.contains(r[t],this))return!0}));for(t=0;i>t;t++)x.find(e,r[t],n);return n=this.pushStack(i>1?x.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},has:function(e){var t,n=x(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(x.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e||[],!0))},filter:function(e){return this.pushStack(ft(this,e||[],!1))},is:function(e){return!!ft(this,"string"==typeof e&&ut.test(e)?x(e):e||[],!1).length},closest:function(e,t){var n,r=0,i=this.length,o=[],a=ut.test(e)||"string"!=typeof e?x(e,t||this.context):0;for(;i>r;r++)for(n=this[r];n&&n!==t;n=n.parentNode)if(11>n.nodeType&&(a?a.index(n)>-1:1===n.nodeType&&x.find.matchesSelector(n,e))){n=o.push(n);break}return this.pushStack(o.length>1?x.unique(o):o)},index:function(e){return e?"string"==typeof e?x.inArray(this[0],x(e)):x.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?x(e,t):x.makeArray(e&&e.nodeType?[e]:e),r=x.merge(this.get(),n);return this.pushStack(x.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}});function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}x.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return x.dir(e,"parentNode")},parentsUntil:function(e,t,n){return x.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return x.dir(e,"nextSibling")},prevAll:function(e){return x.dir(e,"previousSibling")},nextUntil:function(e,t,n){return x.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return x.dir(e,"previousSibling",n)},siblings:function(e){return x.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return x.sibling(e.firstChild)},contents:function(e){return x.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:x.merge([],e.childNodes)}},function(e,t){x.fn[e]=function(n,r){var i=x.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=x.filter(r,i)),this.length>1&&(ct[e]||(i=x.unique(i)),lt.test(e)&&(i=i.reverse())),this.pushStack(i)}}),x.extend({filter:function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?x.find.matchesSelector(r,e)?[r]:[]:x.find.matches(e,x.grep(t,function(e){return 1===e.nodeType}))},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!x(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(x.isFunction(t))return x.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return x.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(st.test(t))return x.filter(t,e,n);t=x.filter(t,e)}return x.grep(e,function(e){return x.inArray(e,t)>=0!==n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/\s*$/g,At={option:[1,""],legend:[1,"
          ","
          "],area:[1,"",""],param:[1,"",""],thead:[1,"","
          "],tr:[2,"","
          "],col:[2,"","
          "],td:[3,"","
          "],_default:x.support.htmlSerialize?[0,"",""]:[1,"X
          ","
          "]},jt=dt(a),Dt=jt.appendChild(a.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,x.fn.extend({text:function(e){return x.access(this,function(e){return e===t?x.text(this):this.empty().append((this[0]&&this[0].ownerDocument||a).createTextNode(e))},null,e,arguments.length)},append:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.appendChild(e)}})},prepend:function(){return this.domManip(arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=Lt(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=e?x.filter(e,this):this,i=0;for(;null!=(n=r[i]);i++)t||1!==n.nodeType||x.cleanData(Ft(n)),n.parentNode&&(t&&x.contains(n.ownerDocument,n)&&_t(Ft(n,"script")),n.parentNode.removeChild(n));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&x.cleanData(Ft(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&x.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return x.clone(this,e,t)})},html:function(e){return x.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!x.support.htmlSerialize&&mt.test(e)||!x.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(x.cleanData(Ft(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(){var e=x.map(this,function(e){return[e.nextSibling,e.parentNode]}),t=0;return this.domManip(arguments,function(n){var r=e[t++],i=e[t++];i&&(r&&r.parentNode!==i&&(r=this.nextSibling),x(this).remove(),i.insertBefore(n,r))},!0),t?this:this.remove()},detach:function(e){return this.remove(e,!0)},domManip:function(e,t,n){e=d.apply([],e);var r,i,o,a,s,l,u=0,c=this.length,p=this,f=c-1,h=e[0],g=x.isFunction(h);if(g||!(1>=c||"string"!=typeof h||x.support.checkClone)&&Nt.test(h))return this.each(function(r){var i=p.eq(r);g&&(e[0]=h.call(this,r,i.html())),i.domManip(e,t,n)});if(c&&(l=x.buildFragment(e,this[0].ownerDocument,!1,!n&&this),r=l.firstChild,1===l.childNodes.length&&(l=r),r)){for(a=x.map(Ft(l,"script"),Ht),o=a.length;c>u;u++)i=l,u!==f&&(i=x.clone(i,!0,!0),o&&x.merge(a,Ft(i,"script"))),t.call(this[u],i,u);if(o)for(s=a[a.length-1].ownerDocument,x.map(a,qt),u=0;o>u;u++)i=a[u],kt.test(i.type||"")&&!x._data(i,"globalEval")&&x.contains(s,i)&&(i.src?x._evalUrl(i.src):x.globalEval((i.text||i.textContent||i.innerHTML||"").replace(St,"")));l=r=null}return this}});function Lt(e,t){return x.nodeName(e,"table")&&x.nodeName(1===t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function Ht(e){return e.type=(null!==x.find.attr(e,"type"))+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function _t(e,t){var n,r=0;for(;null!=(n=e[r]);r++)x._data(n,"globalEval",!t||x._data(t[r],"globalEval"))}function Mt(e,t){if(1===t.nodeType&&x.hasData(e)){var n,r,i,o=x._data(e),a=x._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)x.event.add(t,n,s[n][r])}a.data&&(a.data=x.extend({},a.data))}}function Ot(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!x.support.noCloneEvent&&t[x.expando]){i=x._data(t);for(r in i.events)x.removeEvent(t,r,i.handle);t.removeAttribute(x.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),x.support.html5Clone&&e.innerHTML&&!x.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Ct.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}x.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){x.fn[e]=function(e){var n,r=0,i=[],o=x(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),x(o[r])[t](n),h.apply(i,n.get());return this.pushStack(i)}});function Ft(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||x.nodeName(o,n)?s.push(o):x.merge(s,Ft(o,n));return n===t||n&&x.nodeName(e,n)?x.merge([e],s):s}function Bt(e){Ct.test(e.type)&&(e.defaultChecked=e.checked)}x.extend({clone:function(e,t,n){var r,i,o,a,s,l=x.contains(e.ownerDocument,e);if(x.support.html5Clone||x.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(x.support.noCloneEvent&&x.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||x.isXMLDoc(e)))for(r=Ft(o),s=Ft(e),a=0;null!=(i=s[a]);++a)r[a]&&Ot(i,r[a]);if(t)if(n)for(s=s||Ft(e),r=r||Ft(o),a=0;null!=(i=s[a]);a++)Mt(i,r[a]);else Mt(e,o);return r=Ft(o,"script"),r.length>0&&_t(r,!l&&Ft(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,l,u,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===x.type(o))x.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),l=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[l]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!x.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!x.support.tbody){o="table"!==l||xt.test(o)?""!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)x.nodeName(u=o.childNodes[i],"tbody")&&!u.childNodes.length&&o.removeChild(u)}x.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),x.support.appendChecked||x.grep(Ft(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===x.inArray(o,r))&&(a=x.contains(o.ownerDocument,o),s=Ft(f.appendChild(o),"script"),a&&_t(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,l=x.expando,u=x.cache,c=x.support.deleteExpando,f=x.event.special;for(;null!=(n=e[s]);s++)if((t||x.acceptData(n))&&(o=n[l],a=o&&u[o])){if(a.events)for(r in a.events)f[r]?x.event.remove(n,r):x.removeEvent(n,r,a.handle); +u[o]&&(delete u[o],c?delete n[l]:typeof n.removeAttribute!==i?n.removeAttribute(l):n[l]=null,p.push(o))}},_evalUrl:function(e){return x.ajax({url:e,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0})}}),x.fn.extend({wrapAll:function(e){if(x.isFunction(e))return this.each(function(t){x(this).wrapAll(e.call(this,t))});if(this[0]){var t=x(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return x.isFunction(e)?this.each(function(t){x(this).wrapInner(e.call(this,t))}):this.each(function(){var t=x(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=x.isFunction(e);return this.each(function(n){x(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){x.nodeName(this,"body")||x(this).replaceWith(this.childNodes)}).end()}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+w+")(.*)$","i"),Yt=RegExp("^("+w+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+w+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===x.css(e,"display")||!x.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=x._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=x._data(r,"olddisplay",ln(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&x._data(r,"olddisplay",i?n:x.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}x.fn.extend({css:function(e,n){return x.access(this,function(e,n,r){var i,o,a={},s=0;if(x.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=x.css(e,n[s],!1,o);return a}return r!==t?x.style(e,n,r):x.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){nn(this)?x(this).show():x(this).hide()})}}),x.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":x.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,l=x.camelCase(n),u=e.style;if(n=x.cssProps[l]||(x.cssProps[l]=tn(u,l)),s=x.cssHooks[n]||x.cssHooks[l],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:u[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(x.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||x.cssNumber[l]||(r+="px"),x.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(u[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{u[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,l=x.camelCase(n);return n=x.cssProps[l]||(x.cssProps[l]=tn(e.style,l)),s=x.cssHooks[n]||x.cssHooks[l],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||x.isNumeric(o)?o||0:a):a}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s.getPropertyValue(n)||s[n]:t,u=e.style;return s&&(""!==l||x.contains(e.ownerDocument,e)||(l=x.style(e,n)),Yt.test(l)&&Ut.test(n)&&(i=u.width,o=u.minWidth,a=u.maxWidth,u.minWidth=u.maxWidth=u.width=l,l=s.width,u.width=i,u.minWidth=o,u.maxWidth=a)),l}):a.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),l=s?s[n]:t,u=e.style;return null==l&&u&&u[n]&&(l=u[n]),Yt.test(l)&&!zt.test(n)&&(i=u.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),u.left="fontSize"===n?"1em":l,l=u.pixelLeft+"px",u.left=i,a&&(o.left=a)),""===l?"auto":l});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=x.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=x.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=x.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=x.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=x.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=x.support.boxSizing&&"border-box"===x.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(x.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function ln(e){var t=a,n=Gt[e];return n||(n=un(e,t),"none"!==n&&n||(Pt=(Pt||x("'; + parent.$('.J_mainContent').find('iframe.J_iframe').hide().parents('.J_mainContent').append(iframeContent); + parent.MyCrontab.scrollToTab($('.J_menuTab.active')); + } + } +}; diff --git a/passuser/src/main/resources/static/js/common/ajax-object.js b/passuser/src/main/resources/static/js/common/ajax-object.js new file mode 100644 index 0000000..d3b88c0 --- /dev/null +++ b/passuser/src/main/resources/static/js/common/ajax-object.js @@ -0,0 +1,66 @@ +(function () { + var $ax = function (url, success, error) { + this.url = url; + this.type = "post"; + this.data = {}; + this.dataType = "json"; + this.async = false; + this.success = success; + this.error = error; + }; + + $ax.prototype = { + start : function () { + var me = this; + + if (this.url.indexOf("?") == -1) { + this.url = this.url + "?jstime=" + new Date().getTime(); + } else { + this.url = this.url + "&jstime=" + new Date().getTime(); + } + + $.ajax({ + type: this.type, + url: this.url, + dataType: this.dataType, + async: this.async, + data: this.data, + beforeSend: function(data) { + + }, + success: function(data) { + me.success(data); + }, + error: function(data) { + me.error(data); + } + }); + }, + + set : function (key, value) { + if (typeof key == "object") { + for (var i in key) { + if (typeof i == "function") + continue; + this.data[i] = key[i]; + } + } else { + this.data[key] = (typeof value == "undefined") ? $("#" + key).val() : value; + } + return this; + }, + + setData : function(data){ + this.data = data; + return this; + }, + + clear : function () { + this.data = {}; + return this; + } + }; + + window.$ax = $ax; + +} ()); \ No newline at end of file diff --git a/passuser/src/main/resources/static/js/common/bootstrap-table-object.js b/passuser/src/main/resources/static/js/common/bootstrap-table-object.js new file mode 100644 index 0000000..46a33e8 --- /dev/null +++ b/passuser/src/main/resources/static/js/common/bootstrap-table-object.js @@ -0,0 +1,134 @@ +/** + * 初始化 BootStrap Table 的封装 + * + * 约定:toolbar的id为 (bstableId + "Toolbar") + * + * @author fengshuonan + */ +(function () { + var BSTable = function (bstableId, url, columns) { + this.btInstance = null; //jquery和BootStrapTable绑定的对象 + this.bstableId = bstableId; + this.url = Feng.ctxPath + url; + this.method = "post"; + this.paginationType = "server"; //默认分页方式是服务器分页,可选项"client" + this.toolbarId = bstableId + "Toolbar"; + this.columns = columns; + this.height = 665; //默认表格高度665 + this.data = {}; + this.queryParams = {}; // 向后台传递的自定义参数 + }; + + BSTable.prototype = { + /** + * 初始化bootstrap table + */ + init: function () { + var tableId = this.bstableId; + var me = this; + this.btInstance = + $('#' + tableId).bootstrapTable({ + contentType: "application/x-www-form-urlencoded", + url: this.url, //请求地址 + method: this.method, //ajax方式,post还是get + ajaxOptions: { //ajax请求的附带参数 + data: this.data + }, + toolbar: "#" + this.toolbarId,//顶部工具条 + striped: true, //是否显示行间隔色 + cache: false, //是否使用缓存,默认为true + pagination: true, //是否显示分页(*) + sortable: true, //是否启用排序 + sortOrder: "desc", //排序方式 + pageNumber: 1, //初始化加载第一页,默认第一页 + pageSize: 14, //每页的记录行数(*) + pageList: [14, 50, 100], //可供选择的每页的行数(*) + queryParamsType: 'limit', //默认值为 'limit' ,在默认情况下 传给服务端的参数为:offset,limit,sort + queryParams: function (param) { + return $.extend(me.queryParams, param); + }, // 向后台传递的自定义参数 + sidePagination: this.paginationType, //分页方式:client客户端分页,server服务端分页(*) + search: false, //是否显示表格搜索,此搜索是客户端搜索,不会进服务端 + strictSearch: true, //设置为 true启用 全匹配搜索,否则为模糊搜索 + showColumns: true, //是否显示所有的列 + showRefresh: true, //是否显示刷新按钮 + minimumCountColumns: 2, //最少允许的列数 + clickToSelect: true, //是否启用点击选中行 + searchOnEnterKey: true, //设置为 true时,按回车触发搜索方法,否则自动触发搜索方法 + columns: this.columns, //列数组 + pagination: true, //是否显示分页条 + height: this.height, + icons: { + refresh: 'glyphicon-repeat', + toggle: 'glyphicon-list-alt', + columns: 'glyphicon-list' + }, + iconSize: 'outline' + }); + return this; + }, + /** + * 向后台传递的自定义参数 + * @param param + */ + setQueryParams: function (param) { + this.queryParams = param; + }, + /** + * 设置分页方式:server 或者 client + */ + setPaginationType: function (type) { + this.paginationType = type; + }, + + /** + * 设置ajax post请求时候附带的参数 + */ + set: function (key, value) { + if (typeof key == "object") { + for (var i in key) { + if (typeof i == "function") + continue; + this.data[i] = key[i]; + } + } else { + this.data[key] = (typeof value == "undefined") ? $("#" + key).val() : value; + } + return this; + }, + + /** + * 设置ajax post请求时候附带的参数 + */ + setData: function (data) { + this.data = data; + return this; + }, + + /** + * 清空ajax post请求参数 + */ + clear: function () { + this.data = {}; + return this; + }, + + /** + * 刷新 bootstrap 表格 + * Refresh the remote server data, + * you can set {silent: true} to refresh the data silently, + * and set {url: newUrl} to change the url. + * To supply query params specific to this request, set {query: {foo: 'bar'}} + */ + refresh: function (parms) { + if (typeof parms != "undefined") { + this.btInstance.bootstrapTable('refresh', parms); + } else { + this.btInstance.bootstrapTable('refresh'); + } + } + }; + + window.BSTable = BSTable; + +}()); \ No newline at end of file diff --git a/passuser/src/main/resources/static/js/common/select-list-object.js b/passuser/src/main/resources/static/js/common/select-list-object.js new file mode 100644 index 0000000..5ef2df1 --- /dev/null +++ b/passuser/src/main/resources/static/js/common/select-list-object.js @@ -0,0 +1,36 @@ +var SelectList = {}; +SelectList.singelSelect = function (eleName, attr, data) { + var result = false; + $("#" + eleName).find("a").each(function (i, d) { + if ($(this).attr(attr) == data) { + if ($(this).hasClass('active')) { + $(this).removeClass('active'); + } else { + $(this).addClass('active'); + result = true; + } + } else { + $(this).removeClass('active'); + } + }); + return result; +}; +SelectList.mutiSelect = function (eleName, attr, data) { + var result = false; + $("#" + eleName).find("a").each(function (i, d) { + if ($(this).attr(attr) == data) { + if ($(this).hasClass('active')) { + $(this).removeClass('active'); + } else { + $(this).addClass('active'); + result = true; + } + } + }); + return result; +}; +SelectList.clearSelect = function (eleName) { + $("#" + eleName).find("a").each(function (i, d) { + $(this).removeClass('active'); + }); +}; \ No newline at end of file diff --git a/passuser/src/main/resources/static/js/common/tree-table-object.js b/passuser/src/main/resources/static/js/common/tree-table-object.js new file mode 100644 index 0000000..a67c6d9 --- /dev/null +++ b/passuser/src/main/resources/static/js/common/tree-table-object.js @@ -0,0 +1,136 @@ +/** + * 初始化 Tree Table 的封装 + * + * @author cyf + */ +(function () { + var BSTreeTable = function (bstableId, url, columns) { + this.btInstance = null; //jquery和bootstrapTreeTable绑定的对象 + this.bstableId = bstableId; + this.url = Feng.ctxPath + url; + this.method = "post"; + this.columns = columns; + this.data = {};// ajax的参数 + this.expandColumn = null;// 展开显示的列 + this.id = 'id';// 选取记录返回的值 + this.code = 'code';// 用于设置父子关系 + this.parentCode = 'pcode';// 用于设置父子关系 + this.expandAll = false;// 是否默认全部展开 + this.toolbarId = bstableId + "Toolbar"; + this.height = 665; //默认表格高度665 + }; + + BSTreeTable.prototype = { + /** + * 初始化bootstrap table + */ + init: function () { + var tableId = this.bstableId; + this.btInstance = + $('#'+tableId).bootstrapTreeTable({ + id: this.id,// 选取记录返回的值 + code: this.code,// 用于设置父子关系 + parentCode: this.parentCode,// 用于设置父子关系 + rootCodeValue: this.rootCodeValue,//设置根节点code值----可指定根节点,默认为null,"",0,"0" + type: this.method, //请求数据的ajax类型 + url: this.url, //请求数据的ajax的url + ajaxParams: this.data, //请求数据的ajax的data属性 + expandColumn: this.expandColumn,//在哪一列上面显示展开按钮,从0开始 + striped: true, //是否各行渐变色 + expandAll: this.expandAll, //是否全部展开 + columns: this.columns, //列数组 + toolbar: "#" + this.toolbarId,//顶部工具条 + height: this.height, + }); + return this; + }, + + /** + * 设置在哪一列上面显示展开按钮,从0开始 + */ + setExpandColumn: function (expandColumn) { + this.expandColumn = expandColumn; + }, + /** + * 设置记录返回的id值 + */ + setIdField: function (id) { + this.id = id; + }, + /** + * 设置记录分级的字段 + */ + setCodeField: function (code) { + this.code = code; + }, + /** + * 设置记录分级的父级字段 + */ + setParentCodeField: function (parentCode) { + this.parentCode = parentCode; + }, + /** + * 设置根节点code值----可指定根节点,默认为null,"",0,"0" + */ + setRootCodeValue: function (rootCodeValue) { + this.rootCodeValue = rootCodeValue; + }, + /** + * 设置是否默认全部展开 + */ + setExpandAll: function (expandAll) { + this.expandAll = expandAll; + }, + /** + * 设置表格高度 + */ + setHeight: function (height) { + this.height = height; + }, + /** + * 设置ajax post请求时候附带的参数 + */ + set: function (key, value) { + if (typeof key == "object") { + for (var i in key) { + if (typeof i == "function") + continue; + this.data[i] = key[i]; + } + } else { + this.data[key] = (typeof value == "undefined") ? $("#" + key).val() : value; + } + return this; + }, + + /** + * 设置ajax post请求时候附带的参数 + */ + setData: function (data) { + this.data = data; + return this; + }, + + /** + * 清空ajax post请求参数 + */ + clear: function () { + this.data = {}; + return this; + }, + + /** + * 刷新表格 + */ + refresh: function (parms) { + if (typeof parms != "undefined") { + this.btInstance.bootstrapTreeTable('refresh', parms.query);// 为了兼容bootstrap-table的写法 + } else { + this.btInstance.bootstrapTreeTable('refresh'); + } + } + }; + + window.BSTreeTable = BSTreeTable; + +}()); \ No newline at end of file diff --git a/passuser/src/main/resources/static/js/common/web-upload-object.js b/passuser/src/main/resources/static/js/common/web-upload-object.js new file mode 100644 index 0000000..5ceded7 --- /dev/null +++ b/passuser/src/main/resources/static/js/common/web-upload-object.js @@ -0,0 +1,126 @@ +/** + * web-upload 工具类 + * + * 约定: + * 上传按钮的id = 图片隐藏域id + 'BtnId' + * 图片预览框的id = 图片隐藏域id + 'PreId' + * + * @author fengshuonan + */ +(function() { + + var $WebUpload = function(pictureId) { + this.pictureId = pictureId; + this.uploadBtnId = pictureId + "BtnId"; + this.uploadPreId = pictureId + "PreId"; + this.uploadUrl = Feng.ctxPath + '/mgr/upload'; + this.fileSizeLimit = 100 * 1024 * 1024; + this.picWidth = 800; + this.picHeight = 800; + this.uploadBarId = null; + }; + + $WebUpload.prototype = { + /** + * 初始化webUploader + */ + init : function() { + var uploader = this.create(); + this.bindEvent(uploader); + return uploader; + }, + + /** + * 创建webuploader对象 + */ + create : function() { + var webUploader = WebUploader.create({ + auto : true, + pick : { + id : '#' + this.uploadBtnId, + multiple : false,// 只上传一个 + }, + accept : { + title : 'Images', + extensions : 'gif,jpg,jpeg,bmp,png', + mimeTypes : 'image/gif,image/jpg,image/jpeg,image/bmp,image/png' + }, + swf : Feng.ctxPath + + '/static/js/plugins/webuploader/Uploader.swf', + disableGlobalDnd : true, + duplicate : true, + server : this.uploadUrl, + fileSingleSizeLimit : this.fileSizeLimit + }); + + return webUploader; + }, + + /** + * 绑定事件 + */ + bindEvent : function(bindedObj) { + var me = this; + bindedObj.on('fileQueued', function(file) { + var $li = $('
          '); + var $img = $li.find('img'); + + $("#" + me.uploadPreId).html($li); + + // 生成缩略图 + bindedObj.makeThumb(file, function(error, src) { + if (error) { + $img.replaceWith('不能预览'); + return; + } + $img.attr('src', src); + }, me.picWidth, me.picHeight); + }); + + // 文件上传过程中创建进度条实时显示。 + bindedObj.on('uploadProgress', function(file, percentage) { + $("#"+me.uploadBarId).css("width",percentage * 100 + "%"); + }); + + // 文件上传成功,给item添加成功class, 用样式标记上传成功。 + bindedObj.on('uploadSuccess', function(file,response) { + Feng.success("上传成功"); + $("#" + me.pictureId).val(response); + }); + + // 文件上传失败,显示上传出错。 + bindedObj.on('uploadError', function(file) { + Feng.error("上传失败"); + }); + + // 其他错误 + bindedObj.on('error', function(type) { + if ("Q_EXCEED_SIZE_LIMIT" == type) { + Feng.error("文件大小超出了限制"); + } else if ("Q_TYPE_DENIED" == type) { + Feng.error("文件类型不满足"); + } else if ("Q_EXCEED_NUM_LIMIT" == type) { + Feng.error("上传数量超过限制"); + } else if ("F_DUPLICATE" == type) { + Feng.error("图片选择重复"); + } else { + Feng.error("上传过程中出错"); + } + }); + + // 完成上传完了,成功或者失败 + bindedObj.on('uploadComplete', function(file) { + }); + }, + + /** + * 设置图片上传的进度条的id + */ + setUploadBarId: function (id) { + this.uploadBarId = id; + } + }; + + window.$WebUpload = $WebUpload; + +}()); \ No newline at end of file diff --git a/passuser/src/main/resources/static/js/common/ztree-object.js b/passuser/src/main/resources/static/js/common/ztree-object.js new file mode 100644 index 0000000..eee6cb2 --- /dev/null +++ b/passuser/src/main/resources/static/js/common/ztree-object.js @@ -0,0 +1,94 @@ +/** + * ztree插件的封装 + */ +(function() { + + var $ZTree = function(id, url) { + this.id = id; + this.url = url; + this.onClick = null; + this.settings = null; + this.ondblclick=null; + }; + + $ZTree.prototype = { + /** + * 初始化ztree的设置 + */ + initSetting : function() { + var settings = { + view : { + dblClickExpand : true, + selectedMulti : false + }, + data : {simpleData : {enable : true}}, + callback : { + onClick : this.onClick, + onDblClick:this.ondblclick + } + }; + return settings; + }, + + /** + * 手动设置ztree的设置 + */ + setSettings : function(val) { + this.settings = val; + }, + + /** + * 初始化ztree + */ + init : function() { + var zNodeSeting = null; + if(this.settings != null){ + zNodeSeting = this.settings; + }else{ + zNodeSeting = this.initSetting(); + } + var zNodes = this.loadNodes(); + $.fn.zTree.init($("#" + this.id), zNodeSeting, zNodes); + }, + + /** + * 绑定onclick事件 + */ + bindOnClick : function(func) { + this.onClick = func; + }, + /** + * 绑定双击事件 + */ + bindOnDblClick : function(func) { + this.ondblclick=func; + }, + + + /** + * 加载节点 + */ + loadNodes : function() { + var zNodes = null; + var ajax = new $ax(Feng.ctxPath + this.url, function(data) { + zNodes = data; + }, function(data) { + Feng.error("加载ztree信息失败!"); + }); + ajax.start(); + return zNodes; + }, + + /** + * 获取选中的值 + */ + getSelectedVal : function(){ + var zTree = $.fn.zTree.getZTreeObj(this.id); + var nodes = zTree.getSelectedNodes(); + return nodes[0].name; + } + }; + + window.$ZTree = $ZTree; + +}()); \ No newline at end of file diff --git a/passuser/src/main/resources/static/js/contabs.js b/passuser/src/main/resources/static/js/contabs.js new file mode 100644 index 0000000..1d4ebde --- /dev/null +++ b/passuser/src/main/resources/static/js/contabs.js @@ -0,0 +1,339 @@ +var MyCrontab = {}; + + +/** + * 滚动到指定选项卡 + */ +MyCrontab.scrollToTab = function (element) { + var marginLeftVal = MyCrontab.calSumWidth($(element).prevAll()), + marginRightVal = MyCrontab.calSumWidth($(element).nextAll()); + // 可视区域非tab宽度 + var tabOuterWidth = MyCrontab.calSumWidth($(".content-tabs").children().not(".J_menuTabs")); + //可视区域tab宽度 + var visibleWidth = $(".content-tabs").outerWidth(true) - tabOuterWidth; + //实际滚动宽度 + var scrollVal = 0; + if ($(".page-tabs-content").outerWidth() < visibleWidth) { + scrollVal = 0; + } else if (marginRightVal <= (visibleWidth - $(element).outerWidth(true) - $(element).next().outerWidth(true))) { + if ((visibleWidth - $(element).next().outerWidth(true)) > marginRightVal) { + scrollVal = marginLeftVal; + var tabElement = element; + while ((scrollVal - $(tabElement).outerWidth()) > ($(".page-tabs-content").outerWidth() - visibleWidth)) { + scrollVal -= $(tabElement).prev().outerWidth(); + tabElement = $(tabElement).prev(); + } + } + } else if (marginLeftVal > (visibleWidth - $(element).outerWidth(true) - $(element).prev().outerWidth(true))) { + scrollVal = marginLeftVal - $(element).prev().outerWidth(true); + } + $('.page-tabs-content').animate({ + marginLeft: 0 - scrollVal + 'px' + }, "fast"); +}; + + +/** + * 计算元素集合的总宽度 + */ +MyCrontab.calSumWidth = function (elements) { + var width = 0; + $(elements).each(function () { + width += $(this).outerWidth(true); + }); + return width; +}; + + +$(function () { + + //计算元素集合的总宽度 + function calSumWidth(elements) { + MyCrontab.calSumWidth(elements); + } + + //滚动到指定选项卡 + function scrollToTab(element) { + MyCrontab.scrollToTab(element); + } + + //查看左侧隐藏的选项卡 + function scrollTabLeft() { + var marginLeftVal = Math.abs(parseInt($('.page-tabs-content').css('margin-left'))); + // 可视区域非tab宽度 + var tabOuterWidth = calSumWidth($(".content-tabs").children().not(".J_menuTabs")); + //可视区域tab宽度 + var visibleWidth = $(".content-tabs").outerWidth(true) - tabOuterWidth; + //实际滚动宽度 + var scrollVal = 0; + if ($(".page-tabs-content").width() < visibleWidth) { + return false; + } else { + var tabElement = $(".J_menuTab:first"); + var offsetVal = 0; + while ((offsetVal + $(tabElement).outerWidth(true)) <= marginLeftVal) {//找到离当前tab最近的元素 + offsetVal += $(tabElement).outerWidth(true); + tabElement = $(tabElement).next(); + } + offsetVal = 0; + if (calSumWidth($(tabElement).prevAll()) > visibleWidth) { + while ((offsetVal + $(tabElement).outerWidth(true)) < (visibleWidth) && tabElement.length > 0) { + offsetVal += $(tabElement).outerWidth(true); + tabElement = $(tabElement).prev(); + } + scrollVal = calSumWidth($(tabElement).prevAll()); + } + } + $('.page-tabs-content').animate({ + marginLeft: 0 - scrollVal + 'px' + }, "fast"); + } + + //查看右侧隐藏的选项卡 + function scrollTabRight() { + var marginLeftVal = Math.abs(parseInt($('.page-tabs-content').css('margin-left'))); + // 可视区域非tab宽度 + var tabOuterWidth = calSumWidth($(".content-tabs").children().not(".J_menuTabs")); + //可视区域tab宽度 + var visibleWidth = $(".content-tabs").outerWidth(true) - tabOuterWidth; + //实际滚动宽度 + var scrollVal = 0; + if ($(".page-tabs-content").width() < visibleWidth) { + return false; + } else { + var tabElement = $(".J_menuTab:first"); + var offsetVal = 0; + while ((offsetVal + $(tabElement).outerWidth(true)) <= marginLeftVal) {//找到离当前tab最近的元素 + offsetVal += $(tabElement).outerWidth(true); + tabElement = $(tabElement).next(); + } + offsetVal = 0; + while ((offsetVal + $(tabElement).outerWidth(true)) < (visibleWidth) && tabElement.length > 0) { + offsetVal += $(tabElement).outerWidth(true); + tabElement = $(tabElement).next(); + } + scrollVal = calSumWidth($(tabElement).prevAll()); + if (scrollVal > 0) { + $('.page-tabs-content').animate({ + marginLeft: 0 - scrollVal + 'px' + }, "fast"); + } + } + } + + //通过遍历给菜单项加上data-index属性 + $(".J_menuItem").each(function (index) { + if (!$(this).attr('data-index')) { + $(this).attr('data-index', index); + } + }); + + function menuItem() { + // 获取标识数据 + var dataUrl = $(this).attr('href'), + dataIndex = $(this).data('index'), + menuName = $.trim($(this).text()), + flag = true; + if (dataUrl == undefined || $.trim(dataUrl).length == 0) return false; + + // 选项卡菜单已存在 + $('.J_menuTab').each(function () { + if ($(this).data('id') == dataUrl) { + if (!$(this).hasClass('active')) { + $(this).addClass('active').siblings('.J_menuTab').removeClass('active'); + scrollToTab(this); + // 显示tab对应的内容区 + $('.J_mainContent .J_iframe').each(function () { + if ($(this).data('id') == dataUrl) { + $(this).show().siblings('.J_iframe').hide(); + $(this).attr('src', $(this).attr('src')); + return false; + } + }); + } + flag = false; + return false; + } + }); + + // 选项卡菜单不存在 + if (flag) { + var str = '' + menuName + ' '; + $('.J_menuTab').removeClass('active'); + + // 添加选项卡对应的iframe + var str1 = ''; + $('.J_mainContent').find('iframe.J_iframe').hide().parents('.J_mainContent').append(str1); + + //显示loading提示 + var loading = layer.load(); + + $('.J_mainContent iframe:visible').load(function () { + //iframe加载完成后隐藏loading提示 + layer.close(loading); + }); + // 添加选项卡 + $('.J_menuTabs .page-tabs-content').append(str); + scrollToTab($('.J_menuTab.active')); + } + return false; + } + + $('.J_menuItem').on('click', menuItem); + + // 关闭选项卡菜单 + function closeTab() { + var closeTabId = $(this).parents('.J_menuTab').data('id'); + var currentWidth = $(this).parents('.J_menuTab').width(); + + // 当前元素处于活动状态 + if ($(this).parents('.J_menuTab').hasClass('active')) { + + // 当前元素后面有同辈元素,使后面的一个元素处于活动状态 + if ($(this).parents('.J_menuTab').next('.J_menuTab').size()) { + + var activeId = $(this).parents('.J_menuTab').next('.J_menuTab:eq(0)').data('id'); + highLightMenuItem(activeId); //高亮对应的tab菜单 + $(this).parents('.J_menuTab').next('.J_menuTab:eq(0)').addClass('active'); + + $('.J_mainContent .J_iframe').each(function () { + if ($(this).data('id') == activeId) { + $(this).show().siblings('.J_iframe').hide(); + return false; + } + }); + + var marginLeftVal = parseInt($('.page-tabs-content').css('margin-left')); + if (marginLeftVal < 0) { + $('.page-tabs-content').animate({ + marginLeft: (marginLeftVal + currentWidth) + 'px' + }, "fast"); + } + + // 移除当前选项卡 + $(this).parents('.J_menuTab').remove(); + + // 移除tab对应的内容区 + $('.J_mainContent .J_iframe').each(function () { + if ($(this).data('id') == closeTabId) { + $(this).remove(); + return false; + } + }); + } + + // 当前元素后面没有同辈元素,使当前元素的上一个元素处于活动状态 + if ($(this).parents('.J_menuTab').prev('.J_menuTab').size()) { + var activeId = $(this).parents('.J_menuTab').prev('.J_menuTab:last').data('id'); + $(this).parents('.J_menuTab').prev('.J_menuTab:last').addClass('active'); + $('.J_mainContent .J_iframe').each(function () { + if ($(this).data('id') == activeId) { + $(this).show().siblings('.J_iframe').hide(); + return false; + } + }); + + // 移除当前选项卡 + $(this).parents('.J_menuTab').remove(); + + // 移除tab对应的内容区 + $('.J_mainContent .J_iframe').each(function () { + if ($(this).data('id') == closeTabId) { + $(this).remove(); + return false; + } + }); + highLightMenuItem(activeId);//高亮对应的tab菜单 + } + } + // 当前元素不处于活动状态 + else { + // 移除当前选项卡 + $(this).parents('.J_menuTab').remove(); + + // 移除相应tab对应的内容区 + $('.J_mainContent .J_iframe').each(function () { + if ($(this).data('id') == closeTabId) { + $(this).remove(); + return false; + } + }); + scrollToTab($('.J_menuTab.active')); + } + return false; + } + + $('.J_menuTabs').on('click', '.J_menuTab i', closeTab); + + //关闭其他选项卡 + function closeOtherTabs() { + $('.page-tabs-content').children("[data-id]").not(":first").not(".active").each(function () { + $('.J_iframe[data-id="' + $(this).data('id') + '"]').remove(); + $(this).remove(); + }); + $('.page-tabs-content').css("margin-left", "0"); + } + + $('.J_tabCloseOther').on('click', closeOtherTabs); + + //滚动到已激活的选项卡 + function showActiveTab() { + scrollToTab($('.J_menuTab.active')); + } + + $('.J_tabShowActive').on('click', showActiveTab); + + + // 点击选项卡菜单 + function activeTab() { + if (!$(this).hasClass('active')) { + var currentId = $(this).data('id'); + highLightMenuItem(currentId); //高亮对应的tab菜单 + // 显示tab对应的内容区 + $('.J_mainContent .J_iframe').each(function () { + if ($(this).data('id') == currentId) { + $(this).show().siblings('.J_iframe').hide(); + return false; + } + }); + $(this).addClass('active').siblings('.J_menuTab').removeClass('active'); + scrollToTab(this); + } + } + + $('.J_menuTabs').on('click', '.J_menuTab', activeTab); + + //刷新iframe + function refreshTab() { + var target = $('.J_iframe[data-id="' + $(this).data('id') + '"]'); + var url = target.attr('src'); + //显示loading提示 + // var loading = layer.load(); + // target.attr('src', url).load(function () { + // //关闭loading提示 + // layer.close(loading); + // }); + } + + $('.J_menuTabs').on('dblclick', '.J_menuTab', refreshTab); + + // 左移按扭 + $('.J_tabLeft').on('click', scrollTabLeft); + + // 右移按扭 + $('.J_tabRight').on('click', scrollTabRight); + + // 关闭全部 + $('.J_tabCloseAll').on('click', function () { + $('.page-tabs-content').children("[data-id]").not(":first").each(function () { + $('.J_iframe[data-id="' + $(this).data('id') + '"]').remove(); + $(this).remove(); + }); + $('.page-tabs-content').children("[data-id]:first").each(function () { + $('.J_iframe[data-id="' + $(this).data('id') + '"]').show(); + $(this).addClass("active"); + }); + $('.page-tabs-content').css("margin-left", "0"); + }); + +}); diff --git a/passuser/src/main/resources/static/js/content.js b/passuser/src/main/resources/static/js/content.js new file mode 100644 index 0000000..8252e9f --- /dev/null +++ b/passuser/src/main/resources/static/js/content.js @@ -0,0 +1,98 @@ +var $parentNode = window.parent.document; + +function $childNode(name) { + return window.frames[name] +} + +// tooltips +$('.tooltip-demo').tooltip({ + selector: "[data-toggle=tooltip]", + container: "body" +}); + +// 使用animation.css修改Bootstrap Modal +$('.modal').appendTo("body"); + +$("[data-toggle=popover]").popover(); + +//折叠ibox +$('.collapse-link').click(function () { + var ibox = $(this).closest('div.ibox'); + var button = $(this).find('i'); + var content = ibox.find('div.ibox-content'); + content.slideToggle(200); + button.toggleClass('fa-chevron-up').toggleClass('fa-chevron-down'); + ibox.toggleClass('').toggleClass('border-bottom'); + setTimeout(function () { + ibox.resize(); + ibox.find('[id^=map-]').resize(); + }, 50); +}); + +//关闭ibox +$('.close-link').click(function () { + var content = $(this).closest('div.ibox'); + content.remove(); +}); + +//判断当前页面是否在iframe中 +if (top == this) { + var gohome = '
          '; + $('body').append(gohome); +} + +//animation.css +function animationHover(element, animation) { + element = $(element); + element.hover( + function () { + element.addClass('animated ' + animation); + }, + function () { + //动画完成之前移除class + window.setTimeout(function () { + element.removeClass('animated ' + animation); + }, 2000); + }); +} + +//拖动面板 +function WinMove() { + var element = "[class*=col]"; + var handle = ".ibox-title"; + var connect = "[class*=col]"; + $(element).sortable({ + handle: handle, + connectWith: connect, + tolerance: 'pointer', + forcePlaceholderSize: true, + opacity: 0.8, + }) + .disableSelection(); +}; + +$(function () { +//初始化下拉框 + var config = { + '.chosen-select': {}, + '.chosen-select-deselect': { + allow_single_deselect: true + }, + '.chosen-select-no-single': { + disable_search_threshold: 10 + }, + '.chosen-select-no-results': { + no_results_text: '没有要显示的数据!' + }, + '.chosen-select-width': { + width: "95%" + } + } + for (var selector in config) { + $(selector).chosen(config[selector]); + } + $('.i-checks').iCheck({ + checkboxClass: 'icheckbox_square-green', + radioClass: 'iradio_square-green', + }); +}); \ No newline at end of file diff --git a/passuser/src/main/resources/static/js/flexpaper.js b/passuser/src/main/resources/static/js/flexpaper.js new file mode 100644 index 0000000..5033b35 --- /dev/null +++ b/passuser/src/main/resources/static/js/flexpaper.js @@ -0,0 +1,471 @@ +/** + The FlexPaper Project + + This file is part of FlexPaper. + + FlexPaper is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, version 3 of the License. + + FlexPaper is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with FlexPaper. If not, see . + + For more information on FlexPaper please see the FlexPaper project + home page: http://flexpaper.devaldi.com + */ + +/** + * + * FlexPaper helper function for retrieving a active FlexPaper instance + * + */ +window.$FlexPaper = window.getDocViewer = window["$FlexPaper"] = function(id){ + var instance = (id==="undefined")?"":id; + + return window["FlexPaperViewer_Instance"+instance].getApi(); +}; + +/** + * + * FlexPaper embedding (name of placeholder, config) + * + */ +window.FlexPaperViewerEmbedding = window.$f = function(id, args) { + var config = args.config; + var _SWFFile,_PDFFile,_IMGFiles,_JSONFile = "",_jsDirectory="",_cssDirectory="",_localeDirectory="";_WMode = (config.WMode!=null||config.wmmode!=null?config.wmmode||config.WMode:"window"); + var _uDoc = ((config.DOC !=null)?unescape(config.DOC):null); + var instance = "FlexPaperViewer_Instance"+((id==="undefined")?"":id); + var _JSONDataType = (config.JSONDataType!=null)?config.JSONDataType:"json"; + if (_uDoc != null) { + _SWFFile = translateUrlByFormat(_uDoc,"swf"); + _PDFFile = translateUrlByFormat(_uDoc,"pdf"); + _JSONFile = translateUrlByFormat(_uDoc,_JSONDataType); + _IMGFiles = translateUrlByFormat(_uDoc,"png"); + } + + _SWFFile = (config.SwfFile!=null?config.SwfFile:_SWFFile); + _SWFFile = (config.SWFFile!=null?config.SWFFile:_SWFFile); + _PDFFile = (config.PDFFile!=null?config.PDFFile:_PDFFile); + _IMGFiles = (config.IMGFiles!=null?config.IMGFiles:_IMGFiles); + _IMGFiles = (config.PageImagePattern!=null?config.PageImagePattern:_IMGFiles); + _JSONFile = (config.JSONFile!=null?config.JSONFile:_JSONFile); + _jsDirectory = (config.jsDirectory!=null?config.jsDirectory:FLEXPAPER.detectjsdir()); + _cssDirectory = (config.cssDirectory!=null?config.cssDirectory:FLEXPAPER.detectcssdir()); + _localeDirectory = (config.localeDirectory!=null?config.localeDirectory:"locale/"); + if(_SWFFile!=null && _SWFFile.indexOf("{" )==0 && _SWFFile.indexOf("[*," ) > 0 && _SWFFile.indexOf("]" ) > 0){_SWFFile = escape(_SWFFile);} // split file fix + window[instance] = flashembed(id, { + src : _jsDirectory+"FlexPaperViewer.swf", + version : [10, 0], + expressInstall : "js/expressinstall.swf", + wmode : _WMode + },{ + ElementId : id, + SwfFile : _SWFFile, + PdfFile : _PDFFile, + IMGFiles : _IMGFiles, + JSONFile : _JSONFile, + useCustomJSONFormat : config.useCustomJSONFormat, + JSONPageDataFormat : config.JSONPageDataFormat, + JSONDataType : _JSONDataType, + Scale : (config.Scale!=null)?config.Scale:0.8, + ZoomTransition : (config.ZoomTransition!=null)?config.ZoomTransition:'easeOut', + ZoomTime : (config.ZoomTime!=null)?config.ZoomTime:0.5, + ZoomInterval : (config.ZoomInterval)?config.ZoomInterval:0.2, + FitPageOnLoad : (config.FitPageOnLoad!=null)?config.FitPageOnLoad:false, + FitWidthOnLoad : (config.FitWidthOnLoad!=null)?config.FitWidthOnLoad:false, + FullScreenAsMaxWindow : (config.FullScreenAsMaxWindow!=null)?config.FullScreenAsMaxWindow:false, + ProgressiveLoading : (config.ProgressiveLoading!=null)?config.ProgressiveLoading:false, + MinZoomSize : (config.MinZoomSize!=null)?config.MinZoomSize:0.2, + MaxZoomSize : (config.MaxZoomSize!=null)?config.MaxZoomSize:5, + SearchMatchAll : (config.SearchMatchAll!=null)?config.SearchMatchAll:false, + SearchServiceUrl : config.SearchServiceUrl, + InitViewMode : config.InitViewMode, + BitmapBasedRendering : (config.BitmapBasedRendering!=null)?config.BitmapBasedRendering:false, + StartAtPage : config.StartAtPage, + PrintPaperAsBitmap : (config.PrintPaperAsBitmap!=null)?config.PrintPaperAsBitmap:false, + AutoAdjustPrintSize : (config.AutoAdjustPrintSize!=null)?config.AutoAdjustPrintSize:false, + + EnableCornerDragging : ((config.EnableCornerDragging!=null)?config.EnableCornerDragging:true), // FlexPaper Zine parameter + BackgroundColor : config.BackgroundColor, // FlexPaper Zine parameter + PanelColor : config.PanelColor, // FlexPaper Zine parameter + BackgroundAlpha : config.BackgroundAlpha, // FlexPaper Zine parameter + UIConfig : config.UIConfig, // FlexPaper Zine parameter + + ViewModeToolsVisible : ((config.ViewModeToolsVisible!=null)?config.ViewModeToolsVisible:true), + ZoomToolsVisible : ((config.ZoomToolsVisible!=null)?config.ZoomToolsVisible:true), + NavToolsVisible : ((config.NavToolsVisible!=null)?config.NavToolsVisible:true), + CursorToolsVisible : ((config.SearchToolsVisible!=null)?config.CursorToolsVisible:true), + SearchToolsVisible : ((config.SearchToolsVisible!=null)?config.SearchToolsVisible:true), + StickyTools : config.StickyTools, + Toolbar : config.Toolbar, + DocSizeQueryService : config.DocSizeQueryService, + + RenderingOrder : config.RenderingOrder, + + localeChain : (config.localeChain!=null)?config.localeChain:"en_US", + jsDirectory : _jsDirectory, + cssDirectory : _cssDirectory, + localeDirectory : _localeDirectory, + key : config.key + }); +}; + +function translateUrlByDocument(url,document){ + return (url!=null && url.indexOf('{doc}') > 0 ? url.replace("{doc}", document):null); +} + +function translateUrlByFormat(url,format){ + if(url.indexOf("{") == 0 && format != "swf"){ // loading in split file mode + url = url.substring(1,url.lastIndexOf(",")); + url = url.replace("[*,0]","{page}") + } + return (url!=null && url.indexOf('{format}') > 0 ? url.replace("{format}", format):null); +} + +/** + * + * FlexPaper embedding functionality. Based on FlashEmbed + * + */ + +(function() { + + var IE = document.all, + URL = 'http://www.adobe.com/go/getflashplayer', + JQUERY = typeof jQuery == 'function', + RE = /(\d+)[^\d]+(\d+)[^\d]*(\d*)/, + MOBILE = (function(){try {return 'ontouchstart' in document.documentElement;} catch (e) {return false;} })(), + GLOBAL_OPTS = { + // very common opts + width: '100%', + height: '100%', + id: "_" + ("" + Math.random()).slice(9), + + // flashembed defaults + allowfullscreen: true, + allowscriptaccess: 'always', + quality: 'high', + allowFullScreenInteractive : true, + + // flashembed specific options + version: [10, 0], + onFail: null, + expressInstall: null, + w3c: false, + cachebusting: false + }; + + window.isTouchScreen = MOBILE; + + if (window.attachEvent) { + window.attachEvent("onbeforeunload", function() { + __flash_unloadHandler = function() {}; + __flash_savedUnloadHandler = function() {}; + }); + } + + // simple extend + function extend(to, from) { + if (from) { + for (var key in from) { + if (from.hasOwnProperty(key)) { + to[key] = from[key]; + } + } + } + return to; + } + + // used by Flash to dispatch a event properly + window.dispatchJQueryEvent = function (elementId,eventName,args){ + jQuery('#'+elementId).trigger(eventName,args); + } + + // used by asString method + function map(arr, func) { + var newArr = []; + for (var i in arr) { + if (arr.hasOwnProperty(i)) { + newArr[i] = func(arr[i]); + } + } + return newArr; + } + + window.flashembed = function(root, opts, conf) { + // root must be found / loaded + if (typeof root == 'string') { + root = document.getElementById(root.replace("#", "")); + } + // not found + if (!root) { return; } + + root.onclick = function(){return false;} + + if (typeof opts == 'string') { + opts = {src: opts}; + } + + return new Flash(root, extend(extend({}, GLOBAL_OPTS), opts), conf); + }; + + // flashembed "static" API + var f = extend(window.flashembed, { + + conf: GLOBAL_OPTS, + + getVersion: function() { + var fo, ver; + + try { + ver = navigator.plugins["Shockwave Flash"].description.slice(16); + } catch(e) { + + try { + fo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7"); + ver = fo && fo.GetVariable("$version"); + + } catch(err) { + try { + fo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6"); + ver = fo && fo.GetVariable("$version"); + } catch(err2) { } + } + } + + ver = RE.exec(ver); + return ver ? [ver[1], ver[3]] : [0, 0]; + }, + + asString: function(obj) { + + if (obj === null || obj === undefined) { return null; } + var type = typeof obj; + if (type == 'object' && obj.push) { type = 'array'; } + + switch (type){ + + case 'string': + obj = obj.replace(new RegExp('(["\\\\])', 'g'), '\\$1'); + + // flash does not handle %- characters well. transforms "50%" to "50pct" (a dirty hack, I admit) + obj = obj.replace(/^\s?(\d+\.?\d+)%/, "$1pct"); + return '"' +obj+ '"'; + + case 'array': + return '['+ map(obj, function(el) { + return f.asString(el); + }).join(',') +']'; + + case 'function': + return '"function()"'; + + case 'object': + var str = []; + for (var prop in obj) { + if (obj.hasOwnProperty(prop)) { + str.push('"'+prop+'":'+ f.asString(obj[prop])); + } + } + return '{'+str.join(',')+'}'; + } + + // replace ' --> " and remove spaces + return String(obj).replace(/\s/g, " ").replace(/\'/g, "\""); + }, + + getHTML: function(opts, conf) { + + opts = extend({}, opts); + opts.id = opts.id + (" " + Math.random()).slice(9); + + /******* OBJECT tag and it's attributes *******/ + var html = ''; + } + + // not allowed params + opts.width = opts.height = opts.id = opts.w3c = opts.src = null; + opts.onFail = opts.version = opts.expressInstall = null; + + for (var key in opts) { + if (opts[key]) { + html += ''; + } + } + + /******* FLASHVARS *******/ + var vars = ""; + + if (conf) { + for (var k in conf) { + if (conf[k] && k!='Toolbar') { + var val = conf[k]; + vars += k +'='+ (/function|object/.test(typeof val) ? f.asString(val) : val) + '&'; + } + } + vars = vars.slice(0, -1); + html += ''; + } + + html += ""; + + return html; + }, + + isSupported: function(ver) { + return VERSION[0] > ver[0] || VERSION[0] == ver[0] && VERSION[1] >= ver[1]; + } + + }); + + var VERSION = f.getVersion(); + + function Flash(root, opts, conf) { + var userAgent = navigator.userAgent.toLowerCase(); + var browser = { + version: (userAgent.match(/.+(?:rv|it|ra|ie)[\/: ]([\d.]+)/) || [])[1], + safari: /webkit/.test(userAgent), + opera: /opera/.test(userAgent), + msie: /msie/.test(userAgent) && !/opera/.test(userAgent), + mozilla: /mozilla/.test(userAgent) && !/(compatible|webkit)/.test(userAgent), + chrome: /chrome/.test(userAgent) + }; + + // Default to a rendering mode if its not set + if(!conf.RenderingOrder && conf.SwfFile != null){conf.RenderingOrder = "flash";} + + // version is ok + if (f.isSupported(opts.version)) { + root.innerHTML = f.getHTML(opts, conf); + // express install + } else if (opts.expressInstall && f.isSupported([6, 65])) { + root.innerHTML = f.getHTML(extend(opts, {src: opts.expressInstall}), { + MMredirectURL: location.href, + MMplayerType: 'PlugIn', + MMdoctitle: document.title + }); + + } else { //use html viewer or die + // fail #2.1 custom content inside container + if (!root.innerHTML.replace(/\s/g, '')) { + var pageHost = ((document.location.protocol == "https:") ? "https://" : "http://"); + + root.innerHTML = + "

          Your browser is not compatible with FlexPaper

          " + + "

          Upgrade to a newer browser or download Adobe Flash Player 10 or higher.

          " + + "

          Click on the icon below to download the latest version of Adobe Flash" + + "Get Adobe Flash player"; + + if (root.tagName == 'A') { + root.onclick = function() { + location.href = URL; + }; + } + } + + // onFail + if (opts.onFail) { + var ret = opts.onFail.call(this); + if (typeof ret == 'string') { root.innerHTML = ret; } + } + } + + // http://flowplayer.org/forum/8/18186#post-18593 + if (IE) { + window[opts.id] = document.getElementById(opts.id); + } + + // API methods for callback + extend(this, { + + getRoot: function() { + return root; + }, + + getOptions: function() { + return opts; + }, + + + getConf: function() { + return conf; + }, + + getApi: function() { + return root.firstChild; + } + + }); + } + + // setup jquery support + if (JQUERY) { + jQuery.fn.flashembed = function(opts, conf) { + return this.each(function() { + jQuery(this).data("flashembed", flashembed(this, opts, conf)); + }); + }; + + jQuery.fn.FlexPaperViewer = function(args){ + this.element = new FlexPaperViewerEmbedding(this.attr('id'),args); + }; + }else{ + throw new Error("jQuery missing!"); + } +})(); + + +/** + * 描述:拷贝FlexPaper_zine_trial,获取项目的flexpaper js文件路径 + * @author:xuzengqiang + * @since :2015-6-5 11:10:04 + */ +(function() { + if(!window.FLEXPAPER){ + window.FLEXPAPER = {}; + } + + /** + * 描述:获取js文件目录 + */ + FLEXPAPER.detectjsdir = function(){ + if(jQuery('script[src$="flexpaper.js"]').length>0){ + return jQuery('script[src$="flexpaper.js"]').attr('src').replace('flexpaper.js',''); + }else{ + return "js/"; + } + }; + + FLEXPAPER.detectcssdir= function(){ + if(jQuery('link[href$="flexpaper.css"]').length>0){ + return jQuery('link[href$="flexpaper.css"]').attr('href').replace('flexpaper_zine.css',''); + }else{ + return "css/"; + } + }; +})(); \ No newline at end of file diff --git a/passuser/src/main/resources/static/js/flexpaper_flash.js b/passuser/src/main/resources/static/js/flexpaper_flash.js new file mode 100644 index 0000000..0edc9a2 --- /dev/null +++ b/passuser/src/main/resources/static/js/flexpaper_flash.js @@ -0,0 +1,449 @@ +window.$FlexPaper = window["$FlexPaper"] = function(){ + if (window['flexpaper']) + return window['flexpaper']; + else + window['flexpaper'] = window.FlexPaperViewer_Instance.getApi(); + + return window['flexpaper']; +}; + +/** +* +* FlexPaper constructor (name of swf, name of placeholder, config) +* +*/ +window.FlexPaperViewer = window.$f = function() { + var config = arguments[2].config; + + window.FlexPaperViewer_Instance = flashembed(arguments[1], { + + src: arguments[0]+".swf", + version: [10, 0], + expressInstall: "js/expressinstall.swf" + },{ + SwfFile : config.SwfFile, + Scale : config.Scale, + ZoomTransition : config.ZoomTransition, + ZoomTime : config.ZoomTime, + ZoomInterval : config.ZoomInterval, + FitPageOnLoad : config.FitPageOnLoad, + FitWidthOnLoad : config.FitWidthOnLoad, + FullScreenAsMaxWindow : config.FullScreenAsMaxWindow, + ProgressiveLoading : config.ProgressiveLoading, + MinZoomSize : config.MinZoomSize, + MaxZoomSize : config.MaxZoomSize, + SearchMatchAll : config.SearchMatchAll, + SearchServiceUrl : config.SearchServiceUrl, + InitViewMode : config.InitViewMode, + BitmapBasedRendering : config.BitmapBasedRendering, + StartAtPage : config.StartAtPage, + PrintPaperAsBitmap : config.PrintPaperAsBitmap, + AutoAdjustPrintSize : config.AutoAdjustPrintSize, + + ViewModeToolsVisible : config.ViewModeToolsVisible, + ZoomToolsVisible : config.ZoomToolsVisible, + NavToolsVisible : config.NavToolsVisible, + CursorToolsVisible : config.CursorToolsVisible, + SearchToolsVisible : config.SearchToolsVisible, + + RenderingOrder : config.RenderingOrder, + + localeChain : config.localeChain, + key : config.key + }); +}; + + + +/** + * Handles the event of external links getting clicked in the document. + * + * @example onExternalLinkClicked("http://www.google.com") + * + * @param String link + */ +function onExternalLinkClicked(link){ + // alert("link " + link + " clicked" ); + window.location.href = link; +} + +/** + * Recieves progress information about the document being loaded + * + * @example onProgress( 100,10000 ); + * + * @param int loaded + * @param int total + */ +function onProgress(loadedBytes,totalBytes){ +} + +/** + * Handles the event of a document is in progress of loading + * + */ +function onDocumentLoading(){ +} + +/** + * Receives messages about the current page being changed + * + * @example onCurrentPageChanged( 10 ); + * + * @param int pagenum + */ +function onCurrentPageChanged(pagenum){ +} + +/** + * Receives messages about the document being loaded + * + * @example onDocumentLoaded( 20 ); + * + * @param int totalPages + */ +function onDocumentLoaded(totalPages){ +} + +/** + * Handles the event of a document is in progress of loading + * + */ +function onPageLoading(pageNumber){ +} + +/** + * Receives messages about the page loaded + * + * @example onPageLoaded( 1 ); + * + * @param int pageNumber + */ +function onPageLoaded(pageNumber){ +} + +/** + * Receives error messages when a document is not loading properly + * + * @example onDocumentLoadedError( "Network error" ); + * + * @param String errorMessage + */ +function onDocumentLoadedError(errMessage){ +} + +/** + * Receives error messages when a document has finished printed + * + * @example onDocumentPrinted(); + * + */ +function onDocumentPrinted(){ +} + + + +/** + * + * FlexPaper embedding functionality. Based on FlashEmbed + * + */ + +(function() { + + var IE = document.all, + URL = 'http://www.adobe.com/go/getflashplayer', + JQUERY = typeof jQuery == 'function', + RE = /(\d+)[^\d]+(\d+)[^\d]*(\d*)/, + GLOBAL_OPTS = { + // very common opts + width: '100%', + height: '100%', + id: "_" + ("" + Math.random()).slice(9), + + // flashembed defaults + allowfullscreen: true, + allowscriptaccess: 'always', + quality: 'high', + + // flashembed specific options + version: [3, 0], + onFail: null, + expressInstall: null, + w3c: false, + cachebusting: false + }; + + if(IE){GLOBAL_OPTS.cachebusting=true;} + + // version 9 bugfix: (http://blog.deconcept.com/2006/07/28/swfobject-143-released/) + if (window.attachEvent) { + window.attachEvent("onbeforeunload", function() { + __flash_unloadHandler = function() {}; + __flash_savedUnloadHandler = function() {}; + }); + } + + // simple extend + function extend(to, from) { + if (from) { + for (var key in from) { + if (from.hasOwnProperty(key)) { + to[key] = from[key]; + } + } + } + return to; + } + + // used by asString method + function map(arr, func) { + var newArr = []; + for (var i in arr) { + if (arr.hasOwnProperty(i)) { + newArr[i] = func(arr[i]); + } + } + return newArr; + } + + window.flashembed = function(root, opts, conf) { + + // root must be found / loaded + if (typeof root == 'string') { + root = document.getElementById(root.replace("#", "")); + } + + // not found + if (!root) { return; } + + root.onclick = function(){return false;} + + if (typeof opts == 'string') { + opts = {src: opts}; + } + + return new Flash(root, extend(extend({}, GLOBAL_OPTS), opts), conf); + }; + + // flashembed "static" API + var f = extend(window.flashembed, { + + conf: GLOBAL_OPTS, + + getVersion: function() { + var fo, ver; + + try { + ver = navigator.plugins["Shockwave Flash"].description.slice(16); + } catch(e) { + + try { + fo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7"); + ver = fo && fo.GetVariable("$version"); + + } catch(err) { + try { + fo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6"); + ver = fo && fo.GetVariable("$version"); + } catch(err2) { } + } + } + + ver = RE.exec(ver); + return ver ? [ver[1], ver[3]] : [0, 0]; + }, + + asString: function(obj) { + + if (obj === null || obj === undefined) { return null; } + var type = typeof obj; + if (type == 'object' && obj.push) { type = 'array'; } + + switch (type){ + + case 'string': + obj = obj.replace(new RegExp('(["\\\\])', 'g'), '\\$1'); + + // flash does not handle %- characters well. transforms "50%" to "50pct" (a dirty hack, I admit) + obj = obj.replace(/^\s?(\d+\.?\d+)%/, "$1pct"); + return '"' +obj+ '"'; + + case 'array': + return '['+ map(obj, function(el) { + return f.asString(el); + }).join(',') +']'; + + case 'function': + return '"function()"'; + + case 'object': + var str = []; + for (var prop in obj) { + if (obj.hasOwnProperty(prop)) { + str.push('"'+prop+'":'+ f.asString(obj[prop])); + } + } + return '{'+str.join(',')+'}'; + } + + // replace ' --> " and remove spaces + return String(obj).replace(/\s/g, " ").replace(/\'/g, "\""); + }, + + getHTML: function(opts, conf) { + + opts = extend({}, opts); + + /******* OBJECT tag and it's attributes *******/ + var html = ''; + } + + // not allowed params + opts.width = opts.height = opts.id = opts.w3c = opts.src = null; + opts.onFail = opts.version = opts.expressInstall = null; + + for (var key in opts) { + if (opts[key]) { + html += ''; + } + } + + /******* FLASHVARS *******/ + var vars = ""; + + if (conf) { + for (var k in conf) { + if (conf[k]) { + var val = conf[k]; + vars += k +'='+ (/function|object/.test(typeof val) ? f.asString(val) : val) + '&'; + } + } + vars = vars.slice(0, -1); + html += ''; + } + + html += ""; + + return html; + }, + + isSupported: function(ver) { + return VERSION[0] > ver[0] || VERSION[0] == ver[0] && VERSION[1] >= ver[1]; + } + + }); + + var VERSION = f.getVersion(); + + function Flash(root, opts, conf) { + + // version is ok + if (f.isSupported(opts.version)) { + root.innerHTML = f.getHTML(opts, conf); + + // express install + } else if (opts.expressInstall && f.isSupported([6, 65])) { + root.innerHTML = f.getHTML(extend(opts, {src: opts.expressInstall}), { + MMredirectURL: location.href, + MMplayerType: 'PlugIn', + MMdoctitle: document.title + }); + + } else { + + // fail #2.1 custom content inside container + if (!root.innerHTML.replace(/\s/g, '')) { + /* root.innerHTML = + "

          Flash version " + opts.version + " or greater is required

          " + + "

          " + + (VERSION[0] > 0 ? "Your version is " + VERSION : "You have no flash plugin installed") + + "

          " + + + (root.tagName == 'A' ? "

          Click here to download latest version

          " : + "

          Download latest version from here

          "); + */ + var pageHost = ((document.location.protocol == "https:") ? "https://" : "http://"); + + root.innerHTML = "Get Adobe Flash player"; + + if (root.tagName == 'A') { + root.onclick = function() { + location.href = URL; + }; + } + } + + // onFail + if (opts.onFail) { + var ret = opts.onFail.call(this); + if (typeof ret == 'string') { root.innerHTML = ret; } + } + } + + // http://flowplayer.org/forum/8/18186#post-18593 + if (IE) { + window[opts.id] = document.getElementById(opts.id); + } + + // API methods for callback + extend(this, { + + getRoot: function() { + return root; + }, + + getOptions: function() { + return opts; + }, + + + getConf: function() { + return conf; + }, + + getApi: function() { + return root.firstChild; + } + + }); + } + + // setup jquery support + if (JQUERY) { + + // tools version number + jQuery.tools = jQuery.tools || {version: '1.2.5'}; + + jQuery.tools.flashembed = { + conf: GLOBAL_OPTS + }; + + jQuery.fn.flashembed = function(opts, conf) { + return this.each(function() { + $(this).data("flashembed", flashembed(this, opts, conf)); + }); + }; + } + +})(); \ No newline at end of file diff --git a/passuser/src/main/resources/static/js/flexpaper_flash_debug.js b/passuser/src/main/resources/static/js/flexpaper_flash_debug.js new file mode 100644 index 0000000..1d1702d --- /dev/null +++ b/passuser/src/main/resources/static/js/flexpaper_flash_debug.js @@ -0,0 +1,466 @@ +window.$FlexPaper = window["$FlexPaper"] = function(){ + if (window['flexpaper']) + return window['flexpaper']; + else + window['flexpaper'] = window.FlexPaperViewer_Instance.getApi(); + + return window['flexpaper']; +}; + +/** +* +* FlexPaper constructor (name of swf, name of placeholder, config) +* +*/ +window.FlexPaperViewer = window.$f = function() { + var config = arguments[2].config; + + window.FlexPaperViewer_Instance = flashembed(arguments[1], { + + src: arguments[0]+".swf", + version: [10, 0], + expressInstall: "js/expressinstall.swf" + },{ + SwfFile : config.SwfFile, + Scale : config.Scale, + ZoomTransition : config.ZoomTransition, + ZoomTime : config.ZoomTime, + ZoomInterval : config.ZoomInterval, + FitPageOnLoad : config.FitPageOnLoad, + FitWidthOnLoad : config.FitWidthOnLoad, + FullScreenAsMaxWindow : config.FullScreenAsMaxWindow, + ProgressiveLoading : config.ProgressiveLoading, + MinZoomSize : config.MinZoomSize, + MaxZoomSize : config.MaxZoomSize, + SearchMatchAll : config.SearchMatchAll, + SearchServiceUrl : config.SearchServiceUrl, + InitViewMode : config.InitViewMode, + BitmapBasedRendering : config.BitmapBasedRendering, + StartAtPage : config.StartAtPage, + PrintPaperAsBitmap : config.PrintPaperAsBitmap, + AutoAdjustPrintSize : config.AutoAdjustPrintSize, + + ViewModeToolsVisible : config.ViewModeToolsVisible, + ZoomToolsVisible : config.ZoomToolsVisible, + NavToolsVisible : config.NavToolsVisible, + CursorToolsVisible : config.CursorToolsVisible, + SearchToolsVisible : config.SearchToolsVisible, + + RenderingOrder : config.RenderingOrder, + + localeChain : config.localeChain, + key : config.key + }); +}; + + + +/** + * Handles the event of external links getting clicked in the document. + * + * @example onExternalLinkClicked("http://www.google.com") + * + * @param String link + */ +function onExternalLinkClicked(link){ + $("#txt_eventlog").val('onExternalLinkClicked:' + link + '\n' + $("#txt_eventlog").val()); +} + +/** + * Recieves progress information about the document being loaded + * + * @example onProgress( 100,10000 ); + * + * @param int loaded + * @param int total + */ +function onProgress(loadedBytes,totalBytes){ + $("#txt_progress").val('onProgress:' + loadedBytes + '/' + totalBytes + '\n'); +} + +/** + * Handles the event of a document is in progress of loading + * + */ +function onDocumentLoading(){ + $("#txt_eventlog").val('onDocumentLoading' + '\n' + $("#txt_eventlog").val()); +} + +/** + * Handles the event of a document is in progress of loading + * + */ +function onPageLoading(pageNumber){ + $("#txt_eventlog").val('onPageLoading:' + pageNumber + '\n' + $("#txt_eventlog").val()); +} + +/** + * Receives messages about the current page being changed + * + * @example onCurrentPageChanged( 10 ); + * + * @param int pagenum + */ +function onCurrentPageChanged(pagenum){ + $("#txt_eventlog").val('onCurrentPageChanged:' + pagenum + '\n' + $("#txt_eventlog").val()); +} + +/** + * Receives messages about the document being loaded + * + * @example onDocumentLoaded( 20 ); + * + * @param int totalPages + */ +function onDocumentLoaded(totalPages){ + $("#txt_eventlog").val('onDocumentLoaded:' + totalPages + '\n' + $("#txt_eventlog").val()); +} + +/** + * Receives messages about the page loaded + * + * @example onPageLoaded( 1 ); + * + * @param int pageNumber + */ +function onPageLoaded(pageNumber){ + $("#txt_eventlog").val('onPageLoaded:' + pageNumber + '\n' + $("#txt_eventlog").val()); +} + +/** + * Receives messages about the page loaded + * + * @example onErrorLoadingPage( 1 ); + * + * @param int pageNumber + */ +function onErrorLoadingPage(pageNumber){ + $("#txt_eventlog").val('onErrorLoadingPage:' + pageNumber + '\n' + $("#txt_eventlog").val()); +} + +/** + * Receives error messages when a document is not loading properly + * + * @example onDocumentLoadedError( "Network error" ); + * + * @param String errorMessage + */ +function onDocumentLoadedError(errMessage){ + $("#txt_eventlog").val('onDocumentLoadedError:' + errMessage + '\n' + $("#txt_eventlog").val()); +} + +/** + * Receives error messages when a document has finished printed + * + * @example onDocumentPrinted(); + * + */ +function onDocumentPrinted(){ + $("#txt_eventlog").val('onDocumentPrinted\n' + $("#txt_eventlog").val()); +} + + +/** + * + * FlexPaper embedding functionality. Based on FlashEmbed + * + */ + +(function() { + + var IE = document.all, + URL = 'http://www.adobe.com/go/getflashplayer', + JQUERY = typeof jQuery == 'function', + RE = /(\d+)[^\d]+(\d+)[^\d]*(\d*)/, + GLOBAL_OPTS = { + // very common opts + width: '100%', + height: '100%', + id: "_" + ("" + Math.random()).slice(9), + + // flashembed defaults + allowfullscreen: true, + allowscriptaccess: 'always', + quality: 'high', + + // flashembed specific options + version: [3, 0], + onFail: null, + expressInstall: null, + w3c: false, + cachebusting: false + }; + + if(IE){GLOBAL_OPTS.cachebusting=true;} + + // version 9 bugfix: (http://blog.deconcept.com/2006/07/28/swfobject-143-released/) + if (window.attachEvent) { + window.attachEvent("onbeforeunload", function() { + __flash_unloadHandler = function() {}; + __flash_savedUnloadHandler = function() {}; + }); + } + + // simple extend + function extend(to, from) { + if (from) { + for (var key in from) { + if (from.hasOwnProperty(key)) { + to[key] = from[key]; + } + } + } + return to; + } + + // used by asString method + function map(arr, func) { + var newArr = []; + for (var i in arr) { + if (arr.hasOwnProperty(i)) { + newArr[i] = func(arr[i]); + } + } + return newArr; + } + + window.flashembed = function(root, opts, conf) { + + // root must be found / loaded + if (typeof root == 'string') { + root = document.getElementById(root.replace("#", "")); + } + + // not found + if (!root) { return; } + + root.onclick = function(){return false;} + + if (typeof opts == 'string') { + opts = {src: opts}; + } + + return new Flash(root, extend(extend({}, GLOBAL_OPTS), opts), conf); + }; + + // flashembed "static" API + var f = extend(window.flashembed, { + + conf: GLOBAL_OPTS, + + getVersion: function() { + var fo, ver; + + try { + ver = navigator.plugins["Shockwave Flash"].description.slice(16); + } catch(e) { + + try { + fo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7"); + ver = fo && fo.GetVariable("$version"); + + } catch(err) { + try { + fo = new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6"); + ver = fo && fo.GetVariable("$version"); + } catch(err2) { } + } + } + + ver = RE.exec(ver); + return ver ? [ver[1], ver[3]] : [0, 0]; + }, + + asString: function(obj) { + + if (obj === null || obj === undefined) { return null; } + var type = typeof obj; + if (type == 'object' && obj.push) { type = 'array'; } + + switch (type){ + + case 'string': + obj = obj.replace(new RegExp('(["\\\\])', 'g'), '\\$1'); + + // flash does not handle %- characters well. transforms "50%" to "50pct" (a dirty hack, I admit) + obj = obj.replace(/^\s?(\d+\.?\d+)%/, "$1pct"); + return '"' +obj+ '"'; + + case 'array': + return '['+ map(obj, function(el) { + return f.asString(el); + }).join(',') +']'; + + case 'function': + return '"function()"'; + + case 'object': + var str = []; + for (var prop in obj) { + if (obj.hasOwnProperty(prop)) { + str.push('"'+prop+'":'+ f.asString(obj[prop])); + } + } + return '{'+str.join(',')+'}'; + } + + // replace ' --> " and remove spaces + return String(obj).replace(/\s/g, " ").replace(/\'/g, "\""); + }, + + getHTML: function(opts, conf) { + + opts = extend({}, opts); + + /******* OBJECT tag and it's attributes *******/ + var html = ''; + } + + // not allowed params + opts.width = opts.height = opts.id = opts.w3c = opts.src = null; + opts.onFail = opts.version = opts.expressInstall = null; + + for (var key in opts) { + if (opts[key]) { + html += ''; + } + } + + /******* FLASHVARS *******/ + var vars = ""; + + if (conf) { + for (var k in conf) { + if (conf[k]) { + var val = conf[k]; + vars += k +'='+ (/function|object/.test(typeof val) ? f.asString(val) : val) + '&'; + } + } + vars = vars.slice(0, -1); + html += ''; + } + + html += ""; + + return html; + }, + + isSupported: function(ver) { + return VERSION[0] > ver[0] || VERSION[0] == ver[0] && VERSION[1] >= ver[1]; + } + + }); + + var VERSION = f.getVersion(); + + function Flash(root, opts, conf) { + + // version is ok + if (f.isSupported(opts.version)) { + root.innerHTML = f.getHTML(opts, conf); + + // express install + } else if (opts.expressInstall && f.isSupported([6, 65])) { + root.innerHTML = f.getHTML(extend(opts, {src: opts.expressInstall}), { + MMredirectURL: location.href, + MMplayerType: 'PlugIn', + MMdoctitle: document.title + }); + + } else { + + // fail #2.1 custom content inside container + if (!root.innerHTML.replace(/\s/g, '')) { + /* root.innerHTML = + "

          Flash version " + opts.version + " or greater is required

          " + + "

          " + + (VERSION[0] > 0 ? "Your version is " + VERSION : "You have no flash plugin installed") + + "

          " + + + (root.tagName == 'A' ? "

          Click here to download latest version

          " : + "

          Download latest version from here

          "); + */ + var pageHost = ((document.location.protocol == "https:") ? "https://" : "http://"); + + root.innerHTML = "Get Adobe Flash player"; + + if (root.tagName == 'A') { + root.onclick = function() { + location.href = URL; + }; + } + } + + // onFail + if (opts.onFail) { + var ret = opts.onFail.call(this); + if (typeof ret == 'string') { root.innerHTML = ret; } + } + } + + // http://flowplayer.org/forum/8/18186#post-18593 + if (IE) { + window[opts.id] = document.getElementById(opts.id); + } + + // API methods for callback + extend(this, { + + getRoot: function() { + return root; + }, + + getOptions: function() { + return opts; + }, + + + getConf: function() { + return conf; + }, + + getApi: function() { + return root.firstChild; + } + + }); + } + + // setup jquery support + if (JQUERY) { + + // tools version number + jQuery.tools = jQuery.tools || {version: '1.2.5'}; + + jQuery.tools.flashembed = { + conf: GLOBAL_OPTS + }; + + jQuery.fn.flashembed = function(opts, conf) { + return this.each(function() { + $(this).data("flashembed", flashembed(this, opts, conf)); + }); + }; + } + +})(); \ No newline at end of file diff --git a/passuser/src/main/resources/static/js/hplus.js b/passuser/src/main/resources/static/js/hplus.js new file mode 100644 index 0000000..b639026 --- /dev/null +++ b/passuser/src/main/resources/static/js/hplus.js @@ -0,0 +1,294 @@ +//自定义js + +//公共配置 + + +$(document).ready(function () { + + // MetsiMenu + $('#side-menu').metisMenu(); + // 打开右侧边栏 + $('.right-sidebar-toggle').click(function () { + $('#right-sidebar').toggleClass('sidebar-open'); + }); + + // 右侧边栏使用slimscroll + $('.sidebar-container').slimScroll({ + height: '100%', + railOpacity: 0.4, + wheelStep: 10 + }); + + // 打开聊天窗口 + $('.open-small-chat').click(function () { + $(this).children().toggleClass('fa-comments').toggleClass('fa-remove'); + $('.small-chat-box').toggleClass('active'); + }); + + // 聊天窗口使用slimscroll + $('.small-chat-box .content').slimScroll({ + height: '234px', + railOpacity: 0.4 + }); + + // Small todo handler + $('.check-link').click(function () { + var button = $(this).find('i'); + var label = $(this).next('span'); + button.toggleClass('fa-check-square').toggleClass('fa-square-o'); + label.toggleClass('todo-completed'); + return false; + }); + + //固定菜单栏 + $(function () { + $('.sidebar-collapse').slimScroll({ + height: '100%', + railOpacity: 0.9, + alwaysVisible: false + }); + }); + + + // 菜单切换 + $('.navbar-minimalize').click(function () { + $("body").toggleClass("mini-navbar"); + SmoothlyMenu(); + }); + + + // 侧边栏高度 + function fix_height() { + var heightWithoutNavbar = $("body > #wrapper").height() - 61; + $(".sidebard-panel").css("min-height", heightWithoutNavbar + "px"); + } + fix_height(); + + $(window).bind("load resize click scroll", function () { + if (!$("body").hasClass('body-small')) { + fix_height(); + } + }); + + //侧边栏滚动 + $(window).scroll(function () { + if ($(window).scrollTop() > 0 && !$('body').hasClass('fixed-nav')) { + $('#right-sidebar').addClass('sidebar-top'); + } else { + $('#right-sidebar').removeClass('sidebar-top'); + } + }); + + $('.full-height-scroll').slimScroll({ + height: '100%' + }); + + $('#side-menu>li').click(function () { + if ($('body').hasClass('mini-navbar')) { + NavToggle(); + } + }); + $('#side-menu>li li a').click(function () { + if ($(window).width() < 769) { + NavToggle(); + } + }); + + //点击菜单的时候高亮显示菜单 + $("a[name='tabMenuItem']").click(function(){ + clearTabMenuItem(); + $(this).addClass("tab-menu-selected"); + }); + + $('.nav-close').click(NavToggle); + + //ios浏览器兼容性处理 + if (/(iPhone|iPad|iPod|iOS)/i.test(navigator.userAgent)) { + $('#content-main').css('overflow-y', 'auto'); + } + +}); + +$(window).bind("load resize", function () { + if ($(this).width() < 769) { + $('body').addClass('mini-navbar'); + $('.navbar-static-side').fadeIn(); + } +}); + +function clearTabMenuItem(){ + $("a[name='tabMenuItem']").each(function(){ + $(this).removeClass("tab-menu-selected"); + }); +} + +function highLightMenuItem(hrefVal){ + clearTabMenuItem(); + $("a[href='" + hrefVal + "']").addClass("tab-menu-selected"); +} + +function NavToggle() { + $('.navbar-minimalize').trigger('click'); +} + +function SmoothlyMenu() { + if (!$('body').hasClass('mini-navbar')) { + $('#side-menu').hide(); + setTimeout( + function () { + $('#side-menu').fadeIn(500); + }, 100); + } else if ($('body').hasClass('fixed-sidebar')) { + $('#side-menu').hide(); + setTimeout( + function () { + $('#side-menu').fadeIn(500); + }, 300); + } else { + $('#side-menu').removeAttr('style'); + } +} + + +//主题设置 +$(function () { + + // 顶部菜单固定 + $('#fixednavbar').click(function () { + if ($('#fixednavbar').is(':checked')) { + $(".navbar-static-top").removeClass('navbar-static-top').addClass('navbar-fixed-top'); + $("body").removeClass('boxed-layout'); + $("body").addClass('fixed-nav'); + $('#boxedlayout').prop('checked', false); + + if (localStorageSupport) { + localStorage.setItem("boxedlayout", 'off'); + } + + if (localStorageSupport) { + localStorage.setItem("fixednavbar", 'on'); + } + } else { + $(".navbar-fixed-top").removeClass('navbar-fixed-top').addClass('navbar-static-top'); + $("body").removeClass('fixed-nav'); + + if (localStorageSupport) { + localStorage.setItem("fixednavbar", 'off'); + } + } + }); + + + // 收起左侧菜单 + $('#collapsemenu').click(function () { + if ($('#collapsemenu').is(':checked')) { + $("body").addClass('mini-navbar'); + SmoothlyMenu(); + + if (localStorageSupport) { + localStorage.setItem("collapse_menu", 'on'); + } + + } else { + $("body").removeClass('mini-navbar'); + SmoothlyMenu(); + + if (localStorageSupport) { + localStorage.setItem("collapse_menu", 'off'); + } + } + }); + + // 固定宽度 + $('#boxedlayout').click(function () { + if ($('#boxedlayout').is(':checked')) { + $("body").addClass('boxed-layout'); + $('#fixednavbar').prop('checked', false); + $(".navbar-fixed-top").removeClass('navbar-fixed-top').addClass('navbar-static-top'); + $("body").removeClass('fixed-nav'); + if (localStorageSupport) { + localStorage.setItem("fixednavbar", 'off'); + } + + + if (localStorageSupport) { + localStorage.setItem("boxedlayout", 'on'); + } + } else { + $("body").removeClass('boxed-layout'); + + if (localStorageSupport) { + localStorage.setItem("boxedlayout", 'off'); + } + } + }); + + // 默认主题 + $('.s-skin-0').click(function () { + $("body").removeClass("skin-1"); + $("body").removeClass("skin-2"); + $("body").removeClass("skin-3"); + return false; + }); + + // 蓝色主题 + $('.s-skin-1').click(function () { + $("body").removeClass("skin-2"); + $("body").removeClass("skin-3"); + $("body").addClass("skin-1"); + return false; + }); + + // 黄色主题 + $('.s-skin-3').click(function () { + $("body").removeClass("skin-1"); + $("body").removeClass("skin-2"); + $("body").addClass("skin-3"); + return false; + }); + + if (localStorageSupport) { + var collapse = localStorage.getItem("collapse_menu"); + var fixednavbar = localStorage.getItem("fixednavbar"); + var boxedlayout = localStorage.getItem("boxedlayout"); + + if (collapse == 'on') { + $('#collapsemenu').prop('checked', 'checked') + } + if (fixednavbar == 'on') { + $('#fixednavbar').prop('checked', 'checked') + } + if (boxedlayout == 'on') { + $('#boxedlayout').prop('checked', 'checked') + } + } + + if (localStorageSupport) { + + var collapse = localStorage.getItem("collapse_menu"); + var fixednavbar = localStorage.getItem("fixednavbar"); + var boxedlayout = localStorage.getItem("boxedlayout"); + + var body = $('body'); + + if (collapse == 'on') { + if (!body.hasClass('body-small')) { + body.addClass('mini-navbar'); + } + } + + if (fixednavbar == 'on') { + $(".navbar-static-top").removeClass('navbar-static-top').addClass('navbar-fixed-top'); + body.addClass('fixed-nav'); + } + + if (boxedlayout == 'on') { + body.addClass('boxed-layout'); + } + } +}); + +//判断浏览器是否支持html5本地存储 +function localStorageSupport() { + return (('localStorage' in window) && window['localStorage'] !== null) +} diff --git a/passuser/src/main/resources/static/js/jquery.js b/passuser/src/main/resources/static/js/jquery.js new file mode 100644 index 0000000..0c7294c --- /dev/null +++ b/passuser/src/main/resources/static/js/jquery.js @@ -0,0 +1,152 @@ +/*! + * jQuery JavaScript Library v1.4.1 + * http://jquery.com/ + * + * Copyright 2010, John Resig + * Dual licensed under the MIT or GPL Version 2 licenses. + * http://jquery.org/license + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * Copyright 2010, The Dojo Foundation + * Released under the MIT, BSD, and GPL Licenses. + * + * Date: Mon Jan 25 19:43:33 2010 -0500 + */ +(function(z,v){function la(){if(!c.isReady){try{r.documentElement.doScroll("left")}catch(a){setTimeout(la,1);return}c.ready()}}function Ma(a,b){b.src?c.ajax({url:b.src,async:false,dataType:"script"}):c.globalEval(b.text||b.textContent||b.innerHTML||"");b.parentNode&&b.parentNode.removeChild(b)}function X(a,b,d,f,e,i){var j=a.length;if(typeof b==="object"){for(var n in b)X(a,n,b[n],f,e,d);return a}if(d!==v){f=!i&&f&&c.isFunction(d);for(n=0;n-1){i=j.data;i.beforeFilter&&i.beforeFilter[a.type]&&!i.beforeFilter[a.type](a)||f.push(j.selector)}else delete x[o]}i=c(a.target).closest(f, +a.currentTarget);m=0;for(s=i.length;m)[^>]*$|^#([\w-]+)$/,Qa=/^.[^:#\[\.,]*$/,Ra=/\S/,Sa=/^(\s|\u00A0)+|(\s|\u00A0)+$/g,Ta=/^<(\w+)\s*\/?>(?:<\/\1>)?$/,O=navigator.userAgent, +va=false,P=[],L,$=Object.prototype.toString,aa=Object.prototype.hasOwnProperty,ba=Array.prototype.push,Q=Array.prototype.slice,wa=Array.prototype.indexOf;c.fn=c.prototype={init:function(a,b){var d,f;if(!a)return this;if(a.nodeType){this.context=this[0]=a;this.length=1;return this}if(typeof a==="string")if((d=Pa.exec(a))&&(d[1]||!b))if(d[1]){f=b?b.ownerDocument||b:r;if(a=Ta.exec(a))if(c.isPlainObject(b)){a=[r.createElement(a[1])];c.fn.attr.call(a,b,true)}else a=[f.createElement(a[1])];else{a=ra([d[1]], +[f]);a=(a.cacheable?a.fragment.cloneNode(true):a.fragment).childNodes}}else{if(b=r.getElementById(d[2])){if(b.id!==d[2])return S.find(a);this.length=1;this[0]=b}this.context=r;this.selector=a;return this}else if(!b&&/^\w+$/.test(a)){this.selector=a;this.context=r;a=r.getElementsByTagName(a)}else return!b||b.jquery?(b||S).find(a):c(b).find(a);else if(c.isFunction(a))return S.ready(a);if(a.selector!==v){this.selector=a.selector;this.context=a.context}return c.isArray(a)?this.setArray(a):c.makeArray(a, +this)},selector:"",jquery:"1.4.1",length:0,size:function(){return this.length},toArray:function(){return Q.call(this,0)},get:function(a){return a==null?this.toArray():a<0?this.slice(a)[0]:this[a]},pushStack:function(a,b,d){a=c(a||null);a.prevObject=this;a.context=this.context;if(b==="find")a.selector=this.selector+(this.selector?" ":"")+d;else if(b)a.selector=this.selector+"."+b+"("+d+")";return a},setArray:function(a){this.length=0;ba.apply(this,a);return this},each:function(a,b){return c.each(this, +a,b)},ready:function(a){c.bindReady();if(c.isReady)a.call(r,c);else P&&P.push(a);return this},eq:function(a){return a===-1?this.slice(a):this.slice(a,+a+1)},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},slice:function(){return this.pushStack(Q.apply(this,arguments),"slice",Q.call(arguments).join(","))},map:function(a){return this.pushStack(c.map(this,function(b,d){return a.call(b,d,b)}))},end:function(){return this.prevObject||c(null)},push:ba,sort:[].sort,splice:[].splice}; +c.fn.init.prototype=c.fn;c.extend=c.fn.extend=function(){var a=arguments[0]||{},b=1,d=arguments.length,f=false,e,i,j,n;if(typeof a==="boolean"){f=a;a=arguments[1]||{};b=2}if(typeof a!=="object"&&!c.isFunction(a))a={};if(d===b){a=this;--b}for(;b
          a";var e=d.getElementsByTagName("*"),i=d.getElementsByTagName("a")[0];if(!(!e||!e.length||!i)){c.support= +{leadingWhitespace:d.firstChild.nodeType===3,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/red/.test(i.getAttribute("style")),hrefNormalized:i.getAttribute("href")==="/a",opacity:/^0.55$/.test(i.style.opacity),cssFloat:!!i.style.cssFloat,checkOn:d.getElementsByTagName("input")[0].value==="on",optSelected:r.createElement("select").appendChild(r.createElement("option")).selected,checkClone:false,scriptEval:false,noCloneEvent:true,boxModel:null}; +b.type="text/javascript";try{b.appendChild(r.createTextNode("window."+f+"=1;"))}catch(j){}a.insertBefore(b,a.firstChild);if(z[f]){c.support.scriptEval=true;delete z[f]}a.removeChild(b);if(d.attachEvent&&d.fireEvent){d.attachEvent("onclick",function n(){c.support.noCloneEvent=false;d.detachEvent("onclick",n)});d.cloneNode(true).fireEvent("onclick")}d=r.createElement("div");d.innerHTML="";a=r.createDocumentFragment();a.appendChild(d.firstChild); +c.support.checkClone=a.cloneNode(true).cloneNode(true).lastChild.checked;c(function(){var n=r.createElement("div");n.style.width=n.style.paddingLeft="1px";r.body.appendChild(n);c.boxModel=c.support.boxModel=n.offsetWidth===2;r.body.removeChild(n).style.display="none"});a=function(n){var o=r.createElement("div");n="on"+n;var m=n in o;if(!m){o.setAttribute(n,"return;");m=typeof o[n]==="function"}return m};c.support.submitBubbles=a("submit");c.support.changeBubbles=a("change");a=b=d=e=i=null}})();c.props= +{"for":"htmlFor","class":"className",readonly:"readOnly",maxlength:"maxLength",cellspacing:"cellSpacing",rowspan:"rowSpan",colspan:"colSpan",tabindex:"tabIndex",usemap:"useMap",frameborder:"frameBorder"};var G="jQuery"+J(),Ua=0,xa={},Va={};c.extend({cache:{},expando:G,noData:{embed:true,object:true,applet:true},data:function(a,b,d){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==z?xa:a;var f=a[G],e=c.cache;if(!b&&!f)return null;f||(f=++Ua);if(typeof b==="object"){a[G]=f;e=e[f]=c.extend(true, +{},b)}else e=e[f]?e[f]:typeof d==="undefined"?Va:(e[f]={});if(d!==v){a[G]=f;e[b]=d}return typeof b==="string"?e[b]:e}},removeData:function(a,b){if(!(a.nodeName&&c.noData[a.nodeName.toLowerCase()])){a=a==z?xa:a;var d=a[G],f=c.cache,e=f[d];if(b){if(e){delete e[b];c.isEmptyObject(e)&&c.removeData(a)}}else{try{delete a[G]}catch(i){a.removeAttribute&&a.removeAttribute(G)}delete f[d]}}}});c.fn.extend({data:function(a,b){if(typeof a==="undefined"&&this.length)return c.data(this[0]);else if(typeof a==="object")return this.each(function(){c.data(this, +a)});var d=a.split(".");d[1]=d[1]?"."+d[1]:"";if(b===v){var f=this.triggerHandler("getData"+d[1]+"!",[d[0]]);if(f===v&&this.length)f=c.data(this[0],a);return f===v&&d[1]?this.data(d[0]):f}else return this.trigger("setData"+d[1]+"!",[d[0],b]).each(function(){c.data(this,a,b)})},removeData:function(a){return this.each(function(){c.removeData(this,a)})}});c.extend({queue:function(a,b,d){if(a){b=(b||"fx")+"queue";var f=c.data(a,b);if(!d)return f||[];if(!f||c.isArray(d))f=c.data(a,b,c.makeArray(d));else f.push(d); +return f}},dequeue:function(a,b){b=b||"fx";var d=c.queue(a,b),f=d.shift();if(f==="inprogress")f=d.shift();if(f){b==="fx"&&d.unshift("inprogress");f.call(a,function(){c.dequeue(a,b)})}}});c.fn.extend({queue:function(a,b){if(typeof a!=="string"){b=a;a="fx"}if(b===v)return c.queue(this[0],a);return this.each(function(){var d=c.queue(this,a,b);a==="fx"&&d[0]!=="inprogress"&&c.dequeue(this,a)})},dequeue:function(a){return this.each(function(){c.dequeue(this,a)})},delay:function(a,b){a=c.fx?c.fx.speeds[a]|| +a:a;b=b||"fx";return this.queue(b,function(){var d=this;setTimeout(function(){c.dequeue(d,b)},a)})},clearQueue:function(a){return this.queue(a||"fx",[])}});var ya=/[\n\t]/g,ca=/\s+/,Wa=/\r/g,Xa=/href|src|style/,Ya=/(button|input)/i,Za=/(button|input|object|select|textarea)/i,$a=/^(a|area)$/i,za=/radio|checkbox/;c.fn.extend({attr:function(a,b){return X(this,a,b,true,c.attr)},removeAttr:function(a){return this.each(function(){c.attr(this,a,"");this.nodeType===1&&this.removeAttribute(a)})},addClass:function(a){if(c.isFunction(a))return this.each(function(o){var m= +c(this);m.addClass(a.call(this,o,m.attr("class")))});if(a&&typeof a==="string")for(var b=(a||"").split(ca),d=0,f=this.length;d-1)return true;return false},val:function(a){if(a===v){var b=this[0];if(b){if(c.nodeName(b,"option"))return(b.attributes.value|| +{}).specified?b.value:b.text;if(c.nodeName(b,"select")){var d=b.selectedIndex,f=[],e=b.options;b=b.type==="select-one";if(d<0)return null;var i=b?d:0;for(d=b?d+1:e.length;i=0;else if(c.nodeName(this,"select")){var x=c.makeArray(s);c("option",this).each(function(){this.selected=c.inArray(c(this).val(),x)>=0});if(!x.length)this.selectedIndex=-1}else this.value=s}})}});c.extend({attrFn:{val:true,css:true,html:true,text:true,data:true,width:true,height:true,offset:true},attr:function(a,b,d,f){if(!a||a.nodeType===3||a.nodeType===8)return v;if(f&&b in c.attrFn)return c(a)[b](d); +f=a.nodeType!==1||!c.isXMLDoc(a);var e=d!==v;b=f&&c.props[b]||b;if(a.nodeType===1){var i=Xa.test(b);if(b in a&&f&&!i){if(e){b==="type"&&Ya.test(a.nodeName)&&a.parentNode&&c.error("type property can't be changed");a[b]=d}if(c.nodeName(a,"form")&&a.getAttributeNode(b))return a.getAttributeNode(b).nodeValue;if(b==="tabIndex")return(b=a.getAttributeNode("tabIndex"))&&b.specified?b.value:Za.test(a.nodeName)||$a.test(a.nodeName)&&a.href?0:v;return a[b]}if(!c.support.style&&f&&b==="style"){if(e)a.style.cssText= +""+d;return a.style.cssText}e&&a.setAttribute(b,""+d);a=!c.support.hrefNormalized&&f&&i?a.getAttribute(b,2):a.getAttribute(b);return a===null?v:a}return c.style(a,b,d)}});var ab=function(a){return a.replace(/[^\w\s\.\|`]/g,function(b){return"\\"+b})};c.event={add:function(a,b,d,f){if(!(a.nodeType===3||a.nodeType===8)){if(a.setInterval&&a!==z&&!a.frameElement)a=z;if(!d.guid)d.guid=c.guid++;if(f!==v){d=c.proxy(d);d.data=f}var e=c.data(a,"events")||c.data(a,"events",{}),i=c.data(a,"handle"),j;if(!i){j= +function(){return typeof c!=="undefined"&&!c.event.triggered?c.event.handle.apply(j.elem,arguments):v};i=c.data(a,"handle",j)}if(i){i.elem=a;b=b.split(/\s+/);for(var n,o=0;n=b[o++];){var m=n.split(".");n=m.shift();if(o>1){d=c.proxy(d);if(f!==v)d.data=f}d.type=m.slice(0).sort().join(".");var s=e[n],x=this.special[n]||{};if(!s){s=e[n]={};if(!x.setup||x.setup.call(a,f,m,d)===false)if(a.addEventListener)a.addEventListener(n,i,false);else a.attachEvent&&a.attachEvent("on"+n,i)}if(x.add)if((m=x.add.call(a, +d,f,m,s))&&c.isFunction(m)){m.guid=m.guid||d.guid;m.data=m.data||d.data;m.type=m.type||d.type;d=m}s[d.guid]=d;this.global[n]=true}a=null}}},global:{},remove:function(a,b,d){if(!(a.nodeType===3||a.nodeType===8)){var f=c.data(a,"events"),e,i,j;if(f){if(b===v||typeof b==="string"&&b.charAt(0)===".")for(i in f)this.remove(a,i+(b||""));else{if(b.type){d=b.handler;b=b.type}b=b.split(/\s+/);for(var n=0;i=b[n++];){var o=i.split(".");i=o.shift();var m=!o.length,s=c.map(o.slice(0).sort(),ab);s=new RegExp("(^|\\.)"+ +s.join("\\.(?:.*\\.)?")+"(\\.|$)");var x=this.special[i]||{};if(f[i]){if(d){j=f[i][d.guid];delete f[i][d.guid]}else for(var A in f[i])if(m||s.test(f[i][A].type))delete f[i][A];x.remove&&x.remove.call(a,o,j);for(e in f[i])break;if(!e){if(!x.teardown||x.teardown.call(a,o)===false)if(a.removeEventListener)a.removeEventListener(i,c.data(a,"handle"),false);else a.detachEvent&&a.detachEvent("on"+i,c.data(a,"handle"));e=null;delete f[i]}}}}for(e in f)break;if(!e){if(A=c.data(a,"handle"))A.elem=null;c.removeData(a, +"events");c.removeData(a,"handle")}}}},trigger:function(a,b,d,f){var e=a.type||a;if(!f){a=typeof a==="object"?a[G]?a:c.extend(c.Event(e),a):c.Event(e);if(e.indexOf("!")>=0){a.type=e=e.slice(0,-1);a.exclusive=true}if(!d){a.stopPropagation();this.global[e]&&c.each(c.cache,function(){this.events&&this.events[e]&&c.event.trigger(a,b,this.handle.elem)})}if(!d||d.nodeType===3||d.nodeType===8)return v;a.result=v;a.target=d;b=c.makeArray(b);b.unshift(a)}a.currentTarget=d;(f=c.data(d,"handle"))&&f.apply(d, +b);f=d.parentNode||d.ownerDocument;try{if(!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()]))if(d["on"+e]&&d["on"+e].apply(d,b)===false)a.result=false}catch(i){}if(!a.isPropagationStopped()&&f)c.event.trigger(a,b,f,true);else if(!a.isDefaultPrevented()){d=a.target;var j;if(!(c.nodeName(d,"a")&&e==="click")&&!(d&&d.nodeName&&c.noData[d.nodeName.toLowerCase()])){try{if(d[e]){if(j=d["on"+e])d["on"+e]=null;this.triggered=true;d[e]()}}catch(n){}if(j)d["on"+e]=j;this.triggered=false}}},handle:function(a){var b, +d;a=arguments[0]=c.event.fix(a||z.event);a.currentTarget=this;d=a.type.split(".");a.type=d.shift();b=!d.length&&!a.exclusive;var f=new RegExp("(^|\\.)"+d.slice(0).sort().join("\\.(?:.*\\.)?")+"(\\.|$)");d=(c.data(this,"events")||{})[a.type];for(var e in d){var i=d[e];if(b||f.test(i.type)){a.handler=i;a.data=i.data;i=i.apply(this,arguments);if(i!==v){a.result=i;if(i===false){a.preventDefault();a.stopPropagation()}}if(a.isImmediatePropagationStopped())break}}return a.result},props:"altKey attrChange attrName bubbles button cancelable charCode clientX clientY ctrlKey currentTarget data detail eventPhase fromElement handler keyCode layerX layerY metaKey newValue offsetX offsetY originalTarget pageX pageY prevValue relatedNode relatedTarget screenX screenY shiftKey srcElement target toElement view wheelDelta which".split(" "), +fix:function(a){if(a[G])return a;var b=a;a=c.Event(b);for(var d=this.props.length,f;d;){f=this.props[--d];a[f]=b[f]}if(!a.target)a.target=a.srcElement||r;if(a.target.nodeType===3)a.target=a.target.parentNode;if(!a.relatedTarget&&a.fromElement)a.relatedTarget=a.fromElement===a.target?a.toElement:a.fromElement;if(a.pageX==null&&a.clientX!=null){b=r.documentElement;d=r.body;a.pageX=a.clientX+(b&&b.scrollLeft||d&&d.scrollLeft||0)-(b&&b.clientLeft||d&&d.clientLeft||0);a.pageY=a.clientY+(b&&b.scrollTop|| +d&&d.scrollTop||0)-(b&&b.clientTop||d&&d.clientTop||0)}if(!a.which&&(a.charCode||a.charCode===0?a.charCode:a.keyCode))a.which=a.charCode||a.keyCode;if(!a.metaKey&&a.ctrlKey)a.metaKey=a.ctrlKey;if(!a.which&&a.button!==v)a.which=a.button&1?1:a.button&2?3:a.button&4?2:0;return a},guid:1E8,proxy:c.proxy,special:{ready:{setup:c.bindReady,teardown:c.noop},live:{add:function(a,b){c.extend(a,b||{});a.guid+=b.selector+b.live;b.liveProxy=a;c.event.add(this,b.live,na,b)},remove:function(a){if(a.length){var b= +0,d=new RegExp("(^|\\.)"+a[0]+"(\\.|$)");c.each(c.data(this,"events").live||{},function(){d.test(this.type)&&b++});b<1&&c.event.remove(this,a[0],na)}},special:{}},beforeunload:{setup:function(a,b,d){if(this.setInterval)this.onbeforeunload=d;return false},teardown:function(a,b){if(this.onbeforeunload===b)this.onbeforeunload=null}}}};c.Event=function(a){if(!this.preventDefault)return new c.Event(a);if(a&&a.type){this.originalEvent=a;this.type=a.type}else this.type=a;this.timeStamp=J();this[G]=true}; +c.Event.prototype={preventDefault:function(){this.isDefaultPrevented=Z;var a=this.originalEvent;if(a){a.preventDefault&&a.preventDefault();a.returnValue=false}},stopPropagation:function(){this.isPropagationStopped=Z;var a=this.originalEvent;if(a){a.stopPropagation&&a.stopPropagation();a.cancelBubble=true}},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=Z;this.stopPropagation()},isDefaultPrevented:Y,isPropagationStopped:Y,isImmediatePropagationStopped:Y};var Aa=function(a){for(var b= +a.relatedTarget;b&&b!==this;)try{b=b.parentNode}catch(d){break}if(b!==this){a.type=a.data;c.event.handle.apply(this,arguments)}},Ba=function(a){a.type=a.data;c.event.handle.apply(this,arguments)};c.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(a,b){c.event.special[a]={setup:function(d){c.event.add(this,b,d&&d.selector?Ba:Aa,a)},teardown:function(d){c.event.remove(this,b,d&&d.selector?Ba:Aa)}}});if(!c.support.submitBubbles)c.event.special.submit={setup:function(a,b,d){if(this.nodeName.toLowerCase()!== +"form"){c.event.add(this,"click.specialSubmit."+d.guid,function(f){var e=f.target,i=e.type;if((i==="submit"||i==="image")&&c(e).closest("form").length)return ma("submit",this,arguments)});c.event.add(this,"keypress.specialSubmit."+d.guid,function(f){var e=f.target,i=e.type;if((i==="text"||i==="password")&&c(e).closest("form").length&&f.keyCode===13)return ma("submit",this,arguments)})}else return false},remove:function(a,b){c.event.remove(this,"click.specialSubmit"+(b?"."+b.guid:""));c.event.remove(this, +"keypress.specialSubmit"+(b?"."+b.guid:""))}};if(!c.support.changeBubbles){var da=/textarea|input|select/i;function Ca(a){var b=a.type,d=a.value;if(b==="radio"||b==="checkbox")d=a.checked;else if(b==="select-multiple")d=a.selectedIndex>-1?c.map(a.options,function(f){return f.selected}).join("-"):"";else if(a.nodeName.toLowerCase()==="select")d=a.selectedIndex;return d}function ea(a,b){var d=a.target,f,e;if(!(!da.test(d.nodeName)||d.readOnly)){f=c.data(d,"_change_data");e=Ca(d);if(a.type!=="focusout"|| +d.type!=="radio")c.data(d,"_change_data",e);if(!(f===v||e===f))if(f!=null||e){a.type="change";return c.event.trigger(a,b,d)}}}c.event.special.change={filters:{focusout:ea,click:function(a){var b=a.target,d=b.type;if(d==="radio"||d==="checkbox"||b.nodeName.toLowerCase()==="select")return ea.call(this,a)},keydown:function(a){var b=a.target,d=b.type;if(a.keyCode===13&&b.nodeName.toLowerCase()!=="textarea"||a.keyCode===32&&(d==="checkbox"||d==="radio")||d==="select-multiple")return ea.call(this,a)},beforeactivate:function(a){a= +a.target;a.nodeName.toLowerCase()==="input"&&a.type==="radio"&&c.data(a,"_change_data",Ca(a))}},setup:function(a,b,d){for(var f in T)c.event.add(this,f+".specialChange."+d.guid,T[f]);return da.test(this.nodeName)},remove:function(a,b){for(var d in T)c.event.remove(this,d+".specialChange"+(b?"."+b.guid:""),T[d]);return da.test(this.nodeName)}};var T=c.event.special.change.filters}r.addEventListener&&c.each({focus:"focusin",blur:"focusout"},function(a,b){function d(f){f=c.event.fix(f);f.type=b;return c.event.handle.call(this, +f)}c.event.special[b]={setup:function(){this.addEventListener(a,d,true)},teardown:function(){this.removeEventListener(a,d,true)}}});c.each(["bind","one"],function(a,b){c.fn[b]=function(d,f,e){if(typeof d==="object"){for(var i in d)this[b](i,f,d[i],e);return this}if(c.isFunction(f)){e=f;f=v}var j=b==="one"?c.proxy(e,function(n){c(this).unbind(n,j);return e.apply(this,arguments)}):e;return d==="unload"&&b!=="one"?this.one(d,f,e):this.each(function(){c.event.add(this,d,j,f)})}});c.fn.extend({unbind:function(a, +b){if(typeof a==="object"&&!a.preventDefault){for(var d in a)this.unbind(d,a[d]);return this}return this.each(function(){c.event.remove(this,a,b)})},trigger:function(a,b){return this.each(function(){c.event.trigger(a,b,this)})},triggerHandler:function(a,b){if(this[0]){a=c.Event(a);a.preventDefault();a.stopPropagation();c.event.trigger(a,b,this[0]);return a.result}},toggle:function(a){for(var b=arguments,d=1;d0){y=t;break}}t=t[g]}l[q]=y}}}var f=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^[\]]*\]|['"][^'"]*['"]|[^[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,e=0,i=Object.prototype.toString,j=false,n=true;[0,0].sort(function(){n=false;return 0});var o=function(g,h,k,l){k=k||[];var q=h=h||r;if(h.nodeType!==1&&h.nodeType!==9)return[];if(!g|| +typeof g!=="string")return k;for(var p=[],u,t,y,R,H=true,M=w(h),I=g;(f.exec(""),u=f.exec(I))!==null;){I=u[3];p.push(u[1]);if(u[2]){R=u[3];break}}if(p.length>1&&s.exec(g))if(p.length===2&&m.relative[p[0]])t=fa(p[0]+p[1],h);else for(t=m.relative[p[0]]?[h]:o(p.shift(),h);p.length;){g=p.shift();if(m.relative[g])g+=p.shift();t=fa(g,t)}else{if(!l&&p.length>1&&h.nodeType===9&&!M&&m.match.ID.test(p[0])&&!m.match.ID.test(p[p.length-1])){u=o.find(p.shift(),h,M);h=u.expr?o.filter(u.expr,u.set)[0]:u.set[0]}if(h){u= +l?{expr:p.pop(),set:A(l)}:o.find(p.pop(),p.length===1&&(p[0]==="~"||p[0]==="+")&&h.parentNode?h.parentNode:h,M);t=u.expr?o.filter(u.expr,u.set):u.set;if(p.length>0)y=A(t);else H=false;for(;p.length;){var D=p.pop();u=D;if(m.relative[D])u=p.pop();else D="";if(u==null)u=h;m.relative[D](y,u,M)}}else y=[]}y||(y=t);y||o.error(D||g);if(i.call(y)==="[object Array]")if(H)if(h&&h.nodeType===1)for(g=0;y[g]!=null;g++){if(y[g]&&(y[g]===true||y[g].nodeType===1&&E(h,y[g])))k.push(t[g])}else for(g=0;y[g]!=null;g++)y[g]&& +y[g].nodeType===1&&k.push(t[g]);else k.push.apply(k,y);else A(y,k);if(R){o(R,q,k,l);o.uniqueSort(k)}return k};o.uniqueSort=function(g){if(C){j=n;g.sort(C);if(j)for(var h=1;h":function(g,h){var k=typeof h==="string";if(k&&!/\W/.test(h)){h=h.toLowerCase();for(var l=0,q=g.length;l=0))k||l.push(u);else if(k)h[p]=false;return false},ID:function(g){return g[1].replace(/\\/g,"")},TAG:function(g){return g[1].toLowerCase()},CHILD:function(g){if(g[1]==="nth"){var h=/(-?)(\d*)n((?:\+|-)?\d*)/.exec(g[2]==="even"&&"2n"||g[2]==="odd"&& +"2n+1"||!/\D/.test(g[2])&&"0n+"+g[2]||g[2]);g[2]=h[1]+(h[2]||1)-0;g[3]=h[3]-0}g[0]=e++;return g},ATTR:function(g,h,k,l,q,p){h=g[1].replace(/\\/g,"");if(!p&&m.attrMap[h])g[1]=m.attrMap[h];if(g[2]==="~=")g[4]=" "+g[4]+" ";return g},PSEUDO:function(g,h,k,l,q){if(g[1]==="not")if((f.exec(g[3])||"").length>1||/^\w/.test(g[3]))g[3]=o(g[3],null,null,h);else{g=o.filter(g[3],h,k,true^q);k||l.push.apply(l,g);return false}else if(m.match.POS.test(g[0])||m.match.CHILD.test(g[0]))return true;return g},POS:function(g){g.unshift(true); +return g}},filters:{enabled:function(g){return g.disabled===false&&g.type!=="hidden"},disabled:function(g){return g.disabled===true},checked:function(g){return g.checked===true},selected:function(g){return g.selected===true},parent:function(g){return!!g.firstChild},empty:function(g){return!g.firstChild},has:function(g,h,k){return!!o(k[3],g).length},header:function(g){return/h\d/i.test(g.nodeName)},text:function(g){return"text"===g.type},radio:function(g){return"radio"===g.type},checkbox:function(g){return"checkbox"=== +g.type},file:function(g){return"file"===g.type},password:function(g){return"password"===g.type},submit:function(g){return"submit"===g.type},image:function(g){return"image"===g.type},reset:function(g){return"reset"===g.type},button:function(g){return"button"===g.type||g.nodeName.toLowerCase()==="button"},input:function(g){return/input|select|textarea|button/i.test(g.nodeName)}},setFilters:{first:function(g,h){return h===0},last:function(g,h,k,l){return h===l.length-1},even:function(g,h){return h%2=== +0},odd:function(g,h){return h%2===1},lt:function(g,h,k){return hk[3]-0},nth:function(g,h,k){return k[3]-0===h},eq:function(g,h,k){return k[3]-0===h}},filter:{PSEUDO:function(g,h,k,l){var q=h[1],p=m.filters[q];if(p)return p(g,k,h,l);else if(q==="contains")return(g.textContent||g.innerText||a([g])||"").indexOf(h[3])>=0;else if(q==="not"){h=h[3];k=0;for(l=h.length;k= +0}},ID:function(g,h){return g.nodeType===1&&g.getAttribute("id")===h},TAG:function(g,h){return h==="*"&&g.nodeType===1||g.nodeName.toLowerCase()===h},CLASS:function(g,h){return(" "+(g.className||g.getAttribute("class"))+" ").indexOf(h)>-1},ATTR:function(g,h){var k=h[1];g=m.attrHandle[k]?m.attrHandle[k](g):g[k]!=null?g[k]:g.getAttribute(k);k=g+"";var l=h[2];h=h[4];return g==null?l==="!=":l==="="?k===h:l==="*="?k.indexOf(h)>=0:l==="~="?(" "+k+" ").indexOf(h)>=0:!h?k&&g!==false:l==="!="?k!==h:l==="^="? +k.indexOf(h)===0:l==="$="?k.substr(k.length-h.length)===h:l==="|="?k===h||k.substr(0,h.length+1)===h+"-":false},POS:function(g,h,k,l){var q=m.setFilters[h[2]];if(q)return q(g,k,h,l)}}},s=m.match.POS;for(var x in m.match){m.match[x]=new RegExp(m.match[x].source+/(?![^\[]*\])(?![^\(]*\))/.source);m.leftMatch[x]=new RegExp(/(^(?:.|\r|\n)*?)/.source+m.match[x].source.replace(/\\(\d+)/g,function(g,h){return"\\"+(h-0+1)}))}var A=function(g,h){g=Array.prototype.slice.call(g,0);if(h){h.push.apply(h,g);return h}return g}; +try{Array.prototype.slice.call(r.documentElement.childNodes,0)}catch(B){A=function(g,h){h=h||[];if(i.call(g)==="[object Array]")Array.prototype.push.apply(h,g);else if(typeof g.length==="number")for(var k=0,l=g.length;k";var k=r.documentElement;k.insertBefore(g,k.firstChild);if(r.getElementById(h)){m.find.ID=function(l,q,p){if(typeof q.getElementById!=="undefined"&&!p)return(q=q.getElementById(l[1]))?q.id===l[1]||typeof q.getAttributeNode!=="undefined"&&q.getAttributeNode("id").nodeValue===l[1]?[q]:v:[]};m.filter.ID=function(l,q){var p=typeof l.getAttributeNode!=="undefined"&&l.getAttributeNode("id"); +return l.nodeType===1&&p&&p.nodeValue===q}}k.removeChild(g);k=g=null})();(function(){var g=r.createElement("div");g.appendChild(r.createComment(""));if(g.getElementsByTagName("*").length>0)m.find.TAG=function(h,k){k=k.getElementsByTagName(h[1]);if(h[1]==="*"){h=[];for(var l=0;k[l];l++)k[l].nodeType===1&&h.push(k[l]);k=h}return k};g.innerHTML="";if(g.firstChild&&typeof g.firstChild.getAttribute!=="undefined"&&g.firstChild.getAttribute("href")!=="#")m.attrHandle.href=function(h){return h.getAttribute("href", +2)};g=null})();r.querySelectorAll&&function(){var g=o,h=r.createElement("div");h.innerHTML="

          ";if(!(h.querySelectorAll&&h.querySelectorAll(".TEST").length===0)){o=function(l,q,p,u){q=q||r;if(!u&&q.nodeType===9&&!w(q))try{return A(q.querySelectorAll(l),p)}catch(t){}return g(l,q,p,u)};for(var k in g)o[k]=g[k];h=null}}();(function(){var g=r.createElement("div");g.innerHTML="
          ";if(!(!g.getElementsByClassName||g.getElementsByClassName("e").length=== +0)){g.lastChild.className="e";if(g.getElementsByClassName("e").length!==1){m.order.splice(1,0,"CLASS");m.find.CLASS=function(h,k,l){if(typeof k.getElementsByClassName!=="undefined"&&!l)return k.getElementsByClassName(h[1])};g=null}}})();var E=r.compareDocumentPosition?function(g,h){return g.compareDocumentPosition(h)&16}:function(g,h){return g!==h&&(g.contains?g.contains(h):true)},w=function(g){return(g=(g?g.ownerDocument||g:0).documentElement)?g.nodeName!=="HTML":false},fa=function(g,h){var k=[], +l="",q;for(h=h.nodeType?[h]:h;q=m.match.PSEUDO.exec(g);){l+=q[0];g=g.replace(m.match.PSEUDO,"")}g=m.relative[g]?g+"*":g;q=0;for(var p=h.length;q=0===d})};c.fn.extend({find:function(a){for(var b=this.pushStack("","find",a),d=0,f=0,e=this.length;f0)for(var i=d;i0},closest:function(a,b){if(c.isArray(a)){var d=[],f=this[0],e,i={},j;if(f&&a.length){e=0;for(var n=a.length;e +-1:c(f).is(e)){d.push({selector:j,elem:f});delete i[j]}}f=f.parentNode}}return d}var o=c.expr.match.POS.test(a)?c(a,b||this.context):null;return this.map(function(m,s){for(;s&&s.ownerDocument&&s!==b;){if(o?o.index(s)>-1:c(s).is(a))return s;s=s.parentNode}return null})},index:function(a){if(!a||typeof a==="string")return c.inArray(this[0],a?c(a):this.parent().children());return c.inArray(a.jquery?a[0]:a,this)},add:function(a,b){a=typeof a==="string"?c(a,b||this.context):c.makeArray(a);b=c.merge(this.get(), +a);return this.pushStack(pa(a[0])||pa(b[0])?b:c.unique(b))},andSelf:function(){return this.add(this.prevObject)}});c.each({parent:function(a){return(a=a.parentNode)&&a.nodeType!==11?a:null},parents:function(a){return c.dir(a,"parentNode")},parentsUntil:function(a,b,d){return c.dir(a,"parentNode",d)},next:function(a){return c.nth(a,2,"nextSibling")},prev:function(a){return c.nth(a,2,"previousSibling")},nextAll:function(a){return c.dir(a,"nextSibling")},prevAll:function(a){return c.dir(a,"previousSibling")}, +nextUntil:function(a,b,d){return c.dir(a,"nextSibling",d)},prevUntil:function(a,b,d){return c.dir(a,"previousSibling",d)},siblings:function(a){return c.sibling(a.parentNode.firstChild,a)},children:function(a){return c.sibling(a.firstChild)},contents:function(a){return c.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:c.makeArray(a.childNodes)}},function(a,b){c.fn[a]=function(d,f){var e=c.map(this,b,d);bb.test(a)||(f=d);if(f&&typeof f==="string")e=c.filter(f,e);e=this.length>1?c.unique(e): +e;if((this.length>1||db.test(f))&&cb.test(a))e=e.reverse();return this.pushStack(e,a,Q.call(arguments).join(","))}});c.extend({filter:function(a,b,d){if(d)a=":not("+a+")";return c.find.matches(a,b)},dir:function(a,b,d){var f=[];for(a=a[b];a&&a.nodeType!==9&&(d===v||a.nodeType!==1||!c(a).is(d));){a.nodeType===1&&f.push(a);a=a[b]}return f},nth:function(a,b,d){b=b||1;for(var f=0;a;a=a[d])if(a.nodeType===1&&++f===b)break;return a},sibling:function(a,b){for(var d=[];a;a=a.nextSibling)a.nodeType===1&&a!== +b&&d.push(a);return d}});var Fa=/ jQuery\d+="(?:\d+|null)"/g,V=/^\s+/,Ga=/(<([\w:]+)[^>]*?)\/>/g,eb=/^(?:area|br|col|embed|hr|img|input|link|meta|param)$/i,Ha=/<([\w:]+)/,fb=/"},F={option:[1,""],legend:[1,"
          ","
          "],thead:[1,"","
          "],tr:[2,"","
          "],td:[3,"","
          "], +col:[2,"","
          "],area:[1,"",""],_default:[0,"",""]};F.optgroup=F.option;F.tbody=F.tfoot=F.colgroup=F.caption=F.thead;F.th=F.td;if(!c.support.htmlSerialize)F._default=[1,"div
          ","
          "];c.fn.extend({text:function(a){if(c.isFunction(a))return this.each(function(b){var d=c(this);d.text(a.call(this,b,d.text()))});if(typeof a!=="object"&&a!==v)return this.empty().append((this[0]&&this[0].ownerDocument||r).createTextNode(a));return c.getText(this)}, +wrapAll:function(a){if(c.isFunction(a))return this.each(function(d){c(this).wrapAll(a.call(this,d))});if(this[0]){var b=c(a,this[0].ownerDocument).eq(0).clone(true);this[0].parentNode&&b.insertBefore(this[0]);b.map(function(){for(var d=this;d.firstChild&&d.firstChild.nodeType===1;)d=d.firstChild;return d}).append(this)}return this},wrapInner:function(a){if(c.isFunction(a))return this.each(function(b){c(this).wrapInner(a.call(this,b))});return this.each(function(){var b=c(this),d=b.contents();d.length? +d.wrapAll(a):b.append(a)})},wrap:function(a){return this.each(function(){c(this).wrapAll(a)})},unwrap:function(){return this.parent().each(function(){c.nodeName(this,"body")||c(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.appendChild(a)})},prepend:function(){return this.domManip(arguments,true,function(a){this.nodeType===1&&this.insertBefore(a,this.firstChild)})},before:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments, +false,function(b){this.parentNode.insertBefore(b,this)});else if(arguments.length){var a=c(arguments[0]);a.push.apply(a,this.toArray());return this.pushStack(a,"before",arguments)}},after:function(){if(this[0]&&this[0].parentNode)return this.domManip(arguments,false,function(b){this.parentNode.insertBefore(b,this.nextSibling)});else if(arguments.length){var a=this.pushStack(this,"after",arguments);a.push.apply(a,c(arguments[0]).toArray());return a}},clone:function(a){var b=this.map(function(){if(!c.support.noCloneEvent&& +!c.isXMLDoc(this)){var d=this.outerHTML,f=this.ownerDocument;if(!d){d=f.createElement("div");d.appendChild(this.cloneNode(true));d=d.innerHTML}return c.clean([d.replace(Fa,"").replace(V,"")],f)[0]}else return this.cloneNode(true)});if(a===true){qa(this,b);qa(this.find("*"),b.find("*"))}return b},html:function(a){if(a===v)return this[0]&&this[0].nodeType===1?this[0].innerHTML.replace(Fa,""):null;else if(typeof a==="string"&&!/ + + + + + diff --git a/passuser/src/main/resources/templates/PassInstant/passInstant/passInstant.html b/passuser/src/main/resources/templates/PassInstant/passInstant/passInstant.html new file mode 100644 index 0000000..221dcb4 --- /dev/null +++ b/passuser/src/main/resources/templates/PassInstant/passInstant/passInstant.html @@ -0,0 +1,276 @@ + + + + + 秘钥管理系统 - 主页 + + + + + + + + + + +
          + +
          +
          +
          +
          + +
          +
          + 密钥UUID密钥名称密钥长度密钥类型密钥有效期密钥上传时间密钥用户操作 +
          +
          +
          + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/passuser/src/main/resources/templates/PassInstant/passInstant/passInstant_add.html b/passuser/src/main/resources/templates/PassInstant/passInstant/passInstant_add.html new file mode 100644 index 0000000..928168d --- /dev/null +++ b/passuser/src/main/resources/templates/PassInstant/passInstant/passInstant_add.html @@ -0,0 +1,264 @@ + + + + + + layui + + + + + + + + +
          +
          +
          + +
          +
          +
          + 密钥UUID + 密钥名称 + 密钥类型 +
          +
          +
          +
          +
          + 密钥有效期 +
          +
          +
          +
          +
          +
          +
          + 提交 +
          +
          +
          + + + + diff --git a/passuser/src/main/resources/templates/PassInstant/passInstant/passInstant_download.html b/passuser/src/main/resources/templates/PassInstant/passInstant/passInstant_download.html new file mode 100644 index 0000000..c0a9719 --- /dev/null +++ b/passuser/src/main/resources/templates/PassInstant/passInstant/passInstant_download.html @@ -0,0 +1,41 @@ + +
          + + + +
          + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/passuser/src/main/resources/templates/PassInstant/passInstant/passInstant_edit.html b/passuser/src/main/resources/templates/PassInstant/passInstant/passInstant_edit.html new file mode 100644 index 0000000..f2c567f --- /dev/null +++ b/passuser/src/main/resources/templates/PassInstant/passInstant/passInstant_edit.html @@ -0,0 +1,35 @@ +@layout("/common/_container.html"){ +
          +
          +
          + +
          +
          + <#input id="passId" name="密钥UUID" value="${item.passId}" underline="true"/> + <#input id="passName" name="密钥名称" value="${item.passName}" underline="true"/> + <#input id="passLength" name="密钥长度" value="${item.passLength}" underline="true"/> + <#input id="passType" name="密钥类型" value="${item.passType}" underline="true"/> + <#input id="passChildfir" name="第一子密钥" value="${item.passChildfir}" /> +
          + +
          + <#input id="passChildsec" name="第二子密钥" value="${item.passChildsec}" underline="true"/> + <#input id="passChildthi" name="第三子密钥" value="${item.passChildthi}" underline="true"/> + <#input id="passExpiry" name="密钥有效期" value="${item.passExpiry}" underline="true"/> + <#input id="passCreatetime" name="密钥上传时间" value="${item.passCreatetime}" underline="true"/> + <#input id="passUserid" name="密钥用户" value="${item.passUserid}" /> +
          +
          + +
          +
          + <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="PassInstantInfoDlg.editSubmit()"/> + <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="PassInstantInfoDlg.close()"/> +
          +
          +
          + +
          +
          + +@} diff --git a/passuser/src/main/resources/templates/PassInstant/passInstant/passInstant_upload.html b/passuser/src/main/resources/templates/PassInstant/passInstant/passInstant_upload.html new file mode 100644 index 0000000..2dead41 --- /dev/null +++ b/passuser/src/main/resources/templates/PassInstant/passInstant/passInstant_upload.html @@ -0,0 +1,15 @@ + +
          +
          +
          + +
          +
          + +
          +
          + +
          +
          + +@} diff --git a/passuser/src/main/resources/templates/blackboard.html b/passuser/src/main/resources/templates/blackboard.html new file mode 100644 index 0000000..605b205 --- /dev/null +++ b/passuser/src/main/resources/templates/blackboard.html @@ -0,0 +1,14 @@ +@layout("/common/_container.html"){ +
          +
          +
          + @for(notice in noticeList){ +
          + + ${notice.content} +
          + @} +
          +
          +
          +@} diff --git a/passuser/src/main/resources/templates/common/_container.html b/passuser/src/main/resources/templates/common/_container.html new file mode 100644 index 0000000..02663d1 --- /dev/null +++ b/passuser/src/main/resources/templates/common/_container.html @@ -0,0 +1,71 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
          + ${layoutContent} +
          + + + diff --git a/passuser/src/main/resources/templates/common/_right.html b/passuser/src/main/resources/templates/common/_right.html new file mode 100644 index 0000000..9781492 --- /dev/null +++ b/passuser/src/main/resources/templates/common/_right.html @@ -0,0 +1,53 @@ +
          +
          + +
          +
          + + + +
          + + +
          + 退出 +
          +
          + +
          + +
          \ No newline at end of file diff --git a/passuser/src/main/resources/templates/common/_tab.html b/passuser/src/main/resources/templates/common/_tab.html new file mode 100644 index 0000000..e572b3d --- /dev/null +++ b/passuser/src/main/resources/templates/common/_tab.html @@ -0,0 +1,74 @@ + \ No newline at end of file diff --git a/passuser/src/main/resources/templates/common/_theme.html b/passuser/src/main/resources/templates/common/_theme.html new file mode 100644 index 0000000..4c093d8 --- /dev/null +++ b/passuser/src/main/resources/templates/common/_theme.html @@ -0,0 +1,84 @@ + \ No newline at end of file diff --git a/passuser/src/main/resources/templates/common/tags/NameCon.tag b/passuser/src/main/resources/templates/common/tags/NameCon.tag new file mode 100644 index 0000000..37cbe1d --- /dev/null +++ b/passuser/src/main/resources/templates/common/tags/NameCon.tag @@ -0,0 +1,14 @@ +@/* + 名称查询条件标签的参数说明: + + name : 查询条件的名称 + id : 查询内容的input框id +@*/ +
          +
          + +
          + +
          \ No newline at end of file diff --git a/passuser/src/main/resources/templates/common/tags/SelectCon.tag b/passuser/src/main/resources/templates/common/tags/SelectCon.tag new file mode 100644 index 0000000..a350fc9 --- /dev/null +++ b/passuser/src/main/resources/templates/common/tags/SelectCon.tag @@ -0,0 +1,16 @@ +@/* + 选择查询条件标签的参数说明: + + name : 查询条件的名称 + id : 查询内容的input框id +@*/ +
          +
          + +
          + +
          \ No newline at end of file diff --git a/passuser/src/main/resources/templates/common/tags/TimeCon.tag b/passuser/src/main/resources/templates/common/tags/TimeCon.tag new file mode 100644 index 0000000..a1fb8a3 --- /dev/null +++ b/passuser/src/main/resources/templates/common/tags/TimeCon.tag @@ -0,0 +1,15 @@ +@/* + 时间查询条件标签的参数说明: + + name : 查询条件的名称 + id : 查询内容的input框id + isTime : 日期是否带有小时和分钟(true/false) +@*/ +
          +
          + +
          + +
          \ No newline at end of file diff --git a/passuser/src/main/resources/templates/common/tags/avatar.tag b/passuser/src/main/resources/templates/common/tags/avatar.tag new file mode 100644 index 0000000..ce6f2f6 --- /dev/null +++ b/passuser/src/main/resources/templates/common/tags/avatar.tag @@ -0,0 +1,29 @@ +@/* + 头像参数的说明: + name : 名称 + id : 头像的id +@*/ +
          + +
          +
          +
          + @}else{ + src="${ctxPath}/kaptcha/${avatarImg}">
          + @} +
          +
          +
          +
          +  上传 +
          +
          + +
      +@if(isNotEmpty(underline) && underline == 'true'){ +
      +@} + + diff --git a/passuser/src/main/resources/templates/common/tags/button.tag b/passuser/src/main/resources/templates/common/tags/button.tag new file mode 100644 index 0000000..86bb011 --- /dev/null +++ b/passuser/src/main/resources/templates/common/tags/button.tag @@ -0,0 +1,26 @@ +@/* + 按钮标签中各个参数的说明: + + btnType : 按钮的类型决定了颜色(default-灰色,primary-绿色,success-蓝色,info-淡蓝色,warning-黄色,danger-红色,white-白色) + space : 按钮左侧是否有间隔(true/false) + clickFun : 点击按钮所执行的方法 + icon : 按钮上的图标的样式 + name : 按钮名称 +@*/ + +@var spaceCss = ""; +@var btnType = ""; +@if(isEmpty(space) || space == "false"){ +@ spaceCss = ""; +@}else{ +@ spaceCss = "button-margin"; +@} +@if(isEmpty(btnCss)){ +@ btnType = "primary"; +@}else{ +@ btnType = btnCss; +@} + + diff --git a/passuser/src/main/resources/templates/common/tags/input.tag b/passuser/src/main/resources/templates/common/tags/input.tag new file mode 100644 index 0000000..bb19b00 --- /dev/null +++ b/passuser/src/main/resources/templates/common/tags/input.tag @@ -0,0 +1,51 @@ +@/* + 表单中input框标签中各个参数的说明: + + hidden : input hidden框的id + id : input框id + name : input框名称 + readonly : readonly属性 + clickFun : 点击事件的方法名 + style : 附加的css属性 +@*/ +
      + +
      + + @if(isNotEmpty(hidden)){ + + @} + + @if(isNotEmpty(selectFlag)){ + + @} +
      +
      +@if(isNotEmpty(underline) && underline == 'true'){ +
      +@} + + diff --git a/passuser/src/main/resources/templates/common/tags/select.tag b/passuser/src/main/resources/templates/common/tags/select.tag new file mode 100644 index 0000000..15e6def --- /dev/null +++ b/passuser/src/main/resources/templates/common/tags/select.tag @@ -0,0 +1,22 @@ +@/* + select标签中各个参数的说明: + name : select的名称 + id : select的id + underline : 是否带分割线 +@*/ +
      + +
      + + @if(isNotEmpty(hidden)){ + + @} +
      +
      +@if(isNotEmpty(underline) && underline == 'true'){ +
      +@} + + diff --git a/passuser/src/main/resources/templates/common/tags/table.tag b/passuser/src/main/resources/templates/common/tags/table.tag new file mode 100644 index 0000000..3760417 --- /dev/null +++ b/passuser/src/main/resources/templates/common/tags/table.tag @@ -0,0 +1,12 @@ +@/* + 表格标签的参数说明: + + id : table表格的id +@*/ + + + + + + +
      \ No newline at end of file diff --git a/passuser/src/main/resources/templates/common/tags/tag_tips b/passuser/src/main/resources/templates/common/tags/tag_tips new file mode 100644 index 0000000..3a5d5d4 --- /dev/null +++ b/passuser/src/main/resources/templates/common/tags/tag_tips @@ -0,0 +1,22 @@ +1 dictSelector(字典选择器) + 此标签是为了方便在前台form表单中使用系统中维护的字典而开发的,具体说明如下: +1.1 标签样例 + <#dictSelector id="sex" name ="sex" code="sys_sex" readonly="readonly" label="性别" underline="true" value="${user.sex}" /> +1.2 属性说明 + id: (非必须) 控件的id + name: (非必须) 控件的name + code:(必须) 字典类型编码,根据code的值去后台查询该类型的字典。 + type:(非必须) 控件类型,可选项为[select,radio,checkbox],标签会根据填写的类型,生成不同的控件。 + searchnum:(非必须)下拉框达到多少个,开启搜索框,默认10个,type为select起效。 + label:(非必须) 字典属性名称 + width:(非必须) 控件的宽度单位为px,type为select起效。 + value: (非必须) 控件默认值,多选时值要用,分隔。 + placeholder:(非必须) 控件提示信息,type为select起效。 + multiple:(非必须) 是否开启多选,可选值[true,false],默认为false,type为select起效。 + underline:(非必须) 是否显示分割线,可选值[true,false],默认为false。 + onchange:(非必须) onchange事件方法名称,会传入更改后的值作为参数,例:onchange="myOnChange" function myOnChange(newVal){}。 + readonly:(非必须)只读控件,可选值[true,false],默认false + disabled:(非必须) 禁用控件,可选值[true,false],默认false + + + diff --git a/passuser/src/main/resources/templates/index.html b/passuser/src/main/resources/templates/index.html new file mode 100644 index 0000000..dbb16eb --- /dev/null +++ b/passuser/src/main/resources/templates/index.html @@ -0,0 +1,48 @@ + + + + + + + + 创新课程管理系统 - 主页 + + + + + + + +
      + + + @include("/common/_tab.html"){} + + + + @include("/common/_right.html"){} + + + + @include("/common/_theme.html"){} + + +
      + + + + + + + + + + + + + + + + + + diff --git a/passuser/src/main/resources/templates/login.html b/passuser/src/main/resources/templates/login.html new file mode 100644 index 0000000..0d8e54b --- /dev/null +++ b/passuser/src/main/resources/templates/login.html @@ -0,0 +1,65 @@ + + + + + + + 创新课程系统 - 登录 + + + + + + + + + + + + +
      +
      +
      +

      欢迎使用创新课程管理系统

      + +
      +

      创新课程,让课程管理更加高效有趣,更加智能化!

      + +
      +

      ${tips!}

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

      +
      +
      +
      + + + + + + diff --git a/passuser/src/main/resources/templates/system/code/code.html b/passuser/src/main/resources/templates/system/code/code.html new file mode 100644 index 0000000..cacd239 --- /dev/null +++ b/passuser/src/main/resources/templates/system/code/code.html @@ -0,0 +1,47 @@ +@layout("/common/_container.html"){ +
      +
      +
      +
      +
      代码生成
      +
      +
      +
      +
      + +
      + 例如:system +
      +
      +
      + +
      + 例如:测试 +
      +
      +
      +
      + +
      + 例如:test +
      +
      +
      +
      + +
      + 默认路径为D:\ideaSpace\guns,可修改为您的项目的路径 +
      +
      +
      +
      + +
      +
      +
      +
      +
      +
      +
      + +@} diff --git a/passuser/src/main/resources/templates/system/dept/dept.html b/passuser/src/main/resources/templates/system/dept/dept.html new file mode 100644 index 0000000..a0570a2 --- /dev/null +++ b/passuser/src/main/resources/templates/system/dept/dept.html @@ -0,0 +1,38 @@ +@layout("/common/_container.html"){ +
      +
      +
      +
      +
      部门管理
      +
      +
      +
      +
      +
      +
      + <#NameCon id="condition" name="名称" /> +
      +
      + <#button name="搜索" icon="fa-search" clickFun="Dept.search()"/> +
      +
      + + <#table id="DeptTable"/> +
      +
      +
      +
      +
      +
      + +@} diff --git a/passuser/src/main/resources/templates/system/dept/dept_add.html b/passuser/src/main/resources/templates/system/dept/dept_add.html new file mode 100644 index 0000000..8538efb --- /dev/null +++ b/passuser/src/main/resources/templates/system/dept/dept_add.html @@ -0,0 +1,42 @@ +@layout("/common/_container.html"){ +
      +
      +
      + + + +
      +
      + <#input id="simplename" name="学校名称*" underline="true"/> + + <#input id="fullname" name="部门全称*" underline="true"/> + + <#input id="schoolType" name="学校类型" underline="true"/> +
      +
      + <#input id="num" name="排序" underline="true"/> + <#input id="tips" name="备注" underline="true"/> + <#input id="pName" name="上级部门*" readonly="readonly" hidden="pid" + clickFun="DeptInfoDlg.showDeptSelectTree(); return false;" + style="background-color: #ffffff !important;"/> +
      +
      + + + + +
      +
      + <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="DeptInfoDlg.addSubmit()"/> + <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="DeptInfoDlg.close()"/> +
      +
      +
      + +
      +
      + +@} diff --git a/passuser/src/main/resources/templates/system/dept/dept_edit.html b/passuser/src/main/resources/templates/system/dept/dept_edit.html new file mode 100644 index 0000000..7be74b3 --- /dev/null +++ b/passuser/src/main/resources/templates/system/dept/dept_edit.html @@ -0,0 +1,44 @@ +@layout("/common/_container.html"){ +
      +
      +
      + + + +
      +
      + <#input id="simplename" name="部门名称" underline="true" value="${dept.simplename}"/> + + <#input id="fullname" name="部门全称" underline="true" value="${dept.fullname}"/> + <#input id="schoolType" name="学校类型" underline="true" value="${dept.schoolType}"/> + <#input id="tips" name="备注" underline="true" value="${dept.tips}"/> +
      +
      + <#input id="num" name="排序" underline="true" value="${dept.num}"/> + + + <#input id="pName" name="上级部门" readonly="readonly" hidden="pid" + hiddenValue="${dept.pid}" value="${pName}" + clickFun="DeptInfoDlg.showDeptSelectTree(); return false;" + style="background-color: #ffffff !important;"/> +
      +
      + + + + +
      +
      + <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="DeptInfoDlg.editSubmit()"/> + <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="DeptInfoDlg.close()"/> +
      +
      +
      + +
      +
      + +@} diff --git a/passuser/src/main/resources/templates/system/dict/dict.html b/passuser/src/main/resources/templates/system/dict/dict.html new file mode 100644 index 0000000..2bf81ee --- /dev/null +++ b/passuser/src/main/resources/templates/system/dict/dict.html @@ -0,0 +1,38 @@ +@layout("/common/_container.html"){ +
      +
      +
      +
      +
      字典管理
      +
      +
      +
      +
      +
      +
      + <#NameCon id="condition" name="名称" /> +
      +
      + <#button name="搜索" icon="fa-search" clickFun="Dict.search()"/> +
      +
      + + <#table id="DictTable"/> +
      +
      +
      +
      +
      +
      + +@} diff --git a/passuser/src/main/resources/templates/system/dict/dict_add.html b/passuser/src/main/resources/templates/system/dict/dict_add.html new file mode 100644 index 0000000..f7e8de3 --- /dev/null +++ b/passuser/src/main/resources/templates/system/dict/dict_add.html @@ -0,0 +1,64 @@ +@layout("/common/_container.html"){ +
      +
      +
      + + + +
      +
      +
      + +
      + +
      + +
      + +
      + +
      + <#button btnCss="info" name="增加" icon="fa-plus" clickFun="DictInfoDlg.addItem()"/> +
      +
      +
      + +
      + +
      +
      +
      + +
      +
      +
      +
      + <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="DictInfoDlg.addSubmit()"/> + <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="DictInfoDlg.close()"/> +
      +
      +
      +
      + + + + + @} \ No newline at end of file diff --git a/passuser/src/main/resources/templates/system/dict/dict_edit.html b/passuser/src/main/resources/templates/system/dict/dict_edit.html new file mode 100644 index 0000000..aca3d70 --- /dev/null +++ b/passuser/src/main/resources/templates/system/dict/dict_edit.html @@ -0,0 +1,86 @@ +@layout("/common/_container.html"){ +
      +
      +
      + + + +
      +
      + +
      + + +
      + +
      + + +
      + + +
      + +
      + <#button btnCss="info" name="增加" icon="fa-plus" clickFun="DictInfoDlg.addItem()"/> +
      +
      +
      + +
      + +
      +
      +
      + @for(item in subDicts){ +
      + +
      + +
      + +
      + +
      + +
      + +
      +
      + <#button btnCss="danger" name="删除" id="cancel" icon="fa-remove" clickFun="DictInfoDlg.deleteItem(event)"/> +
      +
      + @} + +
      +
      +
      + <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="DictInfoDlg.editSubmit()"/> + <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="DictInfoDlg.close()"/> +
      +
      +
      +
      + + + + + @} \ No newline at end of file diff --git a/passuser/src/main/resources/templates/system/log/log.html b/passuser/src/main/resources/templates/system/log/log.html new file mode 100644 index 0000000..9b396c2 --- /dev/null +++ b/passuser/src/main/resources/templates/system/log/log.html @@ -0,0 +1,46 @@ +@layout("/common/_container.html"){ +
      +
      +
      +
      +
      业务日志
      +
      +
      +
      +
      +
      +
      + <#TimeCon id="beginTime" name="开始时间" isTime="false" pattern="YYYY-MM-DD" /> +
      +
      + <#TimeCon id="endTime" name="结束时间" isTime="false" pattern="YYYY-MM-DD" /> +
      +
      + <#NameCon id="logName" name="日志名称" /> +
      +
      + <#SelectCon id="logType" name="日志类型" > + + + + +
      +
      + <#button name="搜索" icon="fa-search" clickFun="OptLog.search()"/> +
      +
      + + <#table id="OptLogTable"/> +
      +
      +
      +
      +
      +
      + +@} diff --git a/passuser/src/main/resources/templates/system/log/login_log.html b/passuser/src/main/resources/templates/system/log/login_log.html new file mode 100644 index 0000000..bbf0bd1 --- /dev/null +++ b/passuser/src/main/resources/templates/system/log/login_log.html @@ -0,0 +1,36 @@ +@layout("/common/_container.html"){ +
      +
      +
      +
      +
      登录日志
      +
      +
      +
      +
      +
      +
      + <#TimeCon id="beginTime" name="开始时间" isTime="false" pattern="YYYY-MM-DD" /> +
      +
      + <#TimeCon id="endTime" name="结束时间" isTime="false" pattern="YYYY-MM-DD" /> +
      +
      + <#NameCon id="logName" name="日志名称" /> +
      +
      + <#button name="搜索" icon="fa-search" clickFun="LoginLog.search()"/> +
      +
      + + <#table id="LoginLogTable"/> +
      +
      +
      +
      +
      +
      + +@} diff --git a/passuser/src/main/resources/templates/system/menu/menu.html b/passuser/src/main/resources/templates/system/menu/menu.html new file mode 100644 index 0000000..ddf8f10 --- /dev/null +++ b/passuser/src/main/resources/templates/system/menu/menu.html @@ -0,0 +1,39 @@ +@layout("/common/_container.html"){ +
      +
      +
      +
      +
      菜单管理
      +
      +
      +
      +
      +
      +
      + <#NameCon id="menuName" name="菜单名称" /> +
      +
      + <#NameCon id="level" name="层级" /> +
      +
      + <#button name="搜索" icon="fa-search" clickFun="Menu.search()"/> +
      +
      + + <#table id="menuTable"/> +
      +
      +
      +
      +
      +
      + +@} diff --git a/passuser/src/main/resources/templates/system/menu/menu_add.html b/passuser/src/main/resources/templates/system/menu/menu_add.html new file mode 100644 index 0000000..7eae700 --- /dev/null +++ b/passuser/src/main/resources/templates/system/menu/menu_add.html @@ -0,0 +1,40 @@ +@layout("/common/_container.html"){ +
      +
      + + +
      +
      + +@} diff --git a/passuser/src/main/resources/templates/system/menu/menu_edit.html b/passuser/src/main/resources/templates/system/menu/menu_edit.html new file mode 100644 index 0000000..546e480 --- /dev/null +++ b/passuser/src/main/resources/templates/system/menu/menu_edit.html @@ -0,0 +1,42 @@ +@layout("/common/_container.html"){ +
      +
      + + +
      +
      + +@} diff --git a/passuser/src/main/resources/templates/system/notice/notice.html b/passuser/src/main/resources/templates/system/notice/notice.html new file mode 100644 index 0000000..f373984 --- /dev/null +++ b/passuser/src/main/resources/templates/system/notice/notice.html @@ -0,0 +1,38 @@ +@layout("/common/_container.html"){ +
      +
      +
      +
      +
      通知管理
      +
      +
      +
      +
      +
      +
      + <#NameCon id="condition" name="名称" /> +
      +
      + <#button name="搜索" icon="fa-search" clickFun="Notice.search()"/> +
      +
      + + <#table id="NoticeTable"/> +
      +
      +
      +
      +
      +
      + +@} diff --git a/passuser/src/main/resources/templates/system/notice/notice_add.html b/passuser/src/main/resources/templates/system/notice/notice_add.html new file mode 100644 index 0000000..aeaee47 --- /dev/null +++ b/passuser/src/main/resources/templates/system/notice/notice_add.html @@ -0,0 +1,43 @@ +@layout("/common/_container.html"){ +
      +
      +
      + + + +
      +
      +
      + +
      + +
      +
      +
      + +
      +
      +
      +
      +
      +
      +
      + + + +
      +
      + <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="NoticeInfoDlg.addSubmit()"/> + <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="NoticeInfoDlg.close()"/> +
      +
      +
      + +
      +
      + + +@} diff --git a/passuser/src/main/resources/templates/system/notice/notice_edit.html b/passuser/src/main/resources/templates/system/notice/notice_edit.html new file mode 100644 index 0000000..051600c --- /dev/null +++ b/passuser/src/main/resources/templates/system/notice/notice_edit.html @@ -0,0 +1,39 @@ +@layout("/common/_container.html"){ +
      +
      +
      + + + + +
      +
      +
      + +
      + + +
      +
      +
      + +
      +
      +
      +
      +
      +
      +
      + +
      +
      + <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="NoticeInfoDlg.editSubmit()"/> + <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="NoticeInfoDlg.close()"/> +
      +
      +
      +
      +
      + + +@} diff --git a/passuser/src/main/resources/templates/system/role/role.html b/passuser/src/main/resources/templates/system/role/role.html new file mode 100644 index 0000000..316cf85 --- /dev/null +++ b/passuser/src/main/resources/templates/system/role/role.html @@ -0,0 +1,41 @@ +@layout("/common/_container.html"){ +
      +
      +
      +
      +
      角色管理
      +
      +
      +
      +
      +
      +
      + <#NameCon id="roleName" name="角色名称" /> +
      +
      + <#button name="搜索" icon="fa-search" clickFun="Role.search()"/> +
      +
      + + <#table id="roleTable"/> +
      +
      +
      +
      +
      +
      + +@} diff --git a/passuser/src/main/resources/templates/system/role/role_add.html b/passuser/src/main/resources/templates/system/role/role_add.html new file mode 100644 index 0000000..66d7f65 --- /dev/null +++ b/passuser/src/main/resources/templates/system/role/role_add.html @@ -0,0 +1,47 @@ +@layout("/common/_container.html"){ +
      +
      +
      + + + +
      +
      + <#input id="name" name="角色名称*" underline="true"/> + <#input id="pName" name="上级名称*" underline="true" hidden="pid" readonly="readonly" + clickFun="RolInfoDlg.showPNameSelectTree(); return false;" + style="background-color: #ffffff !important;"/> + <#input id="deptName" name="部门名称" hidden="deptid" readonly="readonly" + clickFun="RolInfoDlg.showDeptSelectTree(); return false;" + style="background-color: #ffffff !important;"/> +
      +
      + <#input id="tips" name="别名*" underline="true"/> + <#input id="num" name="排序"/> +
      +
      + + + + + + + +
      +
      + <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="RolInfoDlg.addSubmit()"/> + <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="RolInfoDlg.close()"/> +
      +
      +
      + +
      +
      + +@} diff --git a/passuser/src/main/resources/templates/system/role/role_assign.html b/passuser/src/main/resources/templates/system/role/role_assign.html new file mode 100644 index 0000000..628a27b --- /dev/null +++ b/passuser/src/main/resources/templates/system/role/role_assign.html @@ -0,0 +1,75 @@ +@layout("/common/_container.html"){ + + + + + + +
      +
      +
      +
      +
      ${roleName!}
      +
      +
      +
        +
        +
        +
        +
        +
        + +   + +
        +
        +
        +@} diff --git a/passuser/src/main/resources/templates/system/role/role_edit.html b/passuser/src/main/resources/templates/system/role/role_edit.html new file mode 100644 index 0000000..4bb543d --- /dev/null +++ b/passuser/src/main/resources/templates/system/role/role_edit.html @@ -0,0 +1,47 @@ + @layout("/common/_container.html"){ +
        +
        +
        + + + +
        +
        + <#input id="name" name="角色名称" underline="true" value="${role.name}"/> + <#input id="pName" name="上级名称" underline="true" hidden="pid" hiddenValue="${role.pid}" readonly="readonly" value="${pName}" + clickFun="RolInfoDlg.showPNameSelectTree(); return false;" + style="background-color: #ffffff !important;"/> + <#input id="deptName" name="部门名称" hidden="deptid" hiddenValue="${role.deptid}" readonly="readonly" value="${deptName}" + clickFun="RolInfoDlg.showDeptSelectTree(); return false;" + style="background-color: #ffffff !important;"/> +
        +
        + <#input id="tips" name="别名" underline="true" value="${role.tips}"/> + <#input id="num" name="排序" value="${role.num}"/> +
        +
        + + + + + + + +
        +
        + <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="RolInfoDlg.editSubmit()"/> + <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="RolInfoDlg.close()"/> +
        +
        +
        + +
        +
        + +@} diff --git a/passuser/src/main/resources/templates/system/user/user.html b/passuser/src/main/resources/templates/system/user/user.html new file mode 100644 index 0000000..f823853 --- /dev/null +++ b/passuser/src/main/resources/templates/system/user/user.html @@ -0,0 +1,85 @@ +@layout("/common/_container.html"){ +
        +
        +
        +
        +
        用户管理
        +
        +
        +
        +
        +
        +
        +
        +
        组织机构
        +
        +
          +
          +
          +
          +
          +
          +
          +
          +
          + <#NameCon id="name" name="用户名称" placeholder="帐号/姓名/手机号"/> +
          +
          + <#TimeCon id="beginTime" name="注册开始日期" isTime="false"/> +
          +
          + <#TimeCon id="endTime" name="注册结束日期" isTime="false"/> +
          +
          +
          +
          +
          +
          + <#button name="搜索" icon="fa-search" clickFun="MgrUser.search()"/> + <#button name="重置" icon="fa-trash" clickFun="MgrUser.resetSearch()" space="true"/> +
          +
          +
          +
          + + <#table id="managerTable"/> +
          +
          +
          +
          +
          +
          +
          +
          + + +@} diff --git a/passuser/src/main/resources/templates/system/user/user_add.html b/passuser/src/main/resources/templates/system/user/user_add.html new file mode 100644 index 0000000..9ce3c49 --- /dev/null +++ b/passuser/src/main/resources/templates/system/user/user_add.html @@ -0,0 +1,63 @@ +@layout("/common/_container.html"){ +
          +
          +
          + + + +
          +
          + <#input id="account" name="账户*" underline="true"/> + + <#select id="sex" name="性别" underline="true"> + + + + + <#input id="password" name="密码*" underline="true" type="password"/> + + <#input id="roleid" name="角色" underline="true" disabled="disabled"/> + + <#input id="email" name="邮箱" type="email"/> + +
          +
          +
          + <#input id="name" name="姓名*" underline="true"/> + + <#input id="birthday" name="出生日期*" underline="true" type="text"/> + + <#input id="rePassword" name="确认密码*" type="password" underline="true"/> + + <#input id="citySel" name="部门*" underline="true" readonly="readonly" hidden="deptid" + clickFun="UserInfoDlg.showDeptSelectTree(); return false;" + style="background-color: #ffffff !important;"/> + + <#input id="phone" name="电话"/> +
          +
          +
          + + + + +
          +
          + <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="UserInfoDlg.addSubmit()"/> + <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="UserInfoDlg.close()"/> +
          +
          +
          + +
          +
          + + +@} diff --git a/passuser/src/main/resources/templates/system/user/user_changPwd.html b/passuser/src/main/resources/templates/system/user/user_changPwd.html new file mode 100644 index 0000000..79f5537 --- /dev/null +++ b/passuser/src/main/resources/templates/system/user/user_changPwd.html @@ -0,0 +1,258 @@ + + + + + + 秘钥管理系统 - 修改密码 + + + + + + + + +
          +
          +
          +
          +
          +
          + 旧密码 + 新密码 + 再输入一遍 +
          +
          +
          +
          +
          +
          +
          +
          + 提交 +
          +
          +
          + + + + diff --git a/passuser/src/main/resources/templates/system/user/user_edit.html b/passuser/src/main/resources/templates/system/user/user_edit.html new file mode 100644 index 0000000..717b355 --- /dev/null +++ b/passuser/src/main/resources/templates/system/user/user_edit.html @@ -0,0 +1,60 @@ +@layout("/common/_container.html"){ +
          +
          +
          + + + + +
          +
          + <#input id="account" name="账户" underline="true" value="${user.account}" disabled="disabled"/> + + <#select id="sex" name="性别" underline="true"> + + + + + <#input id="roleid" name="角色" underline="true" value="${roleName}" disabled="disabled"/> + + <#input id="email" name="邮箱" type="email" value="${user.email}"/> +
          +
          +
          + <#input id="name" name="姓名" underline="true" value="${user.name}"/> + + <#input id="birthday" name="出生日期" underline="true" type="text" + value="${user.birthday}"/> + + <#input id="citySel" name="部门" underline="true" readonly="readonly" hidden="deptid" hiddenValue="${user.deptid}" value="${deptName}" + clickFun="UserInfoDlg.showDeptSelectTree(); return false;" + style="background-color: #ffffff !important;"/> + + <#input id="phone" name="电话" value="${user.phone}"/> +
          +
          +
          + + + + +
          +
          + <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="UserInfoDlg.editSubmit()"/> + <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="UserInfoDlg.close()"/> +
          +
          +
          + +
          +
          + + +@} diff --git a/passuser/src/main/resources/templates/system/user/user_roleassign.html b/passuser/src/main/resources/templates/system/user/user_roleassign.html new file mode 100644 index 0000000..8131bc8 --- /dev/null +++ b/passuser/src/main/resources/templates/system/user/user_roleassign.html @@ -0,0 +1,79 @@ +@layout("/common/_container.html"){ + + + + + + +
          +
          +
          +
          +
          ${userAccount!}
          +
          +
          +
            +
            +
            +
            +
            +
            + +   + +
            +
            +
            + +@} diff --git a/passuser/src/main/resources/templates/system/user/user_teacherAdd.html b/passuser/src/main/resources/templates/system/user/user_teacherAdd.html new file mode 100644 index 0000000..c1d0074 --- /dev/null +++ b/passuser/src/main/resources/templates/system/user/user_teacherAdd.html @@ -0,0 +1,148 @@ + + + + 密钥管理系统 - 用户注册 + + + + + + + + + + + + + +
            用户注册:
            +
            + + + + + + + + + + + + + + + + + + + + + + + + +
            请输入账号:
            请输入密码:
            请确认密码:
            请输入口令密钥:
            + +
            +
            + + \ No newline at end of file diff --git a/passuser/src/main/resources/templates/system/user/user_view.html b/passuser/src/main/resources/templates/system/user/user_view.html new file mode 100644 index 0000000..7051c34 --- /dev/null +++ b/passuser/src/main/resources/templates/system/user/user_view.html @@ -0,0 +1,78 @@ +@layout("/common/_container.html"){ +
            +
            +
            +
            用户管理
            +
            +
            +
            +
            +
            +
            +
            + + + + +
            +
            + <#avatar id="avatar" name="头像" underline="true" avatarImg="${user.avatar}"/> + + <#input id="account" name="账户" underline="true" value="${user.account}" disabled="disabled" /> + + <#select id="sex" name="性别" underline="true" value="${user.sex}"> + + + + + <#input id="roleid" name="角色" underline="true" value="${roleName}" disabled="disabled"/> + + <#input id="email" name="邮箱" type="email" value="${user.email}"/> +
            + +
            +
            + <#input id="name" name="姓名" underline="true" value="${user.name}"/> + + <#input id="birthday" name="出生日期" underline="true" type="text" + value="${user.birthday}"/> + + <#input id="citySel" name="部门" underline="true" readonly="readonly" value="${deptName}" disabled="disabled" + hidden="deptid" hiddenValue="${user.deptid}" + clickFun="UserInfoDlg.showInfoDeptSelectTree(); return false;" + style="background-color: #ffffff !important;" + selectFlag="true" selectId="menuContent" selectTreeId="treeDemo" selectStyle="width:250px !important;"/> + + <#input id="phone" name="电话" value="${user.phone}"/> + <#input id="assistantId" name="助教账号" value="${user.assistantId}"/> + <#input id="teamId" name="结对小组编号" value="${user.teamId}" disabled="disabled"/> + <#input id="groupId" name="团队小组编号" value="${user.groupId}" disabled="disabled"/> +
            +
            +
            + +
            +
            +
            +
            + +
            +
            + <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="UserInfoDlg.editSubmit()"/> +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            + + +@} diff --git a/sql/us.sql b/sql/us.sql new file mode 100644 index 0000000..ccdc60e --- /dev/null +++ b/sql/us.sql @@ -0,0 +1,432 @@ +/* + Navicat Premium Data Transfer + + Source Server : 3306 + Source Server Type : MySQL + Source Server Version : 50646 + Source Host : localhost:3306 + Source Schema : us + + Target Server Type : MySQL + Target Server Version : 50646 + File Encoding : 65001 + + Date: 20/05/2020 09:19:31 +*/ + +SET NAMES utf8mb4; +SET FOREIGN_KEY_CHECKS = 0; + +-- ---------------------------- +-- Table structure for p_pass_instant +-- ---------------------------- +DROP TABLE IF EXISTS `p_pass_instant`; +CREATE TABLE `p_pass_instant` ( + `pass_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '密钥UUID', + `pass_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '密钥名称', + `pass_length` int(255) NULL DEFAULT NULL COMMENT '密钥长度', + `pass_type` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '密钥类型', + `pass_childfir` varchar(1000) CHARACTER SET utf32 COLLATE utf32_general_ci NULL DEFAULT NULL COMMENT '第一子密钥', + `pass_childsec` varchar(1000) CHARACTER SET utf32 COLLATE utf32_general_ci NULL DEFAULT NULL COMMENT '第二子密钥', + `pass_childthi` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '第三子密钥', + `pass_expiry` date NULL DEFAULT NULL COMMENT '密钥有效期', + `pass_createtime` date NULL DEFAULT NULL COMMENT '密钥上传时间', + `pass_userid` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '密钥用户', + PRIMARY KEY (`pass_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 987987988 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; + +-- ---------------------------- +-- Records of p_pass_instant +-- ---------------------------- +INSERT INTO `p_pass_instant` VALUES (5344, '5343 update key', 32, 'SM4', 'NN�D�\"2�jj', NULL, '2020-03-10', '2020-05-07', '3'); +INSERT INTO `p_pass_old` VALUES (5343, 'SM4', 32, 'SM4', 'R�~����B�5p�} f3�Ь\Z@�IWm25�L\Z%�������jq� N', NULL, NULL, '2020-06-19', '2020-05-19', '22'); +INSERT INTO `p_pass_old` VALUES (123456, 'SM2TEST', 132, 'SM2', '06040204555f07545a095a085d0807081e4743464048461d1c4d1a11454d4d1d2572707720252c287d7b292b29292f2d353f39306131363a6f3f353e343b6b364217', '570e0304010d02035c5b0c0e5d0d065f4c461612451c411c1c1c1b401d484f1d702d7170732770292f27292c2b2e2378366134303163306c6d6a6c3a3034396b', NULL, '2020-11-04', '2020-05-07', '3'); +INSERT INTO `p_pass_old` VALUES (234523, 'SM4TEST', 32, 'SM4', '73ba3efbb3e464e594d3fc0e6eedd483114c463eac7df30e755720b7792797efce3eb84d94f8a7ca83ca2af689726f4c', NULL, NULL, '2020-06-20', '2020-05-20', '25'); +INSERT INTO `p_pass_old` VALUES (5555555, 'SM4TEST', 32, 'SM4', 'wws \r }xr bdao\Zo', NULL, NULL, '2020-06-07', '2020-05-07', '3'); + +-- ---------------------------- +-- Table structure for p_passdata +-- ---------------------------- +DROP TABLE IF EXISTS `p_passdata`; +CREATE TABLE `p_passdata` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `keypass` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `dian0` int(255) NULL DEFAULT NULL, + `dian1` int(255) NULL DEFAULT NULL, + `dian2` int(255) NULL DEFAULT NULL, + `f0` int(255) NULL DEFAULT NULL, + `f1` int(255) NULL DEFAULT NULL, + `f2` int(255) NULL DEFAULT NULL, + `p` int(255) NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; + +-- ---------------------------- +-- Records of p_passdata +-- ---------------------------- +INSERT INTO `p_passdata` VALUES (1, 'student46', '000000', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `p_passdata` VALUES (2, 'admin1', '123456', NULL, NULL, NULL, NULL, NULL, NULL, NULL); +INSERT INTO `p_passdata` VALUES (3, 'yg9533', NULL, 97, 98, 60, 17936694, 94857061, 73571832, 126160379); +INSERT INTO `p_passdata` VALUES (4, 'yg9534', NULL, 97, 79, 15, 120160, 1145, 181487, 246889); + +-- ---------------------------- +-- Table structure for p_random +-- ---------------------------- +DROP TABLE IF EXISTS `p_random`; +CREATE TABLE `p_random` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `random_str` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `key_iD` int(11) NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 59 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; + +-- ---------------------------- +-- Records of p_random +-- ---------------------------- +INSERT INTO `p_random` VALUES (29, 'admin', '16553287435928518469895643197905637406784463715593003199734802744722163696489726822880437023631366012110954324680470244282879779', 987987987); +INSERT INTO `p_random` VALUES (30, 'admin', '667659727733238194067818108983576566662706111752763630296570916173', 123456); +INSERT INTO `p_random` VALUES (31, 'admin', '188650791472881541212324695028020616928726467063106688331943941433', 3123123); +INSERT INTO `p_random` VALUES (32, 'admin', '60352401007216946536636466100537', 5555555); +INSERT INTO `p_random` VALUES (33, 'admin', '492569748053956276821090647158936849279052738807932339148045242987401024832372924047714172690776961291932656898584658773101926007044307187736672041092624867223824414734022730320689428207443166878881761078853780352774798784', 43234); +INSERT INTO `p_random` VALUES (34, 'admin', '146596007404455505759058259405632684924090215986375750814674095005713758534224529198666652981285827072660701274653495556992700045997340994960017167156812553805254157484268887299595299497471699848297400756573939428686785472', 2250485); +INSERT INTO `p_random` VALUES (35, 'admin', '793164523144199523468363229366456053950804449121305389268947853946802843152575300443108874730941317862674978243731807820025908964821949998783267673037652866831167548500236611809371838574498785015760513940053268761922978242', 5245241); +INSERT INTO `p_random` VALUES (36, 'admin', '657111261931293625352863088769367660378429160693011194427881011799024451693952936167750771661440550649483302506158486627825816102827192820226911281582406427500185360363377525358410498228340837537352401660029851509879531902', 20202020); +INSERT INTO `p_random` VALUES (37, 'admin', '200778893120222603333980740998160652400432485039932144994713065417971916314640129248163503439335884410436316948243528943627806427687648761541328082604047466331301412926518391967410323751248269891856404597600367445391452522', 3424); +INSERT INTO `p_random` VALUES (38, 'admin', '054834899381297651328158176068360491778164375027811913670387022543174211300544598181374720016325632212636815501973635804707836728824043027796394587034570281433091413926957524172509115329008451461994232043403244614704269129', 3424); +INSERT INTO `p_random` VALUES (39, 'yg9531', '012706718950017617346168017118540487196354702147546428341829672374', 123555); +INSERT INTO `p_random` VALUES (40, 'yg9531', '806607412772634472891159985553754879049352999565086453761450821437188823559518361752029838106366353162085339947925086992305505944123763940858403229873452576857526871517801371431200531146527013757190352901487898448538717737', 123123); +INSERT INTO `p_random` VALUES (41, 'yg9531', '920321266013744662189653353618979539199635087316945722870140628237270940544288258743364365171383367932946084401808841571735854418317406696564630630558809902333983319723822356604797864555578773490715282980520692275129854966', 56165165); +INSERT INTO `p_random` VALUES (42, 'yg9531', '002556194548962672201093007382237710889686596521475282279016334220', 123555); +INSERT INTO `p_random` VALUES (43, 'yg9531', '792304488043650608482724551163422605545776953071757848703588127587', 123555); +INSERT INTO `p_random` VALUES (44, 'yg9531', '285364649474419199516345235060142068893117956176260161469069950027', 123556); +INSERT INTO `p_random` VALUES (45, 'student95', '957949736725720920435042594272823322837916927268750810570660672461581035469292454120713025676919232824934352254369484928859058068127479340220969347508236999609407876593127221245783423008402471134846875591258827489440072797', 9569); +INSERT INTO `p_random` VALUES (46, 'admin1', '���������9�$9�%���ݺ*�W��n��\'�z�b � �Y4-����', 1231231); +INSERT INTO `p_random` VALUES (47, 'admin1', '[�o��9�v�ȭ9�Qp9��!�y+ܤ�@��b � �Y4-����', 691515); +INSERT INTO `p_random` VALUES (48, 'admin1', '^��\r��R3*��,��׸$�0W���=1%��b � �Y4-����', 123123); +INSERT INTO `p_random` VALUES (49, 'admin1', 'F`��]�!��� �cEڝ�ʞ`�����׳�b � �Y4-����', 23413); +INSERT INTO `p_random` VALUES (50, 'yg9533', '����x�����m?p�wCm��\'ߺ��#Wʶb � �Y4-����', 5616516); +INSERT INTO `p_random` VALUES (51, 'yg9534', 'BE)� w<�x?ZSWXkd�����鸑�ǁE�b � �Y4-����', 234523); +INSERT INTO `p_random` VALUES (52, 'yg9534', '>C���v(<�H�H�p���F\n�[B$C���sB���b � �Y4-����', 234523); +INSERT INTO `p_random` VALUES (53, 'yg9534', '3d�Ï��䉴�f�o�\"9��U�Ͱ�4b7��b � �Y4-����', 234523); +INSERT INTO `p_random` VALUES (54, 'yg9534', '���ыX���Qli����ͯ�\\��|\\j9\\�b � �Y4-����', 234523); +INSERT INTO `p_random` VALUES (55, 'yg9534', '|�3�U~)�+t���]_g#*Q�/�@�<�S��P�b � �Y4-����', 234523); +INSERT INTO `p_random` VALUES (56, 'yg9534', 'R�uҗ�c;���%@l�c9:��q0�!����b � �Y4-����', 234523); +INSERT INTO `p_random` VALUES (57, 'yg9534', '�i��y37��?5Ml��Q��۬R\0��&�C �b � �Y4-����', 234523); +INSERT INTO `p_random` VALUES (58, 'yg9534', '3\r�F~�!-�Ԧ;eȲ�^oυ�ATK�2�+�S�b � �Y4-����', 234524); + +-- ---------------------------- +-- Table structure for p_sm4pub +-- ---------------------------- +DROP TABLE IF EXISTS `p_sm4pub`; +CREATE TABLE `p_sm4pub` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `pubkey` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 9 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; + +-- ---------------------------- +-- Records of p_sm4pub +-- ---------------------------- +INSERT INTO `p_sm4pub` VALUES (1, '039fc72d0d61b1561f0058e224fe07634f7a56c977700697f389c3672338dc5388', 'yg9531'); +INSERT INTO `p_sm4pub` VALUES (2, '03127a23e1b49c10e1d52803ba9bb6567708c415106efdb1be99490c3d6361a25c', 'student95'); +INSERT INTO `p_sm4pub` VALUES (3, '03771defa59412531b5c65dc5862932a80179b3dbb28f866328ea49c2050c13728', 'student94'); +INSERT INTO `p_sm4pub` VALUES (4, '037e521117d24c1d9936d2b8964f7831852ca1852db7a766f121fe7fbf46e806fc', 'student45'); +INSERT INTO `p_sm4pub` VALUES (5, '03f271d9edbd777a0ba9ecd6c4908c1b4cb86bbcedbee3ba0ee9560f800704f225', 'student46'); +INSERT INTO `p_sm4pub` VALUES (6, '030a2c073f82a7a8b60c47cd4bf5cf8aa772814239df3a4f592778da642dc2a591', 'admin1'); +INSERT INTO `p_sm4pub` VALUES (7, '035df930f51c852f75c2e580aca205d5d47dace1ee9eb5b53bef665b30f2db37f1', 'yg9533'); +INSERT INTO `p_sm4pub` VALUES (8, '022e208bd83c09996d05290378a0daa2f1c4ca5ad2e6ebd348561c623071840340', 'yg9534'); + +-- ---------------------------- +-- Table structure for p_username +-- ---------------------------- +DROP TABLE IF EXISTS `p_username`; +CREATE TABLE `p_username` ( + `id` int(11) NOT NULL AUTO_INCREMENT, + `user_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + `create_date` date NULL DEFAULT NULL, + `if_close` int(11) NULL DEFAULT NULL, + `pri_key` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 14 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; + +-- ---------------------------- +-- Records of p_username +-- ---------------------------- +INSERT INTO `p_username` VALUES (1, 'admin', '2020-04-19', 1, NULL); +INSERT INTO `p_username` VALUES (2, 'student7', '2020-04-27', 0, NULL); +INSERT INTO `p_username` VALUES (3, 'student8', '2020-04-27', 0, NULL); +INSERT INTO `p_username` VALUES (4, 'student9', '2020-04-27', 0, NULL); +INSERT INTO `p_username` VALUES (5, 'student10', '2020-04-27', 0, NULL); +INSERT INTO `p_username` VALUES (6, 'yg9531', '2020-05-17', 0, '4cfbc45658b39156f0c12a2ab0a18996953fd28a93e393628680d3c211c9cf58'); +INSERT INTO `p_username` VALUES (7, 'student95', '2020-05-19', 0, 'bfa4a3c16bb8bc61c8fb6460b7c3f88f107409a1b602c058c4d9b5a8290d671f'); +INSERT INTO `p_username` VALUES (8, 'student94', '2020-05-19', 0, '9a720eef4e6a9042898dc82165e4518a4040e58185c4e63181ab37123ff971f'); +INSERT INTO `p_username` VALUES (9, 'student45', '2020-05-19', 0, '408e816ccbd03423796add7b601c06e7dfa306a91ada6ce3d1862b8e664e9fd9'); +INSERT INTO `p_username` VALUES (10, 'student46', '2020-05-19', 0, 'eb98520db74974ca716d14e600ce58c62a1e9d707313bcd59ad7f027156153ef'); +INSERT INTO `p_username` VALUES (11, 'admin1', '2020-05-19', 0, 'eab2613061e127cb5731cc5407762df18420378e31dbd132620ff3da94416841'); +INSERT INTO `p_username` VALUES (12, 'yg9533', '2020-05-20', 0, '31785f02af912fad7604800e0421986e71de02fa4b46a159dd23382215b7b52e'); +INSERT INTO `p_username` VALUES (13, 'yg9534', '2020-05-20', 0, '422bf5e3e6b970238aafc6a4e2fb3ff8b7a930f156213d22b282c46068e3698'); + +-- ---------------------------- +-- Table structure for sys_admin_user +-- ---------------------------- +DROP TABLE IF EXISTS `sys_admin_user`; +CREATE TABLE `sys_admin_user` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', + `username` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '用户名', + `password` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '密码', + `real_name` varchar(25) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '真名', + `email` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '邮箱', + `telephone` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '座机号', + `mobile_phone` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '手机号', + `address` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '地址', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + `update_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间', + `role_id` bigint(20) NULL DEFAULT 0 COMMENT '角色', + `account_non_expired` tinyint(1) NULL DEFAULT 0 COMMENT '是否未失效', + `account_non_locked` tinyint(1) NULL DEFAULT 0 COMMENT '是否未锁定', + `credentials_non_expired` tinyint(1) NULL DEFAULT NULL COMMENT '是否未失效', + `enabled` tinyint(1) NULL DEFAULT NULL COMMENT '是否可用', + PRIMARY KEY (`id`) USING BTREE, + UNIQUE INDEX `uk_user_name`(`username`) USING BTREE, + INDEX `s_a_r_id`(`role_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 26 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; + +-- ---------------------------- +-- Records of sys_admin_user +-- ---------------------------- +INSERT INTO `sys_admin_user` VALUES (3, 'admin', '21232f297a57a5a743894a0e4a801fc3', '管理员', '', '', '', '', '2018-07-30 00:00:00', '2018-07-30 00:00:00', 1, 0, 0, 0, 1); +INSERT INTO `sys_admin_user` VALUES (4, 'test', '098f6bcd4621d373cade4e832627b4f6', '测试人员', '', '', '', '', '2018-09-03 00:00:00', '2018-09-03 00:00:00', 2, 0, 0, 0, 1); +INSERT INTO `sys_admin_user` VALUES (7, 'magicalcoder', '6860c37b00ed4e444a7d2c6e8fb66886', '系统默认超级管理员账号', '', '', '', '', '2018-09-06 00:00:00', '2018-09-06 00:00:00', 1, 0, 0, 0, 1); +INSERT INTO `sys_admin_user` VALUES (8, 'student', '4995ec381d6071f48a60170c42ebab72', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, 0, 0, 0, 1); +INSERT INTO `sys_admin_user` VALUES (9, 'students', '4995ec381d6071f48a60170c42ebab72', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, 0, 0, 0, 1); +INSERT INTO `sys_admin_user` VALUES (10, 'students1', '4995ec381d6071f48a60170c42ebab72', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, 0, 0, 0, 1); +INSERT INTO `sys_admin_user` VALUES (11, 'students2', '4995ec381d6071f48a60170c42ebab72', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, 0, 0, 0, 1); +INSERT INTO `sys_admin_user` VALUES (12, 'student6', '4995ec381d6071f48a60170c42ebab72', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, 0, 0, 0, 1); +INSERT INTO `sys_admin_user` VALUES (13, 'student7', '4995ec381d6071f48a60170c42ebab72', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, 0, 0, 0, 1); +INSERT INTO `sys_admin_user` VALUES (14, 'student8', '4995ec381d6071f48a60170c42ebab72', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, 0, 0, 0, 1); +INSERT INTO `sys_admin_user` VALUES (15, 'student9', '4995ec381d6071f48a60170c42ebab72', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, 0, 0, 0, 1); +INSERT INTO `sys_admin_user` VALUES (16, 'student10', 'e10adc3949ba59abbe56e057f20f883e', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, 0, 0, 0, 1); +INSERT INTO `sys_admin_user` VALUES (17, 'yg9530', 'badbdc3d248f1d599b08396e21811290', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 2, 0, 0, 0, 1); +INSERT INTO `sys_admin_user` VALUES (18, 'yg9531', '312ad832b9455b1acab776dc82b33cab', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 2, 0, 0, 0, 1); +INSERT INTO `sys_admin_user` VALUES (19, 'student95', '312ad832b9455b1acab776dc82b33cab', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 2, 0, 0, 0, 1); +INSERT INTO `sys_admin_user` VALUES (20, 'student94', '312ad832b9455b1acab776dc82b33cab', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 2, 0, 0, 0, 1); +INSERT INTO `sys_admin_user` VALUES (21, 'student45', 'badbdc3d248f1d599b08396e21811290', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 2, 0, 0, 0, 1); +INSERT INTO `sys_admin_user` VALUES (22, 'student46', 'badbdc3d248f1d599b08396e21811290', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 2, 0, 0, 0, 1); +INSERT INTO `sys_admin_user` VALUES (23, 'admin1', '312ad832b9455b1acab776dc82b33cab', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 2, 0, 0, 0, 1); +INSERT INTO `sys_admin_user` VALUES (24, 'yg9533', '312ad832b9455b1acab776dc82b33cab', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 2, 0, 0, 0, 1); +INSERT INTO `sys_admin_user` VALUES (25, 'yg9534', '312ad832b9455b1acab776dc82b33cab', NULL, NULL, NULL, NULL, NULL, NULL, NULL, 2, 0, 0, 0, 1); + +-- ---------------------------- +-- Table structure for sys_global_permit_url +-- ---------------------------- +DROP TABLE IF EXISTS `sys_global_permit_url`; +CREATE TABLE `sys_global_permit_url` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', + `permit_name` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '通过名称', + `backend_url_reg` varchar(500) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '后端的地址正则,校验当前请求url是否有权限,get|post统一会按照参数首字母排序', + `module_id` bigint(20) NULL DEFAULT NULL COMMENT '所属模块', + PRIMARY KEY (`id`) USING BTREE, + INDEX `sy_m_id`(`module_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '后端请求地址全局允许过滤器,在此表的统一不用再去权限表匹配了' ROW_FORMAT = Compact; + +-- ---------------------------- +-- Records of sys_global_permit_url +-- ---------------------------- +INSERT INTO `sys_global_permit_url` VALUES (2, '允许进入后台,使用有些通用接口(请勿删除)', '/admin/(rmp|page|page_v2|common_file_rest).*', NULL); +INSERT INTO `sys_global_permit_url` VALUES (3, '通用获取权限相关接口(请勿删除)', '/admin/rest_rmp/(get_permission_list|get_module_list|user_info).*', NULL); + +-- ---------------------------- +-- Table structure for sys_log_admin_operate +-- ---------------------------- +DROP TABLE IF EXISTS `sys_log_admin_operate`; +CREATE TABLE `sys_log_admin_operate` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', + `admin_user_id` bigint(20) NULL DEFAULT 0 COMMENT '管理员', + `user_name` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '0' COMMENT '管理员名称', + `table_name` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '表名', + `operate_type` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '操作类型', + `url` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '链接', + `primary_id_value` varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '主键值', + `form_body` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL COMMENT '提交内容', + `create_time` datetime(0) NULL DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 316 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; + +-- ---------------------------- +-- Records of sys_log_admin_operate +-- ---------------------------- +INSERT INTO `sys_log_admin_operate` VALUES (308, 3, '管理员', 'sys_log_admin_operate_rest', 'delete', '/admin/sys_log_admin_operate_rest/delete/307', '', '{}', '2018-09-10 17:00:43'); +INSERT INTO `sys_log_admin_operate` VALUES (309, 3, '管理员', 'sys_module_category_rest', 'update', '/admin/sys_module_category_rest/update/1', NULL, '{\"moduleCategoryName\":[\"密钥管理\"]}', '2020-04-11 19:03:40'); +INSERT INTO `sys_log_admin_operate` VALUES (310, 3, '管理员', 'sys_module_rest', 'update', '/admin/sys_module_rest/update/34', NULL, '{\"moduleTitle\":[\"现用密钥\"]}', '2020-04-11 19:04:10'); +INSERT INTO `sys_log_admin_operate` VALUES (311, 3, '管理员', 'sys_module_rest', 'update', '/admin/sys_module_rest/update/35', NULL, '{\"moduleTitle\":[\"历史密钥\"]}', '2020-04-11 19:04:15'); +INSERT INTO `sys_log_admin_operate` VALUES (312, 3, '管理员', 'rest_rmp', 'save_tree_data', '/admin/rest_rmp/save_tree_data/1', NULL, '{\"ids[]\":[\"category_1\",\"module_34\",\"permission_39\",\"module_35\",\"permission_40\",\"category_3\",\"module_17\",\"permission_21\",\"module_5\",\"module_11\",\"module_7\",\"module_8\",\"module_4\",\"module_20\",\"permission_25\"]}', '2020-04-11 19:06:34'); +INSERT INTO `sys_log_admin_operate` VALUES (313, 3, '管理员', 'sys_role_rest', 'update', '/admin/sys_role_rest/update/2', NULL, '{\"roleName\":[\"用戶账号\"]}', '2020-05-10 08:48:32'); +INSERT INTO `sys_log_admin_operate` VALUES (314, 3, '管理员', 'rest_rmp', 'save_tree_data', '/admin/rest_rmp/save_tree_data/2', NULL, '{\"ids[]\":[\"category_1\",\"module_34\",\"permission_39\",\"module_35\",\"permission_40\"]}', '2020-05-10 08:48:49'); +INSERT INTO `sys_log_admin_operate` VALUES (315, 3, '管理员', 'p_pass_instant_rest', 'update', '/admin/p_pass_instant_rest/update/3123123', NULL, '{\"passExpiry\":[\"2020-03-10 00:00:00\"]}', '2020-05-10 10:00:51'); + +-- ---------------------------- +-- Table structure for sys_module +-- ---------------------------- +DROP TABLE IF EXISTS `sys_module`; +CREATE TABLE `sys_module` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', + `module_name` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '模块唯一键', + `module_url` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '模块URL', + `module_category_id` bigint(20) NULL DEFAULT 0 COMMENT '模块分类', + `sort_num` int(2) NULL DEFAULT 0 COMMENT '排序', + `module_title` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '模块标题', + `if_show` tinyint(1) NULL DEFAULT 1 COMMENT '是否显示', + PRIMARY KEY (`id`) USING BTREE, + INDEX `FK_module`(`module_category_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 36 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '模块' ROW_FORMAT = Compact; + +-- ---------------------------- +-- Records of sys_module +-- ---------------------------- +INSERT INTO `sys_module` VALUES (4, 'sys_log_admin_operate', 'admin/page_v2/sys_log_admin_operate/list', 3, 7, '系统日志', 1); +INSERT INTO `sys_module` VALUES (5, 'sys_module_category', 'admin/page_v2/sys_module_category/list', 3, 1, '菜单管理', 1); +INSERT INTO `sys_module` VALUES (7, 'sys_admin_user', 'admin/page_v2/sys_admin_user/list', 3, 3, '管理员', 1); +INSERT INTO `sys_module` VALUES (8, 'sys_global_permit_url', 'admin/page_v2/sys_global_permit_url/list', 3, 6, '全局地址过滤', 1); +INSERT INTO `sys_module` VALUES (11, 'sys_role', 'admin/page_v2/sys_role/list', 3, 2, '角色管理', 1); +INSERT INTO `sys_module` VALUES (17, 'sys', '', 3, -1, '系统表权限载体(请勿删除)', 0); +INSERT INTO `sys_module` VALUES (20, 'dict', 'admin/page_v2/dict/list', 3, 10, '字典配置', 1); +INSERT INTO `sys_module` VALUES (34, 'p_pass_instant', 'admin/page_v2/p_pass_instant/list', 1, 0, '现用密钥', 1); +INSERT INTO `sys_module` VALUES (35, 'p_pass_old', 'admin/page_v2/p_pass_old/list', 1, 0, '历史密钥', 1); + +-- ---------------------------- +-- Table structure for sys_module_category +-- ---------------------------- +DROP TABLE IF EXISTS `sys_module_category`; +CREATE TABLE `sys_module_category` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', + `module_category_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '模块名称', + `sort_num` int(2) NULL DEFAULT 0 COMMENT '排序', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '模块分类' ROW_FORMAT = Compact; + +-- ---------------------------- +-- Records of sys_module_category +-- ---------------------------- +INSERT INTO `sys_module_category` VALUES (1, '密钥管理', 1); +INSERT INTO `sys_module_category` VALUES (3, '系统模块', 2); + +-- ---------------------------- +-- Table structure for sys_permission +-- ---------------------------- +DROP TABLE IF EXISTS `sys_permission`; +CREATE TABLE `sys_permission` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', + `permission_name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '过滤器名称:审核通过', + `filter_platform` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '过滤端:front|backend|front_backend', + `backend_url_reg` varchar(200) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '后端的地址正则,校验当前请求url是否有权限,get|post统一会按照参数首字母排序', + `front_dom` varchar(1024) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '前端Key,多个逗号分割', + `front_action` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '前端处理方式show|disabled', + `module_id` bigint(20) NULL DEFAULT NULL COMMENT '所属模块', + PRIMARY KEY (`id`) USING BTREE, + INDEX `sy_m_id`(`module_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 41 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '后端请求地址允许过滤器,不在过滤器的统一拒绝' ROW_FORMAT = Compact; + +-- ---------------------------- +-- Records of sys_permission +-- ---------------------------- +INSERT INTO `sys_permission` VALUES (2, '查询权限', 'backend', '/admin/goods_category_rest/.*', '', '', 2); +INSERT INTO `sys_permission` VALUES (13, '全类型测试', 'backend', '/admin/all_type_rest/.*', NULL, '', 14); +INSERT INTO `sys_permission` VALUES (15, '商品模块保存权限', 'front_backend', '/admin/goods_rest/(update|save).*', '.security_edit_form_operate_save', 'show', 1); +INSERT INTO `sys_permission` VALUES (17, '商品模块添加按钮', 'front', '', '.security_list_query_operate_add_news', 'show', 1); +INSERT INTO `sys_permission` VALUES (18, '商品模块(批量)删除权限', 'front_backend', '/admin/goods_rest/(delete|batch_delete).*', '.security_list_table_operate_del,.security_list_query_operate_del_all', 'show', 1); +INSERT INTO `sys_permission` VALUES (19, '商品模块查询权限', 'backend', '/admin/goods_rest/(search|page|get).*', '', '', 1); +INSERT INTO `sys_permission` VALUES (21, '所有系统表的所有权限(请勿删除)', 'backend', '/admin/(rest_rmp|sys_[a-z_]+_rest)/.*', '', 'show', 17); +INSERT INTO `sys_permission` VALUES (22, '测试商品模块disabled', 'front', '', '.security_edit_form_param_goodsName,.security_edit_form_param_imgSrc,.security_edit_form_param_publishStatus,.security_edit_form_param_goodsStatus,.security_edit_form_param_price,.security_edit_form_param_shortBrief,.security_edit_form_param_goodsDescription,.security_edit_form_param_createTime,.security_edit_form_param_goodsCategoryId', 'show', 1); +INSERT INTO `sys_permission` VALUES (23, '商品图集全部权限', 'front_backend', '/admin/goods_img_rest/.*', '', 'show', 18); +INSERT INTO `sys_permission` VALUES (24, '商品附件全部权限', 'front_backend', '/admin/goods_file_rest/.*', '', 'show', 19); +INSERT INTO `sys_permission` VALUES (25, '字典全部权限', 'front_backend', '/admin/dict_rest/.*', '', 'show', 20); +INSERT INTO `sys_permission` VALUES (39, '全部权限', 'backend', '/admin/p_pass_instant_rest/[\\s\\S]*', '', '', 34); +INSERT INTO `sys_permission` VALUES (40, '全部权限', 'backend', '/admin/p_pass_old_rest/[\\s\\S]*', '', '', 35); + +-- ---------------------------- +-- Table structure for sys_role +-- ---------------------------- +DROP TABLE IF EXISTS `sys_role`; +CREATE TABLE `sys_role` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', + `role_name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT '' COMMENT '角色名', + PRIMARY KEY (`id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '角色' ROW_FORMAT = Compact; + +-- ---------------------------- +-- Records of sys_role +-- ---------------------------- +INSERT INTO `sys_role` VALUES (1, '超级管理员'); +INSERT INTO `sys_role` VALUES (2, '用戶账号'); + +-- ---------------------------- +-- Table structure for sys_role_module_permission +-- ---------------------------- +DROP TABLE IF EXISTS `sys_role_module_permission`; +CREATE TABLE `sys_role_module_permission` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', + `role_id` bigint(20) NULL DEFAULT NULL COMMENT '角色', + `module_id` bigint(20) NULL DEFAULT NULL COMMENT '模块', + `permission_id` bigint(20) NULL DEFAULT NULL COMMENT '权限', + PRIMARY KEY (`id`) USING BTREE, + INDEX `s_r_id`(`role_id`) USING BTREE, + INDEX `s_m_id`(`module_id`) USING BTREE, + INDEX `s_pid`(`permission_id`) USING BTREE +) ENGINE = InnoDB AUTO_INCREMENT = 444 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '角色模块权限' ROW_FORMAT = Compact; + +-- ---------------------------- +-- Records of sys_role_module_permission +-- ---------------------------- +INSERT INTO `sys_role_module_permission` VALUES (433, 1, 34, 39); +INSERT INTO `sys_role_module_permission` VALUES (434, 1, 35, 40); +INSERT INTO `sys_role_module_permission` VALUES (435, 1, 4, NULL); +INSERT INTO `sys_role_module_permission` VALUES (436, 1, 5, NULL); +INSERT INTO `sys_role_module_permission` VALUES (437, 1, 7, NULL); +INSERT INTO `sys_role_module_permission` VALUES (438, 1, 8, NULL); +INSERT INTO `sys_role_module_permission` VALUES (439, 1, 11, NULL); +INSERT INTO `sys_role_module_permission` VALUES (440, 1, 17, 21); +INSERT INTO `sys_role_module_permission` VALUES (441, 1, 20, 25); +INSERT INTO `sys_role_module_permission` VALUES (442, 2, 34, 39); +INSERT INTO `sys_role_module_permission` VALUES (443, 2, 35, 40); + +SET FOREIGN_KEY_CHECKS = 1; diff --git a/us_passManage/.editorconfig b/us_passManage/.editorconfig new file mode 100644 index 0000000..e291365 --- /dev/null +++ b/us_passManage/.editorconfig @@ -0,0 +1,9 @@ +root = true + +[*] +charset = utf-8 +indent_style = space +indent_size = 4 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true diff --git a/us_passManage/.gitignore b/us_passManage/.gitignore new file mode 100644 index 0000000..2cc611e --- /dev/null +++ b/us_passManage/.gitignore @@ -0,0 +1,4 @@ +*.iml +target/ +.idea/ +~/ diff --git a/us_passManage/README.md b/us_passManage/README.md new file mode 100644 index 0000000..c709231 --- /dev/null +++ b/us_passManage/README.md @@ -0,0 +1,80 @@ +当前版本 - v101 + +us是us系列框架,默认数据库引擎采用mysql,如需要其他数据库,请至www.magicalcoder.com下载对应引擎 +配置模板时 请设置 模板版本=us_mysql_xxx + +相关技术栈: +后端:springboot2.x +mybatis+redis+mysql +前端:layui2.4.5+jquery +工具:magicalcoder前后端代码生成器+magicaldrag前端布局器 + +1 如何启动 + 管理后台:us-admin + + 安装环境 + 框架需要redis服务,请自行下载或者双击project/redis/redis-启动.bat + 配置环境 + us\us-admin\src\main\resources\application-publish.yml + 请根据实际情况配置 mysql redis + 导入数据库 + us\us.sql 导入上面配置的数据库 + 运行 + us\us-admin\src\main\java\com\magicalcoder\us\admin\YouyaBootAdminApplication.java + main函数即可启动 + + 也可以打成jar启动也行 + 方式1 java -jar us-admin.jar + 方式2 nohup>nohupGps java -jar us-admin.jar --spring.profiles.active=deploy 2>&1 & + + 启动成功后 浏览器访问 + http://localhost:18080/us-admin + 默认 admin/admin登陆 + +2 声明 + us 为开源项目,会持续不断的更新,在使用过程中遇到问题 欢迎联系作者 QQ 799374340 + +3 常见问题: + 1 验证码无法使用 null报错 解决方法:请更换最新jdk1.8版本 建议多尝试几个版本的 即可解决 + +无缝简单升级方法 +1 升级java + 更新us最新包,把us-core覆盖您本地,前提是您未修改us-core已经存在的类 +2 升级js html + 更新us最新包,把 + us-admin\src\main\resources\static\assets\magicalcoder\vxxx + us-admin\src\main\resources\templates\magicalcoder\vxxx + 覆盖您本地 +3 升级模板 + magicalcoder软件包soft\vms\us_xxx会发布最新版本模板,更换至最新模板即可 + +当然如果您不希望进行任何升级 无需改动任何内容 + +版本更新记录:您可以根据记录来升级您当前的版本 查看版本在 /us_mysql/README.md 如果不想升级 请做好老版本vms下的模板备份 +#v101 - 2019/1/15 +## 1 支持excel导出功能 +## 2 重构js模块,之前版本限制太多,现在完全开放,更大程度满足扩展性 +## 变更文件记录 您可以根据此文件来进行手动更新老版本 使用idea文件差异(Ctrl选中2文件夹 Ctrl+D)对比即可完成更新 + modified: pom.xml + modified: us-core/pom.xml + modified: us-core/src/main/java/com/magicalcoder/us/core/common/dto/KeyValue.java + modified: us-core/src/main/java/com/magicalcoder/us/core/service/CommonRestController.java + new file: us-core/src/main/java/com/magicalcoder/us/core/utils/POIUtil.java + new folder: us-admin/src/main/resources/templates/magicalcoder/v101/ + new folder: us-admin/src/main/resources/static/assets/magicalcoder/v101/ + +## 开发文档 + ##1 如何自定义新页面 并配置跳转规则 + 我们拿goods_category表来讲解 + templates/goodscategory/goodscategory-edit.html + templates/goodscategory/goodscategory-list.html + 注意goodscategory文件夹要小写 + + URL规则/admin/page_v2/{tableName}/{editOrList} + 跳转规则由 AdminRmpController.mapping来定制规则 + return {tableName}.replaceAll("_","") +"/"+ {tableName}.replaceAll("_","") +"-"+ {editOrList}; + 示例:/admin/page_v2/goods_category/list + goods_category中的_会被替换成空 然后映射到对应文件夹 和对应是页面 + +##开发技巧 + 修改静态文件 如果不重启 立即生效:使用idea开发 修改完 按快捷键 ctrl+F9 即可完成热部署,此方法仅限静态资源热部署 修改java不一定成功 + 层级太多不好调试:由于采用iframe方式,确实有这种问题,您可以直接在浏览器打开 例如http://localhost:18080/us-admin/admin/page_v2/xxx/list 这种方式开发单独的页面 会更加清晰 diff --git a/us_passManage/clean.bat b/us_passManage/clean.bat new file mode 100644 index 0000000..a17a085 --- /dev/null +++ b/us_passManage/clean.bat @@ -0,0 +1,8 @@ +set JAVA_HOME=%CD%\..\..\jdk\jdk1.8.0_45 + +set M2_HOME=%CD%\..\apache-maven-3.3.9 + +set PATH=%JAVA_HOME%\bin;%M2_HOME%\bin; + + +mvn clean diff --git a/us_passManage/doc/backend/help.md b/us_passManage/doc/backend/help.md new file mode 100644 index 0000000..a631246 --- /dev/null +++ b/us_passManage/doc/backend/help.md @@ -0,0 +1,19 @@ +表结构: + 字典表:dict + 功能:用于常用全局参数配置共享 系统配置 一组类目等 + 字段: + code:保证唯一 一般是要保存在各个库里的值 友好方便看 而不用id + name:要对外展示的友好值 + dictCategory:字段大类 分组概念 用来聚类code属于同一类 + 注意: + 1 普通下拉框配置 不建议使用字典表 会限制前端发挥 + 2 可以配置一些类目等 + 3 可以配置一些全局常量 比如一些开关 + + 调用方式: + 1 注入 + @Resource + DictService dictService; + 2 调用 以下2个接口是有缓存的 600秒 + dictService.getCacheDictList(dictCategory) + dictService.getCacheDict(code) diff --git a/us_passManage/doc/backend/upload/阿里云oss文件上传.docx b/us_passManage/doc/backend/upload/阿里云oss文件上传.docx new file mode 100644 index 0000000..37af442 Binary files /dev/null and b/us_passManage/doc/backend/upload/阿里云oss文件上传.docx differ diff --git a/us_passManage/doc/backend/权限.png b/us_passManage/doc/backend/权限.png new file mode 100644 index 0000000..965b917 Binary files /dev/null and b/us_passManage/doc/backend/权限.png differ diff --git a/us_passManage/doc/doc.html b/us_passManage/doc/doc.html new file mode 100644 index 0000000..961058a --- /dev/null +++ b/us_passManage/doc/doc.html @@ -0,0 +1,232 @@ +
            +
            +
            +

            Youyaboot简介

            +
            +
            + us是一个基于springboot2.0的java web快速开发框架;配合magicalcoder代码生成器可实现迅速开发,再配合布局器可以实现二次深度定制界面 +
            + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
            主要相关技术更多信息
            JavaJDK8
            SpringBoot 2.1.3.RELEASE
            Layui2.4.5
            Mybatis1.3.2
            数据库支持mysql,oracle,sqlserver,postgersql
            缓存Redis
            模板引擎thymeleaf
            模块管理Maven
            日志组件logback
            +
            + 基于四种不同数据库版本供选择 +
            +
            +
            + us_mysql +
            +
            + us_oracle +
            +
            + us_sqlserver +
            +
            + us_postgresql +
            +
            +
            +
            +
            + 开源地址:https://gitee.com/magicalcoder/us 欢迎每一位爱好者的加入开发者队列 可向群主申请 +
            +
            +
            +
            +

            安装打包部署方法

            +
            +
            +
            + 环境准备 +
            +
            +
            + 第一步:导入IDEA,只需要idea的maven模块导入us_mysql\pom.xml即可;也可参考首页视频教程 +
            +
            + 第二步:导入数据库脚本 us_mysql\us.sql导入本地数据库 +
            +
            + 第三步:配置\us_mysql\us-admin\src\main\resources\application-localhost.yml application-publish.yml 相关数据库 redis等信息 application-xxx.yml代表不同环境的配置信息 +
            +
            + 第四步:启动redis 在软件包windows64bit\project\redis\redis启动.bat 其他系统请自行准备 +
            +
            +
            +
            +
            + 开发环境启动 +
            +
            +
            + idea运行:us\us-admin\src\main\java\com\magicalcoder\us\admin\YouyaBootAdminApplication.java +
            +
            +
            +
            +
            + 线上环境启动 +
            +
            +
            + +
            +
            + cd us_mysql +
            +
            + 打包编译: mvn clean package +
            +
            + cd us_admin/target/ +
            +
            + linux方式启动:nohup nohupGps java -jar us-admin.jar --spring.profiles.active=publish 2 1 +
            +
            + windows方式启动:java -jar us-admin.jar +
            +
            + 访问:http://localhost:18080/us-admin 用户名密码:admin/admin +
            + + +
            +
            +
            +
            +
            +
            + 浏览器访问 +
            +
            +
            + 访问:http://localhost:18080/us-admin 用户名密码:admin/admin +
            +
            +
            +
            + 集群部署 +
            +
            +
            + us登录信息基于redis;所以支持集群部署,多台机器共享登录信息 +
            +
            + 集群部署方案:参考nginx负载均衡配置 +
            +
            +
                                                upstream us_server {
            +                                    server 127.0.0.1:18080;
            +                                    server 127.0.0.1:18081;
            +                                    }
            +                                    server {
            +                                    listen       80;
            +                                    server_name  www.us.com;
            +
            +                                    location ~ ^/(us-admin) {
            +                                    proxy_pass          http://us_server;
            +                                    proxy_set_header    Host    $host;
            +                                    proxy_set_header   X-Real-IP        $remote_addr;
            +                                    proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
            +                                    }
            +
            +                                
            +
            + + +
            +
            +
            +
            +
            +
            +

            利用代码生成器开发一个功能

            +
            + + + + + + +
            +
            +
            +

            缓存

            +
            + + + + + +
            +
            +
            +

            前端开发

            +
            + + + + + +
            +
            +
            +

            框架

            +
            + + + + + +
            +
            +
            +
            diff --git a/us_passManage/doc/doc/dict/api.md b/us_passManage/doc/doc/dict/api.md new file mode 100644 index 0000000..817d417 --- /dev/null +++ b/us_passManage/doc/doc/dict/api.md @@ -0,0 +1,182 @@ + +# dict 字典模块 API +## 1.1 查询字典详情 + +> **描述**:根据主键查询字典详情。 + +> **url**:/admin/dict_rest/get/{id} +> +> **method**:GET + +> **输入** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| ---- | -------- | -------- | ------------ | +| 1 | id | Long | 主键,必填 | + +> **输出** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| -------- | ------------- | -------- | ----------------------- | +| 1 | flag | boolean | 接口调用,成功/失败标识 | +| 2 | code | int | 错误码,成功时=0 | +| 3 | desc | string | 结果描述 | +| 4 | data | object | 字典详情对象 | +| | | | | +| 字段解释 | | | | +| 1 | id | Long | 主键 | +| 2 | dictCategory | String | 字典大类 | +| 3 | code | String | 编码 | +| 4 | name | String | 名称 | +| 5 | dictDescription | String | 描述 | +| 6 | parentId | Long | 所属父类 | +| 7 | createTime | Timestamp | 创建时间 | +| 8 | updateTime | Timestamp | 更新时间 | +| 9 | orderNo | Byte | 序号 | + +## 1.2 保存字典详情 + +> **描述**:保存字典详情。 + +> **url**:/admin/dict_rest/save +> +> **method**:POST + +> **输入** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| ---- | -------- | -------- | ------------ | +| 1| id | Long | 主键 | +| 2| dictCategory | String | 字典大类 | +| 3| code | String | 编码 | +| 4| name | String | 名称 | +| 5| dictDescription | String | 描述 | +| 6| parentId | Long | 所属父类 | +| 7| createTime | Timestamp | 创建时间 | +| 8| updateTime | Timestamp | 更新时间 | +| 9| orderNo | Byte | 序号 | + +> **输出** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| -------- | ------------- | -------- | ----------------------- | +| 1 | flag | boolean | 接口调用,成功/失败标识 | +| 2 | code | int | 错误码,成功时=0 | +| 3 | desc | string | 结果描述 | + +## 1.3 更新字典详情 + +> **描述**:根据主键更新字典的任意属性值,确保要更新的参数不能为null。 + +> **url**:/admin/dict_rest/update/{id} +> +> **method**:POST + +> **输入** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| ---- | -------- | -------- | ------------ | +| 1| id | Long | 主键 | +| 2| dictCategory | String | 字典大类 | +| 3| code | String | 编码 | +| 4| name | String | 名称 | +| 5| dictDescription | String | 描述 | +| 6| parentId | Long | 所属父类 | +| 7| createTime | Timestamp | 创建时间 | +| 8| updateTime | Timestamp | 更新时间 | +| 9| orderNo | Byte | 序号 | + +> **输出** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| -------- | ------------- | -------- | ----------------------- | +| 1 | flag | boolean | 接口调用,成功/失败标识 | +| 2 | code | int | 错误码,成功时=0 | +| 3 | desc | string | 结果描述 | + +## 1.4 删除一条字典记录 + +> **描述**:根据主键删除一条字典记录。 + +> **url**:/admin/dict_rest/delete/{id} +> +> **method**:POST + +> **输入** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| ---- | -------- | -------- | ------------ | +| 1 | id | Long | 主键,必填 | + +> **输出** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| -------- | ------------- | -------- | ----------------------- | +| 1 | flag | boolean | 接口调用,成功/失败标识 | +| 2 | code | int | 错误码,成功时=0 | +| 3 | desc | string | 结果描述 | + + +## 1.5 批量删除多条字典记录 + +> **描述**:根据多个主键删除多条字典记录。 + +> **url**:/admin/dict_rest/batch_delete +> +> **method**:POST + +> **输入** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| ---- | -------- | -------- | ------------ | +| 1 | ids[] | Long | 主键,必填 | +| 2 | ids[] | Long | 主键,必填 | +| ... | ids[] | Long | 主键,必填 | +| n | ids[] | Long | 主键,必填 | + +> **输出** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| -------- | ------------- | -------- | ----------------------- | +| 1 | flag | boolean | 接口调用,成功/失败标识 | +| 2 | code | int | 错误码,成功时=0 | +| 3 | desc | string | 结果描述 | + + +## 1.6 分页查询字典 + +> **描述**:分页查询字典。 + +> **url**:/admin/dict_rest/page +> +> **method**:GET + +> **输入** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| ---- | -------- | -------- | ------------ | +| 1 |page |int |第几页 [1,n) | +| 2 |limit |int |每页多少条 [0,100) | +| 3 |safeOrderBy |int | 排序 例如 数据库字段名称 desc或asc | + |4|idFirst| Long |主键| + |5|codeFirst| String |编码| + +> **输出** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| -------- | ------------- | -------- | ----------------------- | +| 1 | flag | boolean | 接口调用,成功/失败标识 | +| 2 | code | int | 错误码,成功时=0 | +| 3 | desc | string | 结果描述 | +| 4 | data | array | 字典详情数组对象 | +| | | | | +| 字段解释 | | | | +| 1 | id | Long | 主键 | +| 2 | dictCategory | String | 字典大类 | +| 3 | code | String | 编码 | +| 4 | name | String | 名称 | +| 5 | dictDescription | String | 描述 | +| 6 | parentId | Long | 所属父类 | +| 7 | createTime | Timestamp | 创建时间 | +| 8 | updateTime | Timestamp | 更新时间 | +| 9 | orderNo | Byte | 序号 | diff --git a/us_passManage/doc/front/us自定义外键查询下拉框.txt b/us_passManage/doc/front/us自定义外键查询下拉框.txt new file mode 100644 index 0000000..ce19edd --- /dev/null +++ b/us_passManage/doc/front/us自定义外键查询下拉框.txt @@ -0,0 +1,92 @@ +us如何自定义下拉框查询 +1.列表显示外键名字 +//表格每一列配置 + var COLS = [[ + {type: "checkbox", /*fixed:"left",*/ width:50},//全选 + {field: 'customerId', title: '老人', align:'center', minWidth:200, templet:function (d) { + var value = (!d.customerId || d.customerId==null) ? '' : d.customerId + return '
            ' + },sort:true + }, + /*{field: 'familyId', title: '家属', minWidth:200, align:"center",sort:true},*/ + {field: 'familyId', title: '家属', align:'center', minWidth:200, templet:function (d) { + var value = (!d.familyId || d.familyId==null) ? '' : d.familyId + return '
            ' + },sort:true + }, + {field: 'relation', title: '关系', minWidth:200, align:"center",sort:true}, + {title: '操作', minWidth:250, templet:'#newsListOperateTemplate',/*fixed:"right",*/align:"center"}//操作 到list.html页面查找模板对应的html + ]]; +这里的familyId是我们数据库中主表的字段,这里是映射了java实体类所以可以定义成驼峰,MBYL_FAMILY_ID是查询出来的需要存储在数据库中的字段, +MBYL_USER_NICK_NAME是查询出来的需要在列表上显示的字段 + +五个要点:1.data-url是我们需要查询外键的api + 2.data-id是外键表查询的主字段,可以把它看成是ID + 3.data-text-fields是外键表查询的副字段,可以把它看成是name + 4.name是主表的某个需要关联外键的字段 + 5.data-identify是主表的某个需要关联外键的字段 +在列表中的外键显示是根据data-url中指定的方法去数据库中搜索根据data-id的值查找data-text-fields的值并返回, +在查找的过程中uniqueField就是我们配置的data-id,uniqueValue就是我们配置的data-text-fields +我们再列表中功能是把familyId赋给MBYL_FAMILY_ID,再根据MBYL_FAMILY_ID去外键表中查询MBYL_USER_NICK_NAME和MBYL_FAMILY_ID,并把MBYL_USER_NICK_NAME的值显示在familyId的位置上 + + +2.下拉框显示外键字段 +
            + +
            +这里和上面描述的基本一致,但是有个地方不一样,下拉框在模糊查询的时候用的是keyword,keyword的值就是我们再搜索框中输入的值 + + +综合一下上面的说法,结合我们的实例代码,简明地说说流程: + + + + + + + MBYL_FAMILY_ID, + MBYL_USER_NICK_NAME + + + + + + + AND MBYL_FAMILY_ID=#{MBYL_FAMILY_ID} + + + + AND MBYL_USER_NICK_NAME LIKE '%'||#{MBYL_USER_NICK_NAME}||'%' + + + + + @RequestMapping(value = "search") + public ResponseMsg search( + @RequestParam(required = false) String uniqueField, + @RequestParam(required = false) String uniqueValue, + @RequestParam(required = false,defaultValue = "20") Integer limit, + @RequestParam(required = false) String keyword + ){ + limit = Math.min(PageConstant.MAX_LIMIT,limit); + List> familyList = null; + Map query = new HashMap(); + query.put("limit",limit); + if(uniqueValue!=null){//说明是来初始化的 + query.put(uniqueField,uniqueValue); + familyList = systemMbylFamilyService.getFamilyByQuery(query); + }else {//正常搜索 + if(ListUtil.isBlank(familyList)){ + query.put("MBYL_USER_NICK_NAME",keyword); + familyList = systemMbylFamilyService.getFamilyByQuery(query); + query.remove("MBYL_USER_NICK_NAME"); + } + } + return new ResponseMsg(familyList); + } +下拉搜索框查询的时候是根据MBYL_USER_NICK_NAME模糊查询的(这个时候对应的search方法中的参数是keyword) +表格列表中查询的时候是根据MBYL_FAMILY_ID精确查询的(这个时候对应的search方法中的参数是uniqueField和uniqueValue,比如'1'和'蔬菜') diff --git a/us_passManage/doc/ppassinstant/api.md b/us_passManage/doc/ppassinstant/api.md new file mode 100644 index 0000000..cad1b4e --- /dev/null +++ b/us_passManage/doc/ppassinstant/api.md @@ -0,0 +1,193 @@ + +# p_pass_instant p_pass_instant模块 API +## 1.1 查询p_pass_instant详情 + +> **描述**:根据密钥UUID查询p_pass_instant详情。 + +> **url**:/admin/p_pass_instant_rest/get/{passId} +> +> **method**:GET + +> **输入** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| ---- | -------- | -------- | ------------ | +| 1 | id | Integer | 密钥UUID,必填 | + +> **输出** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| -------- | ------------- | -------- | ----------------------- | +| 1 | flag | boolean | 接口调用,成功/失败标识 | +| 2 | code | int | 错误码,成功时=0 | +| 3 | desc | string | 结果描述 | +| 4 | data | object | p_pass_instant详情对象 | +| | | | | +| 字段解释 | | | | +| 1 | passId | Integer | 密钥UUID | +| 2 | passName | String | 密钥名称 | +| 3 | passLength | Integer | 密钥长度 | +| 4 | passType | String | 密钥类型 | +| 5 | passChildfir | String | 第一子密钥 | +| 6 | passChildsec | String | 第二子密钥 | +| 7 | passChildthi | String | 第三子密钥 | +| 8 | passExpiry | Date | 密钥有效期 | +| 9 | passCreatetime | Date | 密钥上传时间 | +| 10 | passUserid | Integer | 密钥使用者 | + +## 1.2 保存p_pass_instant详情 + +> **描述**:保存p_pass_instant详情。 + +> **url**:/admin/p_pass_instant_rest/save +> +> **method**:POST + +> **输入** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| ---- | -------- | -------- | ------------ | +| 1| passId | Integer | 密钥UUID | +| 2| passName | String | 密钥名称 | +| 3| passLength | Integer | 密钥长度 | +| 4| passType | String | 密钥类型 | +| 5| passChildfir | String | 第一子密钥 | +| 6| passChildsec | String | 第二子密钥 | +| 7| passChildthi | String | 第三子密钥 | +| 8| passExpiry | Date | 密钥有效期 | +| 9| passCreatetime | Date | 密钥上传时间 | +| 10| passUserid | Integer | 密钥使用者 | + +> **输出** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| -------- | ------------- | -------- | ----------------------- | +| 1 | flag | boolean | 接口调用,成功/失败标识 | +| 2 | code | int | 错误码,成功时=0 | +| 3 | desc | string | 结果描述 | + +## 1.3 更新p_pass_instant详情 + +> **描述**:根据密钥UUID更新p_pass_instant的任意属性值,确保要更新的参数不能为null。 + +> **url**:/admin/p_pass_instant_rest/update/{passId} +> +> **method**:POST + +> **输入** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| ---- | -------- | -------- | ------------ | +| 1| passId | Integer | 密钥UUID | +| 2| passName | String | 密钥名称 | +| 3| passLength | Integer | 密钥长度 | +| 4| passType | String | 密钥类型 | +| 5| passChildfir | String | 第一子密钥 | +| 6| passChildsec | String | 第二子密钥 | +| 7| passChildthi | String | 第三子密钥 | +| 8| passExpiry | Date | 密钥有效期 | +| 9| passCreatetime | Date | 密钥上传时间 | +| 10| passUserid | Integer | 密钥使用者 | + +> **输出** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| -------- | ------------- | -------- | ----------------------- | +| 1 | flag | boolean | 接口调用,成功/失败标识 | +| 2 | code | int | 错误码,成功时=0 | +| 3 | desc | string | 结果描述 | + +## 1.4 删除一条p_pass_instant记录 + +> **描述**:根据密钥UUID删除一条p_pass_instant记录。 + +> **url**:/admin/p_pass_instant_rest/delete/{passId} +> +> **method**:POST + +> **输入** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| ---- | -------- | -------- | ------------ | +| 1 | id | Integer | 密钥UUID,必填 | + +> **输出** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| -------- | ------------- | -------- | ----------------------- | +| 1 | flag | boolean | 接口调用,成功/失败标识 | +| 2 | code | int | 错误码,成功时=0 | +| 3 | desc | string | 结果描述 | + + +## 1.5 批量删除多条p_pass_instant记录 + +> **描述**:根据多个密钥UUID删除多条p_pass_instant记录。 + +> **url**:/admin/p_pass_instant_rest/batch_delete +> +> **method**:POST + +> **输入** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| ---- | -------- | -------- | ------------ | +| 1 | ids[] | Integer | 密钥UUID,必填 | +| 2 | ids[] | Integer | 密钥UUID,必填 | +| ... | ids[] | Integer | 密钥UUID,必填 | +| n | ids[] | Integer | 密钥UUID,必填 | + +> **输出** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| -------- | ------------- | -------- | ----------------------- | +| 1 | flag | boolean | 接口调用,成功/失败标识 | +| 2 | code | int | 错误码,成功时=0 | +| 3 | desc | string | 结果描述 | + + +## 1.6 分页查询p_pass_instant + +> **描述**:分页查询p_pass_instant。 + +> **url**:/admin/p_pass_instant_rest/page +> +> **method**:GET + +> **输入** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| ---- | -------- | -------- | ------------ | +| 1 |page |int |第几页 [1,n) | +| 2 |limit |int |每页多少条 [0,100) | +| 3 |safeOrderBy |int | 排序 例如 数据库字段名称 desc或asc | + |4|passIdFirst| Integer |密钥UUID| + |5|passNameFirst| String |密钥名称| + |6|passLengthFirst| Integer |密钥长度| + |7|passTypeFirst| String |密钥类型| + |8|passExpiryFirst| Date |密钥有效期| + |9|passExpirySecond| Date |密钥有效期| + |10|passCreatetimeFirst| Date |密钥上传时间| + |11|passCreatetimeSecond| Date |密钥上传时间| + |12|passUseridFirst| Integer |密钥使用者| + +> **输出** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| -------- | ------------- | -------- | ----------------------- | +| 1 | flag | boolean | 接口调用,成功/失败标识 | +| 2 | code | int | 错误码,成功时=0 | +| 3 | desc | string | 结果描述 | +| 4 | data | array | p_pass_instant详情数组对象 | +| | | | | +| 字段解释 | | | | +| 1 | passId | Integer | 密钥UUID | +| 2 | passName | String | 密钥名称 | +| 3 | passLength | Integer | 密钥长度 | +| 4 | passType | String | 密钥类型 | +| 5 | passChildfir | String | 第一子密钥 | +| 6 | passChildsec | String | 第二子密钥 | +| 7 | passChildthi | String | 第三子密钥 | +| 8 | passExpiry | Date | 密钥有效期 | +| 9 | passCreatetime | Date | 密钥上传时间 | +| 10 | passUserid | Integer | 密钥使用者 | diff --git a/us_passManage/doc/ppassold/api.md b/us_passManage/doc/ppassold/api.md new file mode 100644 index 0000000..29eff67 --- /dev/null +++ b/us_passManage/doc/ppassold/api.md @@ -0,0 +1,193 @@ + +# p_pass_old p_pass_old模块 API +## 1.1 查询p_pass_old详情 + +> **描述**:根据密钥UUID查询p_pass_old详情。 + +> **url**:/admin/p_pass_old_rest/get/{passId} +> +> **method**:GET + +> **输入** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| ---- | -------- | -------- | ------------ | +| 1 | id | Integer | 密钥UUID,必填 | + +> **输出** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| -------- | ------------- | -------- | ----------------------- | +| 1 | flag | boolean | 接口调用,成功/失败标识 | +| 2 | code | int | 错误码,成功时=0 | +| 3 | desc | string | 结果描述 | +| 4 | data | object | p_pass_old详情对象 | +| | | | | +| 字段解释 | | | | +| 1 | passId | Integer | 密钥UUID | +| 2 | passName | String | 密钥名称 | +| 3 | passLength | Integer | 密钥长度 | +| 4 | passType | String | 密钥类型 | +| 5 | passChildfir | String | 第一子密钥 | +| 6 | passChildsec | String | 第二子密钥 | +| 7 | passChildthi | String | 第三子密钥 | +| 8 | passExpiry | Date | 密钥有效期 | +| 9 | passCreatetime | Date | 密钥上传时间 | +| 10 | passUserid | Integer | 密钥使用者 | + +## 1.2 保存p_pass_old详情 + +> **描述**:保存p_pass_old详情。 + +> **url**:/admin/p_pass_old_rest/save +> +> **method**:POST + +> **输入** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| ---- | -------- | -------- | ------------ | +| 1| passId | Integer | 密钥UUID | +| 2| passName | String | 密钥名称 | +| 3| passLength | Integer | 密钥长度 | +| 4| passType | String | 密钥类型 | +| 5| passChildfir | String | 第一子密钥 | +| 6| passChildsec | String | 第二子密钥 | +| 7| passChildthi | String | 第三子密钥 | +| 8| passExpiry | Date | 密钥有效期 | +| 9| passCreatetime | Date | 密钥上传时间 | +| 10| passUserid | Integer | 密钥使用者 | + +> **输出** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| -------- | ------------- | -------- | ----------------------- | +| 1 | flag | boolean | 接口调用,成功/失败标识 | +| 2 | code | int | 错误码,成功时=0 | +| 3 | desc | string | 结果描述 | + +## 1.3 更新p_pass_old详情 + +> **描述**:根据密钥UUID更新p_pass_old的任意属性值,确保要更新的参数不能为null。 + +> **url**:/admin/p_pass_old_rest/update/{passId} +> +> **method**:POST + +> **输入** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| ---- | -------- | -------- | ------------ | +| 1| passId | Integer | 密钥UUID | +| 2| passName | String | 密钥名称 | +| 3| passLength | Integer | 密钥长度 | +| 4| passType | String | 密钥类型 | +| 5| passChildfir | String | 第一子密钥 | +| 6| passChildsec | String | 第二子密钥 | +| 7| passChildthi | String | 第三子密钥 | +| 8| passExpiry | Date | 密钥有效期 | +| 9| passCreatetime | Date | 密钥上传时间 | +| 10| passUserid | Integer | 密钥使用者 | + +> **输出** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| -------- | ------------- | -------- | ----------------------- | +| 1 | flag | boolean | 接口调用,成功/失败标识 | +| 2 | code | int | 错误码,成功时=0 | +| 3 | desc | string | 结果描述 | + +## 1.4 删除一条p_pass_old记录 + +> **描述**:根据密钥UUID删除一条p_pass_old记录。 + +> **url**:/admin/p_pass_old_rest/delete/{passId} +> +> **method**:POST + +> **输入** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| ---- | -------- | -------- | ------------ | +| 1 | id | Integer | 密钥UUID,必填 | + +> **输出** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| -------- | ------------- | -------- | ----------------------- | +| 1 | flag | boolean | 接口调用,成功/失败标识 | +| 2 | code | int | 错误码,成功时=0 | +| 3 | desc | string | 结果描述 | + + +## 1.5 批量删除多条p_pass_old记录 + +> **描述**:根据多个密钥UUID删除多条p_pass_old记录。 + +> **url**:/admin/p_pass_old_rest/batch_delete +> +> **method**:POST + +> **输入** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| ---- | -------- | -------- | ------------ | +| 1 | ids[] | Integer | 密钥UUID,必填 | +| 2 | ids[] | Integer | 密钥UUID,必填 | +| ... | ids[] | Integer | 密钥UUID,必填 | +| n | ids[] | Integer | 密钥UUID,必填 | + +> **输出** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| -------- | ------------- | -------- | ----------------------- | +| 1 | flag | boolean | 接口调用,成功/失败标识 | +| 2 | code | int | 错误码,成功时=0 | +| 3 | desc | string | 结果描述 | + + +## 1.6 分页查询p_pass_old + +> **描述**:分页查询p_pass_old。 + +> **url**:/admin/p_pass_old_rest/page +> +> **method**:GET + +> **输入** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| ---- | -------- | -------- | ------------ | +| 1 |page |int |第几页 [1,n) | +| 2 |limit |int |每页多少条 [0,100) | +| 3 |safeOrderBy |int | 排序 例如 数据库字段名称 desc或asc | + |4|passIdFirst| Integer |密钥UUID| + |5|passNameFirst| String |密钥名称| + |6|passLengthFirst| Integer |密钥长度| + |7|passTypeFirst| String |密钥类型| + |8|passExpiryFirst| Date |密钥有效期| + |9|passExpirySecond| Date |密钥有效期| + |10|passCreatetimeFirst| Date |密钥上传时间| + |11|passCreatetimeSecond| Date |密钥上传时间| + |12|passUseridFirst| Integer |密钥使用者| + +> **输出** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| -------- | ------------- | -------- | ----------------------- | +| 1 | flag | boolean | 接口调用,成功/失败标识 | +| 2 | code | int | 错误码,成功时=0 | +| 3 | desc | string | 结果描述 | +| 4 | data | array | p_pass_old详情数组对象 | +| | | | | +| 字段解释 | | | | +| 1 | passId | Integer | 密钥UUID | +| 2 | passName | String | 密钥名称 | +| 3 | passLength | Integer | 密钥长度 | +| 4 | passType | String | 密钥类型 | +| 5 | passChildfir | String | 第一子密钥 | +| 6 | passChildsec | String | 第二子密钥 | +| 7 | passChildthi | String | 第三子密钥 | +| 8 | passExpiry | Date | 密钥有效期 | +| 9 | passCreatetime | Date | 密钥上传时间 | +| 10 | passUserid | Integer | 密钥使用者 | diff --git a/us_passManage/doc/shell/nojdk/clean.bat b/us_passManage/doc/shell/nojdk/clean.bat new file mode 100644 index 0000000..a17a085 --- /dev/null +++ b/us_passManage/doc/shell/nojdk/clean.bat @@ -0,0 +1,8 @@ +set JAVA_HOME=%CD%\..\..\jdk\jdk1.8.0_45 + +set M2_HOME=%CD%\..\apache-maven-3.3.9 + +set PATH=%JAVA_HOME%\bin;%M2_HOME%\bin; + + +mvn clean diff --git a/us_passManage/doc/shell/nojdk/us-package.bat b/us_passManage/doc/shell/nojdk/us-package.bat new file mode 100644 index 0000000..7587ab7 --- /dev/null +++ b/us_passManage/doc/shell/nojdk/us-package.bat @@ -0,0 +1,11 @@ + +set JAVA_HOME=%CD%\..\..\jdk\jdk1.8.0_45 + +set M2_HOME=%CD%\..\apache-maven-3.3.9 + +set PATH=%JAVA_HOME%\bin;%M2_HOME%\bin; + + +mvn clean package + +pause; diff --git a/us_passManage/doc/shell/nojdk/us-第一步编译项目.bat b/us_passManage/doc/shell/nojdk/us-第一步编译项目.bat new file mode 100644 index 0000000..bdf38f8 --- /dev/null +++ b/us_passManage/doc/shell/nojdk/us-第一步编译项目.bat @@ -0,0 +1,2 @@ +@call us-package.bat +pause diff --git a/us_passManage/doc/shell/nojdk/us-第二步启动项目.bat b/us_passManage/doc/shell/nojdk/us-第二步启动项目.bat new file mode 100644 index 0000000..ba62cba --- /dev/null +++ b/us_passManage/doc/shell/nojdk/us-第二步启动项目.bat @@ -0,0 +1,7 @@ +set JAVA_HOME=%CD%\..\..\jdk\jdk1.8.0_45 +set PATH=%JAVA_HOME%\bin;%M2_HOME%\bin; +cd %CD%\us-admin\target + +java -jar us-admin.jar + +pause diff --git a/us_passManage/doc/shell/package/mac-us-package.sh b/us_passManage/doc/shell/package/mac-us-package.sh new file mode 100644 index 0000000..064643d --- /dev/null +++ b/us_passManage/doc/shell/package/mac-us-package.sh @@ -0,0 +1,8 @@ +echo 'mac please make sure you have installed jdk1.8' +#export JAVA_HOME=../../jdk/jdk1.8.0_45 + +export M2_HOME=./../apache-maven-3.3.9 +chmod -R 755 $M2_HOME/bin +#export PATH=$PATH:%M2_HOME%/bin + +sh $M2_HOME/bin/mvn clean package diff --git a/us_passManage/doc/shell/package/mac-us-step1-compile.sh b/us_passManage/doc/shell/package/mac-us-step1-compile.sh new file mode 100644 index 0000000..3df557a --- /dev/null +++ b/us_passManage/doc/shell/package/mac-us-step1-compile.sh @@ -0,0 +1 @@ +sh mac-us-package.sh diff --git a/us_passManage/doc/shell/package/mac-us-step2-start.sh b/us_passManage/doc/shell/package/mac-us-step2-start.sh new file mode 100644 index 0000000..01003d2 --- /dev/null +++ b/us_passManage/doc/shell/package/mac-us-step2-start.sh @@ -0,0 +1,7 @@ +echo 'mac please make sure you have installed jdk1.8' +echo 'mac please make sure you have installed redis' +#export JAVA_HOME=../../jdk/jdk1.8.0_45 +#export PATH=%JAVA_HOME%/bin;%M2_HOME%/bin; +cd us-admin/target + +java -jar us-admin.jar --spring.profiles.active=localhost diff --git a/us_passManage/doc/shell/package/start.sh b/us_passManage/doc/shell/package/start.sh new file mode 100644 index 0000000..b393962 --- /dev/null +++ b/us_passManage/doc/shell/package/start.sh @@ -0,0 +1,2 @@ +cd /home/web/tomcat/us +nohup>nohupGps java -Xmx1000m -Xms1000m -jar ./us-admin.jar --spring.profiles.active=publish 2>&1 & diff --git a/us_passManage/doc/shell/package/us-package.bat b/us_passManage/doc/shell/package/us-package.bat new file mode 100644 index 0000000..7587ab7 --- /dev/null +++ b/us_passManage/doc/shell/package/us-package.bat @@ -0,0 +1,11 @@ + +set JAVA_HOME=%CD%\..\..\jdk\jdk1.8.0_45 + +set M2_HOME=%CD%\..\apache-maven-3.3.9 + +set PATH=%JAVA_HOME%\bin;%M2_HOME%\bin; + + +mvn clean package + +pause; diff --git a/us_passManage/doc/shell/package/us-第一步编译项目.bat b/us_passManage/doc/shell/package/us-第一步编译项目.bat new file mode 100644 index 0000000..01bc173 --- /dev/null +++ b/us_passManage/doc/shell/package/us-第一步编译项目.bat @@ -0,0 +1,4 @@ +title һusĿ ֻҪɴ Ҫִд˲ + +@call us-package.bat +pause diff --git a/us_passManage/doc/shell/package/us-第二步启动项目.bat b/us_passManage/doc/shell/package/us-第二步启动项目.bat new file mode 100644 index 0000000..9b935cb --- /dev/null +++ b/us_passManage/doc/shell/package/us-第二步启动项目.bat @@ -0,0 +1,11 @@ +title ڶ us̨ ҪصѾʵ + +@call redis.bat + +set JAVA_HOME=%CD%\..\..\jdk\jdk1.8.0_45 +set PATH=%JAVA_HOME%\bin;%M2_HOME%\bin; +cd %CD%\us-admin\target + +java -jar us-admin.jar --spring.profiles.active=localhost + +pause diff --git a/us_passManage/doc/vms/us_mysql/common/comment/ClassDesc.vm b/us_passManage/doc/vms/us_mysql/common/comment/ClassDesc.vm new file mode 100644 index 0000000..914261c --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/common/comment/ClassDesc.vm @@ -0,0 +1,6 @@ +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 软件作者:何栋宇 qq:709876443 +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:648595928 +*/ diff --git a/us_passManage/doc/vms/us_mysql/common/comment/ClassDescOnce.vm b/us_passManage/doc/vms/us_mysql/common/comment/ClassDescOnce.vm new file mode 100644 index 0000000..53bd195 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/common/comment/ClassDescOnce.vm @@ -0,0 +1,5 @@ +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 软件作者:何栋宇 qq:709876443 +* 欢迎加入官方QQ群:648595928 +*/ diff --git a/us_passManage/doc/vms/us_mysql/common/comment/JspDesc.vm b/us_passManage/doc/vms/us_mysql/common/comment/JspDesc.vm new file mode 100644 index 0000000..f0a8802 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/common/comment/JspDesc.vm @@ -0,0 +1,6 @@ +<%-- + 代码为自动生成 Created by www.magicalcoder.com + 软件作者:何栋宇 qq:709876443 + 如果你改变了此类 read 请将此行删除 + 欢迎加入官方QQ群:648595928 +--%> diff --git a/us_passManage/doc/vms/us_mysql/common/comment/XmlDesc.vm b/us_passManage/doc/vms/us_mysql/common/comment/XmlDesc.vm new file mode 100644 index 0000000..3595336 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/common/comment/XmlDesc.vm @@ -0,0 +1,6 @@ + diff --git a/us_passManage/doc/vms/us_mysql/common/comment/XmlDescOnce.vm b/us_passManage/doc/vms/us_mysql/common/comment/XmlDescOnce.vm new file mode 100644 index 0000000..a00d09c --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/common/comment/XmlDescOnce.vm @@ -0,0 +1,5 @@ + diff --git a/us_passManage/doc/vms/us_mysql/common/comment/html-desc.vm b/us_passManage/doc/vms/us_mysql/common/comment/html-desc.vm new file mode 100644 index 0000000..1941806 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/common/comment/html-desc.vm @@ -0,0 +1,6 @@ + diff --git a/us_passManage/doc/vms/us_mysql/common/util/douHao.vm b/us_passManage/doc/vms/us_mysql/common/util/douHao.vm new file mode 100644 index 0000000..8ebb63a --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/common/util/douHao.vm @@ -0,0 +1,5 @@ +#if($velocityCount != $nodeList.size()) + #set($douHao = true) +#else + #set($douHao = false) +#end diff --git a/us_passManage/doc/vms/us_mysql/common/util/douHaoHead.vm b/us_passManage/doc/vms/us_mysql/common/util/douHaoHead.vm new file mode 100644 index 0000000..bafafee --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/common/util/douHaoHead.vm @@ -0,0 +1,5 @@ +#if($velocityCount != 1) + #set($douHao = true) +#else + #set($douHao = false) +#end diff --git a/us_passManage/doc/vms/us_mysql/common/variable/head.vm b/us_passManage/doc/vms/us_mysql/common/variable/head.vm new file mode 100644 index 0000000..71dc52d --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/common/variable/head.vm @@ -0,0 +1,114 @@ +##定义了非常多的快捷变量供使用 模板编辑时使用 $head.即可调出所有变量 +##项目相关名 +#set($commonUtilName = ${dbProject.commonUtilName}) +#set($companyName = ${dbProject.companyName}) +#set($projectName = ${dbProject.projectName}) +#set($include = 'include') +##每次升级 有可能改变通用 js html 所以用版本号来兼容 +#set($jshtmlVersion = 'v103') +##数据库实际名字 +#set($databaseRealName = ${dbProject.databaseRealName}) +##表名称 +#set($tableName = ${dbTable.tableName}) +##表实际名称 +#set($tableRealName = ${dbTable.tableRealName}) +##表实际名称小写 +#set($tableRealNameLowerCase = $TableFieldUtil.toLowerCase(${dbTable.tableRealName})) +##表注释 +#set($tableComment=${dbTable.tableComment}) +##表名转化后的java类名 +#set($Entity=$TableFieldUtil.sqlTableToJavaClassName($tableName)) +##java类名首字母小写 +#set($entity=$TableFieldUtil.firstCharToLower($Entity)) +##java类名字母全小写 +#set($lowerEntity=$TableFieldUtil.toLowerCase($Entity)) +##返回getGoodsList之类的字符串 +#set($getEntityList = "get${Entity}List") +##velocity的#是特殊符号 这里转义一下 +#set($jing = '#') +##如果您觉得生成的代码很难控制空格 不妨试试下面的变量 +#set($tab1 = ' ') +#set($tab2 = ' ') +#set($tab3 = ' ') +#set($tab4 = ' ') +#set($tab5 = ' ') +#set($tab6 = ' ') +#set($tab7 = ' ') +#set($tab8 = ' ') +#set($tab9 = ' ') +#set($tab10 = ' ') +#set($tab11 = ' ') +#set($tab12 = ' ') +#set($tab13 = ' ') +#set($tab14 = ' ') +#set($tab15 = ' ') +#set($tab16 = ' ') +#set($tab17 = ' ') +#set($tab18 = ' ') +#set($tab19 = ' ') +#set($tab20 = ' ') +##无自增的nodelist +#set($noAutoIncreseNodeList = $CreateVmUtil.noAutoIncreseNodeList($nodeList)) +##字段中是否存在Bigdecimal类型 +#set($hasBigDecimal=false) +#foreach($node in $nodeList) + #if($node.dbField.javaType == "BigDecimal") + #set($hasBigDecimal=true) + #end +#end +##是否存在日期类型查询 +#set($hasDateQuery=false) +#foreach($node in $nodeList) + #if($node.dbField.javaType == 'Date' || $node.dbField.javaType == 'Time' || $node.dbField.javaType == 'Timestamp') + #set($hasDateQuery=true) + #end +#end +##是否存在file inpytType +#set($hasFile=false) +#foreach($node in $nodeList) + #if($node.formItem.inputType == $MagicConstant.INPYT_TYPE_IMG_FILE()) + #set($hasFile=true) + #end +#end +##是否存在ckeditor inpytType +#set($hasKindEditor=false) +#foreach($node in $nodeList) + #if($node.formItem.inputType == $MagicConstant.INPYT_TYPE_KINDEDITOR()) + #set($hasKindEditor=true) + #end +#end +##是否有主键 +#set($hasDbPriorityKey = false) +##是否有自增 +#set($hasAutoIncrease = false) +##主键数据库字段名 +#set($dbPriorityKeySqlField = '') +##主键字段java变量名 +#set($dbPriorityKeyJavaField = '') +##主键java类型 +#set($dbPriorityKeyJavaType = '') +##主键java get名称 +#set($dbPriorityKeyJavaGetName = '') +##主键java set名称 +#set($dbPriorityKeyJavaSetName = '') +##主键数据库java set名称 +#set($dbPriorityKeyDbType = '') +##主键字段 +#set($dbPriorityNode = {}) +##查找字段中是主键的设置到全局变量 +#foreach( $node in $nodeList) + #if($node.dbField.dbPriorityKey) + #set($dbPriorityNode = $node) + #set($dbPriorityKeySqlField = $node.dbField.dbRealName) + #set($dbPriorityKeyJavaField = $node.dbField.javaField) + #set($dbPriorityKeyJavaType = $node.dbField.javaType) + #set($dbPriorityKeyJavaGetName = $node.dbField.javaGetName) + #set($dbPriorityKeyJavaSetName = $node.dbField.javaSetName) + #set($dbPriorityKeyDbType = $node.dbField.dbType) + #set($hasDbPriorityKey = true) + #set($hasAutoIncrease = true) + #end +#end +##唯一键 +#set($dbUniqueNodes = $TableFieldUtil.uniqueNodes($nodeList)) +#set($hasDbUniqueNodes = ($dbUniqueNodes && $dbUniqueNodes.size()>0)) diff --git a/us_passManage/doc/vms/us_mysql/constant/Constant.vm b/us_passManage/doc/vms/us_mysql/constant/Constant.vm new file mode 100644 index 0000000..a966474 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/constant/Constant.vm @@ -0,0 +1,8 @@ +#parse("vms/$version/common/variable/head.vm") +package ${companyName}.${projectName}.service.${lowerEntity}.constant; + +#parse("vms/$version/common/comment/ClassDesc.vm") + +public interface ${Entity}Constant{ + +} diff --git a/us_passManage/doc/vms/us_mysql/controller/AdminRestController.vm b/us_passManage/doc/vms/us_mysql/controller/AdminRestController.vm new file mode 100644 index 0000000..06be342 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/controller/AdminRestController.vm @@ -0,0 +1,128 @@ +#parse("vms/$version/common/variable/head.vm") +package ${companyName}.${projectName}.admin.api.${lowerEntity}; + +import ${companyName}.${projectName}.core.service.CommonRestController; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +#if($hasDateQuery) +import java.util.Date; +import java.sql.Time; +import java.sql.Timestamp; +#end +import java.math.*; +import java.util.List; +import java.util.Map; +import java.util.HashMap; +import java.util.Set; +import ${companyName}.${projectName}.core.common.constant.PageConstant; +import ${companyName}.${projectName}.core.common.exception.BusinessException; +import ${companyName}.${projectName}.core.serialize.ResponseMsg; +import ${companyName}.${projectName}.model.${Entity}; +import ${companyName}.${projectName}.service.${lowerEntity}.service.${Entity}Service; + +import ${companyName}.${projectName}.core.utils.ListUtil; +import ${companyName}.${projectName}.core.utils.MapUtil; +import ${companyName}.${projectName}.core.utils.StringUtil; + + +#parse("vms/$version/common/comment/ClassDesc.vm") + +@RequestMapping("/admin/${tableRealName}_rest/") +@RestController +public class Admin${Entity}RestController extends CommonRestController<${Entity},$dbPriorityKeyJavaType> implements InitializingBean +{ + + @Resource + private ${Entity}Service ${entity}Service; + + #if($childrenList) + //外键下拉查询接口 + @RequestMapping(value = "search") + public ResponseMsg search( + @RequestParam(required = false) String uniqueField, + @RequestParam(required = false,value = "uniqueValue[]") Set<$dbPriorityKeyJavaType> uniqueValue,//主键多个值 + @RequestParam(required = false,defaultValue = "20") Integer limit, + @RequestParam(required = false) String keyword + ){ + limit = Math.min(PageConstant.MAX_LIMIT,limit); + List<$Entity> list = null; + Map query = new HashMap(); + query.put("limit",limit); + ##默认排序逻辑 + #set($defaultOrderBy = $TableFieldUtil.buildDefaultOrderBy($nodeList)) + #if($StringUtil.isNotBlank($defaultOrderBy)) + query.put("notSafeOrderBy","$defaultOrderBy"); + #end + if(uniqueValue!=null){//说明是来初始化的 + list = ${entity}Service.getModelInList(uniqueValue); + }else {//正常搜索 + #foreach($node in $nodeList) + #set($inputType = $node.formItem.inputType) + #if($node.formQueryList) + #foreach($formQuery in $node.formQueryList) + #if($formQuery.foreignInputSelectShow == 1) + #if($StringUtil.isNotBlank($formQuery.firstCompare)) + if(ListUtil.isBlank(list)){ + query.put("${node.dbField.javaField}First",keyword); + list = ${entity}Service.getModelList(query); + query.remove("${node.dbField.javaField}First"); + } + #end + #if($StringUtil.isNotBlank($formQuery.secondCompare)) + if(ListUtil.isBlank(list)){ + query.put("${node.dbField.javaField}Second",keyword); + list = ${entity}Service.getModelList(query); + query.remove("${node.dbField.javaField}Second"); + } + #end + #end + #end + #end + #end + } + return new ResponseMsg(list); + } + #end + //分页查询 + @RequestMapping(value={"page"}, method={RequestMethod.GET}) + public ResponseMsg page( + #parse("vms/$version/controller/include/self/pageParam.vm") + @RequestParam int page,@RequestParam int limit,@RequestParam(required = false) String safeOrderBy + ,HttpServletResponse response,@RequestParam(required = false) Integer queryType + ){ + Map query = new HashMap(); + #parse("vms/$version/controller/include/self/pageQueryMap.vm") + Integer count = ${entity}Service.getModelListCount(query); +##默认排序逻辑 + #set($defaultOrderBy = $TableFieldUtil.buildDefaultOrderBy($nodeList)) + #if($StringUtil.isBlank($defaultOrderBy)) + query.put("safeOrderBy",safeOrderBy); + #else + if(StringUtil.isBlank(safeOrderBy)){ + query.put("notSafeOrderBy","$defaultOrderBy"); + }else{ + query.put("safeOrderBy",safeOrderBy); + } + #end + if(queryType==null || queryType == QUERY_TYPE_SEARCH){//普通查询 + limit = Math.min(limit, PageConstant.MAX_LIMIT); + query.put("start",(page - 1) * limit);query.put("limit",limit); + return new ResponseMsg(count,${entity}Service.getModelList(query)); + }else if(queryType == QUERY_TYPE_EXPORT_EXCEL){ + query.put("start",(page - 1) * limit);query.put("limit",limit); + exportExcel(response,${entity}Service.getModelList(query),"$tableComment", + new String[]{#foreach($node in $nodeList)#if($velocityCount!=1),#end"${node.formItem.title}"#end}, + new String[]{#foreach($node in $nodeList)#if($velocityCount!=1),#end #set($selectValueMap = $TableFieldUtil.parseJsonToMap($node.formItem.selectValue))"#set($keyValueList = $selectValueMap.get('keyValueList'))#if($keyValueList)$TableFieldUtil.replaceDoubleYinHao($JSON.toJSONString($keyValueList))#end"#end}); + } + return null; + } + + @Override + public void afterPropertiesSet() throws Exception { + super.commonService = ${entity}Service; + super.primaryKey = "$dbPriorityKeyJavaField";//硬编码此实体的主键名称 + } +} diff --git a/us_passManage/doc/vms/us_mysql/controller/include/self/pageParam.vm b/us_passManage/doc/vms/us_mysql/controller/include/self/pageParam.vm new file mode 100644 index 0000000..bf69961 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/controller/include/self/pageParam.vm @@ -0,0 +1,36 @@ +##查询入参 +#foreach($node in $nodeList) + #set($inputType = $node.formItem.inputType) + #if($node.formQueryList) + #foreach($formQuery in $node.formQueryList) + #if($formQuery.foreignQueryFieldNode)##有外键查询 + + #else##无外键查询 + #if($StringUtil.isNotBlank($formQuery.firstCompare)) + @RequestParam(required = false,value ="${node.dbField.javaField}First")## + #if($CreateVmUtil.isTimestemp($node.dbField.javaType)) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")$node.dbField.javaType ${node.dbField.javaField}First , + #else + #if($inputType == $MagicConstant.INPYT_TYPE_SELECT() && $formQuery.firstCompare=='in') + String ${node.dbField.javaField}First , + #else + $node.dbField.javaType ${node.dbField.javaField}First , + #end + #end + #end + #if($StringUtil.isNotBlank($formQuery.secondCompare)) + @RequestParam(required = false,value ="${node.dbField.javaField}Second")## + #if($CreateVmUtil.isTimestemp($node.dbField.javaType)) + @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")$node.dbField.javaType ${node.dbField.javaField}Second , + #else + #if($inputType == $MagicConstant.INPYT_TYPE_SELECT() && $formQuery.secondCompare=='in') + String ${node.dbField.javaField}Second , + #else + $node.dbField.javaType ${node.dbField.javaField}Second , + #end + #end + #end + #end + #end + #end +#end diff --git a/us_passManage/doc/vms/us_mysql/controller/include/self/pageQueryMap.vm b/us_passManage/doc/vms/us_mysql/controller/include/self/pageQueryMap.vm new file mode 100644 index 0000000..4391533 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/controller/include/self/pageQueryMap.vm @@ -0,0 +1,33 @@ +##查询入参 +#foreach($node in $nodeList) + #set($inputType = $node.formItem.inputType) + #if($node.formQueryList) + #foreach($formQuery in $node.formQueryList) + #if($formQuery.foreignQueryFieldNode)##有外键查询 + #else##无外键查询 + #if($StringUtil.isNotBlank($formQuery.firstCompare)) + #if($inputType == $MagicConstant.INPYT_TYPE_SELECT() && $formQuery.firstCompare=='in') + query.put("${node.dbField.javaField}First",coverBlankToNull(${node.dbField.javaField}First)); + #else + #if($node.dbField.javaType == "String") + query.put("${node.dbField.javaField}First",coverBlankToNull(${node.dbField.javaField}First)); + #else + query.put("${node.dbField.javaField}First",${node.dbField.javaField}First); + #end + #end + #end + #if($StringUtil.isNotBlank($formQuery.secondCompare)) + #if($inputType == $MagicConstant.INPYT_TYPE_SELECT() && $formQuery.secondCompare=='in') + query.put("${node.dbField.javaField}Second",coverBlankToNull(${node.dbField.javaField}Second)); + #else + #if($node.dbField.javaType == "String") + query.put("${node.dbField.javaField}Second",coverBlankToNull(${node.dbField.javaField}Second)); + #else + query.put("${node.dbField.javaField}Second",${node.dbField.javaField}Second); + #end + #end + #end + #end + #end + #end +#end diff --git a/us_passManage/doc/vms/us_mysql/controller/include/self/search-param.vm b/us_passManage/doc/vms/us_mysql/controller/include/self/search-param.vm new file mode 100644 index 0000000..a24b3b2 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/controller/include/self/search-param.vm @@ -0,0 +1,12 @@ +##查询入参 +#set($needSearch = false) +#foreach($node in $nodeList) + #set($inputType = $node.formItem.inputType) + #if($node.formQueryList) + #foreach($formQuery in $node.formQueryList) + #if($formQuery.foreignInputSelectShow == 1) + #set($needSearch = true) + #end + #end + #end +#end diff --git a/us_passManage/doc/vms/us_mysql/controller/include/self/search-query-map.vm b/us_passManage/doc/vms/us_mysql/controller/include/self/search-query-map.vm new file mode 100644 index 0000000..4391533 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/controller/include/self/search-query-map.vm @@ -0,0 +1,33 @@ +##查询入参 +#foreach($node in $nodeList) + #set($inputType = $node.formItem.inputType) + #if($node.formQueryList) + #foreach($formQuery in $node.formQueryList) + #if($formQuery.foreignQueryFieldNode)##有外键查询 + #else##无外键查询 + #if($StringUtil.isNotBlank($formQuery.firstCompare)) + #if($inputType == $MagicConstant.INPYT_TYPE_SELECT() && $formQuery.firstCompare=='in') + query.put("${node.dbField.javaField}First",coverBlankToNull(${node.dbField.javaField}First)); + #else + #if($node.dbField.javaType == "String") + query.put("${node.dbField.javaField}First",coverBlankToNull(${node.dbField.javaField}First)); + #else + query.put("${node.dbField.javaField}First",${node.dbField.javaField}First); + #end + #end + #end + #if($StringUtil.isNotBlank($formQuery.secondCompare)) + #if($inputType == $MagicConstant.INPYT_TYPE_SELECT() && $formQuery.secondCompare=='in') + query.put("${node.dbField.javaField}Second",coverBlankToNull(${node.dbField.javaField}Second)); + #else + #if($node.dbField.javaType == "String") + query.put("${node.dbField.javaField}Second",coverBlankToNull(${node.dbField.javaField}Second)); + #else + query.put("${node.dbField.javaField}Second",${node.dbField.javaField}Second); + #end + #end + #end + #end + #end + #end +#end diff --git a/us_passManage/doc/vms/us_mysql/doc/api.vm b/us_passManage/doc/vms/us_mysql/doc/api.vm new file mode 100644 index 0000000..71c8226 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/doc/api.vm @@ -0,0 +1,208 @@ +#parse("vms/$version/common/variable/head.vm") + +# $tableRealName $tableComment模块 API +## +## +## +## +## +$jing$jing 1.1 查询${tableComment}详情 + +> **描述**:根据$dbPriorityNode.dbField.dbComment查询${tableComment}详情。 + +> **url**:/admin/${tableRealName}_rest/get/{$dbPriorityNode.dbField.javaField} +> +> **method**:GET + +> **输入** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| ---- | -------- | -------- | ------------ | +| 1 | id | $dbPriorityKeyJavaType | $dbPriorityNode.dbField.dbComment,必填 | + +> **输出** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| -------- | ------------- | -------- | ----------------------- | +| 1 | flag | boolean | 接口调用,成功/失败标识 | +| 2 | code | int | 错误码,成功时=0 | +| 3 | desc | string | 结果描述 | +| 4 | data | object | ${tableComment}详情对象 | +| | | | | +| 字段解释 | | | | +#foreach($node in $nodeList) +| $velocityCount | $node.dbField.javaField | $node.dbField.javaType | $node.formItem.title | +#end + +## +## +## +## +## +$jing$jing 1.2 保存${tableComment}详情 + +> **描述**:保存${tableComment}详情。 + +> **url**:/admin/${tableRealName}_rest/save +> +> **method**:POST + +> **输入** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| ---- | -------- | -------- | ------------ | +#foreach($node in $nodeList) +| $velocityCount| $node.dbField.javaField | $node.dbField.javaType | $node.formItem.title | +#end + +> **输出** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| -------- | ------------- | -------- | ----------------------- | +| 1 | flag | boolean | 接口调用,成功/失败标识 | +| 2 | code | int | 错误码,成功时=0 | +| 3 | desc | string | 结果描述 | + +## +## +## +## +## +$jing$jing 1.3 更新${tableComment}详情 + +> **描述**:根据$dbPriorityNode.dbField.dbComment更新${tableComment}的任意属性值,确保要更新的参数不能为null。 + +> **url**:/admin/${tableRealName}_rest/update/{$dbPriorityNode.dbField.javaField} +> +> **method**:POST + +> **输入** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| ---- | -------- | -------- | ------------ | +#foreach($node in $nodeList) +| $velocityCount| $node.dbField.javaField | $node.dbField.javaType | $node.formItem.title | +#end + +> **输出** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| -------- | ------------- | -------- | ----------------------- | +| 1 | flag | boolean | 接口调用,成功/失败标识 | +| 2 | code | int | 错误码,成功时=0 | +| 3 | desc | string | 结果描述 | + +## +## +## +## +## +$jing$jing 1.4 删除一条${tableComment}记录 + +> **描述**:根据$dbPriorityNode.dbField.dbComment删除一条${tableComment}记录。 + +> **url**:/admin/${tableRealName}_rest/delete/{$dbPriorityNode.dbField.javaField} +> +> **method**:POST + +> **输入** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| ---- | -------- | -------- | ------------ | +| 1 | id | $dbPriorityKeyJavaType | $dbPriorityNode.dbField.dbComment,必填 | + +> **输出** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| -------- | ------------- | -------- | ----------------------- | +| 1 | flag | boolean | 接口调用,成功/失败标识 | +| 2 | code | int | 错误码,成功时=0 | +| 3 | desc | string | 结果描述 | + + +## +## +## +## +## +$jing$jing 1.5 批量删除多条${tableComment}记录 + +> **描述**:根据多个$dbPriorityNode.dbField.dbComment删除多条${tableComment}记录。 + +> **url**:/admin/${tableRealName}_rest/batch_delete +> +> **method**:POST + +> **输入** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| ---- | -------- | -------- | ------------ | +| 1 | ids[] | $dbPriorityKeyJavaType | $dbPriorityNode.dbField.dbComment,必填 | +| 2 | ids[] | $dbPriorityKeyJavaType | $dbPriorityNode.dbField.dbComment,必填 | +| ... | ids[] | $dbPriorityKeyJavaType | $dbPriorityNode.dbField.dbComment,必填 | +| n | ids[] | $dbPriorityKeyJavaType | $dbPriorityNode.dbField.dbComment,必填 | + +> **输出** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| -------- | ------------- | -------- | ----------------------- | +| 1 | flag | boolean | 接口调用,成功/失败标识 | +| 2 | code | int | 错误码,成功时=0 | +| 3 | desc | string | 结果描述 | + + +## +## +## +## +## +$jing$jing 1.6 分页查询${tableComment} + +> **描述**:分页查询${tableComment}。 + +> **url**:/admin/${tableRealName}_rest/page +> +> **method**:GET + +> **输入** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| ---- | -------- | -------- | ------------ | +| 1 |page |int |第几页 [1,n) | +| 2 |limit |int |每页多少条 [0,100) | +| 3 |safeOrderBy |int | 排序 例如 数据库字段名称 desc或asc | +##查询入参 +#set($cnt=3) +#foreach($node in $nodeList) + #set($inputType = $node.formItem.inputType) + #if($node.formQueryList) + #foreach($formQuery in $node.formQueryList) + #if($formQuery.foreignQueryFieldNode)##有外键查询 + + #else##无外键查询 + #if($StringUtil.isNotBlank($formQuery.firstCompare)) + #set($cnt=$cnt+1) + |$cnt|${node.dbField.javaField}First| $node.dbField.javaType |$node.formItem.title| + #end + #if($StringUtil.isNotBlank($formQuery.secondCompare)) + #set($cnt=$cnt+1) + |$cnt|${node.dbField.javaField}Second| $node.dbField.javaType |$node.formItem.title| + #end + #end + #end + #end +#end + +> **输出** + +| 序号 | 字段名称 | 字段类型 | 字段描述 | +| -------- | ------------- | -------- | ----------------------- | +| 1 | flag | boolean | 接口调用,成功/失败标识 | +| 2 | code | int | 错误码,成功时=0 | +| 3 | desc | string | 结果描述 | +| 4 | data | array | ${tableComment}详情数组对象 | +| | | | | +| 字段解释 | | | | +#foreach($node in $nodeList) +| $velocityCount | $node.dbField.javaField | $node.dbField.javaType | $node.formItem.title | +#end diff --git a/us_passManage/doc/vms/us_mysql/dto/Dto.vm b/us_passManage/doc/vms/us_mysql/dto/Dto.vm new file mode 100644 index 0000000..6c08e83 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/dto/Dto.vm @@ -0,0 +1,26 @@ +#parse("vms/$version/common/variable/head.vm") +package ${companyName}.${projectName}.service.${lowerEntity}.dto; + +import ${companyName}.${projectName}.model.${Entity}; + +#parse("vms/$version/common/comment/ClassDesc.vm") + +public class ${Entity}Dto extends ${Entity} { +#if($hasDbPriorityKey) + +#elseif($hasDbUniqueNodes) + #foreach($uniqueNode in $dbUniqueNodes) + private $uniqueNode.dbField.javaType ${uniqueNode.dbField.javaField}OldValue; + #end + + #foreach($uniqueNode in $dbUniqueNodes) + public $uniqueNode.dbField.javaType ${uniqueNode.dbField.javaGetName}OldValue(){ + return ${uniqueNode.dbField.javaField}OldValue; + } + public void ${uniqueNode.dbField.javaSetName}OldValue(${uniqueNode.dbField.javaType} ${uniqueNode.dbField.javaField}OldValue){ + this.${uniqueNode.dbField.javaField}OldValue = ${uniqueNode.dbField.javaField}OldValue; + } + #end +#end + +} diff --git a/us_passManage/doc/vms/us_mysql/js/include/js-entity-list-table-template.vm b/us_passManage/doc/vms/us_mysql/js/include/js-entity-list-table-template.vm new file mode 100644 index 0000000..22e8877 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/js/include/js-entity-list-table-template.vm @@ -0,0 +1,29 @@ +#parse("vms/$version/common/variable/head.vm") +#set($newNodeList=$CreateVmUtil.sortViewTable($nodeList)) +#foreach($node in $newNodeList) + #if($node.viewTable) + #if($node.dbField.dbPriorityKey) + {field: '$node.dbField.javaField', title: '$node.formItem.title', minWidth:100, align:"center",sort:$node.viewTable.sort}, + #else + #set($inputType = $node.formItem.inputType) + #if($inputType == $MagicConstant.INPYT_TYPE_RADIO()) + #parse("vms/$version/js/include/json/radio.vm") + #elseif($inputType == $MagicConstant.INPYT_TYPE_FOREIGN_SELECT()) + #parse("vms/$version/js/include/json/select2-foreign.vm") + #elseif($inputType == $MagicConstant.INPYT_TYPE_DATE()) + {field: '$node.dbField.javaField', title: '$node.formItem.title', align:'center', minWidth:250, templet :"#${node.dbField.javaField}Template",sort:$node.viewTable.sort}, + #elseif($inputType == $MagicConstant.INPYT_TYPE_SWITCH()) + #parse("vms/$version/js/include/json/switch.vm") + #elseif($inputType == $MagicConstant.INPYT_TYPE_SELECT()) + {field: '${node.dbField.javaField}', title: '$node.formItem.title',minWidth:350, align:'center', templet:'#${node.dbField.javaField}Template',sort:$node.viewTable.sort}, + #else + + {field: '$node.dbField.javaField', title: '$node.formItem.title', minWidth:200,templet:function (d) { + return '' + } + , sort:$node.viewTable.sort + }, + #end + #end + #end +#end diff --git a/us_passManage/doc/vms/us_mysql/js/include/json/radio.vm b/us_passManage/doc/vms/us_mysql/js/include/json/radio.vm new file mode 100644 index 0000000..203476f --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/js/include/json/radio.vm @@ -0,0 +1,24 @@ +## radio +#set($selectValueMap = $TableFieldUtil.parseJsonToMap($node.formItem.selectValue)) + {field: '$node.dbField.javaField', title: '$node.formItem.title',minWidth:350, align:'center', templet:function(d){ + var html = [] + var checked + #if($selectValueMap.get('inputType') == 'radio') + #set($keyValueList = $selectValueMap.get('keyValueList')) + #if($keyValueList ) + #foreach($sv in $keyValueList) + #if($sv.key != "") + if(d.$node.dbField.javaField +'' == '$sv.key'){ + checked = "checked" + }else{ + checked = "" + } + html.push('') + #end + #end + #end + #end + return html.join('') + } + ,sort:$node.viewTable.sort + }, diff --git a/us_passManage/doc/vms/us_mysql/js/include/json/select2-foreign.vm b/us_passManage/doc/vms/us_mysql/js/include/json/select2-foreign.vm new file mode 100644 index 0000000..b12eb2e --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/js/include/json/select2-foreign.vm @@ -0,0 +1,24 @@ +##外键搜索输入框下拉 +#set($dataTextFields="") +#set($isFirst=true)##设置个开关 +#set($foreignNodeList = $RemoteApiUtil.getNodeList($node.dbField.foreignVmDbFieldNode.dbTable.id)) +#foreach($foreignNode in $foreignNodeList) + #if($foreignNode.formQueryList) + #foreach($formQuery in $foreignNode.formQueryList) + #if($formQuery.foreignInputSelectShow==1) + #if($isFirst) + #set($dataTextFields="$foreignNode.dbField.javaField") + #set($isFirst=false) + #else + #set($dataTextFields="$dataTextFields,$foreignNode.dbField.javaField") + #end + #end + #end + #end +#end + {field: '$node.dbField.javaField', title: '$node.formItem.title', align:'center', minWidth:250, templet:function (d) { + var value = (!d.$node.dbField.javaField || d.$node.dbField.javaField==null) ? '' : d.$node.dbField.javaField + //var option = '' + return '' + },sort:$node.viewTable.sort + }, diff --git a/us_passManage/doc/vms/us_mysql/js/include/json/switch.vm b/us_passManage/doc/vms/us_mysql/js/include/json/switch.vm new file mode 100644 index 0000000..2999118 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/js/include/json/switch.vm @@ -0,0 +1,31 @@ +## switch +#set($selectValueMap = $TableFieldUtil.parseJsonToMap($node.formItem.selectValue)) +#set($layText="") +#set($isFirst=true)##设置个开关 + + {field: '$node.dbField.javaField', title: '$node.formItem.title',minWidth:150, align:'center', templet:function(d){ + var checked = (d.$node.dbField.javaField+''=='true' || d.$node.dbField.javaField+'' == '1') ? 'checked' : ''; +#if($selectValueMap.get('inputType') == 'switch') + #set($keyValueList = $selectValueMap.get('keyValueList')) + #if($keyValueList ) + #foreach($sv in $keyValueList) + #if($sv.key != "") + #if($isFirst) + #set($isFirst=false) + #set($layText="$sv.value") + #else + #if($sv.key) + #set($layText="$sv.value|$layText") + #else + #set($layText="$layText|$sv.value") + #end + #end + #else + #end + #end + #end +#end + return '' + } + ,sort:$node.viewTable.sort + }, diff --git a/us_passManage/doc/vms/us_mysql/js/js-entity-config.vm b/us_passManage/doc/vms/us_mysql/js/js-entity-config.vm new file mode 100644 index 0000000..98a6c5a --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/js/js-entity-config.vm @@ -0,0 +1,14 @@ +##详情页1对多关联 Many +#parse("vms/$version/common/variable/head.vm") +#parse("vms/$version/common/comment/ClassDesc.vm") +//表单通用配置 列表页 详情页都需要 v103版本已经废弃 +layui.define(['jquery'],function(exports){ + var obj = + { + tableNameRest:"${tableRealName}_rest", + tableName:"${tableRealName}", + moduleName:"${tableRealName}",//sys_module的moduleName + form:{} + } + exports('${lowerEntity}_config',obj); +}) diff --git a/us_passManage/doc/vms/us_mysql/js/js-entity-edit.vm b/us_passManage/doc/vms/us_mysql/js/js-entity-edit.vm new file mode 100644 index 0000000..4a8d764 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/js/js-entity-edit.vm @@ -0,0 +1,142 @@ +#parse("vms/$version/common/variable/head.vm") +#parse("vms/$version/common/comment/ClassDesc.vm") +;!function(){ + var $ = layui.jquery + ,layer = parent.layer === undefined ? layui.layer : top.layer + ,form = layui.form; + var mc_layui_component=us_all.mc_layui_component + ,mc_util = us_all.mc_util + ,mc_children = us_all.mc_children + ,mc_verify = us_all.mc_verify + ,mc_constant = us_all.mc_constant + ,mc_rmp = us_all.mc_rmp + ; + var common_config = { + tableNameRest:"${tableRealName}_rest", + tableName:"${tableRealName}", + moduleName:"${tableRealName}",//sys_module的moduleName + form:{ + #set($sortedNodeList=$CreateVmUtil.sortFormItem($nodeList)) + #set($dou = 0) + #foreach($node in $sortedNodeList) + #if($StringUtil.isNotBlank($node.formItem.selectValue)) + #set($inputType = $node.formItem.inputType) + #if($inputType == $MagicConstant.INPYT_TYPE_IMG_FILE() || $inputType == $MagicConstant.INPYT_TYPE_KINDEDITOR()||$inputType == $MagicConstant.INPYT_TYPE_DATE() || $inputType == $MagicConstant.INPYT_TYPE_SLIDER()||$inputType == $MagicConstant.INPYT_TYPE_RATE() || $inputType == $MagicConstant.INPYT_TYPE_COLOR_PICKER()||$inputType == $MagicConstant.INPYT_TYPE_CODE()) + #if($dou >0) + ,#else #end${node.dbField.javaField}:{ + renderConfig:{}//您可以自定义个性配置 遇到相同的则以dom配置为准 大部分属性已推荐设置在元素标签上 这里您可以自定义事件 $TableFieldUtil.jsonToOneLine($node.formItem.selectValue) + } + #set($dou = $dou + 1) + #end + #end + #end + }, + event:{ + select2Change:function (elem,name,value) {//外键下拉更新事件 + } + } + } + var tableNameRest = common_config.tableNameRest; + var moduleName = common_config.moduleName; + var obj = { + render:function () {//入口 + this.ajaxGetEntityDataAndAutoSetFormUiValue(); + this.submit(); + }, + //初始化表单 + ajaxGetEntityDataAndAutoSetFormUiValue : function () { + var _t = this; + var identify = mc_util.getParameter('identify')//从url中检测主键 + if(identify!=null && identify!=''){//断定是编辑操作 + $.getJSON('admin/'+tableNameRest+"/get/"+identify,{date:new Date().getTime()},function (data) {//获取此实体详情数据 + if(data.flag){ + var entity = data.data + if(entity && entity!=null){ + //把请求到的实体内容自动设置到表单中去 + mc_util.mappingEntityToFormUiValue($("body"),entity); + //禁用外键编辑区域:只有当从更多信息点击进来 才会禁用 单表操作不会执行 + mc_children.disabledFormParentArea(); + //权限 注意xxx-edit.html页面刚进来 是被隐藏的(body标签的layui-hide样式) 这样当权限执行完 才进行一一显示 + mc_rmp.paintBody(moduleName,function () { + var verifyData = mc_layui_component.bindMagicalCoderLayUiComponentFromDetail(common_config);//返回富文本的校验 为了能同步隐藏域 + _t.layuiFormVerify(verifyData); + }) + }else { + layer.msg("此条记录已被删除,请重新查询!"); + } + }else { + layer.msg("查询失败:"+data.desc); + } + }) + }else {//新增操作 + //禁用外键编辑区域:只有当从更多信息点击进来 才会禁用 单表操作不会执行 + mc_children.disabledFormParentArea(); + //权限 + mc_rmp.paintBody(moduleName,function () { + var verifyData =mc_layui_component.bindMagicalCoderLayUiComponentFromDetail(common_config);//返回富文本的校验 为了能同步隐藏域 + _t.layuiFormVerify(verifyData); + $("button[type='reset']").removeClass('layui-hide');//把重置按钮显示处理 + }) + } + }, + //layui的表单校验规则 + layuiFormVerify:function (verifyData) {//verifyData 里如果由内容则是富文本的校验同步 + var verifyData = + $.extend(verifyData,{//这里可以自定义layui的校验规则 自行扩展 参考官网文档 https://www.layui.com/doc/modules/form.html + + }) + form.verify(verifyData); + } + , + //表单提交 + submit : function () { + //重置按钮把外键的默认值清空 + $("button[type='reset']").click(function(){ + $("."+mc_constant.MC_LAY_CLASS_NAME.FORM.foreign_select2).val(null).trigger('change');//固定写法 把搜索下拉重置空值 + $("."+mc_constant.MC_LAY_CLASS_NAME.FORM.foreign_select2).each(function (id, item) { + $(this).attr("data-value","") + }); + return true; + }); + //表单校验 在_bindFormDom方法 + form.on("submit(save)",function(data){ + // 实际使用时的提交信息 + var postData = data.field; + //开关单独处理 + $('body').find("input[lay-skin='switch']").each(function (index,item) { + var name = $(item).attr("name") + var field = data.field + postData[name] = field[name] ? ((field[name]+''=='on' || field[name]+'' == 'true') ? 1 : 0):0;//开关请用0或1来设置值 + }) + //清理上次不通过样式提醒 + for(var name in postData){ + var dom = $("[name='"+name+"']") + mc_verify.clearDangerClass(dom) + } + //MagicalCoder扩展的表单校验 + for(var name in postData){ + var dom = $("[name='"+name+"']") + var value = postData[name] + if(!mc_verify.verify(value,dom)){ + return false; + } + } + //弹出loading + var index = top.layer.msg('数据提交中,请稍候',{icon: 16,time:false,shade:0.8}); + $.post('admin/'+tableNameRest+'/save',postData,function(res){ + top.layer.close(index); + if(res.flag){ + parent.layui.$(".search_btn").click()//parent代表父窗口,因为详情页是iframe弹出来的;让列表页重新执行一次搜索 + //关闭当前层 + var pidx = parent.layui.layer.index + parent.layui.layer.close(pidx-1); + }else { + top.layer.msg("保存失败:"+res.desc); + } + }) + return false; + }) + } + } + obj.render(); +}(); diff --git a/us_passManage/doc/vms/us_mysql/js/js-entity-list.vm b/us_passManage/doc/vms/us_mysql/js/js-entity-list.vm new file mode 100644 index 0000000..cf04f84 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/js/js-entity-list.vm @@ -0,0 +1,337 @@ +#parse("vms/$version/common/variable/head.vm") +##找出主键 +#parse("vms/$version/common/comment/ClassDesc.vm") +//不要被如此多的代码唬住,读懂一个 其他的模块都明白了,之所以写这么多开放出来,主要是为了定制和维护性,您可以随意修改逻辑 适应你的业务场景 +;!function(){ + var $ = layui.jquery + ,layer = parent.layer === undefined ? layui.layer : top.layer + ,table = layui.table; + var mc_children = us_all.mc_children + ,mc_constant = us_all.mc_constant + ,mc_util = us_all.mc_util + ,mc_rmp = us_all.mc_rmp + ,mc_layui_component = us_all.mc_layui_component + ; + +// 子表 排序相关 + var CONFIG = { + tableNameRest:"${tableRealName}_rest", + tableName:"${tableRealName}", + moduleName:"${tableRealName}",//sys_module的moduleName + form:{ + #set($sortedNodeList=$CreateVmUtil.sortFormItem($nodeList)) + #set($dou = 0) + #foreach($node in $sortedNodeList) + #if($StringUtil.isNotBlank($node.formItem.selectValue)) + #set($inputType = $node.formItem.inputType) + #if($inputType == $MagicConstant.INPYT_TYPE_IMG_FILE() || $inputType == $MagicConstant.INPYT_TYPE_KINDEDITOR()||$inputType == $MagicConstant.INPYT_TYPE_DATE() || $inputType == $MagicConstant.INPYT_TYPE_SLIDER()||$inputType == $MagicConstant.INPYT_TYPE_RATE() || $inputType == $MagicConstant.INPYT_TYPE_COLOR_PICKER()||$inputType == $MagicConstant.INPYT_TYPE_CODE()) + #if($dou >0) + ,#else #end${node.dbField.javaField}:{ + renderConfig:{}//您可以自定义个性配置 遇到相同的则以dom配置为准 大部分属性已推荐设置在元素标签上 这里您可以自定义事件 $TableFieldUtil.jsonToOneLine($node.formItem.selectValue) + } + #set($dou = $dou + 1) + #end + #end + #end + }, + event:{ + select2Change:function (elem,name,value) {//外键下拉更新事件 + } + }, +#if($childrenList) + childrenPage:[//子页面的一些基础信息 更多信息 + #foreach($child in $childrenList) + { + tabTitle:"$child.childDbTable.tableComment", + url:"admin/page_v2/$child.childDbTable.tableRealName/list", + mcForeignName:"$child.childNode.dbField.javaField" + }#if($velocityCount!=$childrenList.size()),#end + #end + ], +#end + layTable : {//表格内容 到list.html查找即可明白 + elem : '#newsList', + id : "newsListTable" + }, + //排序跟数据库实际字段名的映射 + sortMap:{ + #set($sortMap = '') + #foreach($node in $nodeList) + #if($node.viewTable) + #set($sortMap = "$sortMap${node.dbField.javaField}:'${node.dbField.dbRealName}',") + #end + #end + $StringUtil.deleteLastChar($sortMap) + } + }; + //后端请求时候的表模块规则url + var tableNameRest = CONFIG.tableNameRest; + var tableName = CONFIG.tableName; + //表格每一列配置 + var COLS = [[ + {type: "checkbox", /*fixed:"left",*/ width:50},//全选 + #parse("vms/$version/js/include/js-entity-list-table-template.vm") + {title: '操作', minWidth:250, templet:'#newsListOperateTemplate',/*fixed:"right",*/align:"center"}//操作 到list.html页面查找模板对应的html + ]]; + var obj = { + layTable:function () {//表格 + var tableObj = { + render:function () { + this.initTable(); + this.tableOperateEvent(); + }, + //初始化一个表格 + initTable : function () { + var _this = this; + table.render({//这里是layui的table分页写法 具体可参考layui官方文档 + elem: CONFIG.layTable.elem, + url : 'admin/'+tableNameRest+'/page', + cellMinWidth : 95, + page : true,//是否分页 + //height : "full-10",//高度样式 + // height : 500, + limit : 20,//每页多少条 + limits : [10,15,20,25],//下拉 + id : CONFIG.layTable.id, + cols : COLS,//放入列配置 + loading : true, + where : this.buildQueryFormParams(""),//构造查询参数 注意这里layui会缓存你的上一次查询参数 无法清除 只能考虑设置成空字符才能清理 + done:function (res,curr,count) {//请求成功后处理 + if(res.flag){ + mc_rmp.paintBody(CONFIG.moduleName,function () {//权限判断 + //禁用一些外键字段 当更多信息场景时才会触发 + mc_children.disabledTableParentArea(); + //laytable中有很多控件需要初始化 比如日期等 + mc_layui_component.bindMagicalCoderLayUiComponentFromTable(CONFIG,function(){_this.refreshTableFromCurrentPage()}) + //每一行的操作条目事件 + _this.tableOperateEvent() + }) + }else { + layer.msg(res.desc)//弹窗错误提示 + } + } + }); + }, + //表格内的操作事件 + tableOperateEvent : function () { + var _t = this; + var tableDom = $(CONFIG.layTable.elem); + var layFilter = tableDom.attr("lay-filter"); + //列表操作 + table.on('tool('+layFilter+')', function(obj){//操作条事件写法 参考layui + var primaryFields = tableDom.attr("data-primary-fields");//一般是表主键id 提前隐藏放在表区域 搜索list.html + var layEvent = obj.event, + data = obj.data; + var identify = data[primaryFields] + if(layEvent === 'edit'){ //编辑 + _t.editOrAdd(identify) + } else if(layEvent === 'del'){ //删除 + _t._deleteOneTr(identify) + } else if(layEvent === 'children'){ //子表 更多信息 + _t._childrenOneTr(identify) + } + }); + //列表排序 + table.on('sort('+layFilter+')', function(obj){ + var safeOrderBy = "";//排序字段组合 例如xxx_id desc + if(obj.type && obj.type!=null && obj.type!=''){ + safeOrderBy = CONFIG.sortMap[obj.field] + " " +obj.type; + } + _t.refreshTableFromCurrentPage(safeOrderBy);//从当前页重新加载分页数据 + }); + }, + //编辑或者添加 + editOrAdd : function (identify) {//identify 代表主键值 + var title = identify ? '编辑':'添加' + if(!identify){identify = ''} + var index = layui.layer.open({ + skin:'magicalcoder-layer-admin', + title : title, + type : 2,//打开iframe页面 很多人不知道原理:从列表页进入详情页是直接打开新iframe,详情页根据iframe的入参主键,获取详情页数据,然后重绘详情页,整个过程都是js处理 + maxmin: true, + area: ['80%', '80%'], + content : "admin/page_v2/"+tableName+"/edit?identify="+identify+mc_children.buildForeignParam(), + success : function(layero, index){ + setTimeout(function(){ + layui.layer.tips('点击此处返回列表', '.layui-layer-setwin .layui-layer-close', { + tips: 3 + }); + },500) + } + }) +## layui.layer.full(index); + //改变窗口大小时,重置弹窗的宽高,防止超出可视区域(如F12调出debug的操作) + //$(window).on("resize",function(){ + // layui.layer.full(index); + //}) + }, + _deleteOneTr : function (identify) {//删除一行 + var _this = this; + layer.confirm('确定删除此行记录?',{icon:3, title:'提示信息'},function(index){ + $.post('admin/'+tableNameRest+'/delete/'+identify,{},function (data) { + if(!data.flag){ + layer.msg("删除失败:"+data.desc); + }else { + _this.refreshTableFromCurrentPage();//从当前页刷新列表 + layer.close(index); + } + }) + }); + }, + _childrenOneTr : function (identify) {//更多信息:查看子表 + var title = '相关信息' + if(!identify){identify = ''} + if(!CONFIG.childrenPage || CONFIG.childrenPage==null || CONFIG.childrenPage.length<=0){ + layer.msg("未找到任何子表信息") + return; + } + var content = mc_children.buildTabTemplate(tableName,identify,CONFIG.childrenPage);//自表如果是多个 会绘制多个tab标签 + var index = layui.layer.open({skin:'magicalcoder-layer-admin',title : title,type : 1,maxmin: true,area: ['80%', '80%'],content : content, + success : function(layero, index){ + setTimeout(function(){ + layui.layer.tips('点击此处返回列表', '.layui-layer-setwin .layui-layer-close', { + tips: 3 + }); + },500) + } + }) + mc_children.tabClickEvent();//绑定下更多信息下tab点击事件 分别加载不同子表详情 列表界面 +## layui.layer.full(index); + //改变窗口大小时,重置弹窗的宽高,防止超出可视区域(如F12调出debug的操作) + //$(window).on("resize",function(){ + // layui.layer.full(index); + //}) + }, + refreshTableFromCurrentPage : function (safeOrderBy) {//当前页 重新加载 + var whereData = this.buildQueryFormParams(safeOrderBy) + this._startReloadTableFromStartPage(null,whereData) + }, + refreshTableFromPageOne : function () {//从第一页 重新加载 搜索场景使用 清空各种参数 + var whereData = this.buildQueryFormParams("") + this._startReloadTableFromStartPage(1,whereData) + }, + buildQueryFormParams : function (safeOrderBy) {//自动封装查询区域数据 + var _this = this; + var whereData = {} + var queryForm = $(".security_list_query_form")//参考list.html的表单区域样式名称 + //因为layui 的查询有记忆功能,会缓存老的查询条件,这里把重置的条件给清空 赋值null + var radioMemory = {} + queryForm.find(".layui-input").each(function (index,item) { + var type = $(item).attr("type") + var name = $(item).attr("name") + if(name){ + switch (type){ + case "radio" : + if(!radioMemory[name]){ + radioMemory[name] = false; + } + if($(item).is(":checked")){ + _this._autoSetWhereData(whereData,name,item); + radioMemory[name] = true; + } + break; + default : + _this._autoSetWhereData(whereData,name,item); + break; + } + } + }) + // + for(var radioName in radioMemory){ + if(!radioMemory[radioName]){//肯定被layui缓存的查询字段 这里设置""可以清理掉此字段 + whereData[radioName] = "" + } + } + whereData.safeOrderBy = safeOrderBy || "" + return whereData; + }, + _startReloadTableFromStartPage : function (startPage,whereData) { + var reloadTableId = CONFIG.layTable.id + if(startPage==null || !startPage) {//当前页 聪明的记住多少页 + table.reload(reloadTableId,{where: whereData }) + }else { + table.reload(reloadTableId,{ + page: { + curr: startPage //重新从第 几 页开始 + }, + where: whereData + }) + } + }, + _autoSetWhereData : function (whereData,name,item) {//name是表单元素名称 item是表单对象 + var val = $.trim($(item).val()) + whereData[name] = val + } + } + return tableObj; + }, + render:function () {//入口 + mc_children.disabledFromQueryParentArea();//尝试下先禁用附表区域 多半关联场景才会触发 + mc_layui_component.bindMagicalCoderLayUiComponentFromQuery(CONFIG);//查询区域绘制一下控件 + this.bindAreaEvents(); + this.layTable().render();//初始化表格数据 + }, + bindAreaEvents : function () { + var _t = this; + //搜索 + $(".search_btn").click(function(){ + _t.layTable().refreshTableFromPageOne(); + }); + //重置 + $("button[type='reset']").click(function(){ + $("."+mc_constant.MC_LAY_CLASS_NAME.FORM.foreign_select2).val(null).trigger('change'); + $("."+mc_constant.MC_LAY_CLASS_NAME.FORM.foreign_select2).each(function (id, item) { + $(this).attr("data-value","") + }); + return true; + }); + //添加 + $(".addNews_btn").click(function(){ + _t.layTable().editOrAdd(); + }) + //批量删除 + $(".delAll_btn").click(function(){ + var laytableElem = CONFIG.layTable.elem + var laytableId = CONFIG.layTable.id + //主键字段 + var primaryFields = $(laytableElem).attr("data-primary-fields") + var checkStatus = table.checkStatus(laytableId), + data = checkStatus.data, + ids = []; + if(data.length > 0) { + for (var i in data) { + ids.push(data[i][primaryFields]); + } + layer.confirm('确定删除选中的记录?', {icon: 3, title: '提示信息'}, function (index) { + $.post('admin/'+tableNameRest+'/batch_delete',{ids:ids},function (data) { + if(!data.flag){ + layer.msg("删除失败:"+data.desc); + }else { + _t.layTable().refreshTableFromCurrentPage(); + layer.close(index); + } + }) + }) + }else{ + layer.msg("请选择需要删除的记录"); + } + }) + //excel导出 + $(".exportExcelAll_btn").click(function(){ + var dataMaxExportCount = parseInt($(this).attr("data-max-export-count"))//导出多少行 在界面导出按钮的一个属性配置 如果导出太多就会卡死 + var whereData = _t.layTable().buildQueryFormParams("") + whereData.queryType = mc_constant.QUERY_TYPE_EXPORT_EXCEL;//代表是导出excel类型 参加controller实现 + whereData.page = 1; + whereData.limit = dataMaxExportCount; + var url = 'admin/'+tableNameRest+'/page?' + var arr = [] + for(var i in whereData){ + arr.push(i+"="+whereData[i]) + } + window.location.href=url + arr.join("&") + }); + } + } +//入口函数 + obj.render(); +}(); diff --git a/us_passManage/doc/vms/us_mysql/jsp/entity-edit.vm b/us_passManage/doc/vms/us_mysql/jsp/entity-edit.vm new file mode 100644 index 0000000..21688d5 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/jsp/entity-edit.vm @@ -0,0 +1,48 @@ +#parse("vms/$version/common/variable/head.vm") +#parse("vms/$version/common/comment/html-desc.vm") + + + + + + + +
            +
            +
            + +
            +
            +
            + #set($sortedNodeList=$CreateVmUtil.sortFormItem($nodeList)) + #foreach($node in $sortedNodeList) +
            + +
            + #if($node.dbField.dbPriorityKey) + #if($node.dbField.dbAutoIncrease) + + #else + + #end + #else + #parse("vms/$version/jsp/include/entity-edit-form.vm") + #end +
            +
            + #end +
            +
            + 立即提交 + +
            +
            +
            +
            +
            +
            + +
            + + + diff --git a/us_passManage/doc/vms/us_mysql/jsp/entity-list.vm b/us_passManage/doc/vms/us_mysql/jsp/entity-list.vm new file mode 100644 index 0000000..f37cf54 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/jsp/entity-list.vm @@ -0,0 +1,67 @@ +#parse("vms/$version/common/variable/head.vm") +#parse("vms/$version/common/comment/html-desc.vm") + + + + + + +
            +
            +
            +
            +
            查询条件
            +
            +
            +
            + #parse("vms/$version/jsp/include/entity-list-query.vm") + +
            +
            +
            +
            +
            +
            +
            +
            +
            + 添加 +
            + + +
            +
            +
            +
            +
            +
            +
            +
            +
            +
            + + ##模板编写 + #parse("vms/$version/jsp/include/entity-list-table-template.vm") + + +
            + + + diff --git a/us_passManage/doc/vms/us_mysql/jsp/include/entity-edit-form.vm b/us_passManage/doc/vms/us_mysql/jsp/include/entity-edit-form.vm new file mode 100644 index 0000000..ecd1e50 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/jsp/include/entity-edit-form.vm @@ -0,0 +1,31 @@ +#parse("vms/$version/common/variable/head.vm") +#set($inputType = $node.formItem.inputType) +#if($inputType == $MagicConstant.INPYT_TYPE_SELECT()) + #parse("vms/$version/jsp/include/input/select.vm") +#elseif($inputType == $MagicConstant.INPYT_TYPE_FOREIGN_SELECT()) + #parse("vms/$version/jsp/include/input/select2-foreign.vm") +#elseif($inputType == $MagicConstant.INPYT_TYPE_RADIO()) + #parse("vms/$version/jsp/include/input/radio.vm") +#elseif($inputType == $MagicConstant.INPYT_TYPE_SWITCH()) + #parse("vms/$version/jsp/include/input/switch.vm") +#elseif($inputType == $MagicConstant.INPYT_TYPE_TEXTAREA()) + #parse("vms/$version/jsp/include/input/textarea.vm") +#elseif($inputType == $MagicConstant.INPYT_TYPE_IMG_FILE()) + #parse("vms/$version/jsp/include/input/img-file.vm") +#elseif($inputType == $MagicConstant.INPYT_TYPE_KINDEDITOR()) + #parse("vms/$version/jsp/include/input/kindeditor.vm") +#elseif($inputType == $MagicConstant.INPYT_TYPE_DATE()) + #parse("vms/$version/jsp/include/input/date.vm") +#elseif($inputType == $MagicConstant.INPYT_TYPE_SLIDER()) + #parse("vms/$version/jsp/include/input/slider.vm") +#elseif($inputType == $MagicConstant.INPYT_TYPE_RATE()) + #parse("vms/$version/jsp/include/input/rate.vm") +#elseif($inputType == $MagicConstant.INPYT_TYPE_COLOR_PICKER()) + #parse("vms/$version/jsp/include/input/color-picker.vm") +#elseif($inputType == $MagicConstant.INPYT_TYPE_CODE()) + #parse("vms/$version/jsp/include/input/code.vm") +#elseif($inputType == $MagicConstant.INPYT_TYPE_PASSWORD()) + #parse("vms/$version/jsp/include/input/password.vm") +#else + #parse("vms/$version/jsp/include/input/text.vm") +#end diff --git a/us_passManage/doc/vms/us_mysql/jsp/include/entity-list-query.vm b/us_passManage/doc/vms/us_mysql/jsp/include/entity-list-query.vm new file mode 100644 index 0000000..bb6f647 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/jsp/include/entity-list-query.vm @@ -0,0 +1,25 @@ +#parse("vms/$version/common/variable/head.vm") +#set($formQueryNodeList=$CreateVmUtil.sortFormQuery($nodeList)) +#foreach($node in $formQueryNodeList) + #set($inputType = $node.formItem.inputType) + #if($node.formQueryList) + #foreach($formQuery in $node.formQueryList) + #if($formQuery.foreignQueryFieldNode)##老版本有外键查询 已废弃 + #else##无老版本外键查询 + #if($inputType == $MagicConstant.INPYT_TYPE_SELECT()) + #parse("vms/$version/jsp/include/query/select.vm") + #elseif($inputType == $MagicConstant.INPYT_TYPE_FOREIGN_SELECT()) + #parse("vms/$version/jsp/include/query/select2-foreign.vm") + #elseif($inputType == $MagicConstant.INPYT_TYPE_RADIO()) + #parse("vms/$version/jsp/include/query/radio.vm") + #elseif($inputType == $MagicConstant.INPYT_TYPE_SWITCH()) + #parse("vms/$version/jsp/include/query/switch.vm") + #elseif($inputType == $MagicConstant.INPYT_TYPE_DATE()) + #parse("vms/$version/jsp/include/query/date.vm") + #else + #parse("vms/$version/jsp/include/query/text.vm") + #end + #end + #end + #end +#end diff --git a/us_passManage/doc/vms/us_mysql/jsp/include/entity-list-table-template.vm b/us_passManage/doc/vms/us_mysql/jsp/include/entity-list-table-template.vm new file mode 100644 index 0000000..204a4b8 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/jsp/include/entity-list-table-template.vm @@ -0,0 +1,30 @@ +#parse("vms/$version/common/variable/head.vm") +#set($newNodeList=$CreateVmUtil.sortViewTable($nodeList)) +#foreach($node in $newNodeList) + #set($inputType = $node.formItem.inputType) + #if($node.viewTable) + #if($inputType == $MagicConstant.INPYT_TYPE_DATE()) + + #elseif($inputType == $MagicConstant.INPYT_TYPE_SELECT())##无外键 普通类型下拉 + #set($selectValueMap = $TableFieldUtil.parseJsonToMap($node.formItem.selectValue)) + + #end + #end +#end diff --git a/us_passManage/doc/vms/us_mysql/jsp/include/formvalidate/lay-verify.vm b/us_passManage/doc/vms/us_mysql/jsp/include/formvalidate/lay-verify.vm new file mode 100644 index 0000000..8de60d3 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/jsp/include/formvalidate/lay-verify.vm @@ -0,0 +1,15 @@ +##当前字段验证属性 +#set($fv = $node.formValidate) +#if($fv.required)|mc_required#end +#if($fv.mathNumber)|mc_number#end +#if($fv.digits)|mc_digits#end +#if($fv.email)|mc_email#end +#if($fv.url)|mc_url#end +#if($fv.variable)|mc_variable#end +#if($fv.chineseCharacter)|mc_chinese_character#end" magicalcoder-verify="#if($StringUtil.isNotBlank($fv.minValues))|minValues=$fv.minValues#end +#if($StringUtil.isNotBlank($fv.maxValues))|maxValues=$fv.maxValues#end +#if($fv.minLength)|minLength=$fv.minLength#end +#if($fv.maxLength && $fv.maxLength>0)|maxLength=$fv.maxLength#end +#if($StringUtil.isNotBlank($fv.definedOne))|definedOne=$fv.definedOne#end +#if($StringUtil.isNotBlank($fv.definedTwo))|definedTwo=$fv.definedTwo#end +#if($StringUtil.isNotBlank($fv.definedThree))|definedThree=$fv.definedThree#end diff --git a/us_passManage/doc/vms/us_mysql/jsp/include/input/code.vm b/us_passManage/doc/vms/us_mysql/jsp/include/input/code.vm new file mode 100644 index 0000000..9c8a3c8 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/jsp/include/input/code.vm @@ -0,0 +1,2 @@ + +
            
            diff --git a/us_passManage/doc/vms/us_mysql/jsp/include/input/color-picker.vm b/us_passManage/doc/vms/us_mysql/jsp/include/input/color-picker.vm
            new file mode 100644
            index 0000000..849b2da
            --- /dev/null
            +++ b/us_passManage/doc/vms/us_mysql/jsp/include/input/color-picker.vm
            @@ -0,0 +1,2 @@
            +                        
            +                        
            diff --git a/us_passManage/doc/vms/us_mysql/jsp/include/input/date.vm b/us_passManage/doc/vms/us_mysql/jsp/include/input/date.vm new file mode 100644 index 0000000..d7ffcc8 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/jsp/include/input/date.vm @@ -0,0 +1 @@ + diff --git a/us_passManage/doc/vms/us_mysql/jsp/include/input/img-file.vm b/us_passManage/doc/vms/us_mysql/jsp/include/input/img-file.vm new file mode 100644 index 0000000..ac34516 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/jsp/include/input/img-file.vm @@ -0,0 +1,7 @@ + + 上传文件或图片 + + +
            + +
            diff --git a/us_passManage/doc/vms/us_mysql/jsp/include/input/kindeditor.vm b/us_passManage/doc/vms/us_mysql/jsp/include/input/kindeditor.vm new file mode 100644 index 0000000..c61c0b1 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/jsp/include/input/kindeditor.vm @@ -0,0 +1 @@ + diff --git a/us_passManage/doc/vms/us_mysql/jsp/include/input/password.vm b/us_passManage/doc/vms/us_mysql/jsp/include/input/password.vm new file mode 100644 index 0000000..37f0e4d --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/jsp/include/input/password.vm @@ -0,0 +1 @@ + diff --git a/us_passManage/doc/vms/us_mysql/jsp/include/input/radio.vm b/us_passManage/doc/vms/us_mysql/jsp/include/input/radio.vm new file mode 100644 index 0000000..bc9a947 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/jsp/include/input/radio.vm @@ -0,0 +1,9 @@ +#set($selectValueMap = $TableFieldUtil.parseJsonToMap($node.formItem.selectValue)) +#if($selectValueMap.get('inputType') == 'radio') + #set($keyValueList = $selectValueMap.get('keyValueList')) + #if($keyValueList ) + #foreach($sv in $keyValueList) + + #end + #end +#end diff --git a/us_passManage/doc/vms/us_mysql/jsp/include/input/rate.vm b/us_passManage/doc/vms/us_mysql/jsp/include/input/rate.vm new file mode 100644 index 0000000..2747497 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/jsp/include/input/rate.vm @@ -0,0 +1,2 @@ + +
            diff --git a/us_passManage/doc/vms/us_mysql/jsp/include/input/select.vm b/us_passManage/doc/vms/us_mysql/jsp/include/input/select.vm new file mode 100644 index 0000000..9e97e2c --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/jsp/include/input/select.vm @@ -0,0 +1,12 @@ +##普通固定类型下拉 +#set($selectValueMap = $TableFieldUtil.parseJsonToMap($node.formItem.selectValue)) + diff --git a/us_passManage/doc/vms/us_mysql/jsp/include/input/select2-foreign.vm b/us_passManage/doc/vms/us_mysql/jsp/include/input/select2-foreign.vm new file mode 100644 index 0000000..d036da1 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/jsp/include/input/select2-foreign.vm @@ -0,0 +1,19 @@ +##外键搜索输入框下拉 +#set($dataTextFields="") +#set($isFirst=true)##设置个开关 +#set($foreignNodeList = $RemoteApiUtil.getNodeList($node.dbField.foreignVmDbFieldNode.dbTable.id)) +#foreach($foreignNode in $foreignNodeList) + #if($foreignNode.formQueryList) + #foreach($formQuery in $foreignNode.formQueryList) + #if($formQuery.foreignInputSelectShow==1) + #if($isFirst) + #set($dataTextFields="$foreignNode.dbField.javaField") + #set($isFirst=false) + #else + #set($dataTextFields="$dataTextFields,$foreignNode.dbField.javaField") + #end + #end + #end + #end +#end + diff --git a/us_passManage/doc/vms/us_mysql/jsp/include/input/slider.vm b/us_passManage/doc/vms/us_mysql/jsp/include/input/slider.vm new file mode 100644 index 0000000..5bed6ce --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/jsp/include/input/slider.vm @@ -0,0 +1,2 @@ + +
            diff --git a/us_passManage/doc/vms/us_mysql/jsp/include/input/switch.vm b/us_passManage/doc/vms/us_mysql/jsp/include/input/switch.vm new file mode 100644 index 0000000..879fbec --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/jsp/include/input/switch.vm @@ -0,0 +1,23 @@ +#set($layText="") +#set($isFirst=true)##设置个开关 +#set($selectValueMap = $TableFieldUtil.parseJsonToMap($node.formItem.selectValue)) +#if($selectValueMap.get('inputType') == 'switch') + #set($keyValueList = $selectValueMap.get('keyValueList')) + #if($keyValueList ) + #foreach($sv in $keyValueList) + #if($sv.key != "") + #if($isFirst) + #set($isFirst=false) + #set($layText="$sv.value") + #else + #if($sv.key) + #set($layText="$sv.value|$layText") + #else + #set($layText="$layText|$sv.value") + #end + #end + #end + #end + #end +#end + diff --git a/us_passManage/doc/vms/us_mysql/jsp/include/input/text.vm b/us_passManage/doc/vms/us_mysql/jsp/include/input/text.vm new file mode 100644 index 0000000..b882dd1 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/jsp/include/input/text.vm @@ -0,0 +1 @@ + diff --git a/us_passManage/doc/vms/us_mysql/jsp/include/input/textarea.vm b/us_passManage/doc/vms/us_mysql/jsp/include/input/textarea.vm new file mode 100644 index 0000000..334683d --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/jsp/include/input/textarea.vm @@ -0,0 +1 @@ + diff --git a/us_passManage/doc/vms/us_mysql/jsp/include/query/date.vm b/us_passManage/doc/vms/us_mysql/jsp/include/query/date.vm new file mode 100644 index 0000000..92ac677 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/jsp/include/query/date.vm @@ -0,0 +1,12 @@ +##本身日期查询 +#if($StringUtil.isNotBlank($formQuery.firstCompare)) +
            + +
            +#end +#if($StringUtil.isNotBlank($formQuery.secondCompare)) +
            -
            +
            + +
            +#end diff --git a/us_passManage/doc/vms/us_mysql/jsp/include/query/radio.vm b/us_passManage/doc/vms/us_mysql/jsp/include/query/radio.vm new file mode 100644 index 0000000..3d7fc33 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/jsp/include/query/radio.vm @@ -0,0 +1,29 @@ +#set($selectValueMap = $TableFieldUtil.parseJsonToMap($node.formItem.selectValue)) +#if($StringUtil.isNotBlank($formQuery.firstCompare)) +
            +
            $node.formItem.title
            +
            + #if($selectValueMap.get('inputType') == 'radio') + #set($keyValueList = $selectValueMap.get('keyValueList')) + #if($keyValueList ) + #foreach($sv in $keyValueList) + + #end + #end + #end +
            +
            +#end +#if($StringUtil.isNotBlank($formQuery.secondCompare)) +
            -
            +
            + #if($selectValueMap.get('inputType') == 'radio') + #set($keyValueList = $selectValueMap.get('keyValueList')) + #if($keyValueList ) + #foreach($sv in $keyValueList) + + #end + #end + #end +
            +#end diff --git a/us_passManage/doc/vms/us_mysql/jsp/include/query/select.vm b/us_passManage/doc/vms/us_mysql/jsp/include/query/select.vm new file mode 100644 index 0000000..c70c9b3 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/jsp/include/query/select.vm @@ -0,0 +1,30 @@ +#set($selectValueMap = $TableFieldUtil.parseJsonToMap($node.formItem.selectValue)) +#if($StringUtil.isNotBlank($formQuery.firstCompare)) +
            + +
            +#end +#if($StringUtil.isNotBlank($formQuery.secondCompare)) +
            -
            +
            + +
            +#end diff --git a/us_passManage/doc/vms/us_mysql/jsp/include/query/select2-foreign.vm b/us_passManage/doc/vms/us_mysql/jsp/include/query/select2-foreign.vm new file mode 100644 index 0000000..745c2b1 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/jsp/include/query/select2-foreign.vm @@ -0,0 +1,29 @@ +##外键搜索输入框下拉 +#set($dataTextFields="") +#set($isFirst=true)##设置个开关 +#set($foreignNodeList = $RemoteApiUtil.getNodeList($node.dbField.foreignVmDbFieldNode.dbTable.id)) +#foreach($foreignNode in $foreignNodeList) + #if($foreignNode.formQueryList) + #foreach($formQuery in $foreignNode.formQueryList) + #if($formQuery.foreignInputSelectShow==1) + #if($isFirst) + #set($dataTextFields="$foreignNode.dbField.javaField") + #set($isFirst=false) + #else + #set($dataTextFields="$dataTextFields,$foreignNode.dbField.javaField") + #end + #end + #end + #end +#end +#if($StringUtil.isNotBlank($formQuery.firstCompare)) +
            + +
            +#end +#if($StringUtil.isNotBlank($formQuery.secondCompare)) +
            -
            +
            + +
            +#end diff --git a/us_passManage/doc/vms/us_mysql/jsp/include/query/switch.vm b/us_passManage/doc/vms/us_mysql/jsp/include/query/switch.vm new file mode 100644 index 0000000..087e135 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/jsp/include/query/switch.vm @@ -0,0 +1,29 @@ +#set($selectValueMap = $TableFieldUtil.parseJsonToMap($node.formItem.selectValue)) +#if($StringUtil.isNotBlank($formQuery.firstCompare)) +
            +
            $node.formItem.title
            +
            + #if($selectValueMap.get('inputType') == 'switch') + #set($keyValueList = $selectValueMap.get('keyValueList')) + #if($keyValueList ) + #foreach($sv in $keyValueList) + + #end + #end + #end +
            +
            +#end +#if($StringUtil.isNotBlank($formQuery.secondCompare)) +
            -
            +
            + #if($selectValueMap.get('inputType') == 'switch') + #set($keyValueList = $selectValueMap.get('keyValueList')) + #if($keyValueList ) + #foreach($sv in $keyValueList) + + #end + #end + #end +
            +#end diff --git a/us_passManage/doc/vms/us_mysql/jsp/include/query/text.vm b/us_passManage/doc/vms/us_mysql/jsp/include/query/text.vm new file mode 100644 index 0000000..138b56d --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/jsp/include/query/text.vm @@ -0,0 +1,11 @@ +#if($StringUtil.isNotBlank($formQuery.firstCompare)) +
            + +
            +#end +#if($StringUtil.isNotBlank($formQuery.secondCompare)) +
            -
            +
            + +
            +#end diff --git a/us_passManage/doc/vms/us_mysql/jsp/magicaldrag-init-page.vm b/us_passManage/doc/vms/us_mysql/jsp/magicaldrag-init-page.vm new file mode 100644 index 0000000..200ba31 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/jsp/magicaldrag-init-page.vm @@ -0,0 +1,14 @@ +#parse("vms/$version/common/variable/head.vm") +#parse("vms/$version/common/comment/html-desc.vm") +##此文件是生成器创建新文件时,默认初始化此内容 此模板位置 配置在applicaton.properties中 + + + + + + + + +
            + + diff --git a/us_passManage/doc/vms/us_mysql/mapper/Mapper.vm b/us_passManage/doc/vms/us_mysql/mapper/Mapper.vm new file mode 100644 index 0000000..804bbbe --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/mapper/Mapper.vm @@ -0,0 +1,18 @@ +#parse("vms/$version/common/variable/head.vm") +package ${companyName}.${projectName}.service.${lowerEntity}.mapper; + +import ${companyName}.${projectName}.core.service.ICommonMapper; +import ${companyName}.${projectName}.model.${Entity}; +import java.util.List; +import java.util.Map; +#if($hasDateQuery) +import java.util.Date; +import java.sql.Time; +import java.sql.Timestamp; +#end +import java.math.*; +#parse("vms/$version/common/comment/ClassDesc.vm") + +public interface ${Entity}Mapper extends ICommonMapper<${Entity},${dbPriorityKeyJavaType}>{ + +} diff --git a/us_passManage/doc/vms/us_mysql/model/Model.vm b/us_passManage/doc/vms/us_mysql/model/Model.vm new file mode 100644 index 0000000..adc1ef4 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/model/Model.vm @@ -0,0 +1,35 @@ +#parse("vms/$version/common/variable/head.vm") +package ${companyName}.${projectName}.model; + +import org.springframework.format.annotation.DateTimeFormat; +import com.fasterxml.jackson.annotation.JsonFormat; +#if($hasDateQuery) +import java.util.Date; +import java.sql.Time; +import java.sql.Timestamp; +#end +import java.math.*; +import java.io.Serializable; +import lombok.Data; +#parse("vms/$version/common/comment/ClassDesc.vm") +@Data +public class ${Entity} implements Serializable{ + +#foreach($node in $nodeList) + #if($node.dbField.javaType == 'Date' || $node.dbField.javaType == 'Time' || $node.dbField.javaType == 'Timestamp') + @DateTimeFormat( pattern = "yyyy-MM-dd HH:mm:ss" ) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8") + #end + private $node.dbField.javaType $node.dbField.javaField;//$node.dbField.dbComment + #end + + #foreach($node in $nodeList) + + public $node.dbField.javaType ${node.dbField.javaGetName}(){ + return $node.dbField.javaField; + } + public void ${node.dbField.javaSetName}(${node.dbField.javaType} ${node.dbField.javaField}){ + this.$node.dbField.javaField = $node.dbField.javaField; + } + #end +} diff --git a/us_passManage/doc/vms/us_mysql/readme.txt b/us_passManage/doc/vms/us_mysql/readme.txt new file mode 100644 index 0000000..3a2ee94 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/readme.txt @@ -0,0 +1 @@ +这个是us的魔板,在这里您可学习到各种魔板写法知识 diff --git a/us_passManage/doc/vms/us_mysql/service/Service.vm b/us_passManage/doc/vms/us_mysql/service/Service.vm new file mode 100644 index 0000000..e76d1c2 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/service/Service.vm @@ -0,0 +1,19 @@ +#parse("vms/$version/common/variable/head.vm") +package ${companyName}.${projectName}.service.${lowerEntity}.service; + +import ${companyName}.${projectName}.core.service.ICommonService; +import ${companyName}.${projectName}.model.${Entity}; +import java.util.List; +import java.util.Map; +#if($hasDateQuery) +import java.util.Date; +import java.sql.Time; +import java.sql.Timestamp; +#end +import java.math.*; +#parse("vms/$version/common/comment/ClassDesc.vm") + +public interface ${Entity}Service extends ICommonService<${Entity},${dbPriorityKeyJavaType}>{ + + +} diff --git a/us_passManage/doc/vms/us_mysql/service/ServiceImpl.vm b/us_passManage/doc/vms/us_mysql/service/ServiceImpl.vm new file mode 100644 index 0000000..c2cac57 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/service/ServiceImpl.vm @@ -0,0 +1,36 @@ +#parse("vms/$version/common/variable/head.vm") +package ${companyName}.${projectName}.service.${lowerEntity}.service.impl; + +import ${companyName}.${projectName}.service.${lowerEntity}.mapper.${Entity}Mapper; +import ${companyName}.${projectName}.service.${lowerEntity}.service.${Entity}Service; +import ${companyName}.${projectName}.model.${Entity}; +import ${companyName}.${projectName}.core.service.CommonServiceImpl; +import ${companyName}.${projectName}.core.utils.StringUtil; + +import org.springframework.transaction.annotation.Transactional; +import org.springframework.stereotype.Service; +import ${companyName}.${projectName}.core.utils.CopyUtil; +import org.springframework.beans.factory.InitializingBean; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +#if($hasDateQuery) +import java.util.Date; +import java.sql.Time; +import java.sql.Timestamp; +#end +import java.math.*; +#parse("vms/$version/common/comment/ClassDesc.vm") + +@Service +public class ${Entity}ServiceImpl extends CommonServiceImpl<${Entity},${dbPriorityKeyJavaType}> implements ${Entity}Service,InitializingBean{ + @Resource + private ${Entity}Mapper ${entity}Mapper; + + @Override + public void afterPropertiesSet() { + super.commonMapper = ${entity}Mapper; + } +} diff --git a/us_passManage/doc/vms/us_mysql/sql/SqlMapper.vm b/us_passManage/doc/vms/us_mysql/sql/SqlMapper.vm new file mode 100644 index 0000000..5369739 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/sql/SqlMapper.vm @@ -0,0 +1,322 @@ + + +#parse("vms/$version/common/variable/head.vm") +#parse("vms/$version/common/comment/XmlDesc.vm") +#set($Y='`') + + + #* 不用标签 有利于保护代码 避免因null导致清库 获取全量更新 *# + + ##id必须在最前面 否则编译不通过 +#foreach( $node in $nodeList) + #if($node.dbField.dbPriorityKey) + + #end +#end + ##result必须在id后面 +#foreach( $node in $nodeList) + #if(!$node.dbField.dbPriorityKey) + + #end +#end + + + + + + + + + + + + + + insert into () values() + + + + replace into () values() + + + + insert into () values() + + + + replace into () values() + + + + + insert into () values () + + + + + + replace into () values () + + + + + insert into () values () + + + + + replace into () values () + + + + + + -- truncate table + + + + + delete from + + + + delete from where 1=1 + + +#if($hasDbPriorityKey) + + + delete from where ${Y}$dbPriorityKeySqlField${Y} in #{id} + +#end + + + update + + + + update + + + + + update + + + + + update + + + + + + #foreach( $node in $nodeList) + #parse("vms/$version/common/util/douHao.vm") + ${Y}$node.dbField.dbRealName${Y}#if($douHao),#end + #end + + + + + #foreach( $node in $nodeList) + #parse("vms/$version/common/util/douHao.vm") + ${Y}$node.dbField.dbRealName${Y}#if($douHao),#end + #end + + + #*单表sql mysql十分强大 如果主键null 它会自动使用自增 *# + + + #foreach($node in $nodeList) + #if($node.dbField.dbPriorityKey) ${Y}$node.dbField.dbRealName${Y}, #else${Y}$node.dbField.dbRealName${Y},#end + #end + + + + + + #foreach( $node in $nodeList) + #{$node.dbField.javaField#if($CreateVmUtil.isTimestemp($node.dbField.javaType)),jdbcType=TIMESTAMP#end},#if(!$node.dbField.dbPriorityKey)NULL,#end + #end + + + + + + #foreach($node in $nodeList) + ${Y}$node.dbField.dbRealName${Y}, + #end + + + + + + #foreach( $node in $nodeList) + #{$node.dbField.javaField#if($CreateVmUtil.isTimestemp($node.dbField.javaType)),jdbcType=TIMESTAMP#end}, + #end + + + #*批量sql 暂时无法得知主键策略 先按数据库自增处理 *# + + + #foreach($node in $nodeList) + #if($node.dbField.dbPriorityKey) ${Y}$node.dbField.dbRealName${Y}, #else${Y}$node.dbField.dbRealName${Y},#end + #end + + + + + + #foreach( $node in $nodeList) + #{item.$node.dbField.javaField#if($CreateVmUtil.isTimestemp($node.dbField.javaType)),jdbcType=TIMESTAMP#end},#if(!$node.dbField.dbPriorityKey)NULL,#end + #end + + + + + #foreach($node in $nodeList) + ${Y}$node.dbField.dbRealName${Y}, + #end + + + + + + #foreach( $node in $nodeList) + #{item.$node.dbField.javaField#if($CreateVmUtil.isTimestemp($node.dbField.javaType)),jdbcType=TIMESTAMP#end}, + #end + + + + + #foreach( $node in $nodeList) + #if(!$node.dbField.dbPriorityKey) + ${Y}${node.dbField.dbRealName}${Y}=#{$node.dbField.javaField#if($CreateVmUtil.isTimestemp($node.dbField.javaType)),jdbcType=TIMESTAMP#end} ${Y}${node.dbField.dbRealName}${Y}=NULL , + #end + #end + + + + + #foreach( $node in $nodeList) + #if(!$node.dbField.dbPriorityKey) + ${Y}${node.dbField.dbRealName}${Y}=#{$node.dbField.javaField#if($CreateVmUtil.isTimestemp($node.dbField.javaType)),jdbcType=TIMESTAMP#end}, + #end + #end + + + + where 1=1 + ##普通查询属性 + #if($hasDbPriorityKey) + and ${Y}$dbPriorityKeySqlField${Y} = #{magicalCoderPrimaryKeyName} + #elseif($hasDbUniqueNodes) + #foreach($uniqueNode in $dbUniqueNodes) + and ${Y}$uniqueNode.dbField.dbRealName${Y} = #{magicalCoderPrimaryKeyName} + #end + #end + + + where 1=1 + #if($hasDbPriorityKey) + and ${Y}$dbPriorityKeySqlField${Y} = #{$dbPriorityKeyJavaField} + #elseif($hasDbUniqueNodes) + #foreach($uniqueNode in $dbUniqueNodes) + and ${Y}$uniqueNode.dbField.dbRealName${Y} = #{$uniqueNode.dbField.javaField} + #end + #end + + + + #foreach( $node in $nodeList) + #if(!$node.dbField.dbPriorityKey) + ${Y}${node.dbField.dbRealName}${Y}=#{item.$node.dbField.javaField#if($CreateVmUtil.isTimestemp($node.dbField.javaType)),jdbcType=TIMESTAMP#end} ${Y}${node.dbField.dbRealName}${Y}=NULL , + #end + #end + + + + + #foreach( $node in $nodeList) + #if(!$node.dbField.dbPriorityKey) + ${Y}${node.dbField.dbRealName}${Y}=#{item.$node.dbField.javaField#if($CreateVmUtil.isTimestemp($node.dbField.javaType)),jdbcType=TIMESTAMP#end}, + #end + #end + + + + where 1=1 + #if($hasDbPriorityKey) + and ${Y}$dbPriorityKeySqlField${Y} = #{item.$dbPriorityKeyJavaField} + #elseif($hasDbUniqueNodes) + #foreach($uniqueNode in $dbUniqueNodes) + and ${Y}$uniqueNode.dbField.dbRealName${Y} = #{item.$uniqueNode.dbField.javaField} + #end + #end + + + + ${databaseRealName}.${tableRealName} + + + +##普通查询属性 +#foreach( $node in $nodeList) + #if($CreateVmUtil.isTimestemp($node.dbField.javaType)) + and ${Y}$node.dbField.dbRealName${Y} = #{$node.dbField.javaField,jdbcType=TIMESTAMP} + #else + and ${Y}$node.dbField.dbRealName${Y} = #{$node.dbField.javaField} + #end +#end + #parse("vms/$version/sql/include/query/where.vm") + + + + + + group by + + #foreach( $node in $nodeList) + ${Y}$node.dbField.dbRealName${Y} + #end + + + + + + + #foreach( $node in $nodeList) + order by ${Y}$node.dbField.dbRealName${Y} desc + order by ${Y}$node.dbField.dbRealName${Y} asc + #end + + + + + + + group by ${notSafeGroupBy} + + order by ${notSafeOrderBy} + LIMIT #{start},#{limit} + + + diff --git a/us_passManage/doc/vms/us_mysql/sql/include/query/where.vm b/us_passManage/doc/vms/us_mysql/sql/include/query/where.vm new file mode 100644 index 0000000..76c3b03 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/sql/include/query/where.vm @@ -0,0 +1,48 @@ +##根据form_query配置的查询entity表 +#foreach($node in $nodeList) + #set($inputType = $node.formItem.inputType) + #if($node.formQueryList) + #foreach($formQuery in $node.formQueryList) + #if(!$formQuery.foreignQueryFieldNode)##外键不加人查询 单独放到relate + #if($StringUtil.isNotBlank($formQuery.firstCompare)) + and ${Y}$node.dbField.dbRealName${Y} + #if($CreateVmUtil.isTimestemp($node.dbField.javaType)) + $jing{${node.dbField.javaField}First,jdbcType=TIMESTAMP} + #else + #if($formQuery.firstCompare == 'like') + concat('%',#{${node.dbField.javaField}First},'%') + #elseif($formQuery.firstCompare == 'in') + #if($inputType == $MagicConstant.INPYT_TYPE_SELECT()) + #{item} + #else + (#{${node.dbField.javaField}First}) + #end + #else + $jing{${node.dbField.javaField}First} + #end + #end + + #end + #if($StringUtil.isNotBlank($formQuery.secondCompare)) + and ${Y}$node.dbField.dbRealName${Y} + #if($CreateVmUtil.isTimestemp($node.dbField.javaType)) + $jing{${node.dbField.javaField}Second,jdbcType=TIMESTAMP} + #else + #if($formQuery.secondCompare == 'like') + concat('%',#{${node.dbField.javaField}Second},'%') + #elseif($formQuery.secondCompare == 'in') + #if($inputType == $MagicConstant.INPYT_TYPE_SELECT()) + #{item} + #else + (#{${node.dbField.javaField}Second}) + #end + #else + $jing{${node.dbField.javaField}Second} + #end + #end + + #end + #end + #end + #end +#end diff --git a/us_passManage/doc/vms/us_mysql/util/Util.vm b/us_passManage/doc/vms/us_mysql/util/Util.vm new file mode 100644 index 0000000..7758a99 --- /dev/null +++ b/us_passManage/doc/vms/us_mysql/util/Util.vm @@ -0,0 +1,7 @@ +#parse("vms/$version/common/variable/head.vm") +package ${companyName}.${projectName}.service.${lowerEntity}.util; +#parse("vms/$version/common/comment/ClassDesc.vm") + +public class ${Entity}Util { + +} diff --git a/us_passManage/linux-clean.sh b/us_passManage/linux-clean.sh new file mode 100644 index 0000000..e036adb --- /dev/null +++ b/us_passManage/linux-clean.sh @@ -0,0 +1,8 @@ +echo 'mac please make sure you have installed jdk1.8' +#export JAVA_HOME=../../jdk/jdk1.8.0_45 + +export M2_HOME=./../apache-maven-3.3.9 +chmod -R 755 $M2_HOME/bin +#export PATH=$PATH:%M2_HOME%/bin + +sh $M2_HOME/bin/mvn clean diff --git a/us_passManage/linux-start.sh b/us_passManage/linux-start.sh new file mode 100644 index 0000000..4d079c6 --- /dev/null +++ b/us_passManage/linux-start.sh @@ -0,0 +1,7 @@ +echo 'mac please make sure you have installed jdk1.8' +echo 'mac please make sure you have installed redis' +#export JAVA_HOME=../../jdk/jdk1.8.0_45 +#export PATH=%JAVA_HOME%/bin;%M2_HOME%/bin; + + +sh linux-us-package.sh diff --git a/us_passManage/linux-stop.sh b/us_passManage/linux-stop.sh new file mode 100644 index 0000000..6ee8966 --- /dev/null +++ b/us_passManage/linux-stop.sh @@ -0,0 +1 @@ +lsof -t -i :18080 |xargs kill -9 diff --git a/us_passManage/linux-us-package.sh b/us_passManage/linux-us-package.sh new file mode 100644 index 0000000..3c3a629 --- /dev/null +++ b/us_passManage/linux-us-package.sh @@ -0,0 +1,8 @@ +echo 'mac please make sure you have installed jdk1.8' +#export JAVA_HOME=../../jdk/jdk1.8.0_45 + +export M2_HOME=./../apache-maven-3.3.9 +chmod -R 755 $M2_HOME/bin +#export PATH=$PATH:%M2_HOME%/bin + +sh $M2_HOME/bin/mvn -Pus-admin test diff --git a/us_passManage/pom.xml b/us_passManage/pom.xml new file mode 100644 index 0000000..70b9543 --- /dev/null +++ b/us_passManage/pom.xml @@ -0,0 +1,394 @@ + + 4.0.0 + com.passManage + us + 0.0.1-SNAPSHOT + pom + + + us-core + + us-service + + + us-web + us-web-service + + + us-admin + + us-admin-service + + us-admin-rmp + + + + + + nexus-aliyun + nexus-aliyun Repository + http://maven.aliyun.com/nexus/content/groups/public/ + + true + + + true + + + + + magicalcoder + special Repository + http://www.magicalcoder.com/maven2/ + + true + + + true + + + + + + nexus-aliyun + nexus-aliyun Repository + http://maven.aliyun.com/nexus/content/groups/public/ + + true + + + true + + + + + + 1.8 + UTF-8 + UTF-8 + UTF-8 + + Dalston.SR2 + 1.3.2 + + 8.0.12 + 9.4.1212.jre7 + 4.2 + 12.1.0.2 + 1.1.9 + 2.1.3.RELEASE + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + 2.3.2 + + ${java.version} + ${java.version} + ${java.encoding} + + + + + org.apache.maven.plugins + maven-resources-plugin + 2.6 + + ${encoding} + + + + + org.springframework.boot + spring-boot-maven-plugin + ${springboot} + + + true + + + + + org.apache.maven.plugins + maven-surefire-plugin + + true + + + + + + + + + org.springframework.boot + spring-boot-dependencies + ${springboot} + pom + import + + + org.springframework.boot + spring-boot-starter-test + ${springboot} + test + + + + org.springframework.boot + spring-boot-starter-thymeleaf + ${springboot} + + + org.springframework.boot + spring-boot-starter-aop + ${springboot} + + + org.springframework.boot + spring-boot-starter-web + ${springboot} + + + org.springframework.boot + spring-boot-configuration-processor + ${springboot} + true + + + org.springframework.boot + spring-boot-devtools + ${springboot} + true + + + + org.springframework.boot + spring-boot-starter-data-redis + ${springboot} + + + + org.mybatis.spring.boot + mybatis-spring-boot-starter + ${mybatis-spring-boot} + + + + com.alibaba + fastjson + 1.2.29 + + + + + + org.projectlombok + lombok + 1.16.10 + + + + mysql + mysql-connector-java + ${mysql-connector} + + + org.postgresql + postgresql + ${postgresql} + + + com.microsoft.sqlserver + sqljdbc4 + ${sqlserver} + + + com.oracle + ojdbc6 + ${oracle} + + + + com.alibaba + druid + ${druid} + + + org.apache.commons + commons-io + 1.3.2 + + + org.apache.commons + commons-pool2 + 2.5.0 + + + + commons-io + commons-io + 2.4 + + + commons-lang + commons-lang + 2.6 + + + javax.servlet.jsp + jsp-api + 2.2 + + + + com.dyuproject.protostuff + protostuff-core + 1.0.8 + + + com.dyuproject.protostuff + protostuff-runtime + 1.0.8 + + + + org.objenesis + objenesis + 2.1 + + + + com.squareup.okhttp3 + okhttp + 3.12.1 + + + com.squareup.okio + okio + 1.14.0 + + + junit + junit + 4.12 + test + + + + org.apache.poi + poi + 3.9 + + + org.apache.poi + poi-ooxml + 3.9 + + + xml-apis + xml-apis + + + + + org.apache.poi + poi-ooxml-schemas + 3.9 + + + org.apache.poi + poi-excelant + 3.9 + + + org.apache.poi + poi-scratchpad + 3.9 + + + + org.jsoup + jsoup + 1.8.3 + + + + redis.clients + jedis + 2.9.1 + + + + org.springframework + spring-test + 4.3.14.RELEASE + test + + + org.thymeleaf.extras + thymeleaf-extras-springsecurity4 + 2.1.2.RELEASE + + + + ch.qos.logback + logback-classic + 1.2.3 + + + org.slf4j + slf4j-log4j12 + 1.7.1 + + + log4j + log4j + 1.2.17 + + + jmxtools + com.sun.jdmk + + + jmxri + com.sun.jmx + + + jms + javax.jms + + + mail + javax.mail + + + + + + com.yahoo.platform.yui + yuicompressor + 2.4.7 + + + + com.aliyun.oss + aliyun-sdk-oss + 2.8.3 + + + + diff --git a/us_passManage/redis.bat b/us_passManage/redis.bat new file mode 100644 index 0000000..26eda22 --- /dev/null +++ b/us_passManage/redis.bat @@ -0,0 +1,14 @@ +@echo off + +:again +set ip=127.0.0.1 +set port=6379 +netstat -ano|findstr %ip%:%port%|findstr -i ESTABLISHED +if ERRORLEVEL 1 (goto err) else (goto ok) + +:err +tasklist|findstr -i "redis-server.exe" +if ERRORLEVEL 1 (start "" "%CD%\..\redis\redis_start.vbs") + +:ok +echo Redis Services is running %Date:~0,4%-%Date:~5,2%-%Date:~8,2% %Time:~0,2%:%Time:~3,2% diff --git a/us_passManage/us-admin-rmp/pom.xml b/us_passManage/us-admin-rmp/pom.xml new file mode 100644 index 0000000..f21140b --- /dev/null +++ b/us_passManage/us-admin-rmp/pom.xml @@ -0,0 +1,23 @@ + + 4.0.0 + + com.passManage + us + 0.0.1-SNAPSHOT + + us-admin-rmp + us-admin-rmp + + + + com.passManage + us-core + 0.0.1-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-security + + + + diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/common/AddLoginInfoToAuth.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/common/AddLoginInfoToAuth.java new file mode 100644 index 0000000..ce9861d --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/common/AddLoginInfoToAuth.java @@ -0,0 +1,48 @@ +package com.passManage.us.admin.rmp.common; + +import com.passManage.us.admin.rmp.dto.SysAdminUserDto; +import com.passManage.us.admin.rmp.service.SecurityUserDetailService; +import com.passManage.us.core.utils.StringUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * author:www.magicalcoder.com + * date:2018/7/18 + * function:主动添加登陆信息 + */ +@Component +public class AddLoginInfoToAuth { + @Resource + private SecurityUserDetailService securityUserDetailService; + @Autowired + private AuthenticationManager authenticationManager; + + public void login(String username){ + if(StringUtil.isBlank(username) ){ + throw new BadCredentialsException("用户名不能为空"); + } + SysAdminUserDto sysAdminUserDto = (SysAdminUserDto)securityUserDetailService.loadUserByUsername(username); + if(sysAdminUserDto == null){ + throw new BadCredentialsException("管理员暂时未配置此用户名,请联系管理员"); + } + if(!sysAdminUserDto.isEnabled()){ + throw new BadCredentialsException("此账号被禁用,请联系管理员"); + } + UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(sysAdminUserDto,sysAdminUserDto.getPassword(), sysAdminUserDto.getAuthorities()); +// authenticationManager.authenticate(token);//不要打开 否则会重复loadUserByUsername + SecurityContextHolder.getContext().setAuthentication(token); + } + + public void logout(){ + SecurityContextHolder.clearContext(); + } + + +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/common/SecurityReturnCode.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/common/SecurityReturnCode.java new file mode 100644 index 0000000..9f8837c --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/common/SecurityReturnCode.java @@ -0,0 +1,21 @@ +package com.passManage.us.admin.rmp.common; + +import com.passManage.us.core.serialize.CommonReturnCode; +import com.passManage.us.core.serialize.KeyValuePair; + +/** + * author: www.magicalcoder.com + * date:2018/7/10 + * function: + */ +public class SecurityReturnCode extends CommonReturnCode { + + public static final KeyValuePair LOGIN_FAIL = new KeyValuePair(70404, "用户名或密码错误", "用户名或密码错误"); + public static final KeyValuePair RE_LOGIN = new KeyValuePair(70404, "暂无权限,请重新登陆", "暂无权限,请重新登陆"); + public static final KeyValuePair NO_LOGIN = new KeyValuePair(70404, "获取用户id为null,请重新登陆", "获取用户id为null,请重新登陆"); + + public static final KeyValuePair NO_PERMISSION = new KeyValuePair(70403, "暂无权限", "暂无权限"); + public static final KeyValuePair URL_ADMIN_PREFIX_NOT_EXIST_USER = new KeyValuePair(70504, "url格式必须以/admin/开头,否则无法找到moduleName", "url格式必须以/admin/开头,否则无法找到moduleName"); + public static final KeyValuePair PASSWORD_NULL = new KeyValuePair(70501, "密码不能为空", "密码不能为空"); + +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/common/SortUrlBuilder.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/common/SortUrlBuilder.java new file mode 100644 index 0000000..85f12f9 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/common/SortUrlBuilder.java @@ -0,0 +1,28 @@ +package com.passManage.us.admin.rmp.common; + +import com.passManage.us.admin.rmp.util.HttpReqUtil; +import com.passManage.us.core.utils.StringUtil; + +import java.util.Map; + +/** + * 返回参数排过序的url + */ +public class SortUrlBuilder { + + private String servletPath; + private Map reqMap; + + public SortUrlBuilder(String servletPath, Map reqMap) { + this.servletPath = servletPath; + this.reqMap = reqMap; + } + + public String buildSortUrl(){ + String queryString = HttpReqUtil.sortParams(reqMap,null); + if(StringUtil.isBlank(queryString)){ + return servletPath; + } + return new StringBuilder(servletPath).append("?").append(queryString).toString(); + } +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/common/filter/MyAccessDecisionManager.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/common/filter/MyAccessDecisionManager.java new file mode 100644 index 0000000..c9983e5 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/common/filter/MyAccessDecisionManager.java @@ -0,0 +1,106 @@ +package com.passManage.us.admin.rmp.common.filter; + +import com.passManage.us.admin.rmp.common.SortUrlBuilder; +import com.passManage.us.admin.rmp.dto.SysAdminUserDto; +import com.passManage.us.admin.rmp.dto.SysPermissionDto; +import com.passManage.us.admin.rmp.model.SysGlobalPermitUrl; +import com.passManage.us.admin.rmp.service.SysGlobalPermitUrlService; +import com.passManage.us.core.serialize.JsonOutWriter; +import com.passManage.us.core.utils.ListUtil; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.access.AccessDecisionManager; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.access.ConfigAttribute; +import org.springframework.security.authentication.InsufficientAuthenticationException; +import org.springframework.security.core.Authentication; +import org.springframework.security.web.FilterInvocation; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.Map; + +/** + * author: www.magicalcoder.com + * date:2018/7/11 + * function:权限判断 + */ +@Service +public class MyAccessDecisionManager extends JsonOutWriter implements AccessDecisionManager { + @Value("${magicalcoder.superUserName}") + private String superUserName; + @Override + public void decide(Authentication authentication, Object o, Collection configAttributes) throws AccessDeniedException, InsufficientAuthenticationException { + SysAdminUserDto sysAdminUserDto = (SysAdminUserDto)authentication.getPrincipal(); + if(sysAdminUserDto.getUsername().equals(superUserName)){//超级管理员无需验证权限 + return; + } + if(!sysAdminUserDto.isEnabled()){ + throw new AccessDeniedException("账号被禁用,请联系管理员"); + } + FilterInvocation filterInvocation = (FilterInvocation)o; + //相当地址 + HttpServletRequest request = filterInvocation.getHttpRequest(); + String servletPath = request.getServletPath(); + Map reqMap = request.getParameterMap(); + SortUrlBuilder builder = new SortUrlBuilder(servletPath,reqMap); + if(!hasPermission(sysAdminUserDto,builder.buildSortUrl(),request)){ + throw new AccessDeniedException("暂无权限,请联系管理员");//这个异常一定不能少 否则代码会继续路由到controller + } + } + //为什么静态资源还是会进来呢 + private boolean hasPermission(SysAdminUserDto sysAdminUserDto,String reqUrl,HttpServletRequest request){ + if(sysAdminUserDto!=null){ + //优先匹配全局地址正则配置 所有角色都有此权限 + List globalUrls = sysAdminUserDto.getSysGlobalPermitUrlList(); + if(ListUtil.isNotBlank(globalUrls)){ + for(SysGlobalPermitUrl globalPermitUrl:globalUrls){ + if(matches(reqUrl,globalPermitUrl.getBackendUrlReg())){ + return true; + } + } + } + //再细化匹配实际配置的后端地址权限 + Collection permissionDtoList = (Collection) sysAdminUserDto.findAllBackendPermissionList(); + if(permissionDtoList!=null){ + Iterator iterator = permissionDtoList.iterator(); + while (iterator.hasNext()){ + SysPermissionDto permissionDto = iterator.next(); + if(matches(reqUrl,permissionDto.getBackendUrlReg())){ + return true; + } + } + } + } + return false; + } + + private boolean matches(String source,String target){ + if(source.startsWith("/")){//配置时如果忘记前缀 也兼容 + if(!target.startsWith("/")){ + target = "/"+target; + } + } + if(source.equals(target)){ + return true; + } + if(source.matches(target)){ + return true; + } + return false; + } + + @Override + public boolean supports(ConfigAttribute configAttribute) { + return true; + } + + @Override + public boolean supports(Class aClass) { + return true; + } + +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/common/filter/MyFilterSecurityInterceptor.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/common/filter/MyFilterSecurityInterceptor.java new file mode 100644 index 0000000..38eea25 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/common/filter/MyFilterSecurityInterceptor.java @@ -0,0 +1,69 @@ +package com.passManage.us.admin.rmp.common.filter; + +import com.passManage.us.admin.rmp.constant.PermissionConstant; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.SecurityMetadataSource; +import org.springframework.security.access.intercept.AbstractSecurityInterceptor; +import org.springframework.security.access.intercept.InterceptorStatusToken; +import org.springframework.security.web.FilterInvocation; +import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import java.io.IOException; + +/** + * author: www.magicalcoder.com + * date:2018/7/11 + * function: + */ +//@Service +@WebFilter(urlPatterns = PermissionConstant.ADMIN_PREFIX+"*",filterName = "adminSecurityFilter") +public class MyFilterSecurityInterceptor extends AbstractSecurityInterceptor implements Filter { + + @Resource + private FilterInvocationSecurityMetadataSource securityMetadataSource; + + @Autowired + public void setMyAccessDecisionManager(MyAccessDecisionManager myAccessDecisionManager) { + super.setAccessDecisionManager(myAccessDecisionManager); + } + + @Override + public void init(FilterConfig filterConfig) throws ServletException { + + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + FilterInvocation fi = new FilterInvocation(servletRequest, servletResponse, filterChain); + invoke(fi); + } + + public void invoke(FilterInvocation fi) throws IOException, ServletException { + InterceptorStatusToken token = super.beforeInvocation(fi); + try { +//执行下一个拦截器 + fi.getChain().doFilter(fi.getRequest(), fi.getResponse()); + } finally { + super.afterInvocation(token, null); + } + } + + @Override + public void destroy() { + + } + + @Override + public Class getSecureObjectClass() { + return FilterInvocation.class; + } + + @Override + public SecurityMetadataSource obtainSecurityMetadataSource() { + return this.securityMetadataSource; + } +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/common/filter/MyInvocationSecurityMetadataSourceService.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/common/filter/MyInvocationSecurityMetadataSourceService.java new file mode 100644 index 0000000..f6f765a --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/common/filter/MyInvocationSecurityMetadataSourceService.java @@ -0,0 +1,39 @@ +package com.passManage.us.admin.rmp.common.filter; + +import com.passManage.us.admin.rmp.constant.PermissionConstant; +import org.springframework.security.access.ConfigAttribute; +import org.springframework.security.web.FilterInvocation; +import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource; +import org.springframework.stereotype.Service; + +import java.util.Collection; +import java.util.Collections; + +/** + * + */ +@Service +public class MyInvocationSecurityMetadataSourceService implements + FilterInvocationSecurityMetadataSource { + + //必须有返回,才会进一步返回结果给decide 做进一步判断筛选,否则decide不执行 + @Override + public Collection getAttributes(Object object) throws IllegalArgumentException { + FilterInvocation filterInvocation = ((FilterInvocation) object); + String serverReqUrl = filterInvocation.getRequestUrl(); + if(!serverReqUrl.startsWith(PermissionConstant.ADMIN_PREFIX)){ + return null;//放行所有非 /admin/开头的接口 统统不需要过滤 + } + return Collections.singleton(null);//返回一个实例 到decide方法再详细判断 + } + + @Override + public Collection getAllConfigAttributes() { + return null; + } + + @Override + public boolean supports(Class clazz) { + return true; + } +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/common/handler/MyAccessDeniedHandler.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/common/handler/MyAccessDeniedHandler.java new file mode 100644 index 0000000..6db7e0a --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/common/handler/MyAccessDeniedHandler.java @@ -0,0 +1,25 @@ +package com.passManage.us.admin.rmp.common.handler; + +import com.passManage.us.admin.rmp.common.SecurityReturnCode; +import com.passManage.us.core.serialize.JsonOutWriter; +import com.passManage.us.core.serialize.KeyValuePair; +import org.springframework.security.access.AccessDeniedException; +import org.springframework.security.web.access.AccessDeniedHandler; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * author:www.magicalcoder.com + * date:2018/7/17 + * function: 接收AccessDeniedException 业务自己抛出的异常 这里能处理 + */ +public class MyAccessDeniedHandler extends JsonOutWriter implements AccessDeniedHandler { + @Override + public void handle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AccessDeniedException e) throws IOException, ServletException { + KeyValuePair keyValuePair = new KeyValuePair(SecurityReturnCode.NO_PERMISSION.getKey(),e.getMessage(),null); + toWebFail(httpServletResponse,keyValuePair); + } +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/common/handler/MyLoginFailHandler.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/common/handler/MyLoginFailHandler.java new file mode 100644 index 0000000..f75a920 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/common/handler/MyLoginFailHandler.java @@ -0,0 +1,25 @@ +package com.passManage.us.admin.rmp.common.handler; + +import com.passManage.us.admin.rmp.common.SecurityReturnCode; +import com.passManage.us.core.serialize.JsonOutWriter; +import com.passManage.us.core.serialize.KeyValuePair; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.authentication.AuthenticationFailureHandler; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * author:www.magicalcoder.com + * date:2018/7/16 + * function:登陆失败处理器 + */ +public class MyLoginFailHandler extends JsonOutWriter implements AuthenticationFailureHandler{ + + @Override + public void onAuthenticationFailure(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, AuthenticationException e) throws IOException, ServletException { + toWebFail(httpServletResponse, new KeyValuePair(SecurityReturnCode.LOGIN_FAIL.getKey(),e.getMessage(),null)); + } +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/common/handler/MyLoginSuccessHandler.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/common/handler/MyLoginSuccessHandler.java new file mode 100644 index 0000000..88915ba --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/common/handler/MyLoginSuccessHandler.java @@ -0,0 +1,24 @@ +package com.passManage.us.admin.rmp.common.handler; + +import com.passManage.us.core.serialize.JsonOutWriter; +import org.springframework.security.core.Authentication; +import org.springframework.security.web.authentication.AuthenticationSuccessHandler; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * author:www.magicalcoder.com + * date:2018/7/16 + * function:登陆成功处理器 + */ +public class MyLoginSuccessHandler extends JsonOutWriter implements AuthenticationSuccessHandler{ + @Override + public void onAuthenticationSuccess(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Authentication authentication) throws IOException, ServletException { +// SysAdminUserDto adminUser = (SysAdminUserDto) authentication.getPrincipal(); +// adminUser.setPassword(null); + toWebSuccess(httpServletResponse); + } +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/common/interceptor/AdminLogOperateInterceptor.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/common/interceptor/AdminLogOperateInterceptor.java new file mode 100644 index 0000000..0342e0f --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/common/interceptor/AdminLogOperateInterceptor.java @@ -0,0 +1,68 @@ +package com.passManage.us.admin.rmp.common.interceptor; + +import com.alibaba.fastjson.JSON; +import com.passManage.us.admin.rmp.dto.SysAdminUserDto; +import com.passManage.us.admin.rmp.model.SysLogAdminOperate; +import com.passManage.us.admin.rmp.service.SysLogAdminOperateService; +import com.passManage.us.admin.rmp.util.AdminUtil; +import com.passManage.us.admin.rmp.util.HttpReqUtil; +import com.passManage.us.core.utils.StringUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.ModelAndView; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.sql.Timestamp; +import java.util.Date; + +/** + * 后端操作日志判断拦截器 + * @author www.magicalcoder.com + */ +@Component +@Slf4j +public class AdminLogOperateInterceptor extends HandlerInterceptorAdapter { + + @Resource + private SysLogAdminOperateService sysLogAdminOperateService; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + //这里是为了记录用户的操作日志,至于最终用户有没有操作成功,是业务处理的问题,但是必须提前存好用户的操作行为 + String method = request.getMethod(); + if("post".equals(method.toLowerCase())){ + request.setCharacterEncoding("utf-8"); + SysAdminUserDto sysAdminUserDto = AdminUtil.getAdmin(); + SysLogAdminOperate entity = new SysLogAdminOperate(); + entity.setAdminUserId(sysAdminUserDto.getId()); + if(StringUtil.isBlank(sysAdminUserDto.getRealName())){ + entity.setUserName(sysAdminUserDto.getUsername()); + }else { + entity.setUserName(sysAdminUserDto.getRealName()); + } + entity.setCreateTime(new Timestamp(System.currentTimeMillis())); + String body = JSON.toJSONString(request.getParameterMap()); + entity.setFormBody(body); + String serverPath = request.getServletPath(); + entity.setUrl(serverPath); + entity.setTableName(HttpReqUtil.moduleName(serverPath)); + entity.setPrimaryIdValue(request.getParameter("id"));//如果有就存id否则存null + entity.setOperateType(HttpReqUtil.operateType(serverPath)); + sysLogAdminOperateService.insertModel(entity); + } + return true; + } + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + super.postHandle(request, response, handler, modelAndView); + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + super.afterCompletion(request, response, handler, ex); + } +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/common/point/MyLoginExpiredAuthenticationEntryPoint.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/common/point/MyLoginExpiredAuthenticationEntryPoint.java new file mode 100644 index 0000000..d0d9bf3 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/common/point/MyLoginExpiredAuthenticationEntryPoint.java @@ -0,0 +1,42 @@ +package com.passManage.us.admin.rmp.common.point; + +import com.passManage.us.admin.rmp.common.SecurityReturnCode; +import com.passManage.us.core.serialize.JsonOutWriter; +import org.springframework.security.core.AuthenticationException; +import org.springframework.security.web.AuthenticationEntryPoint; + +import javax.servlet.ServletException; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; +import java.net.URLEncoder; + +/** + * author:www.magicalcoder.com + * date:2018/7/17 + * function: 自定义一下 当用户登陆超时出错 框架捕获了匿名用户访问接口后 调用这里 提示用户重新登录即可 + */ +public class MyLoginExpiredAuthenticationEntryPoint extends JsonOutWriter implements AuthenticationEntryPoint { + + @Override + public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException { + String servletPath = request.getServletPath(); + if(servletPath.startsWith("/admin/page/") || servletPath.startsWith("/admin/page_v2/")){//返回到登录超时页面 这种格式的请求都是列表页 详情页跳转 所以应该展示到登录超时页面 + String path = request.getContextPath(); + String CTX = request.getScheme() + "://" + + request.getServerName() + ":" + request.getServerPort() + + path + "/";//这个是登录页 + String redirectUrl = URLEncoder.encode(CTX+servletPath+"?"+request.getQueryString()); + response.sendRedirect(CTX+"?from=innerLogin&redirectUrl="+redirectUrl);//参考login.js处理逻辑 redirectUrl记住之前地址 + }else if(servletPath.startsWith("/admin/rmp/index")){ + String path = request.getContextPath(); + String CTX = request.getScheme() + "://" + + request.getServerName() + ":" + request.getServerPort() + + path + "/";//这个是登录页 + response.sendRedirect(CTX+"?from=outerLogin");//参考login.js处理逻辑 + } + else { + toWebFail(response,SecurityReturnCode.RE_LOGIN); + } + } +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/constant/PermissionConstant.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/constant/PermissionConstant.java new file mode 100644 index 0000000..7f3b3f7 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/constant/PermissionConstant.java @@ -0,0 +1,54 @@ +package com.passManage.us.admin.rmp.constant; + +public interface PermissionConstant { + + String CODE_PREFIX = "code_"; + + String ADMIN_PREFIX = "/admin/";//将要被权限系统拦截的前缀 + String STATIC_PREFIX = "/assets/";//将要被权限系统拦截的前缀 + String LOGIN_FORM_URL = "/login";//登陆地址 + String REMOTE_PREFIX = "/remote";//远程登陆接口 + + + enum Platform implements PermissionConstant{ + BACKEND("backend"),FRONT("front"),FRONT_BACKEND("front_backend");//双端共有配置 + private String value; + Platform(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + public static Platform build(String value){ + if(BACKEND.value.equals(value)){ + return BACKEND; + }else if(FRONT.value.equals(value)){ + return FRONT; + }else if(FRONT_BACKEND.value.equals(value)){ + return FRONT_BACKEND; + } + return null; + } + } + enum FrontAction implements PermissionConstant{ + SHOW("show"),DISABLED("disabled"); + private String value; + FrontAction(String value) { + this.value = value; + } + + public String getValue() { + return value; + } + public static FrontAction build(String value){ + if(SHOW.value.equals(value)){ + return SHOW; + }else if(DISABLED.value.equals(value)){ + return DISABLED; + } + return null; + } + } + +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/dto/SysAdminUserDto.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/dto/SysAdminUserDto.java new file mode 100644 index 0000000..e59d217 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/dto/SysAdminUserDto.java @@ -0,0 +1,88 @@ +package com.passManage.us.admin.rmp.dto; + +import com.passManage.us.admin.rmp.model.SysAdminUser; +import com.passManage.us.admin.rmp.model.SysGlobalPermitUrl; +import com.passManage.us.core.utils.ListUtil; +import com.passManage.us.core.utils.MapUtil; +import org.springframework.security.core.GrantedAuthority; +import org.springframework.security.core.userdetails.UserDetails; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; + +/** + * 由于采取分布式session,存入redis 当此类被修改 就会触发jdk反序列化失败,除非redis下的session失效 + * 解决办法:自定义序列化 TODO + */ +public class SysAdminUserDto extends SysAdminUser implements UserDetails { + private SysRoleDto sysRoleDto; + List sysGlobalPermitUrlList;//全局配置 + public SysRoleDto getSysRoleDto() { + return sysRoleDto; + } + + public void setSysRoleDto(SysRoleDto sysRoleDto) { + this.sysRoleDto = sysRoleDto; + } + //所以 + + @Override + public Collection getAuthorities() { + List auths = new ArrayList<>(); + return auths; + } + + @Override + public boolean isAccountNonExpired() { + return false; + } + + @Override + public boolean isAccountNonLocked() { + return false; + } + + @Override + public boolean isCredentialsNonExpired() { + return false; + } + + @Override + public boolean isEnabled() { + return getEnabled()==null ? false : getEnabled(); + } + + //仅仅获取指定moduleName下的所有权限(tableName) + public Collection findAllBackendPermissionList() { + List auths = new ArrayList<>(); + if(sysRoleDto!=null){ + List categoryDtoList = sysRoleDto.getSysModuleCategoryDtoList(); + if(ListUtil.isNotBlank(categoryDtoList)){ + for(SysModuleCategoryDto categoryDto:categoryDtoList){ + List moduleDtoList = categoryDto.getSysModuleDtoList(); + if(ListUtil.isNotBlank(moduleDtoList)){ + for(SysModuleDto sysModuleDto:moduleDtoList){ + if(ListUtil.isNotBlank(sysModuleDto.getBackendOwnPermissionDtoList())){ + auths.addAll(sysModuleDto.getBackendOwnPermissionDtoList()); + } + } + } + } + } + + } + //去重 + Map authMap = MapUtil.listToItemMap("id",auths); + return authMap.values(); + } + + public List getSysGlobalPermitUrlList() { + return sysGlobalPermitUrlList; + } + + public void setSysGlobalPermitUrlList(List sysGlobalPermitUrlList) { + this.sysGlobalPermitUrlList = sysGlobalPermitUrlList; + } +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/dto/SysModuleCategoryDto.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/dto/SysModuleCategoryDto.java new file mode 100644 index 0000000..38c9461 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/dto/SysModuleCategoryDto.java @@ -0,0 +1,18 @@ +package com.passManage.us.admin.rmp.dto; + + +import com.passManage.us.admin.rmp.model.SysModuleCategory; + +import java.util.List; + +public class SysModuleCategoryDto extends SysModuleCategory { + private List sysModuleDtoList; + + public List getSysModuleDtoList() { + return sysModuleDtoList; + } + + public void setSysModuleDtoList(List sysModuleDtoList) { + this.sysModuleDtoList = sysModuleDtoList; + } +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/dto/SysModuleDto.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/dto/SysModuleDto.java new file mode 100644 index 0000000..fdcf4b2 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/dto/SysModuleDto.java @@ -0,0 +1,29 @@ +package com.passManage.us.admin.rmp.dto; + + +import com.passManage.us.admin.rmp.model.SysModule; + +import java.util.List; +import java.util.Map; + +public class SysModuleDto extends SysModule { + private List backendOwnPermissionDtoList;//后端此模块下的角色拥有的权限列表 + private List sysPermissionDtoList;//前端此模块下的所有权限列表(拥有 不拥有 都返回 通过hspPermission区分) + + public List getBackendOwnPermissionDtoList() { + return backendOwnPermissionDtoList; + } + + public void setBackendOwnPermissionDtoList(List backendOwnPermissionDtoList) { + this.backendOwnPermissionDtoList = backendOwnPermissionDtoList; + } + + public List getSysPermissionDtoList() { + return sysPermissionDtoList; + } + + public void setSysPermissionDtoList(List sysPermissionDtoList) { + this.sysPermissionDtoList = sysPermissionDtoList; + } + +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/dto/SysPermissionDto.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/dto/SysPermissionDto.java new file mode 100644 index 0000000..3fab997 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/dto/SysPermissionDto.java @@ -0,0 +1,22 @@ +package com.passManage.us.admin.rmp.dto; + +import com.passManage.us.admin.rmp.model.SysPermission; +import org.springframework.security.core.GrantedAuthority; + +public class SysPermissionDto extends SysPermission implements GrantedAuthority { + + private boolean hasPermission;//是否拥有此权限 + + @Override + public String getAuthority() { + return getPermissionName(); + } + + public boolean isHasPermission() { + return hasPermission; + } + + public void setHasPermission(boolean hasPermission) { + this.hasPermission = hasPermission; + } +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/dto/SysRoleDto.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/dto/SysRoleDto.java new file mode 100644 index 0000000..5139f5c --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/dto/SysRoleDto.java @@ -0,0 +1,18 @@ +package com.passManage.us.admin.rmp.dto; + + +import com.passManage.us.admin.rmp.model.SysRole; + +import java.util.List; + +public class SysRoleDto extends SysRole { + private List sysModuleCategoryDtoList; + + public List getSysModuleCategoryDtoList() { + return sysModuleCategoryDtoList; + } + + public void setSysModuleCategoryDtoList(List sysModuleCategoryDtoList) { + this.sysModuleCategoryDtoList = sysModuleCategoryDtoList; + } +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/mapper/SysAdminUserMapper.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/mapper/SysAdminUserMapper.java new file mode 100644 index 0000000..73eaee1 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/mapper/SysAdminUserMapper.java @@ -0,0 +1,16 @@ +package com.passManage.us.admin.rmp.mapper; + + +import com.passManage.us.admin.rmp.model.SysAdminUser; +import com.passManage.us.core.service.ICommonMapper; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +public interface SysAdminUserMapper extends ICommonMapper { + + +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/mapper/SysGlobalPermitUrlMapper.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/mapper/SysGlobalPermitUrlMapper.java new file mode 100644 index 0000000..7f0666f --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/mapper/SysGlobalPermitUrlMapper.java @@ -0,0 +1,15 @@ +package com.passManage.us.admin.rmp.mapper; + +import com.passManage.us.admin.rmp.model.SysGlobalPermitUrl; +import com.passManage.us.core.service.ICommonMapper; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +public interface SysGlobalPermitUrlMapper extends ICommonMapper{ + + +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/mapper/SysLogAdminOperateMapper.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/mapper/SysLogAdminOperateMapper.java new file mode 100644 index 0000000..61e5ab7 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/mapper/SysLogAdminOperateMapper.java @@ -0,0 +1,15 @@ +package com.passManage.us.admin.rmp.mapper; + +import com.passManage.us.admin.rmp.model.SysLogAdminOperate; +import com.passManage.us.core.service.ICommonMapper; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +public interface SysLogAdminOperateMapper extends ICommonMapper{ + + +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/mapper/SysModuleCategoryMapper.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/mapper/SysModuleCategoryMapper.java new file mode 100644 index 0000000..173a535 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/mapper/SysModuleCategoryMapper.java @@ -0,0 +1,15 @@ +package com.passManage.us.admin.rmp.mapper; + +import com.passManage.us.admin.rmp.model.SysModuleCategory; +import com.passManage.us.core.service.ICommonMapper; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +public interface SysModuleCategoryMapper extends ICommonMapper{ + + +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/mapper/SysModuleMapper.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/mapper/SysModuleMapper.java new file mode 100644 index 0000000..d3e6247 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/mapper/SysModuleMapper.java @@ -0,0 +1,15 @@ +package com.passManage.us.admin.rmp.mapper; + +import com.passManage.us.admin.rmp.model.SysModule; +import com.passManage.us.core.service.ICommonMapper; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +public interface SysModuleMapper extends ICommonMapper{ + + +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/mapper/SysPermissionMapper.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/mapper/SysPermissionMapper.java new file mode 100644 index 0000000..dbbb41a --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/mapper/SysPermissionMapper.java @@ -0,0 +1,15 @@ +package com.passManage.us.admin.rmp.mapper; + +import com.passManage.us.admin.rmp.model.SysPermission; +import com.passManage.us.core.service.ICommonMapper; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +public interface SysPermissionMapper extends ICommonMapper{ + + +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/mapper/SysRoleMapper.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/mapper/SysRoleMapper.java new file mode 100644 index 0000000..91feec4 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/mapper/SysRoleMapper.java @@ -0,0 +1,15 @@ +package com.passManage.us.admin.rmp.mapper; + +import com.passManage.us.admin.rmp.model.SysRole; +import com.passManage.us.core.service.ICommonMapper; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +public interface SysRoleMapper extends ICommonMapper{ + + +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/mapper/SysRoleModulePermissionMapper.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/mapper/SysRoleModulePermissionMapper.java new file mode 100644 index 0000000..bd4c7fe --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/mapper/SysRoleModulePermissionMapper.java @@ -0,0 +1,17 @@ +package com.passManage.us.admin.rmp.mapper; + + +import com.passManage.us.admin.rmp.model.SysRoleModulePermission; +import com.passManage.us.core.service.ICommonMapper; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +public interface SysRoleModulePermissionMapper extends ICommonMapper { + + + +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/SysAdminUser.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/SysAdminUser.java new file mode 100644 index 0000000..2b1a2c4 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/SysAdminUser.java @@ -0,0 +1,157 @@ +package com.passManage.us.admin.rmp.model; + +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Timestamp; +import java.util.Date; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +public class SysAdminUser implements Serializable{ + + private Long id;//主键 + private String username;//用户名 + private String password;//密码 + private String realName;//真名 + private String email;//邮箱 + private String telephone;//座机号 + private String mobilePhone;//手机号 + private String address;//地址 + @DateTimeFormat( pattern = "yyyy-MM-dd HH:mm:ss" ) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8") + private Timestamp createTime;//创建时间 + @DateTimeFormat( pattern = "yyyy-MM-dd HH:mm:ss" ) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8") + private Timestamp updateTime;//更新时间 + private Long roleId;//角色 + private Boolean accountNonExpired;//是否未失效 此字段暂时无效 + private Boolean accountNonLocked;//是否未锁定 此字段暂时无效 + private Boolean credentialsNonExpired;//是否未失效 此字段暂时无效 + private Boolean enabled;//是否可用 此字段有效 + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getRealName() { + return realName; + } + + public void setRealName(String realName) { + this.realName = realName; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getTelephone() { + return telephone; + } + + public void setTelephone(String telephone) { + this.telephone = telephone; + } + + public String getMobilePhone() { + return mobilePhone; + } + + public void setMobilePhone(String mobilePhone) { + this.mobilePhone = mobilePhone; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public Timestamp getCreateTime() { + return createTime; + } + + public void setCreateTime(Timestamp createTime) { + this.createTime = createTime; + } + + public Timestamp getUpdateTime() { + return updateTime; + } + + public void setUpdateTime(Timestamp updateTime) { + this.updateTime = updateTime; + } + + public Long getRoleId() { + return roleId; + } + + public void setRoleId(Long roleId) { + this.roleId = roleId; + } + + public Boolean getAccountNonExpired() { + return accountNonExpired; + } + + public void setAccountNonExpired(Boolean accountNonExpired) { + this.accountNonExpired = accountNonExpired; + } + + public Boolean getAccountNonLocked() { + return accountNonLocked; + } + + public void setAccountNonLocked(Boolean accountNonLocked) { + this.accountNonLocked = accountNonLocked; + } + + public Boolean getCredentialsNonExpired() { + return credentialsNonExpired; + } + + public void setCredentialsNonExpired(Boolean credentialsNonExpired) { + this.credentialsNonExpired = credentialsNonExpired; + } + + public Boolean getEnabled() { + return enabled; + } + + public void setEnabled(Boolean enabled) { + this.enabled = enabled; + } +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/SysGlobalPermitUrl.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/SysGlobalPermitUrl.java new file mode 100644 index 0000000..f6f31b6 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/SysGlobalPermitUrl.java @@ -0,0 +1,48 @@ +package com.passManage.us.admin.rmp.model; + +import lombok.Data; + +import java.io.Serializable; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ +@Data +public class SysGlobalPermitUrl implements Serializable{ + + private Long id;//主键 + private String permitName;//通过名称 + private String backendUrlReg;//后端的地址正则,校验当前请求url是否有权限,get|post统一会按照参数首字母排序 + private Long moduleId;//所属模块 + + + public Long getId(){ + return id; + } + public void setId(Long id){ + this.id = id; + } + + public String getPermitName(){ + return permitName; + } + public void setPermitName(String permitName){ + this.permitName = permitName; + } + + public String getBackendUrlReg(){ + return backendUrlReg; + } + public void setBackendUrlReg(String backendUrlReg){ + this.backendUrlReg = backendUrlReg; + } + + public Long getModuleId(){ + return moduleId; + } + public void setModuleId(Long moduleId){ + this.moduleId = moduleId; + } +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/SysLogAdminOperate.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/SysLogAdminOperate.java new file mode 100644 index 0000000..2c87873 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/SysLogAdminOperate.java @@ -0,0 +1,101 @@ +package com.passManage.us.admin.rmp.model; + +import com.fasterxml.jackson.annotation.JsonFormat; +import org.springframework.format.annotation.DateTimeFormat; + +import java.io.Serializable; +import java.sql.Timestamp; +import java.util.Date; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +public class SysLogAdminOperate implements Serializable{ + + private Long id;//主键 + private Long adminUserId;//管理员 + private String userName;//管理员名称 + private String tableName;//表名 + private String operateType;//操作类型 + private String url;//链接 + private String primaryIdValue;//主键值 + private String formBody;//提交内容 + @DateTimeFormat( pattern = "yyyy-MM-dd HH:mm:ss" ) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8") + private Timestamp createTime;//创建时间 + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public Long getAdminUserId() { + return adminUserId; + } + + public void setAdminUserId(Long adminUserId) { + this.adminUserId = adminUserId; + } + + public String getUserName() { + return userName; + } + + public void setUserName(String userName) { + this.userName = userName; + } + + public String getTableName() { + return tableName; + } + + public void setTableName(String tableName) { + this.tableName = tableName; + } + + public String getOperateType() { + return operateType; + } + + public void setOperateType(String operateType) { + this.operateType = operateType; + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getPrimaryIdValue() { + return primaryIdValue; + } + + public void setPrimaryIdValue(String primaryIdValue) { + this.primaryIdValue = primaryIdValue; + } + + public String getFormBody() { + return formBody; + } + + public void setFormBody(String formBody) { + this.formBody = formBody; + } + + public Timestamp getCreateTime() { + return createTime; + } + + public void setCreateTime(Timestamp createTime) { + this.createTime = createTime; + } +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/SysModule.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/SysModule.java new file mode 100644 index 0000000..9496f98 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/SysModule.java @@ -0,0 +1,64 @@ +package com.passManage.us.admin.rmp.model; + +import java.io.Serializable; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +public class SysModule implements Serializable{ + + private Long id;//主键 + private String moduleName;//模块唯一键 + private String moduleUrl;//模块URL + private Long moduleCategoryId;//模块分类 + private Integer sortNum;//排序 + private String moduleTitle;//模块标题 + private Boolean ifShow;//是否显示 + + public Long getId(){ + return id; + } + public void setId(Long id){ + this.id = id; + } + public String getModuleName(){ + return moduleName; + } + public void setModuleName(String moduleName){ + this.moduleName = moduleName; + } + public String getModuleUrl(){ + return moduleUrl; + } + public void setModuleUrl(String moduleUrl){ + this.moduleUrl = moduleUrl; + } + public Long getModuleCategoryId(){ + return moduleCategoryId; + } + public void setModuleCategoryId(Long moduleCategoryId){ + this.moduleCategoryId = moduleCategoryId; + } + public Integer getSortNum(){ + return sortNum; + } + public void setSortNum(Integer sortNum){ + this.sortNum = sortNum; + } + public String getModuleTitle(){ + return moduleTitle; + } + public void setModuleTitle(String moduleTitle){ + this.moduleTitle = moduleTitle; + } + public Boolean getIfShow(){ + return ifShow; + } + public void setIfShow(Boolean ifShow){ + this.ifShow = ifShow; + } + +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/SysModuleCategory.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/SysModuleCategory.java new file mode 100644 index 0000000..c1417ea --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/SysModuleCategory.java @@ -0,0 +1,36 @@ +package com.passManage.us.admin.rmp.model; + +import java.io.Serializable; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +public class SysModuleCategory implements Serializable{ + + private Long id;//主键 + private String moduleCategoryName;//模块名称 + private Integer sortNum;//排序 + + public Long getId(){ + return id; + } + public void setId(Long id){ + this.id = id; + } + public String getModuleCategoryName(){ + return moduleCategoryName; + } + public void setModuleCategoryName(String moduleCategoryName){ + this.moduleCategoryName = moduleCategoryName; + } + public Integer getSortNum(){ + return sortNum; + } + public void setSortNum(Integer sortNum){ + this.sortNum = sortNum; + } + +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/SysPermission.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/SysPermission.java new file mode 100644 index 0000000..8d6337b --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/SysPermission.java @@ -0,0 +1,64 @@ +package com.passManage.us.admin.rmp.model; + +import java.io.Serializable; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +public class SysPermission implements Serializable{ + + private Long id;//主键 + private String filterPlatform;//过滤端:front|backend + private String permissionName;//过滤器名称:审核通过 + private String backendUrlReg;//后端的地址正则,校验当前请求url是否有权限,get|post统一会按照参数首字母排序 + private String frontDom;//前端dom获取 + private String frontAction;//前端处理方式hide|remove|disabled + private Long moduleId; + public Long getId(){ + return id; + } + public void setId(Long id){ + this.id = id; + } + public String getFilterPlatform(){ + return filterPlatform; + } + public void setFilterPlatform(String filterPlatform){ + this.filterPlatform = filterPlatform; + } + public String getPermissionName(){ + return permissionName; + } + public void setPermissionName(String permissionName){ + this.permissionName = permissionName; + } + public String getBackendUrlReg(){ + return backendUrlReg; + } + public void setBackendUrlReg(String backendUrlReg){ + this.backendUrlReg = backendUrlReg; + } + public String getFrontDom(){ + return frontDom; + } + public void setFrontDom(String frontDom){ + this.frontDom = frontDom; + } + public String getFrontAction(){ + return frontAction; + } + public void setFrontAction(String frontAction){ + this.frontAction = frontAction; + } + + public Long getModuleId() { + return moduleId; + } + + public void setModuleId(Long moduleId) { + this.moduleId = moduleId; + } +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/SysRole.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/SysRole.java new file mode 100644 index 0000000..08ca783 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/SysRole.java @@ -0,0 +1,29 @@ +package com.passManage.us.admin.rmp.model; + +import java.io.Serializable; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +public class SysRole implements Serializable{ + + private Long id;//主键 + private String roleName;//角色名 + + public Long getId(){ + return id; + } + public void setId(Long id){ + this.id = id; + } + public String getRoleName(){ + return roleName; + } + public void setRoleName(String roleName){ + this.roleName = roleName; + } + +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/SysRoleModulePermission.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/SysRoleModulePermission.java new file mode 100644 index 0000000..b21eba1 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/SysRoleModulePermission.java @@ -0,0 +1,43 @@ +package com.passManage.us.admin.rmp.model; + +import java.io.Serializable; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +public class SysRoleModulePermission implements Serializable{ + + private Long id;//主键 + private Long roleId;//角色 + private Long moduleId;//模块 + private Long permissionId;//权限 + + public Long getId(){ + return id; + } + public void setId(Long id){ + this.id = id; + } + public Long getRoleId(){ + return roleId; + } + public void setRoleId(Long roleId){ + this.roleId = roleId; + } + public Long getModuleId(){ + return moduleId; + } + public void setModuleId(Long moduleId){ + this.moduleId = moduleId; + } + public Long getPermissionId(){ + return permissionId; + } + public void setPermissionId(Long permissionId){ + this.permissionId = permissionId; + } + +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/defined/SysAdminUserWithSysRole.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/defined/SysAdminUserWithSysRole.java new file mode 100644 index 0000000..c1521e9 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/defined/SysAdminUserWithSysRole.java @@ -0,0 +1,29 @@ +package com.passManage.us.admin.rmp.model.defined; + + +import com.passManage.us.admin.rmp.model.SysAdminUser; + +import java.io.Serializable; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ +public class SysAdminUserWithSysRole extends SysAdminUser implements Serializable{ + private Long sysRoleId; + private String roleName; + public Long getSysRoleId(){ + return sysRoleId; + } + public void setSysRoleId(Long sysRoleId){ + this.sysRoleId = sysRoleId; + } + public String getRoleName(){ + return roleName; + } + public void setRoleName(String roleName){ + this.roleName = roleName; + } + +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/defined/SysGlobalPermitUrlWithSysModule.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/defined/SysGlobalPermitUrlWithSysModule.java new file mode 100644 index 0000000..9257f9a --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/defined/SysGlobalPermitUrlWithSysModule.java @@ -0,0 +1,63 @@ +package com.passManage.us.admin.rmp.model.defined; + +import com.passManage.us.admin.rmp.model.SysGlobalPermitUrl; + +import java.io.Serializable; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ +public class SysGlobalPermitUrlWithSysModule extends SysGlobalPermitUrl implements Serializable{ + private Long sysModuleId; + private String moduleName; + private String moduleUrl; + private Long moduleCategoryId; + private Integer sortNum; + private String moduleTitle; + private String ifShow; + public Long getSysModuleId(){ + return sysModuleId; + } + public void setSysModuleId(Long sysModuleId){ + this.sysModuleId = sysModuleId; + } + public String getModuleName(){ + return moduleName; + } + public void setModuleName(String moduleName){ + this.moduleName = moduleName; + } + public String getModuleUrl(){ + return moduleUrl; + } + public void setModuleUrl(String moduleUrl){ + this.moduleUrl = moduleUrl; + } + public Long getModuleCategoryId(){ + return moduleCategoryId; + } + public void setModuleCategoryId(Long moduleCategoryId){ + this.moduleCategoryId = moduleCategoryId; + } + public Integer getSortNum(){ + return sortNum; + } + public void setSortNum(Integer sortNum){ + this.sortNum = sortNum; + } + public String getModuleTitle(){ + return moduleTitle; + } + public void setModuleTitle(String moduleTitle){ + this.moduleTitle = moduleTitle; + } + public String getIfShow(){ + return ifShow; + } + public void setIfShow(String ifShow){ + this.ifShow = ifShow; + } + +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/defined/SysLogAdminOperateWithSysAdminUser.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/defined/SysLogAdminOperateWithSysAdminUser.java new file mode 100644 index 0000000..2e5bf0d --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/defined/SysLogAdminOperateWithSysAdminUser.java @@ -0,0 +1,120 @@ +package com.passManage.us.admin.rmp.model.defined; + +import com.passManage.us.admin.rmp.model.SysLogAdminOperate; + +import java.io.Serializable; +import java.sql.Timestamp; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ +public class SysLogAdminOperateWithSysAdminUser extends SysLogAdminOperate implements Serializable{ + private Long sysAdminUserId; + private String username; + private String password; + private String realName; + private String email; + private String telephone; + private String mobilePhone; + private String address; + private Timestamp sysAdminUserCreateTime; + private Timestamp updateTime; + private Long roleId; + private String accountNonExpired; + private String accountNonLocked; + private String credentialsNonExpired; + private String enabled; + public Long getSysAdminUserId(){ + return sysAdminUserId; + } + public void setSysAdminUserId(Long sysAdminUserId){ + this.sysAdminUserId = sysAdminUserId; + } + public String getUsername(){ + return username; + } + public void setUsername(String username){ + this.username = username; + } + public String getPassword(){ + return password; + } + public void setPassword(String password){ + this.password = password; + } + public String getRealName(){ + return realName; + } + public void setRealName(String realName){ + this.realName = realName; + } + public String getEmail(){ + return email; + } + public void setEmail(String email){ + this.email = email; + } + public String getTelephone(){ + return telephone; + } + public void setTelephone(String telephone){ + this.telephone = telephone; + } + public String getMobilePhone(){ + return mobilePhone; + } + public void setMobilePhone(String mobilePhone){ + this.mobilePhone = mobilePhone; + } + public String getAddress(){ + return address; + } + public void setAddress(String address){ + this.address = address; + } + public Timestamp getSysAdminUserCreateTime(){ + return sysAdminUserCreateTime; + } + public void setSysAdminUserCreateTime(Timestamp sysAdminUserCreateTime){ + this.sysAdminUserCreateTime = sysAdminUserCreateTime; + } + public Timestamp getUpdateTime(){ + return updateTime; + } + public void setUpdateTime(Timestamp updateTime){ + this.updateTime = updateTime; + } + public Long getRoleId(){ + return roleId; + } + public void setRoleId(Long roleId){ + this.roleId = roleId; + } + public String getAccountNonExpired(){ + return accountNonExpired; + } + public void setAccountNonExpired(String accountNonExpired){ + this.accountNonExpired = accountNonExpired; + } + public String getAccountNonLocked(){ + return accountNonLocked; + } + public void setAccountNonLocked(String accountNonLocked){ + this.accountNonLocked = accountNonLocked; + } + public String getCredentialsNonExpired(){ + return credentialsNonExpired; + } + public void setCredentialsNonExpired(String credentialsNonExpired){ + this.credentialsNonExpired = credentialsNonExpired; + } + public String getEnabled(){ + return enabled; + } + public void setEnabled(String enabled){ + this.enabled = enabled; + } + +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/defined/SysModuleWithSysModuleCategory.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/defined/SysModuleWithSysModuleCategory.java new file mode 100644 index 0000000..0c17d94 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/defined/SysModuleWithSysModuleCategory.java @@ -0,0 +1,35 @@ +package com.passManage.us.admin.rmp.model.defined; + +import com.passManage.us.admin.rmp.model.SysModule; + +import java.io.Serializable; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ +public class SysModuleWithSysModuleCategory extends SysModule implements Serializable{ + private Long sysModuleCategoryId; + private String moduleCategoryName; + private Integer sysModuleCategorySortNum; + public Long getSysModuleCategoryId(){ + return sysModuleCategoryId; + } + public void setSysModuleCategoryId(Long sysModuleCategoryId){ + this.sysModuleCategoryId = sysModuleCategoryId; + } + public String getModuleCategoryName(){ + return moduleCategoryName; + } + public void setModuleCategoryName(String moduleCategoryName){ + this.moduleCategoryName = moduleCategoryName; + } + public Integer getSysModuleCategorySortNum(){ + return sysModuleCategorySortNum; + } + public void setSysModuleCategorySortNum(Integer sysModuleCategorySortNum){ + this.sysModuleCategorySortNum = sysModuleCategorySortNum; + } + +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/defined/SysPermissionWithSysModule.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/defined/SysPermissionWithSysModule.java new file mode 100644 index 0000000..187dd77 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/defined/SysPermissionWithSysModule.java @@ -0,0 +1,63 @@ +package com.passManage.us.admin.rmp.model.defined; + +import com.passManage.us.admin.rmp.model.SysPermission; + +import java.io.Serializable; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ +public class SysPermissionWithSysModule extends SysPermission implements Serializable{ + private Long sysModuleId; + private String moduleName; + private String moduleUrl; + private Long moduleCategoryId; + private Integer sortNum; + private String moduleTitle; + private String ifShow; + public Long getSysModuleId(){ + return sysModuleId; + } + public void setSysModuleId(Long sysModuleId){ + this.sysModuleId = sysModuleId; + } + public String getModuleName(){ + return moduleName; + } + public void setModuleName(String moduleName){ + this.moduleName = moduleName; + } + public String getModuleUrl(){ + return moduleUrl; + } + public void setModuleUrl(String moduleUrl){ + this.moduleUrl = moduleUrl; + } + public Long getModuleCategoryId(){ + return moduleCategoryId; + } + public void setModuleCategoryId(Long moduleCategoryId){ + this.moduleCategoryId = moduleCategoryId; + } + public Integer getSortNum(){ + return sortNum; + } + public void setSortNum(Integer sortNum){ + this.sortNum = sortNum; + } + public String getModuleTitle(){ + return moduleTitle; + } + public void setModuleTitle(String moduleTitle){ + this.moduleTitle = moduleTitle; + } + public String getIfShow(){ + return ifShow; + } + public void setIfShow(String ifShow){ + this.ifShow = ifShow; + } + +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/defined/SysRoleModulePermissionWithSysModule.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/defined/SysRoleModulePermissionWithSysModule.java new file mode 100644 index 0000000..8a79523 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/defined/SysRoleModulePermissionWithSysModule.java @@ -0,0 +1,63 @@ +package com.passManage.us.admin.rmp.model.defined; + +import com.passManage.us.admin.rmp.model.SysRoleModulePermission; + +import java.io.Serializable; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ +public class SysRoleModulePermissionWithSysModule extends SysRoleModulePermission implements Serializable{ + private Long sysModuleId; + private String moduleName; + private String moduleUrl; + private Long moduleCategoryId; + private Integer sortNum; + private String moduleTitle; + private String ifShow; + public Long getSysModuleId(){ + return sysModuleId; + } + public void setSysModuleId(Long sysModuleId){ + this.sysModuleId = sysModuleId; + } + public String getModuleName(){ + return moduleName; + } + public void setModuleName(String moduleName){ + this.moduleName = moduleName; + } + public String getModuleUrl(){ + return moduleUrl; + } + public void setModuleUrl(String moduleUrl){ + this.moduleUrl = moduleUrl; + } + public Long getModuleCategoryId(){ + return moduleCategoryId; + } + public void setModuleCategoryId(Long moduleCategoryId){ + this.moduleCategoryId = moduleCategoryId; + } + public Integer getSortNum(){ + return sortNum; + } + public void setSortNum(Integer sortNum){ + this.sortNum = sortNum; + } + public String getModuleTitle(){ + return moduleTitle; + } + public void setModuleTitle(String moduleTitle){ + this.moduleTitle = moduleTitle; + } + public String getIfShow(){ + return ifShow; + } + public void setIfShow(String ifShow){ + this.ifShow = ifShow; + } + +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/defined/SysRoleModulePermissionWithSysPermission.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/defined/SysRoleModulePermissionWithSysPermission.java new file mode 100644 index 0000000..bef22be --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/defined/SysRoleModulePermissionWithSysPermission.java @@ -0,0 +1,63 @@ +package com.passManage.us.admin.rmp.model.defined; + +import com.passManage.us.admin.rmp.model.SysRoleModulePermission; + +import java.io.Serializable; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ +public class SysRoleModulePermissionWithSysPermission extends SysRoleModulePermission implements Serializable{ + private Long sysPermissionId; + private String permissionName; + private String filterPlatform; + private String backendUrlReg; + private String frontDom; + private String frontAction; + private Long sysPermissionModuleId; + public Long getSysPermissionId(){ + return sysPermissionId; + } + public void setSysPermissionId(Long sysPermissionId){ + this.sysPermissionId = sysPermissionId; + } + public String getPermissionName(){ + return permissionName; + } + public void setPermissionName(String permissionName){ + this.permissionName = permissionName; + } + public String getFilterPlatform(){ + return filterPlatform; + } + public void setFilterPlatform(String filterPlatform){ + this.filterPlatform = filterPlatform; + } + public String getBackendUrlReg(){ + return backendUrlReg; + } + public void setBackendUrlReg(String backendUrlReg){ + this.backendUrlReg = backendUrlReg; + } + public String getFrontDom(){ + return frontDom; + } + public void setFrontDom(String frontDom){ + this.frontDom = frontDom; + } + public String getFrontAction(){ + return frontAction; + } + public void setFrontAction(String frontAction){ + this.frontAction = frontAction; + } + public Long getSysPermissionModuleId(){ + return sysPermissionModuleId; + } + public void setSysPermissionModuleId(Long sysPermissionModuleId){ + this.sysPermissionModuleId = sysPermissionModuleId; + } + +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/defined/SysRoleModulePermissionWithSysRole.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/defined/SysRoleModulePermissionWithSysRole.java new file mode 100644 index 0000000..2255634 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/model/defined/SysRoleModulePermissionWithSysRole.java @@ -0,0 +1,28 @@ +package com.passManage.us.admin.rmp.model.defined; + +import com.passManage.us.admin.rmp.model.SysRoleModulePermission; + +import java.io.Serializable; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ +public class SysRoleModulePermissionWithSysRole extends SysRoleModulePermission implements Serializable{ + private Long sysRoleId; + private String roleName; + public Long getSysRoleId(){ + return sysRoleId; + } + public void setSysRoleId(Long sysRoleId){ + this.sysRoleId = sysRoleId; + } + public String getRoleName(){ + return roleName; + } + public void setRoleName(String roleName){ + this.roleName = roleName; + } + +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/SecurityUserDetailService.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/SecurityUserDetailService.java new file mode 100644 index 0000000..c945e20 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/SecurityUserDetailService.java @@ -0,0 +1,13 @@ +package com.passManage.us.admin.rmp.service; + +import org.springframework.security.core.userdetails.UserDetailsService; + +/** + * author: www.magicalcoder.com + * date:2018/7/10 + * function: + * 整合各个sys相关的用户权限service + */ +public interface SecurityUserDetailService extends UserDetailsService { + +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/SysAdminUserService.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/SysAdminUserService.java new file mode 100644 index 0000000..b1880eb --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/SysAdminUserService.java @@ -0,0 +1,15 @@ +package com.passManage.us.admin.rmp.service; + +import com.passManage.us.admin.rmp.model.SysAdminUser; +import com.passManage.us.core.service.ICommonService; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +public interface SysAdminUserService extends ICommonService { + + +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/SysGlobalPermitUrlService.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/SysGlobalPermitUrlService.java new file mode 100644 index 0000000..bb2d85f --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/SysGlobalPermitUrlService.java @@ -0,0 +1,15 @@ +package com.passManage.us.admin.rmp.service; + +import com.passManage.us.admin.rmp.model.SysGlobalPermitUrl; +import com.passManage.us.core.service.ICommonService; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +public interface SysGlobalPermitUrlService extends ICommonService { + + +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/SysLogAdminOperateService.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/SysLogAdminOperateService.java new file mode 100644 index 0000000..115b281 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/SysLogAdminOperateService.java @@ -0,0 +1,15 @@ +package com.passManage.us.admin.rmp.service; + +import com.passManage.us.admin.rmp.model.SysLogAdminOperate; +import com.passManage.us.core.service.ICommonService; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +public interface SysLogAdminOperateService extends ICommonService{ + + +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/SysModuleCategoryService.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/SysModuleCategoryService.java new file mode 100644 index 0000000..0ae5573 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/SysModuleCategoryService.java @@ -0,0 +1,15 @@ +package com.passManage.us.admin.rmp.service; + +import com.passManage.us.admin.rmp.model.SysModuleCategory; +import com.passManage.us.core.service.ICommonService; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +public interface SysModuleCategoryService extends ICommonService{ + + +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/SysModuleService.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/SysModuleService.java new file mode 100644 index 0000000..939bb05 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/SysModuleService.java @@ -0,0 +1,21 @@ +package com.passManage.us.admin.rmp.service; + +import com.passManage.us.admin.rmp.model.SysModule; +import com.passManage.us.core.service.ICommonService; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +public interface SysModuleService extends ICommonService{ + + /** + * 保存模块与权限 + * @param helpConfigPermit 帮助配置权限 + * @param entity 模块实体类 + */ + void saveModule(Boolean helpConfigPermit,SysModule entity); + +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/SysPermissionService.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/SysPermissionService.java new file mode 100644 index 0000000..e7818cc --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/SysPermissionService.java @@ -0,0 +1,15 @@ +package com.passManage.us.admin.rmp.service; + +import com.passManage.us.admin.rmp.model.SysPermission; +import com.passManage.us.core.service.ICommonService; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +public interface SysPermissionService extends ICommonService{ + + +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/SysRoleModulePermissionService.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/SysRoleModulePermissionService.java new file mode 100644 index 0000000..c38a20e --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/SysRoleModulePermissionService.java @@ -0,0 +1,14 @@ +package com.passManage.us.admin.rmp.service; + +import com.passManage.us.admin.rmp.model.SysRoleModulePermission; +import com.passManage.us.core.service.ICommonService; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +public interface SysRoleModulePermissionService extends ICommonService{ + +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/SysRoleService.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/SysRoleService.java new file mode 100644 index 0000000..ba1ac52 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/SysRoleService.java @@ -0,0 +1,15 @@ +package com.passManage.us.admin.rmp.service; + +import com.passManage.us.admin.rmp.model.SysRole; +import com.passManage.us.core.service.ICommonService; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +public interface SysRoleService extends ICommonService{ + + +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/impl/SecurityUserDetailServiceImpl.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/impl/SecurityUserDetailServiceImpl.java new file mode 100644 index 0000000..8225e3d --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/impl/SecurityUserDetailServiceImpl.java @@ -0,0 +1,199 @@ +package com.passManage.us.admin.rmp.service.impl; + +import com.passManage.us.admin.rmp.constant.PermissionConstant; +import com.passManage.us.admin.rmp.dto.*; +import com.passManage.us.admin.rmp.model.*; +import com.passManage.us.admin.rmp.service.*; +import com.passManage.us.core.utils.CopyUtil; +import com.passManage.us.core.utils.ListUtil; +import com.passManage.us.core.utils.MapUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.core.userdetails.UsernameNotFoundException; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.util.*; + +/** + * author: www.magicalcoder.com + * date:2018/7/10 + * function: + */ +@Service +@Slf4j +public class SecurityUserDetailServiceImpl implements SecurityUserDetailService { + @Resource + private SysAdminUserService sysAdminUserService; + @Resource + private SysRoleService sysRoleService; + @Resource + private SysRoleModulePermissionService sysRoleModulePermissionService; + @Resource + private SysPermissionService sysPermissionService; + @Resource + private SysModuleService sysModuleService; + @Resource + private SysModuleCategoryService sysModuleCategoryService; + @Resource + private SysGlobalPermitUrlService sysGlobalPermitUrlService; + @Override + public SysAdminUserDto loadUserByUsername(String username) throws UsernameNotFoundException { + SysAdminUser sysAdminUser = sysAdminUserService.selectOneModelWillThrowException(MapUtil.buildMap("username",username)); + SysAdminUserDto sysAdminUserDto = null; + if(sysAdminUser!=null){ + sysAdminUserDto = new SysAdminUserDto(); + CopyUtil.copy(sysAdminUser,sysAdminUserDto); + Long roleId = sysAdminUser.getRoleId(); + sysAdminUserDto.setSysRoleDto(getRoleDto(roleId)); + List globalUrls = sysGlobalPermitUrlService.getModelList(null); + sysAdminUserDto.setSysGlobalPermitUrlList(globalUrls); + } + return sysAdminUserDto; + } + + private SysRoleDto getRoleDto(Long roleId){ + List sysRoleModulePermissionList = sysRoleModulePermissionService.getModelList(MapUtil.buildMap("roleId",roleId)); + SysRole sysRole = sysRoleService.getModel(roleId); + if(sysRole!=null){ + SysRoleDto sysRoleDto = new SysRoleDto(); + CopyUtil.copy(sysRole,sysRoleDto); + Set moduleIds = moduleIds(sysRoleModulePermissionList); + List moduleDtoList = getModuleDtoList(moduleIds,sysRoleModulePermissionList); + sysRoleDto.setSysModuleCategoryDtoList(getModuleCategoryDtoList(moduleDtoList)); + return sysRoleDto; + } + return null; + } + + //获取分类列表 同时赋值子列表 + private List getModuleCategoryDtoList(List moduleDtoList){ + List copyCategoryDtoList = null; + if(ListUtil.isNotBlank(moduleDtoList)){ + Set categoryIds = new HashSet<>(); + for(SysModuleDto moduleDto:moduleDtoList){ + categoryIds.add(moduleDto.getModuleCategoryId()); + } + List categoryList = sysModuleCategoryService.getModelInList(categoryIds); + for(SysModuleCategory moduleCategory:categoryList){ + if(moduleCategory.getSortNum()==null){ + moduleCategory.setSortNum(0); + } + } + Collections.sort(categoryList, new Comparator() { + @Override + public int compare(SysModuleCategory o1, SysModuleCategory o2) { + return o1.getSortNum().compareTo(o2.getSortNum()); + } + }); + if(ListUtil.isNotBlank(categoryList)){ + Map> listMap = MapUtil.listToListMap("moduleCategoryId",moduleDtoList); + copyCategoryDtoList = CopyUtil.copy(categoryList,SysModuleCategoryDto.class); + for(SysModuleCategoryDto copy:copyCategoryDtoList){ + copy.setSysModuleDtoList(listMap.get(copy.getId())); + } + } + } + return copyCategoryDtoList; + } + + private List getModuleDtoList(Set moduleIds,List sysRoleModulePermissionList){ + List moduleDtoList = new ArrayList<>(moduleIds.size()); + List moduleList = sysModuleService.getModelInList(moduleIds); + if(moduleList!=null){ + for(SysModule module:moduleList){ + if(module.getSortNum()==null){ + module.setSortNum(0); + } + } + Collections.sort(moduleList, new Comparator() { + @Override + public int compare(SysModule o1, SysModule o2) { + return o1.getSortNum().compareTo(o2.getSortNum()); + } + }); + + List permissionDtoList = getAllPermissionDtoList(moduleIds); + Map> modulePermissionListMap = MapUtil.listToListMap("moduleId",permissionDtoList); + + + for(SysModule sysModule:moduleList){ + SysModuleDto sysModuleDto = new SysModuleDto(); + CopyUtil.copy(sysModule,sysModuleDto); + Long moduleId = sysModule.getId(); + //当前模块有哪些权限 + List allPermissionDtoList = modulePermissionListMap.get(moduleId); + if(ListUtil.isNotBlank(allPermissionDtoList)){ + //当前角色下当前模块拥有哪些权限 + Set permissionIds = permissionIds(moduleId,sysRoleModulePermissionList); + Map permissionDtoMap = MapUtil.listToItemMap("id",allPermissionDtoList); + for(Long permissionId:permissionIds){ + SysPermissionDto has = permissionDtoMap.get(permissionId); + if(has!=null){//标记下前端需要的有权限的状态 + has.setHasPermission(true); + } + } + //前端要求的数据 有权限和无权限的都返回 用一个字段标记 + sysModuleDto.setSysPermissionDtoList(allPermissionDtoList); + //后端要求的数据 仅放入当前角色有权限的数据 无权限的过滤干净 + List backendList = filterPermissionList(PermissionConstant.Platform.BACKEND,PermissionConstant.Platform.FRONT_BACKEND,allPermissionDtoList); + for(int i=0;i getAllPermissionDtoList(Set moduleIds){ + if(moduleIds.isEmpty()){ + return new ArrayList<>(); + } + List permissionList = sysPermissionService.getModelList(MapUtil.buildMap("moduleIds",moduleIds)); + return CopyUtil.copy(permissionList,SysPermissionDto.class); + } + + //获取某个模块下配置的所有权限 + private List getAllPermissionDtoList(Long moduleId){ + List permissionList = sysPermissionService.getModelList(MapUtil.buildMap("moduleId",moduleId)); + return CopyUtil.copy(permissionList,SysPermissionDto.class); + } + + private Set moduleIds(List sysRoleModulePermissionList){ + Set moduleIds = new HashSet<>();//保证去重 + for(SysRoleModulePermission item:sysRoleModulePermissionList) { + moduleIds.add(item.getModuleId()); + } + return moduleIds; + } + private Set permissionIds(Long moduleId,List sysRoleModulePermissionList){ + Set permissionIds = new HashSet<>();//保证去重 + for(SysRoleModulePermission item:sysRoleModulePermissionList) { + if(item.getModuleId().compareTo(moduleId)==0){ + permissionIds.add(item.getPermissionId()); + } + } + return permissionIds; + } + + //主要是为了合并双端 + private List filterPermissionList(PermissionConstant.Platform platform, PermissionConstant.Platform orPlatform, List allList){ + if(ListUtil.isNotBlank(allList)){ + List backendList = new ArrayList<>(); + for(SysPermissionDto sysPermissionDto:allList){ + if(sysPermissionDto.getFilterPlatform().equals(platform.getValue()) || sysPermissionDto.getFilterPlatform().equals(orPlatform.getValue())){ + backendList.add(sysPermissionDto); + } + } + return backendList; + } + return null; + } + +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/impl/SysAdminUserServiceImpl.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/impl/SysAdminUserServiceImpl.java new file mode 100644 index 0000000..f1a91f5 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/impl/SysAdminUserServiceImpl.java @@ -0,0 +1,30 @@ + +package com.passManage.us.admin.rmp.service.impl; + +import com.passManage.us.admin.rmp.mapper.SysAdminUserMapper; +import com.passManage.us.admin.rmp.model.SysAdminUser; +import com.passManage.us.admin.rmp.service.SysAdminUserService; +import com.passManage.us.core.service.CommonServiceImpl; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +@Service +public class SysAdminUserServiceImpl extends CommonServiceImpl implements SysAdminUserService,InitializingBean{ + @Resource + private SysAdminUserMapper sysAdminUserMapper; + + + + @Override + public void afterPropertiesSet() { + super.commonMapper = sysAdminUserMapper; + } +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/impl/SysGlobalPermitUrlServiceImpl.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/impl/SysGlobalPermitUrlServiceImpl.java new file mode 100644 index 0000000..a44f4ad --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/impl/SysGlobalPermitUrlServiceImpl.java @@ -0,0 +1,30 @@ + +package com.passManage.us.admin.rmp.service.impl; + +import com.passManage.us.admin.rmp.mapper.SysGlobalPermitUrlMapper; +import com.passManage.us.admin.rmp.model.SysGlobalPermitUrl; +import com.passManage.us.admin.rmp.service.SysGlobalPermitUrlService; +import com.passManage.us.core.service.CommonServiceImpl; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +@Service +public class SysGlobalPermitUrlServiceImpl extends CommonServiceImpl implements SysGlobalPermitUrlService,InitializingBean{ + @Resource + private SysGlobalPermitUrlMapper sysGlobalPermitUrlMapper; + + + + @Override + public void afterPropertiesSet() { + super.commonMapper = sysGlobalPermitUrlMapper; + } +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/impl/SysLogAdminOperateServiceImpl.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/impl/SysLogAdminOperateServiceImpl.java new file mode 100644 index 0000000..5137b01 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/impl/SysLogAdminOperateServiceImpl.java @@ -0,0 +1,30 @@ + +package com.passManage.us.admin.rmp.service.impl; + +import com.passManage.us.admin.rmp.mapper.SysLogAdminOperateMapper; +import com.passManage.us.admin.rmp.model.SysLogAdminOperate; +import com.passManage.us.admin.rmp.service.SysLogAdminOperateService; +import com.passManage.us.core.service.CommonServiceImpl; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +@Service +public class SysLogAdminOperateServiceImpl extends CommonServiceImpl implements SysLogAdminOperateService,InitializingBean{ + @Resource + private SysLogAdminOperateMapper sysLogAdminOperateMapper; + + + + @Override + public void afterPropertiesSet() { + super.commonMapper = sysLogAdminOperateMapper; + } +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/impl/SysModuleCategoryServiceImpl.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/impl/SysModuleCategoryServiceImpl.java new file mode 100644 index 0000000..e7c1c34 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/impl/SysModuleCategoryServiceImpl.java @@ -0,0 +1,30 @@ + +package com.passManage.us.admin.rmp.service.impl; + +import com.passManage.us.admin.rmp.mapper.SysModuleCategoryMapper; +import com.passManage.us.admin.rmp.model.SysModuleCategory; +import com.passManage.us.admin.rmp.service.SysModuleCategoryService; +import com.passManage.us.core.service.CommonServiceImpl; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +@Service +public class SysModuleCategoryServiceImpl extends CommonServiceImpl implements SysModuleCategoryService,InitializingBean{ + @Resource + private SysModuleCategoryMapper sysModuleCategoryMapper; + + + + @Override + public void afterPropertiesSet() { + super.commonMapper = sysModuleCategoryMapper; + } +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/impl/SysModuleServiceImpl.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/impl/SysModuleServiceImpl.java new file mode 100644 index 0000000..8856aa6 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/impl/SysModuleServiceImpl.java @@ -0,0 +1,88 @@ + +package com.passManage.us.admin.rmp.service.impl; + +import com.passManage.us.admin.rmp.constant.PermissionConstant; +import com.passManage.us.admin.rmp.mapper.SysModuleMapper; +import com.passManage.us.admin.rmp.model.SysModule; +import com.passManage.us.admin.rmp.model.SysPermission; +import com.passManage.us.admin.rmp.service.SysModuleService; +import com.passManage.us.admin.rmp.service.SysPermissionService; +import com.passManage.us.core.service.CommonServiceImpl; +import com.passManage.us.core.utils.ListUtil; +import com.passManage.us.core.utils.MapUtil; +import com.passManage.us.core.utils.StringUtil; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import javax.annotation.Resource; +import java.util.List; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +@Service +public class SysModuleServiceImpl extends CommonServiceImpl implements SysModuleService,InitializingBean{ + @Resource + private SysModuleMapper sysModuleMapper; + + @Resource + private SysPermissionService sysPermissionService; + @Override + public void afterPropertiesSet() { + super.commonMapper = sysModuleMapper; + } + + @Transactional + @Override + public void saveModule(Boolean helpConfigPermit,SysModule entity) { + Long id = entity.getId(); + if(entity.getSortNum()==null){ + entity.setSortNum(0); + } + if(id==null){ + insertModel(entity); + }else{ + SysModule dbEntity = getModelNotIgnore(id,"id"); + if(dbEntity==null){// + insertModel(entity); + }else { + updateModel(entity); + } + } + if(helpConfigPermit!=null && helpConfigPermit){//辅助用户 创建此模块下一条默认的所有权限 + Long moduleId = entity.getId(); + String url = entity.getModuleUrl(); + if(StringUtil.isNotBlank(url)){ + String urlReg = "admin/page_v2/(\\w+)/list.*"; + if(url.matches(urlReg)){ + String tableName = url.replaceAll(urlReg,"$1").toLowerCase(); + if(StringUtil.isNotBlank(tableName)){ + String backendUrlReg = "/admin/"+tableName+"_rest/[\\s\\S]*"; + List existPermissionList = this.sysPermissionService.getModelList(MapUtil.buildMap("moduleId",moduleId)); + boolean exist = false; + if(ListUtil.isNotBlank(existPermissionList)){ + for(SysPermission permission : existPermissionList){ + if(backendUrlReg.equals(permission.getBackendUrlReg())){ + exist = true; + break; + } + } + } + if(!exist){ + SysPermission sysPermission = new SysPermission(); + sysPermission.setModuleId(moduleId); + sysPermission.setPermissionName("全部权限"); + sysPermission.setFilterPlatform(PermissionConstant.Platform.BACKEND.getValue());//后端 + sysPermission.setBackendUrlReg(backendUrlReg); + this.sysPermissionService.insertModel(sysPermission); + } + } + } + } + } + } +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/impl/SysPermissionServiceImpl.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/impl/SysPermissionServiceImpl.java new file mode 100644 index 0000000..aaacf20 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/impl/SysPermissionServiceImpl.java @@ -0,0 +1,30 @@ + +package com.passManage.us.admin.rmp.service.impl; + +import com.passManage.us.admin.rmp.mapper.SysPermissionMapper; +import com.passManage.us.admin.rmp.model.SysPermission; +import com.passManage.us.admin.rmp.service.SysPermissionService; +import com.passManage.us.core.service.CommonServiceImpl; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +@Service +public class SysPermissionServiceImpl extends CommonServiceImpl implements SysPermissionService,InitializingBean{ + @Resource + private SysPermissionMapper sysPermissionMapper; + + + + @Override + public void afterPropertiesSet() { + super.commonMapper = sysPermissionMapper; + } +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/impl/SysRoleModulePermissionServiceImpl.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/impl/SysRoleModulePermissionServiceImpl.java new file mode 100644 index 0000000..1d8f8ec --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/impl/SysRoleModulePermissionServiceImpl.java @@ -0,0 +1,30 @@ + +package com.passManage.us.admin.rmp.service.impl; + +import com.passManage.us.admin.rmp.mapper.SysRoleModulePermissionMapper; +import com.passManage.us.admin.rmp.model.SysRoleModulePermission; +import com.passManage.us.admin.rmp.service.SysRoleModulePermissionService; +import com.passManage.us.core.service.CommonServiceImpl; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +@Service +public class SysRoleModulePermissionServiceImpl extends CommonServiceImpl implements SysRoleModulePermissionService,InitializingBean{ + @Resource + private SysRoleModulePermissionMapper sysRoleModulePermissionMapper; + + + + @Override + public void afterPropertiesSet() { + super.commonMapper = sysRoleModulePermissionMapper; + } +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/impl/SysRoleServiceImpl.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/impl/SysRoleServiceImpl.java new file mode 100644 index 0000000..7259758 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/service/impl/SysRoleServiceImpl.java @@ -0,0 +1,30 @@ + +package com.passManage.us.admin.rmp.service.impl; + +import com.passManage.us.admin.rmp.mapper.SysRoleMapper; +import com.passManage.us.admin.rmp.model.SysRole; +import com.passManage.us.admin.rmp.service.SysRoleService; +import com.passManage.us.core.service.CommonServiceImpl; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +@Service +public class SysRoleServiceImpl extends CommonServiceImpl implements SysRoleService,InitializingBean{ + @Resource + private SysRoleMapper sysRoleMapper; + + + + @Override + public void afterPropertiesSet() { + super.commonMapper = sysRoleMapper; + } +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/util/AdminUtil.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/util/AdminUtil.java new file mode 100644 index 0000000..1a10447 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/util/AdminUtil.java @@ -0,0 +1,22 @@ +package com.passManage.us.admin.rmp.util; + +import com.passManage.us.admin.rmp.dto.SysAdminUserDto; +import org.springframework.security.core.context.SecurityContextHolder; + +/** + * author:www.magicalcoder.com + * date:2018/7/17 + * function: + */ +public class AdminUtil { + + public static SysAdminUserDto getAdmin(){ + SysAdminUserDto sysAdminUserDto = (SysAdminUserDto)SecurityContextHolder.getContext().getAuthentication().getPrincipal(); + return sysAdminUserDto; + } + + public static Long getAdminUid(){ + return getAdmin().getId(); + } + +} diff --git a/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/util/HttpReqUtil.java b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/util/HttpReqUtil.java new file mode 100644 index 0000000..b39e87d --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/java/com/passManage/us/admin/rmp/util/HttpReqUtil.java @@ -0,0 +1,65 @@ +package com.passManage.us.admin.rmp.util; + +import com.passManage.us.admin.rmp.constant.PermissionConstant; +import com.passManage.us.core.utils.ListUtil; + +import java.util.*; + +public class HttpReqUtil { + + /** + * 根据首字母排序http入参顺序 + * @param reqMap + * @param dropParamNames + * @return + */ + public static String sortParams(Map reqMap,List dropParamNames){ + StringBuffer sb = new StringBuffer(); + List paramNames = new ArrayList<>(reqMap.size()); + paramNames.addAll(reqMap.keySet()); + if(ListUtil.isNotBlank(dropParamNames)){ + for(String dropParam:dropParamNames){ + paramNames.remove(dropParam); + } + } + if(ListUtil.isBlank(paramNames)){ + return sb.toString(); + } + Collections.sort(paramNames); + for(String paramName : paramNames){ + String[] pv = reqMap.get(paramName); + for(String v:pv){ + sb.append("&").append(paramName).append("=").append(v); + } + } + return sb.substring(1); + } + + public static void main(String[] args) { + Map reqMap = new HashMap<>(); + reqMap.put("hello",new String[]{"你好","很好"}); + reqMap.put("able",new String[]{"true"}); + reqMap.put("test",new String[]{"测试"}); + reqMap.put("date",new String[]{"日期"}); + System.out.println(sortParams(reqMap,Collections.singletonList("date"))); + } + //寻找moduleName + public static String moduleName(String reqUrl){ + if(reqUrl.startsWith(PermissionConstant.ADMIN_PREFIX)){// /admin/tableName/.... + String[] add = reqUrl.split("/"); + if(add.length>=3){ + return add[2]; + } + } + return null; + } + public static String operateType(String reqUrl){ + if(reqUrl.startsWith(PermissionConstant.ADMIN_PREFIX)){// /admin/tableName/.... + String[] add = reqUrl.split("/"); + if(add.length>=4){ + return add[3]; + } + } + return null; + } +} diff --git a/us_passManage/us-admin-rmp/src/main/resources/sqlmap/rmp/SysAdminUserMapper.xml b/us_passManage/us-admin-rmp/src/main/resources/sqlmap/rmp/SysAdminUserMapper.xml new file mode 100644 index 0000000..298f094 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/resources/sqlmap/rmp/SysAdminUserMapper.xml @@ -0,0 +1,477 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + insert into () values() + + + + replace into () values() + + + + insert into () values() + + + + replace into () values() + + + + + insert into () values () + + + + + + replace into () values () + + + + + insert into () values () + + + + + replace into () values () + + + + + + -- truncate table + + + + + delete from + + + + delete from where 1=1 + + + + + delete from where `id` in #{id} + + + + update + + + + update + + + + + update + + + + + update + + + + + + `id`, + `username`, + `password`, + `real_name`, + `email`, + `telephone`, + `mobile_phone`, + `address`, + `create_time`, + `update_time`, + `role_id`, + `account_non_expired`, + `account_non_locked`, + `credentials_non_expired`, + `enabled` + + + + + `id`, + `username`, + `password`, + `real_name`, + `email`, + `telephone`, + `mobile_phone`, + `address`, + `create_time`, + `update_time`, + `role_id`, + `account_non_expired`, + `account_non_locked`, + `credentials_non_expired`, + `enabled` + + + + + `id`, `username`,`password`,`real_name`,`email`,`telephone`,`mobile_phone`,`address`,`create_time`,`update_time`,`role_id`,`account_non_expired`,`account_non_locked`,`credentials_non_expired`,`enabled`, + + + + + #{id}, + #{username},NULL, + #{password},NULL, + #{realName},NULL, + #{email},NULL, + #{telephone},NULL, + #{mobilePhone},NULL, + #{address},NULL, + #{createTime,jdbcType=TIMESTAMP},NULL, + #{updateTime,jdbcType=TIMESTAMP},NULL, + #{roleId},NULL, + #{accountNonExpired},NULL, + #{accountNonLocked},NULL, + #{credentialsNonExpired},NULL, + #{enabled},NULL, + + + + + + `id`, + `username`, + `password`, + `real_name`, + `email`, + `telephone`, + `mobile_phone`, + `address`, + `create_time`, + `update_time`, + `role_id`, + `account_non_expired`, + `account_non_locked`, + `credentials_non_expired`, + `enabled`, + + + + + + #{id}, + #{username}, + #{password}, + #{realName}, + #{email}, + #{telephone}, + #{mobilePhone}, + #{address}, + #{createTime,jdbcType=TIMESTAMP}, + #{updateTime,jdbcType=TIMESTAMP}, + #{roleId}, + #{accountNonExpired}, + #{accountNonLocked}, + #{credentialsNonExpired}, + #{enabled}, + + + + + `id`, `username`,`password`,`real_name`,`email`,`telephone`,`mobile_phone`,`address`,`create_time`,`update_time`,`role_id`,`account_non_expired`,`account_non_locked`,`credentials_non_expired`,`enabled`, + + + + + #{item.id}, + #{item.username},NULL, + #{item.password},NULL, + #{item.realName},NULL, + #{item.email},NULL, + #{item.telephone},NULL, + #{item.mobilePhone},NULL, + #{item.address},NULL, + #{item.createTime,jdbcType=TIMESTAMP},NULL, + #{item.updateTime,jdbcType=TIMESTAMP},NULL, + #{item.roleId},NULL, + #{item.accountNonExpired},NULL, + #{item.accountNonLocked},NULL, + #{item.credentialsNonExpired},NULL, + #{item.enabled},NULL, + + + + + `id`, + `username`, + `password`, + `real_name`, + `email`, + `telephone`, + `mobile_phone`, + `address`, + `create_time`, + `update_time`, + `role_id`, + `account_non_expired`, + `account_non_locked`, + `credentials_non_expired`, + `enabled`, + + + + + + #{item.id}, + #{item.username}, + #{item.password}, + #{item.realName}, + #{item.email}, + #{item.telephone}, + #{item.mobilePhone}, + #{item.address}, + #{item.createTime,jdbcType=TIMESTAMP}, + #{item.updateTime,jdbcType=TIMESTAMP}, + #{item.roleId}, + #{item.accountNonExpired}, + #{item.accountNonLocked}, + #{item.credentialsNonExpired}, + #{item.enabled}, + + + + + `username`=#{username} `username`=NULL , + `password`=#{password} `password`=NULL , + `real_name`=#{realName} `real_name`=NULL , + `email`=#{email} `email`=NULL , + `telephone`=#{telephone} `telephone`=NULL , + `mobile_phone`=#{mobilePhone} `mobile_phone`=NULL , + `address`=#{address} `address`=NULL , + `create_time`=#{createTime,jdbcType=TIMESTAMP} `create_time`=NULL , + `update_time`=#{updateTime,jdbcType=TIMESTAMP} `update_time`=NULL , + `role_id`=#{roleId} `role_id`=NULL , + `account_non_expired`=#{accountNonExpired} `account_non_expired`=NULL , + `account_non_locked`=#{accountNonLocked} `account_non_locked`=NULL , + `credentials_non_expired`=#{credentialsNonExpired} `credentials_non_expired`=NULL , + `enabled`=#{enabled} `enabled`=NULL , + + + + + `username`=#{username}, + `password`=#{password}, + `real_name`=#{realName}, + `email`=#{email}, + `telephone`=#{telephone}, + `mobile_phone`=#{mobilePhone}, + `address`=#{address}, + `create_time`=#{createTime,jdbcType=TIMESTAMP}, + `update_time`=#{updateTime,jdbcType=TIMESTAMP}, + `role_id`=#{roleId}, + `account_non_expired`=#{accountNonExpired}, + `account_non_locked`=#{accountNonLocked}, + `credentials_non_expired`=#{credentialsNonExpired}, + `enabled`=#{enabled}, + + + + where 1=1 + and `id` = #{magicalCoderPrimaryKeyName} + + + where 1=1 + and `id` = #{id} + + + + `username`=#{item.username} `username`=NULL , + `password`=#{item.password} `password`=NULL , + `real_name`=#{item.realName} `real_name`=NULL , + `email`=#{item.email} `email`=NULL , + `telephone`=#{item.telephone} `telephone`=NULL , + `mobile_phone`=#{item.mobilePhone} `mobile_phone`=NULL , + `address`=#{item.address} `address`=NULL , + `create_time`=#{item.createTime,jdbcType=TIMESTAMP} `create_time`=NULL , + `update_time`=#{item.updateTime,jdbcType=TIMESTAMP} `update_time`=NULL , + `role_id`=#{item.roleId} `role_id`=NULL , + `account_non_expired`=#{item.accountNonExpired} `account_non_expired`=NULL , + `account_non_locked`=#{item.accountNonLocked} `account_non_locked`=NULL , + `credentials_non_expired`=#{item.credentialsNonExpired} `credentials_non_expired`=NULL , + `enabled`=#{item.enabled} `enabled`=NULL , + + + + + `username`=#{item.username}, + `password`=#{item.password}, + `real_name`=#{item.realName}, + `email`=#{item.email}, + `telephone`=#{item.telephone}, + `mobile_phone`=#{item.mobilePhone}, + `address`=#{item.address}, + `create_time`=#{item.createTime,jdbcType=TIMESTAMP}, + `update_time`=#{item.updateTime,jdbcType=TIMESTAMP}, + `role_id`=#{item.roleId}, + `account_non_expired`=#{item.accountNonExpired}, + `account_non_locked`=#{item.accountNonLocked}, + `credentials_non_expired`=#{item.credentialsNonExpired}, + `enabled`=#{item.enabled}, + + + + where 1=1 + and `id` = #{item.id} + + + + us.sys_admin_user + + + + and `id` = #{id} + and `username` = #{username} + and `password` = #{password} + and `real_name` = #{realName} + and `email` = #{email} + and `telephone` = #{telephone} + and `mobile_phone` = #{mobilePhone} + and `address` = #{address} + and `create_time` = #{createTime,jdbcType=TIMESTAMP} + and `update_time` = #{updateTime,jdbcType=TIMESTAMP} + and `role_id` = #{roleId} + and `account_non_expired` = #{accountNonExpired} + and `account_non_locked` = #{accountNonLocked} + and `credentials_non_expired` = #{credentialsNonExpired} + and `enabled` = #{enabled} + and username + concat('%',#{usernameFirst},'%') + + and role_id + #{roleIdFirst} + + + + + + + group by + + `id` + `username` + `password` + `real_name` + `email` + `telephone` + `mobile_phone` + `address` + `create_time` + `update_time` + `role_id` + `account_non_expired` + `account_non_locked` + `credentials_non_expired` + `enabled` + + + + + + + order by `id` desc + order by `id` asc + order by `username` desc + order by `username` asc + order by `password` desc + order by `password` asc + order by `real_name` desc + order by `real_name` asc + order by `email` desc + order by `email` asc + order by `telephone` desc + order by `telephone` asc + order by `mobile_phone` desc + order by `mobile_phone` asc + order by `address` desc + order by `address` asc + order by `create_time` desc + order by `create_time` asc + order by `update_time` desc + order by `update_time` asc + order by `role_id` desc + order by `role_id` asc + order by `account_non_expired` desc + order by `account_non_expired` asc + order by `account_non_locked` desc + order by `account_non_locked` asc + order by `credentials_non_expired` desc + order by `credentials_non_expired` asc + order by `enabled` desc + order by `enabled` asc + + + + + + + group by ${notSafeGroupBy} + + order by ${notSafeOrderBy} + LIMIT #{start},#{limit} + + + diff --git a/us_passManage/us-admin-rmp/src/main/resources/sqlmap/rmp/SysGlobalPermitUrlMapper.xml b/us_passManage/us-admin-rmp/src/main/resources/sqlmap/rmp/SysGlobalPermitUrlMapper.xml new file mode 100644 index 0000000..65a4eab --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/resources/sqlmap/rmp/SysGlobalPermitUrlMapper.xml @@ -0,0 +1,290 @@ + + + + + + + + + + + + + + + + + + + + + + + + insert into () values() + + + + replace into () values() + + + + insert into () values() + + + + replace into () values() + + + + + insert into () values () + + + + + + replace into () values () + + + + + insert into () values () + + + + + replace into () values () + + + + + + -- truncate table + + + + + delete from + + + + delete from where 1=1 + + + + + delete from where `id` in #{id} + + + + update + + + + update + + + + + update + + + + + update + + + + + + `id`, + `permit_name`, + `backend_url_reg`, + `module_id` + + + + + `id`, + `permit_name`, + `backend_url_reg`, + `module_id` + + + + + `id`, `permit_name`,`backend_url_reg`,`module_id`, + + + + + #{id}, + #{permitName},NULL, + #{backendUrlReg},NULL, + #{moduleId},NULL, + + + + + + `id`, + `permit_name`, + `backend_url_reg`, + `module_id`, + + + + + + #{id}, + #{permitName}, + #{backendUrlReg}, + #{moduleId}, + + + + + `id`, `permit_name`,`backend_url_reg`,`module_id`, + + + + + #{item.id}, + #{item.permitName},NULL, + #{item.backendUrlReg},NULL, + #{item.moduleId},NULL, + + + + + `id`, + `permit_name`, + `backend_url_reg`, + `module_id`, + + + + + + #{item.id}, + #{item.permitName}, + #{item.backendUrlReg}, + #{item.moduleId}, + + + + + `permit_name`=#{permitName} `permit_name`=NULL , + `backend_url_reg`=#{backendUrlReg} `backend_url_reg`=NULL , + `module_id`=#{moduleId} `module_id`=NULL , + + + + + `permit_name`=#{permitName}, + `backend_url_reg`=#{backendUrlReg}, + `module_id`=#{moduleId}, + + + + where 1=1 + and `id` = #{magicalCoderPrimaryKeyName} + + + where 1=1 + and `id` = #{id} + + + + `permit_name`=#{item.permitName} `permit_name`=NULL , + `backend_url_reg`=#{item.backendUrlReg} `backend_url_reg`=NULL , + `module_id`=#{item.moduleId} `module_id`=NULL , + + + + + `permit_name`=#{item.permitName}, + `backend_url_reg`=#{item.backendUrlReg}, + `module_id`=#{item.moduleId}, + + + + where 1=1 + and `id` = #{item.id} + + + + us.sys_global_permit_url + + + + and `id` = #{id} + and `permit_name` = #{permitName} + and `backend_url_reg` = #{backendUrlReg} + and `module_id` = #{moduleId} + and permit_name + concat('%',#{permitNameFirst},'%') + + and module_id + #{moduleIdFirst} + + + + + + + group by + + `id` + `permit_name` + `backend_url_reg` + `module_id` + + + + + + + order by `id` desc + order by `id` asc + order by `permit_name` desc + order by `permit_name` asc + order by `backend_url_reg` desc + order by `backend_url_reg` asc + order by `module_id` desc + order by `module_id` asc + + + + + + + group by ${notSafeGroupBy} + + order by ${notSafeOrderBy} + LIMIT #{start},#{limit} + + + diff --git a/us_passManage/us-admin-rmp/src/main/resources/sqlmap/rmp/SysLogAdminOperateMapper.xml b/us_passManage/us-admin-rmp/src/main/resources/sqlmap/rmp/SysLogAdminOperateMapper.xml new file mode 100644 index 0000000..db82331 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/resources/sqlmap/rmp/SysLogAdminOperateMapper.xml @@ -0,0 +1,387 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + insert into () values() + + + + replace into () values() + + + + insert into () values() + + + + replace into () values() + + + + + insert into () values () + + + + + + replace into () values () + + + + + insert into () values () + + + + + replace into () values () + + + + + + -- truncate table + + + + + delete from + + + + delete from where 1=1 + + + + + delete from where `id` in #{id} + + + + update + + + + update + + + + + update + + + + + update + + + + + + `id`, + `admin_user_id`, + `user_name`, + `table_name`, + `operate_type`, + `url`, + `primary_id_value`, + `form_body`, + `create_time` + + + + + `id`, + `admin_user_id`, + `user_name`, + `table_name`, + `operate_type`, + `url`, + `primary_id_value`, + `form_body`, + `create_time` + + + + + `id`, `admin_user_id`,`user_name`,`table_name`,`operate_type`,`url`,`primary_id_value`,`form_body`,`create_time`, + + + + + #{id}, + #{adminUserId},NULL, + #{userName},NULL, + #{tableName},NULL, + #{operateType},NULL, + #{url},NULL, + #{primaryIdValue},NULL, + #{formBody},NULL, + #{createTime,jdbcType=TIMESTAMP},NULL, + + + + + + `id`, + `admin_user_id`, + `user_name`, + `table_name`, + `operate_type`, + `url`, + `primary_id_value`, + `form_body`, + `create_time`, + + + + + + #{id}, + #{adminUserId}, + #{userName}, + #{tableName}, + #{operateType}, + #{url}, + #{primaryIdValue}, + #{formBody}, + #{createTime,jdbcType=TIMESTAMP}, + + + + + `id`, `admin_user_id`,`user_name`,`table_name`,`operate_type`,`url`,`primary_id_value`,`form_body`,`create_time`, + + + + + #{item.id}, + #{item.adminUserId},NULL, + #{item.userName},NULL, + #{item.tableName},NULL, + #{item.operateType},NULL, + #{item.url},NULL, + #{item.primaryIdValue},NULL, + #{item.formBody},NULL, + #{item.createTime,jdbcType=TIMESTAMP},NULL, + + + + + `id`, + `admin_user_id`, + `user_name`, + `table_name`, + `operate_type`, + `url`, + `primary_id_value`, + `form_body`, + `create_time`, + + + + + + #{item.id}, + #{item.adminUserId}, + #{item.userName}, + #{item.tableName}, + #{item.operateType}, + #{item.url}, + #{item.primaryIdValue}, + #{item.formBody}, + #{item.createTime,jdbcType=TIMESTAMP}, + + + + + `admin_user_id`=#{adminUserId} `admin_user_id`=NULL , + `user_name`=#{userName} `user_name`=NULL , + `table_name`=#{tableName} `table_name`=NULL , + `operate_type`=#{operateType} `operate_type`=NULL , + `url`=#{url} `url`=NULL , + `primary_id_value`=#{primaryIdValue} `primary_id_value`=NULL , + `form_body`=#{formBody} `form_body`=NULL , + `create_time`=#{createTime,jdbcType=TIMESTAMP} `create_time`=NULL , + + + + + `admin_user_id`=#{adminUserId}, + `user_name`=#{userName}, + `table_name`=#{tableName}, + `operate_type`=#{operateType}, + `url`=#{url}, + `primary_id_value`=#{primaryIdValue}, + `form_body`=#{formBody}, + `create_time`=#{createTime,jdbcType=TIMESTAMP}, + + + + where 1=1 + and `id` = #{magicalCoderPrimaryKeyName} + + + where 1=1 + and `id` = #{id} + + + + `admin_user_id`=#{item.adminUserId} `admin_user_id`=NULL , + `user_name`=#{item.userName} `user_name`=NULL , + `table_name`=#{item.tableName} `table_name`=NULL , + `operate_type`=#{item.operateType} `operate_type`=NULL , + `url`=#{item.url} `url`=NULL , + `primary_id_value`=#{item.primaryIdValue} `primary_id_value`=NULL , + `form_body`=#{item.formBody} `form_body`=NULL , + `create_time`=#{item.createTime,jdbcType=TIMESTAMP} `create_time`=NULL , + + + + + `admin_user_id`=#{item.adminUserId}, + `user_name`=#{item.userName}, + `table_name`=#{item.tableName}, + `operate_type`=#{item.operateType}, + `url`=#{item.url}, + `primary_id_value`=#{item.primaryIdValue}, + `form_body`=#{item.formBody}, + `create_time`=#{item.createTime,jdbcType=TIMESTAMP}, + + + + where 1=1 + and `id` = #{item.id} + + + + us.sys_log_admin_operate + + + + and `id` = #{id} + and `admin_user_id` = #{adminUserId} + and `user_name` = #{userName} + and `table_name` = #{tableName} + and `operate_type` = #{operateType} + and `url` = #{url} + and `primary_id_value` = #{primaryIdValue} + and `form_body` = #{formBody} + and `create_time` = #{createTime,jdbcType=TIMESTAMP} + and admin_user_id + #{adminUserIdFirst} + + and user_name + concat('%',#{userNameFirst},'%') + + and table_name + concat('%',#{tableNameFirst},'%') + + and form_body + concat('%',#{formBodyFirst},'%') + + and create_time =]]> + #{createTimeFirst,jdbcType=TIMESTAMP} + + and create_time + #{createTimeSecond,jdbcType=TIMESTAMP} + + + + + + + group by + + `id` + `admin_user_id` + `user_name` + `table_name` + `operate_type` + `url` + `primary_id_value` + `form_body` + `create_time` + + + + + + + order by `id` desc + order by `id` asc + order by `admin_user_id` desc + order by `admin_user_id` asc + order by `user_name` desc + order by `user_name` asc + order by `table_name` desc + order by `table_name` asc + order by `operate_type` desc + order by `operate_type` asc + order by `url` desc + order by `url` asc + order by `primary_id_value` desc + order by `primary_id_value` asc + order by `form_body` desc + order by `form_body` asc + order by `create_time` desc + order by `create_time` asc + + + + + + + group by ${notSafeGroupBy} + + order by ${notSafeOrderBy} + LIMIT #{start},#{limit} + + + diff --git a/us_passManage/us-admin-rmp/src/main/resources/sqlmap/rmp/SysModuleCategoryMapper.xml b/us_passManage/us-admin-rmp/src/main/resources/sqlmap/rmp/SysModuleCategoryMapper.xml new file mode 100644 index 0000000..2d7f464 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/resources/sqlmap/rmp/SysModuleCategoryMapper.xml @@ -0,0 +1,270 @@ + + + + + + + + + + + + + + + + + + + + + + + insert into () values() + + + + replace into () values() + + + + insert into () values() + + + + replace into () values() + + + + + insert into () values () + + + + + + replace into () values () + + + + + insert into () values () + + + + + replace into () values () + + + + + + -- truncate table + + + + + delete from + + + + delete from where 1=1 + + + + + delete from where `id` in #{id} + + + + update + + + + update + + + + + update + + + + + update + + + + + + `id`, + `module_category_name`, + `sort_num` + + + + + `id`, + `module_category_name`, + `sort_num` + + + + + `id`, `module_category_name`,`sort_num`, + + + + + #{id}, + #{moduleCategoryName},NULL, + #{sortNum},NULL, + + + + + + `id`, + `module_category_name`, + `sort_num`, + + + + + + #{id}, + #{moduleCategoryName}, + #{sortNum}, + + + + + `id`, `module_category_name`,`sort_num`, + + + + + #{item.id}, + #{item.moduleCategoryName},NULL, + #{item.sortNum},NULL, + + + + + `id`, + `module_category_name`, + `sort_num`, + + + + + + #{item.id}, + #{item.moduleCategoryName}, + #{item.sortNum}, + + + + + `module_category_name`=#{moduleCategoryName} `module_category_name`=NULL , + `sort_num`=#{sortNum} `sort_num`=NULL , + + + + + `module_category_name`=#{moduleCategoryName}, + `sort_num`=#{sortNum}, + + + + where 1=1 + and `id` = #{magicalCoderPrimaryKeyName} + + + where 1=1 + and `id` = #{id} + + + + `module_category_name`=#{item.moduleCategoryName} `module_category_name`=NULL , + `sort_num`=#{item.sortNum} `sort_num`=NULL , + + + + + `module_category_name`=#{item.moduleCategoryName}, + `sort_num`=#{item.sortNum}, + + + + where 1=1 + and `id` = #{item.id} + + + + us.sys_module_category + + + + and `id` = #{id} + and `module_category_name` = #{moduleCategoryName} + and `sort_num` = #{sortNum} + and module_category_name + concat('%',#{moduleCategoryNameFirst},'%') + + + + + + + group by + + `id` + `module_category_name` + `sort_num` + + + + + + + order by `id` desc + order by `id` asc + order by `module_category_name` desc + order by `module_category_name` asc + order by `sort_num` desc + order by `sort_num` asc + + + + + + + group by ${notSafeGroupBy} + + order by ${notSafeOrderBy} + LIMIT #{start},#{limit} + + + diff --git a/us_passManage/us-admin-rmp/src/main/resources/sqlmap/rmp/SysModuleMapper.xml b/us_passManage/us-admin-rmp/src/main/resources/sqlmap/rmp/SysModuleMapper.xml new file mode 100644 index 0000000..b6d41db --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/resources/sqlmap/rmp/SysModuleMapper.xml @@ -0,0 +1,344 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + insert into () values() + + + + replace into () values() + + + + insert into () values() + + + + replace into () values() + + + + + insert into () values () + + + + + + replace into () values () + + + + + insert into () values () + + + + + replace into () values () + + + + + + -- truncate table + + + + + delete from + + + + delete from where 1=1 + + + + + delete from where `id` in #{id} + + + + update + + + + update + + + + + update + + + + + update + + + + + + `id`, + `module_name`, + `module_url`, + `module_category_id`, + `sort_num`, + `module_title`, + `if_show` + + + + + `id`, + `module_name`, + `module_url`, + `module_category_id`, + `sort_num`, + `module_title`, + `if_show` + + + + + `id`, `module_name`,`module_url`,`module_category_id`,`sort_num`,`module_title`,`if_show`, + + + + + #{id}, + #{moduleName},NULL, + #{moduleUrl},NULL, + #{moduleCategoryId},NULL, + #{sortNum},NULL, + #{moduleTitle},NULL, + #{ifShow},NULL, + + + + + + `id`, + `module_name`, + `module_url`, + `module_category_id`, + `sort_num`, + `module_title`, + `if_show`, + + + + + + #{id}, + #{moduleName}, + #{moduleUrl}, + #{moduleCategoryId}, + #{sortNum}, + #{moduleTitle}, + #{ifShow}, + + + + + `id`, `module_name`,`module_url`,`module_category_id`,`sort_num`,`module_title`,`if_show`, + + + + + #{item.id}, + #{item.moduleName},NULL, + #{item.moduleUrl},NULL, + #{item.moduleCategoryId},NULL, + #{item.sortNum},NULL, + #{item.moduleTitle},NULL, + #{item.ifShow},NULL, + + + + + `id`, + `module_name`, + `module_url`, + `module_category_id`, + `sort_num`, + `module_title`, + `if_show`, + + + + + + #{item.id}, + #{item.moduleName}, + #{item.moduleUrl}, + #{item.moduleCategoryId}, + #{item.sortNum}, + #{item.moduleTitle}, + #{item.ifShow}, + + + + + `module_name`=#{moduleName} `module_name`=NULL , + `module_url`=#{moduleUrl} `module_url`=NULL , + `module_category_id`=#{moduleCategoryId} `module_category_id`=NULL , + `sort_num`=#{sortNum} `sort_num`=NULL , + `module_title`=#{moduleTitle} `module_title`=NULL , + `if_show`=#{ifShow} `if_show`=NULL , + + + + + `module_name`=#{moduleName}, + `module_url`=#{moduleUrl}, + `module_category_id`=#{moduleCategoryId}, + `sort_num`=#{sortNum}, + `module_title`=#{moduleTitle}, + `if_show`=#{ifShow}, + + + + where 1=1 + and `id` = #{magicalCoderPrimaryKeyName} + + + where 1=1 + and `id` = #{id} + + + + `module_name`=#{item.moduleName} `module_name`=NULL , + `module_url`=#{item.moduleUrl} `module_url`=NULL , + `module_category_id`=#{item.moduleCategoryId} `module_category_id`=NULL , + `sort_num`=#{item.sortNum} `sort_num`=NULL , + `module_title`=#{item.moduleTitle} `module_title`=NULL , + `if_show`=#{item.ifShow} `if_show`=NULL , + + + + + `module_name`=#{item.moduleName}, + `module_url`=#{item.moduleUrl}, + `module_category_id`=#{item.moduleCategoryId}, + `sort_num`=#{item.sortNum}, + `module_title`=#{item.moduleTitle}, + `if_show`=#{item.ifShow}, + + + + where 1=1 + and `id` = #{item.id} + + + + us.sys_module + + + + and `id` = #{id} + and `module_name` = #{moduleName} + and `module_url` = #{moduleUrl} + and `module_category_id` = #{moduleCategoryId} + and `sort_num` = #{sortNum} + and `module_title` = #{moduleTitle} + and `if_show` = #{ifShow} + and module_name + concat('%',#{moduleNameFirst},'%') + + and module_category_id + #{moduleCategoryIdFirst} + + and module_title + concat('%',#{moduleTitleFirst},'%') + + + + + + + group by + + `id` + `module_name` + `module_url` + `module_category_id` + `sort_num` + `module_title` + `if_show` + + + + + + + order by `id` desc + order by `id` asc + order by `module_name` desc + order by `module_name` asc + order by `module_url` desc + order by `module_url` asc + order by `module_category_id` desc + order by `module_category_id` asc + order by `sort_num` desc + order by `sort_num` asc + order by `module_title` desc + order by `module_title` asc + order by `if_show` desc + order by `if_show` asc + + + + + + + group by ${notSafeGroupBy} + + order by ${notSafeOrderBy} + LIMIT #{start},#{limit} + + + diff --git a/us_passManage/us-admin-rmp/src/main/resources/sqlmap/rmp/SysPermissionMapper.xml b/us_passManage/us-admin-rmp/src/main/resources/sqlmap/rmp/SysPermissionMapper.xml new file mode 100644 index 0000000..adb1198 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/resources/sqlmap/rmp/SysPermissionMapper.xml @@ -0,0 +1,347 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + insert into () values() + + + + replace into () values() + + + + insert into () values() + + + + replace into () values() + + + + + insert into () values () + + + + + + replace into () values () + + + + + insert into () values () + + + + + replace into () values () + + + + + + -- truncate table + + + + + delete from + + + + delete from where 1=1 + + + + + delete from where `id` in #{id} + + + + update + + + + update + + + + + update + + + + + update + + + + + + `id`, + `permission_name`, + `filter_platform`, + `backend_url_reg`, + `front_dom`, + `front_action`, + `module_id` + + + + + `id`, + `permission_name`, + `filter_platform`, + `backend_url_reg`, + `front_dom`, + `front_action`, + `module_id` + + + + + `id`, `permission_name`,`filter_platform`,`backend_url_reg`,`front_dom`,`front_action`,`module_id`, + + + + + #{id}, + #{permissionName},NULL, + #{filterPlatform},NULL, + #{backendUrlReg},NULL, + #{frontDom},NULL, + #{frontAction},NULL, + #{moduleId},NULL, + + + + + + `id`, + `permission_name`, + `filter_platform`, + `backend_url_reg`, + `front_dom`, + `front_action`, + `module_id`, + + + + + + #{id}, + #{permissionName}, + #{filterPlatform}, + #{backendUrlReg}, + #{frontDom}, + #{frontAction}, + #{moduleId}, + + + + + `id`, `permission_name`,`filter_platform`,`backend_url_reg`,`front_dom`,`front_action`,`module_id`, + + + + + #{item.id}, + #{item.permissionName},NULL, + #{item.filterPlatform},NULL, + #{item.backendUrlReg},NULL, + #{item.frontDom},NULL, + #{item.frontAction},NULL, + #{item.moduleId},NULL, + + + + + `id`, + `permission_name`, + `filter_platform`, + `backend_url_reg`, + `front_dom`, + `front_action`, + `module_id`, + + + + + + #{item.id}, + #{item.permissionName}, + #{item.filterPlatform}, + #{item.backendUrlReg}, + #{item.frontDom}, + #{item.frontAction}, + #{item.moduleId}, + + + + + `permission_name`=#{permissionName} `permission_name`=NULL , + `filter_platform`=#{filterPlatform} `filter_platform`=NULL , + `backend_url_reg`=#{backendUrlReg} `backend_url_reg`=NULL , + `front_dom`=#{frontDom} `front_dom`=NULL , + `front_action`=#{frontAction} `front_action`=NULL , + `module_id`=#{moduleId} `module_id`=NULL , + + + + + `permission_name`=#{permissionName}, + `filter_platform`=#{filterPlatform}, + `backend_url_reg`=#{backendUrlReg}, + `front_dom`=#{frontDom}, + `front_action`=#{frontAction}, + `module_id`=#{moduleId}, + + + + where 1=1 + and `id` = #{magicalCoderPrimaryKeyName} + + + where 1=1 + and `id` = #{id} + + + + `permission_name`=#{item.permissionName} `permission_name`=NULL , + `filter_platform`=#{item.filterPlatform} `filter_platform`=NULL , + `backend_url_reg`=#{item.backendUrlReg} `backend_url_reg`=NULL , + `front_dom`=#{item.frontDom} `front_dom`=NULL , + `front_action`=#{item.frontAction} `front_action`=NULL , + `module_id`=#{item.moduleId} `module_id`=NULL , + + + + + `permission_name`=#{item.permissionName}, + `filter_platform`=#{item.filterPlatform}, + `backend_url_reg`=#{item.backendUrlReg}, + `front_dom`=#{item.frontDom}, + `front_action`=#{item.frontAction}, + `module_id`=#{item.moduleId}, + + + + where 1=1 + and `id` = #{item.id} + + + + us.sys_permission + + + + and `id` = #{id} + and `permission_name` = #{permissionName} + and `filter_platform` = #{filterPlatform} + and `backend_url_reg` = #{backendUrlReg} + and `front_dom` = #{frontDom} + and `front_action` = #{frontAction} + and `module_id` = #{moduleId} + and permission_name + concat('%',#{permissionNameFirst},'%') + + and filter_platform + #{filterPlatformFirst} + + and module_id + #{moduleIdFirst} + + AND module_id IN + #{item} + + + + + + + group by + + `id` + `permission_name` + `filter_platform` + `backend_url_reg` + `front_dom` + `front_action` + `module_id` + + + + + + + order by `id` desc + order by `id` asc + order by `permission_name` desc + order by `permission_name` asc + order by `filter_platform` desc + order by `filter_platform` asc + order by `backend_url_reg` desc + order by `backend_url_reg` asc + order by `front_dom` desc + order by `front_dom` asc + order by `front_action` desc + order by `front_action` asc + order by `module_id` desc + order by `module_id` asc + + + + + + + group by ${notSafeGroupBy} + + order by ${notSafeOrderBy} + LIMIT #{start},#{limit} + + + diff --git a/us_passManage/us-admin-rmp/src/main/resources/sqlmap/rmp/SysRoleMapper.xml b/us_passManage/us-admin-rmp/src/main/resources/sqlmap/rmp/SysRoleMapper.xml new file mode 100644 index 0000000..56fdc64 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/resources/sqlmap/rmp/SysRoleMapper.xml @@ -0,0 +1,253 @@ + + + + + + + + + + + + + + + + + + + + + + insert into () values() + + + + replace into () values() + + + + insert into () values() + + + + replace into () values() + + + + + insert into () values () + + + + + + replace into () values () + + + + + insert into () values () + + + + + replace into () values () + + + + + + -- truncate table + + + + + delete from + + + + delete from where 1=1 + + + + + delete from where `id` in #{id} + + + + update + + + + update + + + + + update + + + + + update + + + + + + `id`, + `role_name` + + + + + `id`, + `role_name` + + + + + `id`, `role_name`, + + + + + #{id}, + #{roleName},NULL, + + + + + + `id`, + `role_name`, + + + + + + #{id}, + #{roleName}, + + + + + `id`, `role_name`, + + + + + #{item.id}, + #{item.roleName},NULL, + + + + + `id`, + `role_name`, + + + + + + #{item.id}, + #{item.roleName}, + + + + + `role_name`=#{roleName} `role_name`=NULL , + + + + + `role_name`=#{roleName}, + + + + where 1=1 + and `id` = #{magicalCoderPrimaryKeyName} + + + where 1=1 + and `id` = #{id} + + + + `role_name`=#{item.roleName} `role_name`=NULL , + + + + + `role_name`=#{item.roleName}, + + + + where 1=1 + and `id` = #{item.id} + + + + us.sys_role + + + + and `id` = #{id} + and `role_name` = #{roleName} + and role_name + concat('%',#{roleNameFirst},'%') + + + + + + + group by + + `id` + `role_name` + + + + + + + order by `id` desc + order by `id` asc + order by `role_name` desc + order by `role_name` asc + + + + + + + group by ${notSafeGroupBy} + + order by ${notSafeOrderBy} + LIMIT #{start},#{limit} + + + diff --git a/us_passManage/us-admin-rmp/src/main/resources/sqlmap/rmp/SysRoleModulePermissionMapper.xml b/us_passManage/us-admin-rmp/src/main/resources/sqlmap/rmp/SysRoleModulePermissionMapper.xml new file mode 100644 index 0000000..f851642 --- /dev/null +++ b/us_passManage/us-admin-rmp/src/main/resources/sqlmap/rmp/SysRoleModulePermissionMapper.xml @@ -0,0 +1,293 @@ + + + + + + + + + + + + + + + + + + + + + + + + insert into () values() + + + + replace into () values() + + + + insert into () values() + + + + replace into () values() + + + + + insert into () values () + + + + + + replace into () values () + + + + + insert into () values () + + + + + replace into () values () + + + + + + -- truncate table + + + + + delete from + + + + delete from where 1=1 + + + + + delete from where `id` in #{id} + + + + update + + + + update + + + + + update + + + + + update + + + + + + `id`, + `role_id`, + `module_id`, + `permission_id` + + + + + `id`, + `role_id`, + `module_id`, + `permission_id` + + + + + `id`, `role_id`,`module_id`,`permission_id`, + + + + + #{id}, + #{roleId},NULL, + #{moduleId},NULL, + #{permissionId},NULL, + + + + + + `id`, + `role_id`, + `module_id`, + `permission_id`, + + + + + + #{id}, + #{roleId}, + #{moduleId}, + #{permissionId}, + + + + + `id`, `role_id`,`module_id`,`permission_id`, + + + + + #{item.id}, + #{item.roleId},NULL, + #{item.moduleId},NULL, + #{item.permissionId},NULL, + + + + + `id`, + `role_id`, + `module_id`, + `permission_id`, + + + + + + #{item.id}, + #{item.roleId}, + #{item.moduleId}, + #{item.permissionId}, + + + + + `role_id`=#{roleId} `role_id`=NULL , + `module_id`=#{moduleId} `module_id`=NULL , + `permission_id`=#{permissionId} `permission_id`=NULL , + + + + + `role_id`=#{roleId}, + `module_id`=#{moduleId}, + `permission_id`=#{permissionId}, + + + + where 1=1 + and `id` = #{magicalCoderPrimaryKeyName} + + + where 1=1 + and `id` = #{id} + + + + `role_id`=#{item.roleId} `role_id`=NULL , + `module_id`=#{item.moduleId} `module_id`=NULL , + `permission_id`=#{item.permissionId} `permission_id`=NULL , + + + + + `role_id`=#{item.roleId}, + `module_id`=#{item.moduleId}, + `permission_id`=#{item.permissionId}, + + + + where 1=1 + and `id` = #{item.id} + + + + us.sys_role_module_permission + + + + and `id` = #{id} + and `role_id` = #{roleId} + and `module_id` = #{moduleId} + and `permission_id` = #{permissionId} + and role_id + #{roleIdFirst} + + and module_id + #{moduleIdFirst} + + and permission_id + #{permissionIdFirst} + + + + + + + group by + + `id` + `role_id` + `module_id` + `permission_id` + + + + + + + order by `id` desc + order by `id` asc + order by `role_id` desc + order by `role_id` asc + order by `module_id` desc + order by `module_id` asc + order by `permission_id` desc + order by `permission_id` asc + + + + + + + group by ${notSafeGroupBy} + + order by ${notSafeOrderBy} + LIMIT #{start},#{limit} + + + diff --git a/us_passManage/us-admin-service/pom.xml b/us_passManage/us-admin-service/pom.xml new file mode 100644 index 0000000..894ba49 --- /dev/null +++ b/us_passManage/us-admin-service/pom.xml @@ -0,0 +1,24 @@ + + 4.0.0 + + com.passManage + us + 0.0.1-SNAPSHOT + + us-admin-service + us-admin-service + + + + com.passManage + us-admin-rmp + 0.0.1-SNAPSHOT + + + com.passManage + us-service + 0.0.1-SNAPSHOT + + + + diff --git a/us_passManage/us-admin-service/src/main/java/com/passManage/us/admin/adminservice/demo/mapper/AdminServiceDemoMapper.java b/us_passManage/us-admin-service/src/main/java/com/passManage/us/admin/adminservice/demo/mapper/AdminServiceDemoMapper.java new file mode 100644 index 0000000..e076ccd --- /dev/null +++ b/us_passManage/us-admin-service/src/main/java/com/passManage/us/admin/adminservice/demo/mapper/AdminServiceDemoMapper.java @@ -0,0 +1,11 @@ +package com.passManage.us.admin.adminservice.demo.mapper; + +import com.passManage.us.admin.model.MyDemo; + + +import java.util.Map; + +public interface AdminServiceDemoMapper { + MyDemo daoDemoGoods(Map query); + +} diff --git a/us_passManage/us-admin-service/src/main/java/com/passManage/us/admin/adminservice/demo/service/AdminServiceDemoService.java b/us_passManage/us-admin-service/src/main/java/com/passManage/us/admin/adminservice/demo/service/AdminServiceDemoService.java new file mode 100644 index 0000000..045e6ed --- /dev/null +++ b/us_passManage/us-admin-service/src/main/java/com/passManage/us/admin/adminservice/demo/service/AdminServiceDemoService.java @@ -0,0 +1,10 @@ +package com.passManage.us.admin.adminservice.demo.service; + +import com.passManage.us.admin.model.MyDemo; + + +public interface AdminServiceDemoService { + + MyDemo demoGoods(Long id); + +} diff --git a/us_passManage/us-admin-service/src/main/java/com/passManage/us/admin/adminservice/demo/service/impl/AdminServiceDemoServiceImpl.java b/us_passManage/us-admin-service/src/main/java/com/passManage/us/admin/adminservice/demo/service/impl/AdminServiceDemoServiceImpl.java new file mode 100644 index 0000000..0b6edfd --- /dev/null +++ b/us_passManage/us-admin-service/src/main/java/com/passManage/us/admin/adminservice/demo/service/impl/AdminServiceDemoServiceImpl.java @@ -0,0 +1,20 @@ +package com.passManage.us.admin.adminservice.demo.service.impl; + +import com.passManage.us.admin.adminservice.demo.mapper.AdminServiceDemoMapper; +import com.passManage.us.admin.adminservice.demo.service.AdminServiceDemoService; +import com.passManage.us.admin.model.MyDemo; +import com.passManage.us.core.utils.MapUtil; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +@Service +public class AdminServiceDemoServiceImpl implements AdminServiceDemoService { + @Resource + private AdminServiceDemoMapper adminServiceDemoMapper; + + @Override + public MyDemo demoGoods(Long id) { + return adminServiceDemoMapper.daoDemoGoods(MapUtil.buildMap("id",id)); + } +} diff --git a/us_passManage/us-admin-service/src/main/java/com/passManage/us/admin/model/MyDemo.java b/us_passManage/us-admin-service/src/main/java/com/passManage/us/admin/model/MyDemo.java new file mode 100644 index 0000000..3b91709 --- /dev/null +++ b/us_passManage/us-admin-service/src/main/java/com/passManage/us/admin/model/MyDemo.java @@ -0,0 +1,13 @@ +package com.passManage.us.admin.model; + +public class MyDemo { + private Long id; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } +} diff --git a/us_passManage/us-admin-service/src/main/resources/sqlmap/AdminServiceDemoMapper.xml b/us_passManage/us-admin-service/src/main/resources/sqlmap/AdminServiceDemoMapper.xml new file mode 100644 index 0000000..917d134 --- /dev/null +++ b/us_passManage/us-admin-service/src/main/resources/sqlmap/AdminServiceDemoMapper.xml @@ -0,0 +1,16 @@ + + + + + + + + + + diff --git a/us_passManage/us-admin/README.md b/us_passManage/us-admin/README.md new file mode 100644 index 0000000..d20893b --- /dev/null +++ b/us_passManage/us-admin/README.md @@ -0,0 +1,152 @@ +启动 +java -jar us-admin.jar --spring.profiles.active=deploy + +编码约定: + url: /admin/{表名称}/operate + 表名称就是模块名称 所有后端接口必须遵从此约定;这样系统会自动判断角色权限; + + 关于operate起名规范 + insert + update + save + delete + get + batch_xxx + audit_pass + reject + 等等 + + method:重要 + POST:仅用于更改数据 系统默认会自动对POST请求记录操作日志 + GET: 仅用于查询数据 系统不会记录日志 + 其他:不推荐使用 系统无日志记录 + + java:AdminXxxController AdminXxxService AdminXxxServiceImpl AdminXxxMapper AdminXxx +通用工具类: + AdminUtil 获取登录人员详细 + +统一路径映射: + 所有关于后端界面的地方 参考AdminRmpController + /admin/page_v2/{tableName}/{list|edit} + + +前端: +如何顺利引入各种组件 +采取样式名 +日期:magicalcoder-laydate + + id 或 name:必须有存在1个 否则无法绑定 laydate控件用一个选择器绑定多个就会出问题 +富文本:magicalcoder-layedit + + id:必须存在 参考layedit文档 + lay-verify:校验器自动同步 必须 (id+"VerifyEdit") +文件上传:magicalcoder-layupload + + + input : id 或 name 必须有一个 并且请保证一致 + 注 意a_{name} img_{name} 取名规范 + + +switch切换:magicalcoder-layswitch +先被form包裹 +
            + +
            + data-identify:会智能ajax更新后端数据 + lay-filter:保证跟name一致 事件名称 + +外键-select2:magicalcoder-foreign-select2 + data-value: + 是否ajax预先赋值 不为空会调用后台接口 + 为空不调用 + :可以预设初值 一般在列表页显示 因为不能全量一个个读取后台接口 赋值,效率很低,所以一般给个数据库存的比如主键 + 如果把select改成 div也能展示出来 记得把class中的layui-input去掉 其他参数不用改 + data-id: 返回列表中item的属性名 将作为select的 option 的value + data-text-fields: 返回列表中item的属性名 将作为select 的option的内容 + +普通下拉-select2:magicalcoder-single-select2 + +普通多选下拉-select2:magicalcoder-multiply-select2 + +表格内普通下拉-select2:magicalcoder-table-single-select2 + +表格内普通多选下拉-select2:magicalcoder-table-multiply-select2 + +表格内外键下拉-select2:magicalcoder-table-foreign-select2 + +表格内普通输入框 :magicalcoder-table-text + +关于select2插件的使用 + +data-value:默认值 比如编辑页面 可以为空 +data-url:将要进行搜索的地址 +data-id data-text-fields:搜索完 根据返回结果要读取的{id : item.id,text:item.name+||+item.keyword} 返回给select2 并展示下来中 + 如果把select改成 div也能展示出来 记得把class中的layui-input去掉 其他参数不用改 + + +表格内 +
            + data-primary-fields:这个表有很多增删改查 基于的主键名称 + +滑块 +magicalcoder-slider +magicalcoder-table-slider + +颜色选择器 +magicalcoder-color-picker +magicalcoder-table-color-picker + +评分 +magicalcoder-rate +magicalcoder-table-rate + +代码修饰器 +magicalcoder-code +magicalcoder-table-code + + +通用js html使用v0xx来区分版本 避免因为升级导致以前生成的代码无法正常运行 + +##浏览器跨域: + + +例如 当前启动的是localhost:18080 而你访问localhost:18081 +那么请在localhost:18080端写好上面的跨域js +请在localhost:18081的application-xx.yml 添加allowOrigin: http://localhost:18080 +因为是从18080跨域访问18081 所以要配置到18081的allowOrigin才行 + + +##城市树组件 请参考 E:\workspace\cy\us\us_mysql\us-admin\src\main\resources\static\assets\magicalcoder\v103\crud\component\mc-city-tree.js + +#如何配置全局地址过滤: + 使用场景:有些接口 针对所有角色都可访问 此时 我们不必再一一去配置每个角色 + 配置方法:打开sys_global_permit_url 表 配置一条正则 注意任意字符 建议用[\s\S]*结尾 + 示例:/admin/sys_admin_user_rest/get[\s\S]* + 验证:重新登录 注意 所有权限相关配置 都要重新登录方能生效 diff --git a/us_passManage/us-admin/pom.xml b/us_passManage/us-admin/pom.xml new file mode 100644 index 0000000..148d3a3 --- /dev/null +++ b/us_passManage/us-admin/pom.xml @@ -0,0 +1,101 @@ + + + 4.0.0 + + com.passManage + us + 0.0.1-SNAPSHOT + + us-admin + jar + us-admin + http://maven.apache.org + + + + + us-admin + + + + org.codehaus.mojo + exec-maven-plugin + 1.6.0 + + + test + + java + + + com.passManage.us.admin.YouyaBootAdminApplication + + + + + + + + + + + + us-admin + + + org.springframework.boot + spring-boot-maven-plugin + + + + repackage + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + ${java.version} + ${java.version} + + + + + + + com.passManage + us-admin-service + 0.0.1-SNAPSHOT + + + org.springframework.boot + spring-boot-starter-test + test + + + org.bouncycastle + bcprov-jdk15on + 1.68 + + + + com.yahoo.platform.yui + yuicompressor + test + + + com.google.code.gson + gson + 2.8.6 + + + diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/YouyaBootAdminApplication.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/YouyaBootAdminApplication.java new file mode 100644 index 0000000..fc4796e --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/YouyaBootAdminApplication.java @@ -0,0 +1,25 @@ +package com.passManage.us.admin; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.context.annotation.ComponentScan; + +@SpringBootApplication +@ComponentScan(basePackages = { + "com.passManage.us.core", + "com.passManage.us.service", + "com.passManage.us.admin" + }) +/*让过滤器WebFilter生效*/ +@ServletComponentScan(basePackages = { + "com.passManage.us.admin.common.filter", + "com.passManage.us.admin.rmp.common.filter" +}) +public class YouyaBootAdminApplication { + + public static void main(String[] args) { + SpringApplication.run(YouyaBootAdminApplication.class, args); + } + +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/api/ppassinstant/AdminPpassInstantRestController.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/api/ppassinstant/AdminPpassInstantRestController.java new file mode 100644 index 0000000..e8b1396 --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/api/ppassinstant/AdminPpassInstantRestController.java @@ -0,0 +1,103 @@ +package com.passManage.us.admin.api.ppassinstant; + +import com.passManage.us.core.service.CommonRestController; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.util.Date; +import java.sql.Time; +import java.sql.Timestamp; +import java.math.*; +import java.util.List; +import java.util.Map; +import java.util.HashMap; +import java.util.Set; +import com.passManage.us.core.common.constant.PageConstant; +import com.passManage.us.core.common.exception.BusinessException; +import com.passManage.us.core.serialize.ResponseMsg; +import com.passManage.us.model.PpassInstant; +import com.passManage.us.service.ppassinstant.service.PpassInstantService; + +import com.passManage.us.core.utils.ListUtil; +import com.passManage.us.core.utils.MapUtil; +import com.passManage.us.core.utils.StringUtil; + + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 软件作者:何栋宇 qq:709876443 +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:648595928 +*/ + +@RequestMapping("/admin/p_pass_instant_rest/") +@RestController +public class AdminPpassInstantRestController extends CommonRestController implements InitializingBean +{ + + @Resource + private PpassInstantService ppassInstantService; + + //分页查询 + @RequestMapping(value={"page"}, method={RequestMethod.GET}) + public ResponseMsg page( + @RequestParam(required = false,value ="passIdFirst") Integer passIdFirst , + @RequestParam(required = false,value ="passNameFirst") String passNameFirst , + @RequestParam(required = false,value ="passLengthFirst") Integer passLengthFirst , + @RequestParam(required = false,value ="passTypeFirst") String passTypeFirst , + @RequestParam(required = false,value ="passExpiryFirst") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")Date passExpiryFirst , + @RequestParam(required = false,value ="passExpirySecond") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")Date passExpirySecond , + @RequestParam(required = false,value ="passCreatetimeFirst") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")Date passCreatetimeFirst , + @RequestParam(required = false,value ="passCreatetimeSecond") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")Date passCreatetimeSecond , + @RequestParam(required = false,value ="passUseridFirst") Integer passUseridFirst , + @RequestParam int page,@RequestParam int limit,@RequestParam(required = false) String safeOrderBy + ,HttpServletResponse response,@RequestParam(required = false) Integer queryType + ){ + Map query = new HashMap(); + query.put("passIdFirst",passIdFirst); + query.put("passNameFirst",coverBlankToNull(passNameFirst)); + query.put("passLengthFirst",passLengthFirst); + query.put("passTypeFirst",coverBlankToNull(passTypeFirst)); + query.put("passExpiryFirst",passExpiryFirst); + query.put("passExpirySecond",passExpirySecond); + query.put("passCreatetimeFirst",passCreatetimeFirst); + query.put("passCreatetimeSecond",passCreatetimeSecond); + query.put("passUseridFirst",passUseridFirst); + Integer count = ppassInstantService.getModelListCount(query); + if(StringUtil.isBlank(safeOrderBy)){ + query.put("notSafeOrderBy","pass_id desc"); + }else{ + query.put("safeOrderBy",safeOrderBy); + } + if(queryType==null || queryType == QUERY_TYPE_SEARCH){//普通查询 + limit = Math.min(limit, PageConstant.MAX_LIMIT); + query.put("start",(page - 1) * limit);query.put("limit",limit); + return new ResponseMsg(count,ppassInstantService.getModelList(query)); + }else if(queryType == QUERY_TYPE_EXPORT_EXCEL){ + query.put("start",(page - 1) * limit);query.put("limit",limit); + exportExcel(response,ppassInstantService.getModelList(query),"p_pass_instant", + new String[]{"密钥UUID","密钥名称","密钥长度","密钥类型","第一子密钥","第二子密钥","第三子密钥","密钥有效期","密钥上传时间","密钥使用者"}, + new String[]{"","","","","","","","","",""}); + } + return null; + } + + @Override + public void afterPropertiesSet() throws Exception { + super.commonService = ppassInstantService; + super.primaryKey = "passId";//硬编码此实体的主键名称 + } + + /** + * 手工提醒更新密钥 + * @param id + * @return + */ + @RequestMapping(value = "/updateKeyAlert",method = RequestMethod.GET) + public ResponseMsg updateKeyAlert(@RequestParam("id")String id){ + String updateMsg = ppassInstantService.updateKeyAlert(id); + return new ResponseMsg(200,updateMsg); + } +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/api/ppassold/AdminPpassOldRestController.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/api/ppassold/AdminPpassOldRestController.java new file mode 100644 index 0000000..a30d844 --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/api/ppassold/AdminPpassOldRestController.java @@ -0,0 +1,92 @@ +package com.passManage.us.admin.api.ppassold; + +import com.passManage.us.core.service.CommonRestController; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.web.bind.annotation.*; +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.util.Date; +import java.sql.Time; +import java.sql.Timestamp; +import java.math.*; +import java.util.List; +import java.util.Map; +import java.util.HashMap; +import java.util.Set; +import com.passManage.us.core.common.constant.PageConstant; +import com.passManage.us.core.common.exception.BusinessException; +import com.passManage.us.core.serialize.ResponseMsg; +import com.passManage.us.model.PpassOld; +import com.passManage.us.service.ppassold.service.PpassOldService; + +import com.passManage.us.core.utils.ListUtil; +import com.passManage.us.core.utils.MapUtil; +import com.passManage.us.core.utils.StringUtil; + + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 软件作者:何栋宇 qq:709876443 +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:648595928 +*/ + +@RequestMapping("/admin/p_pass_old_rest/") +@RestController +public class AdminPpassOldRestController extends CommonRestController implements InitializingBean +{ + + @Resource + private PpassOldService ppassOldService; + + //分页查询 + @RequestMapping(value={"page"}, method={RequestMethod.GET}) + public ResponseMsg page( + @RequestParam(required = false,value ="passIdFirst") Integer passIdFirst , + @RequestParam(required = false,value ="passNameFirst") String passNameFirst , + @RequestParam(required = false,value ="passLengthFirst") Integer passLengthFirst , + @RequestParam(required = false,value ="passTypeFirst") String passTypeFirst , + @RequestParam(required = false,value ="passExpiryFirst") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")Date passExpiryFirst , + @RequestParam(required = false,value ="passExpirySecond") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")Date passExpirySecond , + @RequestParam(required = false,value ="passCreatetimeFirst") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")Date passCreatetimeFirst , + @RequestParam(required = false,value ="passCreatetimeSecond") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")Date passCreatetimeSecond , + @RequestParam(required = false,value ="passUseridFirst") Integer passUseridFirst , + @RequestParam int page,@RequestParam int limit,@RequestParam(required = false) String safeOrderBy + ,HttpServletResponse response,@RequestParam(required = false) Integer queryType + ){ + Map query = new HashMap(); + query.put("passIdFirst",passIdFirst); + query.put("passNameFirst",coverBlankToNull(passNameFirst)); + query.put("passLengthFirst",passLengthFirst); + query.put("passTypeFirst",coverBlankToNull(passTypeFirst)); + query.put("passExpiryFirst",passExpiryFirst); + query.put("passExpirySecond",passExpirySecond); + query.put("passCreatetimeFirst",passCreatetimeFirst); + query.put("passCreatetimeSecond",passCreatetimeSecond); + query.put("passUseridFirst",passUseridFirst); + Integer count = ppassOldService.getModelListCount(query); + if(StringUtil.isBlank(safeOrderBy)){ + query.put("notSafeOrderBy","pass_id desc"); + }else{ + query.put("safeOrderBy",safeOrderBy); + } + if(queryType==null || queryType == QUERY_TYPE_SEARCH){//普通查询 + limit = Math.min(limit, PageConstant.MAX_LIMIT); + query.put("start",(page - 1) * limit);query.put("limit",limit); + return new ResponseMsg(count,ppassOldService.getModelList(query)); + }else if(queryType == QUERY_TYPE_EXPORT_EXCEL){ + query.put("start",(page - 1) * limit);query.put("limit",limit); + exportExcel(response,ppassOldService.getModelList(query),"p_pass_old", + new String[]{"密钥UUID","密钥名称","密钥长度","密钥类型","第一子密钥","第二子密钥","第三子密钥","密钥有效期","密钥上传时间","密钥使用者"}, + new String[]{"","","","","","","","","",""}); + } + return null; + } + + @Override + public void afterPropertiesSet() throws Exception { + super.commonService = ppassOldService; + super.primaryKey = "passId";//硬编码此实体的主键名称 + } +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/api/remote/RemoteController.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/api/remote/RemoteController.java new file mode 100644 index 0000000..6a4023d --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/api/remote/RemoteController.java @@ -0,0 +1,219 @@ +package com.passManage.us.admin.api.remote; + +import com.alibaba.fastjson.JSONObject; +import com.google.gson.Gson; +import com.google.gson.JsonObject; +import com.passManage.us.admin.common.KeyUtils.Sm4Util; +import com.passManage.us.admin.common.util.DateUtils; +import com.passManage.us.admin.common.util.HttpUtils; +import com.passManage.us.admin.common.util.R; +import com.passManage.us.admin.common.util.ResolveResponUtils; +import com.passManage.us.admin.rmp.model.SysAdminUser; +import com.passManage.us.admin.rmp.service.SysAdminUserService; +import com.passManage.us.core.utils.Md5Util; +import com.passManage.us.model.PpassInstant; +import com.passManage.us.model.PpassOld; +import com.passManage.us.service.ppassinstant.service.PpassInstantService; +import com.passManage.us.service.ppassold.service.PpassOldService; +import org.springframework.beans.BeanUtils; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Controller; +import org.springframework.util.CollectionUtils; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@RequestMapping("/remote") +@Controller +public class RemoteController { + + @Resource + private SysAdminUserService sysAdminUserService; + + @Resource + private RedisTemplate redisUtils; + + @Resource + private PpassInstantService ppassInstantService; + + @Resource + private PpassOldService ppassOldService; + + @Resource + private ResolveResponUtils resolveResponUtils; + + + @RequestMapping("/remoteauth") + @ResponseBody + public R remoteUserLogin(@RequestParam("userEncrypt") String userEncrypt, @RequestParam("username") String username) { + String sessionkey = redisUtils.opsForValue().get(username); + String decryptUser = Sm4Util.decryptEcb(sessionkey, userEncrypt); + Gson gson = new Gson(); + JsonObject jsonObject = gson.fromJson(decryptUser, JsonObject.class); + String password = Md5Util.md5Encode(jsonObject.get("password").toString().replaceAll("\"","")); + Map hashMap = new HashMap<>(); + hashMap.put("username", username); + hashMap.put("password", password); + List modelList = sysAdminUserService.getModelList(hashMap); + if (CollectionUtils.isEmpty(modelList)) { + return new R().put("auth", false); + } else { + return new R().put("auth", true); + } + } + + @RequestMapping("/saveUserSM4KEY") + public void saveUserSM4KEY(@RequestParam("sessionkey") String sessionkey, @RequestParam("username") String username) { + redisUtils.opsForValue().set(username, sessionkey); + } + + @RequestMapping("/getKeyList/{username}") + @ResponseBody + public R getKeyList(HttpServletRequest request,@PathVariable("username")String user){ + Map hashMap = new HashMap<>(); + Map paramMap = new HashMap<>(); + paramMap.put("username",user); + List modelList = sysAdminUserService.getModelList(paramMap); + hashMap.put("passUserid",modelList.get(0).getId()); + List ppassInstantList = ppassInstantService.getModelList(hashMap); + String sessionKey = redisUtils.opsForValue().get(user); + Gson gson =new Gson(); + String ppassInstant = gson.toJson(ppassInstantList); + String sm4Post = Sm4Util.encryptEcb(sessionKey, ppassInstant); + return R.ok().put("encryptData", sm4Post); + } + + @RequestMapping("/keySaveJson/{userName}") + @ResponseBody + public R uploadUserKey(@RequestBody PpassInstant ppassInstant,@PathVariable("userName")String userName){ + Map hashMap = new HashMap<>(); + hashMap.put("username",userName); + List modelList = sysAdminUserService.getModelList(hashMap); + ppassInstant.setPassUserid(Integer.parseInt(modelList.get(0).getId()+"")); + int i = ppassInstantService.insertModel(ppassInstant); + boolean flag = i == 1; + String sessionkey = redisUtils.opsForValue().get(userName); + String flagStr = Sm4Util.encryptEcb(sessionkey, flag + ""); + return R.ok().put("flag",flagStr).put("keyId",ppassInstant.getPassId()); + } + + @RequestMapping("/getKeyById/{keyId}/{username}") + @ResponseBody + public R returnKeyById(@PathVariable("keyId")String keyId,@PathVariable("username")String username){ + Map hashMap = new HashMap<>(); + hashMap.put("passId",keyId); + List perPass = ppassInstantService.getModelList(hashMap); + String sessionKey = redisUtils.opsForValue().get(username); + String sm4Key= ""; + R ok = R.ok(); + if(perPass.get(0).getPassType().equals("SM2")){ + sm4Key = Sm4Util.encryptEcb(sessionKey, "pubKey:"+perPass.get(0).getPassChildfir()+"\n\npriKey:"+perPass.get(0).getPassChildsec()); + ok.put("keydata",sm4Key); + ok.put("keytype",Sm4Util.encryptEcb(sessionKey,"SM2")); + ok.put("keyId",Sm4Util.encryptEcb(sessionKey,perPass.get(0).getPassId()+"")); + return ok; + }else if(perPass.get(0).getPassType().equals("SM4")){ + sm4Key = Sm4Util.encryptEcb(sessionKey, perPass.get(0).getPassChildfir()); + ok.put("keydata",sm4Key); + ok.put("keytype",Sm4Util.encryptEcb(sessionKey,"SM4")); + ok.put("keyId",Sm4Util.encryptEcb(sessionKey,perPass.get(0).getPassId()+"")); + return ok; + }else if(perPass.get(0).getPassType().equals("AES")){ + sm4Key = Sm4Util.encryptEcb(sessionKey, perPass.get(0).getPassChildfir()); + ok.put("keydata",sm4Key); + ok.put("keytype",Sm4Util.encryptEcb(sessionKey,"AES")); + ok.put("keyId",Sm4Util.encryptEcb(sessionKey,perPass.get(0).getPassId()+"")); + return ok; + }else if(perPass.get(0).getPassType().equals("DES")){ + sm4Key = Sm4Util.encryptEcb(sessionKey, perPass.get(0).getPassChildfir()); + ok.put("keydata",sm4Key); + ok.put("keytype",Sm4Util.encryptEcb(sessionKey,"DES")); + ok.put("keyId",Sm4Util.encryptEcb(sessionKey,perPass.get(0).getPassId()+"")); + return ok; + }else if(perPass.get(0).getPassType().equals("RSA")){ + sm4Key = Sm4Util.encryptEcb(sessionKey, "pubKey:"+perPass.get(0).getPassChildfir()+"\n\npriKey:"+perPass.get(0).getPassChildsec()); + ok.put("keydata",sm4Key); + ok.put("keytype",Sm4Util.encryptEcb(sessionKey,"RSA")); + ok.put("keyId",Sm4Util.encryptEcb(sessionKey,perPass.get(0).getPassId()+"")); + return ok; + }else { + return ok.put("keydata",""); + } + + } + + @RequestMapping(value = "/updateKey/{keyId}/{username}",method = RequestMethod.GET) + @ResponseBody + public R updateKeyString(@PathVariable("keyId")String keyId,@PathVariable("username")String username){ + Map hashMap = new HashMap<>(); + hashMap.put("passId",keyId); + PpassInstant ppassInstant = ppassInstantService.getModelList(hashMap).get(0); + Date passExpiry = ppassInstant.getPassExpiry(); + ppassInstant.setPassExpiry(DateUtils.rollDay(passExpiry,30)); + int count = ppassInstantService.updateModel(ppassInstant); + Boolean flag = false; + String sessionkey = redisUtils.opsForValue().get(username); + if(count==1){ + flag =true; + }else{ + flag =false; + } + String flagdata = Sm4Util.encryptEcb(sessionkey, flag + ""); + return R.ok().put("flag",flagdata); + } + + @RequestMapping("changpwd/{username}") + @ResponseBody + public R changpwd(HttpServletRequest request, HttpServletResponse response,@RequestBody R r,@PathVariable("username")String username){ + String sessionKey = redisUtils.opsForValue().get(username); + String encryptData = Sm4Util.decryptEcb(sessionKey, r.get("encryptData")+""); + Gson gson = new Gson(); + JSONObject jsonObject = gson.fromJson(encryptData, JSONObject.class); + String oldpasswordMD5 = Md5Util.md5Encode(jsonObject.get("oldpassword").toString().replaceAll("\"", "")); + Map hashMap = new HashMap<>(); + hashMap.put("username", username); + hashMap.put("password", oldpasswordMD5); + List modelList = sysAdminUserService.getModelList(hashMap); + if(!CollectionUtils.isEmpty(modelList)){ + SysAdminUser sysAdminUser = modelList.get(0); + sysAdminUser.setPassword( Md5Util.md5Encode(jsonObject.get("newpassword").toString().replaceAll("\"", ""))); + sysAdminUserService.updateModel(sysAdminUser); + return new R().put("flag", true); + } else { + return new R().put("flag", false); + } + } + + @RequestMapping("register") + @ResponseBody + public R remoteRegister(@RequestParam("username")String username,@RequestParam("password")String password) throws Exception { + SysAdminUser sysAdminUser = new SysAdminUser(); + sysAdminUser.setRoleId(2L); + sysAdminUser.setEnabled(true); + sysAdminUser.setAccountNonLocked(false); + sysAdminUser.setAccountNonExpired(false); + sysAdminUser.setCredentialsNonExpired(false); + sysAdminUser.setUsername(username); + sysAdminUser.setPassword(Md5Util.md5Encode(password)); + sysAdminUserService.insertModel(sysAdminUser); + HttpUtils.get("http://localhost:18087/remote/setUserName/"+username,null); + return R.ok().put("flag","true"); + } + + @RequestMapping("/deleteKey/{keyId}/{userName}") + @ResponseBody + public R deleteKey(@PathVariable("keyId")String keyId, @PathVariable("userName")String userName){ + PpassInstant model = ppassInstantService.getModel(Integer.parseInt(keyId)); + PpassOld ppassOld = new PpassOld(); + BeanUtils.copyProperties(model,ppassOld); + ppassOldService.insertModel(ppassOld); + ppassInstantService.deleteModel(Integer.parseInt(keyId)); + return R.ok().put("flag","true"); + } +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/KeyUtils/PCIKeyPair.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/KeyUtils/PCIKeyPair.java new file mode 100644 index 0000000..430d0f4 --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/KeyUtils/PCIKeyPair.java @@ -0,0 +1,15 @@ +package com.passManage.us.admin.common.KeyUtils; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class PCIKeyPair { + + private String priKey; //私钥 + private String pubKey; //公钥 + +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/KeyUtils/SM2Util.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/KeyUtils/SM2Util.java new file mode 100644 index 0000000..5946000 --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/KeyUtils/SM2Util.java @@ -0,0 +1,284 @@ +package com.passManage.us.admin.common.KeyUtils; + + + +import com.passManage.us.admin.common.util.CommonUtils; +import lombok.extern.slf4j.Slf4j; +import org.apache.tomcat.util.codec.binary.Base64; +import org.bouncycastle.asn1.gm.GMNamedCurves; +import org.bouncycastle.asn1.x9.X9ECParameters; +import org.bouncycastle.crypto.AsymmetricCipherKeyPair; +import org.bouncycastle.crypto.engines.SM2Engine; +import org.bouncycastle.crypto.generators.ECKeyPairGenerator; +import org.bouncycastle.crypto.params.*; +import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPrivateKey; +import org.bouncycastle.jcajce.provider.asymmetric.ec.BCECPublicKey; +import org.bouncycastle.jce.spec.ECParameterSpec; +import org.bouncycastle.math.ec.ECPoint; +import org.bouncycastle.util.encoders.Hex; + +import java.math.BigInteger; +import java.security.*; + +/** + * @Author: dzy + * @Date: 2018/9/28 15:53 + * @Describe: SM2工具类 + */ +@Slf4j +public class SM2Util { + + /** + * 生成SM2公私钥对 + * @return + */ + private static AsymmetricCipherKeyPair genKeyPair0() { + //获取一条SM2曲线参数 + X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1"); + + //构造domain参数 + ECDomainParameters domainParameters = new ECDomainParameters(sm2ECParameters.getCurve(), + sm2ECParameters.getG(), sm2ECParameters.getN()); + + //1.创建密钥生成器 + ECKeyPairGenerator keyPairGenerator = new ECKeyPairGenerator(); + + //2.初始化生成器,带上随机数 + try { + keyPairGenerator.init(new ECKeyGenerationParameters(domainParameters, SecureRandom.getInstance("SHA1PRNG"))); + } catch (NoSuchAlgorithmException e) { + log.error("生成公私钥对时出现异常:", e); +// e.printStackTrace(); + } + + //3.生成密钥对 + AsymmetricCipherKeyPair asymmetricCipherKeyPair = keyPairGenerator.generateKeyPair(); + return asymmetricCipherKeyPair; + } + + /** + * 生成公私钥对(默认压缩公钥) + * @return + */ + public static PCIKeyPair genKeyPair() { + return genKeyPair(true); + } + + /** + * 生成公私钥对 + * @param compressedPubKey 是否压缩公钥 + * @return + */ + public static PCIKeyPair genKeyPair(boolean compressedPubKey) { + AsymmetricCipherKeyPair asymmetricCipherKeyPair = genKeyPair0(); + + //提取公钥点 + ECPoint ecPoint = ((ECPublicKeyParameters) asymmetricCipherKeyPair.getPublic()).getQ(); + //公钥前面的02或者03表示是压缩公钥,04表示未压缩公钥,04的时候,可以去掉前面的04 + String pubKey = Hex.toHexString(ecPoint.getEncoded(compressedPubKey)); + + BigInteger privatekey = ((ECPrivateKeyParameters) asymmetricCipherKeyPair.getPrivate()).getD(); + String priKey = privatekey.toString(16); + + PCIKeyPair keyPair = new PCIKeyPair(priKey, pubKey); + return keyPair; + } + + + /** + * 将R或者S修正为固定字节数 + * @param rs + * @return + */ + private static byte[] modifyRSFixedBytes(byte[] rs) { + int length = rs.length; + int fixedLength = 32; + byte[] result = new byte[fixedLength]; + if (length < 32) { + System.arraycopy(rs, 0, result, fixedLength - length, length); + } else { + System.arraycopy(rs, length - fixedLength, result, 0, fixedLength); + } + return result; + } + + + /** + * SM2加密算法 + * @param publicKey 公钥 + * @param data 数据 + * @return + */ + public static String encrypt(String publicKey, String data){ + // 获取一条SM2曲线参数 + X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1"); + // 构造domain参数 + ECDomainParameters domainParameters = new ECDomainParameters(sm2ECParameters.getCurve(), + sm2ECParameters.getG(), + sm2ECParameters.getN()); + //提取公钥点 + ECPoint pukPoint = sm2ECParameters.getCurve().decodePoint(CommonUtils.hexString2byte(publicKey)); + // 公钥前面的02或者03表示是压缩公钥,04表示未压缩公钥, 04的时候,可以去掉前面的04 + ECPublicKeyParameters publicKeyParameters = new ECPublicKeyParameters(pukPoint, domainParameters); + + SM2Engine sm2Engine = new SM2Engine(); + sm2Engine.init(true, new ParametersWithRandom(publicKeyParameters, new SecureRandom())); + + byte[] arrayOfBytes = null; + try { + byte[] in = data.getBytes("utf-8"); + arrayOfBytes = sm2Engine.processBlock(in, 0, in.length); + } catch (Exception e) { + log.error("SM2加密时出现异常:", e); + } + return Hex.toHexString(arrayOfBytes); + } + + /** + * SM2加密算法 + * @param publicKey 公钥 + * @param data 明文数据 + * @return + */ + public static String encrypt(PublicKey publicKey, String data) { + + ECPublicKeyParameters ecPublicKeyParameters = null; + if (publicKey instanceof BCECPublicKey) { + BCECPublicKey bcecPublicKey = (BCECPublicKey) publicKey; + ECParameterSpec ecParameterSpec = bcecPublicKey.getParameters(); + ECDomainParameters ecDomainParameters = new ECDomainParameters(ecParameterSpec.getCurve(), + ecParameterSpec.getG(), ecParameterSpec.getN()); + ecPublicKeyParameters = new ECPublicKeyParameters(bcecPublicKey.getQ(), ecDomainParameters); + } + + SM2Engine sm2Engine = new SM2Engine(); + sm2Engine.init(true, new ParametersWithRandom(ecPublicKeyParameters, new SecureRandom())); + + byte[] arrayOfBytes = null; + try { + byte[] in = data.getBytes("utf-8"); + arrayOfBytes = sm2Engine.processBlock(in,0, in.length); + } catch (Exception e) { + log.error("SM2加密时出现异常:", e); + } + return Hex.toHexString(arrayOfBytes); + } + + /** + * SM2解密算法 + * @param privateKey 私钥 + * @param cipherData 密文数据 + * @return + */ + public static String decrypt(String privateKey, String cipherData) { + byte[] cipherDataByte = Hex.decode(cipherData); + + //获取一条SM2曲线参数 + X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1"); + //构造domain参数 + ECDomainParameters domainParameters = new ECDomainParameters(sm2ECParameters.getCurve(), + sm2ECParameters.getG(), sm2ECParameters.getN()); + + BigInteger privateKeyD = new BigInteger(privateKey, 16); + ECPrivateKeyParameters privateKeyParameters = new ECPrivateKeyParameters(privateKeyD, domainParameters); + + SM2Engine sm2Engine = new SM2Engine(); + sm2Engine.init(false, privateKeyParameters); + + String result = null; + try { + byte[] arrayOfBytes = sm2Engine.processBlock(cipherDataByte, 0, cipherDataByte.length); + return new String(arrayOfBytes, "utf-8"); + } catch (Exception e) { + log.error("SM2解密时出现异常:", e); + } + return result; + + } + + /** + * SM2解密算法 + * @param privateKey 私钥 + * @param cipherData 密文数据 + * @return + */ + public static String decrypt(PrivateKey privateKey, String cipherData) { + byte[] cipherDataByte = Hex.decode(cipherData); + + BCECPrivateKey bcecPrivateKey = (BCECPrivateKey) privateKey; + ECParameterSpec ecParameterSpec = bcecPrivateKey.getParameters(); + + ECDomainParameters ecDomainParameters = new ECDomainParameters(ecParameterSpec.getCurve(), + ecParameterSpec.getG(), ecParameterSpec.getN()); + + ECPrivateKeyParameters ecPrivateKeyParameters = new ECPrivateKeyParameters(bcecPrivateKey.getD(), + ecDomainParameters); + + SM2Engine sm2Engine = new SM2Engine(); + sm2Engine.init(false, ecPrivateKeyParameters); + + String result = null; + try { + byte[] arrayOfBytes = sm2Engine.processBlock(cipherDataByte, 0, cipherDataByte.length); + return new String(arrayOfBytes, "utf-8"); + } catch (Exception e) { + log.error("SM2解密时出现异常:", e); + } + return result; + } + + /** + * 将未压缩公钥压缩成压缩公钥 + * @param pubKey 未压缩公钥(16进制,不要带头部04) + * @return + */ + public static String compressPubKey(String pubKey) { + pubKey = "04"+ pubKey; //将未压缩公钥加上未压缩标识. + // 获取一条SM2曲线参数 + X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1"); + // 构造domain参数 + ECDomainParameters domainParameters = new ECDomainParameters(sm2ECParameters.getCurve(), + sm2ECParameters.getG(), + sm2ECParameters.getN()); + //提取公钥点 + ECPoint pukPoint = sm2ECParameters.getCurve().decodePoint(CommonUtils.hexString2byte(pubKey)); + // 公钥前面的02或者03表示是压缩公钥,04表示未压缩公钥, 04的时候,可以去掉前面的04 +// ECPublicKeyParameters publicKeyParameters = new ECPublicKeyParameters(pukPoint, domainParameters); + + String compressPubKey = Hex.toHexString(pukPoint.getEncoded(Boolean.TRUE)); + + return compressPubKey; + } + + /** + * 将压缩的公钥解压为非压缩公钥 + * @param compressKey 压缩公钥 + * @return + */ + public static String unCompressPubKey(String compressKey) { + // 获取一条SM2曲线参数 + X9ECParameters sm2ECParameters = GMNamedCurves.getByName("sm2p256v1"); + // 构造domain参数 + ECDomainParameters domainParameters = new ECDomainParameters(sm2ECParameters.getCurve(), + sm2ECParameters.getG(), + sm2ECParameters.getN()); + //提取公钥点 + ECPoint pukPoint = sm2ECParameters.getCurve().decodePoint(CommonUtils.hexString2byte(compressKey)); + // 公钥前面的02或者03表示是压缩公钥,04表示未压缩公钥, 04的时候,可以去掉前面的04 +// ECPublicKeyParameters publicKeyParameters = new ECPublicKeyParameters(pukPoint, domainParameters); + + String pubKey = Hex.toHexString(pukPoint.getEncoded(Boolean.FALSE)); + pubKey = pubKey.substring(2); //去掉前面的04 (04的时候,可以去掉前面的04) + + return pubKey; + } + + /** + * 取得公私钥字符串。 + */ + public static String getKeyStr(Key key) { + return Base64.encodeBase64String(key.getEncoded()); + } + + +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/KeyUtils/Sm3Utils.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/KeyUtils/Sm3Utils.java new file mode 100644 index 0000000..4cc2ba0 --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/KeyUtils/Sm3Utils.java @@ -0,0 +1,94 @@ +package com.passManage.us.admin.common.KeyUtils; + + +import org.apache.commons.codec.binary.Hex; +import org.bouncycastle.crypto.digests.SM3Digest; +import org.bouncycastle.jce.provider.BouncyCastleProvider; + +import javax.crypto.KeyGenerator; +import java.io.UnsupportedEncodingException; +import java.security.SecureRandom; + +/** + * @author CHENR + * @Title: Sm3Utils + * @ProjectName upds + * @Description: TODO + * @date 2019/9/611:13 + */ +public class Sm3Utils { + private final static byte[] hex = "0123456789ABCDEF".getBytes(); + // 128-32位16进制;256-64位16进制 + public static final int DEFAULT_KEY_SIZE = 128; + public static final String ALGORITHM_NAME = "SM3"; + + /** + * 自动生成密钥 + * + * @return + * @explain + */ + public static String generateKey() throws Exception { + return new String(Hex.encodeHex(generateKey(DEFAULT_KEY_SIZE),false)); + } + /** + * @desc SM3加密算法实现方法 + * @param data + * @return + */ + public static byte[] digest(byte[] data) { + SM3Digest sm3 = new SM3Digest(); + byte[] result = null; + try { + sm3.update(data, 0, data.length); + result = new byte[sm3.getDigestSize()]; + sm3.doFinal(result, 0); + } catch (Exception e) { + System.out.println("Fail: SM3 byte[] to byte[]" + e); + } + return result; + } + + /** + * @desc 将字节数组转换为16进制的字符串 + * @param b + * @return + */ + public static String bytes2HexString(byte[] b) { + byte[] buff = new byte[2 * b.length]; + for (int i = 0; i < b.length; i++) { + buff[2 * i] = hex[(b[i] >> 4) & 0x0f]; + buff[2 * i + 1] = hex[b[i] & 0x0f]; + } + return new String(buff); + } + + /** + * @desc 调用该方法使用SM3算法对手机号、卡号、证件号进行加密,输出16进制的密文字符串 + * @param msg 要加密的信息 + * @return 16进制的加密密文字符串,如加密算法调用失败返回空串 + */ + public static String encryptBySm3(String msg) { + try { + String encryptedCardNo = bytes2HexString(digest(msg.getBytes("UTF-8"))); + return encryptedCardNo; + } catch (UnsupportedEncodingException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + return ""; + } + } + + /** + * @param keySize + * @return + * @throws Exception + * @explain + */ + public static byte[] generateKey(int keySize) throws Exception { + KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM_NAME, BouncyCastleProvider.PROVIDER_NAME); + kg.init(keySize, new SecureRandom()); + return kg.generateKey().getEncoded(); + } + +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/KeyUtils/Sm4Util.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/KeyUtils/Sm4Util.java new file mode 100644 index 0000000..4d9e1ca --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/KeyUtils/Sm4Util.java @@ -0,0 +1,176 @@ +package com.passManage.us.admin.common.KeyUtils; + +import org.apache.commons.codec.binary.Hex; +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.bouncycastle.pqc.math.linearalgebra.ByteUtils; + +import javax.crypto.Cipher; +import javax.crypto.KeyGenerator; +import javax.crypto.spec.SecretKeySpec; +import java.security.Key; +import java.security.SecureRandom; +import java.security.Security; +import java.util.Arrays; + +public class Sm4Util { + static { + Security.addProvider(new BouncyCastleProvider()); + } + + private static final String ENCODING = "UTF-8"; + public static final String ALGORITHM_NAME = "SM4"; + // 加密算法/分组加密模式/分组填充方式 + // PKCS5Padding-以8个字节为一组进行分组加密 + // 定义分组加密模式使用:PKCS5Padding + public static final String ALGORITHM_NAME_ECB_PADDING = "SM4/ECB/PKCS5Padding"; + // 128-32位16进制;256-64位16进制 + public static final int DEFAULT_KEY_SIZE = 128; + + /** + * 自动生成密钥 + * + * @return + * @explain + */ + public static String generateKey() throws Exception { + return new String(Hex.encodeHex(generateKey(DEFAULT_KEY_SIZE),false)); + } + + /** + * @param keySize + * @return + * @throws Exception + * @explain + */ + public static byte[] generateKey(int keySize) throws Exception { + KeyGenerator kg = KeyGenerator.getInstance(ALGORITHM_NAME, BouncyCastleProvider.PROVIDER_NAME); + kg.init(keySize, new SecureRandom()); + return kg.generateKey().getEncoded(); + } + + /** + * 生成ECB暗号 + * + * @param algorithmName 算法名称 + * @param mode 模式 + * @param key + * @return + * @throws Exception + * @explain ECB模式(电子密码本模式:Electronic codebook) + */ + private static Cipher generateEcbCipher(String algorithmName, int mode, byte[] key) throws Exception { + Cipher cipher = Cipher.getInstance(algorithmName, BouncyCastleProvider.PROVIDER_NAME); + Key sm4Key = new SecretKeySpec(key, ALGORITHM_NAME); + cipher.init(mode, sm4Key); + return cipher; + } + + /** + * sm4加密 + * + * @param hexKey 16进制密钥(忽略大小写) + * @param paramStr 待加密字符串 + * @return 返回16进制的加密字符串 + * @explain 加密模式:ECB + * 密文长度不固定,会随着被加密字符串长度的变化而变化 + */ + public static String encryptEcb(String hexKey, String paramStr) { + try { + String cipherText = ""; + // 16进制字符串-->byte[] + byte[] keyData = ByteUtils.fromHexString(hexKey); + // String-->byte[] + byte[] srcData = paramStr.getBytes(ENCODING); + // 加密后的数组 + byte[] cipherArray = encrypt_Ecb_Padding(keyData, srcData); + // byte[]-->hexString + cipherText = ByteUtils.toHexString(cipherArray); + return cipherText; + } catch (Exception e) { + return paramStr; + } + } + + /** + * 加密模式之Ecb + * + * @param key + * @param data + * @return + * @throws Exception + * @explain + */ + public static byte[] encrypt_Ecb_Padding(byte[] key, byte[] data) throws Exception { + Cipher cipher = generateEcbCipher(ALGORITHM_NAME_ECB_PADDING, Cipher.ENCRYPT_MODE, key); + return cipher.doFinal(data); + } + + /** + * sm4解密 + * + * @param hexKey 16进制密钥 + * @param cipherText 16进制的加密字符串(忽略大小写) + * @return 解密后的字符串 + * @throws Exception + * @explain 解密模式:采用ECB + */ + public static String decryptEcb(String hexKey, String cipherText) { + // 用于接收解密后的字符串 + String decryptStr = ""; + // hexString-->byte[] + byte[] keyData = ByteUtils.fromHexString(hexKey); + // hexString-->byte[] + byte[] cipherData = ByteUtils.fromHexString(cipherText); + // 解密 + byte[] srcData; + try { + srcData = decrypt_Ecb_Padding(keyData, cipherData); + // byte[]-->String + decryptStr = new String(srcData, ENCODING); + } catch (Exception e) { + e.printStackTrace(); + } + return decryptStr; + } + + /** + * 解密 + * + * @param key + * @param cipherText + * @return + * @throws Exception + * @explain + */ + public static byte[] decrypt_Ecb_Padding(byte[] key, byte[] cipherText) throws Exception { + Cipher cipher = generateEcbCipher(ALGORITHM_NAME_ECB_PADDING, Cipher.DECRYPT_MODE, key); + return cipher.doFinal(cipherText); + } + + /** + * 校验加密前后的字符串是否为同一数据 + * + * @param hexKey 16进制密钥(忽略大小写) + * @param cipherText 16进制加密后的字符串 + * @param paramStr 加密前的字符串 + * @return 是否为同一数据 + * @throws Exception + * @explain + */ + public static boolean verifyEcb(String hexKey, String cipherText, String paramStr) throws Exception { + // 用于接收校验结果 + boolean flag = false; + // hexString-->byte[] + byte[] keyData = ByteUtils.fromHexString(hexKey); + // 将16进制字符串转换成数组 + byte[] cipherData = ByteUtils.fromHexString(cipherText); + // 解密 + byte[] decryptData = decrypt_Ecb_Padding(keyData, cipherData); + // 将原字符串转换成byte[] + byte[] srcData = paramStr.getBytes(ENCODING); + // 判断2个数组是否一致 + flag = Arrays.equals(decryptData, srcData); + return flag; + } + +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/KeyUtils/XORUtils.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/KeyUtils/XORUtils.java new file mode 100644 index 0000000..3c3229e --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/KeyUtils/XORUtils.java @@ -0,0 +1,84 @@ +package com.passManage.us.admin.common.KeyUtils; + +import java.io.*; + +/** + * 异或(xor)算法加密/解密工具 + * + * @author xietansheng + */ +public class XORUtils { + + /** + * 异或算法加密/解密 + * + * @param data 数据(密文/明文) + * @param key 密钥 + * @return 返回解密/加密后的数据 + */ + public static byte[] encrypt(byte[] data, byte[] key) { + if (data == null || data.length == 0 || key == null || key.length == 0) { + return data; + } + + byte[] result = new byte[data.length]; + + // 使用密钥字节数组循环加密或解密 + for (int i = 0; i < data.length; i++) { + // 数据与密钥异或, 再与循环变量的低8位异或(增加复杂度) + result[i] = (byte) (data[i] ^ key[i % key.length] ^ (i & 0xFF)); + } + + return result; + } + + /** + * 对文件异或算法加密/解密 + * + * @param inFile 输入文件(密文/明文) + * @param outFile 结果输出文件 + * @param key 密钥 + */ + public static void encryptFile(File inFile, File outFile, byte[] key) throws Exception { + InputStream in = null; + OutputStream out = null; + + try { + // 文件输入流 + in = new FileInputStream(inFile); + // 结果输出流, 异或运算时, 字节是一个一个读取和写入, 这里必须使用缓冲流包装, + // 等缓冲到一定数量的字节(10240字节)后再写入磁盘(否则写磁盘次数太多, 速度会非常慢) + out = new BufferedOutputStream(new FileOutputStream(outFile), 10240); + + int b = -1; + long i = 0; + + // 每次循环读取文件的一个字节, 使用密钥字节数组循环加密或解密 + while ((b = in.read()) != -1) { + // 数据与密钥异或, 再与循环变量的低8位异或(增加复杂度) + b = (b ^ key[(int) (i % key.length)] ^ (int) (i & 0xFF)); + // 写入一个加密/解密后的字节 + out.write(b); + // 循环变量递增 + i++; + } + out.flush(); + + } finally { + close(in); + close(out); + } + } + + private static void close(Closeable c) { + if (c != null) { + try { + c.close(); + } catch (IOException e) { + // nothing + } + } + } + +} + diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/config/DataSourceConfig.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/config/DataSourceConfig.java new file mode 100644 index 0000000..d78c55c --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/config/DataSourceConfig.java @@ -0,0 +1,94 @@ +package com.passManage.us.admin.common.config; + +import com.alibaba.druid.pool.DruidDataSource; +import com.passManage.us.core.utils.StringUtil; +import org.apache.ibatis.io.VFS; +import org.apache.ibatis.session.SqlSessionFactory; +import org.mybatis.spring.SqlSessionFactoryBean; +import org.mybatis.spring.annotation.MapperScan; +import org.mybatis.spring.boot.autoconfigure.SpringBootVFS; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.jdbc.datasource.DataSourceTransactionManager; + +import javax.annotation.Resource; +import javax.sql.DataSource; +import java.sql.SQLException; +import java.util.Arrays; + +/** + * 数据源配置 + * @author www.magicalcoder.com + * @date 2018-7-9 + */ +@Configuration +@MapperScan(basePackages = + {"com.passManage.us.admin.**.mapper" + ,"com.passManage.us.admin.rmp.**.mapper" // 如果您觉得日志有warn mapper已经存在 比较碍眼 可以注释本行 + ,"com.passManage.us.service.**.mapper" + } + , sqlSessionFactoryRef = "commonSqlSessionFactory" ) +public class DataSourceConfig { + + private static final String MAPPER_LOCATION = "classpath*:sqlmap/**/*Mapper.xml"; + private static final String TYPE_ALIASES_PACKAGE = + "com.passManage.us.admin.model," + + "com.passManage.us.admin.rmp.model," + + "com.passManage.us.model";//逗号分隔多个 + + @Value("${common.datasource.url}") + private String url; + + @Value("${common.datasource.username}") + private String user; + + @Value("${common.datasource.password}") + private String password; + + @Value("${common.datasource.driverClassName}") + private String driverClass; + + @Resource + private MonitorConfig monitorConfig; + + @Bean(name = "commonDataSource") + @Primary + public DataSource masterDataSource() { + DruidDataSource dataSource = new DruidDataSource(); + dataSource.setDriverClassName(driverClass); + dataSource.setUrl(url); + dataSource.setUsername(user); + dataSource.setPassword(password); + dataSource.setConnectionInitSqls(Arrays.asList("set names utf8mb4")); + if(StringUtil.isNotBlank(monitorConfig.getDruidFilters())){ + try { + dataSource.setFilters(monitorConfig.getDruidFilters()); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return dataSource; + } + + @Bean(name = "commonTransactionManager") + @Primary + public DataSourceTransactionManager commonTransactionManager() { + return new DataSourceTransactionManager(masterDataSource()); + } + + @Bean(name = "commonSqlSessionFactory") + @Primary + public SqlSessionFactory commonSqlSessionFactory(@Qualifier("commonDataSource") DataSource commonDataSource)throws Exception { + //DefaultVFS在获取jar上存在问题,使用springboot只能修改 ,否则setTypeAliasesPackage 在生产环境报错 + VFS.addImplClass(SpringBootVFS.class); + final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); + sessionFactory.setDataSource(commonDataSource); + sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(DataSourceConfig.MAPPER_LOCATION)); + sessionFactory.setTypeAliasesPackage(TYPE_ALIASES_PACKAGE); + return sessionFactory.getObject(); + } +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/config/DistributedSessionConfig.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/config/DistributedSessionConfig.java new file mode 100644 index 0000000..f4a2842 --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/config/DistributedSessionConfig.java @@ -0,0 +1,22 @@ +package com.passManage.us.admin.common.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.session.data.redis.config.ConfigureRedisAction; +import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; + +/** + * 分布式session配置 + * @author www.magicalcoder.com + * @date + */ +@Configuration +@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 86400, redisNamespace="us_admin_session") +public class DistributedSessionConfig { + + @Bean + public static ConfigureRedisAction configureRedisAction() { + return ConfigureRedisAction.NO_OP; + } + +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/config/MonitorConfig.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/config/MonitorConfig.java new file mode 100644 index 0000000..cdd74db --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/config/MonitorConfig.java @@ -0,0 +1,43 @@ +package com.passManage.us.admin.common.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + +/** + * author: www.magicalcoder.com + * date:2018/5/12 + * function:监控配置 + */ +@Configuration +public class MonitorConfig { + @Value("${spring.monitor.druid.userName}") + private String druidUserName; + @Value("${spring.monitor.druid.password}") + private String druidPassword; + @Value("${spring.monitor.druid.allowIps}") + private String druidAllowIps; + @Value("${spring.monitor.druid.denyIps}") + private String druidDenyIps; + @Value("${spring.monitor.druid.filters}") + private String druidFilters; + + public String getDruidUserName() { + return druidUserName; + } + + public String getDruidPassword() { + return druidPassword; + } + + public String getDruidAllowIps() { + return druidAllowIps; + } + + public String getDruidDenyIps() { + return druidDenyIps; + } + + public String getDruidFilters() { + return druidFilters; + } +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/config/MvcConfig.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/config/MvcConfig.java new file mode 100644 index 0000000..5be9a45 --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/config/MvcConfig.java @@ -0,0 +1,118 @@ +package com.passManage.us.admin.common.config; + +import com.passManage.us.admin.common.interceptor.AdminInterceptor; +import com.passManage.us.admin.rmp.common.interceptor.AdminLogOperateInterceptor; +import com.passManage.us.admin.rmp.constant.PermissionConstant; +import com.passManage.us.core.utils.StringUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +import java.sql.Time; +import java.sql.Timestamp; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * @author www.magicalcoder.com + */ +@Component +@Slf4j +public class MvcConfig extends WebMvcConfigurerAdapter { + + @Autowired + private AdminInterceptor adminInterceptor; + + @Autowired + private AdminLogOperateInterceptor adminLogOperateInterceptor; + /** + * 拦截器配置 + * @param registry + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { + // 注册监控拦截器 + registry.addInterceptor(adminInterceptor).addPathPatterns(PermissionConstant.ADMIN_PREFIX+"**").excludePathPatterns(PermissionConstant.STATIC_PREFIX+"**"); + registry.addInterceptor(adminLogOperateInterceptor).addPathPatterns(PermissionConstant.ADMIN_PREFIX+"**").excludePathPatterns(PermissionConstant.STATIC_PREFIX+"**"); + } + +/* @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedOrigins("*") + .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE"); + }*/ + +//下面的方法是转换日期的 否则日期转换出问题 不支持timestemp + @Bean + public Converter stringToDateConvert() { + return new Converter() { + @Override + public Date convert(String source) { + if(StringUtil.isBlank(source)){ + return null; + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Date date = null; + try { + date = sdf.parse(source); + } catch (Exception e) { + log.error("日期转换异常",e); + } + return date; + } + }; + } + + /** + *str转timestamp + * @retun + */ + @Bean + public Converter stringToTimeStampConvert() { + return new Converter() { + @Override + public Timestamp convert(String source) { + if(StringUtil.isBlank(source)){ + return null; + } +// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Timestamp date = null; + try { + date = Timestamp.valueOf(source); + } catch (Exception e) { + log.error("日期转换异常",e); + } + return date; + } + }; + } + + + + @Bean + public Converter stringToTimeConvert() { + return new Converter() { + @Override + public Time convert(String source) { + if(StringUtil.isBlank(source)){ + return null; + } +// SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + Time date = null; + try { + String[] arr = source.trim().split("\\s+"); + date = Time.valueOf(arr[1]); + } catch (Exception e) { + log.error("日期转换异常",e); + } + return date; + } + }; + } +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/config/RedisConfig.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/config/RedisConfig.java new file mode 100644 index 0000000..6fcbe0b --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/config/RedisConfig.java @@ -0,0 +1,88 @@ +package com.passManage.us.admin.common.config; + +import com.passManage.us.core.utils.StringUtil; +import org.apache.commons.pool2.impl.GenericObjectPoolConfig; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cache.annotation.CachingConfigurerSupport; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import redis.clients.jedis.HostAndPort; +import redis.clients.jedis.JedisCluster; +import redis.clients.jedis.JedisPool; +import redis.clients.jedis.JedisPoolConfig; + +import java.util.HashSet; +import java.util.Set; + +/** + * redis配置 + * 集群模式 支持1到多个redis服务 + */ + +@Configuration +@EnableCaching +public class RedisConfig extends CachingConfigurerSupport { + + @Value("${spring.redis.host}") + private String host; + + @Value("${spring.redis.port}") + private Integer port; + + @Value("${spring.redis.password}") + private String password; + + + //默认不开启集群模式 因为集群模式部署比较麻烦 但是支持 注释打开后 让RedisUtil继承 RedisClusterDefinedUtil +/* @Value("${spring.redis.cluster.nodes}") + private String clusterNodes; + + @Value("${spring.redis.cluster.connectionTimeout}") + private int connectionTimeout; + + @Value("${spring.redis.cluster.soTimeout}") + private int soTimeout; + + @Value("${spring.redis.cluster.maxAttempts}") + private int maxAttempts; + + + @Bean + public JedisCluster jedisCluster(){ + Set jedisClusterNode = null; + if(StringUtil.isNotBlank(clusterNodes)){ + jedisClusterNode = new HashSet<>(); + String[] arr = clusterNodes.split(","); + for(String hostAndPot : arr){ + String[] hp = hostAndPot.split(":"); + jedisClusterNode.add(new HostAndPort(hp[0].trim(),Integer.valueOf(hp[1].trim()))); + } + }else { + return null; + } + if(StringUtil.isBlank(password)){ + return new JedisCluster(jedisClusterNode,connectionTimeout,soTimeout,maxAttempts,new GenericObjectPoolConfig()); + }else { + return new JedisCluster(jedisClusterNode,connectionTimeout,soTimeout,maxAttempts,password,new GenericObjectPoolConfig()); + } + }*/ + +//单机模式 + @Bean + public JedisPool redisPoolFactory() { + JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); + jedisPoolConfig.setMaxIdle(8); + jedisPoolConfig.setMaxWaitMillis(10000); + jedisPoolConfig.setMinIdle(0); + JedisPool jedisPool; + + if(StringUtil.isNotBlank(password)){ + jedisPool = new JedisPool(jedisPoolConfig, host,port, 10000, password); + }else { + jedisPool = new JedisPool(jedisPoolConfig, host,port, 10000); + } + return jedisPool; + } + +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/config/RestTemplateConfig.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/config/RestTemplateConfig.java new file mode 100644 index 0000000..575463e --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/config/RestTemplateConfig.java @@ -0,0 +1,56 @@ +package com.passManage.us.admin.common.config; + +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.ssl.TrustStrategy; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.ClientHttpRequestFactory; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; + +import javax.net.ssl.SSLContext; +import java.security.KeyManagementException; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; + +/** + * author: www.magicalcoder.com + * date:2018/4/28 + * function: + */ +@Configuration +public class RestTemplateConfig { + @Bean + public RestTemplate restTemplate(ClientHttpRequestFactory simpleClientHttpRequestFactory){ + return new RestTemplate(simpleClientHttpRequestFactory); + } + + @Bean + public ClientHttpRequestFactory simpleClientHttpRequestFactory() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException { + TrustStrategy acceptingTrustStrategy = new TrustStrategy(){ + @Override + public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { + return true; + } + }; + SSLContext sslContext = org.apache.http.ssl.SSLContexts.custom() + .loadTrustMaterial(null, acceptingTrustStrategy) + .build(); + SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext); + CloseableHttpClient httpClient = HttpClients.custom() + .setSSLSocketFactory(csf) + .build(); + HttpComponentsClientHttpRequestFactory requestFactory = + new HttpComponentsClientHttpRequestFactory(); + requestFactory.setHttpClient(httpClient); +// SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory(); + requestFactory.setReadTimeout(10000);//单位为ms + requestFactory.setConnectTimeout(10000);//单位为ms + requestFactory.setConnectionRequestTimeout(10000); + return requestFactory; + } +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/config/UploadFilePathConfig.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/config/UploadFilePathConfig.java new file mode 100644 index 0000000..82354d4 --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/config/UploadFilePathConfig.java @@ -0,0 +1,134 @@ +package com.passManage.us.admin.common.config; + +import com.aliyun.oss.OSSClient; +import com.passManage.us.admin.common.util.SpringBootUtil; +import com.passManage.us.core.utils.StringUtil; +import lombok.Getter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +import javax.annotation.PreDestroy; + +/** + * Created by magicalcoder.com on 2018/8/5. + * 文件上传 虚拟路径映射 因为springboot默认不支持文件上传 慎重选择 + */ +@Slf4j +@Configuration +@Getter +public class UploadFilePathConfig extends WebMvcConfigurerAdapter { + + /*使用本地硬盘上传*/ + @Value("${magicalcoder.file.upload.useDisk.open:false}") + private Boolean useDisk; + /*使用本地虚拟路径返回前端*/ + @Value("${magicalcoder.file.upload.useDisk.returnUrl:false}") + private Boolean useDiskReturnUrl; + /*上传目录*/ + @Value("${magicalcoder.file.upload.useDisk.mapping.uploadDiskFolder:}") + private String uploadDiskFolder; + /*虚拟前缀*/ + @Value("${magicalcoder.file.upload.useDisk.mapping.requestPrefix:}") + private String requestPrefix; + /*文件上传额外添加的前缀*/ + @Value("${magicalcoder.file.upload.useDisk.mapping.fileExtraAddPrefix:}") + private String fileExtraAddPrefix; + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + uploadDiskFolder = lastUploadPath(uploadDiskFolder); + if(!requestPrefix.startsWith("/")){ + requestPrefix = "/"+requestPrefix; + } + if(!requestPrefix.endsWith("/")){ + requestPrefix = requestPrefix+"/"; + } + log.info("文件映射路径"+uploadDiskFolder); + registry.addResourceHandler(requestPrefix+"**").addResourceLocations("file:" + uploadDiskFolder); + } + + private String lastUploadPath(String uploadDiskFolder){ + if(StringUtil.isBlank(uploadDiskFolder)){ + uploadDiskFolder = SpringBootUtil.getJarDirPath(); + log.info("jar file path:"+uploadDiskFolder); +// uploadDiskFolder = UploadFilePathConfig.class.getResource("/").getPath(); + if(!uploadDiskFolder.equals("\\")){ + uploadDiskFolder +="\\"; + } + uploadDiskFolder +="upload\\"; + } + uploadDiskFolder = uploadDiskFolder.replaceAll("\\\\","/"); + if(!uploadDiskFolder.startsWith("/")){ + uploadDiskFolder = "/"+uploadDiskFolder; + } + if(!uploadDiskFolder.endsWith("/")){ + uploadDiskFolder = uploadDiskFolder+"/"; + } + return uploadDiskFolder; + } + + public String getUploadDiskFolder() { + return uploadDiskFolder; + } + + public String getRequestPrefix() { + return deleteBeginEndSplit(requestPrefix); + } + + public String getFileExtraAddPrefix() { + return fileExtraAddPrefix; + } + + + private String deleteBeginEndSplit(String prefix ){ + if(prefix.startsWith("/")){ + prefix = prefix.replaceFirst("/",""); + } + if(prefix.endsWith("/")){ + prefix = prefix.substring(0,prefix.length()-1); + } + return prefix; + } + + + /*阿里云oss上传文件组件封装*/ + @Value("${magicalcoder.file.upload.useAliyunOss.open:false}") + private Boolean useAliyunOss; + /*使用本地虚拟路径返回前端*/ + @Value("${magicalcoder.file.upload.useAliyunOss.returnUrl:false}") + private Boolean useAliyunOssReturnUrl; + @Value("${magicalcoder.file.upload.useAliyunOss.endpoint}") + private String endpoint; + @Value("${magicalcoder.file.upload.useAliyunOss.accessKeyId}") + private String accessKeyId; + @Value("${magicalcoder.file.upload.useAliyunOss.accessKeySecret}") + private String accessKeySecret; + @Value("${magicalcoder.file.upload.useAliyunOss.bucketName}") + private String bucketName; + @Value("${magicalcoder.file.upload.useAliyunOss.aliyunImgDomain}") + private String aliyunImgDomain; + + private volatile OSSClient ossClient; + + public OSSClient ossClient(){ + if(ossClient==null){//单例双锁 + synchronized (UploadFilePathConfig.class){ + if(ossClient==null){ + ossClient = new OSSClient(endpoint,accessKeyId,accessKeySecret); + } + } + } + return ossClient; + } + @PreDestroy + public void destroy(){ + if(ossClient!=null){ + ossClient.shutdown(); + } + } + +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/filter/CorsFilter.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/filter/CorsFilter.java new file mode 100644 index 0000000..8fd7a1a --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/filter/CorsFilter.java @@ -0,0 +1,46 @@ +package com.passManage.us.admin.common.filter; + +import com.passManage.us.admin.rmp.constant.PermissionConstant; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.stereotype.Component; + +import javax.servlet.*; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * 跨域处理策略 + */ +@WebFilter(urlPatterns = PermissionConstant.ADMIN_PREFIX+"*",filterName = "adminFilter") +public class CorsFilter implements Filter { + @Value("${magicalcoder.cors.allowOrigin}") + private String allowOrigin;//允许跨域的域名地址 http://.....,http://..... + @Override + public void init(FilterConfig filterConfig) throws ServletException { + + } + + @Override + public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { + HttpServletRequest request = (HttpServletRequest) servletRequest; + String origin = request.getHeader("Origin"); + if(origin != null && allowOrigin.contains(origin)){//Credentials前端ajax调用需要加这个参数 + HttpServletResponse response = (HttpServletResponse) servletResponse; + response.setHeader("Access-Control-Allow-Origin",origin); + response.setHeader("Access-Control-Allow-Credentials", "true"); + response.setHeader("Access-Control-Allow-Methods", "POST, GET"); + response.setHeader("Access-Control-Max-Age", "3600"); + response.setHeader("Access-Control-Allow-Headers", "Origin, X-Requested-With, Content-Type, Accept"); + } + filterChain.doFilter(servletRequest, servletResponse); + } + + @Override + public void destroy() { + + } +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/handler/ExceptionHandlerAdvice.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/handler/ExceptionHandlerAdvice.java new file mode 100644 index 0000000..76088e1 --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/handler/ExceptionHandlerAdvice.java @@ -0,0 +1,54 @@ +package com.passManage.us.admin.common.handler; + +import com.passManage.us.core.common.exception.BusinessException; +import com.passManage.us.core.serialize.CommonReturnCode; +import com.passManage.us.core.serialize.ResponseMsg; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.PrintWriter; +import java.io.StringWriter; + +@RestControllerAdvice +public class ExceptionHandlerAdvice { + private final static Logger logger = LoggerFactory.getLogger(ExceptionHandlerAdvice.class); + @Value("${spring.profiles.active}") + private String active; + + /** + * 获取异常的堆栈信息 + * + * @param t + * @return + */ + private static String getStackTrace(Throwable t) + { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + try + { + t.printStackTrace(pw); + return sw.toString(); + } + finally + { + pw.close(); + } + } + + @ExceptionHandler + public ResponseMsg handler(HttpServletRequest req, HttpServletResponse res, Exception e) { + if(e instanceof BusinessException) { + logger.error("BusinessException:" + e.getMessage(), e); + return new ResponseMsg(((BusinessException) e).getErrorCode(),((BusinessException) e).getDesc()); + }else { + logger.error("Exception:" + e.getMessage(), e); + return new ResponseMsg(CommonReturnCode.EXCEPTION); + } + } +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/interceptor/AdminInterceptor.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/interceptor/AdminInterceptor.java new file mode 100644 index 0000000..d36291d --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/interceptor/AdminInterceptor.java @@ -0,0 +1,39 @@ +/** + * + */ +package com.passManage.us.admin.common.interceptor; + +import com.passManage.us.admin.rmp.common.SecurityReturnCode; +import com.passManage.us.admin.rmp.util.AdminUtil; +import com.passManage.us.core.cache.redis.RedisUtil; +import com.passManage.us.core.common.exception.BusinessException; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * 后端判断拦截器 + * @author www.magicalcoder.com + * @time 2017年6月26日-下午4:50:06 + */ +@Component +@Slf4j +public class AdminInterceptor extends HandlerInterceptorAdapter { + + @Resource + private RedisUtil redisUtil; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + request.setCharacterEncoding("utf-8"); + if(AdminUtil.getAdmin()==null){ + throw new BusinessException(SecurityReturnCode.NO_LOGIN); + } + return true; + } + +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/interceptor/AllInterceptor.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/interceptor/AllInterceptor.java new file mode 100644 index 0000000..15329d8 --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/interceptor/AllInterceptor.java @@ -0,0 +1,33 @@ +/** + * + */ +package com.passManage.us.admin.common.interceptor; + +import com.passManage.us.admin.common.interceptor.limit.RequestRateLimiter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * 所有请求拦截器 + * @author www.magicalcoder.com + * @time 2017年6月26日-下午4:50:06 + */ +@Component +@Slf4j +public class AllInterceptor extends HandlerInterceptorAdapter { + @Resource + private RequestRateLimiter requestRateLimiter; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + request.setCharacterEncoding("utf-8"); + //限流判断 +// requestRateLimiter.aquire(request); + return true; + } +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/interceptor/limit/RequestRateLimiter.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/interceptor/limit/RequestRateLimiter.java new file mode 100644 index 0000000..fbeee00 --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/interceptor/limit/RequestRateLimiter.java @@ -0,0 +1,81 @@ +package com.passManage.us.admin.common.interceptor.limit; + +import com.passManage.us.core.cache.redis.RedisUtil; +import com.passManage.us.core.common.exception.BusinessException; +import com.passManage.us.core.serialize.Restrict; +import com.passManage.us.core.utils.IpUtil; +import com.passManage.us.core.utils.JsonUtil; +import com.passManage.us.core.utils.StringUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; + +/** + * author: www.magicalcoder.com + * date:2018/5/14 + * function: + * 访问限制 配置在数据库中 code=REQ_RATE name为配置内容 + */ +@Slf4j +@Component +public class RequestRateLimiter { + + private String reqRateCode = "REQ_RATE"; + private String redisPrefix = "request_rate_"; + //@Resource + //private DictService dictService; + @Resource + private RedisUtil redisUtil; + + public void aquire(HttpServletRequest request){ + String json = "";//dictService.getDictNameCache(reqRateCode); + if(StringUtil.isNotBlank(json)){ + Restrict restrict = JsonUtil.getObjectFromJSONString(json,Restrict.class); + if(restrict!=null){ + // + String path = request.getServletPath(); + if(!path.matches(restrict.getServletPathReg())){ + return; + } + String strategy = restrict.getStrategy(); + if(StringUtil.isBlank(strategy) || "no".equals(strategy)){ + return; + } + if("ip".equals(strategy)){ + ipCheck(path,restrict,request); + }else if("user".equals(strategy)){ + userCheck(path,restrict,request); + }else if("ip_user".equals(strategy)){ + ipCheck(path,restrict,request); + userCheck(path,restrict,request); + } + } + } + } + + private void ipCheck(String path,Restrict restrict, HttpServletRequest request){ + String ip = IpUtil.getIp(request); + if(!redisUtil.tryIncr(redisPrefix+ip,restrict.getIpExpireSeconds(),restrict.getIpMaxReqTimes())){ + log.info(String.format("ip=[%s]请求[%s]过于频繁,已超过系统拒绝请求边界每[%s]秒请求[%s]次",ip,path,restrict.getIpExpireSeconds(),restrict.getIpMaxReqTimes())); +// throw new BusinessException(CommonReturnCode.REQUEST_IP_ATTACK); + } + } + private void userCheck(String path,Restrict restrict, HttpServletRequest request){ + Long uid = null; + try { +// uid = UserInfoUtil.getUid(request); + }catch (BusinessException e){ + + } + if(uid==null){ + return; + } + if(!redisUtil.tryIncr(redisPrefix+uid,restrict.getUserExpireSeconds(),restrict.getUserMaxReqTimes())){ + log.info(String.format("uid=[%s]请求[%s]过于频繁,已超过系统拒绝请求边界每[%s]秒请求[%s]次",uid,path,restrict.getUserExpireSeconds(),restrict.getUserMaxReqTimes())); +// throw new BusinessException(CommonReturnCode.REQUEST_IP_ATTACK); + } + } + +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/monitor/DruidMonitorConfig.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/monitor/DruidMonitorConfig.java new file mode 100644 index 0000000..88caee6 --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/monitor/DruidMonitorConfig.java @@ -0,0 +1,59 @@ +package com.passManage.us.admin.common.monitor; + +import com.alibaba.druid.support.http.StatViewServlet; +import com.alibaba.druid.support.http.WebStatFilter; +import com.passManage.us.admin.common.config.MonitorConfig; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.boot.web.servlet.ServletRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.annotation.Resource; + +/** + * author: www.magicalcoder.com + * date:2018/5/12 + * function: 后台监控druid连接池 + * http://127.0.0.1:8080/us-admin/druid/ admin/123456 + */ +@Configuration +public class DruidMonitorConfig { + + @Resource + private MonitorConfig monitorConfig; + + /** + * 注册一个StatViewServlet + * @return + */ + @Bean + public ServletRegistrationBean druidStatViewServle(){ + //org.springframework.boot.context.embedded.ServletRegistrationBean提供类的进行注册. + ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*"); + //添加初始化参数:initParams + //白名单: + servletRegistrationBean.addInitParameter("allow",monitorConfig.getDruidAllowIps()); + //IP黑名单 (存在共同时,deny优先于allow) : 如果满足deny的话提示:Sorry, you are not permitted to view this page. + servletRegistrationBean.addInitParameter("deny",monitorConfig.getDruidDenyIps()); + //登录查看信息的账号密码. + servletRegistrationBean.addInitParameter("loginUsername",monitorConfig.getDruidUserName()); + servletRegistrationBean.addInitParameter("loginPassword",monitorConfig.getDruidPassword()); + //是否能够重置数据. + servletRegistrationBean.addInitParameter("resetEnable","false"); + return servletRegistrationBean; + } + + /** + * 注册一个:filterRegistrationBean + * @return + */ + @Bean + public FilterRegistrationBean druidStatFilter(){ + FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter()); + //添加过滤规则. + filterRegistrationBean.addUrlPatterns("/*"); + //添加不需要忽略的格式信息. + filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); + return filterRegistrationBean; + } +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/schedule/passUpdateTask.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/schedule/passUpdateTask.java new file mode 100644 index 0000000..02d1a9a --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/schedule/passUpdateTask.java @@ -0,0 +1,25 @@ +package com.passManage.us.admin.common.schedule; + +import com.passManage.us.model.PpassInstant; +import com.passManage.us.service.ppassinstant.service.PpassInstantService; +import lombok.extern.slf4j.Slf4j; +import org.slf4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.thymeleaf.util.DateUtils; + +import java.util.List; + +@Component +@Slf4j +public class passUpdateTask { + @Autowired + private PpassInstantService ppassInstantService; + @Scheduled(cron = "0/10 * * * * ? ") // 间隔5秒执行 + public void passUpdate() { + List oldestDatePassKey = ppassInstantService.getOldestDatePassKey(); + Integer count = ppassInstantService.updateKeyAlertByPassKeyList(oldestDatePassKey); + log.info(DateUtils.createNow() + "更新提醒成功{}:过期密钥一共"+count+"个"); + } +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/spring/SpringBeanAllInitFinished.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/spring/SpringBeanAllInitFinished.java new file mode 100644 index 0000000..755a83e --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/spring/SpringBeanAllInitFinished.java @@ -0,0 +1,69 @@ +package com.passManage.us.admin.common.spring; + +import com.passManage.us.core.cache.redis.RedisUtil; +import com.passManage.us.core.common.constant.SystemOperateEnum; +import com.passManage.us.core.utils.OpenBrowserUtil; +import com.passManage.us.core.utils.SystemOperateUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.ApplicationListener; +import org.springframework.stereotype.Component; +import redis.clients.jedis.exceptions.JedisConnectionException; + +import javax.annotation.Resource; +import java.util.concurrent.TimeUnit; + +/** + * Created by magicalcoder.com on + * 当spring bean 启动完毕 就会执行此类方法 + */ +@Component +@Slf4j +public class SpringBeanAllInitFinished implements ApplicationListener { + + @Resource + private RedisUtil redisUtil; + + /*启动成功是否用浏览器打开管理后台*/ + @Value("${magicalcoder.settings.autoStartExplorer:false}") + private Boolean autoStartExplorer; + /*默认浏览器安装路径*/ + @Value("${magicalcoder.settings.explorerPath:}") + private String explorerPath; + + @Value("${server.servlet.context-path:}") + private String contextPath; + @Value("${server.port:80}") + private Integer port; + + @Override + public void onApplicationEvent(ApplicationReadyEvent contextRefreshedEvent) { + //需要执行的逻辑代码,当spring容器初始化完成后就会执行该方法。 + log.info("spring bean 加载完毕"); + try { + redisUtil.get("test"); + log.info("------------start success--------------"); + }catch (JedisConnectionException e){ + e.printStackTrace(); + log.error("-------can not connect redis---------"); + log.error("无法连接redis,请确认redis已经启动并且application-xxx.yml中的配置信息正确"); + SystemOperateEnum systemOperateEnum = SystemOperateUtil.system(); + switch (systemOperateEnum){ + case WINDOWS: + log.error("如果未启动redis,project目录有redis文件夹,打开后双击redis-启动.bat即可"); + break; + case MAC: + case LINUX: + log.error("如果未启动redis,请自行安装"); + break; + } + } + //使用浏览器协助打开管理后台 请勿使用多线程打开 否则出现浏览器不关闭 占用target文件夹情况 + if(autoStartExplorer){ + String usUrl = String.format("http://localhost:%s%s",port,contextPath); + log.info("正在使用浏览器打开管理后台地址:"+usUrl); + OpenBrowserUtil.openURL(explorerPath,usUrl); + } + } +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/util/CommonUtils.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/util/CommonUtils.java new file mode 100644 index 0000000..b27ff78 --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/util/CommonUtils.java @@ -0,0 +1,417 @@ +package com.passManage.us.admin.common.util; + +import org.springframework.util.StringUtils; + +import java.io.UnsupportedEncodingException; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +/** + * @ClassName: CommonUtils + * @Description: 通用工具类 + * @since: 0.0.1 + * @author: dzy + * @date: 2017年2月22日 上午11:46:44 + */ +public class CommonUtils { + + + /** + * @param date 日期 + * @param pattern 模式 如:yyyyMMdd等 + * @return + * @Title: formatDate + * @Description: 格式化日期 + * @since: 0.0.1 + */ + public static String formatDate(Date date, String pattern) { + SimpleDateFormat formatter = new SimpleDateFormat(pattern); + return formatter.format(date); + } + + /** + * @param strDate String类型日期 + * @param pattern 日期显示模式 + * @return + * @Title: parseDate + * @Description: 将String日期转换为Date类型日期 + * @since: 0.0.1 + */ + public static Date parseDate(String strDate, String pattern) { + SimpleDateFormat formatter = null; + if (StringUtils.isEmpty(strDate) || strDate.equals("")) { + return null; + } + formatter = new SimpleDateFormat(pattern); + try { + return formatter.parse(strDate); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * @param date 操作前的日期 + * @param field 日期的部分如:年,月,日 + * @param amount 增加或减少的值(负数表示减少) + * @return + * @Title: dateAdd + * @Description: 日期的加减操作 + * @since: 0.0.1 + */ + public static Date dateAdd(Date date, int field, int amount) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(field, amount); + return calendar.getTime(); + } + + /** + * @param source 源字符串 + * @param offset 填充开始的位置, 0-在左边, source.getBytes().length 在右边, 如果有中文时需小心位置 + * @param c 用于填充的字符 + * @param length 最后字符串的字节长度 + * @return + * @Title: fill + * @Description: 填充字符串, 长度是按字节计算, 不是字符 + * @since: 0.0.1 + */ + public static String fill(String source, int offset, char c, int length) throws UnsupportedEncodingException { + if (null == source) { + source = ""; + } + if (source.getBytes("utf-8").length == length) { + return source; + } + byte[] buf = new byte[length]; + byte[] src = source.getBytes("utf-8"); + if (src.length > length) { + System.arraycopy(src, src.length - length, buf, 0, length); + return new String(buf, "utf-8"); + } + if (offset > src.length) { + offset = src.length; + } else if (offset < 0) { + offset = 0; + } + int n = length - src.length; + + System.arraycopy(src, 0, buf, 0, offset); + for (int i = 0; i < n; i++) { + buf[i + offset] = (byte) c; + } + System.arraycopy(src, offset, buf, offset + n, src.length - offset); + return new String(buf, "utf-8"); + } + + /** + * @param original 原字符串 + * @param offset 填充开始的位置, 0-在左边, original.getBytes().length 在右边, 如果有中文时需小心位置 + * @param length 替换的字节数 + * @param c 用于替换的字符 + * @return + * @Title: replace + * @Description: 替换字符串, 长度是按字节计算, 不是字符 + * @since: 0.0.1 + */ + public static String replace(String original, int offset, int length, char c) throws UnsupportedEncodingException { + if (original == null) { + original = ""; + } + if (original.getBytes("utf-8").length <= offset) { + return original; + } + if (original.getBytes("utf-8").length < offset + length) { + length = original.getBytes("utf-8").length - offset; + } + byte[] buf = new byte[original.length()]; + byte[] src = original.getBytes("utf-8"); + System.arraycopy(src, 0, buf, 0, offset); + + for (int i = offset; i < offset + length; i++) { + buf[i] = (byte) c; + } + System.arraycopy(src, offset + length, buf, offset + length, src.length - offset - length); + return new String(buf, "utf-8"); + } + + /** + * @param s 16进制字符串 + * @return + * @Title: hexToByte + * @Description: 16进制字符串转字节数组 + * @since: 0.0.1 + */ + public static byte[] hexToByte(String s) { + byte[] result = null; + try { + int i = s.length(); +// if (i % 2 == 1) { +// throw new Exception("字符串长度不是偶数."); +// } + if (i % 2 != 0) { + throw new Exception("字符串长度不是偶数."); + } + result = new byte[i / 2]; + for (int j = 0; j < result.length; j++) { + result[j] = (byte) Integer.parseInt(s.substring(j * 2, j * 2 + 2), 16); + } + } catch (Exception e) { + result = null; + e.printStackTrace(); +// log.error("16进制字符串转字节数组时出现异常:", e); + } + return result; + } + + /** + * @param bytes 字节数组 + * @return + * @Title: byte2hexString + * @Description: 字节数组转换为16进制字符串 //0x33 0xD2 0x00 0x46 转换为 "33d20046" 转换和打印报文用 + * @since: 0.0.1 + */ + public static String byte2hexString(byte[] bytes) { + StringBuffer buf = new StringBuffer(bytes.length * 2); + for (int i = 0; i < bytes.length; i++) { + if (((int) bytes[i] & 0xff) < 0x10) { + buf.append("0"); + } + buf.append(Long.toString((int) bytes[i] & 0xff, 16)); + } + return buf.toString().toUpperCase(); + } + + /** + * @param hexString 16进制字符串 如:"33d20046" 转换为 0x33 0xD2 0x00 0x46 + * @return + * @Title: hexString2byte + * @Description: 16进制字符串转字节数组 + * @since: 0.0.1 + */ + public static byte[] hexString2byte(String hexString) { + if (null == hexString || hexString.length() % 2 != 0 || hexString.contains("null")) { + return null; + } + byte[] bytes = new byte[hexString.length() / 2]; + for (int i = 0; i < hexString.length(); i += 2) { + bytes[i / 2] = (byte) (Integer.parseInt(hexString.substring(i, i + 2), 16) & 0xff); + } + return bytes; + } + + /** + * @param i 需要转的int类型数字 + * @return + * @Title: byte1ToBcd2 + * @Description: int类型转BCD码 + * @since: 0.0.1 + */ + public static String byte1ToBcd2(int i) { +// return (new Integer(i / 16).toString() + (new Integer(i % 16)).toString()); + return Integer.toString(i / 16) + Integer.toString(i % 16); + } + + /** + * @param b 字节数组 + * @return + * @Title: byteToHex2 + * @Description: 字节数组转换为16进制字符串 For example, byte[] {0x01,0x23,0x45,0x67,0x89,0xAB,0xCD,0xEF} will be changed to String "0123456789ABCDEF" + * @since: 0.0.1 + */ + public static String byteToHex2(byte[] b) { + StringBuffer result = new StringBuffer(); + String tmp = ""; + + for (int i = 0; i < b.length; i++) { + tmp = Integer.toHexString(b[i] & 0xff); + if (tmp.length() == 1) { + result.append("0" + tmp); + } else { + result.append(tmp); + } + } + return result.toString().toUpperCase(); + } + + /** + * @param num 数字 + * @param len 字节数组长度 + * @return + * @Title: intToHexBytes + * @Description: int类型转16进制字节数组 + */ + public static byte[] intToHexBytes(int num, int len) { + byte[] bytes = null; + String hexString = Integer.toHexString(num); + if (len > 0) { + int length = len * 2; + hexString = leftFill(hexString, '0', length); + bytes = CommonUtils.hexString2byte(hexString); + } + return bytes; + } + + private static String leftFill(String hexString, char c, int length) { + StringBuilder stringBuilder = new StringBuilder(); + if(hexString.length() < length){ + for(int count = 0; count getSubElement(byte[] message) { +// Map map = new HashMap(); +// String key = null; +// String value = null; +// int len = 0; +// int idx = 0; +// while (idx < message.length) { +// key = new String(message, idx, 2); +// idx += 2; //取了SE id 移2位 +// len = Integer.parseInt(new String(message, idx, 2)); +// idx += 2; //取了SE id的内容长度 移2位 +// value = new String(message, idx, len); +// map.put(key, value); +// idx += len; +// } +// return map; +// } + + //byte数组转成long + + /** + * @param b 将字节数组转long类型 位置为小端 + * @return + */ + public static long byteToLong(byte[] b) { + long s = 0; + long s0 = b[0] & 0xff;// 最低位 + long s1 = b[1] & 0xff; + long s2 = b[2] & 0xff; + long s3 = b[3] & 0xff; + long s4 = b[4] & 0xff;// 最低位 + long s5 = b[5] & 0xff; + long s6 = b[6] & 0xff; + long s7 = b[7] & 0xff; + + // s0不变 + s1 <<= 8; + s2 <<= 16; + s3 <<= 24; + s4 <<= 8 * 4; + s5 <<= 8 * 5; + s6 <<= 8 * 6; + s7 <<= 8 * 7; + s = s0 | s1 | s2 | s3 | s4 | s5 | s6 | s7; + return s; + } + + /** + * @param b 将字节数组转int类型 位置为小端 + * @return + */ + public static int byteToInt(byte[] b) { + int s = 0; + int s0 = b[0] & 0xff;// 最低位 + int s1 = b[1] & 0xff; + int s2 = b[2] & 0xff; + int s3 = b[3] & 0xff; + + // s0不变 + s1 <<= 8; + s2 <<= 16; + s3 <<= 24; + + s = s0 | s1 | s2 | s3; + return s; + } + + /** + * int类型转换小端的byte数组 + * @param i + * @return + */ + public static byte[] intToLittleBytes(int i) { + ByteBuffer byteBuffer = ByteBuffer.allocate(4); + byteBuffer.order(ByteOrder.LITTLE_ENDIAN); + byteBuffer.asIntBuffer().put(i); + byte[] littleBytes = byteBuffer.array(); + return littleBytes; + } + + /** + * 将一个字节转成10进制 + * @param b + * @return + */ + public static int byteToInt(byte b) { + int value = b & 0xff; + return value; + } + + /** + * 字节数组合并 + * @param bt1 字节数组bt1 + * @param bt2 字节数组bt2 + * @return + */ + public static byte[] byteMerger(byte[] bt1, byte[] bt2){ + byte[] bt3 = new byte[bt1.length+bt2.length]; + System.arraycopy(bt1, 0, bt3, 0, bt1.length); + System.arraycopy(bt2, 0, bt3, bt1.length, bt2.length); + return bt3; + } + +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/util/DateUtils.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/util/DateUtils.java new file mode 100644 index 0000000..bb5fb85 --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/util/DateUtils.java @@ -0,0 +1,1090 @@ +package com.passManage.us.admin.common.util; + +import org.springframework.util.StringUtils; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +/** + * 工具类-日期处理 + * + * @author xx + * @version 1.0 + * @since 2014年1月28日 + */ +public class DateUtils { + + /** + * 获得当前日期 + * + * @return + */ + public static Date getNow() { + Calendar cal = Calendar.getInstance(); + Date currDate = cal.getTime(); + return currDate; + } + + /** + * 日期转换为字符串 格式自定义 + * + * @param date + * @param f + * @return + */ + public static String dateStr(Date date, String f) { + if (date == null) { + return ""; + } + SimpleDateFormat format = new SimpleDateFormat(f); + String str = format.format(date); + return str; + } + + /** + * 日期转换为字符串 MM月dd日 hh:mm + * + * @param date + * @return + */ + public static String dateStr(Date date) { + return dateStr(date, "MM月dd日 hh:mm"); + } + + /** + * 日期转换为字符串 yyyy-MM-dd + * + * @param date + * @return + */ + public static String dateStr2(Date date) { + return dateStr(date, "yyyy-MM-dd"); + } + + /** + * yyyy年MM月dd日HH时mm分ss秒 + * + * @param date + * @return + */ + public static String dateStr5(Date date) { + return dateStr(date, "yyyy年MM月dd日 HH时mm分ss秒"); + } + + /** + * yyyyMMddHHmmss + * + * @param date + * @return + */ + public static String dateStr3(Date date) { + return dateStr(date, "yyyyMMddHHmmss"); + } + + /** + * yyyy-MM-dd HH:mm:ss + * + * @param date + * @return + */ + public static String dateStr4(Date date) { + return dateStr(date, "yyyy-MM-dd HH:mm:ss"); + + } + + /** + * yyyy年MM月dd日 + * + * @param date + * @return + */ + public static String dateStr6(Date date) { + return dateStr(date, "yyyy年MM月dd日"); + } + + /** + * yyyyMMdd + * + * @param date + * @return + */ + public static String dateStr7(Date date) { + return dateStr(date, "yyyyMMdd"); + } + + /** + * MM-dd + * + * @param date + * @return + */ + public static String dateStr8(Date date) { + return dateStr(date, "MM-dd"); + } + + /** + * HH:mm + * + * @param date + * @return + */ + public static String dateStr9(Date date) { + return dateStr(date, "HH:mm"); + } + + /** + * 将时间戳转换为Date + * + * @param times + * @return + */ + public static Date getDate(String times) { + long time = Long.parseLong(times); + return new Date(time * 1000); + } + + public static String dateStr(String times) { + return dateStr(getDate(times)); + } + + public static String dateStr2(String times) { + return dateStr2(getDate(times)); + } + + public static String dateStr3(String times) { + return dateStr3(getDate(times)); + } + + public static String dateStr4(String times) { + return dateStr4(getDate(times)); + } + + public static String dateStr5(String times) { + return dateStr5(getDate(times)); + } + + /** + * 将Date转换为时间戳 + * + * @param date + * @return + */ + public static long getTime(Date date) { + return date.getTime() / 1000; + } + + public static int getDay(Date d) { + Calendar cal = Calendar.getInstance(); + cal.setTime(d); + return cal.get(Calendar.DAY_OF_MONTH); + } + + /** + * s - 表示 "yyyy-mm-dd" 形式的日期的 String 对象 + * + * @param + * @return + */ + public static Date valueOf(String s) { + final int YEAR_LENGTH = 4; + final int MONTH_LENGTH = 2; + final int DAY_LENGTH = 2; + final int MAX_MONTH = 12; + final int MAX_DAY = 31; + int firstDash; + int secondDash; + int threeDash = 0; + int fourDash = 0; + Date d = null; + + if (s == null) { + throw new IllegalArgumentException(); + } + + firstDash = s.indexOf('-'); + secondDash = s.indexOf('-', firstDash + 1); + if (s.contains(":")) { + threeDash = s.indexOf(':'); + fourDash = s.indexOf(':', threeDash + 1); + } + if ((firstDash > 0) && (secondDash > 0) && (secondDash < s.length() - 1)) { + String yyyy = s.substring(0, firstDash); + String mm = s.substring(firstDash + 1, secondDash); + String dd = ""; + String hh = ""; + String MM = ""; + String ss = ""; + if (s.contains(":")) { + dd = s.substring(secondDash + 1, threeDash - 3); + hh = s.substring(threeDash - 2, threeDash); + MM = s.substring(threeDash + 1, fourDash); + ss = s.substring(fourDash + 1); + } else { + dd = s.substring(secondDash + 1); + } + if (yyyy.length() == YEAR_LENGTH && mm.length() == MONTH_LENGTH && dd.length() == DAY_LENGTH) { + int year = Integer.parseInt(yyyy); + int month = Integer.parseInt(mm); + int day = Integer.parseInt(dd); + int hour = 0; + int minute = 0; + int second = 0; + if (s.contains(":")) { + hour = Integer.parseInt(hh); + minute = Integer.parseInt(MM); + second = Integer.parseInt(ss); + } + if (month >= 1 && month <= MAX_MONTH) { + int maxDays = MAX_DAY; + switch (month) { + // February determine if a leap year or not + case 2: + if ((year % 4 == 0 && !(year % 100 == 0)) || (year % 400 == 0)) { + maxDays = MAX_DAY - 2; // leap year so 29 days in + // February + } else { + maxDays = MAX_DAY - 3; // not a leap year so 28 days + // in February + } + break; + // April, June, Sept, Nov 30 day months + case 4: + case 6: + case 9: + case 11: + maxDays = MAX_DAY - 1; + break; + } + if (day >= 1 && day <= maxDays) { + Calendar cal = Calendar.getInstance(); + cal.set(year, month - 1, day, hour, minute, second); + cal.set(Calendar.MILLISECOND, 0); + d = cal.getTime(); + } + } + } + } + if (d == null) { + throw new IllegalArgumentException(); + } + return d; + } + + /** + * 获取指定日期星期几 + * + * @param dt + * @return + */ + public static String getWeekOfDate(Date dt) { + String[] weekDays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"}; + Calendar cal = Calendar.getInstance(); + cal.setTime(dt); + int w = cal.get(Calendar.DAY_OF_WEEK) - 1; + if (w < 0) { + w = 0; + } + return weekDays[w]; + } + + + /** + * 获取指定日期星期几(int) + * + * @param dt + * @return + */ + public static int getWeekOfInt(Date dt) { + int[] weekDays = {7, 1, 2, 3, 4, 5, 6}; + Calendar cal = Calendar.getInstance(); + cal.setTime(dt); + int w = cal.get(Calendar.DAY_OF_WEEK) - 1; + if (w < 0) { + w = 0; + } + return weekDays[w]; + } + + + /** + * 前/后?分钟 + * + * @param d + * @param minute + * @return + */ + public static Date rollMinute(Date d, int minute) { + return new Date(d.getTime() + minute * 60 * 1000); + } + + /** + * 前/后?天 + * + * @param d + * @param day + * @return + */ + public static Date rollDay(Date d, int day) { + Calendar cal = Calendar.getInstance(); + cal.setTime(d); + cal.add(Calendar.DAY_OF_MONTH, day); + return cal.getTime(); + } + + /** + * 前/后?月 + * + * @param d + * @param mon + * @return + */ + public static Date rollMon(Date d, int mon) { + Calendar cal = Calendar.getInstance(); + cal.setTime(d); + cal.add(Calendar.MONTH, mon); + return cal.getTime(); + } + + /** + * 前/后?年 + * + * @param d + * @param year + * @return + */ + public static Date rollYear(Date d, int year) { + Calendar cal = Calendar.getInstance(); + cal.setTime(d); + cal.add(Calendar.YEAR, year); + return cal.getTime(); + } + + public static Date rollDate(Date d, int year, int mon, int day) { + Calendar cal = Calendar.getInstance(); + cal.setTime(d); + cal.add(Calendar.YEAR, year); + cal.add(Calendar.MONTH, mon); + cal.add(Calendar.DAY_OF_MONTH, day); + return cal.getTime(); + } + + /** + * 获取当前时间-时间戳字符串 + * + * @return + */ + public static String getNowTimeStr() { + String str = Long.toString(System.currentTimeMillis() / 1000); + return str; + } + + /** + * 获取当前时间-时间戳 + * + * @return + */ + public static long getNowTime() { + return System.currentTimeMillis(); + } + + /** + * 将Date转换为时间戳 + * + * @param time + * @return + */ + public static String getTimeStr(Date time) { + long date = time.getTime(); + String str = Long.toString(date / 1000); + return str; + } + + public static String getTimeStr(String dateStr, String format) { + SimpleDateFormat sdf = new SimpleDateFormat(format); + Date date; + try { + date = sdf.parse(dateStr); + } catch (Exception e) { + e.printStackTrace(); + return ""; + } + String str = DateUtils.getTimeStr(date); + return str; + } + + + public static Date getIntegralTime() { + Calendar cal = Calendar.getInstance(); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.MILLISECOND, 0); + return cal.getTime(); + } + + /** + * 获取当天23:59:59 + * + * @return + */ + public static Date getLastIntegralTime() { + Calendar cal = Calendar.getInstance(); + cal.set(Calendar.HOUR_OF_DAY, 23); + cal.set(Calendar.SECOND, 59); + cal.set(Calendar.MINUTE, 59); + cal.set(Calendar.MILLISECOND, 0); + return cal.getTime(); + } + + /** + * 设置时间格式为 23:59:59 + * + * @return + */ + public static Date getLastSecIntegralTime(Date d) { + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(d.getTime()); + cal.set(Calendar.HOUR_OF_DAY, 23); + cal.set(Calendar.SECOND, 59); + cal.set(Calendar.MINUTE, 59); + cal.set(Calendar.MILLISECOND, 0); + return cal.getTime(); + } + + /** + * 获取本周日的日期 + */ + public static String getCurrentWeekday() { + int weeks = 0; + int mondayPlus = DateUtils.getMondayPlus(); + GregorianCalendar currentDate = new GregorianCalendar(); + currentDate.add(GregorianCalendar.DATE, mondayPlus + 6); + Date monday = currentDate.getTime(); + + DateFormat df = DateFormat.getDateInstance(); + String preMonday = df.format(monday); + return preMonday; + } + + /** + * 获取时间戳 + * + * @param format 日期时间 + * @return + */ + public static long getTime(String format) { + long t = 0; + if (StringUtils.isEmpty(format)) { + return t; + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date; + try { + date = sdf.parse(format); + t = date.getTime() / 1000; + } catch (Exception e) { + e.printStackTrace(); + } + return t; + } + + /** + * 获得当前日期与本周日相差的天数 + */ + private static int getMondayPlus() { + Calendar cd = Calendar.getInstance(); + // 获得今天是一周的第几天,星期日是第一天,星期二是第二天...... + int dayOfWeek = cd.get(Calendar.DAY_OF_WEEK) - 1; + // 因为按中国礼拜一作为第一天所以这里减1 + if (dayOfWeek == 1) { + return 0; + } else { + return 1 - dayOfWeek; + } + } + + + /** + * 获得本周一的日期 + * + * @return + */ + public static String getMondayOFWeek() { + int weeks = 0; + int mondayPlus = DateUtils.getMondayPlus(); + GregorianCalendar currentDate = new GregorianCalendar(); + currentDate.add(GregorianCalendar.DATE, mondayPlus); + Date monday = currentDate.getTime(); + + DateFormat df = DateFormat.getDateInstance(); + String preMonday = df.format(monday); + return preMonday; + } + + /** + * 获取当前月第一天: + */ + public static String getFirstDayOfMonth(String first) { + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + Calendar c = Calendar.getInstance(); + c.add(Calendar.MONTH, 0); + // 设置为1号,当前日期既为本月第一天 + c.set(Calendar.DAY_OF_MONTH, 1); + first = format.format(c.getTime()); + return first; + } + + /** + * 获取当月最后一天 + */ + public static String getLastDayOfMonth(String last) { + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + Calendar ca = Calendar.getInstance(); + ca.set(Calendar.DAY_OF_MONTH, ca.getActualMaximum(Calendar.DAY_OF_MONTH)); + last = format.format(ca.getTime()); + return last; + } + + /** + * 获取当月最后一天 天数 + */ + public static Integer getLastDayOfMonthInt(Date date) { + Calendar ca = Calendar.getInstance(); + ca.setTime(date); + return ca.get(Calendar.DATE); + } + + /** + * 日期月份处理 + * + * @param d 时间 + * @param month 相加的月份,正数则加,负数则减 + * @return + */ + public static Date timeMonthManage(Date d, int month) { + Calendar rightNow = Calendar.getInstance(); + rightNow.setTime(d); + rightNow.add(Calendar.MONTH, month); + return rightNow.getTime(); + } + + /** + * 获取指定年月的最后一天 + * + * @param year_time 指定年 + * @param month_time 指定月 + * @return + */ + public static Date monthLastDay(int year_time, int month_time) { + Calendar cal = Calendar.getInstance(); + cal.set(year_time, month_time, 0, 23, 59, 59); + return cal.getTime(); + } + + /** + * 获取指定年月的第一天 + * + * @param year_time 指定年 + * @param month_time 指定月 + * @return + */ + public static Date monthFirstDay(int year_time, int month_time) { + Calendar cal = Calendar.getInstance(); + cal.set(year_time, month_time - 1, 1, 0, 0, 0); + return cal.getTime(); + } + + /** + * 获取指定时间月的第一天 + * + * @param d 指定时间,为空代表当前时间 + * @return + */ + public static Date currMonthFirstDay(Date d) { + Calendar cal = Calendar.getInstance(); + if (d != null) { + cal.setTime(d); + } + cal.set(Calendar.DAY_OF_MONTH, cal.getActualMinimum(Calendar.DAY_OF_MONTH)); + cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE), 0, 0, 0); + return cal.getTime(); + } + + /** + * 获取指定时间月的最后一天 + * + * @param d 指定时间,为空代表当前时间 + * @return + */ + public static Date currMonthLastDay(Date d) { + Calendar cal = Calendar.getInstance(); + if (d != null) + cal.setTime(d); + cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH)); + cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE), 23, 59, 59); + return cal.getTime(); + } + + /** + * 获取指定时间的年 + * + * @param date 指定时间 + * @return + */ + public static int getTimeYear(Date date) { + if (date == null) { + date = new Date(); + } + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + return cal.get(Calendar.YEAR); + } + + /** + * 获取指定时间的月 + * + * @param date 指定时间 + * @return + */ + public static int getTimeMonth(Date date) { + if (date == null) { + date = new Date(); + } + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + return cal.get(Calendar.MONTH) + 1; + } + + /** + * 获取指定时间的天 + * + * @param date 指定时间 + * @return + */ + public static int getTimeDay(Date date) { + if (date == null) + date = new Date(); + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + return cal.get(Calendar.DATE); + } + + public static Date getFirstSecIntegralTime(Date d) { + Calendar cal = Calendar.getInstance(); + cal.setTimeInMillis(d.getTime()); + cal.set(Calendar.HOUR_OF_DAY, 0); + cal.set(Calendar.SECOND, 0); + cal.set(Calendar.MINUTE, 0); + cal.set(Calendar.MILLISECOND, 0); + cal.set(Calendar.DATE, 0); + return cal.getTime(); + } + + /** + * 获取指定时间天的结束时间 + * + * @param d + * @return + */ + public static Date getDayEndTime(long d) { + Date day = null; + if (d <= 0) { + day = new Date(); + } else { + day = new Date(d * 1000); + } + Calendar cal = Calendar.getInstance(); + if (day != null) { + cal.setTimeInMillis(day.getTime()); + } + cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE), 23, 59, 59); + return cal.getTime(); + } + + /** + * 获取指定时间天的开始时间 + * + * @param d + * @return + */ + public static Date getDayStartTime(long d) { + Date day = null; + if (d <= 0) { + day = new Date(); + } else { + day = new Date(d * 1000); + } + Calendar cal = Calendar.getInstance(); + if (day != null) { + cal.setTimeInMillis(day.getTime()); + } + cal.set(cal.get(Calendar.YEAR), cal.get(Calendar.MONTH), cal.get(Calendar.DATE), 0, 0, 0); + return cal.getTime(); + } + + /** + * 获取19位的格式时间 + * + * @param dateStr + * @return + * @throws + */ + public static Date getDateByFullDateStr(String dateStr) { + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + return sdf.parse(dateStr); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取16位的格式时间 yyyy-MM-dd HH:mm + * + * @param dateStr + * @return + * @throws Exception + */ + public static Date getDateByStr(String dateStr) { + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm"); + return sdf.parse(dateStr); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取yyyy-MM-dd的格式时间 + * + * @param dateStr + * @return + * @throws + */ + public static Date getDateByDateStr(String dateStr) { + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + return sdf.parse(dateStr); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取两个日期相差的月数 + * + * @param d1 较大的日期 + * @param d2 较小的日期 + * @return 如果d1>d2返回 月数差 否则返回0 + */ + public static int monthsBetween(Date d1, Date d2) { + Calendar c1 = Calendar.getInstance(); + Calendar c2 = Calendar.getInstance(); + c1.setTime(d1); + c2.setTime(d2); + if (c1.getTimeInMillis() < c2.getTimeInMillis()) { + return 0; + } + int year1 = c1.get(Calendar.YEAR); + int year2 = c2.get(Calendar.YEAR); + int month1 = c1.get(Calendar.MONTH); + int month2 = c2.get(Calendar.MONTH); + int day1 = c1.get(Calendar.DAY_OF_MONTH); + int day2 = c2.get(Calendar.DAY_OF_MONTH); + // 获取年的差值 假设 d1 = 2015-8-16 d2 = 2011-9-30 + int yearInterval = year1 - year2; + // 如果 d1的 月-日 小于 d2的 月-日 那么 yearInterval-- 这样就得到了相差的年数 + if (month1 < month2 || month1 == month2 && day1 < day2) { + yearInterval--; + } + // 获取月数差值 + int monthInterval = (month1 + 12) - month2; + if (day1 < day2) { + monthInterval--; + } + monthInterval %= 12; + return yearInterval * 12 + monthInterval; + } + + /** + * 计算date2 - date1之间相差的天数 + * + * @param date1 + * @param date2 + * @return + */ + public static int daysBetween(Date date1, Date date2) { + DateFormat sdf = new SimpleDateFormat("yyyyMMdd"); + Calendar cal = Calendar.getInstance(); + try { + Date d1 = sdf.parse(DateUtils.dateStr7(date1)); + Date d2 = sdf.parse(DateUtils.dateStr7(date2)); + cal.setTime(d1); + long time1 = cal.getTimeInMillis(); + cal.setTime(d2); + long time2 = cal.getTimeInMillis(); + return Integer.parseInt(String.valueOf((time2 - time1) / 86400000L)); + } catch (Exception e) { + e.printStackTrace(); + } + return 0; + } + + /** + * 计算date2 - date1之间相差的分钟 + * + * @param date1 + * @param date2 + * @return + */ + public static int minutesBetween(Date date1, Date date2) { + Calendar cal = Calendar.getInstance(); + cal.setTime(date1); + long time1 = cal.getTimeInMillis(); + cal.setTime(date2); + long time2 = cal.getTimeInMillis(); + if (time2 - time1 <= 0) { + return 0; + } else { + return Integer.parseInt(String.valueOf((time2 - time1) / 60000L)) + 1; + } + + } + + /** + * 计算date2 - date1之间相差的秒 + * + * @param date1 + * @param date2 + * @return + */ + public static int secondBetween(Date date1, Date date2) { + Calendar cal = Calendar.getInstance(); + cal.setTime(date1); + long time1 = cal.getTimeInMillis(); + cal.setTime(date2); + long time2 = cal.getTimeInMillis(); + if (time2 - time1 <= 0) { + return 0; + } else { + return Integer.parseInt(String.valueOf((time2 - time1) / 1000L)) + 1; + } + } + + /** + * 计算date2 - date1之间相差的毫秒 + * + * @param date1 + * @param date2 + * @return + */ + public static int millisecondBetween(Date date1, Date date2) { + Calendar cal = Calendar.getInstance(); + cal.setTime(date1); + long time1 = cal.getTimeInMillis(); + cal.setTime(date2); + long time2 = cal.getTimeInMillis(); + if (time2 - time1 <= 0) { + return 0; + } else { + return Integer.parseInt(String.valueOf((time2 - time1))); + } + } + + /** + * 获取当月开始时间 + */ + public static Date getMonthStartTime() { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM"); + Calendar cal = Calendar.getInstance(); + Date nowdate = cal.getTime(); + String date1 = sdf.format(nowdate); + date1 += "-01 00:00:00"; + try { + SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + return sdf2.parse(date1); + } catch (Exception e) { + e.printStackTrace(); + return null; + } + } + + /** + * 获取当月开始时间Str + */ + public static String getMonthStartTimeStr() { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM"); + Calendar cal = Calendar.getInstance(); + Date nowdate = cal.getTime(); + String date = sdf.format(nowdate); + date += "-01 00:00:00"; + return date; + } + + + /** + * 获取当月结束时间 + */ + + public static Date getMonthEndTime() { + Calendar calendar = Calendar.getInstance(); + // 设置日期为本月最大日期 + calendar.set(Calendar.DATE, calendar.getActualMaximum(Calendar.DATE)); + // 打印 + DateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd"); + calendar.getTime(); + String date1 = sdf1.format(calendar.getTime()); + date1 += " 23:59:59"; + SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + try { + return sdf2.parse(date1); + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + + + /** + * 根据当前日期计算今年剩余天数 + * + * @return + */ + public static int getLeftDaysOfCurrYear() { + return daysBetween(new Date(), getCurrYearLast()); + } + + /** + * 获取当年的最后一天 + * + * @return + */ + public static Date getCurrYearLast() { + Calendar currCal = Calendar.getInstance(); + int currentYear = currCal.get(Calendar.YEAR); + return getYearLast(currentYear); + } + + /** + * 获取某年最后一天日期 + * + * @param year 年份 + * @return Date + */ + public static Date getYearLast(int year) { + Calendar calendar = Calendar.getInstance(); + calendar.clear(); + calendar.set(Calendar.YEAR, year); + calendar.roll(Calendar.DAY_OF_YEAR, -1); + Date currYearLast = calendar.getTime(); + + return currYearLast; + } + + /** + * 根据出生日期计算年龄 + * + * @param birthday 出生日期 + * @return + */ + public static int getAge(Date birthday) { + int age = 0; + Calendar born = Calendar.getInstance(); + Calendar now = Calendar.getInstance(); + if (birthday != null) { + now.setTime(new Date()); + born.setTime(birthday); + if (born.after(now)) { + throw new IllegalArgumentException("年龄不能超过当前日期"); + } + age = now.get(Calendar.YEAR) - born.get(Calendar.YEAR); + int nowDayOfYear = now.get(Calendar.DAY_OF_YEAR); + int bornDayOfYear = born.get(Calendar.DAY_OF_YEAR); + if (nowDayOfYear < bornDayOfYear) { + age -= 1; + } + } + return age; + } + + + /** + * 判断当前时间是否是否 3:00过后 如果当前时间是交易时间段 + * + * @return + */ + public static boolean checkedTransactionTime() { + Date da = new Date(); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + String now = sdf.format(da); + Calendar c1 = Calendar.getInstance(); + Calendar c2 = Calendar.getInstance(); + try { + c1.setTime(sdf.parse(now)); + c2.setTime(sdf.parse("15:00:00")); + } catch (ParseException e) { + e.printStackTrace(); + } + + if ((c1.compareTo(c2) > 0)) { + return false; + } + return true; + } + + + /** + * 判断当前时间是否是否 2:30前 + * + * @return + */ + public static boolean checkedTransactionTowTime() { + Date da = new Date(); + SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + String now = sdf.format(da); + Calendar c1 = Calendar.getInstance(); + Calendar c2 = Calendar.getInstance(); + try { + c1.setTime(sdf.parse(now)); + c2.setTime(sdf.parse("14:30:00")); + } catch (ParseException e) { + e.printStackTrace(); + } + + if ((c1.compareTo(c2) > 0)) { + return false; + } + return true; + } + + /** + * 日期转换为字符串 格式自定义 + * + * @param date + * @param f + * @return + */ + public static Date dateFormat(Date date, String f) { + Date date1 = new Date(); + if (date == null) { + return null; + } + SimpleDateFormat format = new SimpleDateFormat(f); + String str = format.format(date); + try { + date1 = format.parse(str); + } catch (ParseException e) { + e.printStackTrace(); + } + return date1; + } + + +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/util/HttpUtils.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/util/HttpUtils.java new file mode 100644 index 0000000..5b5441f --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/util/HttpUtils.java @@ -0,0 +1,129 @@ +package com.passManage.us.admin.common.util; + +import lombok.extern.slf4j.Slf4j; +import org.apache.http.HttpEntity; +import org.apache.http.NameValuePair; +import org.apache.http.client.ResponseHandler; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.entity.StringEntity; +import org.apache.http.impl.client.BasicResponseHandler; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.message.BasicNameValuePair; +import org.apache.http.util.EntityUtils; + +import java.io.IOException; +import java.net.URLEncoder; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +@Slf4j +public class HttpUtils { + + private static final String ENCODING = "UTF-8"; + + + public static String post(String url, Map paramsMap) { + CloseableHttpClient client = HttpClients.createDefault(); + String responseText = ""; + CloseableHttpResponse response = null; + try { + HttpPost method = new HttpPost(url); + if (paramsMap != null) { + List paramList = new ArrayList(); + for (Map.Entry param : paramsMap.entrySet()) { + NameValuePair pair = new BasicNameValuePair(param.getKey(), param.getValue()); + paramList.add(pair); + } + method.setEntity(new UrlEncodedFormEntity(paramList, ENCODING)); + } + response = client.execute(method); + HttpEntity entity = response.getEntity(); + if (entity != null) { + responseText = EntityUtils.toString(entity); + } + } catch (Exception e) { + log.error("http request failed",e); + } finally { + try { + response.close(); + } catch (Exception e) { + log.error("",e); + } + } + return responseText; + } + + public static String get(String url, Map paramsMap) { + CloseableHttpClient client = HttpClients.createDefault(); + String responseText = ""; + CloseableHttpResponse response = null; + try { + String getUrl = url+"?"; + if (paramsMap != null) { + for (Map.Entry param : paramsMap.entrySet()) { + getUrl += param.getKey() + "=" + URLEncoder.encode(param.getValue(), ENCODING)+"&"; + } + } + HttpGet method = new HttpGet(getUrl); + response = client.execute(method); + HttpEntity entity = response.getEntity(); + if (entity != null) { + responseText = EntityUtils.toString(entity); + } + } catch (Exception e) { + log.error("http request failed",e); + } finally { + try { + response.close(); + } catch (Exception e) { + log.error("",e); + } + } + return responseText; + } + //post请求参数为json格式 + public static String HttpPostWithJson(String url, String json) { + String returnValue = "这是默认返回值,接口调用失败"; + CloseableHttpClient httpClient = HttpClients.createDefault(); + ResponseHandler responseHandler = new BasicResponseHandler(); + try{ + //第一步:创建HttpClient对象 + httpClient = HttpClients.createDefault(); + + //第二步:创建httpPost对象 + HttpPost httpPost = new HttpPost(url); + + //第三步:给httpPost设置JSON格式的参数 + StringEntity requestEntity = new StringEntity(json,"utf-8"); + requestEntity.setContentEncoding("UTF-8"); + httpPost.setHeader("Content-type", "application/json"); + httpPost.setEntity(requestEntity); + + //第四步:发送HttpPost请求,获取返回值 + returnValue = httpClient.execute(httpPost,responseHandler); //调接口获取返回值时,必须用此方法 + + } + catch(Exception e) + { + e.printStackTrace(); + } + + finally { + try { + httpClient.close(); + } catch (IOException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + } + //第五步:处理返回值 + return returnValue; + } + + +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/util/JedisConnectionUtils.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/util/JedisConnectionUtils.java new file mode 100644 index 0000000..5d1bc52 --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/util/JedisConnectionUtils.java @@ -0,0 +1,14 @@ +package com.passManage.us.admin.common.util; + +import org.springframework.stereotype.Component; +import redis.clients.jedis.Jedis; + +@Component +public class JedisConnectionUtils { + + private static Jedis jedis = new Jedis("127.0.0.1", 6379); + + public static Jedis getJedis() { + return jedis; + } +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/util/PCIKeyPair.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/util/PCIKeyPair.java new file mode 100644 index 0000000..49b8f35 --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/util/PCIKeyPair.java @@ -0,0 +1,15 @@ +package com.passManage.us.admin.common.util; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Data +@AllArgsConstructor +@NoArgsConstructor +public class PCIKeyPair { + + private String priKey; //私钥 + private String pubKey; //公钥 + +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/util/R.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/util/R.java new file mode 100644 index 0000000..c06f7ce --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/util/R.java @@ -0,0 +1,48 @@ +package com.passManage.us.admin.common.util; + +import java.util.HashMap; +import java.util.Map; + +public class R extends HashMap { + private static final long serialVersionUID = 1L; + + public R() { + put("code", 200); + } + + public static R error() { + return error(500, "未知异常,请联系管理员"); + } + + public static R error(String msg) { + return error(500, msg); + } + + public static R error(int code, String msg) { + R r = new R(); + r.put("code", code); + r.put("msg", msg); + return r; + } + + public static R ok(String msg) { + R r = new R(); + r.put("msg", msg); + return r; + } + + public static R ok(Map map) { + R r = new R(); + r.putAll(map); + return r; + } + + public static R ok() { + return new R(); + } + + public R put(String key, Object value) { + super.put(key, value); + return this; + } +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/util/ResolveResponUtils.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/util/ResolveResponUtils.java new file mode 100644 index 0000000..759279b --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/util/ResolveResponUtils.java @@ -0,0 +1,111 @@ +package com.passManage.us.admin.common.util; + +import com.google.gson.Gson; + +import com.passManage.us.admin.common.KeyUtils.Sm4Util; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.stereotype.Component; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Component +public class ResolveResponUtils { + + @Autowired + private RedisTemplate redisTemplate; + + @Autowired + private Map map = new HashMap<>(); + + public Map resolveGetRespons(String url, Map paramsMap){ + String getRanStr = HttpUtils.get(url, paramsMap); + return getResponse(getRanStr); + } + + public Map resolvePostRespons(String url, Map paramsMap){ + String getRanStr = HttpUtils.post(url, paramsMap); + return getResponse(getRanStr); + } + + public Map resolvePostJsonRespons(String url, String postJson){ + String getRanStr = HttpUtils.HttpPostWithJson(url, postJson); + return getResponse(getRanStr); + } + + public String getGetResponseData(String url,Map paramsMap, String dataKey) throws Exception { + String getRanStr = HttpUtils.get(url, paramsMap); + return dealGetResponseData(dataKey, getRanStr); + } + + public String getPostJsonResponseData(String url,String postJson, String dataKey) throws Exception { + String getRanStr = HttpUtils.HttpPostWithJson(url, postJson); + return dealGetResponseData(dataKey, getRanStr); + } + + public String getPostResponseData(String url,Map paramsMap, String dataKey) throws Exception { + String getRanStr = HttpUtils.post(url, paramsMap); + return dealGetResponseData(dataKey, getRanStr); + } + + public Map getGetResponseDecryptData(String url,Map paramsMap, List dataKey) throws Exception { + String getRanStr = HttpUtils.get(url, paramsMap); + return dealResponseDecryptData(getRanStr,dataKey); + } + + public Map getPostResponseDecryptData(String url,Map paramsMap, List dataKey) throws Exception { + String getRanStr = HttpUtils.post(url, paramsMap); + return dealResponseDecryptData( getRanStr,dataKey); + } + + public Map getPostJsonResponseDecryptData(String url, String postjson, List dataKey) throws Exception { + String getRanStr = HttpUtils.HttpPostWithJson(url, postjson); + return dealResponseDecryptData( getRanStr,dataKey); + } + + private Map dealResponseDecryptData(String getRanStr, List dataKey) throws Exception { + String sessionkey = redisTemplate.opsForValue().get("sessionkey"); + Map response = getResponse(getRanStr); + Map perDatas = new HashMap<>(); + if(response!= null){ + for (String key : dataKey) { + perDatas.put(key, Sm4Util.decryptEcb(sessionkey, response.get(key).toString())); + } + }else{ + throw new Exception("Response is not defined"); + } + return perDatas; + } + + private String dealResponseListDecryptData(String dataKey, String getRanStr) throws Exception { + String sessionkey = redisTemplate.opsForValue().get("sessionkey"); + Map response = getResponse(getRanStr); + String perData = ""; + if(response!= null){ + perData = Sm4Util.decryptEcb(sessionkey, response.get(dataKey).toString()); + }else{ + throw new Exception("Response is not defined"); + } + return perData; + } + + + private String dealGetResponseData(String dataKey, String getRanStr) throws Exception { + Map response = getResponse(getRanStr); + String perData = ""; + if (response != null) { + perData = response.get(dataKey).toString(); + } else { + throw new Exception("Response is not defined"); + } + return perData; + } + + private Map getResponse(String getRanStr) { + Gson gson = new Gson(); + return gson.fromJson(getRanStr, map.getClass()); + } + +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/util/SpringBootUtil.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/util/SpringBootUtil.java new file mode 100644 index 0000000..bf0f087 --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/util/SpringBootUtil.java @@ -0,0 +1,22 @@ +package com.passManage.us.admin.common.util; + + +import org.springframework.boot.system.ApplicationHome; + +import java.io.File; + +/** + * 探知启动jar所在的路径 或者classpath + */ +public class SpringBootUtil { + //获取jar的所在的路径文件 + public static File getJarDir() { + ApplicationHome home = new ApplicationHome(SpringBootUtil.class); + return home.getDir(); + } + //获取jar的所在的路径文件字符串 + public static String getJarDirPath() { + ApplicationHome home = new ApplicationHome(SpringBootUtil.class); + return home.getDir().getAbsolutePath(); + } +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/util/Util.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/util/Util.java new file mode 100644 index 0000000..0dbda72 --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/common/util/Util.java @@ -0,0 +1,662 @@ +package com.passManage.us.admin.common.util; + +import java.math.BigInteger; + +public class Util +{ + /** + * 整形转换成网络传输的字节流(字节数组)型数据 + * + * @param num 一个整型数据 + * @return 4个字节的自己数组 + */ + public static byte[] intToBytes(int num) + { + byte[] bytes = new byte[4]; + bytes[0] = (byte) (0xff & (num >> 0)); + bytes[1] = (byte) (0xff & (num >> 8)); + bytes[2] = (byte) (0xff & (num >> 16)); + bytes[3] = (byte) (0xff & (num >> 24)); + return bytes; + } + + /** + * 四个字节的字节数据转换成一个整形数据 + * + * @param bytes 4个字节的字节数组 + * @return 一个整型数据 + */ + public static int byteToInt(byte[] bytes) + { + int num = 0; + int temp; + temp = (0x000000ff & (bytes[0])) << 0; + num = num | temp; + temp = (0x000000ff & (bytes[1])) << 8; + num = num | temp; + temp = (0x000000ff & (bytes[2])) << 16; + num = num | temp; + temp = (0x000000ff & (bytes[3])) << 24; + num = num | temp; + return num; + } + + /** + * 长整形转换成网络传输的字节流(字节数组)型数据 + * + * @param num 一个长整型数据 + * @return 4个字节的自己数组 + */ + public static byte[] longToBytes(long num) + { + byte[] bytes = new byte[8]; + for (int i = 0; i < 8; i++) + { + bytes[i] = (byte) (0xff & (num >> (i * 8))); + } + + return bytes; + } + + /** + * 大数字转换字节流(字节数组)型数据 + * + * @param n + * @return + */ + public static byte[] byteConvert32Bytes(BigInteger n) + { + byte tmpd[] = (byte[])null; + if(n == null) + { + return null; + } + + if(n.toByteArray().length == 33) + { + tmpd = new byte[32]; + System.arraycopy(n.toByteArray(), 1, tmpd, 0, 32); + } + else if(n.toByteArray().length == 32) + { + tmpd = n.toByteArray(); + } + else + { + tmpd = new byte[32]; + for(int i = 0; i < 32 - n.toByteArray().length; i++) + { + tmpd[i] = 0; + } + System.arraycopy(n.toByteArray(), 0, tmpd, 32 - n.toByteArray().length, n.toByteArray().length); + } + return tmpd; + } + + /** + * 换字节流(字节数组)型数据转大数字 + * + * @param b + * @return + */ + public static BigInteger byteConvertInteger(byte[] b) + { + if (b[0] < 0) + { + byte[] temp = new byte[b.length + 1]; + temp[0] = 0; + System.arraycopy(b, 0, temp, 1, b.length); + return new BigInteger(temp); + } + return new BigInteger(b); + } + + /** + * 根据字节数组获得值(十六进制数字) + * + * @param bytes + * @return + */ + public static String getHexString(byte[] bytes) + { + return getHexString(bytes, true); + } + + /** + * 根据字节数组获得值(十六进制数字) + * + * @param bytes + * @param upperCase + * @return + */ + public static String getHexString(byte[] bytes, boolean upperCase) + { + String ret = ""; + for (int i = 0; i < bytes.length; i++) + { + ret += Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1); + } + return upperCase ? ret.toUpperCase() : ret; + } + + /** + * 打印十六进制字符串 + * + * @param bytes + */ + public static void printHexString(byte[] bytes) + { + for (int i = 0; i < bytes.length; i++) + { + String hex = Integer.toHexString(bytes[i] & 0xFF); + if (hex.length() == 1) + { + hex = '0' + hex; + } + System.out.print("0x" + hex.toUpperCase() + ","); + } + System.out.println(""); + } + + /** + * Convert hex string to byte[] + * + * @param hexString + * the hex string + * @return byte[] + */ + public static byte[] hexStringToBytes(String hexString) + { + if (hexString == null || hexString.equals("")) + { + return null; + } + + hexString = hexString.toUpperCase(); + int length = hexString.length() / 2; + char[] hexChars = hexString.toCharArray(); + byte[] d = new byte[length]; + for (int i = 0; i < length; i++) + { + int pos = i * 2; + d[i] = (byte) (charToByte(hexChars[pos]) << 4 | charToByte(hexChars[pos + 1])); + } + return d; + } + + /** + * Convert char to byte + * + * @param c + * char + * @return byte + */ + public static byte charToByte(char c) + { + return (byte) "0123456789ABCDEF".indexOf(c); + } + + /** + * 用于建立十六进制字符的输出的小写字符数组 + */ + private static final char[] DIGITS_LOWER = {'0', '1', '2', '3', '4', '5', + '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; + + /** + * 用于建立十六进制字符的输出的大写字符数组 + */ + private static final char[] DIGITS_UPPER = {'0', '1', '2', '3', '4', '5', + '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; + + /** + * 将字节数组转换为十六进制字符数组 + * + * @param data byte[] + * @return 十六进制char[] + */ + public static char[] encodeHex(byte[] data) { + return encodeHex(data, true); + } + + /** + * 将字节数组转换为十六进制字符数组 + * + * @param data byte[] + * @param toLowerCase true 传换成小写格式 , false 传换成大写格式 + * @return 十六进制char[] + */ + public static char[] encodeHex(byte[] data, boolean toLowerCase) { + return encodeHex(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER); + } + + /** + * 将字节数组转换为十六进制字符数组 + * + * @param data byte[] + * @param toDigits 用于控制输出的char[] + * @return 十六进制char[] + */ + protected static char[] encodeHex(byte[] data, char[] toDigits) { + int l = data.length; + char[] out = new char[l << 1]; + // two characters form the hex value. + for (int i = 0, j = 0; i < l; i++) { + out[j++] = toDigits[(0xF0 & data[i]) >>> 4]; + out[j++] = toDigits[0x0F & data[i]]; + } + return out; + } + + /** + * 将字节数组转换为十六进制字符串 + * + * @param data byte[] + * @return 十六进制String + */ + public static String encodeHexString(byte[] data) { + return encodeHexString(data, true); + } + + /** + * 将字节数组转换为十六进制字符串 + * + * @param data byte[] + * @param toLowerCase true 传换成小写格式 , false 传换成大写格式 + * @return 十六进制String + */ + public static String encodeHexString(byte[] data, boolean toLowerCase) { + return encodeHexString(data, toLowerCase ? DIGITS_LOWER : DIGITS_UPPER); + } + + /** + * 将字节数组转换为十六进制字符串 + * + * @param data byte[] + * @param toDigits 用于控制输出的char[] + * @return 十六进制String + */ + protected static String encodeHexString(byte[] data, char[] toDigits) { + return new String(encodeHex(data, toDigits)); + } + + /** + * 将十六进制字符数组转换为字节数组 + * + * @param data 十六进制char[] + * @return byte[] + * @throws RuntimeException 如果源十六进制字符数组是一个奇怪的长度,将抛出运行时异常 + */ + public static byte[] decodeHex(char[] data) { + int len = data.length; + + if ((len & 0x01) != 0) { + throw new RuntimeException("Odd number of characters."); + } + + byte[] out = new byte[len >> 1]; + + // two characters form the hex value. + for (int i = 0, j = 0; j < len; i++) { + int f = toDigit(data[j], j) << 4; + j++; + f = f | toDigit(data[j], j); + j++; + out[i] = (byte) (f & 0xFF); + } + + return out; + } + + /** + * 将十六进制字符转换成一个整数 + * + * @param ch 十六进制char + * @param index 十六进制字符在字符数组中的位置 + * @return 一个整数 + * @throws RuntimeException 当ch不是一个合法的十六进制字符时,抛出运行时异常 + */ + protected static int toDigit(char ch, int index) { + int digit = Character.digit(ch, 16); + if (digit == -1) { + throw new RuntimeException("Illegal hexadecimal character " + ch + + " at index " + index); + } + return digit; + } + + /** + * 数字字符串转ASCII码字符串 + * + * @param String + * 字符串 + * @return ASCII字符串 + */ + public static String StringToAsciiString(String content) { + String result = ""; + int max = content.length(); + for (int i = 0; i < max; i++) { + char c = content.charAt(i); + String b = Integer.toHexString(c); + result = result + b; + } + return result; + } + + /** + * 十六进制转字符串 + * + * @param hexString + * 十六进制字符串 + * @param encodeType + * 编码类型4:Unicode,2:普通编码 + * @return 字符串 + */ + public static String hexStringToString(String hexString, int encodeType) { + String result = ""; + int max = hexString.length() / encodeType; + for (int i = 0; i < max; i++) { + char c = (char) hexStringToAlgorism(hexString + .substring(i * encodeType, (i + 1) * encodeType)); + result += c; + } + return result; + } + + /** + * 十六进制字符串装十进制 + * + * @param hex + * 十六进制字符串 + * @return 十进制数值 + */ + public static int hexStringToAlgorism(String hex) { + hex = hex.toUpperCase(); + int max = hex.length(); + int result = 0; + for (int i = max; i > 0; i--) { + char c = hex.charAt(i - 1); + int algorism = 0; + if (c >= '0' && c <= '9') { + algorism = c - '0'; + } else { + algorism = c - 55; + } + result += Math.pow(16, max - i) * algorism; + } + return result; + } + + /** + * 十六转二进制 + * + * @param hex + * 十六进制字符串 + * @return 二进制字符串 + */ + public static String hexStringToBinary(String hex) { + hex = hex.toUpperCase(); + String result = ""; + int max = hex.length(); + for (int i = 0; i < max; i++) { + char c = hex.charAt(i); + switch (c) { + case '0': + result += "0000"; + break; + case '1': + result += "0001"; + break; + case '2': + result += "0010"; + break; + case '3': + result += "0011"; + break; + case '4': + result += "0100"; + break; + case '5': + result += "0101"; + break; + case '6': + result += "0110"; + break; + case '7': + result += "0111"; + break; + case '8': + result += "1000"; + break; + case '9': + result += "1001"; + break; + case 'A': + result += "1010"; + break; + case 'B': + result += "1011"; + break; + case 'C': + result += "1100"; + break; + case 'D': + result += "1101"; + break; + case 'E': + result += "1110"; + break; + case 'F': + result += "1111"; + break; + } + } + return result; + } + + /** + * ASCII码字符串转数字字符串 + * + * @param String + * ASCII字符串 + * @return 字符串 + */ + public static String AsciiStringToString(String content) { + String result = ""; + int length = content.length() / 2; + for (int i = 0; i < length; i++) { + String c = content.substring(i * 2, i * 2 + 2); + int a = hexStringToAlgorism(c); + char b = (char) a; + String d = String.valueOf(b); + result += d; + } + return result; + } + + /** + * 将十进制转换为指定长度的十六进制字符串 + * + * @param algorism + * int 十进制数字 + * @param maxLength + * int 转换后的十六进制字符串长度 + * @return String 转换后的十六进制字符串 + */ + public static String algorismToHexString(int algorism, int maxLength) { + String result = ""; + result = Integer.toHexString(algorism); + + if (result.length() % 2 == 1) { + result = "0" + result; + } + return patchHexString(result.toUpperCase(), maxLength); + } + + /** + * 字节数组转为普通字符串(ASCII对应的字符) + * + * @param bytearray + * byte[] + * @return String + */ + public static String byteToString(byte[] bytearray) { + String result = ""; + char temp; + + int length = bytearray.length; + for (int i = 0; i < length; i++) { + temp = (char) bytearray[i]; + result += temp; + } + return result; + } + + /** + * 二进制字符串转十进制 + * + * @param binary + * 二进制字符串 + * @return 十进制数值 + */ + public static int binaryToAlgorism(String binary) { + int max = binary.length(); + int result = 0; + for (int i = max; i > 0; i--) { + char c = binary.charAt(i - 1); + int algorism = c - '0'; + result += Math.pow(2, max - i) * algorism; + } + return result; + } + + /** + * 十进制转换为十六进制字符串 + * + * @param algorism + * int 十进制的数字 + * @return String 对应的十六进制字符串 + */ + public static String algorismToHEXString(int algorism) { + String result = ""; + result = Integer.toHexString(algorism); + + if (result.length() % 2 == 1) { + result = "0" + result; + + } + result = result.toUpperCase(); + + return result; + } + + /** + * HEX字符串前补0,主要用于长度位数不足。 + * + * @param str + * String 需要补充长度的十六进制字符串 + * @param maxLength + * int 补充后十六进制字符串的长度 + * @return 补充结果 + */ + static public String patchHexString(String str, int maxLength) { + String temp = ""; + for (int i = 0; i < maxLength - str.length(); i++) { + temp = "0" + temp; + } + str = (temp + str).substring(0, maxLength); + return str; + } + + /** + * 将一个字符串转换为int + * + * @param s + * String 要转换的字符串 + * @param defaultInt + * int 如果出现异常,默认返回的数字 + * @param radix + * int 要转换的字符串是什么进制的,如16 8 10. + * @return int 转换后的数字 + */ + public static int parseToInt(String s, int defaultInt, int radix) { + int i = 0; + try { + i = Integer.parseInt(s, radix); + } catch (NumberFormatException ex) { + i = defaultInt; + } + return i; + } + + /** + * 将一个十进制形式的数字字符串转换为int + * + * @param s + * String 要转换的字符串 + * @param defaultInt + * int 如果出现异常,默认返回的数字 + * @return int 转换后的数字 + */ + public static int parseToInt(String s, int defaultInt) { + int i = 0; + try { + i = Integer.parseInt(s); + } catch (NumberFormatException ex) { + i = defaultInt; + } + return i; + } + + /** + * 十六进制串转化为byte数组 + * + * @return the array of byte + */ + public static byte[] hexToByte(String hex) + throws IllegalArgumentException { + if (hex.length() % 2 != 0) { + throw new IllegalArgumentException(); + } + char[] arr = hex.toCharArray(); + byte[] b = new byte[hex.length() / 2]; + for (int i = 0, j = 0, l = hex.length(); i < l; i++, j++) { + String swap = "" + arr[i++] + arr[i]; + int byteint = Integer.parseInt(swap, 16) & 0xFF; + b[j] = new Integer(byteint).byteValue(); + } + return b; + } + + /** + * 字节数组转换为十六进制字符串 + * + * @param b + * byte[] 需要转换的字节数组 + * @return String 十六进制字符串 + */ + public static String byteToHex(byte b[]) { + if (b == null) { + throw new IllegalArgumentException( + "Argument b ( byte array ) is null! "); + } + String hs = ""; + String stmp = ""; + for (int n = 0; n < b.length; n++) { + stmp = Integer.toHexString(b[n] & 0xff); + if (stmp.length() == 1) { + hs = hs + "0" + stmp; + } else { + hs = hs + stmp; + } + } + return hs.toUpperCase(); + } + + public static byte[] subByte(byte[] input, int startIndex, int length) { + byte[] bt = new byte[length]; + for (int i = 0; i < length; i++) { + bt[i] = input[i + startIndex]; + } + return bt; + } +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/config/SecurityConfig.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/config/SecurityConfig.java new file mode 100644 index 0000000..111599c --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/config/SecurityConfig.java @@ -0,0 +1,72 @@ +package com.passManage.us.admin.rmp.common.config; + +import com.passManage.us.admin.rmp.common.handler.MyAccessDeniedHandler; +import com.passManage.us.admin.rmp.common.handler.MyLoginFailHandler; +import com.passManage.us.admin.rmp.common.handler.MyLoginSuccessHandler; +import com.passManage.us.admin.rmp.common.point.MyLoginExpiredAuthenticationEntryPoint; +import com.passManage.us.admin.rmp.common.provider.MyAuthenticationProvider; +import com.passManage.us.admin.rmp.constant.PermissionConstant; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.authentication.AuthenticationManager; +import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; +import org.springframework.security.config.annotation.web.builders.HttpSecurity; +import org.springframework.security.config.annotation.web.builders.WebSecurity; +import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; + +import javax.annotation.Resource; + +/** + * author: www.magicalcoder.com + * date:2018/7/10 + * function: + */ +@Configuration +@EnableWebSecurity +public class SecurityConfig extends WebSecurityConfigurerAdapter{ + + @Resource + private MyAuthenticationProvider myAuthenticationProvider; + + + @Override + protected void configure(HttpSecurity http) throws Exception { + http + .authorizeRequests() +// .antMatchers("/assets/**","/").permitAll() + .antMatchers(PermissionConstant.ADMIN_PREFIX+"**").authenticated() + .and() + .formLogin() + //这里就是登录页面配置的action 交给spring处理 +// .loginPage("/login.html") + .loginProcessingUrl("/login")//登录成功 跳转admin/rmp/index在login.js中处理 + .successHandler(new MyLoginSuccessHandler()) + .failureHandler(new MyLoginFailHandler()) + .and() + .logout().logoutUrl("/logout").deleteCookies().clearAuthentication(true).invalidateHttpSession(true).logoutSuccessUrl("/").permitAll() + .and() + .exceptionHandling().accessDeniedHandler(new MyAccessDeniedHandler()).authenticationEntryPoint(new MyLoginExpiredAuthenticationEntryPoint()) + .and().csrf().disable() + //设置frame 同源可以嵌入 + .headers().frameOptions().sameOrigin(); + } + + @Override + public void configure(WebSecurity web) throws Exception { + web.ignoring().antMatchers(PermissionConstant.STATIC_PREFIX+"**");//忽略静态资源 + web.ignoring().antMatchers(PermissionConstant.REMOTE_PREFIX+"**");//忽略远程访问接口 + } + + @Override + protected void configure(AuthenticationManagerBuilder auth) throws Exception { + auth.authenticationProvider(myAuthenticationProvider); + } + + @Bean + @Override + public AuthenticationManager authenticationManagerBean() throws Exception { + return super.authenticationManagerBean(); + } + +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/AdminCommonFileRestController.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/AdminCommonFileRestController.java new file mode 100644 index 0000000..bf6c96c --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/AdminCommonFileRestController.java @@ -0,0 +1,142 @@ +package com.passManage.us.admin.rmp.common.controller.admin; + +import com.aliyun.oss.OSSClient; +import com.aliyun.oss.model.PutObjectResult; +import com.passManage.us.admin.common.config.UploadFilePathConfig; +import com.passManage.us.core.common.exception.BusinessException; +import com.passManage.us.core.serialize.CommonReturnCode; +import com.passManage.us.core.serialize.ResponseMsg; +import com.passManage.us.core.utils.ListUtil; +import com.passManage.us.core.utils.MapUtil; +import com.passManage.us.core.utils.StringUtil; +import org.apache.commons.io.FileUtils; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.IOException; +import java.sql.Timestamp; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.UUID; + +/** + * Created by magicalcoder.com on 2015/9/8. + * 799374340@qq.com + */ +@RestController +@RequestMapping(value="/admin/common_file_rest/") +public class AdminCommonFileRestController { + + @Resource + private UploadFilePathConfig uploadFilePathConfig; + + private String originFilePath(String originFile){ + if(StringUtil.isBlank(originFile) || originFile.startsWith("http://") || originFile.startsWith("https://")){ + return ""; + } + String[] arr = originFile.split("/"); + StringBuilder pathBuilder = new StringBuilder(); + for(int i=0;i returnUrls = new ArrayList<>(); + for (MultipartFile myfile : file) { + if (!myfile.isEmpty()) { + // 获取文件名 + originalFilename = myfile.getOriginalFilename(); + String returnUrl = ""; + boolean streamUsed = false; + File storeFile = null; + // 文件名后缀处理 使用uuid方式生成新文件名称 绝对唯一 + String suffix = originalFilename.substring(originalFilename.lastIndexOf(".")); + String newFileName = UUID.randomUUID().toString() + suffix; + if(uploadFilePathConfig.getUseDisk()){//本地路径 + storeFile = new File(realPath, newFileName); + if(!storeFile.getParentFile().exists()){ + storeFile.getParentFile().mkdirs(); + } + FileUtils.copyInputStreamToFile( + myfile.getInputStream(), storeFile);//上传文件到磁盘 流会被拷贝走 + streamUsed = true; + String prefix = uploadFilePathConfig.getFileExtraAddPrefix() +originFilePath; + String src = prefix+newFileName; + while (src.contains("//")){ + src = src.replace("//","/"); + } + if(uploadFilePathConfig.getUseDiskReturnUrl()){ + returnUrl = src; + } + } + if(uploadFilePathConfig.getUseAliyunOss()){//阿里云路径 + if(streamUsed){//那就上传本地文件 + uploadFilePathConfig.ossClient().putObject(uploadFilePathConfig.getBucketName(),newFileName,storeFile); + }else {//直接使用客户端流 用户未上传过给本地文件 + uploadFilePathConfig.ossClient().putObject(uploadFilePathConfig.getBucketName(),newFileName,myfile.getInputStream()); + } + if(uploadFilePathConfig.getUseAliyunOssReturnUrl()){ + returnUrl = uploadFilePathConfig.getAliyunImgDomain()+newFileName; + } + } + returnUrls.add(MapUtil.buildMap("src",returnUrl,"title",originalFilename)); + } + } + if(ListUtil.isNotBlank(returnUrls)){ + if(returnUrls.size()==1){//单个文件上传 返回1个地址 + return new ResponseMsg(returnUrls.get(0)); + } + //多个文件 返回多个地址 + return new ResponseMsg(returnUrls); + } + throw new BusinessException(CommonReturnCode.FILE_UPLOAD_NO_FILE); + } + +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/AdminRmpController.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/AdminRmpController.java new file mode 100644 index 0000000..9c40fb9 --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/AdminRmpController.java @@ -0,0 +1,71 @@ +package com.passManage.us.admin.rmp.common.controller.admin; + +import com.passManage.us.admin.common.config.UploadFilePathConfig; +import com.passManage.us.admin.rmp.dto.SysAdminUserDto; +import com.passManage.us.admin.rmp.dto.SysRoleDto; +import com.passManage.us.admin.rmp.util.AdminUtil; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; + +/** + * author:www.magicalcoder.com + * date:2018/7/31 + * function: + */ +@Controller +@RequestMapping(value = "/admin/") +public class AdminRmpController { + /*是否是发布状态的js*/ + @Value("${magicalcoder.publish}") + private boolean publish; + /*的前缀*/ + @Resource + private UploadFilePathConfig uploadFilePathConfig; + + @RequestMapping(value = "rmp/index") + public String index(HttpServletRequest request,ModelMap modelMap){ + initCtxMap(modelMap); + SysAdminUserDto adminUser = AdminUtil.getAdmin(); + SysRoleDto role = adminUser.getSysRoleDto(); + modelMap.addAttribute("categoryList",role.getSysModuleCategoryDtoList()); + return "index"; + } + + @RequestMapping(value = "rmp/main") + public String main(ModelMap modelMap){ + initCtxMap(modelMap); + return "main"; + } + + private void initCtxMap(ModelMap modelMap){ + modelMap.put("publish",publish); + modelMap.put("fileExtraAddPrefix",uploadFilePathConfig.getFileExtraAddPrefix()); + modelMap.put("requestPrefix",uploadFilePathConfig.getRequestPrefix()); + } + + //映射所有界面 这里统一路径功能一做,几乎就实现了前后端分离了 不再允许java端拼接大量参数给界面 + @Deprecated + @RequestMapping(value = "page/{tableName}/{page}") + public String mapping(@PathVariable String tableName,@PathVariable String page, + ModelMap modelMap){ + initCtxMap(modelMap); + String name = tableName.replaceAll("_",""); + return name +"/"+ name +"-"+ page; + } + + //映射所有界面 这里统一路径功能一做,几乎就实现了前后端分离了 不再允许java端拼接大量参数给界面 + @RequestMapping(value = "page_v2/{tableName}/{page}") + public String mappingV2(@PathVariable String tableName,@PathVariable String page, + ModelMap modelMap){ + initCtxMap(modelMap); + return tableName +"/"+ page; + } + + +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/AdminRmpRestController.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/AdminRmpRestController.java new file mode 100644 index 0000000..bef1458 --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/AdminRmpRestController.java @@ -0,0 +1,293 @@ +package com.passManage.us.admin.rmp.common.controller.admin; + +import com.passManage.us.admin.rmp.common.controller.admin.res.ModuleRes; +import com.passManage.us.admin.rmp.common.controller.admin.res.RmpTreeRes; +import com.passManage.us.admin.rmp.dto.*; +import com.passManage.us.admin.rmp.model.*; +import com.passManage.us.admin.rmp.service.*; +import com.passManage.us.admin.rmp.util.AdminUtil; +import com.passManage.us.core.serialize.ResponseMsg; +import com.passManage.us.core.utils.ListUtil; +import com.passManage.us.core.utils.MapUtil; +import com.passManage.us.core.utils.Md5Util; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.*; + +/** + * author:www.magicalcoder.com + * date:2018/7/31 + * function: + */ +@RestController +@RequestMapping(value = "/admin/rest_rmp/") +public class AdminRmpRestController { + @Resource + private SysModuleCategoryService sysModuleCategoryService; + + @RequestMapping("user_info") + public ResponseMsg currentUserInfo(){ + return new ResponseMsg(AdminUtil.getAdmin()); + } + + @RequestMapping("check_password") + public ResponseMsg checkPassword(String password){ + boolean check = Md5Util.md5Encode(password).equals(AdminUtil.getAdmin().getPassword()); + return new ResponseMsg(check); + } + + /** + * 获取某个模块的权限 + * @return + */ + @RequestMapping(value = "get_permission_list") + public ResponseMsg getPermissionList(@RequestParam(required = false) String moduleName){ + SysModuleDto dto = sysModuleDto(moduleName); + return new ResponseMsg(dto); + } + + private SysModuleDto sysModuleDto(String moduleName){ + //1、获取用户 + SysAdminUserDto userDto = AdminUtil.getAdmin(); + //2、获取用户角色 + SysRoleDto sysRoleDto = userDto.getSysRoleDto(); + if (sysRoleDto != null){ + //3、获取一级菜单 + List categoryDtoList = sysRoleDto.getSysModuleCategoryDtoList(); + if (ListUtil.isNotBlank(categoryDtoList)){ + for (SysModuleCategoryDto categoryDto : categoryDtoList) { + //4、获取二级菜单 + List sysModuleDtoList = categoryDto.getSysModuleDtoList(); + if (ListUtil.isNotBlank(sysModuleDtoList)){ + for (SysModuleDto sysModuleDto : sysModuleDtoList) { + //5、获取权限 + if(sysModuleDto.getModuleName()!=null){ + if (sysModuleDto.getModuleName().equals(moduleName)) { + return sysModuleDto; + } + } + } + } + } + } + } + return null; + } + + /** + * 构造左侧菜单栏 + * @param modelMap + * @return + */ + @RequestMapping(value = "get_module_list") + public ResponseMsg getModuleList(ModelMap modelMap){ + SysAdminUserDto adminUser = AdminUtil.getAdmin(); + SysRoleDto role = adminUser.getSysRoleDto(); + modelMap.addAttribute("categoryList",role.getSysModuleCategoryDtoList()); + return new ResponseMsg(buildModuleMap()); + } + private Map> buildModuleMap(){ + Map> listMap = new HashMap<>(); + SysAdminUserDto adminUser = AdminUtil.getAdmin(); + SysRoleDto role = adminUser.getSysRoleDto(); + if(role!=null){ + List moduleCategoryDtoList = role.getSysModuleCategoryDtoList(); + if(ListUtil.isNotBlank(moduleCategoryDtoList)){ + for(SysModuleCategoryDto categoryDto:moduleCategoryDtoList){ + String id = String.valueOf(categoryDto.getId()); + List moduleResList = listMap.get(id); + if(moduleResList==null){ + moduleResList = new ArrayList<>(); + listMap.put(id,moduleResList); + } + for(SysModuleDto sysModuleDto : categoryDto.getSysModuleDtoList()){ + ModuleRes res = cover(sysModuleDto); + if(res!=null){ + moduleResList.add(res); + } + } + } + } + } + return listMap; + } + + private ModuleRes cover(SysModuleDto sysModuleDto){ + if(sysModuleDto!=null && (sysModuleDto.getIfShow()!=null && sysModuleDto.getIfShow())){ + ModuleRes res = new ModuleRes(); + res.setSpread(false); + res.setHref(sysModuleDto.getModuleUrl()); + res.setIcon(""); + res.setTitle(sysModuleDto.getModuleTitle()); + return res; + } + return null; + } + + @Resource + private SysModuleService sysModuleService; + @Resource + private SysPermissionService sysPermissionService; + @Resource + private SysRoleModulePermissionService sysRoleModulePermissionService; + + private static final String modulePrefix = "module_"; + private static final String permissionPrefix = "permission_"; + private static final String categoryPrefix = "category_"; + + @RequestMapping(value = "tree_data/{roleId}") + public ResponseMsg rmpTreeData(@PathVariable Long roleId){ + List categoryList = sysModuleCategoryService.getModelList(MapUtil.buildMap("safeOrderBy","sort_num asc")); + List modelList = sysModuleService.getModelListNotIgnore(MapUtil.buildMap("safeOrderBy","sort_num asc"),"id","moduleTitle","moduleCategoryId"); + List permissionList = sysPermissionService.getModelListNotIgnore(null,"id","permissionName","moduleId"); + List rmpList = sysRoleModulePermissionService.getModelList(MapUtil.buildMap("roleId",roleId)); + List rmpTreeResList = new ArrayList<>(); + if(ListUtil.isNotBlank(categoryList)){ + //第一层 + for(SysModuleCategory category:categoryList){ + RmpTreeRes rmpTreeRes = new RmpTreeRes(); + rmpTreeRes.setName(category.getModuleCategoryName()); + rmpTreeRes.setValue(categoryPrefix+String.valueOf(category.getId())); + Rmp rmp = moduleList(rmpList,category.getId(),modelList,permissionList); + rmpTreeRes.setList(rmp.rmpTreeResList); + rmpTreeRes.setChecked(rmp.checked); + rmpTreeResList.add(rmpTreeRes); + + } + } + return new ResponseMsg(rmpTreeResList); + } + private Rmp moduleList(List rmpList,Long categoryId,List modelList,List permissionList){ + List rmpTreeResList = new ArrayList<>(); + boolean categoryChecked = false; + if(ListUtil.isNotBlank(modelList)){ + Map roleModulePermissionMap = MapUtil.listToItemMap("moduleId",rmpList); + for(SysModule module:modelList){ + if(module.getModuleCategoryId().compareTo(categoryId)==0){ + RmpTreeRes rmpTreeRes = new RmpTreeRes(); + rmpTreeRes.setName(module.getModuleTitle()); + rmpTreeRes.setValue(modulePrefix+String.valueOf(module.getId())); + Rmp rmp = permissionList(rmpList,module.getId(),permissionList); + rmpTreeRes.setList(rmp.rmpTreeResList); + boolean checked = roleModulePermissionMap.containsKey(module.getId()); + rmpTreeRes.setChecked(checked || rmp.checked); + rmpTreeResList.add(rmpTreeRes); + if(!categoryChecked){ + if (rmpTreeRes.isChecked()){ + categoryChecked = true; + } + } + } + } + } + return new Rmp(rmpTreeResList,categoryChecked); + } + private Rmp permissionList(List rmpList,Long moduleId,List permissionList){ + List rmpTreeResList = new ArrayList<>(); + boolean moduleChecked = false; + if(ListUtil.isNotBlank(permissionList)){ + Map roleModulePermissionMap = MapUtil.listToItemMap("permissionId",rmpList); + for(SysPermission permission:permissionList){ + if(permission.getModuleId().compareTo(moduleId)==0){ + RmpTreeRes rmpTreeRes = new RmpTreeRes(); + rmpTreeRes.setName(permission.getPermissionName()); + rmpTreeRes.setValue(permissionPrefix+String.valueOf(permission.getId())); + boolean checked = roleModulePermissionMap.containsKey(permission.getId()); + rmpTreeRes.setChecked(checked); + rmpTreeResList.add(rmpTreeRes); + if(!moduleChecked){ + if (rmpTreeRes.isChecked()){ + moduleChecked = true; + } + } + } + } + } + return new Rmp(rmpTreeResList,moduleChecked); + } + + private static final class Rmp{ + public Rmp(List rmpTreeResList, boolean checked) { + this.rmpTreeResList = rmpTreeResList; + this.checked = checked; + } + + private List rmpTreeResList; + private boolean checked; + + public List getRmpTreeResList() { + return rmpTreeResList; + } + + public void setRmpTreeResList(List rmpTreeResList) { + this.rmpTreeResList = rmpTreeResList; + } + + public boolean isChecked() { + return checked; + } + + public void setChecked(boolean checked) { + this.checked = checked; + } + } + + @RequestMapping(value = "save_tree_data/{roleId}", method={RequestMethod.POST}) + public ResponseMsg saveRmp(@PathVariable Long roleId,@RequestParam(value = "ids[]",required = false) Set ids){ + sysRoleModulePermissionService.deleteModel(MapUtil.buildMap("roleId",roleId)); + if(ids!=null && ids.size()>0){ + Map map = new HashMap<>(); + for(String id:ids){ + map.put(id,null); + } + List modelList = sysModuleService.getModelListNotIgnore(null,"id"); + if(ListUtil.isNotBlank(modelList)){ + for(int i=0;i permissionList = sysPermissionService.getModelListNotIgnore(null,"id","moduleId"); + if(ListUtil.isNotBlank(permissionList)){ + for(int i=0;i entityList = new ArrayList<>(); + Map> permissionMap = MapUtil.listToListMap("moduleId",permissionList); + for(SysModule module:modelList){ + List permissions = permissionMap.get(module.getId()); + if(ListUtil.isNotBlank(permissions)){ + for(SysPermission permission:permissions){ + SysRoleModulePermission entity = new SysRoleModulePermission(); + entity.setRoleId(roleId); + entity.setModuleId(module.getId()); + entity.setPermissionId(permission.getId()); + entityList.add(entity); + } + }else {//仅仅勾选了菜单 未选择权限 + SysRoleModulePermission entity = new SysRoleModulePermission(); + entity.setRoleId(roleId); + entity.setModuleId(module.getId()); + entityList.add(entity); + } + } + if(ListUtil.isNotBlank(entityList)){ + sysRoleModulePermissionService.batchInsertModel(entityList); + } + } + } + return new ResponseMsg(); + } + +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/res/ModuleRes.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/res/ModuleRes.java new file mode 100644 index 0000000..bd3fb9b --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/res/ModuleRes.java @@ -0,0 +1,56 @@ +package com.passManage.us.admin.rmp.common.controller.admin.res; + +import java.util.List; + +/** + * author:www.magicalcoder.com + * date:2018/8/1 + * function: + */ +public class ModuleRes { + private String title; + private String icon; + private String href; + private boolean spread; + private List children; + + public String getTitle() { + return title; + } + + public void setTitle(String title) { + this.title = title; + } + + public String getIcon() { + return icon; + } + + public void setIcon(String icon) { + this.icon = icon; + } + + public String getHref() { + return href; + } + + public void setHref(String href) { + this.href = href; + } + + public boolean isSpread() { + return spread; + } + + public void setSpread(boolean spread) { + this.spread = spread; + } + + public List getChildren() { + return children; + } + + public void setChildren(List children) { + this.children = children; + } +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/res/RmpTreeRes.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/res/RmpTreeRes.java new file mode 100644 index 0000000..2272835 --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/res/RmpTreeRes.java @@ -0,0 +1,47 @@ +package com.passManage.us.admin.rmp.common.controller.admin.res; + +import java.util.List; + +/** + * author:www.magicalcoder.com + * date:2018/9/3 + * function: + */ +public class RmpTreeRes { + private String name; + private String value; + private boolean checked; + private List list; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public boolean isChecked() { + return checked; + } + + public void setChecked(boolean checked) { + this.checked = checked; + } + + public List getList() { + return list; + } + + public void setList(List list) { + this.list = list; + } +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/sys/AdminSysAdminUserRestController.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/sys/AdminSysAdminUserRestController.java new file mode 100644 index 0000000..79d4b58 --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/sys/AdminSysAdminUserRestController.java @@ -0,0 +1,105 @@ +package com.passManage.us.admin.rmp.common.controller.admin.sys; + +import com.passManage.us.admin.rmp.common.SecurityReturnCode; +import com.passManage.us.admin.rmp.model.SysAdminUser; +import com.passManage.us.admin.rmp.service.SysAdminUserService; +import com.passManage.us.core.common.constant.PageConstant; +import com.passManage.us.core.common.exception.BusinessException; +import com.passManage.us.core.serialize.ResponseMsg; +import com.passManage.us.core.service.CommonRestController; +import com.passManage.us.core.utils.ListUtil; +import com.passManage.us.core.utils.Md5Util; +import com.passManage.us.core.utils.StringUtil; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 欢迎加入官方QQ群:323237052 +*/ + +@RequestMapping("/admin/sys_admin_user_rest/") +@RestController +public class AdminSysAdminUserRestController extends CommonRestController implements InitializingBean +{ + + @Resource + private SysAdminUserService sysAdminUserService; + + @RequestMapping(value = "search") + public ResponseMsg search( + @RequestParam(required = false) String uniqueField, + @RequestParam(required = false,value = "uniqueValue[]") Set uniqueValue,//主键多个值 + @RequestParam(required = false,defaultValue = "20") Integer limit, + @RequestParam(required = false) String keyword + ){ + limit = Math.min(PageConstant.MAX_LIMIT,limit); + List list = null; + Map query = new HashMap(); + query.put("limit",limit); + if(uniqueValue!=null){//说明是来初始化的 + list = sysAdminUserService.getModelInList(uniqueValue); + }else {//正常搜索 + query.put("usernameFirst",keyword); + list = sysAdminUserService.getModelList(query); + query.remove("usernameFirst"); + } + return new ResponseMsg(list); + } + //分页查询 + @RequestMapping(value={"page"}, method={RequestMethod.GET}) + public ResponseMsg page( + @RequestParam(required = false,value ="usernameFirst") String usernameFirst , + @RequestParam(required = false,value ="roleIdFirst") Long roleIdFirst , + @RequestParam int page, @RequestParam int limit, @RequestParam(required = false) String safeOrderBy + , HttpServletResponse response, @RequestParam(required = false) Integer queryType + ){ + Map query = new HashMap(); + query.put("usernameFirst",coverBlankToNull(usernameFirst)); + query.put("roleIdFirst",roleIdFirst); + Integer count = sysAdminUserService.getModelListCount(query); + query.put("safeOrderBy",safeOrderBy); + if(queryType==null || queryType == QUERY_TYPE_SEARCH){//普通查询 + limit = Math.min(limit, PageConstant.MAX_LIMIT); + query.put("start",(page - 1) * limit);query.put("limit",limit); + return new ResponseMsg(count,sysAdminUserService.getModelList(query)); + }else if(queryType == QUERY_TYPE_EXPORT_EXCEL){ + query.put("start",(page - 1) * limit);query.put("limit",limit); + exportExcel(response,sysAdminUserService.getModelList(query),"管理员", + new String[]{"主键","用户名","密码","真名","邮箱","座机号","手机号","地址","创建时间","更新时间","角色","是否未失效","是否未锁定","是否未失效","是否可用"}, + new String[]{"","","","","","","","","","","","","","",""}); + } + return null; + } + + @RequestMapping(value="save", method={RequestMethod.POST}) + public ResponseMsg save(@ModelAttribute SysAdminUser entity) { + /*{保留我*/ + if(StringUtil.isBlank(entity.getPassword())){ + throw new BusinessException(SecurityReturnCode.PASSWORD_NULL); + } + if(!entity.getPassword().matches("[a-z0-9]{32}")){//非系统生成的密码进行加密 + entity.setPassword(Md5Util.md5Encode(entity.getPassword())); + } + /*}*/ + if(entity.getId()==null){ + this.sysAdminUserService.insertModel(entity); + }else{ + this.sysAdminUserService.updateModel(entity); + } + return new ResponseMsg(); + } + @Override + public void afterPropertiesSet() throws Exception { + super.commonService = sysAdminUserService; + super.primaryKey = "id";//硬编码此实体的主键名称 + } +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/sys/AdminSysGlobalPermitUrlRestController.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/sys/AdminSysGlobalPermitUrlRestController.java new file mode 100644 index 0000000..c4699da --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/sys/AdminSysGlobalPermitUrlRestController.java @@ -0,0 +1,68 @@ +package com.passManage.us.admin.rmp.common.controller.admin.sys; + +import com.passManage.us.admin.rmp.model.SysGlobalPermitUrl; +import com.passManage.us.admin.rmp.service.SysGlobalPermitUrlService; +import com.passManage.us.core.common.constant.PageConstant; +import com.passManage.us.core.serialize.ResponseMsg; +import com.passManage.us.core.service.CommonRestController; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.math.*; +import java.util.List; +import java.util.Map; +import java.util.HashMap; +import java.util.Map; + + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +@RequestMapping("/admin/sys_global_permit_url_rest/") +@RestController +public class AdminSysGlobalPermitUrlRestController extends CommonRestController implements InitializingBean +{ + + @Resource + private SysGlobalPermitUrlService sysGlobalPermitUrlService; + + //分页查询 + @RequestMapping(value={"page"}, method={RequestMethod.GET}) + public ResponseMsg page( + @RequestParam(required = false,value ="permitNameFirst") String permitNameFirst , + @RequestParam(required = false,value ="moduleIdFirst") Long moduleIdFirst , + @RequestParam int page,@RequestParam int limit,@RequestParam(required = false) String safeOrderBy + ,HttpServletResponse response,@RequestParam(required = false) Integer queryType + ){ + Map query = new HashMap(); + query.put("permitNameFirst",coverBlankToNull(permitNameFirst)); + query.put("moduleIdFirst",moduleIdFirst); + Integer count = sysGlobalPermitUrlService.getModelListCount(query); + query.put("safeOrderBy",safeOrderBy); + if(queryType==null || queryType == QUERY_TYPE_SEARCH){//普通查询 + limit = Math.min(limit, PageConstant.MAX_LIMIT); + query.put("start",(page - 1) * limit);query.put("limit",limit); + return new ResponseMsg(count,sysGlobalPermitUrlService.getModelList(query)); + }else if(queryType == QUERY_TYPE_EXPORT_EXCEL){ + query.put("start",(page - 1) * limit);query.put("limit",limit); + exportExcel(response,sysGlobalPermitUrlService.getModelList(query),"后端请求地址全局允许过滤器,在此表的统一不用再去权限表匹配了", + new String[]{"主键","通过名称","后端的地址正则","所属模块"}, + new String[]{"","","",""}); + } + return null; + } + + @Override + public void afterPropertiesSet() throws Exception { + super.commonService = sysGlobalPermitUrlService; + super.primaryKey = "id";//硬编码此实体的主键名称 + } +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/sys/AdminSysLogAdminOperateRestController.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/sys/AdminSysLogAdminOperateRestController.java new file mode 100644 index 0000000..8f3060a --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/sys/AdminSysLogAdminOperateRestController.java @@ -0,0 +1,77 @@ +package com.passManage.us.admin.rmp.common.controller.admin.sys; + +import com.passManage.us.admin.rmp.model.SysLogAdminOperate; +import com.passManage.us.admin.rmp.service.SysLogAdminOperateService; +import com.passManage.us.core.common.constant.PageConstant; +import com.passManage.us.core.serialize.ResponseMsg; +import com.passManage.us.core.service.CommonRestController; +import com.passManage.us.core.utils.StringUtil; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.format.annotation.DateTimeFormat; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.sql.Timestamp; +import java.util.Date; +import java.util.HashMap; +import java.util.Map; + + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +@RequestMapping("/admin/sys_log_admin_operate_rest/") +@RestController +public class AdminSysLogAdminOperateRestController extends CommonRestController implements InitializingBean +{ + + @Resource + private SysLogAdminOperateService sysLogAdminOperateService; + + //分页查询 + @RequestMapping(value={"page"}, method={RequestMethod.GET}) + public ResponseMsg page( + @RequestParam(required = false,value ="adminUserIdFirst") Long adminUserIdFirst , + @RequestParam(required = false,value ="userNameFirst") String userNameFirst , + @RequestParam(required = false,value ="tableNameFirst") String tableNameFirst , + @RequestParam(required = false,value ="formBodyFirst") String formBodyFirst , + @RequestParam(required = false,value ="createTimeFirst") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Timestamp createTimeFirst , + @RequestParam(required = false,value ="createTimeSecond") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")Timestamp createTimeSecond , + @RequestParam int page,@RequestParam int limit,@RequestParam(required = false) String safeOrderBy + ,HttpServletResponse response,@RequestParam(required = false) Integer queryType + ){ + Map query = new HashMap(); + query.put("adminUserIdFirst",adminUserIdFirst); + query.put("userNameFirst",coverBlankToNull(userNameFirst)); + query.put("tableNameFirst",coverBlankToNull(tableNameFirst)); + query.put("formBodyFirst",coverBlankToNull(formBodyFirst)); + query.put("createTimeFirst",createTimeFirst); + query.put("createTimeSecond",createTimeSecond); + Integer count = sysLogAdminOperateService.getModelListCount(query); + query.put("safeOrderBy",safeOrderBy); + if(queryType==null || queryType == QUERY_TYPE_SEARCH){//普通查询 + limit = Math.min(limit, PageConstant.MAX_LIMIT); + query.put("start",(page - 1) * limit);query.put("limit",limit); + return new ResponseMsg(count,sysLogAdminOperateService.getModelList(query)); + }else if(queryType == QUERY_TYPE_EXPORT_EXCEL){ + query.put("start",(page - 1) * limit);query.put("limit",limit); + exportExcel(response,sysLogAdminOperateService.getModelList(query),"系统日志", + new String[]{"主键","管理员","管理员名称","表名","操作类型","链接","主键值","提交内容","创建时间"}, + new String[]{"","","","","","","","",""}); + } + return null; + } + + @Override + public void afterPropertiesSet() throws Exception { + super.commonService = sysLogAdminOperateService; + super.primaryKey = "id";//硬编码此实体的主键名称 + } +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/sys/AdminSysModuleCategoryRestController.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/sys/AdminSysModuleCategoryRestController.java new file mode 100644 index 0000000..1e6c521 --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/sys/AdminSysModuleCategoryRestController.java @@ -0,0 +1,92 @@ +package com.passManage.us.admin.rmp.common.controller.admin.sys; + +import com.passManage.us.admin.rmp.model.SysModuleCategory; +import com.passManage.us.admin.rmp.service.SysModuleCategoryService; +import com.passManage.us.core.common.constant.PageConstant; +import com.passManage.us.core.serialize.ResponseMsg; +import com.passManage.us.core.service.CommonRestController; +import com.passManage.us.core.utils.ListUtil; +import com.passManage.us.core.utils.StringUtil; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +@RequestMapping("/admin/sys_module_category_rest/") +@RestController +public class AdminSysModuleCategoryRestController extends CommonRestController implements InitializingBean +{ + + @Resource + private SysModuleCategoryService sysModuleCategoryService; + + @RequestMapping(value = "search") + public ResponseMsg search( + @RequestParam(required = false) String uniqueField, + @RequestParam(required = false,value = "uniqueValue[]") Set uniqueValue,//主键多个值 + @RequestParam(required = false,defaultValue = "20") Integer limit, + @RequestParam(required = false) String keyword + ){ + limit = Math.min(PageConstant.MAX_LIMIT,limit); + List list = null; + Map query = new HashMap(); + query.put("limit",limit); + query.put("notSafeOrderBy","sort_num asc"); + if(uniqueValue!=null){//说明是来初始化的 + list = sysModuleCategoryService.getModelInList(uniqueValue); + }else {//正常搜索 + query.put("moduleCategoryNameFirst",keyword); + list = sysModuleCategoryService.getModelList(query); + query.remove("moduleCategoryNameFirst"); + } + return new ResponseMsg(list); + } + //分页查询 + @RequestMapping(value={"page"}, method={RequestMethod.GET}) + public ResponseMsg page( + @RequestParam(required = false,value ="moduleCategoryNameFirst") String moduleCategoryNameFirst , + @RequestParam int page,@RequestParam int limit,@RequestParam(required = false) String safeOrderBy + ,HttpServletResponse response,@RequestParam(required = false) Integer queryType + ){ + Map query = new HashMap(); + query.put("moduleCategoryNameFirst",coverBlankToNull(moduleCategoryNameFirst)); + Integer count = sysModuleCategoryService.getModelListCount(query); + if(StringUtil.isBlank(safeOrderBy)){ + query.put("notSafeOrderBy","sort_num asc"); + }else{ + query.put("safeOrderBy",safeOrderBy); + } + if(queryType==null || queryType == QUERY_TYPE_SEARCH){//普通查询 + limit = Math.min(limit, PageConstant.MAX_LIMIT); + query.put("start",(page - 1) * limit);query.put("limit",limit); + return new ResponseMsg(count,sysModuleCategoryService.getModelList(query)); + }else if(queryType == QUERY_TYPE_EXPORT_EXCEL){ + query.put("start",(page - 1) * limit);query.put("limit",limit); + exportExcel(response,sysModuleCategoryService.getModelList(query),"一级菜单", + new String[]{"主键","一级菜单名称","排序"}, + new String[]{"","",""}); + } + return null; + } + + @Override + public void afterPropertiesSet() throws Exception { + super.commonService = sysModuleCategoryService; + super.primaryKey = "id";//硬编码此实体的主键名称 + } +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/sys/AdminSysModuleRestController.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/sys/AdminSysModuleRestController.java new file mode 100644 index 0000000..4a844d6 --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/sys/AdminSysModuleRestController.java @@ -0,0 +1,110 @@ +package com.passManage.us.admin.rmp.common.controller.admin.sys; + +import com.passManage.us.admin.rmp.constant.PermissionConstant; +import com.passManage.us.admin.rmp.model.SysModule; +import com.passManage.us.admin.rmp.model.SysPermission; +import com.passManage.us.admin.rmp.service.SysModuleService; +import com.passManage.us.admin.rmp.service.SysPermissionService; +import com.passManage.us.core.common.constant.PageConstant; +import com.passManage.us.core.serialize.ResponseMsg; +import com.passManage.us.core.service.CommonRestController; +import com.passManage.us.core.utils.ListUtil; +import com.passManage.us.core.utils.MapUtil; +import com.passManage.us.core.utils.ReflectUtil; +import com.passManage.us.core.utils.StringUtil; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +@RequestMapping("/admin/sys_module_rest/") +@RestController +public class AdminSysModuleRestController extends CommonRestController implements InitializingBean +{ + + @Resource + private SysModuleService sysModuleService; + + + @RequestMapping(value = "search") + public ResponseMsg search( + @RequestParam(required = false) String uniqueField, + @RequestParam(required = false,value = "uniqueValue[]") Set uniqueValue,//主键多个值 + @RequestParam(required = false,defaultValue = "20") Integer limit, + @RequestParam(required = false) String keyword + ){ + limit = Math.min(PageConstant.MAX_LIMIT,limit); + List list = null; + Map query = new HashMap(); + query.put("limit",limit); + query.put("notSafeOrderBy","sort_num asc"); + if(uniqueValue!=null){//说明是来初始化的 + list = sysModuleService.getModelInList(uniqueValue); + }else {//正常搜索 + query.put("moduleTitleFirst",keyword); + list = sysModuleService.getModelList(query); + query.remove("moduleTitleFirst"); + } + return new ResponseMsg(list); + } + //分页查询 + @RequestMapping(value={"page"}, method={RequestMethod.GET}) + public ResponseMsg page( + @RequestParam(required = false,value ="moduleNameFirst") String moduleNameFirst , + @RequestParam(required = false,value ="moduleCategoryIdFirst") Long moduleCategoryIdFirst , + @RequestParam(required = false,value ="moduleTitleFirst") String moduleTitleFirst , + @RequestParam int page,@RequestParam int limit,@RequestParam(required = false) String safeOrderBy + ,HttpServletResponse response,@RequestParam(required = false) Integer queryType + ){ + Map query = new HashMap(); + query.put("moduleNameFirst",coverBlankToNull(moduleNameFirst)); + query.put("moduleCategoryIdFirst",moduleCategoryIdFirst); + query.put("moduleTitleFirst",coverBlankToNull(moduleTitleFirst)); + Integer count = sysModuleService.getModelListCount(query); + if(StringUtil.isBlank(safeOrderBy)){ + query.put("notSafeOrderBy","sort_num asc"); + }else{ + query.put("safeOrderBy",safeOrderBy); + } + if(queryType==null || queryType == QUERY_TYPE_SEARCH){//普通查询 + limit = Math.min(limit, PageConstant.MAX_LIMIT); + query.put("start",(page - 1) * limit);query.put("limit",limit); + return new ResponseMsg(count,sysModuleService.getModelList(query)); + }else if(queryType == QUERY_TYPE_EXPORT_EXCEL){ + query.put("start",(page - 1) * limit);query.put("limit",limit); + exportExcel(response,sysModuleService.getModelList(query),"模块", + new String[]{"主键","二级菜单唯一值","二级菜单地址","一级菜单","排序","二级菜单标题","是否显示"}, + new String[]{"","","","","","",""}); + } + return null; + } + + + /** + * 保存 + * @return + */ + @RequestMapping(value="extra_save", method={RequestMethod.POST}) + public ResponseMsg saveEntity(@RequestParam(required = false)Boolean helpConfigPermit ,@ModelAttribute SysModule entity) { + this.sysModuleService.saveModule(helpConfigPermit,entity); + return new ResponseMsg(); + } + + @Override + public void afterPropertiesSet() throws Exception { + super.commonService = sysModuleService; + super.primaryKey = "id";//硬编码此实体的主键名称 + } +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/sys/AdminSysPermissionRestController.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/sys/AdminSysPermissionRestController.java new file mode 100644 index 0000000..5a59114 --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/sys/AdminSysPermissionRestController.java @@ -0,0 +1,94 @@ +package com.passManage.us.admin.rmp.common.controller.admin.sys; + +import com.passManage.us.admin.rmp.model.SysPermission; +import com.passManage.us.admin.rmp.service.SysPermissionService; +import com.passManage.us.core.common.constant.PageConstant; +import com.passManage.us.core.serialize.ResponseMsg; +import com.passManage.us.core.service.CommonRestController; +import com.passManage.us.core.utils.ListUtil; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +@RequestMapping("/admin/sys_permission_rest/") +@RestController +public class AdminSysPermissionRestController extends CommonRestController implements InitializingBean +{ + + @Resource + private SysPermissionService sysPermissionService; + + @RequestMapping(value = "search") + public ResponseMsg search( + @RequestParam(required = false) String uniqueField, + @RequestParam(required = false,value = "uniqueValue[]") Set uniqueValue,//主键多个值 + @RequestParam(required = false,defaultValue = "20") Integer limit, + @RequestParam(required = false) String keyword + ){ + limit = Math.min(PageConstant.MAX_LIMIT,limit); + List list = null; + Map query = new HashMap(); + query.put("limit",limit); + if(uniqueValue!=null){//说明是来初始化的 + list = sysPermissionService.getModelInList(uniqueValue); + }else {//正常搜索 + query.put("idFirst",keyword); + list = sysPermissionService.getModelList(query); + query.remove("idFirst"); + if(ListUtil.isBlank(list)){ + query.put("permissionNameFirst",keyword); + list = sysPermissionService.getModelList(query); + query.remove("permissionNameFirst"); + } + } + return new ResponseMsg(list); + } + //分页查询 + @RequestMapping(value={"page"}, method={RequestMethod.GET}) + public ResponseMsg page( + @RequestParam(required = false,value ="idFirst") Long idFirst , + @RequestParam(required = false,value ="permissionNameFirst") String permissionNameFirst , + @RequestParam(required = false,value ="moduleIdFirst") Long moduleIdFirst , + @RequestParam int page, @RequestParam int limit, @RequestParam(required = false) String safeOrderBy + , HttpServletResponse response, @RequestParam(required = false) Integer queryType + ){ + Map query = new HashMap(); + query.put("idFirst",idFirst); + query.put("permissionNameFirst",coverBlankToNull(permissionNameFirst)); + query.put("moduleIdFirst",moduleIdFirst); + Integer count = sysPermissionService.getModelListCount(query); + query.put("safeOrderBy",safeOrderBy); + if(queryType==null || queryType == QUERY_TYPE_SEARCH){//普通查询 + limit = Math.min(limit, PageConstant.MAX_LIMIT); + query.put("start",(page - 1) * limit);query.put("limit",limit); + return new ResponseMsg(count,sysPermissionService.getModelList(query)); + }else if(queryType == QUERY_TYPE_EXPORT_EXCEL){ + query.put("start",(page - 1) * limit);query.put("limit",limit); + exportExcel(response,sysPermissionService.getModelList(query),"权限明细配置", + new String[]{"主键","规则适用端","权限名称","后端正则地址","DOM前端Key","前端处理方式","所属二级菜单"}, + new String[]{"","[{\"value\":\"请选择\",\"key\":\"\"},{\"value\":\"前端\",\"key\":\"front\"},{\"value\":\"后端\",\"key\":\"backend\"},{\"value\":\"前后端\",\"key\":\"front_backend\"}]","","","","[{\"value\":\"请选择\",\"key\":\"\"},{\"value\":\"读写\",\"key\":\"show\"},{\"value\":\"只读\",\"key\":\"disabled\"}]",""}); + } + return null; + } + + @Override + public void afterPropertiesSet() throws Exception { + super.commonService = sysPermissionService; + super.primaryKey = "id";//硬编码此实体的主键名称 + } +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/sys/AdminSysRoleModulePermissionRestController.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/sys/AdminSysRoleModulePermissionRestController.java new file mode 100644 index 0000000..e66fede --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/sys/AdminSysRoleModulePermissionRestController.java @@ -0,0 +1,57 @@ +package com.passManage.us.admin.rmp.common.controller.admin.sys; + +import com.passManage.us.admin.rmp.model.SysRoleModulePermission; +import com.passManage.us.admin.rmp.service.SysRoleModulePermissionService; +import com.passManage.us.core.common.constant.PageConstant; +import com.passManage.us.core.serialize.ResponseMsg; +import com.passManage.us.core.service.CommonRestController; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.Map; + + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +@RequestMapping("/admin/sys_role_module_permission_rest/") +@RestController +public class AdminSysRoleModulePermissionRestController extends CommonRestController implements InitializingBean +{ + + @Resource + private SysRoleModulePermissionService sysRoleModulePermissionService; + //分页查询 + @RequestMapping(value={"page"}, method={RequestMethod.GET}) + public ResponseMsg page( + @RequestParam(required = false,value ="roleIdFirst") Long roleIdFirst , + @RequestParam(required = false,value ="moduleIdFirst") Long moduleIdFirst , + @RequestParam(required = false,value ="permissionIdFirst") Long permissionIdFirst , + @RequestParam int page,@RequestParam int limit,@RequestParam(required = false) String safeOrderBy) + { + limit = Math.min(limit, PageConstant.MAX_LIMIT); + int start = (page - 1) * limit; + Map query = new HashMap(); + query.put("roleIdFirst",roleIdFirst); + query.put("moduleIdFirst",moduleIdFirst); + query.put("permissionIdFirst",permissionIdFirst); + Integer count = sysRoleModulePermissionService.getModelListCount(query); + query.put("start",start); + query.put("limit",limit); + query.put("safeOrderBy",safeOrderBy); + return new ResponseMsg(count,sysRoleModulePermissionService.getModelList(query)); + } + @Override + public void afterPropertiesSet() throws Exception { + super.commonService = sysRoleModulePermissionService; + super.primaryKey = "id";//硬编码此实体的主键名称 + } +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/sys/AdminSysRoleRestController.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/sys/AdminSysRoleRestController.java new file mode 100644 index 0000000..3bfcb44 --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/admin/sys/AdminSysRoleRestController.java @@ -0,0 +1,86 @@ +package com.passManage.us.admin.rmp.common.controller.admin.sys; + +import com.passManage.us.admin.rmp.model.SysRole; +import com.passManage.us.admin.rmp.service.SysRoleService; +import com.passManage.us.core.common.constant.PageConstant; +import com.passManage.us.core.serialize.ResponseMsg; +import com.passManage.us.core.service.CommonRestController; +import com.passManage.us.core.utils.ListUtil; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +@RequestMapping("/admin/sys_role_rest/") +@RestController +public class AdminSysRoleRestController extends CommonRestController implements InitializingBean +{ + + @Resource + private SysRoleService sysRoleService; + + @RequestMapping(value = "search") + public ResponseMsg search( + @RequestParam(required = false) String uniqueField, + @RequestParam(required = false,value = "uniqueValue[]") Set uniqueValue,//主键多个值 + @RequestParam(required = false,defaultValue = "20") Integer limit, + @RequestParam(required = false) String keyword + ){ + limit = Math.min(PageConstant.MAX_LIMIT,limit); + List list = null; + Map query = new HashMap(); + query.put("limit",limit); + if(uniqueValue!=null){//说明是来初始化的 + list = sysRoleService.getModelInList(uniqueValue); + }else {//正常搜索 + query.put("roleNameFirst",keyword); + list = sysRoleService.getModelList(query); + query.remove("roleNameFirst"); + } + return new ResponseMsg(list); + } + //分页查询 + @RequestMapping(value={"page"}, method={RequestMethod.GET}) + public ResponseMsg page( + @RequestParam(required = false,value ="roleNameFirst") String roleNameFirst , + @RequestParam int page, @RequestParam int limit, @RequestParam(required = false) String safeOrderBy + , HttpServletResponse response, @RequestParam(required = false) Integer queryType + ){ + Map query = new HashMap(); + query.put("roleNameFirst",coverBlankToNull(roleNameFirst)); + Integer count = sysRoleService.getModelListCount(query); + query.put("safeOrderBy",safeOrderBy); + if(queryType==null || queryType == QUERY_TYPE_SEARCH){//普通查询 + limit = Math.min(limit, PageConstant.MAX_LIMIT); + query.put("start",(page - 1) * limit);query.put("limit",limit); + return new ResponseMsg(count,sysRoleService.getModelList(query)); + }else if(queryType == QUERY_TYPE_EXPORT_EXCEL){ + query.put("start",(page - 1) * limit);query.put("limit",limit); + exportExcel(response,sysRoleService.getModelList(query),"角色", + new String[]{"主键","角色名"}, + new String[]{"",""}); + } + return null; + } + + @Override + public void afterPropertiesSet() throws Exception { + super.commonService = sysRoleService; + super.primaryKey = "id";//硬编码此实体的主键名称 + } +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/web/user/WebSecurityController.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/web/user/WebSecurityController.java new file mode 100644 index 0000000..ee150a9 --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/web/user/WebSecurityController.java @@ -0,0 +1,59 @@ +package com.passManage.us.admin.rmp.common.controller.web.user; + +import com.passManage.us.admin.common.config.UploadFilePathConfig; +import com.passManage.us.admin.rmp.constant.PermissionConstant; +import com.passManage.us.core.cache.redis.RedisUtil; +import com.passManage.us.core.identifyingcode.CreateIdentifyingCode; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Controller; +import org.springframework.ui.ModelMap; +import org.springframework.web.bind.annotation.RequestMapping; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.IOException; + +/** + * author: www.magicalcoder.com + * date:2018/7/10 + * function: + */ +@Controller +public class WebSecurityController { + + /*是否是发布状态的js*/ + @Value("${magicalcoder.publish}") + private boolean publish; + /*的前缀*/ + @Resource + private UploadFilePathConfig uploadFilePathConfig; + + @RequestMapping(value = "/") + public String index(HttpServletRequest request, ModelMap modelMap){ + initCtxMap(modelMap); + String sessionId = request.getSession().getId(); + modelMap.addAttribute("sessionId",sessionId); + return "login"; + } + @Resource + private RedisUtil redisUtil; + + + private void initCtxMap(ModelMap modelMap){ + modelMap.put("publish",publish); + modelMap.put("fileExtraAddPrefix",uploadFilePathConfig.getFileExtraAddPrefix()); + modelMap.put("requestPrefix",uploadFilePathConfig.getRequestPrefix()); + } + + //验证码 + @Resource + private CreateIdentifyingCode createIdentifyingCode; + @RequestMapping(value = "/web/code") + public void code(HttpServletRequest request,HttpServletResponse response) throws IOException { + String random =createIdentifyingCode.create(response); + String sessionId = request.getSession().getId(); + redisUtil.set(PermissionConstant.CODE_PREFIX+sessionId,random); + } + +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/web/user/WebSecurityRestController.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/web/user/WebSecurityRestController.java new file mode 100644 index 0000000..8f7e288 --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/controller/web/user/WebSecurityRestController.java @@ -0,0 +1,28 @@ +package com.passManage.us.admin.rmp.common.controller.web.user; + +import com.passManage.us.admin.common.util.R; +import com.passManage.us.admin.rmp.common.service.KeyPairService; +import com.passManage.us.admin.rmp.service.SysAdminUserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.ResponseBody; +import org.springframework.web.bind.annotation.RestController; + +/** + * author: www.magicalcoder.com + * date:2018/7/10 + * function: + */ +@RestController +public class WebSecurityRestController { + @Autowired + private SysAdminUserService userService; + +// @Autowired +// private KeyPairService keyPairService; +// @RequestMapping("/remoteauth") +// public R remoteAuth(@RequestParam("username")String username, @RequestParam("password")String password){ +// keyPairService +// } +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/provider/MyAuthenticationProvider.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/provider/MyAuthenticationProvider.java new file mode 100644 index 0000000..e72d4d2 --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/provider/MyAuthenticationProvider.java @@ -0,0 +1,75 @@ +package com.passManage.us.admin.rmp.common.provider; + +import com.passManage.us.admin.rmp.constant.PermissionConstant; +import com.passManage.us.admin.rmp.dto.SysAdminUserDto; +import com.passManage.us.admin.rmp.service.SecurityUserDetailService; +import com.passManage.us.core.cache.redis.RedisUtil; +import com.passManage.us.core.utils.Md5Util; +import com.passManage.us.core.utils.StringUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.authentication.AuthenticationProvider; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.AuthenticationException; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; + +/** + * author:www.magicalcoder.com + * date:2018/7/16 + * function:自定义验证代码 可以同时拿到用户名 密码 + * 此类不再使用 页面跳转比较适合,但是这种联合登陆写的太死了 + */ +@Slf4j +@Component +public class MyAuthenticationProvider implements AuthenticationProvider { + @Resource + private SecurityUserDetailService securityUserDetailService; + @Resource + private RedisUtil redisUtil; + @Override + public Authentication authenticate(Authentication authentication) throws AuthenticationException { + String username = authentication.getName(); + //password = realPassword|||sessionId|||验证码 我十分不理解 spring security 真是个无语的存在 随便一个小扩展 得写一大堆类 这里就不扩展了 + String password = (String)authentication.getCredentials(); + if(StringUtil.isBlank(username)){ + throw new BadCredentialsException("用户名不能为空"); + } + String[] parr = password.split("\\|\\|\\|"); + password = parr[0].trim();//密码 + String sessionId = parr[1];// + String code = parr[2].trim().toLowerCase();//验证码 + String storeCode = null; + storeCode = redisUtil.get(PermissionConstant.CODE_PREFIX+sessionId); + if(storeCode!=null){ + storeCode = storeCode.toLowerCase(); + }else { + throw new BadCredentialsException("验证码失效,请点击验证码进行重新获取"); + } + if(!code.equals(storeCode)){ + throw new BadCredentialsException("验证码错误"); + } + if(StringUtil.isBlank(password)){ + throw new BadCredentialsException("密码不能为空"); + } + SysAdminUserDto sysAdminUserDto = (SysAdminUserDto)securityUserDetailService.loadUserByUsername(username); + if(sysAdminUserDto == null){ + throw new BadCredentialsException("暂未配置此账号,请联系管理员"); + } + String md5Password = Md5Util.md5Encode(password); + if(!md5Password.equals(sysAdminUserDto.getPassword())){ + throw new BadCredentialsException("用户名密码不一致"); + } + if(!sysAdminUserDto.isEnabled()){ + throw new BadCredentialsException("此账号被禁用,请联系管理员"); + } + return new UsernamePasswordAuthenticationToken(sysAdminUserDto,password,sysAdminUserDto.getAuthorities()); + } + + @Override + public boolean supports(Class aClass) { + return true; + } +} diff --git a/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/service/KeyPairService.java b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/service/KeyPairService.java new file mode 100644 index 0000000..209ce47 --- /dev/null +++ b/us_passManage/us-admin/src/main/java/com/passManage/us/admin/rmp/common/service/KeyPairService.java @@ -0,0 +1,4 @@ +package com.passManage.us.admin.rmp.common.service; + +public interface KeyPairService { +} diff --git a/us_passManage/us-admin/src/main/resources/application-line.yml b/us_passManage/us-admin/src/main/resources/application-line.yml new file mode 100644 index 0000000..ea6fb89 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/application-line.yml @@ -0,0 +1,104 @@ +##笔记本的环境设置 +server: + #tomcat端口 比如http://{ip}:{port}{/context-path}中的{port} 纯数字 + port: 18080 +common: + datasource: + #mysql url连接信息 + url: jdbc:mysql://mypc:30002/us?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&userSSL=true&serverTimezone=Hongkong&zeroDateTimeBehavior=CONVERT_TO_NULL + #数据库用户名 注意:后紧跟一个空格再加上你实际的用户名 否则会报错 非法格式 + username: us + #数据库密码 注意:后紧跟一个空格再加上你实际的密码 否则会报错 非法格式 + password: us123*$ + #mysql8新驱动名称 + driverClassName: com.mysql.cj.jdbc.Driver + +spring: + thymeleaf: + cache: false + redis: + #所有的redis 缓存都会加入下面的前缀 方便管理 + keyPrefix: us-admin. + # redis地址 单机模式 参见RedisConfig + host: localhost + #redis端口 单机模式 + port: 6379 + #不允许redis密码为空字符串 可以不设置 您也可以使用"1234" + password: + #集群模式 默认不开启 因为集群模式redis配置复杂,演示版只有一个redis + # cluster: + #redis支持集群模式(需要参考文档自行打开) 也支持单机(配置一个即可) 配置规则:节点的ip:port,ip:port 逗号分隔多个 +# nodes: localhost:6379 +# 最大连接时间 具体参考JedisCluster官方文档 +# connectionTimeout: 5000 +# soTimeout: 5000 +# maxAttempts: 3 + + #druid管理后台 http://localhost:18080/us-admin/druid/ 可以查看数据源的状态 账号/密码:admin/123456 + monitor: + druid: + userName: admin + password: 123456 + allowIps: 127.0.0.1 + denyIps: 10.1.1.1 + filters: stat,log4j + devtools: + restart: + #是否开启热部署 另外需要配置ide的配置一同生效 参考这篇文章 https://blog.csdn.net/boywcx/article/details/81164411 + enabled: false + servlet: + multipart: + #单个文件大小 1G + max-file-size: 1024000000 + #总上传的数据大小 1G + max-request-size: 1024000000 + #是否开启 + enabled: true + +magicalcoder: + file: + #文件上传配置:useDisk useAliyunOss 如果open都为true 则都使用 returnUrl 默认优先级 useAliyunOss useDisk + upload: + #上传至本地硬盘 + useDisk: + #是否开启 + open: true + #控制是否采用此模式返回给前端的图片地址 + returnUrl: true + #由于spring boot是jar方式执行,无法自动映射上传文件访问地址,采取单独映射方法 + mapping: + #文件要上传到的硬盘路径 例如 windows: /E:/tmp/test/ linux: /home/web/file/upload/ 如果不设置 则会自动查找classpath路径下的upload + uploadDiskFolder: + #虚拟访问映射地址 请尽量不要改动 AdminCommonFileRestController里面有根据这个返回给前端 你可以设置images/magic 前后不要有/ 不能为空 + requestPrefix: upload + #实际额外在前面添加其他内容 主要用于跟你自己的项目路径映射 会在实际路径中加入此前缀 不要以http开头 /upload/ + fileExtraAddPrefix: upload/ + #使用阿里云oss 开通方式参考 doc\upload\阿里云oss文件上传.docx 本配置请改成您自己的阿里云实际参数 因为存储桶要钱购买 所以这里不可能免费使用 + useAliyunOss: + #是否开启 + open: false + #控制是否采用此模式返回给前端的图片地址 + returnUrl: true + #Region请按实际情况填写 + endpoint: http://oss-cn-beijing.aliyuncs.com + #oos存储账号 + accessKeyId: LTAIGeWoz1iMmX2X + #oos存储密码 + accessKeySecret: OywMJpmN5cSqreqgLNYZVrBqtxmE8H + #oos存储桶名称 + bucketName: us + #桶的地址前缀 你如果不明白怎么配置 去阿里云oss后台 找个地址看一下 组合是 urlPrefix+上传时候的文件名称 + aliyunImgDomain: https://us.oss-cn-beijing.aliyuncs.com/ + + #超级管理员账号名称 密码默认:magicalcoder + superUserName: magicalcoder + cors: + # 跨域 支持哪些同源域名 逗号分隔多个 你可以配置 http://localhost:18088,http://www.magicalcoder.com 跨域demo参考README.md + allowOrigin: + #是否是发布模式 true则加载精简的us-all.min.js us-all.min.css,如果您更改了系统js css 注意自行合并 参考YouyabootAllJsCompressTest YouyabootAllCssCompressTest 这样页面加载速度会更快 否则加载其他的crud下面的js 和各个 css + publish: true + settings: + #当启动成功 自动帮助启动浏览器 linux服务端部署方式启动 请设置false + autoStartExplorer: false + #设置默认浏览器的浏览器路径 此处设置chrome为例 您如果未安装chrome 或者不设置此处 则使用默认浏览器 + explorerPath: C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe diff --git a/us_passManage/us-admin/src/main/resources/application-localhost.yml b/us_passManage/us-admin/src/main/resources/application-localhost.yml new file mode 100644 index 0000000..9c44d8e --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/application-localhost.yml @@ -0,0 +1,104 @@ +##本地环境设置 配置注意事项 : 后面紧跟一个空格 然后再配置您的实际值 +server: + #tomcat端口 比如http://{ip}:{port}{/context-path}中的{port} 纯数字 + port: 18088 +common: + datasource: + #mysql url连接信息 + url: jdbc:mysql://localhost:3306/us?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&userSSL=true&serverTimezone=Hongkong&zeroDateTimeBehavior=CONVERT_TO_NULL + #数据库用户名 + username: root + #数据库密码 + password: 123456 + #mysql8新驱动名称 + driverClassName: com.mysql.cj.jdbc.Driver + +spring: + thymeleaf: + cache: false + redis: + #所有的redis 缓存都会加入下面的前缀 方便管理 + keyPrefix: + # redis地址 单机模式 参见RedisConfig + host: localhost + #redis端口 单机模式 + port: 6379 + #不允许redis密码为空字符串 可以不设置 您也可以使用"1234" + password: 123456 + #集群模式 默认不开启 因为集群模式redis配置复杂,演示版只有一个redis + # cluster: + #redis支持集群模式(需要参考文档自行打开) 也支持单机(配置一个即可) 配置规则:节点的ip:port,ip:port 逗号分隔多个 +# nodes: localhost:6379 +# 最大连接时间 具体参考JedisCluster官方文档 +# connectionTimeout: 5000 +# soTimeout: 5000 +# maxAttempts: 3 + + #druid管理后台 http://localhost:18080/us-admin/druid/ 可以查看数据源的状态 账号/密码:admin/123456 + monitor: + druid: + userName: admin + password: 123456 + allowIps: 127.0.0.1 + denyIps: 10.1.1.1 + filters: stat,log4j + devtools: + restart: + #是否开启热部署 另外需要配置ide的配置一同生效 参考这篇文章 https://blog.csdn.net/boywcx/article/details/81164411 + enabled: false + servlet: + multipart: + #单个文件大小 1G + max-file-size: 1024000000 + #总上传的数据大小 1G + max-request-size: 1024000000 + #是否开启 + enabled: true + +magicalcoder: + file: + #文件上传配置:useDisk useAliyunOss 如果open都为true 则都使用 returnUrl 默认优先级 useAliyunOss useDisk + upload: + #上传至本地硬盘 + useDisk: + #是否开启 + open: true + #控制是否采用此模式返回给前端的图片地址 + returnUrl: true + #由于spring boot是jar方式执行,无法自动映射上传文件访问地址,采取单独映射方法 + mapping: + #文件要上传到的硬盘路径 例如 windows: /E:/tmp/test/ linux: /home/web/file/upload/ 如果不设置 则会自动查找classpath路径下的upload + uploadDiskFolder: + #虚拟访问映射地址 请尽量不要改动 AdminCommonFileRestController里面有根据这个返回给前端 你可以设置images/magic 前后不要有/ 不能为空 + requestPrefix: upload + #实际额外在前面添加其他内容 主要用于跟你自己的项目路径映射 会在实际路径中加入此前缀 不要以http开头 /upload/ + fileExtraAddPrefix: upload/ + #使用阿里云oss 开通方式参考 doc\upload\阿里云oss文件上传.docx 本配置请改成您自己的阿里云实际参数 因为存储桶要钱购买 所以这里不可能免费使用 + useAliyunOss: + #是否开启 + open: false + #控制是否采用此模式返回给前端的图片地址 + returnUrl: true + #Region请按实际情况填写 + endpoint: http://oss-cn-beijing.aliyuncs.com + #oos存储账号 + accessKeyId: LTAIGeWoz1iMmX2X + #oos存储密码 + accessKeySecret: OywMJpmN5cSqreqgLNYZVrBqtxmE8H + #oos存储桶名称 + bucketName: us + #桶的地址前缀 你如果不明白怎么配置 去阿里云oss后台 找个地址看一下 组合是 urlPrefix+上传时候的文件名称 + aliyunImgDomain: https://us.oss-cn-beijing.aliyuncs.com/ + + #超级管理员账号名称 密码默认:magicalcoder + superUserName: magicalcoder + cors: + # 跨域 支持哪些同源域名 逗号分隔多个 你可以配置 http://localhost:18088,http://www.magicalcoder.com 跨域demo参考README.md + allowOrigin: + #是否是发布模式 true则加载精简的us-all.min.js us-all.min.css,如果您更改了系统js css 注意自行合并 参考YouyabootAllJsCompressTest YouyabootAllCssCompressTest 这样页面加载速度会更快 否则加载其他的crud下面的js 和各个 css + publish: false + settings: + #当启动成功 自动帮助启动浏览器 linux服务端部署方式启动 请设置false + autoStartExplorer: true + #设置默认浏览器的浏览器路径 此处设置chrome为例 您如果未安装chrome 或者不设置此处 则使用默认浏览器 + explorerPath: C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe diff --git a/us_passManage/us-admin/src/main/resources/application-publish.yml b/us_passManage/us-admin/src/main/resources/application-publish.yml new file mode 100644 index 0000000..9fae92c --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/application-publish.yml @@ -0,0 +1,104 @@ +##笔记本的环境设置 +server: + #tomcat端口 比如http://{ip}:{port}{/context-path}中的{port} 纯数字 + port: 18080 +common: + datasource: + #mysql url连接信息 + url: jdbc:mysql://localhost:3306/us?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&userSSL=true&serverTimezone=Hongkong&zeroDateTimeBehavior=CONVERT_TO_NULL + #数据库用户名 + username: root + #数据库密码 + password: + #mysql8新驱动名称 + driverClassName: com.mysql.cj.jdbc.Driver + +spring: + thymeleaf: + cache: false + redis: + #所有的redis 缓存都会加入下面的前缀 方便管理 + keyPrefix: us-admin. + # redis地址 单机模式 参见RedisConfig + host: localhost + #redis端口 单机模式 + port: 6379 + #不允许redis密码为空字符串 可以不设置 您也可以使用"1234" + password: 123456 + #集群模式 默认不开启 因为集群模式redis配置复杂,演示版只有一个redis + # cluster: + #redis支持集群模式(需要参考文档自行打开) 也支持单机(配置一个即可) 配置规则:节点的ip:port,ip:port 逗号分隔多个 +# nodes: localhost:6379 +#最大连接时间 具体参考JedisCluster官方文档 +# connectionTimeout: 5000 +# soTimeout: 5000 +# maxAttempts: 3 + + #druid管理后台 http://localhost:18080/us-admin/druid/ 可以查看数据源的状态 账号/密码:admin/123456 + monitor: + druid: + userName: admin + password: 123456 + allowIps: 127.0.0.1 + denyIps: 10.1.1.1 + filters: stat,log4j + devtools: + restart: + #是否开启热部署 另外需要配置ide的配置一同生效 参考这篇文章 https://blog.csdn.net/boywcx/article/details/81164411 + enabled: false + servlet: + multipart: + #单个文件大小 1G + max-file-size: 1024000000 + #总上传的数据大小 1G + max-request-size: 1024000000 + #是否开启 + enabled: true + +magicalcoder: + file: + #文件上传配置:useDisk useAliyunOss 如果open都为true 则都使用 returnUrl 默认优先级 useAliyunOss useDisk + upload: + #上传至本地硬盘 + useDisk: + #是否开启 + open: true + #控制是否采用此模式返回给前端的图片地址 + returnUrl: true + #由于spring boot是jar方式执行,无法自动映射上传文件访问地址,采取单独映射方法 + mapping: + #文件要上传到的硬盘路径 例如 windows: /E:/tmp/test/ linux: /home/web/file/upload/ 如果不设置 则会自动查找classpath路径下的upload + uploadDiskFolder: + #虚拟访问映射地址 请尽量不要改动 AdminCommonFileRestController里面有根据这个返回给前端 你可以设置images/magic 前后不要有/ 不能为空 + requestPrefix: upload + #实际额外在前面添加其他内容 主要用于跟你自己的项目路径映射 会在实际路径中加入此前缀 不要以http开头 /upload/ + fileExtraAddPrefix: upload/ + #使用阿里云oss 开通方式参考 doc\upload\阿里云oss文件上传.docx 本配置请改成您自己的阿里云实际参数 因为存储桶要钱购买 所以这里不可能免费使用 + useAliyunOss: + #是否开启 + open: false + #控制是否采用此模式返回给前端的图片地址 + returnUrl: true + #Region请按实际情况填写 + endpoint: http://oss-cn-beijing.aliyuncs.com + #oos存储账号 + accessKeyId: LTAIGeWoz1iMmX2X + #oos存储密码 + accessKeySecret: OywMJpmN5cSqreqgLNYZVrBqtxmE8H + #oos存储桶名称 + bucketName: us + #桶的地址前缀 你如果不明白怎么配置 去阿里云oss后台 找个地址看一下 组合是 urlPrefix+上传时候的文件名称 + aliyunImgDomain: https://us.oss-cn-beijing.aliyuncs.com/ + + #超级管理员账号名称 密码默认:magicalcoder + superUserName: magicalcoder + cors: + # 跨域 支持哪些同源域名 逗号分隔多个 你可以配置 http://localhost:18088,http://www.magicalcoder.com 跨域demo参考README.md + allowOrigin: + #是否是发布模式 true则加载精简的us-all.min.js us-all.min.css,如果您更改了系统js css 注意自行合并 参考YouyabootAllJsCompressTest YouyabootAllCssCompressTest 这样页面加载速度会更快 否则加载其他的crud下面的js 和各个 css + publish: true + settings: + #当启动成功 自动帮助启动浏览器 linux服务端部署方式启动 请设置false + autoStartExplorer: false + #设置默认浏览器的浏览器路径 此处设置chrome为例 您如果未安装chrome 或者不设置此处 则使用默认浏览器 + explorerPath: C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe diff --git a/us_passManage/us-admin/src/main/resources/application.yml b/us_passManage/us-admin/src/main/resources/application.yml new file mode 100644 index 0000000..6b28b11 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/application.yml @@ -0,0 +1,35 @@ +#全局配置 +# tomcat配置 +server: + #当前环境上下文 比如http://{ip}:{port}{/context-path}中的{/context-path} 以/开头配置 + # context-path: /us-admin + servlet: + context-path: /us-admin +#log +logging: + config: + #日志配置:读取当前环境下的logback.xml + classpath: logback.xml + +spring: + # thymeleaf: + # prefix: classpath:/templates + profiles: + # publish localhost就可以切换不同环境application-xxx的配置 + active: localhost + messages: + encoding: UTF-8 + http: + encoding: + charset: UTF-8 + enabled: true + force: true + application: + #service-name + name: us-admin + jackson: + time-zone: GMT+8 + mvc: + #这样浏览器小图标就可以加载你自己的favicon.ico了 + favicon: + enabled: false diff --git a/us_passManage/us-admin/src/main/resources/banner.txt b/us_passManage/us-admin/src/main/resources/banner.txt new file mode 100644 index 0000000..8ca73ae --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/banner.txt @@ -0,0 +1,32 @@ +version: v0.0.1 +发布日期:2018-8-19 +/** + *        ┏┓  ┏┓+ + + *       ┏┛┻━━━┛┻┓ + + + *       ┃      ┃   + *       ┃   ━   ┃ ++ + + + + *       ████━████ ┃+ + *       ┃       ┃ + + *       ┃   ┻   ┃ + *       ┃      ┃ + + + *       ┗━┓   ┏━┛ + *         ┃   ┃            + *         ┃   ┃ + + + + + *         ┃   ┃          + *         ┃   ┃ +      + *         ┃   ┃ + *         ┃   ┃  +          + *         ┃    ┗━━━┓ + + + *         ┃      ┣┓ + *         ┃       ┏┛ + *         ┗┓┓┏━┳┓┏┛ + + + + + *         ┃┫┫ ┃┫┫ + *         ┗┻┛ ┗┻┛+ + + + + * + * 神兽保佑 永无BUG + */ + #登录后台 + http://localhost:18080/us-admin/ 测试账号 admin/admin + 如果启动失败 : 1 请配置application-publish.yml的数据库和redis 相关信息 + druid数据库连接池信息查看:http://localhost:18088/us-web/druid admin/123456 + diff --git a/us_passManage/us-admin/src/main/resources/lib/bcprov-jdk14-143.jar b/us_passManage/us-admin/src/main/resources/lib/bcprov-jdk14-143.jar new file mode 100644 index 0000000..cb1c411 Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/lib/bcprov-jdk14-143.jar differ diff --git a/us_passManage/us-admin/src/main/resources/lib/sun.misc.BASE64Decoder.jar b/us_passManage/us-admin/src/main/resources/lib/sun.misc.BASE64Decoder.jar new file mode 100644 index 0000000..9811c13 Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/lib/sun.misc.BASE64Decoder.jar differ diff --git a/us_passManage/us-admin/src/main/resources/logback.xml b/us_passManage/us-admin/src/main/resources/logback.xml new file mode 100644 index 0000000..1b10213 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/logback.xml @@ -0,0 +1,30 @@ + + + + + + ~/data/us-servicelog.log + + ~/data/us-%d{yyyyMMdd}.log.%i + + 500MB + + 100 + + + %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n + + + + + + + + + + + + + + + diff --git a/us_passManage/us-admin/src/main/resources/static/assets/admin/dict/config.js b/us_passManage/us-admin/src/main/resources/static/assets/admin/dict/config.js new file mode 100644 index 0000000..7479621 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/admin/dict/config.js @@ -0,0 +1,27 @@ +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ +//表单通用配置 列表页 详情页都需要 +layui.define(['jquery'],function(exports){ + var obj = + { + tableNameRest:"dict_rest", + tableName:"dict", + moduleName:"dict",//sys_module的moduleName + formVerifyEditData:{//详情页提交时表单校验 使用方法参考layui官网 表单验证规则 + + }, + form:{ + + createTime:{ + renderConfig:{"calendar":false,"format":"yyyy-MM-dd HH:mm:ss","show":false,"range":false,"trigger":"click","type":"datetime","isInitValue":true,"showBottom":true,"inputType":"date","theme":"default","position":"absolute","lang":"cn","zIndex":66666666} + } + ,updateTime:{ + renderConfig:{"calendar":false,"format":"yyyy-MM-dd HH:mm:ss","show":false,"range":false,"trigger":"click","type":"datetime","isInitValue":true,"showBottom":true,"inputType":"date","theme":"default","position":"absolute","lang":"cn","zIndex":66666666} + } + } + } + exports('dict_config',obj); +}) diff --git a/us_passManage/us-admin/src/main/resources/static/assets/admin/goods/config.js b/us_passManage/us-admin/src/main/resources/static/assets/admin/goods/config.js new file mode 100644 index 0000000..a883b9a --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/admin/goods/config.js @@ -0,0 +1,16 @@ +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ +//表单通用配置 列表页 详情页都需要 已经废弃 +layui.define(['jquery'],function(exports){ + var obj = + { + tableNameRest:"goods_rest", + tableName:"goods", + moduleName:"goods",//sys_module的moduleName + form:{} + } + exports('goods_config',obj); +}) diff --git a/us_passManage/us-admin/src/main/resources/static/assets/admin/goods_file/config.js b/us_passManage/us-admin/src/main/resources/static/assets/admin/goods_file/config.js new file mode 100644 index 0000000..877eb75 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/admin/goods_file/config.js @@ -0,0 +1,16 @@ +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ +//表单通用配置 列表页 详情页都需要 基本已经废弃 +layui.define(['jquery'],function(exports){ + var obj = + { + tableNameRest:"goods_file_rest", + tableName:"goods_file", + moduleName:"goods_file",//sys_module的moduleName + form:{} + } + exports('goodsfile_config',obj); +}) diff --git a/us_passManage/us-admin/src/main/resources/static/assets/admin/goods_img/config.js b/us_passManage/us-admin/src/main/resources/static/assets/admin/goods_img/config.js new file mode 100644 index 0000000..ed59925 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/admin/goods_img/config.js @@ -0,0 +1,16 @@ +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ +//表单通用配置 列表页 详情页都需要 基本已经废弃 +layui.define(['jquery'],function(exports){ + var obj = + { + tableNameRest:"goods_img_rest", + tableName:"goods_img", + moduleName:"goods_img",//sys_module的moduleName + form:{} + } + exports('goodsimg_config',obj); +}) diff --git a/us_passManage/us-admin/src/main/resources/static/assets/admin/p_pass_instant/edit.js b/us_passManage/us-admin/src/main/resources/static/assets/admin/p_pass_instant/edit.js new file mode 100644 index 0000000..630c14b --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/admin/p_pass_instant/edit.js @@ -0,0 +1,138 @@ +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 软件作者:何栋宇 qq:709876443 +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:648595928 +*/ +;!function(){ + var $ = layui.jquery + ,layer = parent.layer === undefined ? layui.layer : top.layer + ,form = layui.form; + var mc_layui_component=youyaboot_all.mc_layui_component + ,mc_util = youyaboot_all.mc_util + ,mc_children = youyaboot_all.mc_children + ,mc_verify = youyaboot_all.mc_verify + ,mc_constant = youyaboot_all.mc_constant + ,mc_rmp = youyaboot_all.mc_rmp + ; + var common_config = { + tableNameRest:"p_pass_instant_rest", + tableName:"p_pass_instant", + moduleName:"p_pass_instant",//sys_module的moduleName + form:{ + passExpiry:{ + renderConfig:{}//您可以自定义个性配置 遇到相同的则以dom配置为准 大部分属性已推荐设置在元素标签上 这里您可以自定义事件 {"calendar":false,"format":"yyyy-MM-dd HH:mm:ss","show":false,"range":false,"trigger":"click","type":"datetime","isInitValue":true,"showBottom":true,"inputType":"date","theme":"default","position":"absolute","lang":"cn","zIndex":66666666} + } + ,passCreatetime:{ + renderConfig:{}//您可以自定义个性配置 遇到相同的则以dom配置为准 大部分属性已推荐设置在元素标签上 这里您可以自定义事件 {"calendar":false,"format":"yyyy-MM-dd HH:mm:ss","show":false,"range":false,"trigger":"click","type":"datetime","isInitValue":true,"showBottom":true,"inputType":"date","theme":"default","position":"absolute","lang":"cn","zIndex":66666666} + } + }, + event:{ + select2Change:function (elem,name,value) {//外键下拉更新事件 + } + } + } + var tableNameRest = common_config.tableNameRest; + var moduleName = common_config.moduleName; + var obj = { + render:function () {//入口 + this.ajaxGetEntityDataAndAutoSetFormUiValue(); + this.submit(); + }, + //初始化表单 + ajaxGetEntityDataAndAutoSetFormUiValue : function () { + var _t = this; + var identify = mc_util.getParameter('identify')//从url中检测主键 + if(identify!=null && identify!=''){//断定是编辑操作 + $.getJSON('admin/'+tableNameRest+"/get/"+identify,{date:new Date().getTime()},function (data) {//获取此实体详情数据 + if(data.flag){ + var entity = data.data + if(entity && entity!=null){ + //把请求到的实体内容自动设置到表单中去 + mc_util.mappingEntityToFormUiValue($("body"),entity); + //禁用外键编辑区域:只有当从更多信息点击进来 才会禁用 单表操作不会执行 + mc_children.disabledFormParentArea(); + //权限 注意xxx-edit.html页面刚进来 是被隐藏的(body标签的layui-hide样式) 这样当权限执行完 才进行一一显示 + mc_rmp.paintBody(moduleName,function () { + var verifyData = mc_layui_component.bindMagicalCoderLayUiComponentFromDetail(common_config);//返回富文本的校验 为了能同步隐藏域 + _t.layuiFormVerify(verifyData); + }) + }else { + layer.msg("此条记录已被删除,请重新查询!"); + } + }else { + layer.msg("查询失败:"+data.desc); + } + }) + }else {//新增操作 + //禁用外键编辑区域:只有当从更多信息点击进来 才会禁用 单表操作不会执行 + mc_children.disabledFormParentArea(); + //权限 + mc_rmp.paintBody(moduleName,function () { + var verifyData =mc_layui_component.bindMagicalCoderLayUiComponentFromDetail(common_config);//返回富文本的校验 为了能同步隐藏域 + _t.layuiFormVerify(verifyData); + $("button[type='reset']").removeClass('layui-hide');//把重置按钮显示处理 + }) + } + }, + //layui的表单校验规则 + layuiFormVerify:function (verifyData) {//verifyData 里如果由内容则是富文本的校验同步 + var verifyData = + $.extend(verifyData,{//这里可以自定义layui的校验规则 自行扩展 参考官网文档 https://www.layui.com/doc/modules/form.html + + }) + form.verify(verifyData); + } + , + //表单提交 + submit : function () { + //重置按钮把外键的默认值清空 + $("button[type='reset']").click(function(){ + $("."+mc_constant.MC_LAY_CLASS_NAME.FORM.foreign_select2).val(null).trigger('change');//固定写法 把搜索下拉重置空值 + $("."+mc_constant.MC_LAY_CLASS_NAME.FORM.foreign_select2).each(function (id, item) { + $(this).attr("data-value","") + }); + return true; + }); + //表单校验 在_bindFormDom方法 + form.on("submit(save)",function(data){ + // 实际使用时的提交信息 + var postData = data.field; + //开关单独处理 + $('body').find("input[lay-skin='switch']").each(function (index,item) { + var name = $(item).attr("name") + var field = data.field + postData[name] = field[name] ? ((field[name]+''=='on' || field[name]+'' == 'true') ? 1 : 0):0;//开关请用0或1来设置值 + }) + //清理上次不通过样式提醒 + for(var name in postData){ + var dom = $("[name='"+name+"']") + mc_verify.clearDangerClass(dom) + } + //MagicalCoder扩展的表单校验 + for(var name in postData){ + var dom = $("[name='"+name+"']") + var value = postData[name] + if(!mc_verify.verify(value,dom)){ + return false; + } + } + //弹出loading + var index = top.layer.msg('数据提交中,请稍候',{icon: 16,time:false,shade:0.8}); + $.post('admin/'+tableNameRest+'/save',postData,function(res){ + top.layer.close(index); + if(res.flag){ + parent.layui.$(".search_btn").click()//parent代表父窗口,因为详情页是iframe弹出来的;让列表页重新执行一次搜索 + //关闭当前层 + var pidx = parent.layui.layer.index + parent.layui.layer.close(pidx-1); + }else { + top.layer.msg("保存失败:"+res.desc); + } + }) + return false; + }) + } + } + obj.render(); +}(); diff --git a/us_passManage/us-admin/src/main/resources/static/assets/admin/p_pass_instant/list.js b/us_passManage/us-admin/src/main/resources/static/assets/admin/p_pass_instant/list.js new file mode 100644 index 0000000..1518ba6 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/admin/p_pass_instant/list.js @@ -0,0 +1,338 @@ +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 软件作者:何栋宇 qq:709876443 +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:648595928 +*/ +//不要被如此多的代码唬住,读懂一个 其他的模块都明白了,之所以写这么多开放出来,主要是为了定制和维护性,您可以随意修改逻辑 适应你的业务场景 +;!function(){ + var $ = layui.jquery + ,layer = parent.layer === undefined ? layui.layer : top.layer + ,table = layui.table; + var mc_children = youyaboot_all.mc_children + ,mc_constant = youyaboot_all.mc_constant + ,mc_util = youyaboot_all.mc_util + ,mc_rmp = youyaboot_all.mc_rmp + ,mc_layui_component = youyaboot_all.mc_layui_component + ; + +// 子表 排序相关 + var CONFIG = { + tableNameRest:"p_pass_instant_rest", + tableName:"p_pass_instant", + moduleName:"p_pass_instant",//sys_module的moduleName + form:{ + passExpiry:{ + renderConfig:{}//您可以自定义个性配置 遇到相同的则以dom配置为准 大部分属性已推荐设置在元素标签上 这里您可以自定义事件 {"calendar":false,"format":"yyyy-MM-dd HH:mm:ss","show":false,"range":false,"trigger":"click","type":"datetime","isInitValue":true,"showBottom":true,"inputType":"date","theme":"default","position":"absolute","lang":"cn","zIndex":66666666} + } + ,passCreatetime:{ + renderConfig:{}//您可以自定义个性配置 遇到相同的则以dom配置为准 大部分属性已推荐设置在元素标签上 这里您可以自定义事件 {"calendar":false,"format":"yyyy-MM-dd HH:mm:ss","show":false,"range":false,"trigger":"click","type":"datetime","isInitValue":true,"showBottom":true,"inputType":"date","theme":"default","position":"absolute","lang":"cn","zIndex":66666666} + } + }, + event:{ + select2Change:function (elem,name,value) {//外键下拉更新事件 + } + }, + layTable : {//表格内容 到list.html查找即可明白 + elem : '#newsList', + id : "newsListTable" + }, + //排序跟数据库实际字段名的映射 + sortMap:{ + passId:'pass_id',passName:'pass_name',passLength:'pass_length',passType:'pass_type',passExpiry:'pass_expiry',passUserid:'pass_userid' + } + }; + //后端请求时候的表模块规则url + var tableNameRest = CONFIG.tableNameRest; + var tableName = CONFIG.tableName; + //表格每一列配置 + var COLS = [[ + {type: "checkbox", /*fixed:"left",*/ width:50},//全选 + {field: 'passId', title: '密钥UUID', minWidth:100, align:"center",sort:true}, + + {field: 'passName', title: '密钥名称', minWidth:200,templet:function (d) { + return '' + } + , sort:true + }, + + {field: 'passLength', title: '密钥长度', minWidth:200,templet:function (d) { + return '' + } + , sort:true + }, + + {field: 'passType', title: '密钥类型', minWidth:200,templet:function (d) { + return '' + } + , sort:true + }, + {field: 'passExpiry', title: '密钥有效期', align:'center', minWidth:250, templet :"#passExpiryTemplate",sort:true}, + + {field: 'passUserid', title: '密钥使用者', minWidth:200,templet:function (d) { + return '' + } + , sort:true + }, + {title: '操作', minWidth:250, templet:'#newsListOperateTemplate',/*fixed:"right",*/align:"center"}//操作 到list.html页面查找模板对应的html + ]]; + var obj = { + layTable:function () {//表格 + var tableObj = { + render:function () { + this.initTable(); + this.tableOperateEvent(); + }, + //初始化一个表格 + initTable : function () { + var _this = this; + table.render({//这里是layui的table分页写法 具体可参考layui官方文档 + elem: CONFIG.layTable.elem, + url : 'admin/'+tableNameRest+'/page', + cellMinWidth : 95, + page : true,//是否分页 + //height : "full-10",//高度样式 + // height : 500, + limit : 20,//每页多少条 + limits : [10,15,20,25],//下拉 + id : CONFIG.layTable.id, + cols : COLS,//放入列配置 + loading : true, + where : this.buildQueryFormParams(""),//构造查询参数 注意这里layui会缓存你的上一次查询参数 无法清除 只能考虑设置成空字符才能清理 + done:function (res,curr,count) {//请求成功后处理 + if(res.flag){ + mc_rmp.paintBody(CONFIG.moduleName,function () {//权限判断 + //禁用一些外键字段 当更多信息场景时才会触发 + mc_children.disabledTableParentArea(); + //laytable中有很多控件需要初始化 比如日期等 + mc_layui_component.bindMagicalCoderLayUiComponentFromTable(CONFIG,function(){_this.refreshTableFromCurrentPage()}) + //每一行的操作条目事件 + _this.tableOperateEvent() + }) + }else { + layer.msg(res.desc)//弹窗错误提示 + } + } + }); + }, + //表格内的操作事件 + tableOperateEvent : function () { + var _t = this; + var tableDom = $(CONFIG.layTable.elem); + var layFilter = tableDom.attr("lay-filter"); + //列表操作 + table.on('tool('+layFilter+')', function(obj){//操作条事件写法 参考layui + var primaryFields = tableDom.attr("data-primary-fields");//一般是表主键id 提前隐藏放在表区域 搜索list.html + var layEvent = obj.event, + data = obj.data; + var identify = data[primaryFields] + if(layEvent === 'edit'){ //编辑 + _t.editOrAdd(identify) + } else if(layEvent === 'del'){ //删除 + _t._deleteOneTr(identify) + } else if(layEvent === 'children'){ //子表 更多信息 + _t._childrenOneTr(identify) + } + }); + //列表排序 + table.on('sort('+layFilter+')', function(obj){ + var safeOrderBy = "";//排序字段组合 例如xxx_id desc + if(obj.type && obj.type!=null && obj.type!=''){ + safeOrderBy = CONFIG.sortMap[obj.field] + " " +obj.type; + } + _t.refreshTableFromCurrentPage(safeOrderBy);//从当前页重新加载分页数据 + }); + }, + //编辑或者添加 + editOrAdd : function (identify) {//identify 代表主键值 + var title = identify ? '编辑':'添加' + if(!identify){identify = ''} + var index = layui.layer.open({ + skin:'magicalcoder-layer-admin', + title : title, + type : 2,//打开iframe页面 很多人不知道原理:从列表页进入详情页是直接打开新iframe,详情页根据iframe的入参主键,获取详情页数据,然后重绘详情页,整个过程都是js处理 + maxmin: true, + area: ['80%', '80%'], + content : "admin/page_v2/"+tableName+"/edit?identify="+identify+mc_children.buildForeignParam(), + success : function(layero, index){ + setTimeout(function(){ + layui.layer.tips('点击此处返回列表', '.layui-layer-setwin .layui-layer-close', { + tips: 3 + }); + },500) + } + }) + //改变窗口大小时,重置弹窗的宽高,防止超出可视区域(如F12调出debug的操作) + //$(window).on("resize",function(){ + // layui.layer.full(index); + //}) + }, + _deleteOneTr : function (identify) {//删除一行 + var _this = this; + layer.confirm('确定删除此行记录?',{icon:3, title:'提示信息'},function(index){ + $.post('admin/'+tableNameRest+'/delete/'+identify,{},function (data) { + if(!data.flag){ + layer.msg("删除失败:"+data.desc); + }else { + _this.refreshTableFromCurrentPage();//从当前页刷新列表 + layer.close(index); + } + }) + }); + }, + _childrenOneTr : function (identify) {//更多信息:查看子表 + var title = '相关信息' + if(!identify){identify = ''} + if(!CONFIG.childrenPage || CONFIG.childrenPage==null || CONFIG.childrenPage.length<=0){ + layer.msg("未找到任何子表信息") + return; + } + var content = mc_children.buildTabTemplate(tableName,identify,CONFIG.childrenPage);//自表如果是多个 会绘制多个tab标签 + var index = layui.layer.open({skin:'magicalcoder-layer-admin',title : title,type : 1,maxmin: true,area: ['80%', '80%'],content : content, + success : function(layero, index){ + setTimeout(function(){ + layui.layer.tips('点击此处返回列表', '.layui-layer-setwin .layui-layer-close', { + tips: 3 + }); + },500) + } + }) + mc_children.tabClickEvent();//绑定下更多信息下tab点击事件 分别加载不同子表详情 列表界面 + //改变窗口大小时,重置弹窗的宽高,防止超出可视区域(如F12调出debug的操作) + //$(window).on("resize",function(){ + // layui.layer.full(index); + //}) + }, + refreshTableFromCurrentPage : function (safeOrderBy) {//当前页 重新加载 + var whereData = this.buildQueryFormParams(safeOrderBy) + this._startReloadTableFromStartPage(null,whereData) + }, + refreshTableFromPageOne : function () {//从第一页 重新加载 搜索场景使用 清空各种参数 + var whereData = this.buildQueryFormParams("") + this._startReloadTableFromStartPage(1,whereData) + }, + buildQueryFormParams : function (safeOrderBy) {//自动封装查询区域数据 + var _this = this; + var whereData = {} + var queryForm = $(".security_list_query_form")//参考list.html的表单区域样式名称 + //因为layui 的查询有记忆功能,会缓存老的查询条件,这里把重置的条件给清空 赋值null + var radioMemory = {} + queryForm.find(".layui-input").each(function (index,item) { + var type = $(item).attr("type") + var name = $(item).attr("name") + if(name){ + switch (type){ + case "radio" : + if(!radioMemory[name]){ + radioMemory[name] = false; + } + if($(item).is(":checked")){ + _this._autoSetWhereData(whereData,name,item); + radioMemory[name] = true; + } + break; + default : + _this._autoSetWhereData(whereData,name,item); + break; + } + } + }) + // + for(var radioName in radioMemory){ + if(!radioMemory[radioName]){//肯定被layui缓存的查询字段 这里设置""可以清理掉此字段 + whereData[radioName] = "" + } + } + whereData.safeOrderBy = safeOrderBy || "" + return whereData; + }, + _startReloadTableFromStartPage : function (startPage,whereData) { + var reloadTableId = CONFIG.layTable.id + if(startPage==null || !startPage) {//当前页 聪明的记住多少页 + table.reload(reloadTableId,{where: whereData }) + }else { + table.reload(reloadTableId,{ + page: { + curr: startPage //重新从第 几 页开始 + }, + where: whereData + }) + } + }, + _autoSetWhereData : function (whereData,name,item) {//name是表单元素名称 item是表单对象 + var val = $.trim($(item).val()) + whereData[name] = val + } + } + return tableObj; + }, + render:function () {//入口 + mc_children.disabledFromQueryParentArea();//尝试下先禁用附表区域 多半关联场景才会触发 + mc_layui_component.bindMagicalCoderLayUiComponentFromQuery(CONFIG);//查询区域绘制一下控件 + this.bindAreaEvents(); + this.layTable().render();//初始化表格数据 + }, + bindAreaEvents : function () { + var _t = this; + //搜索 + $(".search_btn").click(function(){ + _t.layTable().refreshTableFromPageOne(); + }); + //重置 + $("button[type='reset']").click(function(){ + $("."+mc_constant.MC_LAY_CLASS_NAME.FORM.foreign_select2).val(null).trigger('change'); + $("."+mc_constant.MC_LAY_CLASS_NAME.FORM.foreign_select2).each(function (id, item) { + $(this).attr("data-value","") + }); + return true; + }); + //添加 + $(".addNews_btn").click(function(){ + _t.layTable().editOrAdd(); + }) + //批量删除 + $(".delAll_btn").click(function(){ + var laytableElem = CONFIG.layTable.elem + var laytableId = CONFIG.layTable.id + //主键字段 + var primaryFields = $(laytableElem).attr("data-primary-fields") + var checkStatus = table.checkStatus(laytableId), + data = checkStatus.data, + ids = []; + if(data.length > 0) { + for (var i in data) { + ids.push(data[i][primaryFields]); + } + layer.confirm('确定删除选中的记录?', {icon: 3, title: '提示信息'}, function (index) { + $.post('admin/'+tableNameRest+'/batch_delete',{ids:ids},function (data) { + if(!data.flag){ + layer.msg("删除失败:"+data.desc); + }else { + _t.layTable().refreshTableFromCurrentPage(); + layer.close(index); + } + }) + }) + }else{ + layer.msg("请选择需要删除的记录"); + } + }) + //excel导出 + $(".exportExcelAll_btn").click(function(){ + var dataMaxExportCount = parseInt($(this).attr("data-max-export-count"))//导出多少行 在界面导出按钮的一个属性配置 如果导出太多就会卡死 + var whereData = _t.layTable().buildQueryFormParams("") + whereData.queryType = mc_constant.QUERY_TYPE_EXPORT_EXCEL;//代表是导出excel类型 参加controller实现 + whereData.page = 1; + whereData.limit = dataMaxExportCount; + var url = 'admin/'+tableNameRest+'/page?' + var arr = [] + for(var i in whereData){ + arr.push(i+"="+whereData[i]) + } + window.location.href=url + arr.join("&") + }); + } + } +//入口函数 + obj.render(); +}(); diff --git a/us_passManage/us-admin/src/main/resources/static/assets/admin/p_pass_old/edit.js b/us_passManage/us-admin/src/main/resources/static/assets/admin/p_pass_old/edit.js new file mode 100644 index 0000000..2cb0923 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/admin/p_pass_old/edit.js @@ -0,0 +1,138 @@ +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 软件作者:何栋宇 qq:709876443 +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:648595928 +*/ +;!function(){ + var $ = layui.jquery + ,layer = parent.layer === undefined ? layui.layer : top.layer + ,form = layui.form; + var mc_layui_component=youyaboot_all.mc_layui_component + ,mc_util = youyaboot_all.mc_util + ,mc_children = youyaboot_all.mc_children + ,mc_verify = youyaboot_all.mc_verify + ,mc_constant = youyaboot_all.mc_constant + ,mc_rmp = youyaboot_all.mc_rmp + ; + var common_config = { + tableNameRest:"p_pass_old_rest", + tableName:"p_pass_old", + moduleName:"p_pass_old",//sys_module的moduleName + form:{ + passExpiry:{ + renderConfig:{}//您可以自定义个性配置 遇到相同的则以dom配置为准 大部分属性已推荐设置在元素标签上 这里您可以自定义事件 {"calendar":false,"format":"yyyy-MM-dd HH:mm:ss","show":false,"range":false,"trigger":"click","type":"datetime","isInitValue":true,"showBottom":true,"inputType":"date","theme":"default","position":"absolute","lang":"cn","zIndex":66666666} + } + ,passCreatetime:{ + renderConfig:{}//您可以自定义个性配置 遇到相同的则以dom配置为准 大部分属性已推荐设置在元素标签上 这里您可以自定义事件 {"calendar":false,"format":"yyyy-MM-dd HH:mm:ss","show":false,"range":false,"trigger":"click","type":"datetime","isInitValue":true,"showBottom":true,"inputType":"date","theme":"default","position":"absolute","lang":"cn","zIndex":66666666} + } + }, + event:{ + select2Change:function (elem,name,value) {//外键下拉更新事件 + } + } + } + var tableNameRest = common_config.tableNameRest; + var moduleName = common_config.moduleName; + var obj = { + render:function () {//入口 + this.ajaxGetEntityDataAndAutoSetFormUiValue(); + this.submit(); + }, + //初始化表单 + ajaxGetEntityDataAndAutoSetFormUiValue : function () { + var _t = this; + var identify = mc_util.getParameter('identify')//从url中检测主键 + if(identify!=null && identify!=''){//断定是编辑操作 + $.getJSON('admin/'+tableNameRest+"/get/"+identify,{date:new Date().getTime()},function (data) {//获取此实体详情数据 + if(data.flag){ + var entity = data.data + if(entity && entity!=null){ + //把请求到的实体内容自动设置到表单中去 + mc_util.mappingEntityToFormUiValue($("body"),entity); + //禁用外键编辑区域:只有当从更多信息点击进来 才会禁用 单表操作不会执行 + mc_children.disabledFormParentArea(); + //权限 注意xxx-edit.html页面刚进来 是被隐藏的(body标签的layui-hide样式) 这样当权限执行完 才进行一一显示 + mc_rmp.paintBody(moduleName,function () { + var verifyData = mc_layui_component.bindMagicalCoderLayUiComponentFromDetail(common_config);//返回富文本的校验 为了能同步隐藏域 + _t.layuiFormVerify(verifyData); + }) + }else { + layer.msg("此条记录已被删除,请重新查询!"); + } + }else { + layer.msg("查询失败:"+data.desc); + } + }) + }else {//新增操作 + //禁用外键编辑区域:只有当从更多信息点击进来 才会禁用 单表操作不会执行 + mc_children.disabledFormParentArea(); + //权限 + mc_rmp.paintBody(moduleName,function () { + var verifyData =mc_layui_component.bindMagicalCoderLayUiComponentFromDetail(common_config);//返回富文本的校验 为了能同步隐藏域 + _t.layuiFormVerify(verifyData); + $("button[type='reset']").removeClass('layui-hide');//把重置按钮显示处理 + }) + } + }, + //layui的表单校验规则 + layuiFormVerify:function (verifyData) {//verifyData 里如果由内容则是富文本的校验同步 + var verifyData = + $.extend(verifyData,{//这里可以自定义layui的校验规则 自行扩展 参考官网文档 https://www.layui.com/doc/modules/form.html + + }) + form.verify(verifyData); + } + , + //表单提交 + submit : function () { + //重置按钮把外键的默认值清空 + $("button[type='reset']").click(function(){ + $("."+mc_constant.MC_LAY_CLASS_NAME.FORM.foreign_select2).val(null).trigger('change');//固定写法 把搜索下拉重置空值 + $("."+mc_constant.MC_LAY_CLASS_NAME.FORM.foreign_select2).each(function (id, item) { + $(this).attr("data-value","") + }); + return true; + }); + //表单校验 在_bindFormDom方法 + form.on("submit(save)",function(data){ + // 实际使用时的提交信息 + var postData = data.field; + //开关单独处理 + $('body').find("input[lay-skin='switch']").each(function (index,item) { + var name = $(item).attr("name") + var field = data.field + postData[name] = field[name] ? ((field[name]+''=='on' || field[name]+'' == 'true') ? 1 : 0):0;//开关请用0或1来设置值 + }) + //清理上次不通过样式提醒 + for(var name in postData){ + var dom = $("[name='"+name+"']") + mc_verify.clearDangerClass(dom) + } + //MagicalCoder扩展的表单校验 + for(var name in postData){ + var dom = $("[name='"+name+"']") + var value = postData[name] + if(!mc_verify.verify(value,dom)){ + return false; + } + } + //弹出loading + var index = top.layer.msg('数据提交中,请稍候',{icon: 16,time:false,shade:0.8}); + $.post('admin/'+tableNameRest+'/save',postData,function(res){ + top.layer.close(index); + if(res.flag){ + parent.layui.$(".search_btn").click()//parent代表父窗口,因为详情页是iframe弹出来的;让列表页重新执行一次搜索 + //关闭当前层 + var pidx = parent.layui.layer.index + parent.layui.layer.close(pidx-1); + }else { + top.layer.msg("保存失败:"+res.desc); + } + }) + return false; + }) + } + } + obj.render(); +}(); diff --git a/us_passManage/us-admin/src/main/resources/static/assets/admin/p_pass_old/list.js b/us_passManage/us-admin/src/main/resources/static/assets/admin/p_pass_old/list.js new file mode 100644 index 0000000..0257ffa --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/admin/p_pass_old/list.js @@ -0,0 +1,339 @@ +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 软件作者:何栋宇 qq:709876443 +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:648595928 +*/ +//不要被如此多的代码唬住,读懂一个 其他的模块都明白了,之所以写这么多开放出来,主要是为了定制和维护性,您可以随意修改逻辑 适应你的业务场景 +;!function(){ + var $ = layui.jquery + ,layer = parent.layer === undefined ? layui.layer : top.layer + ,table = layui.table; + var mc_children = youyaboot_all.mc_children + ,mc_constant = youyaboot_all.mc_constant + ,mc_util = youyaboot_all.mc_util + ,mc_rmp = youyaboot_all.mc_rmp + ,mc_layui_component = youyaboot_all.mc_layui_component + ; + +// 子表 排序相关 + var CONFIG = { + tableNameRest:"p_pass_old_rest", + tableName:"p_pass_old", + moduleName:"p_pass_old",//sys_module的moduleName + form:{ + passExpiry:{ + renderConfig:{}//您可以自定义个性配置 遇到相同的则以dom配置为准 大部分属性已推荐设置在元素标签上 这里您可以自定义事件 {"calendar":false,"format":"yyyy-MM-dd HH:mm:ss","show":false,"range":false,"trigger":"click","type":"datetime","isInitValue":true,"showBottom":true,"inputType":"date","theme":"default","position":"absolute","lang":"cn","zIndex":66666666} + } + ,passCreatetime:{ + renderConfig:{}//您可以自定义个性配置 遇到相同的则以dom配置为准 大部分属性已推荐设置在元素标签上 这里您可以自定义事件 {"calendar":false,"format":"yyyy-MM-dd HH:mm:ss","show":false,"range":false,"trigger":"click","type":"datetime","isInitValue":true,"showBottom":true,"inputType":"date","theme":"default","position":"absolute","lang":"cn","zIndex":66666666} + } + }, + event:{ + select2Change:function (elem,name,value) {//外键下拉更新事件 + } + }, + layTable : {//表格内容 到list.html查找即可明白 + elem : '#newsList', + id : "newsListTable" + }, + //排序跟数据库实际字段名的映射 + sortMap:{ + passId:'pass_id',passName:'pass_name',passLength:'pass_length',passType:'pass_type',passExpiry:'pass_expiry',passCreatetime:'pass_createtime',passUserid:'pass_userid' + } + }; + //后端请求时候的表模块规则url + var tableNameRest = CONFIG.tableNameRest; + var tableName = CONFIG.tableName; + //表格每一列配置 + var COLS = [[ + {type: "checkbox", /*fixed:"left",*/ width:50},//全选 + {field: 'passId', title: '密钥UUID', minWidth:100, align:"center",sort:true}, + + {field: 'passName', title: '密钥名称', minWidth:200,templet:function (d) { + return '' + } + , sort:true + }, + + {field: 'passLength', title: '密钥长度', minWidth:200,templet:function (d) { + return '' + } + , sort:true + }, + + {field: 'passType', title: '密钥类型', minWidth:200,templet:function (d) { + return '' + } + , sort:true + }, + {field: 'passExpiry', title: '密钥有效期', align:'center', minWidth:250, templet :"#passExpiryTemplate",sort:true}, + {field: 'passCreatetime', title: '密钥上传时间', align:'center', minWidth:250, templet :"#passCreatetimeTemplate",sort:true}, + + {field: 'passUserid', title: '密钥使用者', minWidth:200,templet:function (d) { + return '' + } + , sort:true + }, + {title: '操作', minWidth:250, templet:'#newsListOperateTemplate',/*fixed:"right",*/align:"center"}//操作 到list.html页面查找模板对应的html + ]]; + var obj = { + layTable:function () {//表格 + var tableObj = { + render:function () { + this.initTable(); + this.tableOperateEvent(); + }, + //初始化一个表格 + initTable : function () { + var _this = this; + table.render({//这里是layui的table分页写法 具体可参考layui官方文档 + elem: CONFIG.layTable.elem, + url : 'admin/'+tableNameRest+'/page', + cellMinWidth : 95, + page : true,//是否分页 + //height : "full-10",//高度样式 + // height : 500, + limit : 20,//每页多少条 + limits : [10,15,20,25],//下拉 + id : CONFIG.layTable.id, + cols : COLS,//放入列配置 + loading : true, + where : this.buildQueryFormParams(""),//构造查询参数 注意这里layui会缓存你的上一次查询参数 无法清除 只能考虑设置成空字符才能清理 + done:function (res,curr,count) {//请求成功后处理 + if(res.flag){ + mc_rmp.paintBody(CONFIG.moduleName,function () {//权限判断 + //禁用一些外键字段 当更多信息场景时才会触发 + mc_children.disabledTableParentArea(); + //laytable中有很多控件需要初始化 比如日期等 + mc_layui_component.bindMagicalCoderLayUiComponentFromTable(CONFIG,function(){_this.refreshTableFromCurrentPage()}) + //每一行的操作条目事件 + _this.tableOperateEvent() + }) + }else { + layer.msg(res.desc)//弹窗错误提示 + } + } + }); + }, + //表格内的操作事件 + tableOperateEvent : function () { + var _t = this; + var tableDom = $(CONFIG.layTable.elem); + var layFilter = tableDom.attr("lay-filter"); + //列表操作 + table.on('tool('+layFilter+')', function(obj){//操作条事件写法 参考layui + var primaryFields = tableDom.attr("data-primary-fields");//一般是表主键id 提前隐藏放在表区域 搜索list.html + var layEvent = obj.event, + data = obj.data; + var identify = data[primaryFields] + if(layEvent === 'edit'){ //编辑 + _t.editOrAdd(identify) + } else if(layEvent === 'del'){ //删除 + _t._deleteOneTr(identify) + } else if(layEvent === 'children'){ //子表 更多信息 + _t._childrenOneTr(identify) + } + }); + //列表排序 + table.on('sort('+layFilter+')', function(obj){ + var safeOrderBy = "";//排序字段组合 例如xxx_id desc + if(obj.type && obj.type!=null && obj.type!=''){ + safeOrderBy = CONFIG.sortMap[obj.field] + " " +obj.type; + } + _t.refreshTableFromCurrentPage(safeOrderBy);//从当前页重新加载分页数据 + }); + }, + //编辑或者添加 + editOrAdd : function (identify) {//identify 代表主键值 + var title = identify ? '编辑':'添加' + if(!identify){identify = ''} + var index = layui.layer.open({ + skin:'magicalcoder-layer-admin', + title : title, + type : 2,//打开iframe页面 很多人不知道原理:从列表页进入详情页是直接打开新iframe,详情页根据iframe的入参主键,获取详情页数据,然后重绘详情页,整个过程都是js处理 + maxmin: true, + area: ['80%', '80%'], + content : "admin/page_v2/"+tableName+"/edit?identify="+identify+mc_children.buildForeignParam(), + success : function(layero, index){ + setTimeout(function(){ + layui.layer.tips('点击此处返回列表', '.layui-layer-setwin .layui-layer-close', { + tips: 3 + }); + },500) + } + }) + //改变窗口大小时,重置弹窗的宽高,防止超出可视区域(如F12调出debug的操作) + //$(window).on("resize",function(){ + // layui.layer.full(index); + //}) + }, + _deleteOneTr : function (identify) {//删除一行 + var _this = this; + layer.confirm('确定删除此行记录?',{icon:3, title:'提示信息'},function(index){ + $.post('admin/'+tableNameRest+'/delete/'+identify,{},function (data) { + if(!data.flag){ + layer.msg("删除失败:"+data.desc); + }else { + _this.refreshTableFromCurrentPage();//从当前页刷新列表 + layer.close(index); + } + }) + }); + }, + _childrenOneTr : function (identify) {//更多信息:查看子表 + var title = '相关信息' + if(!identify){identify = ''} + if(!CONFIG.childrenPage || CONFIG.childrenPage==null || CONFIG.childrenPage.length<=0){ + layer.msg("未找到任何子表信息") + return; + } + var content = mc_children.buildTabTemplate(tableName,identify,CONFIG.childrenPage);//自表如果是多个 会绘制多个tab标签 + var index = layui.layer.open({skin:'magicalcoder-layer-admin',title : title,type : 1,maxmin: true,area: ['80%', '80%'],content : content, + success : function(layero, index){ + setTimeout(function(){ + layui.layer.tips('点击此处返回列表', '.layui-layer-setwin .layui-layer-close', { + tips: 3 + }); + },500) + } + }) + mc_children.tabClickEvent();//绑定下更多信息下tab点击事件 分别加载不同子表详情 列表界面 + //改变窗口大小时,重置弹窗的宽高,防止超出可视区域(如F12调出debug的操作) + //$(window).on("resize",function(){ + // layui.layer.full(index); + //}) + }, + refreshTableFromCurrentPage : function (safeOrderBy) {//当前页 重新加载 + var whereData = this.buildQueryFormParams(safeOrderBy) + this._startReloadTableFromStartPage(null,whereData) + }, + refreshTableFromPageOne : function () {//从第一页 重新加载 搜索场景使用 清空各种参数 + var whereData = this.buildQueryFormParams("") + this._startReloadTableFromStartPage(1,whereData) + }, + buildQueryFormParams : function (safeOrderBy) {//自动封装查询区域数据 + var _this = this; + var whereData = {} + var queryForm = $(".security_list_query_form")//参考list.html的表单区域样式名称 + //因为layui 的查询有记忆功能,会缓存老的查询条件,这里把重置的条件给清空 赋值null + var radioMemory = {} + queryForm.find(".layui-input").each(function (index,item) { + var type = $(item).attr("type") + var name = $(item).attr("name") + if(name){ + switch (type){ + case "radio" : + if(!radioMemory[name]){ + radioMemory[name] = false; + } + if($(item).is(":checked")){ + _this._autoSetWhereData(whereData,name,item); + radioMemory[name] = true; + } + break; + default : + _this._autoSetWhereData(whereData,name,item); + break; + } + } + }) + // + for(var radioName in radioMemory){ + if(!radioMemory[radioName]){//肯定被layui缓存的查询字段 这里设置""可以清理掉此字段 + whereData[radioName] = "" + } + } + whereData.safeOrderBy = safeOrderBy || "" + return whereData; + }, + _startReloadTableFromStartPage : function (startPage,whereData) { + var reloadTableId = CONFIG.layTable.id + if(startPage==null || !startPage) {//当前页 聪明的记住多少页 + table.reload(reloadTableId,{where: whereData }) + }else { + table.reload(reloadTableId,{ + page: { + curr: startPage //重新从第 几 页开始 + }, + where: whereData + }) + } + }, + _autoSetWhereData : function (whereData,name,item) {//name是表单元素名称 item是表单对象 + var val = $.trim($(item).val()) + whereData[name] = val + } + } + return tableObj; + }, + render:function () {//入口 + mc_children.disabledFromQueryParentArea();//尝试下先禁用附表区域 多半关联场景才会触发 + mc_layui_component.bindMagicalCoderLayUiComponentFromQuery(CONFIG);//查询区域绘制一下控件 + this.bindAreaEvents(); + this.layTable().render();//初始化表格数据 + }, + bindAreaEvents : function () { + var _t = this; + //搜索 + $(".search_btn").click(function(){ + _t.layTable().refreshTableFromPageOne(); + }); + //重置 + $("button[type='reset']").click(function(){ + $("."+mc_constant.MC_LAY_CLASS_NAME.FORM.foreign_select2).val(null).trigger('change'); + $("."+mc_constant.MC_LAY_CLASS_NAME.FORM.foreign_select2).each(function (id, item) { + $(this).attr("data-value","") + }); + return true; + }); + //添加 + $(".addNews_btn").click(function(){ + _t.layTable().editOrAdd(); + }) + //批量删除 + $(".delAll_btn").click(function(){ + var laytableElem = CONFIG.layTable.elem + var laytableId = CONFIG.layTable.id + //主键字段 + var primaryFields = $(laytableElem).attr("data-primary-fields") + var checkStatus = table.checkStatus(laytableId), + data = checkStatus.data, + ids = []; + if(data.length > 0) { + for (var i in data) { + ids.push(data[i][primaryFields]); + } + layer.confirm('确定删除选中的记录?', {icon: 3, title: '提示信息'}, function (index) { + $.post('admin/'+tableNameRest+'/batch_delete',{ids:ids},function (data) { + if(!data.flag){ + layer.msg("删除失败:"+data.desc); + }else { + _t.layTable().refreshTableFromCurrentPage(); + layer.close(index); + } + }) + }) + }else{ + layer.msg("请选择需要删除的记录"); + } + }) + //excel导出 + $(".exportExcelAll_btn").click(function(){ + var dataMaxExportCount = parseInt($(this).attr("data-max-export-count"))//导出多少行 在界面导出按钮的一个属性配置 如果导出太多就会卡死 + var whereData = _t.layTable().buildQueryFormParams("") + whereData.queryType = mc_constant.QUERY_TYPE_EXPORT_EXCEL;//代表是导出excel类型 参加controller实现 + whereData.page = 1; + whereData.limit = dataMaxExportCount; + var url = 'admin/'+tableNameRest+'/page?' + var arr = [] + for(var i in whereData){ + arr.push(i+"="+whereData[i]) + } + window.location.href=url + arr.join("&") + }); + } + } +//入口函数 + obj.render(); +}(); diff --git a/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_admin_user/edit.js b/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_admin_user/edit.js new file mode 100644 index 0000000..6ca092c --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_admin_user/edit.js @@ -0,0 +1,130 @@ +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ +;!function(){ + var $ = layui.jquery + ,layer = parent.layer === undefined ? layui.layer : top.layer + ,form = layui.form; + var mc_layui_component=youyaboot_all.mc_layui_component + ,mc_util = youyaboot_all.mc_util + ,mc_children = youyaboot_all.mc_children + ,mc_verify = youyaboot_all.mc_verify + ,mc_constant = youyaboot_all.mc_constant + ,mc_rmp = youyaboot_all.mc_rmp + ; + var common_config = { + tableNameRest:"sys_admin_user_rest", + tableName:"sys_admin_user", + moduleName:"sys_admin_user",//sys_module的moduleName + form:{ + createTime:{ + renderConfig:{}//您可以自定义个性配置 遇到相同的则以dom配置为准 大部分属性已推荐设置在元素标签上 这里您可以自定义事件 {"calendar":false,"format":"yyyy-MM-dd HH:mm:ss","show":false,"range":false,"trigger":"click","type":"datetime","isInitValue":true,"showBottom":true,"inputType":"date","theme":"default","position":"absolute","lang":"cn","zIndex":66666666} + } + ,updateTime:{ + renderConfig:{}//您可以自定义个性配置 遇到相同的则以dom配置为准 大部分属性已推荐设置在元素标签上 这里您可以自定义事件 {"calendar":false,"format":"yyyy-MM-dd HH:mm:ss","show":false,"range":false,"trigger":"click","type":"datetime","isInitValue":true,"showBottom":true,"inputType":"date","theme":"default","position":"absolute","lang":"cn","zIndex":66666666} + } + } + } + var tableNameRest = common_config.tableNameRest; + var moduleName = common_config.moduleName; + var obj = { + render:function () {//入口 + this.ajaxGetEntityDataAndAutoSetFormUiValue(); + this.submit(); + }, + //初始化表单 + ajaxGetEntityDataAndAutoSetFormUiValue : function () { + var _t = this; + var identify = mc_util.getParameter('identify')//从url中检测主键 + if(identify!=null && identify!=''){//断定是编辑操作 + $.getJSON('admin/'+tableNameRest+"/get/"+identify,{date:new Date().getTime()},function (data) {//获取此实体详情数据 + if(data.flag){ + var entity = data.data + if(entity && entity!=null){ + //把请求到的实体内容自动设置到表单中去 + mc_util.mappingEntityToFormUiValue($("body"),entity); + //禁用外键编辑区域:只有当从更多信息点击进来 才会禁用 单表操作不会执行 + mc_children.disabledFormParentArea(); + //权限 注意xxx-edit.html页面刚进来 是被隐藏的(body标签的layui-hide样式) 这样当权限执行完 才进行一一显示 + mc_rmp.paintBody(moduleName,function () { + var verifyData = mc_layui_component.bindMagicalCoderLayUiComponentFromDetail(common_config);//返回富文本的校验 为了能同步隐藏域 + _t.layuiFormVerify(verifyData); + }) + }else { + layer.msg("此条记录已被删除,请重新查询!"); + } + }else { + layer.msg("查询失败:"+data.desc); + } + }) + }else {//新增操作 + //禁用外键编辑区域:只有当从更多信息点击进来 才会禁用 单表操作不会执行 + mc_children.disabledFormParentArea(); + //权限 + mc_rmp.paintBody(moduleName,function () { + var verifyData =mc_layui_component.bindMagicalCoderLayUiComponentFromDetail(common_config);//返回富文本的校验 为了能同步隐藏域 + _t.layuiFormVerify(verifyData); + $("button[type='reset']").removeClass('layui-hide');//把重置按钮显示处理 + }) + } + }, + //layui的表单校验规则 + layuiFormVerify:function (verifyData) {//verifyData 里如果由内容则是富文本的校验同步 + var verifyData = + $.extend(verifyData,{//这里可以自定义layui的校验规则 自行扩展 参考官网文档 https://www.layui.com/doc/modules/form.html + + }) + form.verify(verifyData); + } + , + //表单提交 + submit : function () { + //重置按钮把外键的默认值清空 + $("button[type='reset']").click(function(){ + $("."+mc_constant.MC_LAY_CLASS_NAME.FORM.foreign_select2).val(null).trigger('change');//固定写法 把搜索下拉重置空值 + return true; + }); + //表单校验 在_bindFormDom方法 + form.on("submit(save)",function(data){ + // 实际使用时的提交信息 + var postData = data.field; + //开关单独处理 + $('body').find("input[lay-skin='switch']").each(function (index,item) { + var name = $(item).attr("name") + var field = data.field + postData[name] = field[name] ? ((field[name]+''=='on' || field[name]+'' == 'true') ? 1 : 0):0;//开关请用0或1来设置值 + }) + //清理上次不通过样式提醒 + for(var name in postData){ + var dom = $("[name='"+name+"']") + mc_verify.clearDangerClass(dom) + } + //MagicalCoder扩展的表单校验 + for(var name in postData){ + var dom = $("[name='"+name+"']") + var value = postData[name] + if(!mc_verify.verify(value,dom)){ + return false; + } + } + //弹出loading + var index = top.layer.msg('数据提交中,请稍候',{icon: 16,time:false,shade:0.8}); + $.post('admin/'+tableNameRest+'/save',postData,function(res){ + top.layer.close(index); + if(res.flag){ + parent.layui.$(".search_btn").click()//parent代表父窗口,因为详情页是iframe弹出来的;让列表页重新执行一次搜索 + //关闭当前层 + var pidx = parent.layui.layer.index + parent.layui.layer.close(pidx-1); + }else { + top.layer.msg("保存失败:"+res.desc); + } + }) + return false; + }) + } + } + obj.render(); +}(); diff --git a/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_admin_user/list.js b/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_admin_user/list.js new file mode 100644 index 0000000..7f96751 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_admin_user/list.js @@ -0,0 +1,331 @@ +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ +//不要被如此多的代码唬住,读懂一个 其他的模块都明白了,之所以写这么多开放出来,主要是为了定制和维护性,您可以随意修改逻辑 适应你的业务场景 +;!function(){ + var $ = layui.jquery + ,layer = parent.layer === undefined ? layui.layer : top.layer + ,table = layui.table; + var mc_children = youyaboot_all.mc_children + ,mc_constant = youyaboot_all.mc_constant + ,mc_util = youyaboot_all.mc_util + ,mc_rmp = youyaboot_all.mc_rmp + ,mc_layui_component = youyaboot_all.mc_layui_component + ; + +// 子表 排序相关 + var CONFIG = { + tableNameRest:"sys_admin_user_rest", + tableName:"sys_admin_user", + moduleName:"sys_admin_user",//sys_module的moduleName + form:{ + createTime:{ + renderConfig:{}//您可以自定义个性配置 遇到相同的则以dom配置为准 大部分属性已推荐设置在元素标签上 这里您可以自定义事件 {"calendar":false,"format":"yyyy-MM-dd HH:mm:ss","show":false,"range":false,"trigger":"click","type":"datetime","isInitValue":true,"showBottom":true,"inputType":"date","theme":"default","position":"absolute","lang":"cn","zIndex":66666666} + } + ,updateTime:{ + renderConfig:{}//您可以自定义个性配置 遇到相同的则以dom配置为准 大部分属性已推荐设置在元素标签上 这里您可以自定义事件 {"calendar":false,"format":"yyyy-MM-dd HH:mm:ss","show":false,"range":false,"trigger":"click","type":"datetime","isInitValue":true,"showBottom":true,"inputType":"date","theme":"default","position":"absolute","lang":"cn","zIndex":66666666} + } + }, + childrenPage:[//子页面的一些基础信息 更多信息 + { + tabTitle:"系统日志", + url:"admin/page_v2/sys_log_admin_operate/list", + mcForeignName:"adminUserId" + } ], + layTable : {//表格内容 到list.html查找即可明白 + elem : '#newsList', + id : "newsListTable" + }, + //排序跟数据库实际字段名的映射 + sortMap:{ + username:'username',createTime:'create_time',updateTime:'update_time',roleId:'role_id',enabled:'enabled' + } + }; + //后端请求时候的表模块规则url + var tableNameRest = CONFIG.tableNameRest; + var tableName = CONFIG.tableName; + //表格每一列配置 + var COLS = [[ + {type: "checkbox", /*fixed:"left",*/ width:50},//全选 + + {field: 'username', title: '用户名', minWidth:200,templet:function (d) { + return '' + } + , sort:true + }, + {field: 'createTime', title: '创建时间', align:'center', minWidth:250, templet :"#createTimeTemplate",sort:true}, + {field: 'updateTime', title: '更新时间', align:'center', minWidth:250, templet :"#updateTimeTemplate",sort:true}, + {field: 'roleId', title: '角色', align:'center', minWidth:250, templet:function (d) { + var value = (!d.roleId || d.roleId==null) ? '' : d.roleId + //var option = '' + return '' + },sort:true + }, + + {field: 'enabled', title: '是否可用',minWidth:150, align:'center', templet:function(d){ + var checked = (d.enabled+''=='true' || d.enabled+'' == '1') ? 'checked' : ''; + return '' + } + ,sort:true + }, + {title: '操作', minWidth:250, templet:'#newsListOperateTemplate',/*fixed:"right",*/align:"center"}//操作 到list.html页面查找模板对应的html + ]]; + var obj = { + layTable:function () {//表格 + var tableObj = { + render:function () { + this.initTable(); + this.tableOperateEvent(); + }, + //初始化一个表格 + initTable : function () { + var _this = this; + table.render({//这里是layui的table分页写法 具体可参考layui官方文档 + elem: CONFIG.layTable.elem, + url : 'admin/'+tableNameRest+'/page', + cellMinWidth : 95, + page : true,//是否分页 + //height : "full-10",//高度样式 + // height : 500, + limit : 20,//每页多少条 + limits : [10,15,20,25],//下拉 + id : CONFIG.layTable.id, + cols : COLS,//放入列配置 + loading : true, + where : this.buildQueryFormParams(""),//构造查询参数 注意这里layui会缓存你的上一次查询参数 无法清除 只能考虑设置成空字符才能清理 + done:function (res,curr,count) {//请求成功后处理 + if(res.flag){ + mc_rmp.paintBody(CONFIG.moduleName,function () {//权限判断 + //禁用一些外键字段 当更多信息场景时才会触发 + mc_children.disabledTableParentArea(); + //laytable中有很多控件需要初始化 比如日期等 + mc_layui_component.bindMagicalCoderLayUiComponentFromTable(CONFIG,function(){_this.refreshTableFromCurrentPage()}) + //每一行的操作条目事件 + _this.tableOperateEvent() + }) + }else { + layer.msg(res.desc)//弹窗错误提示 + } + } + }); + }, + //表格内的操作事件 + tableOperateEvent : function () { + var _t = this; + var tableDom = $(CONFIG.layTable.elem); + var layFilter = tableDom.attr("lay-filter"); + //列表操作 + table.on('tool('+layFilter+')', function(obj){//操作条事件写法 参考layui + var primaryFields = tableDom.attr("data-primary-fields");//一般是表主键id 提前隐藏放在表区域 搜索list.html + var layEvent = obj.event, + data = obj.data; + var identify = data[primaryFields] + if(layEvent === 'edit'){ //编辑 + _t.editOrAdd(identify) + } else if(layEvent === 'del'){ //删除 + _t._deleteOneTr(identify) + } else if(layEvent === 'children'){ //子表 更多信息 + _t._childrenOneTr(identify) + } + }); + //列表排序 + table.on('sort('+layFilter+')', function(obj){ + var safeOrderBy = "";//排序字段组合 例如xxx_id desc + if(obj.type && obj.type!=null && obj.type!=''){ + safeOrderBy = CONFIG.sortMap[obj.field] + " " +obj.type; + } + _t.refreshTableFromCurrentPage(safeOrderBy);//从当前页重新加载分页数据 + }); + }, + //编辑或者添加 + editOrAdd : function (identify) {//identify 代表主键值 + var title = identify ? '编辑':'添加' + if(!identify){identify = ''} + var index = layui.layer.open({ + skin:'magicalcoder-layer-admin', + title : title, + type : 2,//打开iframe页面 很多人不知道原理:从列表页进入详情页是直接打开新iframe,详情页根据iframe的入参主键,获取详情页数据,然后重绘详情页,整个过程都是js处理 + maxmin: true, + area: ['80%', '80%'], + content : "admin/page_v2/"+tableName+"/edit?identify="+identify+mc_children.buildForeignParam(), + success : function(layero, index){ + setTimeout(function(){ + layui.layer.tips('点击此处返回列表', '.layui-layer-setwin .layui-layer-close', { + tips: 3 + }); + },500) + } + }) + //改变窗口大小时,重置弹窗的宽高,防止超出可视区域(如F12调出debug的操作) + //$(window).on("resize",function(){ + // layui.layer.full(index); + //}) + }, + _deleteOneTr : function (identify) {//删除一行 + var _this = this; + layer.confirm('确定删除此行记录?',{icon:3, title:'提示信息'},function(index){ + $.post('admin/'+tableNameRest+'/delete/'+identify,{},function (data) { + if(!data.flag){ + layer.msg("删除失败:"+data.desc); + }else { + _this.refreshTableFromCurrentPage();//从当前页刷新列表 + layer.close(index); + } + }) + }); + }, + _childrenOneTr : function (identify) {//更多信息:查看子表 + var title = '相关信息' + if(!identify){identify = ''} + if(!CONFIG.childrenPage || CONFIG.childrenPage==null || CONFIG.childrenPage.length<=0){ + layer.msg("未找到任何子表信息") + return; + } + var content = mc_children.buildTabTemplate(tableName,identify,CONFIG.childrenPage);//自表如果是多个 会绘制多个tab标签 + var index = layui.layer.open({skin:'magicalcoder-layer-admin',title : title,type : 1,maxmin: true,area: ['80%', '80%'],content : content, + success : function(layero, index){ + setTimeout(function(){ + layui.layer.tips('点击此处返回列表', '.layui-layer-setwin .layui-layer-close', { + tips: 3 + }); + },500) + } + }) + mc_children.tabClickEvent();//绑定下更多信息下tab点击事件 分别加载不同子表详情 列表界面 + //改变窗口大小时,重置弹窗的宽高,防止超出可视区域(如F12调出debug的操作) + //$(window).on("resize",function(){ + // layui.layer.full(index); + //}) + }, + refreshTableFromCurrentPage : function (safeOrderBy) {//当前页 重新加载 + var whereData = this.buildQueryFormParams(safeOrderBy) + this._startReloadTableFromStartPage(null,whereData) + }, + refreshTableFromPageOne : function () {//从第一页 重新加载 搜索场景使用 清空各种参数 + var whereData = this.buildQueryFormParams("") + this._startReloadTableFromStartPage(1,whereData) + }, + buildQueryFormParams : function (safeOrderBy) {//自动封装查询区域数据 + var _this = this; + var whereData = {} + var queryForm = $(".security_list_query_form")//参考list.html的表单区域样式名称 + //因为layui 的查询有记忆功能,会缓存老的查询条件,这里把重置的条件给清空 赋值null + var radioMemory = {} + queryForm.find(".layui-input").each(function (index,item) { + var type = $(item).attr("type") + var name = $(item).attr("name") + if(name){ + switch (type){ + case "radio" : + if(!radioMemory[name]){ + radioMemory[name] = false; + } + if($(item).is(":checked")){ + _this._autoSetWhereData(whereData,name,item); + radioMemory[name] = true; + } + break; + default : + _this._autoSetWhereData(whereData,name,item); + break; + } + } + }) + // + for(var radioName in radioMemory){ + if(!radioMemory[radioName]){//肯定被layui缓存的查询字段 这里设置""可以清理掉此字段 + whereData[radioName] = "" + } + } + whereData.safeOrderBy = safeOrderBy || "" + return whereData; + }, + _startReloadTableFromStartPage : function (startPage,whereData) { + var reloadTableId = CONFIG.layTable.id + if(startPage==null || !startPage) {//当前页 聪明的记住多少页 + table.reload(reloadTableId,{where: whereData }) + }else { + table.reload(reloadTableId,{ + page: { + curr: startPage //重新从第 几 页开始 + }, + where: whereData + }) + } + }, + _autoSetWhereData : function (whereData,name,item) {//name是表单元素名称 item是表单对象 + var val = $.trim($(item).val()) + whereData[name] = val + } + } + return tableObj; + }, + render:function () {//入口 + var needInitSelect2 = mc_children.disabledFromQueryParentArea();//尝试下先禁用附表区域 多半关联场景才会触发 + mc_layui_component.bindMagicalCoderLayUiComponentFromQuery(CONFIG);//查询区域绘制一下控件 + this.bindAreaEvents(); + this.layTable().render(); + }, + bindAreaEvents : function () { + var _t = this; + //搜索 + $(".search_btn").click(function(){ + _t.layTable().refreshTableFromPageOne(); + }); + //重置 + $("button[type='reset']").click(function(){ + $("."+mc_constant.MC_LAY_CLASS_NAME.FORM.foreign_select2).val(null).trigger('change'); + return true; + }); + //添加 + $(".addNews_btn").click(function(){ + _t.layTable().editOrAdd(); + }) + //批量删除 + $(".delAll_btn").click(function(){ + var laytableElem = CONFIG.layTable.elem + var laytableId = CONFIG.layTable.id + //主键字段 + var primaryFields = $(laytableElem).attr("data-primary-fields") + var checkStatus = table.checkStatus(laytableId), + data = checkStatus.data, + ids = []; + if(data.length > 0) { + for (var i in data) { + ids.push(data[i][primaryFields]); + } + layer.confirm('确定删除选中的记录?', {icon: 3, title: '提示信息'}, function (index) { + $.post('admin/'+tableNameRest+'/batch_delete',{ids:ids},function (data) { + if(!data.flag){ + layer.msg("删除失败:"+data.desc); + }else { + _t.layTable().refreshTableFromCurrentPage(); + layer.close(index); + } + }) + }) + }else{ + layer.msg("请选择需要删除的记录"); + } + }) + //excel导出 + $(".exportExcelAll_btn").click(function(){ + var dataMaxExportCount = parseInt($(this).attr("data-max-export-count"))//导出多少行 在界面导出按钮的一个属性配置 如果导出太多就会卡死 + var whereData = _t.layTable().buildQueryFormParams("") + whereData.queryType = mc_constant.QUERY_TYPE_EXPORT_EXCEL;//代表是导出excel类型 参加controller实现 + whereData.page = 1; + whereData.limit = dataMaxExportCount; + var url = 'admin/'+tableNameRest+'/page?' + var arr = [] + for(var i in whereData){ + arr.push(i+"="+whereData[i]) + } + window.location.href=url + arr.join("&") + }); + } + } +//入口函数 + obj.render(); +}(); diff --git a/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_global_permit_url/edit.js b/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_global_permit_url/edit.js new file mode 100644 index 0000000..7e3a132 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_global_permit_url/edit.js @@ -0,0 +1,124 @@ +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ +;!function(){ + var $ = layui.jquery + ,layer = parent.layer === undefined ? layui.layer : top.layer + ,form = layui.form; + var mc_layui_component=youyaboot_all.mc_layui_component + ,mc_util = youyaboot_all.mc_util + ,mc_children = youyaboot_all.mc_children + ,mc_verify = youyaboot_all.mc_verify + ,mc_constant = youyaboot_all.mc_constant + ,mc_rmp = youyaboot_all.mc_rmp + ; + var common_config = { + tableNameRest:"sys_global_permit_url_rest", + tableName:"sys_global_permit_url", + moduleName:"sys_global_permit_url",//sys_module的moduleName + form:{ + } + } + var tableNameRest = common_config.tableNameRest; + var moduleName = common_config.moduleName; + var obj = { + render:function () {//入口 + this.ajaxGetEntityDataAndAutoSetFormUiValue(); + this.submit(); + }, + //初始化表单 + ajaxGetEntityDataAndAutoSetFormUiValue : function () { + var _t = this; + var identify = mc_util.getParameter('identify')//从url中检测主键 + if(identify!=null && identify!=''){//断定是编辑操作 + $.getJSON('admin/'+tableNameRest+"/get/"+identify,{date:new Date().getTime()},function (data) {//获取此实体详情数据 + if(data.flag){ + var entity = data.data + if(entity && entity!=null){ + //把请求到的实体内容自动设置到表单中去 + mc_util.mappingEntityToFormUiValue($("body"),entity); + //禁用外键编辑区域:只有当从更多信息点击进来 才会禁用 单表操作不会执行 + mc_children.disabledFormParentArea(); + //权限 注意xxx-edit.html页面刚进来 是被隐藏的(body标签的layui-hide样式) 这样当权限执行完 才进行一一显示 + mc_rmp.paintBody(moduleName,function () { + var verifyData = mc_layui_component.bindMagicalCoderLayUiComponentFromDetail(common_config);//返回富文本的校验 为了能同步隐藏域 + _t.layuiFormVerify(verifyData); + }) + }else { + layer.msg("此条记录已被删除,请重新查询!"); + } + }else { + layer.msg("查询失败:"+data.desc); + } + }) + }else {//新增操作 + //禁用外键编辑区域:只有当从更多信息点击进来 才会禁用 单表操作不会执行 + mc_children.disabledFormParentArea(); + //权限 + mc_rmp.paintBody(moduleName,function () { + var verifyData =mc_layui_component.bindMagicalCoderLayUiComponentFromDetail(common_config);//返回富文本的校验 为了能同步隐藏域 + _t.layuiFormVerify(verifyData); + $("button[type='reset']").removeClass('layui-hide');//把重置按钮显示处理 + }) + } + }, + //layui的表单校验规则 + layuiFormVerify:function (verifyData) {//verifyData 里如果由内容则是富文本的校验同步 + var verifyData = + $.extend(verifyData,{//这里可以自定义layui的校验规则 自行扩展 参考官网文档 https://www.layui.com/doc/modules/form.html + + }) + form.verify(verifyData); + } + , + //表单提交 + submit : function () { + //重置按钮把外键的默认值清空 + $("button[type='reset']").click(function(){ + $("."+mc_constant.MC_LAY_CLASS_NAME.FORM.foreign_select2).val(null).trigger('change');//固定写法 把搜索下拉重置空值 + return true; + }); + //表单校验 在_bindFormDom方法 + form.on("submit(save)",function(data){ + // 实际使用时的提交信息 + var postData = data.field; + //开关单独处理 + $('body').find("input[lay-skin='switch']").each(function (index,item) { + var name = $(item).attr("name") + var field = data.field + postData[name] = field[name] ? ((field[name]+''=='on' || field[name]+'' == 'true') ? 1 : 0):0;//开关请用0或1来设置值 + }) + //清理上次不通过样式提醒 + for(var name in postData){ + var dom = $("[name='"+name+"']") + mc_verify.clearDangerClass(dom) + } + //MagicalCoder扩展的表单校验 + for(var name in postData){ + var dom = $("[name='"+name+"']") + var value = postData[name] + if(!mc_verify.verify(value,dom)){ + return false; + } + } + //弹出loading + var index = top.layer.msg('数据提交中,请稍候',{icon: 16,time:false,shade:0.8}); + $.post('admin/'+tableNameRest+'/save',postData,function(res){ + top.layer.close(index); + if(res.flag){ + parent.layui.$(".search_btn").click()//parent代表父窗口,因为详情页是iframe弹出来的;让列表页重新执行一次搜索 + //关闭当前层 + var pidx = parent.layui.layer.index + parent.layui.layer.close(pidx-1); + }else { + top.layer.msg("保存失败:"+res.desc); + } + }) + return false; + }) + } + } + obj.render(); +}(); diff --git a/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_global_permit_url/list.js b/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_global_permit_url/list.js new file mode 100644 index 0000000..4cb0a2e --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_global_permit_url/list.js @@ -0,0 +1,317 @@ +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ +//不要被如此多的代码唬住,读懂一个 其他的模块都明白了,之所以写这么多开放出来,主要是为了定制和维护性,您可以随意修改逻辑 适应你的业务场景 +;!function(){ + var $ = layui.jquery + ,layer = parent.layer === undefined ? layui.layer : top.layer + ,table = layui.table; + var mc_children = youyaboot_all.mc_children + ,mc_constant = youyaboot_all.mc_constant + ,mc_util = youyaboot_all.mc_util + ,mc_rmp = youyaboot_all.mc_rmp + ,mc_layui_component = youyaboot_all.mc_layui_component + ; + +// 子表 排序相关 + var CONFIG = { + tableNameRest:"sys_global_permit_url_rest", + tableName:"sys_global_permit_url", + moduleName:"sys_global_permit_url",//sys_module的moduleName + form:{ + }, + layTable : {//表格内容 到list.html查找即可明白 + elem : '#newsList', + id : "newsListTable" + }, + //排序跟数据库实际字段名的映射 + sortMap:{ + id:'id',permitName:'permit_name',backendUrlReg:'backend_url_reg',moduleId:'module_id' + } + }; + //后端请求时候的表模块规则url + var tableNameRest = CONFIG.tableNameRest; + var tableName = CONFIG.tableName; + //表格每一列配置 + var COLS = [[ + {type: "checkbox", /*fixed:"left",*/ width:50},//全选 + {field: 'id', title: '主键', minWidth:100, align:"center",sort:true}, + + {field: 'permitName', title: '通过名称', minWidth:200,templet:function (d) { + return '' + } + , sort:true + }, + + {field: 'backendUrlReg', title: '后端的地址正则', minWidth:200,templet:function (d) { + return '' + } + , sort:true + }, + {field: 'moduleId', title: '所属模块', align:'center', minWidth:250, templet:function (d) { + var value = (!d.moduleId || d.moduleId==null) ? '' : d.moduleId + //var option = '' + return '' + },sort:true + }, + {title: '操作', minWidth:250, templet:'#newsListOperateTemplate',/*fixed:"right",*/align:"center"}//操作 到list.html页面查找模板对应的html + ]]; + var obj = { + layTable:function () {//表格 + var tableObj = { + render:function () { + this.initTable(); + this.tableOperateEvent(); + }, + //初始化一个表格 + initTable : function () { + var _this = this; + table.render({//这里是layui的table分页写法 具体可参考layui官方文档 + elem: CONFIG.layTable.elem, + url : 'admin/'+tableNameRest+'/page', + cellMinWidth : 95, + page : true,//是否分页 + //height : "full-10",//高度样式 + // height : 500, + limit : 20,//每页多少条 + limits : [10,15,20,25],//下拉 + id : CONFIG.layTable.id, + cols : COLS,//放入列配置 + loading : true, + where : this.buildQueryFormParams(""),//构造查询参数 注意这里layui会缓存你的上一次查询参数 无法清除 只能考虑设置成空字符才能清理 + done:function (res,curr,count) {//请求成功后处理 + if(res.flag){ + mc_rmp.paintBody(CONFIG.moduleName,function () {//权限判断 + //禁用一些外键字段 当更多信息场景时才会触发 + mc_children.disabledTableParentArea(); + //laytable中有很多控件需要初始化 比如日期等 + mc_layui_component.bindMagicalCoderLayUiComponentFromTable(CONFIG,function(){_this.refreshTableFromCurrentPage()}) + //每一行的操作条目事件 + _this.tableOperateEvent() + }) + }else { + layer.msg(res.desc)//弹窗错误提示 + } + } + }); + }, + //表格内的操作事件 + tableOperateEvent : function () { + var _t = this; + var tableDom = $(CONFIG.layTable.elem); + var layFilter = tableDom.attr("lay-filter"); + //列表操作 + table.on('tool('+layFilter+')', function(obj){//操作条事件写法 参考layui + var primaryFields = tableDom.attr("data-primary-fields");//一般是表主键id 提前隐藏放在表区域 搜索list.html + var layEvent = obj.event, + data = obj.data; + var identify = data[primaryFields] + if(layEvent === 'edit'){ //编辑 + _t.editOrAdd(identify) + } else if(layEvent === 'del'){ //删除 + _t._deleteOneTr(identify) + } else if(layEvent === 'children'){ //子表 更多信息 + _t._childrenOneTr(identify) + } + }); + //列表排序 + table.on('sort('+layFilter+')', function(obj){ + var safeOrderBy = "";//排序字段组合 例如xxx_id desc + if(obj.type && obj.type!=null && obj.type!=''){ + safeOrderBy = CONFIG.sortMap[obj.field] + " " +obj.type; + } + _t.refreshTableFromCurrentPage(safeOrderBy);//从当前页重新加载分页数据 + }); + }, + //编辑或者添加 + editOrAdd : function (identify) {//identify 代表主键值 + var title = identify ? '编辑':'添加' + if(!identify){identify = ''} + var index = layui.layer.open({ + skin:'magicalcoder-layer-admin', + title : title, + type : 2,//打开iframe页面 很多人不知道原理:从列表页进入详情页是直接打开新iframe,详情页根据iframe的入参主键,获取详情页数据,然后重绘详情页,整个过程都是js处理 + maxmin: true, + area: ['80%', '80%'], + content : "admin/page_v2/"+tableName+"/edit?identify="+identify+mc_children.buildForeignParam(), + success : function(layero, index){ + setTimeout(function(){ + layui.layer.tips('点击此处返回列表', '.layui-layer-setwin .layui-layer-close', { + tips: 3 + }); + },500) + } + }) + //改变窗口大小时,重置弹窗的宽高,防止超出可视区域(如F12调出debug的操作) + //$(window).on("resize",function(){ + // layui.layer.full(index); + //}) + }, + _deleteOneTr : function (identify) {//删除一行 + var _this = this; + layer.confirm('确定删除此行记录?',{icon:3, title:'提示信息'},function(index){ + $.post('admin/'+tableNameRest+'/delete/'+identify,{},function (data) { + if(!data.flag){ + layer.msg("删除失败:"+data.desc); + }else { + _this.refreshTableFromCurrentPage();//从当前页刷新列表 + layer.close(index); + } + }) + }); + }, + _childrenOneTr : function (identify) {//更多信息:查看子表 + var title = '相关信息' + if(!identify){identify = ''} + if(!CONFIG.childrenPage || CONFIG.childrenPage==null || CONFIG.childrenPage.length<=0){ + layer.msg("未找到任何子表信息") + return; + } + var content = mc_children.buildTabTemplate(tableName,identify,CONFIG.childrenPage);//自表如果是多个 会绘制多个tab标签 + var index = layui.layer.open({skin:'magicalcoder-layer-admin',title : title,type : 1,maxmin: true,area: ['80%', '80%'],content : content, + success : function(layero, index){ + setTimeout(function(){ + layui.layer.tips('点击此处返回列表', '.layui-layer-setwin .layui-layer-close', { + tips: 3 + }); + },500) + } + }) + mc_children.tabClickEvent();//绑定下更多信息下tab点击事件 分别加载不同子表详情 列表界面 + //改变窗口大小时,重置弹窗的宽高,防止超出可视区域(如F12调出debug的操作) + //$(window).on("resize",function(){ + // layui.layer.full(index); + //}) + }, + refreshTableFromCurrentPage : function (safeOrderBy) {//当前页 重新加载 + var whereData = this.buildQueryFormParams(safeOrderBy) + this._startReloadTableFromStartPage(null,whereData) + }, + refreshTableFromPageOne : function () {//从第一页 重新加载 搜索场景使用 清空各种参数 + var whereData = this.buildQueryFormParams("") + this._startReloadTableFromStartPage(1,whereData) + }, + buildQueryFormParams : function (safeOrderBy) {//自动封装查询区域数据 + var _this = this; + var whereData = {} + var queryForm = $(".security_list_query_form")//参考list.html的表单区域样式名称 + //因为layui 的查询有记忆功能,会缓存老的查询条件,这里把重置的条件给清空 赋值null + var radioMemory = {} + queryForm.find(".layui-input").each(function (index,item) { + var type = $(item).attr("type") + var name = $(item).attr("name") + if(name){ + switch (type){ + case "radio" : + if(!radioMemory[name]){ + radioMemory[name] = false; + } + if($(item).is(":checked")){ + _this._autoSetWhereData(whereData,name,item); + radioMemory[name] = true; + } + break; + default : + _this._autoSetWhereData(whereData,name,item); + break; + } + } + }) + // + for(var radioName in radioMemory){ + if(!radioMemory[radioName]){//肯定被layui缓存的查询字段 这里设置""可以清理掉此字段 + whereData[radioName] = "" + } + } + whereData.safeOrderBy = safeOrderBy || "" + return whereData; + }, + _startReloadTableFromStartPage : function (startPage,whereData) { + var reloadTableId = CONFIG.layTable.id + if(startPage==null || !startPage) {//当前页 聪明的记住多少页 + table.reload(reloadTableId,{where: whereData }) + }else { + table.reload(reloadTableId,{ + page: { + curr: startPage //重新从第 几 页开始 + }, + where: whereData + }) + } + }, + _autoSetWhereData : function (whereData,name,item) {//name是表单元素名称 item是表单对象 + var val = $.trim($(item).val()) + whereData[name] = val + } + } + return tableObj; + }, + render:function () {//入口 + var needInitSelect2 = mc_children.disabledFromQueryParentArea();//尝试下先禁用附表区域 多半关联场景才会触发 + mc_layui_component.bindMagicalCoderLayUiComponentFromQuery(CONFIG);//查询区域绘制一下控件 + this.bindAreaEvents(); + this.layTable().render(); + }, + bindAreaEvents : function () { + var _t = this; + //搜索 + $(".search_btn").click(function(){ + _t.layTable().refreshTableFromPageOne(); + }); + //重置 + $("button[type='reset']").click(function(){ + $("."+mc_constant.MC_LAY_CLASS_NAME.FORM.foreign_select2).val(null).trigger('change'); + return true; + }); + //添加 + $(".addNews_btn").click(function(){ + _t.layTable().editOrAdd(); + }) + //批量删除 + $(".delAll_btn").click(function(){ + var laytableElem = CONFIG.layTable.elem + var laytableId = CONFIG.layTable.id + //主键字段 + var primaryFields = $(laytableElem).attr("data-primary-fields") + var checkStatus = table.checkStatus(laytableId), + data = checkStatus.data, + ids = []; + if(data.length > 0) { + for (var i in data) { + ids.push(data[i][primaryFields]); + } + layer.confirm('确定删除选中的记录?', {icon: 3, title: '提示信息'}, function (index) { + $.post('admin/'+tableNameRest+'/batch_delete',{ids:ids},function (data) { + if(!data.flag){ + layer.msg("删除失败:"+data.desc); + }else { + _t.layTable().refreshTableFromCurrentPage(); + layer.close(index); + } + }) + }) + }else{ + layer.msg("请选择需要删除的记录"); + } + }) + //excel导出 + $(".exportExcelAll_btn").click(function(){ + var dataMaxExportCount = parseInt($(this).attr("data-max-export-count"))//导出多少行 在界面导出按钮的一个属性配置 如果导出太多就会卡死 + var whereData = _t.layTable().buildQueryFormParams("") + whereData.queryType = mc_constant.QUERY_TYPE_EXPORT_EXCEL;//代表是导出excel类型 参加controller实现 + whereData.page = 1; + whereData.limit = dataMaxExportCount; + var url = 'admin/'+tableNameRest+'/page?' + var arr = [] + for(var i in whereData){ + arr.push(i+"="+whereData[i]) + } + window.location.href=url + arr.join("&") + }); + } + } +//入口函数 + obj.render(); +}(); diff --git a/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_log_admin_operate/edit.js b/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_log_admin_operate/edit.js new file mode 100644 index 0000000..8798d93 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_log_admin_operate/edit.js @@ -0,0 +1,127 @@ +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ +;!function(){ + var $ = layui.jquery + ,layer = parent.layer === undefined ? layui.layer : top.layer + ,form = layui.form; + var mc_layui_component=youyaboot_all.mc_layui_component + ,mc_util = youyaboot_all.mc_util + ,mc_children = youyaboot_all.mc_children + ,mc_verify = youyaboot_all.mc_verify + ,mc_constant = youyaboot_all.mc_constant + ,mc_rmp = youyaboot_all.mc_rmp + ; + var common_config = { + tableNameRest:"sys_log_admin_operate_rest", + tableName:"sys_log_admin_operate", + moduleName:"sys_log_admin_operate",//sys_module的moduleName + form:{ + createTime:{ + renderConfig:{}//您可以自定义个性配置 遇到相同的则以dom配置为准 大部分属性已推荐设置在元素标签上 这里您可以自定义事件 {"calendar":false,"format":"yyyy-MM-dd HH:mm:ss","show":false,"range":false,"trigger":"click","type":"datetime","isInitValue":true,"showBottom":true,"inputType":"date","theme":"default","position":"absolute","lang":"cn","zIndex":66666666} + } + } + } + var tableNameRest = common_config.tableNameRest; + var moduleName = common_config.moduleName; + var obj = { + render:function () {//入口 + this.ajaxGetEntityDataAndAutoSetFormUiValue(); + this.submit(); + }, + //初始化表单 + ajaxGetEntityDataAndAutoSetFormUiValue : function () { + var _t = this; + var identify = mc_util.getParameter('identify')//从url中检测主键 + if(identify!=null && identify!=''){//断定是编辑操作 + $.getJSON('admin/'+tableNameRest+"/get/"+identify,{date:new Date().getTime()},function (data) {//获取此实体详情数据 + if(data.flag){ + var entity = data.data + if(entity && entity!=null){ + //把请求到的实体内容自动设置到表单中去 + mc_util.mappingEntityToFormUiValue($("body"),entity); + //禁用外键编辑区域:只有当从更多信息点击进来 才会禁用 单表操作不会执行 + mc_children.disabledFormParentArea(); + //权限 注意xxx-edit.html页面刚进来 是被隐藏的(body标签的layui-hide样式) 这样当权限执行完 才进行一一显示 + mc_rmp.paintBody(moduleName,function () { + var verifyData = mc_layui_component.bindMagicalCoderLayUiComponentFromDetail(common_config);//返回富文本的校验 为了能同步隐藏域 + _t.layuiFormVerify(verifyData); + }) + }else { + layer.msg("此条记录已被删除,请重新查询!"); + } + }else { + layer.msg("查询失败:"+data.desc); + } + }) + }else {//新增操作 + //禁用外键编辑区域:只有当从更多信息点击进来 才会禁用 单表操作不会执行 + mc_children.disabledFormParentArea(); + //权限 + mc_rmp.paintBody(moduleName,function () { + var verifyData =mc_layui_component.bindMagicalCoderLayUiComponentFromDetail(common_config);//返回富文本的校验 为了能同步隐藏域 + _t.layuiFormVerify(verifyData); + $("button[type='reset']").removeClass('layui-hide');//把重置按钮显示处理 + }) + } + }, + //layui的表单校验规则 + layuiFormVerify:function (verifyData) {//verifyData 里如果由内容则是富文本的校验同步 + var verifyData = + $.extend(verifyData,{//这里可以自定义layui的校验规则 自行扩展 参考官网文档 https://www.layui.com/doc/modules/form.html + + }) + form.verify(verifyData); + } + , + //表单提交 + submit : function () { + //重置按钮把外键的默认值清空 + $("button[type='reset']").click(function(){ + $("."+mc_constant.MC_LAY_CLASS_NAME.FORM.foreign_select2).val(null).trigger('change');//固定写法 把搜索下拉重置空值 + return true; + }); + //表单校验 在_bindFormDom方法 + form.on("submit(save)",function(data){ + // 实际使用时的提交信息 + var postData = data.field; + //开关单独处理 + $('body').find("input[lay-skin='switch']").each(function (index,item) { + var name = $(item).attr("name") + var field = data.field + postData[name] = field[name] ? ((field[name]+''=='on' || field[name]+'' == 'true') ? 1 : 0):0;//开关请用0或1来设置值 + }) + //清理上次不通过样式提醒 + for(var name in postData){ + var dom = $("[name='"+name+"']") + mc_verify.clearDangerClass(dom) + } + //MagicalCoder扩展的表单校验 + for(var name in postData){ + var dom = $("[name='"+name+"']") + var value = postData[name] + if(!mc_verify.verify(value,dom)){ + return false; + } + } + //弹出loading + var index = top.layer.msg('数据提交中,请稍候',{icon: 16,time:false,shade:0.8}); + $.post('admin/'+tableNameRest+'/save',postData,function(res){ + top.layer.close(index); + if(res.flag){ + parent.layui.$(".search_btn").click()//parent代表父窗口,因为详情页是iframe弹出来的;让列表页重新执行一次搜索 + //关闭当前层 + var pidx = parent.layui.layer.index + parent.layui.layer.close(pidx-1); + }else { + top.layer.msg("保存失败:"+res.desc); + } + }) + return false; + }) + } + } + obj.render(); +}(); diff --git a/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_log_admin_operate/list.js b/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_log_admin_operate/list.js new file mode 100644 index 0000000..9e02dfc --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_log_admin_operate/list.js @@ -0,0 +1,332 @@ +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ +//不要被如此多的代码唬住,读懂一个 其他的模块都明白了,之所以写这么多开放出来,主要是为了定制和维护性,您可以随意修改逻辑 适应你的业务场景 +;!function(){ + var $ = layui.jquery + ,layer = parent.layer === undefined ? layui.layer : top.layer + ,table = layui.table; + var mc_children = youyaboot_all.mc_children + ,mc_constant = youyaboot_all.mc_constant + ,mc_util = youyaboot_all.mc_util + ,mc_rmp = youyaboot_all.mc_rmp + ,mc_layui_component = youyaboot_all.mc_layui_component + ; + +// 子表 排序相关 + var CONFIG = { + tableNameRest:"sys_log_admin_operate_rest", + tableName:"sys_log_admin_operate", + moduleName:"sys_log_admin_operate",//sys_module的moduleName + form:{ + createTime:{ + renderConfig:{}//您可以自定义个性配置 遇到相同的则以dom配置为准 大部分属性已推荐设置在元素标签上 这里您可以自定义事件 {"calendar":false,"format":"yyyy-MM-dd HH:mm:ss","show":false,"range":false,"trigger":"click","type":"datetime","isInitValue":true,"showBottom":true,"inputType":"date","theme":"default","position":"absolute","lang":"cn","zIndex":66666666} + } + }, + layTable : {//表格内容 到list.html查找即可明白 + elem : '#newsList', + id : "newsListTable" + }, + //排序跟数据库实际字段名的映射 + sortMap:{ + adminUserId:'admin_user_id',userName:'user_name',tableName:'table_name',operateType:'operate_type',url:'url',createTime:'create_time' + } + }; + //后端请求时候的表模块规则url + var tableNameRest = CONFIG.tableNameRest; + var tableName = CONFIG.tableName; + //表格每一列配置 + var COLS = [[ + {type: "checkbox", /*fixed:"left",*/ width:50},//全选 + {field: 'adminUserId', title: '管理员', align:'center', minWidth:250, templet:function (d) { + var value = (!d.adminUserId || d.adminUserId==null) ? '' : d.adminUserId + //var option = '' + return '' + },sort:true + }, + + {field: 'userName', title: '管理员名称', minWidth:200,templet:function (d) { + return '' + } + , sort:true + }, + + {field: 'tableName', title: '表名', minWidth:200,templet:function (d) { + return '' + } + , sort:true + }, + + {field: 'operateType', title: '操作类型', minWidth:200,templet:function (d) { + return '' + } + , sort:true + }, + + {field: 'url', title: '链接', minWidth:200,templet:function (d) { + return '' + } + , sort:true + }, + {field: 'createTime', title: '创建时间', align:'center', minWidth:250, templet :"#createTimeTemplate",sort:true}, + {title: '操作', minWidth:250, templet:'#newsListOperateTemplate',/*fixed:"right",*/align:"center"}//操作 到list.html页面查找模板对应的html + ]]; + var obj = { + layTable:function () {//表格 + var tableObj = { + render:function () { + this.initTable(); + this.tableOperateEvent(); + }, + //初始化一个表格 + initTable : function () { + var _this = this; + table.render({//这里是layui的table分页写法 具体可参考layui官方文档 + elem: CONFIG.layTable.elem, + url : 'admin/'+tableNameRest+'/page', + cellMinWidth : 95, + page : true,//是否分页 + //height : "full-10",//高度样式 + // height : 500, + limit : 20,//每页多少条 + limits : [10,15,20,25],//下拉 + id : CONFIG.layTable.id, + cols : COLS,//放入列配置 + loading : true, + where : this.buildQueryFormParams(""),//构造查询参数 注意这里layui会缓存你的上一次查询参数 无法清除 只能考虑设置成空字符才能清理 + done:function (res,curr,count) {//请求成功后处理 + if(res.flag){ + mc_rmp.paintBody(CONFIG.moduleName,function () {//权限判断 + //禁用一些外键字段 当更多信息场景时才会触发 + mc_children.disabledTableParentArea(); + //laytable中有很多控件需要初始化 比如日期等 + mc_layui_component.bindMagicalCoderLayUiComponentFromTable(CONFIG,function(){_this.refreshTableFromCurrentPage()}) + //每一行的操作条目事件 + _this.tableOperateEvent() + }) + }else { + layer.msg(res.desc)//弹窗错误提示 + } + } + }); + }, + //表格内的操作事件 + tableOperateEvent : function () { + var _t = this; + var tableDom = $(CONFIG.layTable.elem); + var layFilter = tableDom.attr("lay-filter"); + //列表操作 + table.on('tool('+layFilter+')', function(obj){//操作条事件写法 参考layui + var primaryFields = tableDom.attr("data-primary-fields");//一般是表主键id 提前隐藏放在表区域 搜索list.html + var layEvent = obj.event, + data = obj.data; + var identify = data[primaryFields] + if(layEvent === 'edit'){ //编辑 + _t.editOrAdd(identify) + } else if(layEvent === 'del'){ //删除 + _t._deleteOneTr(identify) + } else if(layEvent === 'children'){ //子表 更多信息 + _t._childrenOneTr(identify) + } + }); + //列表排序 + table.on('sort('+layFilter+')', function(obj){ + var safeOrderBy = "";//排序字段组合 例如xxx_id desc + if(obj.type && obj.type!=null && obj.type!=''){ + safeOrderBy = CONFIG.sortMap[obj.field] + " " +obj.type; + } + _t.refreshTableFromCurrentPage(safeOrderBy);//从当前页重新加载分页数据 + }); + }, + //编辑或者添加 + editOrAdd : function (identify) {//identify 代表主键值 + var title = identify ? '编辑':'添加' + if(!identify){identify = ''} + var index = layui.layer.open({ + skin:'magicalcoder-layer-admin', + title : title, + type : 2,//打开iframe页面 很多人不知道原理:从列表页进入详情页是直接打开新iframe,详情页根据iframe的入参主键,获取详情页数据,然后重绘详情页,整个过程都是js处理 + maxmin: true, + area: ['80%', '80%'], + content : "admin/page_v2/"+tableName+"/edit?identify="+identify+mc_children.buildForeignParam(), + success : function(layero, index){ + setTimeout(function(){ + layui.layer.tips('点击此处返回列表', '.layui-layer-setwin .layui-layer-close', { + tips: 3 + }); + },500) + } + }) + //改变窗口大小时,重置弹窗的宽高,防止超出可视区域(如F12调出debug的操作) + //$(window).on("resize",function(){ + // layui.layer.full(index); + //}) + }, + _deleteOneTr : function (identify) {//删除一行 + var _this = this; + layer.confirm('确定删除此行记录?',{icon:3, title:'提示信息'},function(index){ + $.post('admin/'+tableNameRest+'/delete/'+identify,{},function (data) { + if(!data.flag){ + layer.msg("删除失败:"+data.desc); + }else { + _this.refreshTableFromCurrentPage();//从当前页刷新列表 + layer.close(index); + } + }) + }); + }, + _childrenOneTr : function (identify) {//更多信息:查看子表 + var title = '相关信息' + if(!identify){identify = ''} + if(!CONFIG.childrenPage || CONFIG.childrenPage==null || CONFIG.childrenPage.length<=0){ + layer.msg("未找到任何子表信息") + return; + } + var content = mc_children.buildTabTemplate(tableName,identify,CONFIG.childrenPage);//自表如果是多个 会绘制多个tab标签 + var index = layui.layer.open({skin:'magicalcoder-layer-admin',title : title,type : 1,maxmin: true,area: ['80%', '80%'],content : content, + success : function(layero, index){ + setTimeout(function(){ + layui.layer.tips('点击此处返回列表', '.layui-layer-setwin .layui-layer-close', { + tips: 3 + }); + },500) + } + }) + mc_children.tabClickEvent();//绑定下更多信息下tab点击事件 分别加载不同子表详情 列表界面 + //改变窗口大小时,重置弹窗的宽高,防止超出可视区域(如F12调出debug的操作) + //$(window).on("resize",function(){ + // layui.layer.full(index); + //}) + }, + refreshTableFromCurrentPage : function (safeOrderBy) {//当前页 重新加载 + var whereData = this.buildQueryFormParams(safeOrderBy) + this._startReloadTableFromStartPage(null,whereData) + }, + refreshTableFromPageOne : function () {//从第一页 重新加载 搜索场景使用 清空各种参数 + var whereData = this.buildQueryFormParams("") + this._startReloadTableFromStartPage(1,whereData) + }, + buildQueryFormParams : function (safeOrderBy) {//自动封装查询区域数据 + var _this = this; + var whereData = {} + var queryForm = $(".security_list_query_form")//参考list.html的表单区域样式名称 + //因为layui 的查询有记忆功能,会缓存老的查询条件,这里把重置的条件给清空 赋值null + var radioMemory = {} + queryForm.find(".layui-input").each(function (index,item) { + var type = $(item).attr("type") + var name = $(item).attr("name") + if(name){ + switch (type){ + case "radio" : + if(!radioMemory[name]){ + radioMemory[name] = false; + } + if($(item).is(":checked")){ + _this._autoSetWhereData(whereData,name,item); + radioMemory[name] = true; + } + break; + default : + _this._autoSetWhereData(whereData,name,item); + break; + } + } + }) + // + for(var radioName in radioMemory){ + if(!radioMemory[radioName]){//肯定被layui缓存的查询字段 这里设置""可以清理掉此字段 + whereData[radioName] = "" + } + } + whereData.safeOrderBy = safeOrderBy || "" + return whereData; + }, + _startReloadTableFromStartPage : function (startPage,whereData) { + var reloadTableId = CONFIG.layTable.id + if(startPage==null || !startPage) {//当前页 聪明的记住多少页 + table.reload(reloadTableId,{where: whereData }) + }else { + table.reload(reloadTableId,{ + page: { + curr: startPage //重新从第 几 页开始 + }, + where: whereData + }) + } + }, + _autoSetWhereData : function (whereData,name,item) {//name是表单元素名称 item是表单对象 + var val = $.trim($(item).val()) + whereData[name] = val + } + } + return tableObj; + }, + render:function () {//入口 + var needInitSelect2 = mc_children.disabledFromQueryParentArea();//尝试下先禁用附表区域 多半关联场景才会触发 + mc_layui_component.bindMagicalCoderLayUiComponentFromQuery(CONFIG);//查询区域绘制一下控件 + this.bindAreaEvents(); + this.layTable().render(); + }, + bindAreaEvents : function () { + var _t = this; + //搜索 + $(".search_btn").click(function(){ + _t.layTable().refreshTableFromPageOne(); + }); + //重置 + $("button[type='reset']").click(function(){ + $("."+mc_constant.MC_LAY_CLASS_NAME.FORM.foreign_select2).val(null).trigger('change'); + return true; + }); + //添加 + $(".addNews_btn").click(function(){ + _t.layTable().editOrAdd(); + }) + //批量删除 + $(".delAll_btn").click(function(){ + var laytableElem = CONFIG.layTable.elem + var laytableId = CONFIG.layTable.id + //主键字段 + var primaryFields = $(laytableElem).attr("data-primary-fields") + var checkStatus = table.checkStatus(laytableId), + data = checkStatus.data, + ids = []; + if(data.length > 0) { + for (var i in data) { + ids.push(data[i][primaryFields]); + } + layer.confirm('确定删除选中的记录?', {icon: 3, title: '提示信息'}, function (index) { + $.post('admin/'+tableNameRest+'/batch_delete',{ids:ids},function (data) { + if(!data.flag){ + layer.msg("删除失败:"+data.desc); + }else { + _t.layTable().refreshTableFromCurrentPage(); + layer.close(index); + } + }) + }) + }else{ + layer.msg("请选择需要删除的记录"); + } + }) + //excel导出 + $(".exportExcelAll_btn").click(function(){ + var dataMaxExportCount = parseInt($(this).attr("data-max-export-count"))//导出多少行 在界面导出按钮的一个属性配置 如果导出太多就会卡死 + var whereData = _t.layTable().buildQueryFormParams("") + whereData.queryType = mc_constant.QUERY_TYPE_EXPORT_EXCEL;//代表是导出excel类型 参加controller实现 + whereData.page = 1; + whereData.limit = dataMaxExportCount; + var url = 'admin/'+tableNameRest+'/page?' + var arr = [] + for(var i in whereData){ + arr.push(i+"="+whereData[i]) + } + window.location.href=url + arr.join("&") + }); + } + } +//入口函数 + obj.render(); +}(); diff --git a/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_module/edit.js b/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_module/edit.js new file mode 100644 index 0000000..3fc17bb --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_module/edit.js @@ -0,0 +1,128 @@ +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ +;!function(){ + var $ = layui.jquery + ,layer = parent.layer === undefined ? layui.layer : top.layer + ,form = layui.form; + var mc_layui_component=youyaboot_all.mc_layui_component + ,mc_util = youyaboot_all.mc_util + ,mc_children = youyaboot_all.mc_children + ,mc_verify = youyaboot_all.mc_verify + ,mc_constant = youyaboot_all.mc_constant + ,mc_rmp = youyaboot_all.mc_rmp + ; + var common_config = { + tableNameRest:"sys_module_rest", + tableName:"sys_module", + moduleName:"sys_module",//sys_module的moduleName + form:{ + } + } + var tableNameRest = common_config.tableNameRest; + var moduleName = common_config.moduleName; + var obj = { + render:function () {//入口 + this.ajaxGetEntityDataAndAutoSetFormUiValue(); + this.submit(); + }, + //初始化表单 + ajaxGetEntityDataAndAutoSetFormUiValue : function () { + var _t = this; + var identify = mc_util.getParameter('identify')//从url中检测主键 + if(identify!=null && identify!=''){//断定是编辑操作 + $.getJSON('admin/'+tableNameRest+"/get/"+identify,{date:new Date().getTime()},function (data) {//获取此实体详情数据 + if(data.flag){ + var entity = data.data + if(entity && entity!=null){ + //把请求到的实体内容自动设置到表单中去 + mc_util.mappingEntityToFormUiValue($("body"),entity); + //禁用外键编辑区域:只有当从更多信息点击进来 才会禁用 单表操作不会执行 这里不要禁用 + // mc_children.disabledFormParentArea(); + //权限 注意xxx-edit.html页面刚进来 是被隐藏的(body标签的layui-hide样式) 这样当权限执行完 才进行一一显示 + mc_rmp.paintBody(moduleName,function () { + var verifyData = mc_layui_component.bindMagicalCoderLayUiComponentFromDetail(common_config);//返回富文本的校验 为了能同步隐藏域 + _t.layuiFormVerify(verifyData); + }) + }else { + layer.msg("此条记录已被删除,请重新查询!"); + } + }else { + layer.msg("查询失败:"+data.desc); + } + }) + }else {//新增操作 + //禁用外键编辑区域:只有当从更多信息点击进来 才会禁用 单表操作不会执行 + mc_children.disabledFormParentArea(); + //权限 + mc_rmp.paintBody(moduleName,function () { + var verifyData =mc_layui_component.bindMagicalCoderLayUiComponentFromDetail(common_config);//返回富文本的校验 为了能同步隐藏域 + _t.layuiFormVerify(verifyData); + $("button[type='reset']").removeClass('layui-hide');//把重置按钮显示处理 + }) + } + }, + //layui的表单校验规则 + layuiFormVerify:function (verifyData) {//verifyData 里如果由内容则是富文本的校验同步 + var verifyData = + $.extend(verifyData,{//这里可以自定义layui的校验规则 自行扩展 参考官网文档 https://www.layui.com/doc/modules/form.html + + }) + form.verify(verifyData); + } + , + //表单提交 + submit : function () { + //重置按钮把外键的默认值清空 + $("button[type='reset']").click(function(){ + $("."+mc_constant.MC_LAY_CLASS_NAME.FORM.foreign_select2).val(null).trigger('change');//固定写法 把搜索下拉重置空值 + return true; + }); + //表单校验 在_bindFormDom方法 + form.on("submit(save)",function(data){ + // 实际使用时的提交信息 + var postData = data.field; + //开关单独处理 + $('body').find("input[lay-skin='switch']").each(function (index,item) { + var name = $(item).attr("name") + var field = data.field + postData[name] = field[name] ? ((field[name]+''=='on' || field[name]+'' == 'true') ? 1 : 0):0;//开关请用0或1来设置值 + }) + //清理上次不通过样式提醒 + for(var name in postData){ + var dom = $("[name='"+name+"']") + mc_verify.clearDangerClass(dom) + } + //MagicalCoder扩展的表单校验 + for(var name in postData){ + var dom = $("[name='"+name+"']") + var value = postData[name] + if(!mc_verify.verify(value,dom)){ + return false; + } + } + //弹出loading + var index = top.layer.msg('数据提交中,请稍候',{icon: 16,time:false,shade:0.8}); + $.post('admin/'+tableNameRest+'/extra_save',postData,function(res){ + top.layer.close(index); + if(res.flag){ + if(postData.helpConfigPermit){ + top.layer.msg("成功!请至【角色管理】-【分配权限】-关联此模块权限"); + } + parent.layui.$(".search_btn").click()//parent代表父窗口,因为详情页是iframe弹出来的;让列表页重新执行一次搜索 + //关闭当前层 + var pidx = parent.layui.layer.index + parent.layui.layer.close(pidx-1); + + }else { + top.layer.msg("保存失败:"+res.desc); + } + }) + return false; + }) + } + } + obj.render(); +}(); diff --git a/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_module/list.js b/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_module/list.js new file mode 100644 index 0000000..98af568 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_module/list.js @@ -0,0 +1,343 @@ +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ +//不要被如此多的代码唬住,读懂一个 其他的模块都明白了,之所以写这么多开放出来,主要是为了定制和维护性,您可以随意修改逻辑 适应你的业务场景 +;!function(){ + var $ = layui.jquery + ,layer = parent.layer === undefined ? layui.layer : top.layer + ,table = layui.table; + var mc_children = youyaboot_all.mc_children + ,mc_constant = youyaboot_all.mc_constant + ,mc_util = youyaboot_all.mc_util + ,mc_rmp = youyaboot_all.mc_rmp + ,mc_layui_component = youyaboot_all.mc_layui_component + ; + +// 子表 排序相关 + var CONFIG = { + tableNameRest:"sys_module_rest", + tableName:"sys_module", + moduleName:"sys_module",//sys_module的moduleName + form:{ + }, + childrenPage:[//子页面的一些基础信息 更多信息 + { + tabTitle:"权限规则配置", + url:"admin/page_v2/sys_permission/list", + mcForeignName:"moduleId" + } + ], + layTable : {//表格内容 到list.html查找即可明白 + elem : '#newsList', + id : "newsListTable" + }, + //排序跟数据库实际字段名的映射 + sortMap:{ + id:'id',moduleName:'module_name',moduleUrl:'module_url',moduleCategoryId:'module_category_id',sortNum:'sort_num',moduleTitle:'module_title',ifShow:'if_show' + } + }; + //后端请求时候的表模块规则url + var tableNameRest = CONFIG.tableNameRest; + var tableName = CONFIG.tableName; + //表格每一列配置 + var COLS = [[ + {type: "checkbox", /*fixed:"left",*/ width:50},//全选 + {field: 'id', title: '主键', minWidth:100, align:"center",sort:true}, + {field: 'moduleCategoryId', title: '一级菜单', align:'center', minWidth:250, templet:function (d) { + var value = (!d.moduleCategoryId || d.moduleCategoryId==null) ? '' : d.moduleCategoryId + //var option = '' + return '' + },sort:true + }, + + {field: 'moduleTitle', title: '二级菜单标题', minWidth:200,templet:function (d) { + return '' + } + , sort:true + }, + + {field: 'moduleName', title: '二级菜单唯一值', minWidth:200,templet:function (d) { + return '' + } + , sort:true + }, + + {field: 'moduleUrl', title: '二级菜单地址', minWidth:250,templet:function (d) { + return '' + } + , sort:true + }, + + {field: 'ifShow', title: '是否显示',minWidth:100, align:'center', templet:function(d){ + var checked = (d.ifShow+''=='true' || d.ifShow+'' == '1') ? 'checked' : ''; + return '' + } + ,sort:true + }, + + {field: 'sortNum', title: '排序', minWidth:100,templet:function (d) { + return '' + } + , sort:true + }, + {title: '操作', minWidth:250, templet:'#newsListOperateTemplate',/*fixed:"right",*/align:"center"}//操作 到list.html页面查找模板对应的html + ]]; + var obj = { + layTable:function () {//表格 + var tableObj = { + render:function () { + this.initTable(); + this.tableOperateEvent(); + }, + //初始化一个表格 + initTable : function () { + var _this = this; + table.render({//这里是layui的table分页写法 具体可参考layui官方文档 + elem: CONFIG.layTable.elem, + url : 'admin/'+tableNameRest+'/page', + cellMinWidth : 95, + page : true,//是否分页 + //height : "full-10",//高度样式 + // height : 500, + limit : 20,//每页多少条 + limits : [10,15,20,25],//下拉 + id : CONFIG.layTable.id, + cols : COLS,//放入列配置 + loading : true, + where : this.buildQueryFormParams(""),//构造查询参数 注意这里layui会缓存你的上一次查询参数 无法清除 只能考虑设置成空字符才能清理 + done:function (res,curr,count) {//请求成功后处理 + if(res.flag){ + mc_rmp.paintBody(CONFIG.moduleName,function () {//权限判断 + //禁用一些外键字段 当更多信息场景时才会触发 + // mc_children.disabledTableParentArea(); + //laytable中有很多控件需要初始化 比如日期等 + mc_layui_component.bindMagicalCoderLayUiComponentFromTable(CONFIG,function(){_this.refreshTableFromCurrentPage()}) + //每一行的操作条目事件 + _this.tableOperateEvent() + }) + }else { + layer.msg(res.desc)//弹窗错误提示 + } + } + }); + }, + //表格内的操作事件 + tableOperateEvent : function () { + var _t = this; + var tableDom = $(CONFIG.layTable.elem); + var layFilter = tableDom.attr("lay-filter"); + //列表操作 + table.on('tool('+layFilter+')', function(obj){//操作条事件写法 参考layui + var primaryFields = tableDom.attr("data-primary-fields");//一般是表主键id 提前隐藏放在表区域 搜索list.html + var layEvent = obj.event, + data = obj.data; + var identify = data[primaryFields] + if(layEvent === 'edit'){ //编辑 + _t.editOrAdd(identify) + } else if(layEvent === 'del'){ //删除 + _t._deleteOneTr(identify) + } else if(layEvent === 'children'){ //子表 更多信息 + _t._childrenOneTr(identify) + } + }); + //列表排序 + table.on('sort('+layFilter+')', function(obj){ + var safeOrderBy = "";//排序字段组合 例如xxx_id desc + if(obj.type && obj.type!=null && obj.type!=''){ + safeOrderBy = CONFIG.sortMap[obj.field] + " " +obj.type; + } + _t.refreshTableFromCurrentPage(safeOrderBy);//从当前页重新加载分页数据 + }); + }, + //编辑或者添加 + editOrAdd : function (identify) {//identify 代表主键值 + var title = identify ? '编辑':'添加' + if(!identify){identify = ''} + var index = layui.layer.open({ + skin:'magicalcoder-layer-admin', + title : title, + type : 2,//打开iframe页面 很多人不知道原理:从列表页进入详情页是直接打开新iframe,详情页根据iframe的入参主键,获取详情页数据,然后重绘详情页,整个过程都是js处理 + maxmin: true, + area: ['80%', '80%'], + content : "admin/page_v2/"+tableName+"/edit?identify="+identify+mc_children.buildForeignParam(), + success : function(layero, index){ + setTimeout(function(){ + layui.layer.tips('点击此处返回列表', '.layui-layer-setwin .layui-layer-close', { + tips: 3 + }); + },500) + } + }) + //改变窗口大小时,重置弹窗的宽高,防止超出可视区域(如F12调出debug的操作) + //$(window).on("resize",function(){ + // layui.layer.full(index); + //}) + }, + _deleteOneTr : function (identify) {//删除一行 + var _this = this; + layer.confirm('确定删除此行记录?',{icon:3, title:'提示信息'},function(index){ + $.post('admin/'+tableNameRest+'/delete/'+identify,{},function (data) { + if(!data.flag){ + layer.msg("删除失败:"+data.desc); + }else { + _this.refreshTableFromCurrentPage();//从当前页刷新列表 + layer.close(index); + } + }) + }); + }, + _childrenOneTr : function (identify) {//更多信息:查看子表 + var title = '相关信息' + if(!identify){identify = ''} + if(!CONFIG.childrenPage || CONFIG.childrenPage==null || CONFIG.childrenPage.length<=0){ + layer.msg("未找到任何子表信息") + return; + } + var content = mc_children.buildTabTemplate(tableName,identify,CONFIG.childrenPage);//自表如果是多个 会绘制多个tab标签 + var index = layui.layer.open({skin:'magicalcoder-layer-admin',title : title,type : 1,maxmin: true,area: ['80%', '80%'],content : content, + success : function(layero, index){ + setTimeout(function(){ + layui.layer.tips('点击此处返回列表', '.layui-layer-setwin .layui-layer-close', { + tips: 3 + }); + },500) + } + }) + mc_children.tabClickEvent();//绑定下更多信息下tab点击事件 分别加载不同子表详情 列表界面 + //改变窗口大小时,重置弹窗的宽高,防止超出可视区域(如F12调出debug的操作) + //$(window).on("resize",function(){ + // layui.layer.full(index); + //}) + }, + refreshTableFromCurrentPage : function (safeOrderBy) {//当前页 重新加载 + var whereData = this.buildQueryFormParams(safeOrderBy) + this._startReloadTableFromStartPage(null,whereData) + }, + refreshTableFromPageOne : function () {//从第一页 重新加载 搜索场景使用 清空各种参数 + var whereData = this.buildQueryFormParams("") + this._startReloadTableFromStartPage(1,whereData) + }, + buildQueryFormParams : function (safeOrderBy) {//自动封装查询区域数据 + var _this = this; + var whereData = {} + var queryForm = $(".security_list_query_form")//参考list.html的表单区域样式名称 + //因为layui 的查询有记忆功能,会缓存老的查询条件,这里把重置的条件给清空 赋值null + var radioMemory = {} + queryForm.find(".layui-input").each(function (index,item) { + var type = $(item).attr("type") + var name = $(item).attr("name") + if(name){ + switch (type){ + case "radio" : + if(!radioMemory[name]){ + radioMemory[name] = false; + } + if($(item).is(":checked")){ + _this._autoSetWhereData(whereData,name,item); + radioMemory[name] = true; + } + break; + default : + _this._autoSetWhereData(whereData,name,item); + break; + } + } + }) + // + for(var radioName in radioMemory){ + if(!radioMemory[radioName]){//肯定被layui缓存的查询字段 这里设置""可以清理掉此字段 + whereData[radioName] = "" + } + } + whereData.safeOrderBy = safeOrderBy || "" + return whereData; + }, + _startReloadTableFromStartPage : function (startPage,whereData) { + var reloadTableId = CONFIG.layTable.id + if(startPage==null || !startPage) {//当前页 聪明的记住多少页 + table.reload(reloadTableId,{where: whereData }) + }else { + table.reload(reloadTableId,{ + page: { + curr: startPage //重新从第 几 页开始 + }, + where: whereData + }) + } + }, + _autoSetWhereData : function (whereData,name,item) {//name是表单元素名称 item是表单对象 + var val = $.trim($(item).val()) + whereData[name] = val + } + } + return tableObj; + }, + render:function () {//入口 + var needInitSelect2 = mc_children.disabledFromQueryParentArea();//尝试下先禁用附表区域 多半关联场景才会触发 + mc_layui_component.bindMagicalCoderLayUiComponentFromQuery(CONFIG);//查询区域绘制一下控件 + this.bindAreaEvents(); + this.layTable().render(); + }, + bindAreaEvents : function () { + var _t = this; + //搜索 + $(".search_btn").click(function(){ + _t.layTable().refreshTableFromPageOne(); + }); + //重置 + $("button[type='reset']").click(function(){ + $("."+mc_constant.MC_LAY_CLASS_NAME.FORM.foreign_select2).val(null).trigger('change'); + return true; + }); + //添加 + $(".addNews_btn").click(function(){ + _t.layTable().editOrAdd(); + }) + //批量删除 + $(".delAll_btn").click(function(){ + var laytableElem = CONFIG.layTable.elem + var laytableId = CONFIG.layTable.id + //主键字段 + var primaryFields = $(laytableElem).attr("data-primary-fields") + var checkStatus = table.checkStatus(laytableId), + data = checkStatus.data, + ids = []; + if(data.length > 0) { + for (var i in data) { + ids.push(data[i][primaryFields]); + } + layer.confirm('确定删除选中的记录?', {icon: 3, title: '提示信息'}, function (index) { + $.post('admin/'+tableNameRest+'/batch_delete',{ids:ids},function (data) { + if(!data.flag){ + layer.msg("删除失败:"+data.desc); + }else { + _t.layTable().refreshTableFromCurrentPage(); + layer.close(index); + } + }) + }) + }else{ + layer.msg("请选择需要删除的记录"); + } + }) + //excel导出 + $(".exportExcelAll_btn").click(function(){ + var dataMaxExportCount = parseInt($(this).attr("data-max-export-count"))//导出多少行 在界面导出按钮的一个属性配置 如果导出太多就会卡死 + var whereData = _t.layTable().buildQueryFormParams("") + whereData.queryType = mc_constant.QUERY_TYPE_EXPORT_EXCEL;//代表是导出excel类型 参加controller实现 + whereData.page = 1; + whereData.limit = dataMaxExportCount; + var url = 'admin/'+tableNameRest+'/page?' + var arr = [] + for(var i in whereData){ + arr.push(i+"="+whereData[i]) + } + window.location.href=url + arr.join("&") + }); + } + } +//入口函数 + obj.render(); +}(); diff --git a/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_module_category/edit.js b/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_module_category/edit.js new file mode 100644 index 0000000..8f637a0 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_module_category/edit.js @@ -0,0 +1,127 @@ +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ +;!function(){ + var $ = layui.jquery + ,layer = parent.layer === undefined ? layui.layer : top.layer + ,form = layui.form; + var mc_layui_component=youyaboot_all.mc_layui_component + ,mc_util = youyaboot_all.mc_util + ,mc_children = youyaboot_all.mc_children + ,mc_verify = youyaboot_all.mc_verify + ,mc_constant = youyaboot_all.mc_constant + ,mc_rmp = youyaboot_all.mc_rmp + ; + var common_config = { + tableNameRest:"sys_module_category_rest", + tableName:"sys_module_category", + moduleName:"sys_module_category",//sys_module的moduleName + form:{ + } + } + var tableNameRest = common_config.tableNameRest; + var moduleName = common_config.moduleName; + var obj = { + render:function () {//入口 + this.ajaxGetEntityDataAndAutoSetFormUiValue(); + this.submit(); + }, + //初始化表单 + ajaxGetEntityDataAndAutoSetFormUiValue : function () { + var _t = this; + var identify = mc_util.getParameter('identify')//从url中检测主键 + if(identify!=null && identify!=''){//断定是编辑操作 + $.getJSON('admin/'+tableNameRest+"/get/"+identify,{date:new Date().getTime()},function (data) {//获取此实体详情数据 + if(data.flag){ + var entity = data.data + if(entity && entity!=null){ + //把请求到的实体内容自动设置到表单中去 + mc_util.mappingEntityToFormUiValue($("body"),entity); + //禁用外键编辑区域:只有当从更多信息点击进来 才会禁用 单表操作不会执行 + mc_children.disabledFormParentArea(); + //权限 注意xxx-edit.html页面刚进来 是被隐藏的(body标签的layui-hide样式) 这样当权限执行完 才进行一一显示 + mc_rmp.paintBody(moduleName,function () { + var verifyData = mc_layui_component.bindMagicalCoderLayUiComponentFromDetail(common_config);//返回富文本的校验 为了能同步隐藏域 + _t.layuiFormVerify(verifyData); + }) + }else { + layer.msg("此条记录已被删除,请重新查询!"); + } + }else { + layer.msg("查询失败:"+data.desc); + } + }) + }else {//新增操作 + //禁用外键编辑区域:只有当从更多信息点击进来 才会禁用 单表操作不会执行 + mc_children.disabledFormParentArea(); + //权限 + mc_rmp.paintBody(moduleName,function () { + var verifyData =mc_layui_component.bindMagicalCoderLayUiComponentFromDetail(common_config);//返回富文本的校验 为了能同步隐藏域 + _t.layuiFormVerify(verifyData); + $("button[type='reset']").removeClass('layui-hide');//把重置按钮显示处理 + }) + } + }, + //layui的表单校验规则 + layuiFormVerify:function (verifyData) {//verifyData 里如果由内容则是富文本的校验同步 + var verifyData = + $.extend(verifyData,{//这里可以自定义layui的校验规则 自行扩展 参考官网文档 https://www.layui.com/doc/modules/form.html + + }) + form.verify(verifyData); + } + , + //表单提交 + submit : function () { + //重置按钮把外键的默认值清空 + $("button[type='reset']").click(function(){ + $("."+mc_constant.MC_LAY_CLASS_NAME.FORM.foreign_select2).val(null).trigger('change');//固定写法 把搜索下拉重置空值 + return true; + }); + //表单校验 在_bindFormDom方法 + form.on("submit(save)",function(data){ + // 实际使用时的提交信息 + var postData = data.field; + //开关单独处理 + $('body').find("input[lay-skin='switch']").each(function (index,item) { + var name = $(item).attr("name") + var field = data.field + postData[name] = field[name] ? ((field[name]+''=='on' || field[name]+'' == 'true') ? 1 : 0):0;//开关请用0或1来设置值 + }) + //清理上次不通过样式提醒 + for(var name in postData){ + var dom = $("[name='"+name+"']") + mc_verify.clearDangerClass(dom) + } + //MagicalCoder扩展的表单校验 + for(var name in postData){ + var dom = $("[name='"+name+"']") + var value = postData[name] + if(!mc_verify.verify(value,dom)){ + return false; + } + } + //弹出loading + var index = top.layer.msg('数据提交中,请稍候',{icon: 16,time:false,shade:0.8}); + $.post('admin/'+tableNameRest+'/save',postData,function(res){ + top.layer.close(index); + if(res.flag){ + parent.layui.$(".search_btn").click()//parent代表父窗口,因为详情页是iframe弹出来的;让列表页重新执行一次搜索 + //关闭当前层 + var pidx = parent.layui.layer.index + parent.layui.layer.close(pidx-1); + if(postData.id==''){ + top.layer.msg("新增成功:请添加【二级菜单】再配置【角色管理】") + } + }else { + top.layer.msg("保存失败:"+res.desc); + } + }) + return false; + }) + } + } + obj.render(); +}(); diff --git a/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_module_category/list.js b/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_module_category/list.js new file mode 100644 index 0000000..7e016b5 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_module_category/list.js @@ -0,0 +1,317 @@ +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ +//不要被如此多的代码唬住,读懂一个 其他的模块都明白了,之所以写这么多开放出来,主要是为了定制和维护性,您可以随意修改逻辑 适应你的业务场景 +;!function(){ + var $ = layui.jquery + ,layer = parent.layer === undefined ? layui.layer : top.layer + ,table = layui.table; + var mc_children = youyaboot_all.mc_children + ,mc_constant = youyaboot_all.mc_constant + ,mc_util = youyaboot_all.mc_util + ,mc_rmp = youyaboot_all.mc_rmp + ,mc_layui_component = youyaboot_all.mc_layui_component + ; + +// 子表 排序相关 + var CONFIG = { + tableNameRest:"sys_module_category_rest", + tableName:"sys_module_category", + moduleName:"sys_module_category",//sys_module的moduleName + form:{ + }, + childrenPage:[//子页面的一些基础信息 更多信息 + { + tabTitle:"左侧二级菜单", + url:"admin/page_v2/sys_module/list", + mcForeignName:"moduleCategoryId" + } ], + layTable : {//表格内容 到list.html查找即可明白 + elem : '#newsList', + id : "newsListTable" + }, + //排序跟数据库实际字段名的映射 + sortMap:{ + id:'id',moduleCategoryName:'module_category_name',sortNum:'sort_num' + } + }; + //后端请求时候的表模块规则url + var tableNameRest = CONFIG.tableNameRest; + var tableName = CONFIG.tableName; + //表格每一列配置 + var COLS = [[ + {type: "checkbox", /*fixed:"left",*/ width:50},//全选 + {field: 'id', title: '主键', minWidth:100, align:"center",sort:true}, + + {field: 'moduleCategoryName', title: '一级菜单名称', minWidth:200,templet:function (d) { + return '' + } + , sort:true + }, + + {field: 'sortNum', title: '排序', minWidth:200,templet:function (d) { + return '' + } + , sort:true + }, + {title: '操作', minWidth:250, templet:'#newsListOperateTemplate',/*fixed:"right",*/align:"center"}//操作 到list.html页面查找模板对应的html + ]]; + var obj = { + layTable:function () {//表格 + var tableObj = { + render:function () { + this.initTable(); + this.tableOperateEvent(); + }, + //初始化一个表格 + initTable : function () { + var _this = this; + table.render({//这里是layui的table分页写法 具体可参考layui官方文档 + elem: CONFIG.layTable.elem, + url : 'admin/'+tableNameRest+'/page', + cellMinWidth : 95, + page : true,//是否分页 + //height : "full-10",//高度样式 + // height : 500, + limit : 20,//每页多少条 + limits : [10,15,20,25],//下拉 + id : CONFIG.layTable.id, + cols : COLS,//放入列配置 + loading : true, + where : this.buildQueryFormParams(""),//构造查询参数 注意这里layui会缓存你的上一次查询参数 无法清除 只能考虑设置成空字符才能清理 + done:function (res,curr,count) {//请求成功后处理 + if(res.flag){ + mc_rmp.paintBody(CONFIG.moduleName,function () {//权限判断 + //禁用一些外键字段 当更多信息场景时才会触发 + mc_children.disabledTableParentArea(); + //laytable中有很多控件需要初始化 比如日期等 + mc_layui_component.bindMagicalCoderLayUiComponentFromTable(CONFIG,function(){_this.refreshTableFromCurrentPage()}) + //每一行的操作条目事件 + _this.tableOperateEvent() + }) + }else { + layer.msg(res.desc)//弹窗错误提示 + } + } + }); + }, + //表格内的操作事件 + tableOperateEvent : function () { + var _t = this; + var tableDom = $(CONFIG.layTable.elem); + var layFilter = tableDom.attr("lay-filter"); + //列表操作 + table.on('tool('+layFilter+')', function(obj){//操作条事件写法 参考layui + var primaryFields = tableDom.attr("data-primary-fields");//一般是表主键id 提前隐藏放在表区域 搜索list.html + var layEvent = obj.event, + data = obj.data; + var identify = data[primaryFields] + if(layEvent === 'edit'){ //编辑 + _t.editOrAdd(identify) + } else if(layEvent === 'del'){ //删除 + _t._deleteOneTr(identify) + } else if(layEvent === 'children'){ //子表 更多信息 + _t._childrenOneTr(identify) + } + }); + //列表排序 + table.on('sort('+layFilter+')', function(obj){ + var safeOrderBy = "";//排序字段组合 例如xxx_id desc + if(obj.type && obj.type!=null && obj.type!=''){ + safeOrderBy = CONFIG.sortMap[obj.field] + " " +obj.type; + } + _t.refreshTableFromCurrentPage(safeOrderBy);//从当前页重新加载分页数据 + }); + }, + //编辑或者添加 + editOrAdd : function (identify) {//identify 代表主键值 + var title = identify ? '编辑':'添加' + if(!identify){identify = ''} + var index = layui.layer.open({ + skin:'magicalcoder-layer-admin', + title : title, + type : 2,//打开iframe页面 很多人不知道原理:从列表页进入详情页是直接打开新iframe,详情页根据iframe的入参主键,获取详情页数据,然后重绘详情页,整个过程都是js处理 + maxmin: true, + area: ['80%', '80%'], + content : "admin/page_v2/"+tableName+"/edit?identify="+identify+mc_children.buildForeignParam(), + success : function(layero, index){ + setTimeout(function(){ + layui.layer.tips('点击此处返回列表', '.layui-layer-setwin .layui-layer-close', { + tips: 3 + }); + },500) + } + }) + //改变窗口大小时,重置弹窗的宽高,防止超出可视区域(如F12调出debug的操作) + //$(window).on("resize",function(){ + // layui.layer.full(index); + //}) + }, + _deleteOneTr : function (identify) {//删除一行 + var _this = this; + layer.confirm('确定删除此行记录?',{icon:3, title:'提示信息'},function(index){ + $.post('admin/'+tableNameRest+'/delete/'+identify,{},function (data) { + if(!data.flag){ + layer.msg("删除失败:"+data.desc); + }else { + _this.refreshTableFromCurrentPage();//从当前页刷新列表 + layer.close(index); + } + }) + }); + }, + _childrenOneTr : function (identify) {//更多信息:查看子表 + var title = '相关信息' + if(!identify){identify = ''} + if(!CONFIG.childrenPage || CONFIG.childrenPage==null || CONFIG.childrenPage.length<=0){ + layer.msg("未找到任何子表信息") + return; + } + var content = mc_children.buildTabTemplate(tableName,identify,CONFIG.childrenPage);//自表如果是多个 会绘制多个tab标签 + var index = layui.layer.open({skin:'magicalcoder-layer-admin',title : title,type : 1,maxmin: true,area: ['80%', '80%'],content : content, + success : function(layero, index){ + setTimeout(function(){ + layui.layer.tips('点击此处返回列表', '.layui-layer-setwin .layui-layer-close', { + tips: 3 + }); + },500) + } + }) + mc_children.tabClickEvent();//绑定下更多信息下tab点击事件 分别加载不同子表详情 列表界面 + //改变窗口大小时,重置弹窗的宽高,防止超出可视区域(如F12调出debug的操作) + //$(window).on("resize",function(){ + // layui.layer.full(index); + //}) + }, + refreshTableFromCurrentPage : function (safeOrderBy) {//当前页 重新加载 + var whereData = this.buildQueryFormParams(safeOrderBy) + this._startReloadTableFromStartPage(null,whereData) + }, + refreshTableFromPageOne : function () {//从第一页 重新加载 搜索场景使用 清空各种参数 + var whereData = this.buildQueryFormParams("") + this._startReloadTableFromStartPage(1,whereData) + }, + buildQueryFormParams : function (safeOrderBy) {//自动封装查询区域数据 + var _this = this; + var whereData = {} + var queryForm = $(".security_list_query_form")//参考list.html的表单区域样式名称 + //因为layui 的查询有记忆功能,会缓存老的查询条件,这里把重置的条件给清空 赋值null + var radioMemory = {} + queryForm.find(".layui-input").each(function (index,item) { + var type = $(item).attr("type") + var name = $(item).attr("name") + if(name){ + switch (type){ + case "radio" : + if(!radioMemory[name]){ + radioMemory[name] = false; + } + if($(item).is(":checked")){ + _this._autoSetWhereData(whereData,name,item); + radioMemory[name] = true; + } + break; + default : + _this._autoSetWhereData(whereData,name,item); + break; + } + } + }) + // + for(var radioName in radioMemory){ + if(!radioMemory[radioName]){//肯定被layui缓存的查询字段 这里设置""可以清理掉此字段 + whereData[radioName] = "" + } + } + whereData.safeOrderBy = safeOrderBy || "" + return whereData; + }, + _startReloadTableFromStartPage : function (startPage,whereData) { + var reloadTableId = CONFIG.layTable.id + if(startPage==null || !startPage) {//当前页 聪明的记住多少页 + table.reload(reloadTableId,{where: whereData }) + }else { + table.reload(reloadTableId,{ + page: { + curr: startPage //重新从第 几 页开始 + }, + where: whereData + }) + } + }, + _autoSetWhereData : function (whereData,name,item) {//name是表单元素名称 item是表单对象 + var val = $.trim($(item).val()) + whereData[name] = val + } + } + return tableObj; + }, + render:function () {//入口 + var needInitSelect2 = mc_children.disabledFromQueryParentArea();//尝试下先禁用附表区域 多半关联场景才会触发 + mc_layui_component.bindMagicalCoderLayUiComponentFromQuery(CONFIG);//查询区域绘制一下控件 + this.bindAreaEvents(); + this.layTable().render(); + }, + bindAreaEvents : function () { + var _t = this; + //搜索 + $(".search_btn").click(function(){ + _t.layTable().refreshTableFromPageOne(); + }); + //重置 + $("button[type='reset']").click(function(){ + $("."+mc_constant.MC_LAY_CLASS_NAME.FORM.foreign_select2).val(null).trigger('change'); + return true; + }); + //添加 + $(".addNews_btn").click(function(){ + _t.layTable().editOrAdd(); + }) + //批量删除 + $(".delAll_btn").click(function(){ + var laytableElem = CONFIG.layTable.elem + var laytableId = CONFIG.layTable.id + //主键字段 + var primaryFields = $(laytableElem).attr("data-primary-fields") + var checkStatus = table.checkStatus(laytableId), + data = checkStatus.data, + ids = []; + if(data.length > 0) { + for (var i in data) { + ids.push(data[i][primaryFields]); + } + layer.confirm('确定删除选中的记录?', {icon: 3, title: '提示信息'}, function (index) { + $.post('admin/'+tableNameRest+'/batch_delete',{ids:ids},function (data) { + if(!data.flag){ + layer.msg("删除失败:"+data.desc); + }else { + _t.layTable().refreshTableFromCurrentPage(); + layer.close(index); + } + }) + }) + }else{ + layer.msg("请选择需要删除的记录"); + } + }) + //excel导出 + $(".exportExcelAll_btn").click(function(){ + var dataMaxExportCount = parseInt($(this).attr("data-max-export-count"))//导出多少行 在界面导出按钮的一个属性配置 如果导出太多就会卡死 + var whereData = _t.layTable().buildQueryFormParams("") + whereData.queryType = mc_constant.QUERY_TYPE_EXPORT_EXCEL;//代表是导出excel类型 参加controller实现 + whereData.page = 1; + whereData.limit = dataMaxExportCount; + var url = 'admin/'+tableNameRest+'/page?' + var arr = [] + for(var i in whereData){ + arr.push(i+"="+whereData[i]) + } + window.location.href=url + arr.join("&") + }); + } + } +//入口函数 + obj.render(); +}(); diff --git a/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_permission/edit.js b/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_permission/edit.js new file mode 100644 index 0000000..87a39e8 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_permission/edit.js @@ -0,0 +1,124 @@ +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ +;!function(){ + var $ = layui.jquery + ,layer = parent.layer === undefined ? layui.layer : top.layer + ,form = layui.form; + var mc_layui_component=youyaboot_all.mc_layui_component + ,mc_util = youyaboot_all.mc_util + ,mc_children = youyaboot_all.mc_children + ,mc_verify = youyaboot_all.mc_verify + ,mc_constant = youyaboot_all.mc_constant + ,mc_rmp = youyaboot_all.mc_rmp + ; + var common_config = { + tableNameRest:"sys_permission_rest", + tableName:"sys_permission", + moduleName:"sys_permission",//sys_module的moduleName + form:{ + } + } + var tableNameRest = common_config.tableNameRest; + var moduleName = common_config.moduleName; + var obj = { + render:function () {//入口 + this.ajaxGetEntityDataAndAutoSetFormUiValue(); + this.submit(); + }, + //初始化表单 + ajaxGetEntityDataAndAutoSetFormUiValue : function () { + var _t = this; + var identify = mc_util.getParameter('identify')//从url中检测主键 + if(identify!=null && identify!=''){//断定是编辑操作 + $.getJSON('admin/'+tableNameRest+"/get/"+identify,{date:new Date().getTime()},function (data) {//获取此实体详情数据 + if(data.flag){ + var entity = data.data + if(entity && entity!=null){ + //把请求到的实体内容自动设置到表单中去 + mc_util.mappingEntityToFormUiValue($("body"),entity); + //禁用外键编辑区域:只有当从更多信息点击进来 才会禁用 单表操作不会执行 + mc_children.disabledFormParentArea(); + //权限 注意xxx-edit.html页面刚进来 是被隐藏的(body标签的layui-hide样式) 这样当权限执行完 才进行一一显示 + mc_rmp.paintBody(moduleName,function () { + var verifyData = mc_layui_component.bindMagicalCoderLayUiComponentFromDetail(common_config);//返回富文本的校验 为了能同步隐藏域 + _t.layuiFormVerify(verifyData); + }) + }else { + layer.msg("此条记录已被删除,请重新查询!"); + } + }else { + layer.msg("查询失败:"+data.desc); + } + }) + }else {//新增操作 + //禁用外键编辑区域:只有当从更多信息点击进来 才会禁用 单表操作不会执行 + mc_children.disabledFormParentArea(); + //权限 + mc_rmp.paintBody(moduleName,function () { + var verifyData =mc_layui_component.bindMagicalCoderLayUiComponentFromDetail(common_config);//返回富文本的校验 为了能同步隐藏域 + _t.layuiFormVerify(verifyData); + $("button[type='reset']").removeClass('layui-hide');//把重置按钮显示处理 + }) + } + }, + //layui的表单校验规则 + layuiFormVerify:function (verifyData) {//verifyData 里如果由内容则是富文本的校验同步 + var verifyData = + $.extend(verifyData,{//这里可以自定义layui的校验规则 自行扩展 参考官网文档 https://www.layui.com/doc/modules/form.html + + }) + form.verify(verifyData); + } + , + //表单提交 + submit : function () { + //重置按钮把外键的默认值清空 + $("button[type='reset']").click(function(){ + $("."+mc_constant.MC_LAY_CLASS_NAME.FORM.foreign_select2).val(null).trigger('change');//固定写法 把搜索下拉重置空值 + return true; + }); + //表单校验 在_bindFormDom方法 + form.on("submit(save)",function(data){ + // 实际使用时的提交信息 + var postData = data.field; + //开关单独处理 + $('body').find("input[lay-skin='switch']").each(function (index,item) { + var name = $(item).attr("name") + var field = data.field + postData[name] = field[name] ? ((field[name]+''=='on' || field[name]+'' == 'true') ? 1 : 0):0;//开关请用0或1来设置值 + }) + //清理上次不通过样式提醒 + for(var name in postData){ + var dom = $("[name='"+name+"']") + mc_verify.clearDangerClass(dom) + } + //MagicalCoder扩展的表单校验 + for(var name in postData){ + var dom = $("[name='"+name+"']") + var value = postData[name] + if(!mc_verify.verify(value,dom)){ + return false; + } + } + //弹出loading + var index = top.layer.msg('数据提交中,请稍候',{icon: 16,time:false,shade:0.8}); + $.post('admin/'+tableNameRest+'/save',postData,function(res){ + top.layer.close(index); + if(res.flag){ + parent.layui.$(".search_btn").click()//parent代表父窗口,因为详情页是iframe弹出来的;让列表页重新执行一次搜索 + //关闭当前层 + var pidx = parent.layui.layer.index + parent.layui.layer.close(pidx-1); + }else { + top.layer.msg("保存失败:"+res.desc); + } + }) + return false; + }) + } + } + obj.render(); +}(); diff --git a/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_permission/list.js b/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_permission/list.js new file mode 100644 index 0000000..d3303ee --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_permission/list.js @@ -0,0 +1,330 @@ +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ +//不要被如此多的代码唬住,读懂一个 其他的模块都明白了,之所以写这么多开放出来,主要是为了定制和维护性,您可以随意修改逻辑 适应你的业务场景 +;!function(){ + var $ = layui.jquery + ,layer = parent.layer === undefined ? layui.layer : top.layer + ,table = layui.table; + var mc_children = youyaboot_all.mc_children + ,mc_constant = youyaboot_all.mc_constant + ,mc_util = youyaboot_all.mc_util + ,mc_rmp = youyaboot_all.mc_rmp + ,mc_layui_component = youyaboot_all.mc_layui_component + ; + +// 子表 排序相关 + var CONFIG = { + tableNameRest:"sys_permission_rest", + tableName:"sys_permission", + moduleName:"sys_permission",//sys_module的moduleName + form:{ + }, + childrenPage:[//子页面的一些基础信息 更多信息 + { + tabTitle:"角色模块权限", + url:"admin/page_v2/sys_role_module_permission/list", + mcForeignName:"permissionId" + } ], + layTable : {//表格内容 到list.html查找即可明白 + elem : '#newsList', + id : "newsListTable" + }, + //排序跟数据库实际字段名的映射 + sortMap:{ + filterPlatform:'filter_platform',permissionName:'permission_name',backendUrlReg:'backend_url_reg',frontDom:'front_dom',frontAction:'front_action',moduleId:'module_id' + } + }; + //后端请求时候的表模块规则url + var tableNameRest = CONFIG.tableNameRest; + var tableName = CONFIG.tableName; + //表格每一列配置 + var COLS = [[ + {type: "checkbox", /*fixed:"left",*/ width:50},//全选 + {field: 'moduleId', title: '所属二级菜单', align:'center', minWidth:250, templet:function (d) { + var value = (!d.moduleId || d.moduleId==null) ? '' : d.moduleId + //var option = '' + return '' + },sort:true + }, + + {field: 'permissionName', title: '权限名称', minWidth:200,templet:function (d) { + return '' + } + , sort:true + }, + {field: 'frontAction', title: '前端处理方式',minWidth:250, align:'center', templet:'#frontActionTemplate',sort:true}, + {field: 'filterPlatform', title: '规则适用端',minWidth:250, align:'center', templet:'#filterPlatformTemplate',sort:true}, + + {field: 'frontDom', title: 'DOM前端Key', minWidth:300,templet:function (d) { + return '' + } + , sort:true + }, + + {field: 'backendUrlReg', title: '后端正则地址', minWidth:300,templet:function (d) { + return '' + } + , sort:true + }, + {title: '操作', minWidth:200, templet:'#newsListOperateTemplate',/*fixed:"right",*/align:"center"}//操作 到list.html页面查找模板对应的html + ]]; + var obj = { + layTable:function () {//表格 + var tableObj = { + render:function () { + this.initTable(); + this.tableOperateEvent(); + }, + //初始化一个表格 + initTable : function () { + var _this = this; + table.render({//这里是layui的table分页写法 具体可参考layui官方文档 + elem: CONFIG.layTable.elem, + url : 'admin/'+tableNameRest+'/page', + cellMinWidth : 95, + page : true,//是否分页 + //height : "full-10",//高度样式 + // height : 500, + limit : 20,//每页多少条 + limits : [10,15,20,25],//下拉 + id : CONFIG.layTable.id, + cols : COLS,//放入列配置 + loading : true, + where : this.buildQueryFormParams(""),//构造查询参数 注意这里layui会缓存你的上一次查询参数 无法清除 只能考虑设置成空字符才能清理 + done:function (res,curr,count) {//请求成功后处理 + if(res.flag){ + mc_rmp.paintBody(CONFIG.moduleName,function () {//权限判断 + //禁用一些外键字段 当更多信息场景时才会触发 + mc_children.disabledTableParentArea(); + //laytable中有很多控件需要初始化 比如日期等 + mc_layui_component.bindMagicalCoderLayUiComponentFromTable(CONFIG,function(){_this.refreshTableFromCurrentPage()}) + //每一行的操作条目事件 + _this.tableOperateEvent() + }) + }else { + layer.msg(res.desc)//弹窗错误提示 + } + } + }); + }, + //表格内的操作事件 + tableOperateEvent : function () { + var _t = this; + var tableDom = $(CONFIG.layTable.elem); + var layFilter = tableDom.attr("lay-filter"); + //列表操作 + table.on('tool('+layFilter+')', function(obj){//操作条事件写法 参考layui + var primaryFields = tableDom.attr("data-primary-fields");//一般是表主键id 提前隐藏放在表区域 搜索list.html + var layEvent = obj.event, + data = obj.data; + var identify = data[primaryFields] + if(layEvent === 'edit'){ //编辑 + _t.editOrAdd(identify) + } else if(layEvent === 'del'){ //删除 + _t._deleteOneTr(identify) + } else if(layEvent === 'children'){ //子表 更多信息 + _t._childrenOneTr(identify) + } + }); + //列表排序 + table.on('sort('+layFilter+')', function(obj){ + var safeOrderBy = "";//排序字段组合 例如xxx_id desc + if(obj.type && obj.type!=null && obj.type!=''){ + safeOrderBy = CONFIG.sortMap[obj.field] + " " +obj.type; + } + _t.refreshTableFromCurrentPage(safeOrderBy);//从当前页重新加载分页数据 + }); + }, + //编辑或者添加 + editOrAdd : function (identify) {//identify 代表主键值 + var title = identify ? '编辑':'添加' + if(!identify){identify = ''} + var index = layui.layer.open({ + skin:'magicalcoder-layer-admin', + title : title, + type : 2,//打开iframe页面 很多人不知道原理:从列表页进入详情页是直接打开新iframe,详情页根据iframe的入参主键,获取详情页数据,然后重绘详情页,整个过程都是js处理 + maxmin: true, + area: ['80%', '80%'], + content : "admin/page_v2/"+tableName+"/edit?identify="+identify+mc_children.buildForeignParam(), + success : function(layero, index){ + setTimeout(function(){ + layui.layer.tips('点击此处返回列表', '.layui-layer-setwin .layui-layer-close', { + tips: 3 + }); + },500) + } + }) + //改变窗口大小时,重置弹窗的宽高,防止超出可视区域(如F12调出debug的操作) + //$(window).on("resize",function(){ + // layui.layer.full(index); + //}) + }, + _deleteOneTr : function (identify) {//删除一行 + var _this = this; + layer.confirm('确定删除此行记录?',{icon:3, title:'提示信息'},function(index){ + $.post('admin/'+tableNameRest+'/delete/'+identify,{},function (data) { + if(!data.flag){ + layer.msg("删除失败:"+data.desc); + }else { + _this.refreshTableFromCurrentPage();//从当前页刷新列表 + layer.close(index); + } + }) + }); + }, + _childrenOneTr : function (identify) {//更多信息:查看子表 + var title = '相关信息' + if(!identify){identify = ''} + if(!CONFIG.childrenPage || CONFIG.childrenPage==null || CONFIG.childrenPage.length<=0){ + layer.msg("未找到任何子表信息") + return; + } + var content = mc_children.buildTabTemplate(tableName,identify,CONFIG.childrenPage);//自表如果是多个 会绘制多个tab标签 + var index = layui.layer.open({skin:'magicalcoder-layer-admin',title : title,type : 1,maxmin: true,area: ['80%', '80%'],content : content, + success : function(layero, index){ + setTimeout(function(){ + layui.layer.tips('点击此处返回列表', '.layui-layer-setwin .layui-layer-close', { + tips: 3 + }); + },500) + } + }) + mc_children.tabClickEvent();//绑定下更多信息下tab点击事件 分别加载不同子表详情 列表界面 + //改变窗口大小时,重置弹窗的宽高,防止超出可视区域(如F12调出debug的操作) + //$(window).on("resize",function(){ + // layui.layer.full(index); + //}) + }, + refreshTableFromCurrentPage : function (safeOrderBy) {//当前页 重新加载 + var whereData = this.buildQueryFormParams(safeOrderBy) + this._startReloadTableFromStartPage(null,whereData) + }, + refreshTableFromPageOne : function () {//从第一页 重新加载 搜索场景使用 清空各种参数 + var whereData = this.buildQueryFormParams("") + this._startReloadTableFromStartPage(1,whereData) + }, + buildQueryFormParams : function (safeOrderBy) {//自动封装查询区域数据 + var _this = this; + var whereData = {} + var queryForm = $(".security_list_query_form")//参考list.html的表单区域样式名称 + //因为layui 的查询有记忆功能,会缓存老的查询条件,这里把重置的条件给清空 赋值null + var radioMemory = {} + queryForm.find(".layui-input").each(function (index,item) { + var type = $(item).attr("type") + var name = $(item).attr("name") + if(name){ + switch (type){ + case "radio" : + if(!radioMemory[name]){ + radioMemory[name] = false; + } + if($(item).is(":checked")){ + _this._autoSetWhereData(whereData,name,item); + radioMemory[name] = true; + } + break; + default : + _this._autoSetWhereData(whereData,name,item); + break; + } + } + }) + // + for(var radioName in radioMemory){ + if(!radioMemory[radioName]){//肯定被layui缓存的查询字段 这里设置""可以清理掉此字段 + whereData[radioName] = "" + } + } + whereData.safeOrderBy = safeOrderBy || "" + return whereData; + }, + _startReloadTableFromStartPage : function (startPage,whereData) { + var reloadTableId = CONFIG.layTable.id + if(startPage==null || !startPage) {//当前页 聪明的记住多少页 + table.reload(reloadTableId,{where: whereData }) + }else { + table.reload(reloadTableId,{ + page: { + curr: startPage //重新从第 几 页开始 + }, + where: whereData + }) + } + }, + _autoSetWhereData : function (whereData,name,item) {//name是表单元素名称 item是表单对象 + var val = $.trim($(item).val()) + whereData[name] = val + } + } + return tableObj; + }, + render:function () {//入口 + var needInitSelect2 = mc_children.disabledFromQueryParentArea();//尝试下先禁用附表区域 多半关联场景才会触发 + mc_layui_component.bindMagicalCoderLayUiComponentFromQuery(CONFIG);//查询区域绘制一下控件 + this.bindAreaEvents(); + this.layTable().render(); + }, + bindAreaEvents : function () { + var _t = this; + //搜索 + $(".search_btn").click(function(){ + _t.layTable().refreshTableFromPageOne(); + }); + //重置 + $("button[type='reset']").click(function(){ + $("."+mc_constant.MC_LAY_CLASS_NAME.FORM.foreign_select2).val(null).trigger('change'); + return true; + }); + //添加 + $(".addNews_btn").click(function(){ + _t.layTable().editOrAdd(); + }) + //批量删除 + $(".delAll_btn").click(function(){ + var laytableElem = CONFIG.layTable.elem + var laytableId = CONFIG.layTable.id + //主键字段 + var primaryFields = $(laytableElem).attr("data-primary-fields") + var checkStatus = table.checkStatus(laytableId), + data = checkStatus.data, + ids = []; + if(data.length > 0) { + for (var i in data) { + ids.push(data[i][primaryFields]); + } + layer.confirm('确定删除选中的记录?', {icon: 3, title: '提示信息'}, function (index) { + $.post('admin/'+tableNameRest+'/batch_delete',{ids:ids},function (data) { + if(!data.flag){ + layer.msg("删除失败:"+data.desc); + }else { + _t.layTable().refreshTableFromCurrentPage(); + layer.close(index); + } + }) + }) + }else{ + layer.msg("请选择需要删除的记录"); + } + }) + //excel导出 + $(".exportExcelAll_btn").click(function(){ + var dataMaxExportCount = parseInt($(this).attr("data-max-export-count"))//导出多少行 在界面导出按钮的一个属性配置 如果导出太多就会卡死 + var whereData = _t.layTable().buildQueryFormParams("") + whereData.queryType = mc_constant.QUERY_TYPE_EXPORT_EXCEL;//代表是导出excel类型 参加controller实现 + whereData.page = 1; + whereData.limit = dataMaxExportCount; + var url = 'admin/'+tableNameRest+'/page?' + var arr = [] + for(var i in whereData){ + arr.push(i+"="+whereData[i]) + } + window.location.href=url + arr.join("&") + }); + } + } +//入口函数 + obj.render(); +}(); diff --git a/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_role/edit.js b/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_role/edit.js new file mode 100644 index 0000000..c9bd6e2 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_role/edit.js @@ -0,0 +1,124 @@ +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ +;!function(){ + var $ = layui.jquery + ,layer = parent.layer === undefined ? layui.layer : top.layer + ,form = layui.form; + var mc_layui_component=youyaboot_all.mc_layui_component + ,mc_util = youyaboot_all.mc_util + ,mc_children = youyaboot_all.mc_children + ,mc_verify = youyaboot_all.mc_verify + ,mc_constant = youyaboot_all.mc_constant + ,mc_rmp = youyaboot_all.mc_rmp + ; + var common_config = { + tableNameRest:"sys_role_rest", + tableName:"sys_role", + moduleName:"sys_role",//sys_module的moduleName + form:{ + } + } + var tableNameRest = common_config.tableNameRest; + var moduleName = common_config.moduleName; + var obj = { + render:function () {//入口 + this.ajaxGetEntityDataAndAutoSetFormUiValue(); + this.submit(); + }, + //初始化表单 + ajaxGetEntityDataAndAutoSetFormUiValue : function () { + var _t = this; + var identify = mc_util.getParameter('identify')//从url中检测主键 + if(identify!=null && identify!=''){//断定是编辑操作 + $.getJSON('admin/'+tableNameRest+"/get/"+identify,{date:new Date().getTime()},function (data) {//获取此实体详情数据 + if(data.flag){ + var entity = data.data + if(entity && entity!=null){ + //把请求到的实体内容自动设置到表单中去 + mc_util.mappingEntityToFormUiValue($("body"),entity); + //禁用外键编辑区域:只有当从更多信息点击进来 才会禁用 单表操作不会执行 + mc_children.disabledFormParentArea(); + //权限 注意xxx-edit.html页面刚进来 是被隐藏的(body标签的layui-hide样式) 这样当权限执行完 才进行一一显示 + mc_rmp.paintBody(moduleName,function () { + var verifyData = mc_layui_component.bindMagicalCoderLayUiComponentFromDetail(common_config);//返回富文本的校验 为了能同步隐藏域 + _t.layuiFormVerify(verifyData); + }) + }else { + layer.msg("此条记录已被删除,请重新查询!"); + } + }else { + layer.msg("查询失败:"+data.desc); + } + }) + }else {//新增操作 + //禁用外键编辑区域:只有当从更多信息点击进来 才会禁用 单表操作不会执行 + mc_children.disabledFormParentArea(); + //权限 + mc_rmp.paintBody(moduleName,function () { + var verifyData =mc_layui_component.bindMagicalCoderLayUiComponentFromDetail(common_config);//返回富文本的校验 为了能同步隐藏域 + _t.layuiFormVerify(verifyData); + $("button[type='reset']").removeClass('layui-hide');//把重置按钮显示处理 + }) + } + }, + //layui的表单校验规则 + layuiFormVerify:function (verifyData) {//verifyData 里如果由内容则是富文本的校验同步 + var verifyData = + $.extend(verifyData,{//这里可以自定义layui的校验规则 自行扩展 参考官网文档 https://www.layui.com/doc/modules/form.html + + }) + form.verify(verifyData); + } + , + //表单提交 + submit : function () { + //重置按钮把外键的默认值清空 + $("button[type='reset']").click(function(){ + $("."+mc_constant.MC_LAY_CLASS_NAME.FORM.foreign_select2).val(null).trigger('change');//固定写法 把搜索下拉重置空值 + return true; + }); + //表单校验 在_bindFormDom方法 + form.on("submit(save)",function(data){ + // 实际使用时的提交信息 + var postData = data.field; + //开关单独处理 + $('body').find("input[lay-skin='switch']").each(function (index,item) { + var name = $(item).attr("name") + var field = data.field + postData[name] = field[name] ? ((field[name]+''=='on' || field[name]+'' == 'true') ? 1 : 0):0;//开关请用0或1来设置值 + }) + //清理上次不通过样式提醒 + for(var name in postData){ + var dom = $("[name='"+name+"']") + mc_verify.clearDangerClass(dom) + } + //MagicalCoder扩展的表单校验 + for(var name in postData){ + var dom = $("[name='"+name+"']") + var value = postData[name] + if(!mc_verify.verify(value,dom)){ + return false; + } + } + //弹出loading + var index = top.layer.msg('数据提交中,请稍候',{icon: 16,time:false,shade:0.8}); + $.post('admin/'+tableNameRest+'/save',postData,function(res){ + top.layer.close(index); + if(res.flag){ + parent.layui.$(".search_btn").click()//parent代表父窗口,因为详情页是iframe弹出来的;让列表页重新执行一次搜索 + //关闭当前层 + var pidx = parent.layui.layer.index + parent.layui.layer.close(pidx-1); + }else { + top.layer.msg("保存失败:"+res.desc); + } + }) + return false; + }) + } + } + obj.render(); +}(); diff --git a/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_role/list.js b/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_role/list.js new file mode 100644 index 0000000..d26dd86 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_role/list.js @@ -0,0 +1,330 @@ +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ +//不要被如此多的代码唬住,读懂一个 其他的模块都明白了,之所以写这么多开放出来,主要是为了定制和维护性,您可以随意修改逻辑 适应你的业务场景 +;!function(){ + var $ = layui.jquery + ,layer = parent.layer === undefined ? layui.layer : top.layer + ,table = layui.table; + var mc_children = youyaboot_all.mc_children + ,mc_constant = youyaboot_all.mc_constant + ,mc_util = youyaboot_all.mc_util + ,mc_rmp = youyaboot_all.mc_rmp + ,mc_layui_component = youyaboot_all.mc_layui_component + ; + +// 子表 排序相关 + var CONFIG = { + tableNameRest:"sys_role_rest", + tableName:"sys_role", + moduleName:"sys_role",//sys_module的moduleName + form:{ + }, + childrenPage:[//子页面的一些基础信息 更多信息 + { + tabTitle:"管理员", + url:"admin/page_v2/sys_admin_user/list", + mcForeignName:"roleId" + }, { + tabTitle:"角色模块权限", + url:"admin/page_v2/sys_role_module_permission/list", + mcForeignName:"roleId" + } ], + layTable : {//表格内容 到list.html查找即可明白 + elem : '#newsList', + id : "newsListTable" + }, + //排序跟数据库实际字段名的映射 + sortMap:{ + id:'id',roleName:'role_name' + } + }; + //后端请求时候的表模块规则url + var tableNameRest = CONFIG.tableNameRest; + var tableName = CONFIG.tableName; + //表格每一列配置 + var COLS = [[ + {type: "checkbox", /*fixed:"left",*/ width:50},//全选 + {field: 'id', title: '主键', minWidth:100, align:"center",sort:true}, + + {field: 'roleName', title: '角色名', minWidth:200,templet:function (d) { + return '' + } + , sort:true + }, + {title: '操作', minWidth:250, templet:'#newsListOperateTemplate',/*fixed:"right",*/align:"center"}//操作 到list.html页面查找模板对应的html + ]]; + var obj = { + layTable:function () {//表格 + var tableObj = { + render:function () { + this.initTable(); + this.tableOperateEvent(); + }, + //初始化一个表格 + initTable : function () { + var _this = this; + table.render({//这里是layui的table分页写法 具体可参考layui官方文档 + elem: CONFIG.layTable.elem, + url : 'admin/'+tableNameRest+'/page', + cellMinWidth : 95, + page : true,//是否分页 + //height : "full-10",//高度样式 + // height : 500, + limit : 20,//每页多少条 + limits : [10,15,20,25],//下拉 + id : CONFIG.layTable.id, + cols : COLS,//放入列配置 + loading : true, + where : this.buildQueryFormParams(""),//构造查询参数 注意这里layui会缓存你的上一次查询参数 无法清除 只能考虑设置成空字符才能清理 + done:function (res,curr,count) {//请求成功后处理 + if(res.flag){ + mc_rmp.paintBody(CONFIG.moduleName,function () {//权限判断 + //禁用一些外键字段 当更多信息场景时才会触发 + mc_children.disabledTableParentArea(); + //laytable中有很多控件需要初始化 比如日期等 + mc_layui_component.bindMagicalCoderLayUiComponentFromTable(CONFIG,function(){_this.refreshTableFromCurrentPage()}) + //每一行的操作条目事件 + _this.tableOperateEvent() + }) + }else { + layer.msg(res.desc)//弹窗错误提示 + } + } + }); + }, + //表格内的操作事件 + tableOperateEvent : function () { + var _t = this; + var tableDom = $(CONFIG.layTable.elem); + var layFilter = tableDom.attr("lay-filter"); + //列表操作 + table.on('tool('+layFilter+')', function(obj){//操作条事件写法 参考layui + var primaryFields = tableDom.attr("data-primary-fields");//一般是表主键id 提前隐藏放在表区域 搜索list.html + var layEvent = obj.event, + data = obj.data; + var identify = data[primaryFields] + if(layEvent === 'edit'){ //编辑 + _t.editOrAdd(identify) + } else if(layEvent === 'del'){ //删除 + _t._deleteOneTr(identify) + } else if(layEvent === 'children'){ //子表 更多信息 + _t._childrenOneTr(identify) + }else if(layEvent == 'priority'){ + layui.layer.open({ + skin:'magicalcoder-layer-admin', + title:'分配权限', + type : 2, + maxmin: true, + area: ['80%', '80%'], + content : "admin/page_v2/sys_role/permission?roleId="+identify + ,btn:["保存"] + ,yes: function(index, layero){ + var body = layui.layer.getChildFrame('body', index); + body.find("[name='submit']").click(); + layui.layer.close(index) + } + }); + } + }); + //列表排序 + table.on('sort('+layFilter+')', function(obj){ + var safeOrderBy = "";//排序字段组合 例如xxx_id desc + if(obj.type && obj.type!=null && obj.type!=''){ + safeOrderBy = CONFIG.sortMap[obj.field] + " " +obj.type; + } + _t.refreshTableFromCurrentPage(safeOrderBy);//从当前页重新加载分页数据 + }); + }, + //编辑或者添加 + editOrAdd : function (identify) {//identify 代表主键值 + var title = identify ? '编辑':'添加' + if(!identify){identify = ''} + var index = layui.layer.open({ + skin:'magicalcoder-layer-admin', + title : title, + type : 2,//打开iframe页面 很多人不知道原理:从列表页进入详情页是直接打开新iframe,详情页根据iframe的入参主键,获取详情页数据,然后重绘详情页,整个过程都是js处理 + maxmin: true, + area: ['80%', '80%'], + content : "admin/page_v2/"+tableName+"/edit?identify="+identify+mc_children.buildForeignParam(), + success : function(layero, index){ + setTimeout(function(){ + layui.layer.tips('点击此处返回列表', '.layui-layer-setwin .layui-layer-close', { + tips: 3 + }); + },500) + } + }) + //改变窗口大小时,重置弹窗的宽高,防止超出可视区域(如F12调出debug的操作) + //$(window).on("resize",function(){ + // layui.layer.full(index); + //}) + }, + _deleteOneTr : function (identify) {//删除一行 + var _this = this; + layer.confirm('确定删除此行记录?',{icon:3, title:'提示信息'},function(index){ + $.post('admin/'+tableNameRest+'/delete/'+identify,{},function (data) { + if(!data.flag){ + layer.msg("删除失败:"+data.desc); + }else { + _this.refreshTableFromCurrentPage();//从当前页刷新列表 + layer.close(index); + } + }) + }); + }, + _childrenOneTr : function (identify) {//更多信息:查看子表 + var title = '相关信息' + if(!identify){identify = ''} + if(!CONFIG.childrenPage || CONFIG.childrenPage==null || CONFIG.childrenPage.length<=0){ + layer.msg("未找到任何子表信息") + return; + } + var content = mc_children.buildTabTemplate(tableName,identify,CONFIG.childrenPage);//自表如果是多个 会绘制多个tab标签 + var index = layui.layer.open({skin:'magicalcoder-layer-admin',title : title,type : 1,maxmin: true,area: ['80%', '80%'],content : content, + success : function(layero, index){ + setTimeout(function(){ + layui.layer.tips('点击此处返回列表', '.layui-layer-setwin .layui-layer-close', { + tips: 3 + }); + },500) + } + }) + mc_children.tabClickEvent();//绑定下更多信息下tab点击事件 分别加载不同子表详情 列表界面 + //改变窗口大小时,重置弹窗的宽高,防止超出可视区域(如F12调出debug的操作) + //$(window).on("resize",function(){ + // layui.layer.full(index); + //}) + }, + refreshTableFromCurrentPage : function (safeOrderBy) {//当前页 重新加载 + var whereData = this.buildQueryFormParams(safeOrderBy) + this._startReloadTableFromStartPage(null,whereData) + }, + refreshTableFromPageOne : function () {//从第一页 重新加载 搜索场景使用 清空各种参数 + var whereData = this.buildQueryFormParams("") + this._startReloadTableFromStartPage(1,whereData) + }, + buildQueryFormParams : function (safeOrderBy) {//自动封装查询区域数据 + var _this = this; + var whereData = {} + var queryForm = $(".security_list_query_form")//参考list.html的表单区域样式名称 + //因为layui 的查询有记忆功能,会缓存老的查询条件,这里把重置的条件给清空 赋值null + var radioMemory = {} + queryForm.find(".layui-input").each(function (index,item) { + var type = $(item).attr("type") + var name = $(item).attr("name") + if(name){ + switch (type){ + case "radio" : + if(!radioMemory[name]){ + radioMemory[name] = false; + } + if($(item).is(":checked")){ + _this._autoSetWhereData(whereData,name,item); + radioMemory[name] = true; + } + break; + default : + _this._autoSetWhereData(whereData,name,item); + break; + } + } + }) + // + for(var radioName in radioMemory){ + if(!radioMemory[radioName]){//肯定被layui缓存的查询字段 这里设置""可以清理掉此字段 + whereData[radioName] = "" + } + } + whereData.safeOrderBy = safeOrderBy || "" + return whereData; + }, + _startReloadTableFromStartPage : function (startPage,whereData) { + var reloadTableId = CONFIG.layTable.id + if(startPage==null || !startPage) {//当前页 聪明的记住多少页 + table.reload(reloadTableId,{where: whereData }) + }else { + table.reload(reloadTableId,{ + page: { + curr: startPage //重新从第 几 页开始 + }, + where: whereData + }) + } + }, + _autoSetWhereData : function (whereData,name,item) {//name是表单元素名称 item是表单对象 + var val = $.trim($(item).val()) + whereData[name] = val + } + } + return tableObj; + }, + render:function () {//入口 + var needInitSelect2 = mc_children.disabledFromQueryParentArea();//尝试下先禁用附表区域 多半关联场景才会触发 + mc_layui_component.bindMagicalCoderLayUiComponentFromQuery(CONFIG);//查询区域绘制一下控件 + this.bindAreaEvents(); + this.layTable().render(); + }, + bindAreaEvents : function () { + var _t = this; + //搜索 + $(".search_btn").click(function(){ + _t.layTable().refreshTableFromPageOne(); + }); + //重置 + $("button[type='reset']").click(function(){ + $("."+mc_constant.MC_LAY_CLASS_NAME.FORM.foreign_select2).val(null).trigger('change'); + return true; + }); + //添加 + $(".addNews_btn").click(function(){ + _t.layTable().editOrAdd(); + }) + //批量删除 + $(".delAll_btn").click(function(){ + var laytableElem = CONFIG.layTable.elem + var laytableId = CONFIG.layTable.id + //主键字段 + var primaryFields = $(laytableElem).attr("data-primary-fields") + var checkStatus = table.checkStatus(laytableId), + data = checkStatus.data, + ids = []; + if(data.length > 0) { + for (var i in data) { + ids.push(data[i][primaryFields]); + } + layer.confirm('确定删除选中的记录?', {icon: 3, title: '提示信息'}, function (index) { + $.post('admin/'+tableNameRest+'/batch_delete',{ids:ids},function (data) { + if(!data.flag){ + layer.msg("删除失败:"+data.desc); + }else { + _t.layTable().refreshTableFromCurrentPage(); + layer.close(index); + } + }) + }) + }else{ + layer.msg("请选择需要删除的记录"); + } + }) + //excel导出 + $(".exportExcelAll_btn").click(function(){ + var dataMaxExportCount = parseInt($(this).attr("data-max-export-count"))//导出多少行 在界面导出按钮的一个属性配置 如果导出太多就会卡死 + var whereData = _t.layTable().buildQueryFormParams("") + whereData.queryType = mc_constant.QUERY_TYPE_EXPORT_EXCEL;//代表是导出excel类型 参加controller实现 + whereData.page = 1; + whereData.limit = dataMaxExportCount; + var url = 'admin/'+tableNameRest+'/page?' + var arr = [] + for(var i in whereData){ + arr.push(i+"="+whereData[i]) + } + window.location.href=url + arr.join("&") + }); + } + } +//入口函数 + obj.render(); +}(); diff --git a/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_role/permission.js b/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_role/permission.js new file mode 100644 index 0000000..41c99dd --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_role/permission.js @@ -0,0 +1,34 @@ + +;!function(){ + var form = layui.form,$ = layui.jquery,layer = parent.layer === undefined ? layui.layer : top.layer + var authtree = youyaboot_all.authtree, + mc_util = youyaboot_all.mc_util; + + var authTreeId = "#auth-tree" + + var roleId = mc_util.getParameter("roleId"); + if(roleId!=''){ + $.getJSON("admin/rest_rmp/tree_data/"+roleId,{date:new Date().getTime()},function (data) { + if(data.flag){ + authtree.render(authTreeId,data.data,{inputname: 'authids[]', openall: true}) + }else { + layer.msg("获取权限树失败:"+data.desc) + } + }) + }else { + layer.msg("哎呀,出错了") + } + + form.on("submit(save)",function(data){ + var authids = authtree.getChecked(authTreeId); + $.post('admin/rest_rmp/save_tree_data/'+roleId,{ids:authids},function (data) { + if(!data.flag){ + layer.msg(data.desc) + }else { + layer.msg("授权成功,请退出账号重新登录方可生效!") + } + }) + return false; + }) +}(); + diff --git a/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_role_module_permission/edit.js b/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_role_module_permission/edit.js new file mode 100644 index 0000000..c187fdc --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_role_module_permission/edit.js @@ -0,0 +1,25 @@ +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ +layui.config({ + base : "assets/" +}).extend({ + "magicalcoderedit" : "magicalcoder/v001/rmp/magicalcoderedit" +}) +layui.use(["magicalcoderedit"],function(){ + var magicalcoderedit = layui.magicalcoderedit( + { + tableNameRest:"sys_role_module_permission_rest", + tableName:"sys_role_module_permission", + moduleName:"sys_role_module_permission"//sys_module的moduleName + } + ); + //在提交表单前执行回调方法 + var submitBeforeCallBack = function (postData) { + return true;//则继续提交 + } + magicalcoderedit.bindFormArea(); + magicalcoderedit.submitEvents(submitBeforeCallBack); +}) diff --git a/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_role_module_permission/list.js b/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_role_module_permission/list.js new file mode 100644 index 0000000..b2f113c --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/admin/sys_role_module_permission/list.js @@ -0,0 +1,65 @@ +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +layui.config({ + base : "assets/" +}).extend({ + "magicalcoderlist" : "magicalcoder/v001/rmp/magicalcoderlist" +}) +layui.use(['magicalcoderlist'],function(){ + var magicalcoderlist = layui.magicalcoderlist( + { + tableNameRest:"sys_role_module_permission_rest", + tableName:"sys_role_module_permission", + moduleName:"sys_role_module_permission",//sys_module的moduleName + layTable : { + //表格内容 + elem : '#newsList', + id : "newsListTable" + }, + //排序跟数据库实际字段名的映射 + sortMap:{ + id:'id',roleId:'role_id',moduleId:'module_id',permissionId:'permission_id' + } + }); + //绑定所有查询区域控件 + magicalcoderlist.bindQueryArea(); + //表格 + var cols = [[ + {type: "checkbox", fixed:"left", width:50}, + {field: 'id', title: '主键', minWidth:100, align:"center",sort:true}, + {field: 'roleId', title: '角色', align:'center', minWidth:250, templet:function (d) { + var value = (!d.roleId || d.roleId==null) ? '' : d.roleId + var option = '' + return '' + },sort:true + }, + {field: 'moduleId', title: '模块', align:'center', minWidth:250, templet:function (d) { + var value = (!d.moduleId || d.moduleId==null) ? '' : d.moduleId + var option = '' + return '' + },sort:true + }, + {field: 'permissionId', title: '权限', align:'center', minWidth:250, templet:function (d) { + var value = (!d.permissionId || d.permissionId==null) ? '' : d.permissionId + var option = '' + return '' + },sort:true + }, + {title: '操作', minWidth:250, templet:'#newsListOperateTemplate',fixed:"right",align:"center"} + ]]; + //表格中的一些事件 + var tableEvent = { + "tool":function (obj,roleId) {//操作部分的按钮 + return true;//不阻止事件继续执行封装的事件 + }, + "sort":function (obj,safeOrderBy) {//排序 + return true;//不阻止事件继续执行封装的事件 + } + } + magicalcoderlist.bindTableArea(cols,tableEvent) + magicalcoderlist.bindAreaEvents(); +}) diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/README.md b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/README.md new file mode 100644 index 0000000..379b965 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/README.md @@ -0,0 +1,6 @@ +使用v0xx来区分版本 避免因为升级导致以前生成的代码无法正常运行 +v101起重整这块代码,将大部分定制业务开放,供用户更大程度上灵活处理业务 +从v103开始,取消layui的模块化方式,改成传统方式,因为模块化的加载速度实在是太太太慢了;新的方式页面打开速度提升了3倍 +select2 开源地址 +https://cdnjs.com/libraries/select2 +https://github.com/select2/select2 diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/crud/component/mc-base-tree.js b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/crud/component/mc-base-tree.js new file mode 100644 index 0000000..d13869e --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/crud/component/mc-base-tree.js @@ -0,0 +1,309 @@ +/** +* 业务树组件 + * 请根据您自己的业务结构 稍微改造下 init myDataToZtreeData ztreeDataToMyData方法即可 +* by www.magicalcoder.com + * 如何初始化复选框树 new BaseTree({treeId:"cityTree",chkboxType:{ "Y" : "ps", "N" : "ps" }}) + * 然后初始化单选按钮树 new BaseTree({treeId:"cityTree",chkStyle:"radio",radioType:"all",defaultSelectIds: [entity.cityStructureId]}) + * 页面请引入 + * 样式 + * js + + + + 详情页保存: + + html: +
            +
            +
              +
              +
              +
              +
              +
              + +js: + var treeCallback = { + //我的数据转换成树 + myDataToZtreeData:function (dbEntity) { + return {id:dbEntity.id,pId:dbEntity.parentId,open:false,name:dbEntity.name,deptNo:dbEntity.deptNo}; + }, + //树的数据转换成我的数据 + ztreeDataToMyData:function (ztreeNode) { + return {id:ztreeNode.id,name:ztreeNode.name,parentId:ztreeNode.pId,open:ztreeNode.open,deptNo:ztreeNode.deptNo}; + } + }; + + var departmentTree ; + if(entity && entity!=null){ + departmentTree = new BaseTree({ + treeId:"departmentTree", + chkStyle:"radio", + radioType:"all", + defaultSelectIds: [entity.deptId], + ajaxUrl:"admin/system_mbyl_department_rest/tree_data", + callback: treeCallback + }) + .... + } + + else {//新增操作 + + departmentTree = new BaseTree({ + treeId:"departmentTree", + chkStyle:"radio", + radioType:"all", + ajaxUrl:"admin/system_mbyl_department_rest/tree_data", + callback: treeCallback + }) +... +} + //表单校验 在_bindFormDom方法 + form.on("submit(save)",function(data){ + //看看选中树的值 + var treeDate = departmentTree.getSingleRadioSelectNodeData(); + if(treeDate.length>0){ + var node = treeDate[0]; + $("[name='deptId']").val(node.id) + data.field.deptId=node.id; + }else { + layer.msg("请选择所属部门") + return false; + } + +} + + +列表页查询: +html:class="layui-input"不能少 + + + js + var departmentTree = new BaseTree({ + treeId:"departmentTree", + chkboxType:{ "Y" : "ps", "N" : "ps" }, + ajaxUrl:"admin/system_mbyl_department_rest/tree_data", + callback:{ + //我的数据转换成树 + myDataToZtreeData:function (dbEntity) { + return {id:dbEntity.id,pId:dbEntity.parentId,open:false,name:dbEntity.name,deptNo:dbEntity.deptNo}; + }, + //树的数据转换成我的数据 + ztreeDataToMyData:function (ztreeNode) { + return {id:ztreeNode.id,name:ztreeNode.name,parentId:ztreeNode.pId,open:ztreeNode.open,deptNo:ztreeNode.deptNo}; + } + } + }) + //搜索 + $(".search_btn").click(function(){ + var data = departmentTree.getFullCheckedNodesData(); + var departmentIds = [] + for(var i=0;i oracle做法 不同数据库更换不同concat语句 + + AND #{deptIds} LIKE '%,' || DEPT_ID || ',%' + + * +*/ +var $ = layui.jquery; +var layer = layui.layer; +function BaseTree(params) { + this.params = { + treeId:"",//页面放置一个
                标签即可 + chkboxType:"",//{ "Y" : "ps", "N" : "ps" } 级联 + chkStyle:"",//radio + radioType:"",//all level + defaultSelectIds:[],//默认选择的id + ajaxUrl:"",//初始化的数据的url + ajaxParams:function(){//动态获取入参的 + return {date:new Date().getTime()} + }, + callback:{ + //我的数据转换成树 + myDataToZtreeData:function (dbEntity) { + return {id:dbEntity.id,pId:dbEntity.parentId,open:false,name:dbEntity.cityName,myAttr:dbEntity.myAttr}; + }, + //树的数据转换成我的数据 + ztreeDataToMyData:function (ztreeNode) { + return {id:ztreeNode.id,cityName:ztreeNode.name,parentId:ztreeNode.pId,open:ztreeNode.open,myAttr:ztreeNode.myAttr}; + }, + /*点击节点回调事件*/ + checkNode:function () { + + } + } + } + $.extend(true,this.params,params); + this.baseTreeObj = null; + this.treeSetting = null; + this.settings(); + this.render(); +} + +BaseTree.prototype.render = function(){ + this.init(); +} + +/** + * 把我的数据转换成ztree的数据 + * @param dbEntity + * @returns {{id: number, pId: number, open: boolean, name: *, myAttr: 自定义数据}} + */ +BaseTree.prototype.myDataToZtreeData = function(dbEntity){ + return this.params.callback.myDataToZtreeData(dbEntity); + // return {id:parseInt(dbEntity.id),pId:parseInt(dbEntity.parentId),open:false,name:dbEntity.cityName,myAttr:dbEntity.myAttr}; +} +/** + * 把ztree数据转换成我的数据库数据 + * @param ztreeNode + * @returns {{id: *, cityName: *, parentId: number | *, open: *, myAttr: *}} + */ +BaseTree.prototype.ztreeDataToMyData = function(ztreeNode){ + return this.params.callback.ztreeDataToMyData(ztreeNode); + // return {id:ztreeNode.id,cityName:ztreeNode.name,parentId:ztreeNode.pId,open:ztreeNode.open,myAttr:ztreeNode.myAttr}; +} + +BaseTree.prototype.settings = function () { + var _t = this; + this.treeSetting = { + check: { + enable: true, + /*chkboxType : { "Y" : "ps", "N" : "ps" },*/ + /*chkStyle: "radio", + radioType:"all"*/ + }, + data: { + simpleData: { + enable: true + } + }, + callback: { + onClick: function (e, treeId, treeNode, clickFlag) { + _t.baseTreeObj.checkNode(treeNode, !treeNode.checked, true); + _t.params.callback.checkNode() + }, + onCheck:function (event, treeId, treeNode) { + _t.params.callback.checkNode() + } + } + }; + + if(this.params.chkboxType!=''){ + this.treeSetting.check.chkboxType = this.params.chkboxType; + } + if(this.params.chkStyle!=''){ + this.treeSetting.check.chkStyle = this.params.chkStyle; + } + if(this.params.radioType!=''){ + this.treeSetting.check.radioType = this.params.radioType; + } + + +} + +BaseTree.prototype.dataAdapter = function(dbData){ + var defaultSelectIdMap = {} + for(var i =0;i'+mcForeignValue+'' + foreignDom.append(option) + foreignDom.val(mcForeignValue); + if(dataValueSet){ + foreignDom.attr("data-value",mcForeignValue); + } + } + }else { + foreignDom.val(mcForeignValue); + } + foreignDom.attr("disabled","disabled") + }) + + }, + //查询区域 考虑禁用掉外键 + disabledFromQueryParentArea : function () { + if(mcForeignName && mcForeignName!=''){ + $("button[type='reset']").hide();//重置按钮禁用 + //查询条件 + this._disableForeignDom(mcForeignName+"First",mc_constant.MC_LAY_CLASS_NAME.FORM.foreign_select2,true) + this._disableForeignDom(mcForeignName+"Second",mc_constant.MC_LAY_CLASS_NAME.FORM.foreign_select2,true) + return true; + } + return false; + }, + //表格区域 考虑禁用掉外键 + disabledTableParentArea : function () { + if(mcForeignName && mcForeignName!=''){ + //查询条件 + this._disableForeignDom(mcForeignName,mc_constant.MC_LAY_CLASS_NAME.TABLE.foreign_select2,false) + } + }, + //表单区域 考虑禁用掉外键 + disabledFormParentArea : function () { + if(mcForeignName && mcForeignName!=''){ + //查询条件 + $("button[type='reset']").hide();//重置按钮禁用 + this._disableForeignDom(mcForeignName,mc_constant.MC_LAY_CLASS_NAME.FORM.foreign_select2,true) + } + }, + //构造子表面板内容 + buildTabTemplate : function (tableName,identify,childrenPage) { + var html = laytpl('
                ' + + '
                  ' + + '{{# layui.each(d.childrenPage,function(index,item){ }}'+ + '
                • {{ item.tabTitle }}
                • ' + + '{{# }); }}'+ + '
                ' + + '
                ' + + '{{# layui.each(d.childrenPage,function(index,item){ }}'+ + ' {{# if(index==0){ }}'+ + '
                ' + + ' ' + + '
                ' + + ' {{# }else{ }}'+ + '
                ' + + ' ' + + '
                ' + + ' {{# } }}'+ + '{{# }); }}'+ + '
                ').render({tableName:tableName,identify:identify,childrenPage:childrenPage}); + return html; + }, + //更多信息 标签页点击 + tabClickEvent : function () { + var clicked = {} + element.on('tab(tabClick)',function (data) { + if(data.index!=0){ + var index = data.index +"" + if(!clicked[index]){ + clicked[index]=true + var frame = $(".mcChildrenPage").find('.childrenIframe').eq(index) + // console.log(frame.attr("futureSrc")) + var src = frame.attr("src") + if(!src || src==''){ + frame.attr("src",frame.attr("futureSrc")) + } + } + } + }) + } + } + youyaboot_all.mc_children = mc_children; +}(); diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/crud/component/mc-layui-component.js b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/crud/component/mc-layui-component.js new file mode 100644 index 0000000..d3ae14c --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/crud/component/mc-layui-component.js @@ -0,0 +1,606 @@ +/** + * 结合layui的所有控件 统一处理 + * 修改控件值 触发ajax update操作 + * v 0.0.1 + */ + +;!function(){ + var form = layui.form,$ = layui.jquery, + layer = parent.layer === undefined ? layui.layer : top.layer, + upload = layui.upload, + slider = layui.slider, + rate = layui.rate, + colorpicker = layui.colorpicker, + layedit = layui.layedit, + laydate = layui.laydate, + mc_verify = youyaboot_all.mc_verify, + mc_constant = youyaboot_all.mc_constant, + mc_util = youyaboot_all.mc_util, + mc_select2 = youyaboot_all.mc_select2 ; +//自定义验证规则 + var mc_layui_component = { + //绘制详情页layui各种组件 并且会预设初始值 + bindMagicalCoderLayUiComponentFromDetail:function (config) { + var _t = this; + this.config = config; + //寻找所有日期控件 自动注册 + this._bindDate("."+mc_constant.MC_LAY_CLASS_NAME.FORM.laydate); + //寻找所有图片上传 + this._bindUpload("."+mc_constant.MC_LAY_CLASS_NAME.FORM.layupload); + //外键下拉 + $("."+mc_constant.MC_LAY_CLASS_NAME.FORM.foreign_select2).each(function (index,item) { + _t._bindForeignSelect2(config.tableNameRest,$(this),{width:"100%"},config); + }) + //批量自动初始化外键值 + mc_select2.batchTryToAjaxSetSelect2Content($("."+mc_constant.MC_LAY_CLASS_NAME.FORM.foreign_select2)) + //寻找滑块 + this._bindSlider("."+mc_constant.MC_LAY_CLASS_NAME.FORM.slider); + //寻找颜色选择器 + this._bindColorPicker("."+mc_constant.MC_LAY_CLASS_NAME.FORM.color_picker); + //寻找评星 + this._bindRate("."+mc_constant.MC_LAY_CLASS_NAME.FORM.rate); + //寻找代码修饰器 + this._bindCode("."+mc_constant.MC_LAY_CLASS_NAME.FORM.code); + + //寻找所有的富文本控件 + var formVerifyEditData = this._bindEdit("."+mc_constant.MC_LAY_CLASS_NAME.FORM.layedit); + return formVerifyEditData; + }, + //绘制table中layui各种组件 并且会预设初始值 + bindMagicalCoderLayUiComponentFromTable:function (config,failCallBack) { + this.config = config; + var _t = this; + var configData = {width:"200px",allowClear:false} + $("."+mc_constant.MC_LAY_CLASS_NAME.TABLE.single_select2).each(function (index,item) { + _t._bindSingleSelect2(config.tableNameRest,$(this),configData,failCallBack,config); + }) + $("."+mc_constant.MC_LAY_CLASS_NAME.TABLE.foreign_select2).each(function (index,item) { + _t._bindForeignSelect2(config.tableNameRest,$(this),configData,failCallBack,config); + }) + //批量自动初始化外键值 + mc_select2.batchTryToAjaxSetSelect2Content($("."+mc_constant.MC_LAY_CLASS_NAME.TABLE.foreign_select2)) + this._bindSwitchAjaxUpdate("."+mc_constant.MC_LAY_CLASS_NAME.TABLE.lay_switch,failCallBack); + this._bindDate("."+mc_constant.MC_LAY_CLASS_NAME.TABLE.lay_date,failCallBack); + this._bindInputText('.'+mc_constant.MC_LAY_CLASS_NAME.TABLE.text,failCallBack); + this._bindRadio('.'+mc_constant.MC_LAY_CLASS_NAME.TABLE.radio,failCallBack); + + }, + //绘制查询区域layui各种组件 并且会预设初始值 一般也就只有日期跟外键 其他的暂不考虑了 您也可以扩展 + bindMagicalCoderLayUiComponentFromQuery:function (config) { + this.config = config; + var _t = this; + //绑定外键查询 + $("."+mc_constant.MC_LAY_CLASS_NAME.FORM.foreign_select2).each(function (index,item) { + _t._bindForeignSelect2(config.tableNameRest,$(this),{width:"resolve",allowClear:true},null,config); + }) + //批量自动初始化外键值 + mc_select2.batchTryToAjaxSetSelect2Content($("."+mc_constant.MC_LAY_CLASS_NAME.FORM.foreign_select2)) + //绑定日期 + this._bindDate("."+mc_constant.MC_LAY_CLASS_NAME.FORM.laydate); + }, + _bindRadio : function (elem,clickFailCallback) { + var tableNameRest = this.config.tableNameRest; + $(elem).each(function (index, item) { + var name = $(item).attr("name")//由于radio name不能重复 所以用_+行号来区分 + var arr = name.split("_"); + name = arr[0] + var id = $(item).attr("id") + var filter = $(item).attr("lay-filter") + var select = name ? name : id + form.on('radio('+filter+')', function(domData){ + var _t = $(this) + var identify = _t.attr("data-identify") + if(identify && identify!=''){//ajax更新结果 + var value = domData.elem.value; + var index = layer.msg('修改中,请稍候',{icon: 16,time:true,shade:0.8}); + var postData = {}//必须设置主键 + postData[select] = value; + if(!mc_verify.verify(value,$(item))){ + return; + } + $.post('admin/'+tableNameRest+'/update/'+identify,postData,function (data) { + layer.close(index); + if(data.flag){ + layer.msg("修改成功!"); + }else { + layer.msg("修改失败:"+data.desc); + if(clickFailCallback){ + clickFailCallback() + } + } + form.render('radio');//这一步必须执行 否则改了不生效 + }) + } + }) + }) + }, + //普通输入框 输入完成离开事件 + _bindInputText : function (inputElem,failCallBack) { + var tableNameRest = this.config.tableNameRest; + $(inputElem).each(function (index,item) {//必须1个个绑定 不支持单利 + var originValue = '' + $(item).focus(function () { + originValue =$(this).val() + }) + $(item).blur(function () { + var newValue = $(this).val() + if(originValue != newValue){//需要更新 + var identify = $(item).attr("data-identify") + if(identify && identify!=''){ + var name = $(item).attr("name") + var index = layer.msg('修改中,请稍候',{icon: 16,time:true,shade:0.8}); + var postData = {} + postData[name] = newValue; + if(!mc_verify.verify(newValue,$(item))){ + return; + } + $.post('admin/'+tableNameRest+'/update/'+identify,postData,function (data) { + layer.close(index); + if(data.flag){ + layer.msg("修改成功!"); + }else { + layer.msg("修改失败:"+data.desc); + $(item).val(originValue)//还原 + } + }) + } + } + }) + }) + }, + //綁定日期控件 + _bindDate : function (elem,doneFailCallback) { + var tableNameRest = this.config.tableNameRest; + var _t = this; + $(elem).each(function (index,item) {//必须1个个绑定 不支持单利 + var id = $(item).attr("id") + var name = $(item).attr("name") + var formConfig = {} + $.extend(true,formConfig,_t.config.form); + var formRenderConfig = {} + if(formConfig[name]){ + formRenderConfig = formConfig[name].renderConfig + }else {//可能是查询区域 + var realName = null; + var dataName = $(item).attr("data-name") + if(dataName && dataName.length>0){ + realName = dataName + }else {//老代码兼容 + if(name.lastIndexOf("First")!=-1){ + realName = name.substring(0,name.lastIndexOf("First")) + } + if(name.lastIndexOf("Second")!=-1){ + realName = name.substring(0,name.lastIndexOf("Second")) + } + } + if(realName!=null){ + if(formConfig[realName]){ + formRenderConfig = formConfig[realName].renderConfig + } + } + } + var domRenderConfig = _t.iteratorAttr({},item);//dom元素上面的配置 + var options = $.extend(true,domRenderConfig,formRenderConfig)// 以dom属性配置优先 其次读取js配置 + + var select = id ? "#"+id : "[name='"+name+"']"//列表页有id 所以不会批量绑定 + var identify = $(item).attr("data-identify") + var value = $(item).val() + if(value && value!=''){//智能点 默认给当前时间做初始值 + var reg=/^(\d{4})[-\/].*/; + if(!reg.test(value)){//非日期字符串格式 尝试解析字符串 + try { + if(value.toUpperCase()=='CURRENT_TIMESTAMP'){ + value = new Date() + }else { + value = eval(value) + } + }catch (e){ + value = '' + } + } + } + $.extend(options,{ + elem : options['elem'] || select, + type : options['type'] || 'datetime', + value : options['value']|| value, + format : options['format'] || 'yyyy-MM-dd HH:mm:ss', + trigger : options['trigger'] || 'click', + done : options['done'] || function (value,date,endDate) { + if(identify && identify!=''){ + var index = layer.msg('修改中,请稍候',{icon: 16,time:true,shade:0.8}); + var postData = {}//必须设置主键 + postData[name] = value; + if(!mc_verify.verify(value,$(item))){ + return; + } + $.post('admin/'+tableNameRest+'/update/'+identify,postData,function (data) { + layer.close(index); + if(data.flag){ + layer.msg("修改成功!"); + }else { + layer.msg("修改失败!"+data.desc); + if(doneFailCallback){ + doneFailCallback() + } + } + }) + } + } + }) + laydate.render(options); + }) + }, + //绑定文件上传组件 + _bindUpload : function (elem,doneFailCallback) { + var _t = this; + $(elem).each(function (index,item) { + var name = $(item).attr("name") + var inputName = name.replace("FileUpload","")//一个FileUpload后面有个input 主要是设置input的值 + var options = _t._options(item); + var inputNameItem = $("input[name='"+inputName+"']"); + + $.extend(options,{ + elem: options['elem'] || $(item), + url: options['url'] || 'admin/common_file_rest/upload', + method: options['method'] || "post", + accept: options['accept'] || "file",//允许上传普通文件 ,去掉则只支持图片类型 + before: options['before'] || function (obj) { + layer.load() + }, + done: options['done'] || function(res, index, upload){ + layer.closeAll('loading') + if(res.flag){ + var src = res.data.src; + inputNameItem.val(src); + mc_util.autoSetImgUrl($(".img_"+inputName),src);//图片预览区域 + }else { + layer.alert("上传失败:"+res.desc) + if(doneFailCallback){ + doneFailCallback(); + } + } + }, + error: options['error'] || function(index, upload){ + layer.closeAll('loading') + layer.alert("上传失败,请重试") + if(doneFailCallback){ + doneFailCallback(); + } + } + }) + upload.render(options); + }) + }, + _bindSingleSelect2 : function (tableNameRest,$elem,select2ConfigData,selectChangeFailCallback,config) { + mc_select2.bindTableSingleSelect2(tableNameRest,$elem,select2ConfigData,selectChangeFailCallback,config); + }, + _bindForeignSelect2 : function (tableNameRest,$elem,select2ConfigData,selectChangeFailCallback,config) { + mc_select2.bindForeignSelect2ByDomId(tableNameRest,$elem,select2ConfigData,selectChangeFailCallback,config); + }, + _bindSwitchAjaxUpdate : function (elem,doneFailCallback) {//表格中出现也得用 form.on(switch)监听 因为表格暂时没这个处理方法 + var tableNameRest = this.config.tableNameRest; + $(elem).each(function (index, item) { + var name = $(item).attr("name") + var id = $(item).attr("id") + var filter = $(item).attr("lay-filter") + var select = name ? name : id + form.on('switch('+filter+')', function(domData){ + var _t = $(this) + var identify = _t.attr("data-identify") + if(identify && identify!=''){//ajax更新结果 + var targetChecked = domData.elem.checked; + var index = layer.msg('修改中,请稍候',{icon: 16,time:true,shade:0.8}); + var postData = {}//必须设置主键 + var value = targetChecked?1:0 + postData[select] = value; + if(!mc_verify.verify(value,$(item))){ + return; + } + $.post('admin/'+tableNameRest+'/update/'+identify,postData,function (data) { + layer.close(index); + if(data.flag){ + _t.prop("checked", targetChecked); + layer.msg("修改成功!"); + }else { + layer.msg("修改失败:"+data.desc); + _t.prop("checked", !targetChecked); + } + form.render('checkbox');//这一步必须执行 否则改了不生效 + }) + } + }) + }) + }, + //绑定富文本 并返回校验同步框 供表单提交使用 + _bindEdit : function (elem) { + var formVerifyEditData = {} + $(elem).each(function (index,item) { + var id = $(item).attr("id") + //创建一个编辑器 + var editIndex = layedit.build(id,{ + height : 300, + uploadImage : { + type : "post", + url : "admin/common_file_rest/upload?from=layedit" + } + }); + //require 校验富文本编辑框时 同步一下隐藏的textarea值 只有在这里同步才生效 VerifyEdit 参见edit.html lay-verify + formVerifyEditData[id+"VerifyEdit"] = function(val){ + layedit.sync(editIndex); + } + }) + return formVerifyEditData; + }, + _options:function(item){ + var name = $(item).attr("name") + var domRenderConfig = this.iteratorAttr({},item);//dom元素上面的配置 + var formConfig = {}//js控制的配置 + $.extend(true,formConfig,this.config.form);//深拷贝 + var formRenderConfig = formConfig[name] ? formConfig[name].renderConfig : {} + var options = $.extend(true,domRenderConfig,formRenderConfig)// 以dom属性配置优先 其次读取js配置 + return options; + }, + //绑定滑块 不建议在列表页使用 + _bindSlider : function (elem) { + var _t = this + $(elem).each(function (index,item) {//必须1个个绑定 不支持单利 + var name = $(item).attr("name") + var inputName = name.replace("Slider","")//一个slider前面有个input 主要是设置input的值 + var options = _t._options(item); + var inputNameItem = $("input[name='"+inputName+"']"); + var value = inputNameItem.val() + $.extend(options,{ + elem : options['elem'] || $(item), + value : options['value']|| value,//取对应的输入框 + change : options['change'] || function (value) { + inputNameItem.val(value) + } + }) + slider.render(options); + }) + }, + //颜色选择器 + _bindColorPicker : function (elem,doneFailCallback) { + var tableNameRest = this.config.tableNameRest; + var _t = this; + $(elem).each(function (index,item) {//必须1个个绑定 不支持单利 + var name = $(item).attr("name") + var inputName = name.replace("ColorPicker","")//一个ColorPicker前面有个input 主要是设置input的值 + var options = _t._options(item); + var inputNameItem = $("input[name='"+inputName+"']"); + var value = inputNameItem.val() + var identify = $(item).attr("data-identify") + $.extend(options,{ + elem : options['elem'] || select, + format : options['format']|| 'hex', + color : options['color']|| value, + done : options['done'] || function (color) { + $(item).val(color) + if(identify && identify!=''){ + var index = layer.msg('修改中,请稍候',{icon: 16,time:true,shade:0.8}); + var postData = {}//必须设置主键 + postData[name] = color; + if(!mc_verify.verify(color,$(item))){ + return; + } + $.post('admin/'+tableNameRest+'/update/'+identify,postData,function (data) { + layer.close(index); + if(data.flag){ + layer.msg("修改成功!"); + }else { + layer.msg("修改失败!"+data.desc); + if(doneFailCallback){ + doneFailCallback() + } + } + }) + } + } + }) + colorpicker.render(options); + }) + }, + //评分 + _bindRate : function (elem,doneFailCallback) { + var tableNameRest = this.config.tableNameRest; + var _t = this; + $(elem).each(function (index,item) {//必须1个个绑定 不支持单利 + var name = $(item).attr("name") + var inputName = name.replace("Rate","")//一个ColorPicker前面有个input 主要是设置input的值 + var options = _t._options(item); + var inputNameItem = $("input[name='"+inputName+"']"); + var value = inputNameItem.val() + var identify = $(item).attr("data-identify") + + $.extend(options,{ + elem : options['elem'] || $(item), + length : options['length']|| 5, + value : options['value']|| value, + theme : options['theme']|| '#FFB800', + half : options['half']|| false, + text : options['text']|| false, + readonly : options['readonly']|| false, + choose : options['choose'] || function (val) { + inputNameItem.val(val) + if(identify && identify!=''){ + var index = layer.msg('修改中,请稍候',{icon: 16,time:true,shade:0.8}); + var postData = {}//必须设置主键 + postData[name] = val; + if(!mc_verify.verify(val,$(item))){ + return; + } + $.post('admin/'+tableNameRest+'/update/'+identify,postData,function (data) { + layer.close(index); + if(data.flag){ + layer.msg("修改成功!"); + }else { + layer.msg("修改失败!"+data.desc); + if(doneFailCallback){ + doneFailCallback() + } + } + }) + } + } + }) + rate.render(options); + }) + }, + //代码修饰器 + _bindCode : function (elem,doneFailCallback) { + var _t = this; + $(elem).each(function (index,item) {//必须1个个绑定 不支持单利 + var name = $(item).attr("name") + var inputName = name.replace("Code","")//一个ColorPicker前面有个input 主要是设置input的值 + var options = _t._options(item); + var inputNameItem = $("textarea[name='"+inputName+"']"); + var value = inputNameItem.val() + + $(elem).html(value); + $.extend(options,{ + elem : elem, + title : options['title']|| '', + height : options['height']|| '200px', + encode : options['encode']|| true, + skin : options['skin']|| 'notepad', + about : options['about']|| false + }) + layui.code(options); + }) + }, + //把layui组件html标签上的配置读取出来然后设置 + iteratorAttr:function (renderConfig,dom) { + var attrs = dom.attributes; + for(var i=0;i user-name + var arr = name.split("-") + var newArr = [] + for(var i in arr){ + if(i!=0){ + if(arr[i]!=''){ + newArr.push(this.firstCharToUpLower(arr[i])); + } + }else { + newArr.push(arr[i]); + } + } + return newArr.join(''); + }, + firstCharToUpLower:function (name) {//首字母大写 + var arr = name.split(""); + arr[0] = arr[0].toUpperCase(); + return arr.join('') + }, + _bindLayer:function () { + var _t = this; + $(".magicalcoder-layer").each(function (idx, item) { + $(this).next().hide()//先隐藏起来 + $(this).click(function () { + var config = _t.iteratorAttr({elem: $(item)}, item); + var type = config.type; + if(type+''==1){ + config.content = $(this).next(); + } + if(config.btn){ + config.btn = config.btn.split(",") + } + if(config.area){ + config.area = config.area.split(",") + } + layer.open(config) + }) + }) + } + , + magicalcoderMjeRender:function () {//解析编码操作的配置 + var scriptIdAttrName = "magicalcoder-mje-script-id"; + $("["+scriptIdAttrName+"]").each(function (idx, item) { + if(!$(this).is("code")){ + var value = $(this).attr(scriptIdAttrName); + var scriptCodeDome = $("["+scriptIdAttrName+"='script-"+value+"']"); + if(scriptCodeDome.length>0){ + var scriptJson = scriptCodeDome.html() + if(scriptJson!=''){ + var jsonObj = JSON.parse(scriptJson); + var event = jsonObj.event; + var executeList = jsonObj.execute; + $(this).bind(event,function () { + for(var i=0;i0){ + for(var i=0;i/g, ">").replace(/"/g, """).replace(/'/g, "'"); + }, + autoSetImgUrl:function (inputImg,realSrc) { + if(typeof realSrc =='undefined' || realSrc+''==''){ + return; + } + if(realSrc.indexOf("http://")==0 || realSrc.indexOf("https://")==0){//http开头的地址直接设置 + inputImg.attr("src",realSrc);//图片预览区域 + return; + } + //处理额外添加的前缀 因为本地是没这个文件的 + var fileExtraAddPrefix = _GLOBAL.file.fileExtraAddPrefix; + if(fileExtraAddPrefix!=''){ + var prefix = realSrc.substr(0,fileExtraAddPrefix.length) + if(prefix == fileExtraAddPrefix){ + realSrc = realSrc.substring(fileExtraAddPrefix.length) + } + } + realSrc = _GLOBAL.file.requestPrefix + "/" +realSrc; + inputImg.attr("src",realSrc);//图片预览区域 + } + , + mappingEntityToFormUiValue : function (elem,entityData) {//映射实体的值到界面元素中 + var body = elem; + if(entityData){ + for(var key in entityData){ + var value = entityData[key] + if(value != null && typeof value != "undefined"){ + var input = body.find("[name='"+key+"']"); + if(input.length<=0){ + continue; + } + var laySkin = input.attr("lay-skin") + if(laySkin && laySkin == 'switch'){//忽略开关 + continue; + } + //外键select2 + var className = input.attr("class") + if(className && className.indexOf("magicalcoder-foreign-select2")!=-1){ + input.attr("data-value",value); + continue; + } + //设置radio值 + var type = input.attr("type") + if(type && type=='radio' && value+''!=''){ + body.find("[name='"+key+"'][value='" + value + "']").prop("checked", "checked"); + continue + } + //如果有图片或者文件则自动设置图片 + var inputImg = body.find(".img_"+key); + if(inputImg.length>0 && value!=''){ + this.autoSetImgUrl(inputImg,value) + } + //其他正常表单 + input.val(value); + } + } + //开关单独处理 + body.find("input[lay-skin='switch']").each(function (index,item) { + var name = $(item).attr("name") + var check = (entityData[name]+''=='true' || entityData[name]+''=='1') ? true:false + $(item).prop("checked",check); + }) + form.render(); + } + }, + + } + youyaboot_all.mc_util = mc_util; +}(); diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/crud/core/mc-verify.js b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/crud/core/mc-verify.js new file mode 100644 index 0000000..b2b39b5 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/crud/core/mc-verify.js @@ -0,0 +1,239 @@ +/** + * js校验规则 定义一系列校验规则 + */ + +;!function(){ + var $=layui.jquery,layer = parent.layer === undefined ? layui.layer : top.layer; + var dangerClass = "layui-form-danger" + var magicalDangerClass = "form-danger" //有些控件聚焦也不行 + var mc_verify = { + //来自layui提供的验证 直接拷贝过来 layui预先验证 如果对layedit进行required,那你会发现第一次无法自动设值就被拦截了 + layuiVerify : { + mc_required: function (value,item) { + var reg=/[\S]+/; + if(!reg.test(value)){ + return "必填项不能为空"; + } + }, + mc_phone: function (value,item) { + if(value && value!=''){ + var reg=/^1\d{10}$/; + if(!reg.test(value)){ + return "请输入正确的手机号"; + } + } + }, + mc_email: function (value,item) { + if(value && value!=''){ + var reg=/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/; + if(!reg.test(value)){ + return "邮箱格式不正确"; + } + } + }, + mc_url: function (value,item) { + if(value && value!=''){ + var reg=/(^#)|(^http(s*):\/\/[^\s]+\.[^\s]+)/; + if(!reg.test(value)){ + return "链接格式不正确"; + } + } + }, + mc_number: function(e) { + if (e+''!='' && isNaN(e)) return "只能填写数字" + }, + mc_date: function (value,item) { + if(value && value!=''){ + var reg=/^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/; + if(!reg.test(value)){ + return "日期格式不正确"; + } + } + }, + mc_identity:function (value,item) { + if(value && value!=''){ + var reg=/(^\d{15}$)|(^\d{17}(x|X|\d)$)/; + if(!reg.test(value)){ + return "请输入正确的身份证号"; + } + } + } + }, + //最新扩展的验证 + magicalVerify : { + mc_digits : function (value,item) { + if(value && value!=''){ + var reg=/^[-+]?\d*$/; + if(!reg.test(value)){ + return "必须为整数"; + } + } + }, + mc_chinese_character : function (value,item) { + if(value && value!='') { + var reg = /[\u4e00-\u9fa5]+/; + if (!reg.test(value)) { + return "请使用中文汉字"; + } + } + }, + mc_variable : function (value,item) { + if (value && value != '') { + var reg = /[A-Za-z0-9_]+/; + if (!reg.test(value)) { + return "请使用字母数字下划线组合"; + } + } + }, + magicalCoderVerify : function (value,$item) { + if(value && value!='') { + if(!($item instanceof layui.jquery)){//判断是否是jquery对象 + $item = $($item); + } + var magicalCoderVerify=$item.attr("magicalcoder-verify") + if(magicalCoderVerify && magicalCoderVerify!=''){ + var verifyArr = magicalCoderVerify.split("|"); + if(verifyArr.length>0){ + for(var i=0;iparseFloat(setValue)){ + return "最大值 "+setValue; + } + } + break; + case 'minValues': + if(!isNaN(value) && !isNaN(setValue)){ + if(parseFloat(value) parseInt(setValue)){ + return "最大长度 "+setValue; + } + break; + case 'definedOne': + case 'definedTwo': + case 'definedThree': + var reg=new RegExp(setValue,'g'); + if (!mc_verify.regExpMatch(reg,value)){ + return "不满足 "+setValue; + } + break; + } + } + } + } + } + } + } + } + }, + regExpMatch:function(reg,v){ + var arr = v.match(reg); + if (arr){ + return arr[0]==v + } + return false; + }, + //全部规则都校验 + clearDangerClass:function($item){ + //select2控件 + if($item.hasClass("magicalcoder-foreign-select2") || $item.hasClass("magicalcoder-table-single-select2")){ + //如果是select2 + var parent = $item.parent() + if(parent){ + parent.find(".select2-selection--single").removeClass(magicalDangerClass) + } + } + //layedit控件 + else if($item.hasClass("magicalcoder-layedit")){ + //如果是select2 + var parent = $item.parent() + if(parent){ + parent.find(".layui-layedit").removeClass(magicalDangerClass) + } + } + //select 控件 + else if($item.is("select")){ + var parent = $item.parent() + if(parent){ + parent.find("input.layui-unselect").removeClass(dangerClass) + } + }else { + $item.removeClass(dangerClass) + } + }, + verify : function (value, $item) { + var layuiVerify = this.layuiVerify; + var magicalVerify = this.magicalVerify; + var verifyRule = $.extend(layuiVerify,magicalVerify); + var layVerify = $item.attr("lay-verify"); + if(layVerify){ + for(var rule in verifyRule){ + if(('|'+layVerify+'|').indexOf('|'+rule+'|')!=-1){ + var ruleFunc = verifyRule[rule] + var msg = ruleFunc(value,$item) + if(msg && msg.length>0){ + layer.msg(msg,{ + icon: 5, + shift: 6 + }) + //select2控件 + if($item.hasClass("magicalcoder-foreign-select2") || $item.hasClass("magicalcoder-table-single-select2")){ + //如果是select2 + var parent = $item.parent() + if(parent){ + var child = parent.find(".select2-selection--single") + child.addClass(magicalDangerClass) + child.focus() + } + } + //layedit控件 + else if($item.hasClass("magicalcoder-layedit")){ + //如果是select2 + var parent = $item.parent() + if(parent){ + var child = parent.find(".layui-layedit") + child.addClass(magicalDangerClass) + child.focus() + } + } + //select 控件 + else if($item.is("select")){ + var parent = $item.parent() + if(parent){ + var child = parent.find("input.layui-unselect") + child.addClass(dangerClass) + child.focus() + } + }else { + //普通控件 + $item.addClass(dangerClass) + $item.focus(); + } + return false; + } + } + } + } + this.clearDangerClass($item) + return true; + } + } + youyaboot_all.mc_verify = mc_verify; +}(); diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/crud/lib/authtree.js b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/crud/lib/authtree.js new file mode 100644 index 0000000..11296fc --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/crud/lib/authtree.js @@ -0,0 +1,132 @@ +/* +* @Author: 94468 +* @Date: 2018-03-16 18:24:47 +* @Last Modified by: 94468 +* @Last Modified time: 2018-07-26 09:17:14 +* https://github.com/wangerzi/layui-authtree +* 授权树 +*/ +// 节点树 +;!function() { + var $ = layui.jquery, + form = layui.form; + + var authtree = { + // 渲染 + 绑定事件 + /** + * 渲染DOM并绑定事件 + * @param {[type]} dst [目标ID,如:#test1] + * @param {[type]} trees [数据,格式:{}] + * @param {[type]} inputname [上传表单名] + * @param {[type]} layfilter [lay-filter的值] + * @param {[type]} openall [默认展开全部] + * @return {[type]} [description] + */ + render: function (dst, trees, opt) { + var inputname = opt.inputname ? opt.inputname : 'menuids[]'; + var layfilter = opt.layfilter ? opt.layfilter : 'checkauth'; + var openall = opt.openall ? opt.openall : false; + $(dst).html(authtree.renderAuth(trees, 0, {inputname: inputname, layfilter: layfilter, openall: openall})); + form.render(); + // 备注:如果使用form.on('checkbox()'),外部就无法使用form.on()监听同样的元素了(LAYUI不支持重复监听了)。 + // form.on('checkbox('+layfilter+')', function(data){ + // /*属下所有权限状态跟随,如果选中,往上走全部选中*/ + // var childs = $(data.elem).parent().next().find('input[type="checkbox"]').prop('checked', data.elem.checked); + // if(data.elem.checked){ + // /*查找child的前边一个元素,并将里边的checkbox选中状态改为true。*/ + // $(data.elem).parents('.auth-child').prev().find('input[type="checkbox"]').prop('checked', true); + // } + // /*console.log(childs);*/ + // form.render('checkbox'); + // }); + $(dst).find('.auth-single:first').unbind('click').on('click', '.layui-form-checkbox', function () { + var elem = $(this).prev(); + var checked = elem.is(':checked'); + var childs = elem.parent().next().find('input[type="checkbox"]').prop('checked', checked); + if (checked) { + /*查找child的前边一个元素,并将里边的checkbox选中状态改为true。*/ + elem.parents('.auth-child').prev().find('input[type="checkbox"]').prop('checked', true); + } + /*console.log(childs);*/ + form.render('checkbox'); + }); + + /*动态绑定展开事件*/ + $(dst).unbind('click').on('click', '.auth-icon', function () { + var origin = $(this); + var child = origin.parent().parent().find('.auth-child:first'); + if (origin.is('.active')) { + /*收起*/ + origin.removeClass('active').html(''); + child.slideUp('fast'); + } else { + /*展开*/ + origin.addClass('active').html(''); + child.slideDown('fast'); + } + return false; + }) + }, + // 递归创建格式 + renderAuth: function (tree, dept, opt) { + var inputname = opt.inputname; + var layfilter = opt.layfilter; + var openall = opt.openall; + var str = '
                '; + layui.each(tree, function (index, item) { + var hasChild = item.list ? 1 : 0; + // 注意:递归调用时,this的环境会改变! + var append = hasChild ? authtree.renderAuth(item.list, dept + 1, opt) : ''; + + // '+new Array(dept * 4).join(' ')+' + str += '
                ' + (hasChild ? '' + (openall ? '' : '') + '' : '') + (dept > 0 ? '├─ ' : '') + '
                ' + append + '
                ' + }); + str += '
                '; + return str; + }, + // 获取选中叶子结点 + getLeaf: function (dst) { + var leafs = $(dst).find('.auth-leaf').parent().find('input[type="checkbox"]:checked'); + var data = []; + leafs.each(function (index, item) { + // console.log(item); + data.push(item.value); + }); + // console.log(data); + return data; + }, + // 获取所有选中的数据 + getAll: function (dst) { + var inputs = $(dst).find('input[type="checkbox"]'); + var data = []; + inputs.each(function (index, item) { + data.push(item.value); + }); + // console.log(data); + return data; + }, + // 获取所有选中的数据 + getChecked: function (dst) { + var inputs = $(dst).find('input[type="checkbox"]:checked'); + var data = []; + inputs.each(function (index, item) { + data.push(item.value); + }); + // console.log(data); + return data; + }, + // 获取未选中数据 + getNotChecked: function (dst) { + var inputs = $(dst).find('input[type="checkbox"]:not(:checked)'); + var data = []; + inputs.each(function (index, item) { + data.push(item.value); + }); + // console.log(data); + return data; + } + } + youyaboot_all.authtree = authtree; + +}(); + diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/crud/lib/select2.js b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/crud/lib/select2.js new file mode 100644 index 0000000..8b854c8 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/crud/lib/select2.js @@ -0,0 +1,5885 @@ +/*! + * Select2 4.0.7 + * https://select2.github.io + * + * Released under the MIT license + * https://github.com/select2/select2/blob/master/LICENSE.md + */ +;(function (factory) { + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define(['jquery'], factory); + } else if (typeof module === 'object' && module.exports) { + // Node/CommonJS + module.exports = function (root, jQuery) { + if (jQuery === undefined) { + // require('jQuery') returns a factory that requires window to + // build a jQuery instance, we normalize how we use modules + // that require this pattern but the window provided is a noop + // if it's defined (how jquery works) + if (typeof window !== 'undefined') { + jQuery = require('jquery'); + } + else { + jQuery = require('jquery')(root); + } + } + factory(jQuery); + return jQuery; + }; + } else { + // Browser globals + factory(jQuery); + } +} (function (jQuery) { + // This is needed so we can catch the AMD loader configuration and use it + // The inner file should be wrapped (by `banner.start.js`) in a function that + // returns the AMD loader references. + var S2 =(function () { + // Restore the Select2 AMD loader so it can be used + // Needed mostly in the language files, where the loader is not inserted + if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) { + var S2 = jQuery.fn.select2.amd; + } + var S2;(function () { if (!S2 || !S2.requirejs) { + if (!S2) { S2 = {}; } else { require = S2; } + /** + * @license almond 0.3.3 Copyright jQuery Foundation and other contributors. + * Released under MIT license, http://github.com/requirejs/almond/LICENSE + */ +//Going sloppy to avoid 'use strict' string cost, but strict practices should +//be followed. + /*global setTimeout: false */ + + var requirejs, require, define; + (function (undef) { + var main, req, makeMap, handlers, + defined = {}, + waiting = {}, + config = {}, + defining = {}, + hasOwn = Object.prototype.hasOwnProperty, + aps = [].slice, + jsSuffixRegExp = /\.js$/; + + function hasProp(obj, prop) { + return hasOwn.call(obj, prop); + } + + /** + * Given a relative module name, like ./something, normalize it to + * a real name that can be mapped to a path. + * @param {String} name the relative name + * @param {String} baseName a real name that the name arg is relative + * to. + * @returns {String} normalized name + */ + function normalize(name, baseName) { + var nameParts, nameSegment, mapValue, foundMap, lastIndex, + foundI, foundStarMap, starI, i, j, part, normalizedBaseParts, + baseParts = baseName && baseName.split("/"), + map = config.map, + starMap = (map && map['*']) || {}; + + //Adjust any relative paths. + if (name) { + name = name.split('/'); + lastIndex = name.length - 1; + + // If wanting node ID compatibility, strip .js from end + // of IDs. Have to do this here, and not in nameToUrl + // because node allows either .js or non .js to map + // to same file. + if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) { + name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, ''); + } + + // Starts with a '.' so need the baseName + if (name[0].charAt(0) === '.' && baseParts) { + //Convert baseName to array, and lop off the last part, + //so that . matches that 'directory' and not name of the baseName's + //module. For instance, baseName of 'one/two/three', maps to + //'one/two/three.js', but we want the directory, 'one/two' for + //this normalization. + normalizedBaseParts = baseParts.slice(0, baseParts.length - 1); + name = normalizedBaseParts.concat(name); + } + + //start trimDots + for (i = 0; i < name.length; i++) { + part = name[i]; + if (part === '.') { + name.splice(i, 1); + i -= 1; + } else if (part === '..') { + // If at the start, or previous value is still .., + // keep them so that when converted to a path it may + // still work when converted to a path, even though + // as an ID it is less than ideal. In larger point + // releases, may be better to just kick out an error. + if (i === 0 || (i === 1 && name[2] === '..') || name[i - 1] === '..') { + continue; + } else if (i > 0) { + name.splice(i - 1, 2); + i -= 2; + } + } + } + //end trimDots + + name = name.join('/'); + } + + //Apply map config if available. + if ((baseParts || starMap) && map) { + nameParts = name.split('/'); + + for (i = nameParts.length; i > 0; i -= 1) { + nameSegment = nameParts.slice(0, i).join("/"); + + if (baseParts) { + //Find the longest baseName segment match in the config. + //So, do joins on the biggest to smallest lengths of baseParts. + for (j = baseParts.length; j > 0; j -= 1) { + mapValue = map[baseParts.slice(0, j).join('/')]; + + //baseName segment has config, find if it has one for + //this name. + if (mapValue) { + mapValue = mapValue[nameSegment]; + if (mapValue) { + //Match, update name to the new value. + foundMap = mapValue; + foundI = i; + break; + } + } + } + } + + if (foundMap) { + break; + } + + //Check for a star map match, but just hold on to it, + //if there is a shorter segment match later in a matching + //config, then favor over this star map. + if (!foundStarMap && starMap && starMap[nameSegment]) { + foundStarMap = starMap[nameSegment]; + starI = i; + } + } + + if (!foundMap && foundStarMap) { + foundMap = foundStarMap; + foundI = starI; + } + + if (foundMap) { + nameParts.splice(0, foundI, foundMap); + name = nameParts.join('/'); + } + } + + return name; + } + + function makeRequire(relName, forceSync) { + return function () { + //A version of a require function that passes a moduleName + //value for items that may need to + //look up paths relative to the moduleName + var args = aps.call(arguments, 0); + + //If first arg is not require('string'), and there is only + //one arg, it is the array form without a callback. Insert + //a null so that the following concat is correct. + if (typeof args[0] !== 'string' && args.length === 1) { + args.push(null); + } + return req.apply(undef, args.concat([relName, forceSync])); + }; + } + + function makeNormalize(relName) { + return function (name) { + return normalize(name, relName); + }; + } + + function makeLoad(depName) { + return function (value) { + defined[depName] = value; + }; + } + + function callDep(name) { + if (hasProp(waiting, name)) { + var args = waiting[name]; + delete waiting[name]; + defining[name] = true; + main.apply(undef, args); + } + + if (!hasProp(defined, name) && !hasProp(defining, name)) { + throw new Error('No ' + name); + } + return defined[name]; + } + + //Turns a plugin!resource to [plugin, resource] + //with the plugin being undefined if the name + //did not have a plugin prefix. + function splitPrefix(name) { + var prefix, + index = name ? name.indexOf('!') : -1; + if (index > -1) { + prefix = name.substring(0, index); + name = name.substring(index + 1, name.length); + } + return [prefix, name]; + } + + //Creates a parts array for a relName where first part is plugin ID, + //second part is resource ID. Assumes relName has already been normalized. + function makeRelParts(relName) { + return relName ? splitPrefix(relName) : []; + } + + /** + * Makes a name map, normalizing the name, and using a plugin + * for normalization if necessary. Grabs a ref to plugin + * too, as an optimization. + */ + makeMap = function (name, relParts) { + var plugin, + parts = splitPrefix(name), + prefix = parts[0], + relResourceName = relParts[1]; + + name = parts[1]; + + if (prefix) { + prefix = normalize(prefix, relResourceName); + plugin = callDep(prefix); + } + + //Normalize according + if (prefix) { + if (plugin && plugin.normalize) { + name = plugin.normalize(name, makeNormalize(relResourceName)); + } else { + name = normalize(name, relResourceName); + } + } else { + name = normalize(name, relResourceName); + parts = splitPrefix(name); + prefix = parts[0]; + name = parts[1]; + if (prefix) { + plugin = callDep(prefix); + } + } + + //Using ridiculous property names for space reasons + return { + f: prefix ? prefix + '!' + name : name, //fullName + n: name, + pr: prefix, + p: plugin + }; + }; + + function makeConfig(name) { + return function () { + return (config && config.config && config.config[name]) || {}; + }; + } + + handlers = { + require: function (name) { + return makeRequire(name); + }, + exports: function (name) { + var e = defined[name]; + if (typeof e !== 'undefined') { + return e; + } else { + return (defined[name] = {}); + } + }, + module: function (name) { + return { + id: name, + uri: '', + exports: defined[name], + config: makeConfig(name) + }; + } + }; + + main = function (name, deps, callback, relName) { + var cjsModule, depName, ret, map, i, relParts, + args = [], + callbackType = typeof callback, + usingExports; + + //Use name if no relName + relName = relName || name; + relParts = makeRelParts(relName); + + //Call the callback to define the module, if necessary. + if (callbackType === 'undefined' || callbackType === 'function') { + //Pull out the defined dependencies and pass the ordered + //values to the callback. + //Default to [require, exports, module] if no deps + deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps; + for (i = 0; i < deps.length; i += 1) { + map = makeMap(deps[i], relParts); + depName = map.f; + + //Fast path CommonJS standard dependencies. + if (depName === "require") { + args[i] = handlers.require(name); + } else if (depName === "exports") { + //CommonJS module spec 1.1 + args[i] = handlers.exports(name); + usingExports = true; + } else if (depName === "module") { + //CommonJS module spec 1.1 + cjsModule = args[i] = handlers.module(name); + } else if (hasProp(defined, depName) || + hasProp(waiting, depName) || + hasProp(defining, depName)) { + args[i] = callDep(depName); + } else if (map.p) { + map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {}); + args[i] = defined[depName]; + } else { + throw new Error(name + ' missing ' + depName); + } + } + + ret = callback ? callback.apply(defined[name], args) : undefined; + + if (name) { + //If setting exports via "module" is in play, + //favor that over return value and exports. After that, + //favor a non-undefined return value over exports use. + if (cjsModule && cjsModule.exports !== undef && + cjsModule.exports !== defined[name]) { + defined[name] = cjsModule.exports; + } else if (ret !== undef || !usingExports) { + //Use the return value from the function. + defined[name] = ret; + } + } + } else if (name) { + //May just be an object definition for the module. Only + //worry about defining if have a module name. + defined[name] = callback; + } + }; + + requirejs = require = req = function (deps, callback, relName, forceSync, alt) { + if (typeof deps === "string") { + if (handlers[deps]) { + //callback in this case is really relName + return handlers[deps](callback); + } + //Just return the module wanted. In this scenario, the + //deps arg is the module name, and second arg (if passed) + //is just the relName. + //Normalize module name, if it contains . or .. + return callDep(makeMap(deps, makeRelParts(callback)).f); + } else if (!deps.splice) { + //deps is a config object, not an array. + config = deps; + if (config.deps) { + req(config.deps, config.callback); + } + if (!callback) { + return; + } + + if (callback.splice) { + //callback is an array, which means it is a dependency list. + //Adjust args if there are dependencies + deps = callback; + callback = relName; + relName = null; + } else { + deps = undef; + } + } + + //Support require(['a']) + callback = callback || function () {}; + + //If relName is a function, it is an errback handler, + //so remove it. + if (typeof relName === 'function') { + relName = forceSync; + forceSync = alt; + } + + //Simulate async callback; + if (forceSync) { + main(undef, deps, callback, relName); + } else { + //Using a non-zero value because of concern for what old browsers + //do, and latest browsers "upgrade" to 4 if lower value is used: + //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout: + //If want a value immediately, use require('id') instead -- something + //that works in almond on the global level, but not guaranteed and + //unlikely to work in other AMD implementations. + setTimeout(function () { + main(undef, deps, callback, relName); + }, 4); + } + + return req; + }; + + /** + * Just drops the config on the floor, but returns req in case + * the config return value is used. + */ + req.config = function (cfg) { + return req(cfg); + }; + + /** + * Expose module registry for debugging and tooling + */ + requirejs._defined = defined; + + define = function (name, deps, callback) { + if (typeof name !== 'string') { + throw new Error('See almond README: incorrect module build, no module name'); + } + + //This module may not have dependencies + if (!deps.splice) { + //deps is not an array, so probably means + //an object literal or factory function for + //the value. Adjust args. + callback = deps; + deps = []; + } + + if (!hasProp(defined, name) && !hasProp(waiting, name)) { + waiting[name] = [name, deps, callback]; + } + }; + + define.amd = { + jQuery: true + }; + }()); + + S2.requirejs = requirejs;S2.require = require;S2.define = define; + } + }()); + S2.define("almond", function(){}); + + /* global jQuery:false, $:false */ + S2.define('jquery',[],function () { + var _$ = jQuery || $; + + if (_$ == null && console && console.error) { + console.error( + 'Select2: An instance of jQuery or a jQuery-compatible library was not ' + + 'found. Make sure that you are including jQuery before Select2 on your ' + + 'web page.' + ); + } + + return _$; + }); + + S2.define('select2/utils',[ + 'jquery' + ], function ($) { + var Utils = {}; + + Utils.Extend = function (ChildClass, SuperClass) { + var __hasProp = {}.hasOwnProperty; + + function BaseConstructor () { + this.constructor = ChildClass; + } + + for (var key in SuperClass) { + if (__hasProp.call(SuperClass, key)) { + ChildClass[key] = SuperClass[key]; + } + } + + BaseConstructor.prototype = SuperClass.prototype; + ChildClass.prototype = new BaseConstructor(); + ChildClass.__super__ = SuperClass.prototype; + + return ChildClass; + }; + + function getMethods (theClass) { + var proto = theClass.prototype; + + var methods = []; + + for (var methodName in proto) { + var m = proto[methodName]; + + if (typeof m !== 'function') { + continue; + } + + if (methodName === 'constructor') { + continue; + } + + methods.push(methodName); + } + + return methods; + } + + Utils.Decorate = function (SuperClass, DecoratorClass) { + var decoratedMethods = getMethods(DecoratorClass); + var superMethods = getMethods(SuperClass); + + function DecoratedClass () { + var unshift = Array.prototype.unshift; + + var argCount = DecoratorClass.prototype.constructor.length; + + var calledConstructor = SuperClass.prototype.constructor; + + if (argCount > 0) { + unshift.call(arguments, SuperClass.prototype.constructor); + + calledConstructor = DecoratorClass.prototype.constructor; + } + + calledConstructor.apply(this, arguments); + } + + DecoratorClass.displayName = SuperClass.displayName; + + function ctr () { + this.constructor = DecoratedClass; + } + + DecoratedClass.prototype = new ctr(); + + for (var m = 0; m < superMethods.length; m++) { + var superMethod = superMethods[m]; + + DecoratedClass.prototype[superMethod] = + SuperClass.prototype[superMethod]; + } + + var calledMethod = function (methodName) { + // Stub out the original method if it's not decorating an actual method + var originalMethod = function () {}; + + if (methodName in DecoratedClass.prototype) { + originalMethod = DecoratedClass.prototype[methodName]; + } + + var decoratedMethod = DecoratorClass.prototype[methodName]; + + return function () { + var unshift = Array.prototype.unshift; + + unshift.call(arguments, originalMethod); + + return decoratedMethod.apply(this, arguments); + }; + }; + + for (var d = 0; d < decoratedMethods.length; d++) { + var decoratedMethod = decoratedMethods[d]; + + DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod); + } + + return DecoratedClass; + }; + + var Observable = function () { + this.listeners = {}; + }; + + Observable.prototype.on = function (event, callback) { + this.listeners = this.listeners || {}; + + if (event in this.listeners) { + this.listeners[event].push(callback); + } else { + this.listeners[event] = [callback]; + } + }; + + Observable.prototype.trigger = function (event) { + var slice = Array.prototype.slice; + var params = slice.call(arguments, 1); + + this.listeners = this.listeners || {}; + + // Params should always come in as an array + if (params == null) { + params = []; + } + + // If there are no arguments to the event, use a temporary object + if (params.length === 0) { + params.push({}); + } + + // Set the `_type` of the first object to the event + params[0]._type = event; + + if (event in this.listeners) { + this.invoke(this.listeners[event], slice.call(arguments, 1)); + } + + if ('*' in this.listeners) { + this.invoke(this.listeners['*'], arguments); + } + }; + + Observable.prototype.invoke = function (listeners, params) { + for (var i = 0, len = listeners.length; i < len; i++) { + listeners[i].apply(this, params); + } + }; + + Utils.Observable = Observable; + + Utils.generateChars = function (length) { + var chars = ''; + + for (var i = 0; i < length; i++) { + var randomChar = Math.floor(Math.random() * 36); + chars += randomChar.toString(36); + } + + return chars; + }; + + Utils.bind = function (func, context) { + return function () { + func.apply(context, arguments); + }; + }; + + Utils._convertData = function (data) { + for (var originalKey in data) { + var keys = originalKey.split('-'); + + var dataLevel = data; + + if (keys.length === 1) { + continue; + } + + for (var k = 0; k < keys.length; k++) { + var key = keys[k]; + + // Lowercase the first letter + // By default, dash-separated becomes camelCase + key = key.substring(0, 1).toLowerCase() + key.substring(1); + + if (!(key in dataLevel)) { + dataLevel[key] = {}; + } + + if (k == keys.length - 1) { + dataLevel[key] = data[originalKey]; + } + + dataLevel = dataLevel[key]; + } + + delete data[originalKey]; + } + + return data; + }; + + Utils.hasScroll = function (index, el) { + // Adapted from the function created by @ShadowScripter + // and adapted by @BillBarry on the Stack Exchange Code Review website. + // The original code can be found at + // http://codereview.stackexchange.com/q/13338 + // and was designed to be used with the Sizzle selector engine. + + var $el = $(el); + var overflowX = el.style.overflowX; + var overflowY = el.style.overflowY; + + //Check both x and y declarations + if (overflowX === overflowY && + (overflowY === 'hidden' || overflowY === 'visible')) { + return false; + } + + if (overflowX === 'scroll' || overflowY === 'scroll') { + return true; + } + + return ($el.innerHeight() < el.scrollHeight || + $el.innerWidth() < el.scrollWidth); + }; + + Utils.escapeMarkup = function (markup) { + var replaceMap = { + '\\': '\', + '&': '&', + '<': '<', + '>': '>', + '"': '"', + '\'': ''', + '/': '/' + }; + + // Do not try to escape the markup if it's not a string + if (typeof markup !== 'string') { + return markup; + } + + return String(markup).replace(/[&<>"'\/\\]/g, function (match) { + return replaceMap[match]; + }); + }; + + // Append an array of jQuery nodes to a given element. + Utils.appendMany = function ($element, $nodes) { + // jQuery 1.7.x does not support $.fn.append() with an array + // Fall back to a jQuery object collection using $.fn.add() + if ($.fn.jquery.substr(0, 3) === '1.7') { + var $jqNodes = $(); + + $.map($nodes, function (node) { + $jqNodes = $jqNodes.add(node); + }); + + $nodes = $jqNodes; + } + + $element.append($nodes); + }; + + // Cache objects in Utils.__cache instead of $.data (see #4346) + Utils.__cache = {}; + + var id = 0; + Utils.GetUniqueElementId = function (element) { + // Get a unique element Id. If element has no id, + // creates a new unique number, stores it in the id + // attribute and returns the new id. + // If an id already exists, it simply returns it. + + var select2Id = element.getAttribute('data-select2-id'); + if (select2Id == null) { + // If element has id, use it. + if (element.id) { + select2Id = element.id; + element.setAttribute('data-select2-id', select2Id); + } else { + element.setAttribute('data-select2-id', ++id); + select2Id = id.toString(); + } + } + return select2Id; + }; + + Utils.StoreData = function (element, name, value) { + // Stores an item in the cache for a specified element. + // name is the cache key. + var id = Utils.GetUniqueElementId(element); + if (!Utils.__cache[id]) { + Utils.__cache[id] = {}; + } + + Utils.__cache[id][name] = value; + }; + + Utils.GetData = function (element, name) { + // Retrieves a value from the cache by its key (name) + // name is optional. If no name specified, return + // all cache items for the specified element. + // and for a specified element. + var id = Utils.GetUniqueElementId(element); + if (name) { + if (Utils.__cache[id]) { + if (Utils.__cache[id][name] != null) { + return Utils.__cache[id][name]; + } + return $(element).data(name); // Fallback to HTML5 data attribs. + } + return $(element).data(name); // Fallback to HTML5 data attribs. + } else { + return Utils.__cache[id]; + } + }; + + Utils.RemoveData = function (element) { + // Removes all cached items for a specified element. + var id = Utils.GetUniqueElementId(element); + if (Utils.__cache[id] != null) { + delete Utils.__cache[id]; + } + }; + + return Utils; + }); + + S2.define('select2/results',[ + 'jquery', + './utils' + ], function ($, Utils) { + function Results ($element, options, dataAdapter) { + this.$element = $element; + this.data = dataAdapter; + this.options = options; + + Results.__super__.constructor.call(this); + } + + Utils.Extend(Results, Utils.Observable); + + Results.prototype.render = function () { + var $results = $( + '
                  ' + ); + + if (this.options.get('multiple')) { + $results.attr('aria-multiselectable', 'true'); + } + + this.$results = $results; + + return $results; + }; + + Results.prototype.clear = function () { + this.$results.empty(); + }; + + Results.prototype.displayMessage = function (params) { + var escapeMarkup = this.options.get('escapeMarkup'); + + this.clear(); + this.hideLoading(); + + var $message = $( + '
                • ' + ); + + var message = this.options.get('translations').get(params.message); + + $message.append( + escapeMarkup( + message(params.args) + ) + ); + + $message[0].className += ' select2-results__message'; + + this.$results.append($message); + }; + + Results.prototype.hideMessages = function () { + this.$results.find('.select2-results__message').remove(); + }; + + Results.prototype.append = function (data) { + this.hideLoading(); + + var $options = []; + + if (data.results == null || data.results.length === 0) { + if (this.$results.children().length === 0) { + this.trigger('results:message', { + message: 'noResults' + }); + } + + return; + } + + data.results = this.sort(data.results); + + for (var d = 0; d < data.results.length; d++) { + var item = data.results[d]; + + var $option = this.option(item); + + $options.push($option); + } + + this.$results.append($options); + }; + + Results.prototype.position = function ($results, $dropdown) { + var $resultsContainer = $dropdown.find('.select2-results'); + $resultsContainer.append($results); + }; + + Results.prototype.sort = function (data) { + var sorter = this.options.get('sorter'); + + return sorter(data); + }; + + Results.prototype.highlightFirstItem = function () { + var $options = this.$results + .find('.select2-results__option[aria-selected]'); + + var $selected = $options.filter('[aria-selected=true]'); + + // Check if there are any selected options + if ($selected.length > 0) { + // If there are selected options, highlight the first + $selected.first().trigger('mouseenter'); + } else { + // If there are no selected options, highlight the first option + // in the dropdown + $options.first().trigger('mouseenter'); + } + + this.ensureHighlightVisible(); + }; + + Results.prototype.setClasses = function () { + var self = this; + + this.data.current(function (selected) { + var selectedIds = $.map(selected, function (s) { + return s.id.toString(); + }); + + var $options = self.$results + .find('.select2-results__option[aria-selected]'); + + $options.each(function () { + var $option = $(this); + + var item = Utils.GetData(this, 'data'); + + // id needs to be converted to a string when comparing + var id = '' + item.id; + + if ((item.element != null && item.element.selected) || + (item.element == null && $.inArray(id, selectedIds) > -1)) { + $option.attr('aria-selected', 'true'); + } else { + $option.attr('aria-selected', 'false'); + } + }); + + }); + }; + + Results.prototype.showLoading = function (params) { + this.hideLoading(); + + var loadingMore = this.options.get('translations').get('searching'); + + var loading = { + disabled: true, + loading: true, + text: loadingMore(params) + }; + var $loading = this.option(loading); + $loading.className += ' loading-results'; + + this.$results.prepend($loading); + }; + + Results.prototype.hideLoading = function () { + this.$results.find('.loading-results').remove(); + }; + + Results.prototype.option = function (data) { + var option = document.createElement('li'); + option.className = 'select2-results__option'; + + var attrs = { + 'role': 'treeitem', + 'aria-selected': 'false' + }; + + if (data.disabled) { + delete attrs['aria-selected']; + attrs['aria-disabled'] = 'true'; + } + + if (data.id == null) { + delete attrs['aria-selected']; + } + + if (data._resultId != null) { + option.id = data._resultId; + } + + if (data.title) { + option.title = data.title; + } + + if (data.children) { + attrs.role = 'group'; + attrs['aria-label'] = data.text; + delete attrs['aria-selected']; + } + + for (var attr in attrs) { + var val = attrs[attr]; + + option.setAttribute(attr, val); + } + + if (data.children) { + var $option = $(option); + + var label = document.createElement('strong'); + label.className = 'select2-results__group'; + + var $label = $(label); + this.template(data, label); + + var $children = []; + + for (var c = 0; c < data.children.length; c++) { + var child = data.children[c]; + + var $child = this.option(child); + + $children.push($child); + } + + var $childrenContainer = $('
                    ', { + 'class': 'select2-results__options select2-results__options--nested' + }); + + $childrenContainer.append($children); + + $option.append(label); + $option.append($childrenContainer); + } else { + this.template(data, option); + } + + Utils.StoreData(option, 'data', data); + + return option; + }; + + Results.prototype.bind = function (container, $container) { + var self = this; + + var id = container.id + '-results'; + + this.$results.attr('id', id); + + container.on('results:all', function (params) { + self.clear(); + self.append(params.data); + + if (container.isOpen()) { + self.setClasses(); + self.highlightFirstItem(); + } + }); + + container.on('results:append', function (params) { + self.append(params.data); + + if (container.isOpen()) { + self.setClasses(); + } + }); + + container.on('query', function (params) { + self.hideMessages(); + self.showLoading(params); + }); + + container.on('select', function () { + if (!container.isOpen()) { + return; + } + + self.setClasses(); + + if (self.options.get('scrollAfterSelect')) { + self.highlightFirstItem(); + } + }); + + container.on('unselect', function () { + if (!container.isOpen()) { + return; + } + + self.setClasses(); + + if (self.options.get('scrollAfterSelect')) { + self.highlightFirstItem(); + } + }); + + container.on('open', function () { + // When the dropdown is open, aria-expended="true" + self.$results.attr('aria-expanded', 'true'); + self.$results.attr('aria-hidden', 'false'); + + self.setClasses(); + self.ensureHighlightVisible(); + }); + + container.on('close', function () { + // When the dropdown is closed, aria-expended="false" + self.$results.attr('aria-expanded', 'false'); + self.$results.attr('aria-hidden', 'true'); + self.$results.removeAttr('aria-activedescendant'); + }); + + container.on('results:toggle', function () { + var $highlighted = self.getHighlightedResults(); + + if ($highlighted.length === 0) { + return; + } + + $highlighted.trigger('mouseup'); + }); + + container.on('results:select', function () { + var $highlighted = self.getHighlightedResults(); + + if ($highlighted.length === 0) { + return; + } + + var data = Utils.GetData($highlighted[0], 'data'); + + if ($highlighted.attr('aria-selected') == 'true') { + self.trigger('close', {}); + } else { + self.trigger('select', { + data: data + }); + } + }); + + container.on('results:previous', function () { + var $highlighted = self.getHighlightedResults(); + + var $options = self.$results.find('[aria-selected]'); + + var currentIndex = $options.index($highlighted); + + // If we are already at the top, don't move further + // If no options, currentIndex will be -1 + if (currentIndex <= 0) { + return; + } + + var nextIndex = currentIndex - 1; + + // If none are highlighted, highlight the first + if ($highlighted.length === 0) { + nextIndex = 0; + } + + var $next = $options.eq(nextIndex); + + $next.trigger('mouseenter'); + + var currentOffset = self.$results.offset().top; + var nextTop = $next.offset().top; + var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset); + + if (nextIndex === 0) { + self.$results.scrollTop(0); + } else if (nextTop - currentOffset < 0) { + self.$results.scrollTop(nextOffset); + } + }); + + container.on('results:next', function () { + var $highlighted = self.getHighlightedResults(); + + var $options = self.$results.find('[aria-selected]'); + + var currentIndex = $options.index($highlighted); + + var nextIndex = currentIndex + 1; + + // If we are at the last option, stay there + if (nextIndex >= $options.length) { + return; + } + + var $next = $options.eq(nextIndex); + + $next.trigger('mouseenter'); + + var currentOffset = self.$results.offset().top + + self.$results.outerHeight(false); + var nextBottom = $next.offset().top + $next.outerHeight(false); + var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset; + + if (nextIndex === 0) { + self.$results.scrollTop(0); + } else if (nextBottom > currentOffset) { + self.$results.scrollTop(nextOffset); + } + }); + + container.on('results:focus', function (params) { + params.element.addClass('select2-results__option--highlighted'); + }); + + container.on('results:message', function (params) { + self.displayMessage(params); + }); + + if ($.fn.mousewheel) { + this.$results.on('mousewheel', function (e) { + var top = self.$results.scrollTop(); + + var bottom = self.$results.get(0).scrollHeight - top + e.deltaY; + + var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0; + var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height(); + + if (isAtTop) { + self.$results.scrollTop(0); + + e.preventDefault(); + e.stopPropagation(); + } else if (isAtBottom) { + self.$results.scrollTop( + self.$results.get(0).scrollHeight - self.$results.height() + ); + + e.preventDefault(); + e.stopPropagation(); + } + }); + } + + this.$results.on('mouseup', '.select2-results__option[aria-selected]', + function (evt) { + var $this = $(this); + + var data = Utils.GetData(this, 'data'); + + if ($this.attr('aria-selected') === 'true') { + if (self.options.get('multiple')) { + self.trigger('unselect', { + originalEvent: evt, + data: data + }); + } else { + self.trigger('close', {}); + } + + return; + } + + self.trigger('select', { + originalEvent: evt, + data: data + }); + }); + + this.$results.on('mouseenter', '.select2-results__option[aria-selected]', + function (evt) { + var data = Utils.GetData(this, 'data'); + + self.getHighlightedResults() + .removeClass('select2-results__option--highlighted'); + + self.trigger('results:focus', { + data: data, + element: $(this) + }); + }); + }; + + Results.prototype.getHighlightedResults = function () { + var $highlighted = this.$results + .find('.select2-results__option--highlighted'); + + return $highlighted; + }; + + Results.prototype.destroy = function () { + this.$results.remove(); + }; + + Results.prototype.ensureHighlightVisible = function () { + var $highlighted = this.getHighlightedResults(); + + if ($highlighted.length === 0) { + return; + } + + var $options = this.$results.find('[aria-selected]'); + + var currentIndex = $options.index($highlighted); + + var currentOffset = this.$results.offset().top; + var nextTop = $highlighted.offset().top; + var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset); + + var offsetDelta = nextTop - currentOffset; + nextOffset -= $highlighted.outerHeight(false) * 2; + + if (currentIndex <= 2) { + this.$results.scrollTop(0); + } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) { + this.$results.scrollTop(nextOffset); + } + }; + + Results.prototype.template = function (result, container) { + var template = this.options.get('templateResult'); + var escapeMarkup = this.options.get('escapeMarkup'); + + var content = template(result, container); + + if (content == null) { + container.style.display = 'none'; + } else if (typeof content === 'string') { + container.innerHTML = escapeMarkup(content); + } else { + $(container).append(content); + } + }; + + return Results; + }); + + S2.define('select2/keys',[ + + ], function () { + var KEYS = { + BACKSPACE: 8, + TAB: 9, + ENTER: 13, + SHIFT: 16, + CTRL: 17, + ALT: 18, + ESC: 27, + SPACE: 32, + PAGE_UP: 33, + PAGE_DOWN: 34, + END: 35, + HOME: 36, + LEFT: 37, + UP: 38, + RIGHT: 39, + DOWN: 40, + DELETE: 46 + }; + + return KEYS; + }); + + S2.define('select2/selection/base',[ + 'jquery', + '../utils', + '../keys' + ], function ($, Utils, KEYS) { + function BaseSelection ($element, options) { + this.$element = $element; + this.options = options; + + BaseSelection.__super__.constructor.call(this); + } + + Utils.Extend(BaseSelection, Utils.Observable); + + BaseSelection.prototype.render = function () { + var $selection = $( + '' + ); + + this._tabindex = 0; + + if (Utils.GetData(this.$element[0], 'old-tabindex') != null) { + this._tabindex = Utils.GetData(this.$element[0], 'old-tabindex'); + } else if (this.$element.attr('tabindex') != null) { + this._tabindex = this.$element.attr('tabindex'); + } + + $selection.attr('title', this.$element.attr('title')); + $selection.attr('tabindex', this._tabindex); + + this.$selection = $selection; + + return $selection; + }; + + BaseSelection.prototype.bind = function (container, $container) { + var self = this; + + var id = container.id + '-container'; + var resultsId = container.id + '-results'; + + this.container = container; + + this.$selection.on('focus', function (evt) { + self.trigger('focus', evt); + }); + + this.$selection.on('blur', function (evt) { + self._handleBlur(evt); + }); + + this.$selection.on('keydown', function (evt) { + self.trigger('keypress', evt); + + if (evt.which === KEYS.SPACE) { + evt.preventDefault(); + } + }); + + container.on('results:focus', function (params) { + self.$selection.attr('aria-activedescendant', params.data._resultId); + }); + + container.on('selection:update', function (params) { + self.update(params.data); + }); + + container.on('open', function () { + // When the dropdown is open, aria-expanded="true" + self.$selection.attr('aria-expanded', 'true'); + self.$selection.attr('aria-owns', resultsId); + + self._attachCloseHandler(container); + }); + + container.on('close', function () { + // When the dropdown is closed, aria-expanded="false" + self.$selection.attr('aria-expanded', 'false'); + self.$selection.removeAttr('aria-activedescendant'); + self.$selection.removeAttr('aria-owns'); + + window.setTimeout(function () { + self.$selection.focus(); + }, 0); + + self._detachCloseHandler(container); + }); + + container.on('enable', function () { + self.$selection.attr('tabindex', self._tabindex); + }); + + container.on('disable', function () { + self.$selection.attr('tabindex', '-1'); + }); + }; + + BaseSelection.prototype._handleBlur = function (evt) { + var self = this; + + // This needs to be delayed as the active element is the body when the tab + // key is pressed, possibly along with others. + window.setTimeout(function () { + // Don't trigger `blur` if the focus is still in the selection + if ( + (document.activeElement == self.$selection[0]) || + ($.contains(self.$selection[0], document.activeElement)) + ) { + return; + } + + self.trigger('blur', evt); + }, 1); + }; + + BaseSelection.prototype._attachCloseHandler = function (container) { + var self = this; + + $(document.body).on('mousedown.select2.' + container.id, function (e) { + var $target = $(e.target); + + var $select = $target.closest('.select2'); + + var $all = $('.select2.select2-container--open'); + + $all.each(function () { + var $this = $(this); + + if (this == $select[0]) { + return; + } + + var $element = Utils.GetData(this, 'element'); + + $element.select2('close'); + }); + }); + }; + + BaseSelection.prototype._detachCloseHandler = function (container) { + $(document.body).off('mousedown.select2.' + container.id); + }; + + BaseSelection.prototype.position = function ($selection, $container) { + var $selectionContainer = $container.find('.selection'); + $selectionContainer.append($selection); + }; + + BaseSelection.prototype.destroy = function () { + this._detachCloseHandler(this.container); + }; + + BaseSelection.prototype.update = function (data) { + throw new Error('The `update` method must be defined in child classes.'); + }; + + return BaseSelection; + }); + + S2.define('select2/selection/single',[ + 'jquery', + './base', + '../utils', + '../keys' + ], function ($, BaseSelection, Utils, KEYS) { + function SingleSelection () { + SingleSelection.__super__.constructor.apply(this, arguments); + } + + Utils.Extend(SingleSelection, BaseSelection); + + SingleSelection.prototype.render = function () { + var $selection = SingleSelection.__super__.render.call(this); + + $selection.addClass('select2-selection--single'); + + $selection.html( + '' + + '' + + '' + + '' + ); + + return $selection; + }; + + SingleSelection.prototype.bind = function (container, $container) { + var self = this; + + SingleSelection.__super__.bind.apply(this, arguments); + + var id = container.id + '-container'; + + this.$selection.find('.select2-selection__rendered') + .attr('id', id) + .attr('role', 'textbox') + .attr('aria-readonly', 'true'); + this.$selection.attr('aria-labelledby', id); + + this.$selection.on('mousedown', function (evt) { + // Only respond to left clicks + if (evt.which !== 1) { + return; + } + + self.trigger('toggle', { + originalEvent: evt + }); + }); + + this.$selection.on('focus', function (evt) { + // User focuses on the container + }); + + this.$selection.on('blur', function (evt) { + // User exits the container + }); + + container.on('focus', function (evt) { + if (!container.isOpen()) { + self.$selection.focus(); + } + }); + }; + + SingleSelection.prototype.clear = function () { + var $rendered = this.$selection.find('.select2-selection__rendered'); + $rendered.empty(); + $rendered.removeAttr('title'); // clear tooltip on empty + }; + + SingleSelection.prototype.display = function (data, container) { + var template = this.options.get('templateSelection'); + var escapeMarkup = this.options.get('escapeMarkup'); + + return escapeMarkup(template(data, container)); + }; + + SingleSelection.prototype.selectionContainer = function () { + return $(''); + }; + + SingleSelection.prototype.update = function (data) { + if (data.length === 0) { + this.clear(); + return; + } + + var selection = data[0]; + + var $rendered = this.$selection.find('.select2-selection__rendered'); + var formatted = this.display(selection, $rendered); + + $rendered.empty().append(formatted); + $rendered.attr('title', selection.title || selection.text); + }; + + return SingleSelection; + }); + + S2.define('select2/selection/multiple',[ + 'jquery', + './base', + '../utils' + ], function ($, BaseSelection, Utils) { + function MultipleSelection ($element, options) { + MultipleSelection.__super__.constructor.apply(this, arguments); + } + + Utils.Extend(MultipleSelection, BaseSelection); + + MultipleSelection.prototype.render = function () { + var $selection = MultipleSelection.__super__.render.call(this); + + $selection.addClass('select2-selection--multiple'); + + $selection.html( + '
                      ' + ); + + return $selection; + }; + + MultipleSelection.prototype.bind = function (container, $container) { + var self = this; + + MultipleSelection.__super__.bind.apply(this, arguments); + + this.$selection.on('click', function (evt) { + self.trigger('toggle', { + originalEvent: evt + }); + }); + + this.$selection.on( + 'click', + '.select2-selection__choice__remove', + function (evt) { + // Ignore the event if it is disabled + if (self.options.get('disabled')) { + return; + } + + var $remove = $(this); + var $selection = $remove.parent(); + + var data = Utils.GetData($selection[0], 'data'); + + self.trigger('unselect', { + originalEvent: evt, + data: data + }); + } + ); + }; + + MultipleSelection.prototype.clear = function () { + var $rendered = this.$selection.find('.select2-selection__rendered'); + $rendered.empty(); + $rendered.removeAttr('title'); + }; + + MultipleSelection.prototype.display = function (data, container) { + var template = this.options.get('templateSelection'); + var escapeMarkup = this.options.get('escapeMarkup'); + + return escapeMarkup(template(data, container)); + }; + + MultipleSelection.prototype.selectionContainer = function () { + var $container = $( + '
                    • ' + + '' + + '×' + + '' + + '
                    • ' + ); + + return $container; + }; + + MultipleSelection.prototype.update = function (data) { + this.clear(); + + if (data.length === 0) { + return; + } + + var $selections = []; + + for (var d = 0; d < data.length; d++) { + var selection = data[d]; + + var $selection = this.selectionContainer(); + var formatted = this.display(selection, $selection); + + $selection.append(formatted); + $selection.attr('title', selection.title || selection.text); + + Utils.StoreData($selection[0], 'data', selection); + + $selections.push($selection); + } + + var $rendered = this.$selection.find('.select2-selection__rendered'); + + Utils.appendMany($rendered, $selections); + }; + + return MultipleSelection; + }); + + S2.define('select2/selection/placeholder',[ + '../utils' + ], function (Utils) { + function Placeholder (decorated, $element, options) { + this.placeholder = this.normalizePlaceholder(options.get('placeholder')); + + decorated.call(this, $element, options); + } + + Placeholder.prototype.normalizePlaceholder = function (_, placeholder) { + if (typeof placeholder === 'string') { + placeholder = { + id: '', + text: placeholder + }; + } + + return placeholder; + }; + + Placeholder.prototype.createPlaceholder = function (decorated, placeholder) { + var $placeholder = this.selectionContainer(); + + $placeholder.html(this.display(placeholder)); + $placeholder.addClass('select2-selection__placeholder') + .removeClass('select2-selection__choice'); + + return $placeholder; + }; + + Placeholder.prototype.update = function (decorated, data) { + var singlePlaceholder = ( + data.length == 1 && data[0].id != this.placeholder.id + ); + var multipleSelections = data.length > 1; + + if (multipleSelections || singlePlaceholder) { + return decorated.call(this, data); + } + + this.clear(); + + var $placeholder = this.createPlaceholder(this.placeholder); + + this.$selection.find('.select2-selection__rendered').append($placeholder); + }; + + return Placeholder; + }); + + S2.define('select2/selection/allowClear',[ + 'jquery', + '../keys', + '../utils' + ], function ($, KEYS, Utils) { + function AllowClear () { } + + AllowClear.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + if (this.placeholder == null) { + if (this.options.get('debug') && window.console && console.error) { + console.error( + 'Select2: The `allowClear` option should be used in combination ' + + 'with the `placeholder` option.' + ); + } + } + + this.$selection.on('mousedown', '.select2-selection__clear', + function (evt) { + self._handleClear(evt); + }); + + container.on('keypress', function (evt) { + self._handleKeyboardClear(evt, container); + }); + }; + + AllowClear.prototype._handleClear = function (_, evt) { + // Ignore the event if it is disabled + if (this.options.get('disabled')) { + return; + } + + var $clear = this.$selection.find('.select2-selection__clear'); + + // Ignore the event if nothing has been selected + if ($clear.length === 0) { + return; + } + + evt.stopPropagation(); + + var data = Utils.GetData($clear[0], 'data'); + + var previousVal = this.$element.val(); + this.$element.val(this.placeholder.id); + + var unselectData = { + data: data + }; + this.trigger('clear', unselectData); + if (unselectData.prevented) { + this.$element.val(previousVal); + return; + } + + for (var d = 0; d < data.length; d++) { + unselectData = { + data: data[d] + }; + + // Trigger the `unselect` event, so people can prevent it from being + // cleared. + this.trigger('unselect', unselectData); + + // If the event was prevented, don't clear it out. + if (unselectData.prevented) { + this.$element.val(previousVal); + return; + } + } + + this.$element.trigger('change'); + + this.trigger('toggle', {}); + }; + + AllowClear.prototype._handleKeyboardClear = function (_, evt, container) { + if (container.isOpen()) { + return; + } + + if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) { + this._handleClear(evt); + } + }; + + AllowClear.prototype.update = function (decorated, data) { + decorated.call(this, data); + + if (this.$selection.find('.select2-selection__placeholder').length > 0 || + data.length === 0) { + return; + } + + var removeAll = this.options.get('translations').get('removeAllItems'); + + var $remove = $( + '' + + '×' + + '' + ); + Utils.StoreData($remove[0], 'data', data); + + this.$selection.find('.select2-selection__rendered').prepend($remove); + }; + + return AllowClear; + }); + + S2.define('select2/selection/search',[ + 'jquery', + '../utils', + '../keys' + ], function ($, Utils, KEYS) { + function Search (decorated, $element, options) { + decorated.call(this, $element, options); + } + + Search.prototype.render = function (decorated) { + var $search = $( + '' + ); + + this.$searchContainer = $search; + this.$search = $search.find('input'); + + var $rendered = decorated.call(this); + + this._transferTabIndex(); + + return $rendered; + }; + + Search.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('open', function () { + self.$search.trigger('focus'); + }); + + container.on('close', function () { + self.$search.val(''); + self.$search.removeAttr('aria-activedescendant'); + self.$search.trigger('focus'); + }); + + container.on('enable', function () { + self.$search.prop('disabled', false); + + self._transferTabIndex(); + }); + + container.on('disable', function () { + self.$search.prop('disabled', true); + }); + + container.on('focus', function (evt) { + self.$search.trigger('focus'); + }); + + container.on('results:focus', function (params) { + self.$search.attr('aria-activedescendant', params.id); + }); + + this.$selection.on('focusin', '.select2-search--inline', function (evt) { + self.trigger('focus', evt); + }); + + this.$selection.on('focusout', '.select2-search--inline', function (evt) { + self._handleBlur(evt); + }); + + this.$selection.on('keydown', '.select2-search--inline', function (evt) { + evt.stopPropagation(); + + self.trigger('keypress', evt); + + self._keyUpPrevented = evt.isDefaultPrevented(); + + var key = evt.which; + + if (key === KEYS.BACKSPACE && self.$search.val() === '') { + var $previousChoice = self.$searchContainer + .prev('.select2-selection__choice'); + + if ($previousChoice.length > 0) { + var item = Utils.GetData($previousChoice[0], 'data'); + + self.searchRemoveChoice(item); + + evt.preventDefault(); + } + } + }); + + // Try to detect the IE version should the `documentMode` property that + // is stored on the document. This is only implemented in IE and is + // slightly cleaner than doing a user agent check. + // This property is not available in Edge, but Edge also doesn't have + // this bug. + var msie = document.documentMode; + var disableInputEvents = msie && msie <= 11; + + // Workaround for browsers which do not support the `input` event + // This will prevent double-triggering of events for browsers which support + // both the `keyup` and `input` events. + this.$selection.on( + 'input.searchcheck', + '.select2-search--inline', + function (evt) { + // IE will trigger the `input` event when a placeholder is used on a + // search box. To get around this issue, we are forced to ignore all + // `input` events in IE and keep using `keyup`. + if (disableInputEvents) { + self.$selection.off('input.search input.searchcheck'); + return; + } + + // Unbind the duplicated `keyup` event + self.$selection.off('keyup.search'); + } + ); + + this.$selection.on( + 'keyup.search input.search', + '.select2-search--inline', + function (evt) { + // IE will trigger the `input` event when a placeholder is used on a + // search box. To get around this issue, we are forced to ignore all + // `input` events in IE and keep using `keyup`. + if (disableInputEvents && evt.type === 'input') { + self.$selection.off('input.search input.searchcheck'); + return; + } + + var key = evt.which; + + // We can freely ignore events from modifier keys + if (key == KEYS.SHIFT || key == KEYS.CTRL || key == KEYS.ALT) { + return; + } + + // Tabbing will be handled during the `keydown` phase + if (key == KEYS.TAB) { + return; + } + + self.handleSearch(evt); + } + ); + }; + + /** + * This method will transfer the tabindex attribute from the rendered + * selection to the search box. This allows for the search box to be used as + * the primary focus instead of the selection container. + * + * @private + */ + Search.prototype._transferTabIndex = function (decorated) { + this.$search.attr('tabindex', this.$selection.attr('tabindex')); + this.$selection.attr('tabindex', '-1'); + }; + + Search.prototype.createPlaceholder = function (decorated, placeholder) { + this.$search.attr('placeholder', placeholder.text); + }; + + Search.prototype.update = function (decorated, data) { + var searchHadFocus = this.$search[0] == document.activeElement; + + this.$search.attr('placeholder', ''); + + decorated.call(this, data); + + this.$selection.find('.select2-selection__rendered') + .append(this.$searchContainer); + + this.resizeSearch(); + if (searchHadFocus) { + var isTagInput = this.$element.find('[data-select2-tag]').length; + if (isTagInput) { + // fix IE11 bug where tag input lost focus + this.$element.focus(); + } else { + this.$search.focus(); + } + } + }; + + Search.prototype.handleSearch = function () { + this.resizeSearch(); + + if (!this._keyUpPrevented) { + var input = this.$search.val(); + + this.trigger('query', { + term: input + }); + } + + this._keyUpPrevented = false; + }; + + Search.prototype.searchRemoveChoice = function (decorated, item) { + this.trigger('unselect', { + data: item + }); + + this.$search.val(item.text); + this.handleSearch(); + }; + + Search.prototype.resizeSearch = function () { + this.$search.css('width', '25px'); + + var width = ''; + + if (this.$search.attr('placeholder') !== '') { + width = this.$selection.find('.select2-selection__rendered').innerWidth(); + } else { + var minimumWidth = this.$search.val().length + 1; + + width = (minimumWidth * 0.75) + 'em'; + } + + this.$search.css('width', width); + }; + + return Search; + }); + + S2.define('select2/selection/eventRelay',[ + 'jquery' + ], function ($) { + function EventRelay () { } + + EventRelay.prototype.bind = function (decorated, container, $container) { + var self = this; + var relayEvents = [ + 'open', 'opening', + 'close', 'closing', + 'select', 'selecting', + 'unselect', 'unselecting', + 'clear', 'clearing' + ]; + + var preventableEvents = [ + 'opening', 'closing', 'selecting', 'unselecting', 'clearing' + ]; + + decorated.call(this, container, $container); + + container.on('*', function (name, params) { + // Ignore events that should not be relayed + if ($.inArray(name, relayEvents) === -1) { + return; + } + + // The parameters should always be an object + params = params || {}; + + // Generate the jQuery event for the Select2 event + var evt = $.Event('select2:' + name, { + params: params + }); + + self.$element.trigger(evt); + + // Only handle preventable events if it was one + if ($.inArray(name, preventableEvents) === -1) { + return; + } + + params.prevented = evt.isDefaultPrevented(); + }); + }; + + return EventRelay; + }); + + S2.define('select2/translation',[ + 'jquery', + 'require' + ], function ($, require) { + function Translation (dict) { + this.dict = dict || {}; + } + + Translation.prototype.all = function () { + return this.dict; + }; + + Translation.prototype.get = function (key) { + return this.dict[key]; + }; + + Translation.prototype.extend = function (translation) { + this.dict = $.extend({}, translation.all(), this.dict); + }; + + // Static functions + + Translation._cache = {}; + + Translation.loadPath = function (path) { + if (!(path in Translation._cache)) { + var translations = require(path); + + Translation._cache[path] = translations; + } + + return new Translation(Translation._cache[path]); + }; + + return Translation; + }); + + S2.define('select2/diacritics',[ + + ], function () { + var diacritics = { + '\u24B6': 'A', + '\uFF21': 'A', + '\u00C0': 'A', + '\u00C1': 'A', + '\u00C2': 'A', + '\u1EA6': 'A', + '\u1EA4': 'A', + '\u1EAA': 'A', + '\u1EA8': 'A', + '\u00C3': 'A', + '\u0100': 'A', + '\u0102': 'A', + '\u1EB0': 'A', + '\u1EAE': 'A', + '\u1EB4': 'A', + '\u1EB2': 'A', + '\u0226': 'A', + '\u01E0': 'A', + '\u00C4': 'A', + '\u01DE': 'A', + '\u1EA2': 'A', + '\u00C5': 'A', + '\u01FA': 'A', + '\u01CD': 'A', + '\u0200': 'A', + '\u0202': 'A', + '\u1EA0': 'A', + '\u1EAC': 'A', + '\u1EB6': 'A', + '\u1E00': 'A', + '\u0104': 'A', + '\u023A': 'A', + '\u2C6F': 'A', + '\uA732': 'AA', + '\u00C6': 'AE', + '\u01FC': 'AE', + '\u01E2': 'AE', + '\uA734': 'AO', + '\uA736': 'AU', + '\uA738': 'AV', + '\uA73A': 'AV', + '\uA73C': 'AY', + '\u24B7': 'B', + '\uFF22': 'B', + '\u1E02': 'B', + '\u1E04': 'B', + '\u1E06': 'B', + '\u0243': 'B', + '\u0182': 'B', + '\u0181': 'B', + '\u24B8': 'C', + '\uFF23': 'C', + '\u0106': 'C', + '\u0108': 'C', + '\u010A': 'C', + '\u010C': 'C', + '\u00C7': 'C', + '\u1E08': 'C', + '\u0187': 'C', + '\u023B': 'C', + '\uA73E': 'C', + '\u24B9': 'D', + '\uFF24': 'D', + '\u1E0A': 'D', + '\u010E': 'D', + '\u1E0C': 'D', + '\u1E10': 'D', + '\u1E12': 'D', + '\u1E0E': 'D', + '\u0110': 'D', + '\u018B': 'D', + '\u018A': 'D', + '\u0189': 'D', + '\uA779': 'D', + '\u01F1': 'DZ', + '\u01C4': 'DZ', + '\u01F2': 'Dz', + '\u01C5': 'Dz', + '\u24BA': 'E', + '\uFF25': 'E', + '\u00C8': 'E', + '\u00C9': 'E', + '\u00CA': 'E', + '\u1EC0': 'E', + '\u1EBE': 'E', + '\u1EC4': 'E', + '\u1EC2': 'E', + '\u1EBC': 'E', + '\u0112': 'E', + '\u1E14': 'E', + '\u1E16': 'E', + '\u0114': 'E', + '\u0116': 'E', + '\u00CB': 'E', + '\u1EBA': 'E', + '\u011A': 'E', + '\u0204': 'E', + '\u0206': 'E', + '\u1EB8': 'E', + '\u1EC6': 'E', + '\u0228': 'E', + '\u1E1C': 'E', + '\u0118': 'E', + '\u1E18': 'E', + '\u1E1A': 'E', + '\u0190': 'E', + '\u018E': 'E', + '\u24BB': 'F', + '\uFF26': 'F', + '\u1E1E': 'F', + '\u0191': 'F', + '\uA77B': 'F', + '\u24BC': 'G', + '\uFF27': 'G', + '\u01F4': 'G', + '\u011C': 'G', + '\u1E20': 'G', + '\u011E': 'G', + '\u0120': 'G', + '\u01E6': 'G', + '\u0122': 'G', + '\u01E4': 'G', + '\u0193': 'G', + '\uA7A0': 'G', + '\uA77D': 'G', + '\uA77E': 'G', + '\u24BD': 'H', + '\uFF28': 'H', + '\u0124': 'H', + '\u1E22': 'H', + '\u1E26': 'H', + '\u021E': 'H', + '\u1E24': 'H', + '\u1E28': 'H', + '\u1E2A': 'H', + '\u0126': 'H', + '\u2C67': 'H', + '\u2C75': 'H', + '\uA78D': 'H', + '\u24BE': 'I', + '\uFF29': 'I', + '\u00CC': 'I', + '\u00CD': 'I', + '\u00CE': 'I', + '\u0128': 'I', + '\u012A': 'I', + '\u012C': 'I', + '\u0130': 'I', + '\u00CF': 'I', + '\u1E2E': 'I', + '\u1EC8': 'I', + '\u01CF': 'I', + '\u0208': 'I', + '\u020A': 'I', + '\u1ECA': 'I', + '\u012E': 'I', + '\u1E2C': 'I', + '\u0197': 'I', + '\u24BF': 'J', + '\uFF2A': 'J', + '\u0134': 'J', + '\u0248': 'J', + '\u24C0': 'K', + '\uFF2B': 'K', + '\u1E30': 'K', + '\u01E8': 'K', + '\u1E32': 'K', + '\u0136': 'K', + '\u1E34': 'K', + '\u0198': 'K', + '\u2C69': 'K', + '\uA740': 'K', + '\uA742': 'K', + '\uA744': 'K', + '\uA7A2': 'K', + '\u24C1': 'L', + '\uFF2C': 'L', + '\u013F': 'L', + '\u0139': 'L', + '\u013D': 'L', + '\u1E36': 'L', + '\u1E38': 'L', + '\u013B': 'L', + '\u1E3C': 'L', + '\u1E3A': 'L', + '\u0141': 'L', + '\u023D': 'L', + '\u2C62': 'L', + '\u2C60': 'L', + '\uA748': 'L', + '\uA746': 'L', + '\uA780': 'L', + '\u01C7': 'LJ', + '\u01C8': 'Lj', + '\u24C2': 'M', + '\uFF2D': 'M', + '\u1E3E': 'M', + '\u1E40': 'M', + '\u1E42': 'M', + '\u2C6E': 'M', + '\u019C': 'M', + '\u24C3': 'N', + '\uFF2E': 'N', + '\u01F8': 'N', + '\u0143': 'N', + '\u00D1': 'N', + '\u1E44': 'N', + '\u0147': 'N', + '\u1E46': 'N', + '\u0145': 'N', + '\u1E4A': 'N', + '\u1E48': 'N', + '\u0220': 'N', + '\u019D': 'N', + '\uA790': 'N', + '\uA7A4': 'N', + '\u01CA': 'NJ', + '\u01CB': 'Nj', + '\u24C4': 'O', + '\uFF2F': 'O', + '\u00D2': 'O', + '\u00D3': 'O', + '\u00D4': 'O', + '\u1ED2': 'O', + '\u1ED0': 'O', + '\u1ED6': 'O', + '\u1ED4': 'O', + '\u00D5': 'O', + '\u1E4C': 'O', + '\u022C': 'O', + '\u1E4E': 'O', + '\u014C': 'O', + '\u1E50': 'O', + '\u1E52': 'O', + '\u014E': 'O', + '\u022E': 'O', + '\u0230': 'O', + '\u00D6': 'O', + '\u022A': 'O', + '\u1ECE': 'O', + '\u0150': 'O', + '\u01D1': 'O', + '\u020C': 'O', + '\u020E': 'O', + '\u01A0': 'O', + '\u1EDC': 'O', + '\u1EDA': 'O', + '\u1EE0': 'O', + '\u1EDE': 'O', + '\u1EE2': 'O', + '\u1ECC': 'O', + '\u1ED8': 'O', + '\u01EA': 'O', + '\u01EC': 'O', + '\u00D8': 'O', + '\u01FE': 'O', + '\u0186': 'O', + '\u019F': 'O', + '\uA74A': 'O', + '\uA74C': 'O', + '\u0152': 'OE', + '\u01A2': 'OI', + '\uA74E': 'OO', + '\u0222': 'OU', + '\u24C5': 'P', + '\uFF30': 'P', + '\u1E54': 'P', + '\u1E56': 'P', + '\u01A4': 'P', + '\u2C63': 'P', + '\uA750': 'P', + '\uA752': 'P', + '\uA754': 'P', + '\u24C6': 'Q', + '\uFF31': 'Q', + '\uA756': 'Q', + '\uA758': 'Q', + '\u024A': 'Q', + '\u24C7': 'R', + '\uFF32': 'R', + '\u0154': 'R', + '\u1E58': 'R', + '\u0158': 'R', + '\u0210': 'R', + '\u0212': 'R', + '\u1E5A': 'R', + '\u1E5C': 'R', + '\u0156': 'R', + '\u1E5E': 'R', + '\u024C': 'R', + '\u2C64': 'R', + '\uA75A': 'R', + '\uA7A6': 'R', + '\uA782': 'R', + '\u24C8': 'S', + '\uFF33': 'S', + '\u1E9E': 'S', + '\u015A': 'S', + '\u1E64': 'S', + '\u015C': 'S', + '\u1E60': 'S', + '\u0160': 'S', + '\u1E66': 'S', + '\u1E62': 'S', + '\u1E68': 'S', + '\u0218': 'S', + '\u015E': 'S', + '\u2C7E': 'S', + '\uA7A8': 'S', + '\uA784': 'S', + '\u24C9': 'T', + '\uFF34': 'T', + '\u1E6A': 'T', + '\u0164': 'T', + '\u1E6C': 'T', + '\u021A': 'T', + '\u0162': 'T', + '\u1E70': 'T', + '\u1E6E': 'T', + '\u0166': 'T', + '\u01AC': 'T', + '\u01AE': 'T', + '\u023E': 'T', + '\uA786': 'T', + '\uA728': 'TZ', + '\u24CA': 'U', + '\uFF35': 'U', + '\u00D9': 'U', + '\u00DA': 'U', + '\u00DB': 'U', + '\u0168': 'U', + '\u1E78': 'U', + '\u016A': 'U', + '\u1E7A': 'U', + '\u016C': 'U', + '\u00DC': 'U', + '\u01DB': 'U', + '\u01D7': 'U', + '\u01D5': 'U', + '\u01D9': 'U', + '\u1EE6': 'U', + '\u016E': 'U', + '\u0170': 'U', + '\u01D3': 'U', + '\u0214': 'U', + '\u0216': 'U', + '\u01AF': 'U', + '\u1EEA': 'U', + '\u1EE8': 'U', + '\u1EEE': 'U', + '\u1EEC': 'U', + '\u1EF0': 'U', + '\u1EE4': 'U', + '\u1E72': 'U', + '\u0172': 'U', + '\u1E76': 'U', + '\u1E74': 'U', + '\u0244': 'U', + '\u24CB': 'V', + '\uFF36': 'V', + '\u1E7C': 'V', + '\u1E7E': 'V', + '\u01B2': 'V', + '\uA75E': 'V', + '\u0245': 'V', + '\uA760': 'VY', + '\u24CC': 'W', + '\uFF37': 'W', + '\u1E80': 'W', + '\u1E82': 'W', + '\u0174': 'W', + '\u1E86': 'W', + '\u1E84': 'W', + '\u1E88': 'W', + '\u2C72': 'W', + '\u24CD': 'X', + '\uFF38': 'X', + '\u1E8A': 'X', + '\u1E8C': 'X', + '\u24CE': 'Y', + '\uFF39': 'Y', + '\u1EF2': 'Y', + '\u00DD': 'Y', + '\u0176': 'Y', + '\u1EF8': 'Y', + '\u0232': 'Y', + '\u1E8E': 'Y', + '\u0178': 'Y', + '\u1EF6': 'Y', + '\u1EF4': 'Y', + '\u01B3': 'Y', + '\u024E': 'Y', + '\u1EFE': 'Y', + '\u24CF': 'Z', + '\uFF3A': 'Z', + '\u0179': 'Z', + '\u1E90': 'Z', + '\u017B': 'Z', + '\u017D': 'Z', + '\u1E92': 'Z', + '\u1E94': 'Z', + '\u01B5': 'Z', + '\u0224': 'Z', + '\u2C7F': 'Z', + '\u2C6B': 'Z', + '\uA762': 'Z', + '\u24D0': 'a', + '\uFF41': 'a', + '\u1E9A': 'a', + '\u00E0': 'a', + '\u00E1': 'a', + '\u00E2': 'a', + '\u1EA7': 'a', + '\u1EA5': 'a', + '\u1EAB': 'a', + '\u1EA9': 'a', + '\u00E3': 'a', + '\u0101': 'a', + '\u0103': 'a', + '\u1EB1': 'a', + '\u1EAF': 'a', + '\u1EB5': 'a', + '\u1EB3': 'a', + '\u0227': 'a', + '\u01E1': 'a', + '\u00E4': 'a', + '\u01DF': 'a', + '\u1EA3': 'a', + '\u00E5': 'a', + '\u01FB': 'a', + '\u01CE': 'a', + '\u0201': 'a', + '\u0203': 'a', + '\u1EA1': 'a', + '\u1EAD': 'a', + '\u1EB7': 'a', + '\u1E01': 'a', + '\u0105': 'a', + '\u2C65': 'a', + '\u0250': 'a', + '\uA733': 'aa', + '\u00E6': 'ae', + '\u01FD': 'ae', + '\u01E3': 'ae', + '\uA735': 'ao', + '\uA737': 'au', + '\uA739': 'av', + '\uA73B': 'av', + '\uA73D': 'ay', + '\u24D1': 'b', + '\uFF42': 'b', + '\u1E03': 'b', + '\u1E05': 'b', + '\u1E07': 'b', + '\u0180': 'b', + '\u0183': 'b', + '\u0253': 'b', + '\u24D2': 'c', + '\uFF43': 'c', + '\u0107': 'c', + '\u0109': 'c', + '\u010B': 'c', + '\u010D': 'c', + '\u00E7': 'c', + '\u1E09': 'c', + '\u0188': 'c', + '\u023C': 'c', + '\uA73F': 'c', + '\u2184': 'c', + '\u24D3': 'd', + '\uFF44': 'd', + '\u1E0B': 'd', + '\u010F': 'd', + '\u1E0D': 'd', + '\u1E11': 'd', + '\u1E13': 'd', + '\u1E0F': 'd', + '\u0111': 'd', + '\u018C': 'd', + '\u0256': 'd', + '\u0257': 'd', + '\uA77A': 'd', + '\u01F3': 'dz', + '\u01C6': 'dz', + '\u24D4': 'e', + '\uFF45': 'e', + '\u00E8': 'e', + '\u00E9': 'e', + '\u00EA': 'e', + '\u1EC1': 'e', + '\u1EBF': 'e', + '\u1EC5': 'e', + '\u1EC3': 'e', + '\u1EBD': 'e', + '\u0113': 'e', + '\u1E15': 'e', + '\u1E17': 'e', + '\u0115': 'e', + '\u0117': 'e', + '\u00EB': 'e', + '\u1EBB': 'e', + '\u011B': 'e', + '\u0205': 'e', + '\u0207': 'e', + '\u1EB9': 'e', + '\u1EC7': 'e', + '\u0229': 'e', + '\u1E1D': 'e', + '\u0119': 'e', + '\u1E19': 'e', + '\u1E1B': 'e', + '\u0247': 'e', + '\u025B': 'e', + '\u01DD': 'e', + '\u24D5': 'f', + '\uFF46': 'f', + '\u1E1F': 'f', + '\u0192': 'f', + '\uA77C': 'f', + '\u24D6': 'g', + '\uFF47': 'g', + '\u01F5': 'g', + '\u011D': 'g', + '\u1E21': 'g', + '\u011F': 'g', + '\u0121': 'g', + '\u01E7': 'g', + '\u0123': 'g', + '\u01E5': 'g', + '\u0260': 'g', + '\uA7A1': 'g', + '\u1D79': 'g', + '\uA77F': 'g', + '\u24D7': 'h', + '\uFF48': 'h', + '\u0125': 'h', + '\u1E23': 'h', + '\u1E27': 'h', + '\u021F': 'h', + '\u1E25': 'h', + '\u1E29': 'h', + '\u1E2B': 'h', + '\u1E96': 'h', + '\u0127': 'h', + '\u2C68': 'h', + '\u2C76': 'h', + '\u0265': 'h', + '\u0195': 'hv', + '\u24D8': 'i', + '\uFF49': 'i', + '\u00EC': 'i', + '\u00ED': 'i', + '\u00EE': 'i', + '\u0129': 'i', + '\u012B': 'i', + '\u012D': 'i', + '\u00EF': 'i', + '\u1E2F': 'i', + '\u1EC9': 'i', + '\u01D0': 'i', + '\u0209': 'i', + '\u020B': 'i', + '\u1ECB': 'i', + '\u012F': 'i', + '\u1E2D': 'i', + '\u0268': 'i', + '\u0131': 'i', + '\u24D9': 'j', + '\uFF4A': 'j', + '\u0135': 'j', + '\u01F0': 'j', + '\u0249': 'j', + '\u24DA': 'k', + '\uFF4B': 'k', + '\u1E31': 'k', + '\u01E9': 'k', + '\u1E33': 'k', + '\u0137': 'k', + '\u1E35': 'k', + '\u0199': 'k', + '\u2C6A': 'k', + '\uA741': 'k', + '\uA743': 'k', + '\uA745': 'k', + '\uA7A3': 'k', + '\u24DB': 'l', + '\uFF4C': 'l', + '\u0140': 'l', + '\u013A': 'l', + '\u013E': 'l', + '\u1E37': 'l', + '\u1E39': 'l', + '\u013C': 'l', + '\u1E3D': 'l', + '\u1E3B': 'l', + '\u017F': 'l', + '\u0142': 'l', + '\u019A': 'l', + '\u026B': 'l', + '\u2C61': 'l', + '\uA749': 'l', + '\uA781': 'l', + '\uA747': 'l', + '\u01C9': 'lj', + '\u24DC': 'm', + '\uFF4D': 'm', + '\u1E3F': 'm', + '\u1E41': 'm', + '\u1E43': 'm', + '\u0271': 'm', + '\u026F': 'm', + '\u24DD': 'n', + '\uFF4E': 'n', + '\u01F9': 'n', + '\u0144': 'n', + '\u00F1': 'n', + '\u1E45': 'n', + '\u0148': 'n', + '\u1E47': 'n', + '\u0146': 'n', + '\u1E4B': 'n', + '\u1E49': 'n', + '\u019E': 'n', + '\u0272': 'n', + '\u0149': 'n', + '\uA791': 'n', + '\uA7A5': 'n', + '\u01CC': 'nj', + '\u24DE': 'o', + '\uFF4F': 'o', + '\u00F2': 'o', + '\u00F3': 'o', + '\u00F4': 'o', + '\u1ED3': 'o', + '\u1ED1': 'o', + '\u1ED7': 'o', + '\u1ED5': 'o', + '\u00F5': 'o', + '\u1E4D': 'o', + '\u022D': 'o', + '\u1E4F': 'o', + '\u014D': 'o', + '\u1E51': 'o', + '\u1E53': 'o', + '\u014F': 'o', + '\u022F': 'o', + '\u0231': 'o', + '\u00F6': 'o', + '\u022B': 'o', + '\u1ECF': 'o', + '\u0151': 'o', + '\u01D2': 'o', + '\u020D': 'o', + '\u020F': 'o', + '\u01A1': 'o', + '\u1EDD': 'o', + '\u1EDB': 'o', + '\u1EE1': 'o', + '\u1EDF': 'o', + '\u1EE3': 'o', + '\u1ECD': 'o', + '\u1ED9': 'o', + '\u01EB': 'o', + '\u01ED': 'o', + '\u00F8': 'o', + '\u01FF': 'o', + '\u0254': 'o', + '\uA74B': 'o', + '\uA74D': 'o', + '\u0275': 'o', + '\u0153': 'oe', + '\u01A3': 'oi', + '\u0223': 'ou', + '\uA74F': 'oo', + '\u24DF': 'p', + '\uFF50': 'p', + '\u1E55': 'p', + '\u1E57': 'p', + '\u01A5': 'p', + '\u1D7D': 'p', + '\uA751': 'p', + '\uA753': 'p', + '\uA755': 'p', + '\u24E0': 'q', + '\uFF51': 'q', + '\u024B': 'q', + '\uA757': 'q', + '\uA759': 'q', + '\u24E1': 'r', + '\uFF52': 'r', + '\u0155': 'r', + '\u1E59': 'r', + '\u0159': 'r', + '\u0211': 'r', + '\u0213': 'r', + '\u1E5B': 'r', + '\u1E5D': 'r', + '\u0157': 'r', + '\u1E5F': 'r', + '\u024D': 'r', + '\u027D': 'r', + '\uA75B': 'r', + '\uA7A7': 'r', + '\uA783': 'r', + '\u24E2': 's', + '\uFF53': 's', + '\u00DF': 's', + '\u015B': 's', + '\u1E65': 's', + '\u015D': 's', + '\u1E61': 's', + '\u0161': 's', + '\u1E67': 's', + '\u1E63': 's', + '\u1E69': 's', + '\u0219': 's', + '\u015F': 's', + '\u023F': 's', + '\uA7A9': 's', + '\uA785': 's', + '\u1E9B': 's', + '\u24E3': 't', + '\uFF54': 't', + '\u1E6B': 't', + '\u1E97': 't', + '\u0165': 't', + '\u1E6D': 't', + '\u021B': 't', + '\u0163': 't', + '\u1E71': 't', + '\u1E6F': 't', + '\u0167': 't', + '\u01AD': 't', + '\u0288': 't', + '\u2C66': 't', + '\uA787': 't', + '\uA729': 'tz', + '\u24E4': 'u', + '\uFF55': 'u', + '\u00F9': 'u', + '\u00FA': 'u', + '\u00FB': 'u', + '\u0169': 'u', + '\u1E79': 'u', + '\u016B': 'u', + '\u1E7B': 'u', + '\u016D': 'u', + '\u00FC': 'u', + '\u01DC': 'u', + '\u01D8': 'u', + '\u01D6': 'u', + '\u01DA': 'u', + '\u1EE7': 'u', + '\u016F': 'u', + '\u0171': 'u', + '\u01D4': 'u', + '\u0215': 'u', + '\u0217': 'u', + '\u01B0': 'u', + '\u1EEB': 'u', + '\u1EE9': 'u', + '\u1EEF': 'u', + '\u1EED': 'u', + '\u1EF1': 'u', + '\u1EE5': 'u', + '\u1E73': 'u', + '\u0173': 'u', + '\u1E77': 'u', + '\u1E75': 'u', + '\u0289': 'u', + '\u24E5': 'v', + '\uFF56': 'v', + '\u1E7D': 'v', + '\u1E7F': 'v', + '\u028B': 'v', + '\uA75F': 'v', + '\u028C': 'v', + '\uA761': 'vy', + '\u24E6': 'w', + '\uFF57': 'w', + '\u1E81': 'w', + '\u1E83': 'w', + '\u0175': 'w', + '\u1E87': 'w', + '\u1E85': 'w', + '\u1E98': 'w', + '\u1E89': 'w', + '\u2C73': 'w', + '\u24E7': 'x', + '\uFF58': 'x', + '\u1E8B': 'x', + '\u1E8D': 'x', + '\u24E8': 'y', + '\uFF59': 'y', + '\u1EF3': 'y', + '\u00FD': 'y', + '\u0177': 'y', + '\u1EF9': 'y', + '\u0233': 'y', + '\u1E8F': 'y', + '\u00FF': 'y', + '\u1EF7': 'y', + '\u1E99': 'y', + '\u1EF5': 'y', + '\u01B4': 'y', + '\u024F': 'y', + '\u1EFF': 'y', + '\u24E9': 'z', + '\uFF5A': 'z', + '\u017A': 'z', + '\u1E91': 'z', + '\u017C': 'z', + '\u017E': 'z', + '\u1E93': 'z', + '\u1E95': 'z', + '\u01B6': 'z', + '\u0225': 'z', + '\u0240': 'z', + '\u2C6C': 'z', + '\uA763': 'z', + '\u0386': '\u0391', + '\u0388': '\u0395', + '\u0389': '\u0397', + '\u038A': '\u0399', + '\u03AA': '\u0399', + '\u038C': '\u039F', + '\u038E': '\u03A5', + '\u03AB': '\u03A5', + '\u038F': '\u03A9', + '\u03AC': '\u03B1', + '\u03AD': '\u03B5', + '\u03AE': '\u03B7', + '\u03AF': '\u03B9', + '\u03CA': '\u03B9', + '\u0390': '\u03B9', + '\u03CC': '\u03BF', + '\u03CD': '\u03C5', + '\u03CB': '\u03C5', + '\u03B0': '\u03C5', + '\u03CE': '\u03C9', + '\u03C2': '\u03C3', + '\u2019': '\'' + }; + + return diacritics; + }); + + S2.define('select2/data/base',[ + '../utils' + ], function (Utils) { + function BaseAdapter ($element, options) { + BaseAdapter.__super__.constructor.call(this); + } + + Utils.Extend(BaseAdapter, Utils.Observable); + + BaseAdapter.prototype.current = function (callback) { + throw new Error('The `current` method must be defined in child classes.'); + }; + + BaseAdapter.prototype.query = function (params, callback) { + throw new Error('The `query` method must be defined in child classes.'); + }; + + BaseAdapter.prototype.bind = function (container, $container) { + // Can be implemented in subclasses + }; + + BaseAdapter.prototype.destroy = function () { + // Can be implemented in subclasses + }; + + BaseAdapter.prototype.generateResultId = function (container, data) { + var id = container.id + '-result-'; + + id += Utils.generateChars(4); + + if (data.id != null) { + id += '-' + data.id.toString(); + } else { + id += '-' + Utils.generateChars(4); + } + return id; + }; + + return BaseAdapter; + }); + + S2.define('select2/data/select',[ + './base', + '../utils', + 'jquery' + ], function (BaseAdapter, Utils, $) { + function SelectAdapter ($element, options) { + this.$element = $element; + this.options = options; + + SelectAdapter.__super__.constructor.call(this); + } + + Utils.Extend(SelectAdapter, BaseAdapter); + + SelectAdapter.prototype.current = function (callback) { + var data = []; + var self = this; + + this.$element.find(':selected').each(function () { + var $option = $(this); + + var option = self.item($option); + + data.push(option); + }); + + callback(data); + }; + + SelectAdapter.prototype.select = function (data) { + var self = this; + + data.selected = true; + + // If data.element is a DOM node, use it instead + if ($(data.element).is('option')) { + data.element.selected = true; + + this.$element.trigger('change'); + + return; + } + + if (this.$element.prop('multiple')) { + this.current(function (currentData) { + var val = []; + + data = [data]; + data.push.apply(data, currentData); + + for (var d = 0; d < data.length; d++) { + var id = data[d].id; + + if ($.inArray(id, val) === -1) { + val.push(id); + } + } + + self.$element.val(val); + self.$element.trigger('change'); + }); + } else { + var val = data.id; + + this.$element.val(val); + this.$element.trigger('change'); + } + }; + + SelectAdapter.prototype.unselect = function (data) { + var self = this; + + if (!this.$element.prop('multiple')) { + return; + } + + data.selected = false; + + if ($(data.element).is('option')) { + data.element.selected = false; + + this.$element.trigger('change'); + + return; + } + + this.current(function (currentData) { + var val = []; + + for (var d = 0; d < currentData.length; d++) { + var id = currentData[d].id; + + if (id !== data.id && $.inArray(id, val) === -1) { + val.push(id); + } + } + + self.$element.val(val); + + self.$element.trigger('change'); + }); + }; + + SelectAdapter.prototype.bind = function (container, $container) { + var self = this; + + this.container = container; + + container.on('select', function (params) { + self.select(params.data); + }); + + container.on('unselect', function (params) { + self.unselect(params.data); + }); + }; + + SelectAdapter.prototype.destroy = function () { + // Remove anything added to child elements + this.$element.find('*').each(function () { + // Remove any custom data set by Select2 + Utils.RemoveData(this); + }); + }; + + SelectAdapter.prototype.query = function (params, callback) { + var data = []; + var self = this; + + var $options = this.$element.children(); + + $options.each(function () { + var $option = $(this); + + if (!$option.is('option') && !$option.is('optgroup')) { + return; + } + + var option = self.item($option); + + var matches = self.matches(params, option); + + if (matches !== null) { + data.push(matches); + } + }); + + callback({ + results: data + }); + }; + + SelectAdapter.prototype.addOptions = function ($options) { + Utils.appendMany(this.$element, $options); + }; + + SelectAdapter.prototype.option = function (data) { + var option; + + if (data.children) { + option = document.createElement('optgroup'); + option.label = data.text; + } else { + option = document.createElement('option'); + + if (option.textContent !== undefined) { + option.textContent = data.text; + } else { + option.innerText = data.text; + } + } + + if (data.id !== undefined) { + option.value = data.id; + } + + if (data.disabled) { + option.disabled = true; + } + + if (data.selected) { + option.selected = true; + } + + if (data.title) { + option.title = data.title; + } + + var $option = $(option); + + var normalizedData = this._normalizeItem(data); + normalizedData.element = option; + + // Override the option's data with the combined data + Utils.StoreData(option, 'data', normalizedData); + + return $option; + }; + + SelectAdapter.prototype.item = function ($option) { + var data = {}; + + data = Utils.GetData($option[0], 'data'); + + if (data != null) { + return data; + } + + if ($option.is('option')) { + data = { + id: $option.val(), + text: $option.text(), + disabled: $option.prop('disabled'), + selected: $option.prop('selected'), + title: $option.prop('title') + }; + } else if ($option.is('optgroup')) { + data = { + text: $option.prop('label'), + children: [], + title: $option.prop('title') + }; + + var $children = $option.children('option'); + var children = []; + + for (var c = 0; c < $children.length; c++) { + var $child = $($children[c]); + + var child = this.item($child); + + children.push(child); + } + + data.children = children; + } + + data = this._normalizeItem(data); + data.element = $option[0]; + + Utils.StoreData($option[0], 'data', data); + + return data; + }; + + SelectAdapter.prototype._normalizeItem = function (item) { + if (item !== Object(item)) { + item = { + id: item, + text: item + }; + } + + item = $.extend({}, { + text: '' + }, item); + + var defaults = { + selected: false, + disabled: false + }; + + if (item.id != null) { + item.id = item.id.toString(); + } + + if (item.text != null) { + item.text = item.text.toString(); + } + + if (item._resultId == null && item.id && this.container != null) { + item._resultId = this.generateResultId(this.container, item); + } + + return $.extend({}, defaults, item); + }; + + SelectAdapter.prototype.matches = function (params, data) { + var matcher = this.options.get('matcher'); + + return matcher(params, data); + }; + + return SelectAdapter; + }); + + S2.define('select2/data/array',[ + './select', + '../utils', + 'jquery' + ], function (SelectAdapter, Utils, $) { + function ArrayAdapter ($element, options) { + var data = options.get('data') || []; + + ArrayAdapter.__super__.constructor.call(this, $element, options); + + this.addOptions(this.convertToOptions(data)); + } + + Utils.Extend(ArrayAdapter, SelectAdapter); + + ArrayAdapter.prototype.select = function (data) { + var $option = this.$element.find('option').filter(function (i, elm) { + return elm.value == data.id.toString(); + }); + + if ($option.length === 0) { + $option = this.option(data); + + this.addOptions($option); + } + + ArrayAdapter.__super__.select.call(this, data); + }; + + ArrayAdapter.prototype.convertToOptions = function (data) { + var self = this; + + var $existing = this.$element.find('option'); + var existingIds = $existing.map(function () { + return self.item($(this)).id; + }).get(); + + var $options = []; + + // Filter out all items except for the one passed in the argument + function onlyItem (item) { + return function () { + return $(this).val() == item.id; + }; + } + + for (var d = 0; d < data.length; d++) { + var item = this._normalizeItem(data[d]); + + // Skip items which were pre-loaded, only merge the data + if ($.inArray(item.id, existingIds) >= 0) { + var $existingOption = $existing.filter(onlyItem(item)); + + var existingData = this.item($existingOption); + var newData = $.extend(true, {}, item, existingData); + + var $newOption = this.option(newData); + + $existingOption.replaceWith($newOption); + + continue; + } + + var $option = this.option(item); + + if (item.children) { + var $children = this.convertToOptions(item.children); + + Utils.appendMany($option, $children); + } + + $options.push($option); + } + + return $options; + }; + + return ArrayAdapter; + }); + + S2.define('select2/data/ajax',[ + './array', + '../utils', + 'jquery' + ], function (ArrayAdapter, Utils, $) { + function AjaxAdapter ($element, options) { + this.ajaxOptions = this._applyDefaults(options.get('ajax')); + + if (this.ajaxOptions.processResults != null) { + this.processResults = this.ajaxOptions.processResults; + } + + AjaxAdapter.__super__.constructor.call(this, $element, options); + } + + Utils.Extend(AjaxAdapter, ArrayAdapter); + + AjaxAdapter.prototype._applyDefaults = function (options) { + var defaults = { + data: function (params) { + return $.extend({}, params, { + q: params.term + }); + }, + transport: function (params, success, failure) { + var $request = $.ajax(params); + + $request.then(success); + $request.fail(failure); + + return $request; + } + }; + + return $.extend({}, defaults, options, true); + }; + + AjaxAdapter.prototype.processResults = function (results) { + return results; + }; + + AjaxAdapter.prototype.query = function (params, callback) { + var matches = []; + var self = this; + + if (this._request != null) { + // JSONP requests cannot always be aborted + if ($.isFunction(this._request.abort)) { + this._request.abort(); + } + + this._request = null; + } + + var options = $.extend({ + type: 'GET' + }, this.ajaxOptions); + + if (typeof options.url === 'function') { + options.url = options.url.call(this.$element, params); + } + + if (typeof options.data === 'function') { + options.data = options.data.call(this.$element, params); + } + + function request () { + var $request = options.transport(options, function (data) { + var results = self.processResults(data, params); + + if (self.options.get('debug') && window.console && console.error) { + // Check to make sure that the response included a `results` key. + if (!results || !results.results || !$.isArray(results.results)) { + console.error( + 'Select2: The AJAX results did not return an array in the ' + + '`results` key of the response.' + ); + } + } + + callback(results); + }, function () { + // Attempt to detect if a request was aborted + // Only works if the transport exposes a status property + if ('status' in $request && + ($request.status === 0 || $request.status === '0')) { + return; + } + + self.trigger('results:message', { + message: 'errorLoading' + }); + }); + + self._request = $request; + } + + if (this.ajaxOptions.delay && params.term != null) { + if (this._queryTimeout) { + window.clearTimeout(this._queryTimeout); + } + + this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay); + } else { + request(); + } + }; + + return AjaxAdapter; + }); + + S2.define('select2/data/tags',[ + 'jquery' + ], function ($) { + function Tags (decorated, $element, options) { + var tags = options.get('tags'); + + var createTag = options.get('createTag'); + + if (createTag !== undefined) { + this.createTag = createTag; + } + + var insertTag = options.get('insertTag'); + + if (insertTag !== undefined) { + this.insertTag = insertTag; + } + + decorated.call(this, $element, options); + + if ($.isArray(tags)) { + for (var t = 0; t < tags.length; t++) { + var tag = tags[t]; + var item = this._normalizeItem(tag); + + var $option = this.option(item); + + this.$element.append($option); + } + } + } + + Tags.prototype.query = function (decorated, params, callback) { + var self = this; + + this._removeOldTags(); + + if (params.term == null || params.page != null) { + decorated.call(this, params, callback); + return; + } + + function wrapper (obj, child) { + var data = obj.results; + + for (var i = 0; i < data.length; i++) { + var option = data[i]; + + var checkChildren = ( + option.children != null && + !wrapper({ + results: option.children + }, true) + ); + + var optionText = (option.text || '').toUpperCase(); + var paramsTerm = (params.term || '').toUpperCase(); + + var checkText = optionText === paramsTerm; + + if (checkText || checkChildren) { + if (child) { + return false; + } + + obj.data = data; + callback(obj); + + return; + } + } + + if (child) { + return true; + } + + var tag = self.createTag(params); + + if (tag != null) { + var $option = self.option(tag); + $option.attr('data-select2-tag', true); + + self.addOptions([$option]); + + self.insertTag(data, tag); + } + + obj.results = data; + + callback(obj); + } + + decorated.call(this, params, wrapper); + }; + + Tags.prototype.createTag = function (decorated, params) { + var term = $.trim(params.term); + + if (term === '') { + return null; + } + + return { + id: term, + text: term + }; + }; + + Tags.prototype.insertTag = function (_, data, tag) { + data.unshift(tag); + }; + + Tags.prototype._removeOldTags = function (_) { + var tag = this._lastTag; + + var $options = this.$element.find('option[data-select2-tag]'); + + $options.each(function () { + if (this.selected) { + return; + } + + $(this).remove(); + }); + }; + + return Tags; + }); + + S2.define('select2/data/tokenizer',[ + 'jquery' + ], function ($) { + function Tokenizer (decorated, $element, options) { + var tokenizer = options.get('tokenizer'); + + if (tokenizer !== undefined) { + this.tokenizer = tokenizer; + } + + decorated.call(this, $element, options); + } + + Tokenizer.prototype.bind = function (decorated, container, $container) { + decorated.call(this, container, $container); + + this.$search = container.dropdown.$search || container.selection.$search || + $container.find('.select2-search__field'); + }; + + Tokenizer.prototype.query = function (decorated, params, callback) { + var self = this; + + function createAndSelect (data) { + // Normalize the data object so we can use it for checks + var item = self._normalizeItem(data); + + // Check if the data object already exists as a tag + // Select it if it doesn't + var $existingOptions = self.$element.find('option').filter(function () { + return $(this).val() === item.id; + }); + + // If an existing option wasn't found for it, create the option + if (!$existingOptions.length) { + var $option = self.option(item); + $option.attr('data-select2-tag', true); + + self._removeOldTags(); + self.addOptions([$option]); + } + + // Select the item, now that we know there is an option for it + select(item); + } + + function select (data) { + self.trigger('select', { + data: data + }); + } + + params.term = params.term || ''; + + var tokenData = this.tokenizer(params, this.options, createAndSelect); + + if (tokenData.term !== params.term) { + // Replace the search term if we have the search box + if (this.$search.length) { + this.$search.val(tokenData.term); + this.$search.focus(); + } + + params.term = tokenData.term; + } + + decorated.call(this, params, callback); + }; + + Tokenizer.prototype.tokenizer = function (_, params, options, callback) { + var separators = options.get('tokenSeparators') || []; + var term = params.term; + var i = 0; + + var createTag = this.createTag || function (params) { + return { + id: params.term, + text: params.term + }; + }; + + while (i < term.length) { + var termChar = term[i]; + + if ($.inArray(termChar, separators) === -1) { + i++; + + continue; + } + + var part = term.substr(0, i); + var partParams = $.extend({}, params, { + term: part + }); + + var data = createTag(partParams); + + if (data == null) { + i++; + continue; + } + + callback(data); + + // Reset the term to not include the tokenized portion + term = term.substr(i + 1) || ''; + i = 0; + } + + return { + term: term + }; + }; + + return Tokenizer; + }); + + S2.define('select2/data/minimumInputLength',[ + + ], function () { + function MinimumInputLength (decorated, $e, options) { + this.minimumInputLength = options.get('minimumInputLength'); + + decorated.call(this, $e, options); + } + + MinimumInputLength.prototype.query = function (decorated, params, callback) { + params.term = params.term || ''; + + if (params.term.length < this.minimumInputLength) { + this.trigger('results:message', { + message: 'inputTooShort', + args: { + minimum: this.minimumInputLength, + input: params.term, + params: params + } + }); + + return; + } + + decorated.call(this, params, callback); + }; + + return MinimumInputLength; + }); + + S2.define('select2/data/maximumInputLength',[ + + ], function () { + function MaximumInputLength (decorated, $e, options) { + this.maximumInputLength = options.get('maximumInputLength'); + + decorated.call(this, $e, options); + } + + MaximumInputLength.prototype.query = function (decorated, params, callback) { + params.term = params.term || ''; + + if (this.maximumInputLength > 0 && + params.term.length > this.maximumInputLength) { + this.trigger('results:message', { + message: 'inputTooLong', + args: { + maximum: this.maximumInputLength, + input: params.term, + params: params + } + }); + + return; + } + + decorated.call(this, params, callback); + }; + + return MaximumInputLength; + }); + + S2.define('select2/data/maximumSelectionLength',[ + + ], function (){ + function MaximumSelectionLength (decorated, $e, options) { + this.maximumSelectionLength = options.get('maximumSelectionLength'); + + decorated.call(this, $e, options); + } + + MaximumSelectionLength.prototype.query = + function (decorated, params, callback) { + var self = this; + + this.current(function (currentData) { + var count = currentData != null ? currentData.length : 0; + if (self.maximumSelectionLength > 0 && + count >= self.maximumSelectionLength) { + self.trigger('results:message', { + message: 'maximumSelected', + args: { + maximum: self.maximumSelectionLength + } + }); + return; + } + decorated.call(self, params, callback); + }); + }; + + return MaximumSelectionLength; + }); + + S2.define('select2/dropdown',[ + 'jquery', + './utils' + ], function ($, Utils) { + function Dropdown ($element, options) { + this.$element = $element; + this.options = options; + + Dropdown.__super__.constructor.call(this); + } + + Utils.Extend(Dropdown, Utils.Observable); + + Dropdown.prototype.render = function () { + var $dropdown = $( + '' + + '' + + '' + ); + + $dropdown.attr('dir', this.options.get('dir')); + + this.$dropdown = $dropdown; + + return $dropdown; + }; + + Dropdown.prototype.bind = function () { + // Should be implemented in subclasses + }; + + Dropdown.prototype.position = function ($dropdown, $container) { + // Should be implemented in subclasses + }; + + Dropdown.prototype.destroy = function () { + // Remove the dropdown from the DOM + this.$dropdown.remove(); + }; + + return Dropdown; + }); + + S2.define('select2/dropdown/search',[ + 'jquery', + '../utils' + ], function ($, Utils) { + function Search () { } + + Search.prototype.render = function (decorated) { + var $rendered = decorated.call(this); + + var $search = $( + '' + + '' + + '' + ); + + this.$searchContainer = $search; + this.$search = $search.find('input'); + + $rendered.prepend($search); + + return $rendered; + }; + + Search.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + this.$search.on('keydown', function (evt) { + self.trigger('keypress', evt); + + self._keyUpPrevented = evt.isDefaultPrevented(); + }); + + // Workaround for browsers which do not support the `input` event + // This will prevent double-triggering of events for browsers which support + // both the `keyup` and `input` events. + this.$search.on('input', function (evt) { + // Unbind the duplicated `keyup` event + $(this).off('keyup'); + }); + + this.$search.on('keyup input', function (evt) { + self.handleSearch(evt); + }); + + container.on('open', function () { + self.$search.attr('tabindex', 0); + + self.$search.focus(); + + window.setTimeout(function () { + self.$search.focus(); + }, 0); + }); + + container.on('close', function () { + self.$search.attr('tabindex', -1); + + self.$search.val(''); + self.$search.blur(); + }); + + container.on('focus', function () { + if (!container.isOpen()) { + self.$search.focus(); + } + }); + + container.on('results:all', function (params) { + if (params.query.term == null || params.query.term === '') { + var showSearch = self.showSearch(params); + + if (showSearch) { + self.$searchContainer.removeClass('select2-search--hide'); + } else { + self.$searchContainer.addClass('select2-search--hide'); + } + } + }); + }; + + Search.prototype.handleSearch = function (evt) { + if (!this._keyUpPrevented) { + var input = this.$search.val(); + + this.trigger('query', { + term: input + }); + } + + this._keyUpPrevented = false; + }; + + Search.prototype.showSearch = function (_, params) { + return true; + }; + + return Search; + }); + + S2.define('select2/dropdown/hidePlaceholder',[ + + ], function () { + function HidePlaceholder (decorated, $element, options, dataAdapter) { + this.placeholder = this.normalizePlaceholder(options.get('placeholder')); + + decorated.call(this, $element, options, dataAdapter); + } + + HidePlaceholder.prototype.append = function (decorated, data) { + data.results = this.removePlaceholder(data.results); + + decorated.call(this, data); + }; + + HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) { + if (typeof placeholder === 'string') { + placeholder = { + id: '', + text: placeholder + }; + } + + return placeholder; + }; + + HidePlaceholder.prototype.removePlaceholder = function (_, data) { + var modifiedData = data.slice(0); + + for (var d = data.length - 1; d >= 0; d--) { + var item = data[d]; + + if (this.placeholder.id === item.id) { + modifiedData.splice(d, 1); + } + } + + return modifiedData; + }; + + return HidePlaceholder; + }); + + S2.define('select2/dropdown/infiniteScroll',[ + 'jquery' + ], function ($) { + function InfiniteScroll (decorated, $element, options, dataAdapter) { + this.lastParams = {}; + + decorated.call(this, $element, options, dataAdapter); + + this.$loadingMore = this.createLoadingMore(); + this.loading = false; + } + + InfiniteScroll.prototype.append = function (decorated, data) { + this.$loadingMore.remove(); + this.loading = false; + + decorated.call(this, data); + + if (this.showLoadingMore(data)) { + this.$results.append(this.$loadingMore); + } + }; + + InfiniteScroll.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('query', function (params) { + self.lastParams = params; + self.loading = true; + }); + + container.on('query:append', function (params) { + self.lastParams = params; + self.loading = true; + }); + + this.$results.on('scroll', function () { + var isLoadMoreVisible = $.contains( + document.documentElement, + self.$loadingMore[0] + ); + + if (self.loading || !isLoadMoreVisible) { + return; + } + + var currentOffset = self.$results.offset().top + + self.$results.outerHeight(false); + var loadingMoreOffset = self.$loadingMore.offset().top + + self.$loadingMore.outerHeight(false); + + if (currentOffset + 50 >= loadingMoreOffset) { + self.loadMore(); + } + }); + }; + + InfiniteScroll.prototype.loadMore = function () { + this.loading = true; + + var params = $.extend({}, {page: 1}, this.lastParams); + + params.page++; + + this.trigger('query:append', params); + }; + + InfiniteScroll.prototype.showLoadingMore = function (_, data) { + return data.pagination && data.pagination.more; + }; + + InfiniteScroll.prototype.createLoadingMore = function () { + var $option = $( + '
                    • ' + ); + + var message = this.options.get('translations').get('loadingMore'); + + $option.html(message(this.lastParams)); + + return $option; + }; + + return InfiniteScroll; + }); + + S2.define('select2/dropdown/attachBody',[ + 'jquery', + '../utils' + ], function ($, Utils) { + function AttachBody (decorated, $element, options) { + this.$dropdownParent = options.get('dropdownParent') || $(document.body); + + decorated.call(this, $element, options); + } + + AttachBody.prototype.bind = function (decorated, container, $container) { + var self = this; + + var setupResultsEvents = false; + + decorated.call(this, container, $container); + + container.on('open', function () { + self._showDropdown(); + self._attachPositioningHandler(container); + + if (!setupResultsEvents) { + setupResultsEvents = true; + + container.on('results:all', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + + container.on('results:append', function () { + self._positionDropdown(); + self._resizeDropdown(); + }); + } + }); + + container.on('close', function () { + self._hideDropdown(); + self._detachPositioningHandler(container); + }); + + this.$dropdownContainer.on('mousedown', function (evt) { + evt.stopPropagation(); + }); + }; + + AttachBody.prototype.destroy = function (decorated) { + decorated.call(this); + + this.$dropdownContainer.remove(); + }; + + AttachBody.prototype.position = function (decorated, $dropdown, $container) { + // Clone all of the container classes + $dropdown.attr('class', $container.attr('class')); + + $dropdown.removeClass('select2'); + $dropdown.addClass('select2-container--open'); + + $dropdown.css({ + position: 'absolute', + top: -999999 + }); + + this.$container = $container; + }; + + AttachBody.prototype.render = function (decorated) { + var $container = $(''); + + var $dropdown = decorated.call(this); + $container.append($dropdown); + + this.$dropdownContainer = $container; + + return $container; + }; + + AttachBody.prototype._hideDropdown = function (decorated) { + this.$dropdownContainer.detach(); + }; + + AttachBody.prototype._attachPositioningHandler = + function (decorated, container) { + var self = this; + + var scrollEvent = 'scroll.select2.' + container.id; + var resizeEvent = 'resize.select2.' + container.id; + var orientationEvent = 'orientationchange.select2.' + container.id; + + var $watchers = this.$container.parents().filter(Utils.hasScroll); + $watchers.each(function () { + Utils.StoreData(this, 'select2-scroll-position', { + x: $(this).scrollLeft(), + y: $(this).scrollTop() + }); + }); + + $watchers.on(scrollEvent, function (ev) { + var position = Utils.GetData(this, 'select2-scroll-position'); + $(this).scrollTop(position.y); + }); + + $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent, + function (e) { + self._positionDropdown(); + self._resizeDropdown(); + }); + }; + + AttachBody.prototype._detachPositioningHandler = + function (decorated, container) { + var scrollEvent = 'scroll.select2.' + container.id; + var resizeEvent = 'resize.select2.' + container.id; + var orientationEvent = 'orientationchange.select2.' + container.id; + + var $watchers = this.$container.parents().filter(Utils.hasScroll); + $watchers.off(scrollEvent); + + $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent); + }; + + AttachBody.prototype._positionDropdown = function () { + var $window = $(window); + + var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above'); + var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below'); + + var newDirection = null; + + var offset = this.$container.offset(); + + offset.bottom = offset.top + this.$container.outerHeight(false); + + var container = { + height: this.$container.outerHeight(false) + }; + + container.top = offset.top; + container.bottom = offset.top + container.height; + + var dropdown = { + height: this.$dropdown.outerHeight(false) + }; + + var viewport = { + top: $window.scrollTop(), + bottom: $window.scrollTop() + $window.height() + }; + + var enoughRoomAbove = viewport.top < (offset.top - dropdown.height); + var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height); + + var css = { + left: offset.left, + top: container.bottom + }; + + // Determine what the parent element is to use for calculating the offset + var $offsetParent = this.$dropdownParent; + + // For statically positioned elements, we need to get the element + // that is determining the offset + if ($offsetParent.css('position') === 'static') { + $offsetParent = $offsetParent.offsetParent(); + } + + var parentOffset = $offsetParent.offset(); + + css.top -= parentOffset.top; + css.left -= parentOffset.left; + + if (!isCurrentlyAbove && !isCurrentlyBelow) { + newDirection = 'below'; + } + + if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) { + newDirection = 'above'; + } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) { + newDirection = 'below'; + } + + if (newDirection == 'above' || + (isCurrentlyAbove && newDirection !== 'below')) { + css.top = container.top - parentOffset.top - dropdown.height; + } + + if (newDirection != null) { + this.$dropdown + .removeClass('select2-dropdown--below select2-dropdown--above') + .addClass('select2-dropdown--' + newDirection); + this.$container + .removeClass('select2-container--below select2-container--above') + .addClass('select2-container--' + newDirection); + } + + this.$dropdownContainer.css(css); + }; + + AttachBody.prototype._resizeDropdown = function () { + var css = { + width: this.$container.outerWidth(false) + 'px' + }; + + if (this.options.get('dropdownAutoWidth')) { + css.minWidth = css.width; + css.position = 'relative'; + css.width = 'auto'; + } + + this.$dropdown.css(css); + }; + + AttachBody.prototype._showDropdown = function (decorated) { + this.$dropdownContainer.appendTo(this.$dropdownParent); + + this._positionDropdown(); + this._resizeDropdown(); + }; + + return AttachBody; + }); + + S2.define('select2/dropdown/minimumResultsForSearch',[ + + ], function () { + function countResults (data) { + var count = 0; + + for (var d = 0; d < data.length; d++) { + var item = data[d]; + + if (item.children) { + count += countResults(item.children); + } else { + count++; + } + } + + return count; + } + + function MinimumResultsForSearch (decorated, $element, options, dataAdapter) { + this.minimumResultsForSearch = options.get('minimumResultsForSearch'); + + if (this.minimumResultsForSearch < 0) { + this.minimumResultsForSearch = Infinity; + } + + decorated.call(this, $element, options, dataAdapter); + } + + MinimumResultsForSearch.prototype.showSearch = function (decorated, params) { + if (countResults(params.data.results) < this.minimumResultsForSearch) { + return false; + } + + return decorated.call(this, params); + }; + + return MinimumResultsForSearch; + }); + + S2.define('select2/dropdown/selectOnClose',[ + '../utils' + ], function (Utils) { + function SelectOnClose () { } + + SelectOnClose.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('close', function (params) { + self._handleSelectOnClose(params); + }); + }; + + SelectOnClose.prototype._handleSelectOnClose = function (_, params) { + if (params && params.originalSelect2Event != null) { + var event = params.originalSelect2Event; + + // Don't select an item if the close event was triggered from a select or + // unselect event + if (event._type === 'select' || event._type === 'unselect') { + return; + } + } + + var $highlightedResults = this.getHighlightedResults(); + + // Only select highlighted results + if ($highlightedResults.length < 1) { + return; + } + + var data = Utils.GetData($highlightedResults[0], 'data'); + + // Don't re-select already selected resulte + if ( + (data.element != null && data.element.selected) || + (data.element == null && data.selected) + ) { + return; + } + + this.trigger('select', { + data: data + }); + }; + + return SelectOnClose; + }); + + S2.define('select2/dropdown/closeOnSelect',[ + + ], function () { + function CloseOnSelect () { } + + CloseOnSelect.prototype.bind = function (decorated, container, $container) { + var self = this; + + decorated.call(this, container, $container); + + container.on('select', function (evt) { + self._selectTriggered(evt); + }); + + container.on('unselect', function (evt) { + self._selectTriggered(evt); + }); + }; + + CloseOnSelect.prototype._selectTriggered = function (_, evt) { + var originalEvent = evt.originalEvent; + + // Don't close if the control key is being held + if (originalEvent && (originalEvent.ctrlKey || originalEvent.metaKey)) { + return; + } + + this.trigger('close', { + originalEvent: originalEvent, + originalSelect2Event: evt + }); + }; + + return CloseOnSelect; + }); + + S2.define('select2/i18n/en',[],function () { + // English + return { + errorLoading: function () { + return 'The results could not be loaded.'; + }, + inputTooLong: function (args) { + var overChars = args.input.length - args.maximum; + + var message = 'Please delete ' + overChars + ' character'; + + if (overChars != 1) { + message += 's'; + } + + return message; + }, + inputTooShort: function (args) { + var remainingChars = args.minimum - args.input.length; + + var message = 'Please enter ' + remainingChars + ' or more characters'; + + return message; + }, + loadingMore: function () { + return 'Loading more results…'; + }, + maximumSelected: function (args) { + var message = 'You can only select ' + args.maximum + ' item'; + + if (args.maximum != 1) { + message += 's'; + } + + return message; + }, + noResults: function () { + return 'No results found'; + }, + searching: function () { + return 'Searching…'; + }, + removeAllItems: function () { + return 'Remove all items'; + } + }; + }); + + S2.define('select2/defaults',[ + 'jquery', + 'require', + + './results', + + './selection/single', + './selection/multiple', + './selection/placeholder', + './selection/allowClear', + './selection/search', + './selection/eventRelay', + + './utils', + './translation', + './diacritics', + + './data/select', + './data/array', + './data/ajax', + './data/tags', + './data/tokenizer', + './data/minimumInputLength', + './data/maximumInputLength', + './data/maximumSelectionLength', + + './dropdown', + './dropdown/search', + './dropdown/hidePlaceholder', + './dropdown/infiniteScroll', + './dropdown/attachBody', + './dropdown/minimumResultsForSearch', + './dropdown/selectOnClose', + './dropdown/closeOnSelect', + + './i18n/en' + ], function ($, require, + + ResultsList, + + SingleSelection, MultipleSelection, Placeholder, AllowClear, + SelectionSearch, EventRelay, + + Utils, Translation, DIACRITICS, + + SelectData, ArrayData, AjaxData, Tags, Tokenizer, + MinimumInputLength, MaximumInputLength, MaximumSelectionLength, + + Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll, + AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect, + + EnglishTranslation) { + function Defaults () { + this.reset(); + } + + Defaults.prototype.apply = function (options) { + options = $.extend(true, {}, this.defaults, options); + + if (options.dataAdapter == null) { + if (options.ajax != null) { + options.dataAdapter = AjaxData; + } else if (options.data != null) { + options.dataAdapter = ArrayData; + } else { + options.dataAdapter = SelectData; + } + + if (options.minimumInputLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MinimumInputLength + ); + } + + if (options.maximumInputLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MaximumInputLength + ); + } + + if (options.maximumSelectionLength > 0) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + MaximumSelectionLength + ); + } + + if (options.tags) { + options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags); + } + + if (options.tokenSeparators != null || options.tokenizer != null) { + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + Tokenizer + ); + } + + if (options.query != null) { + var Query = require(options.amdBase + 'compat/query'); + + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + Query + ); + } + + if (options.initSelection != null) { + var InitSelection = require(options.amdBase + 'compat/initSelection'); + + options.dataAdapter = Utils.Decorate( + options.dataAdapter, + InitSelection + ); + } + } + + if (options.resultsAdapter == null) { + options.resultsAdapter = ResultsList; + + if (options.ajax != null) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + InfiniteScroll + ); + } + + if (options.placeholder != null) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + HidePlaceholder + ); + } + + if (options.selectOnClose) { + options.resultsAdapter = Utils.Decorate( + options.resultsAdapter, + SelectOnClose + ); + } + } + + if (options.dropdownAdapter == null) { + if (options.multiple) { + options.dropdownAdapter = Dropdown; + } else { + var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch); + + options.dropdownAdapter = SearchableDropdown; + } + + if (options.minimumResultsForSearch !== 0) { + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + MinimumResultsForSearch + ); + } + + if (options.closeOnSelect) { + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + CloseOnSelect + ); + } + + if ( + options.dropdownCssClass != null || + options.dropdownCss != null || + options.adaptDropdownCssClass != null + ) { + var DropdownCSS = require(options.amdBase + 'compat/dropdownCss'); + + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + DropdownCSS + ); + } + + options.dropdownAdapter = Utils.Decorate( + options.dropdownAdapter, + AttachBody + ); + } + + if (options.selectionAdapter == null) { + if (options.multiple) { + options.selectionAdapter = MultipleSelection; + } else { + options.selectionAdapter = SingleSelection; + } + + // Add the placeholder mixin if a placeholder was specified + if (options.placeholder != null) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + Placeholder + ); + } + + if (options.allowClear) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + AllowClear + ); + } + + if (options.multiple) { + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + SelectionSearch + ); + } + + if ( + options.containerCssClass != null || + options.containerCss != null || + options.adaptContainerCssClass != null + ) { + var ContainerCSS = require(options.amdBase + 'compat/containerCss'); + + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + ContainerCSS + ); + } + + options.selectionAdapter = Utils.Decorate( + options.selectionAdapter, + EventRelay + ); + } + + if (typeof options.language === 'string') { + // Check if the language is specified with a region + if (options.language.indexOf('-') > 0) { + // Extract the region information if it is included + var languageParts = options.language.split('-'); + var baseLanguage = languageParts[0]; + + options.language = [options.language, baseLanguage]; + } else { + options.language = [options.language]; + } + } + + if ($.isArray(options.language)) { + var languages = new Translation(); + options.language.push('en'); + + var languageNames = options.language; + + for (var l = 0; l < languageNames.length; l++) { + var name = languageNames[l]; + var language = {}; + + try { + // Try to load it with the original name + language = Translation.loadPath(name); + } catch (e) { + try { + // If we couldn't load it, check if it wasn't the full path + name = this.defaults.amdLanguageBase + name; + language = Translation.loadPath(name); + } catch (ex) { + // The translation could not be loaded at all. Sometimes this is + // because of a configuration problem, other times this can be + // because of how Select2 helps load all possible translation files. + if (options.debug && window.console && console.warn) { + console.warn( + 'Select2: The language file for "' + name + '" could not be ' + + 'automatically loaded. A fallback will be used instead.' + ); + } + + continue; + } + } + + languages.extend(language); + } + + options.translations = languages; + } else { + var baseTranslation = Translation.loadPath( + this.defaults.amdLanguageBase + 'en' + ); + var customTranslation = new Translation(options.language); + + customTranslation.extend(baseTranslation); + + options.translations = customTranslation; + } + + return options; + }; + + Defaults.prototype.reset = function () { + function stripDiacritics (text) { + // Used 'uni range + named function' from http://jsperf.com/diacritics/18 + function match(a) { + return DIACRITICS[a] || a; + } + + return text.replace(/[^\u0000-\u007E]/g, match); + } + + function matcher (params, data) { + // Always return the object if there is nothing to compare + if ($.trim(params.term) === '') { + return data; + } + + // Do a recursive check for options with children + if (data.children && data.children.length > 0) { + // Clone the data object if there are children + // This is required as we modify the object to remove any non-matches + var match = $.extend(true, {}, data); + + // Check each child of the option + for (var c = data.children.length - 1; c >= 0; c--) { + var child = data.children[c]; + + var matches = matcher(params, child); + + // If there wasn't a match, remove the object in the array + if (matches == null) { + match.children.splice(c, 1); + } + } + + // If any children matched, return the new object + if (match.children.length > 0) { + return match; + } + + // If there were no matching children, check just the plain object + return matcher(params, match); + } + + var original = stripDiacritics(data.text).toUpperCase(); + var term = stripDiacritics(params.term).toUpperCase(); + + // Check if the text contains the term + if (original.indexOf(term) > -1) { + return data; + } + + // If it doesn't contain the term, don't return anything + return null; + } + + this.defaults = { + amdBase: './', + amdLanguageBase: './i18n/', + closeOnSelect: true, + debug: false, + dropdownAutoWidth: false, + escapeMarkup: Utils.escapeMarkup, + language: EnglishTranslation, + matcher: matcher, + minimumInputLength: 0, + maximumInputLength: 0, + maximumSelectionLength: 0, + minimumResultsForSearch: 0, + selectOnClose: false, + scrollAfterSelect: false, + sorter: function (data) { + return data; + }, + templateResult: function (result) { + return result.text; + }, + templateSelection: function (selection) { + return selection.text; + }, + theme: 'default', + width: 'resolve' + }; + }; + + Defaults.prototype.set = function (key, value) { + var camelKey = $.camelCase(key); + + var data = {}; + data[camelKey] = value; + + var convertedData = Utils._convertData(data); + + $.extend(true, this.defaults, convertedData); + }; + + var defaults = new Defaults(); + + return defaults; + }); + + S2.define('select2/options',[ + 'require', + 'jquery', + './defaults', + './utils' + ], function (require, $, Defaults, Utils) { + function Options (options, $element) { + this.options = options; + + if ($element != null) { + this.fromElement($element); + } + + this.options = Defaults.apply(this.options); + + if ($element && $element.is('input')) { + var InputCompat = require(this.get('amdBase') + 'compat/inputData'); + + this.options.dataAdapter = Utils.Decorate( + this.options.dataAdapter, + InputCompat + ); + } + } + + Options.prototype.fromElement = function ($e) { + var excludedData = ['select2']; + + if (this.options.multiple == null) { + this.options.multiple = $e.prop('multiple'); + } + + if (this.options.disabled == null) { + this.options.disabled = $e.prop('disabled'); + } + + if (this.options.language == null) { + if ($e.prop('lang')) { + this.options.language = $e.prop('lang').toLowerCase(); + } else if ($e.closest('[lang]').prop('lang')) { + this.options.language = $e.closest('[lang]').prop('lang'); + } + } + + if (this.options.dir == null) { + if ($e.prop('dir')) { + this.options.dir = $e.prop('dir'); + } else if ($e.closest('[dir]').prop('dir')) { + this.options.dir = $e.closest('[dir]').prop('dir'); + } else { + this.options.dir = 'ltr'; + } + } + + $e.prop('disabled', this.options.disabled); + $e.prop('multiple', this.options.multiple); + + if (Utils.GetData($e[0], 'select2Tags')) { + if (this.options.debug && window.console && console.warn) { + console.warn( + 'Select2: The `data-select2-tags` attribute has been changed to ' + + 'use the `data-data` and `data-tags="true"` attributes and will be ' + + 'removed in future versions of Select2.' + ); + } + + Utils.StoreData($e[0], 'data', Utils.GetData($e[0], 'select2Tags')); + Utils.StoreData($e[0], 'tags', true); + } + + if (Utils.GetData($e[0], 'ajaxUrl')) { + if (this.options.debug && window.console && console.warn) { + console.warn( + 'Select2: The `data-ajax-url` attribute has been changed to ' + + '`data-ajax--url` and support for the old attribute will be removed' + + ' in future versions of Select2.' + ); + } + + $e.attr('ajax--url', Utils.GetData($e[0], 'ajaxUrl')); + Utils.StoreData($e[0], 'ajax-Url', Utils.GetData($e[0], 'ajaxUrl')); + } + + var dataset = {}; + + function upperCaseLetter(_, letter) { + return letter.toUpperCase(); + } + + // Pre-load all of the attributes which are prefixed with `data-` + for (var attr = 0; attr < $e[0].attributes.length; attr++) { + var attributeName = $e[0].attributes[attr].name; + var prefix = 'data-'; + + if (attributeName.substr(0, prefix.length) == prefix) { + // Get the contents of the attribute after `data-` + var dataName = attributeName.substring(prefix.length); + + // Get the data contents from the consistent source + // This is more than likely the jQuery data helper + var dataValue = Utils.GetData($e[0], dataName); + + // camelCase the attribute name to match the spec + var camelDataName = dataName.replace(/-([a-z])/g, upperCaseLetter); + + // Store the data attribute contents into the dataset since + dataset[camelDataName] = dataValue; + } + } + + // Prefer the element's `dataset` attribute if it exists + // jQuery 1.x does not correctly handle data attributes with multiple dashes + if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) { + dataset = $.extend(true, {}, $e[0].dataset, dataset); + } + + // Prefer our internal data cache if it exists + var data = $.extend(true, {}, Utils.GetData($e[0]), dataset); + + data = Utils._convertData(data); + + for (var key in data) { + if ($.inArray(key, excludedData) > -1) { + continue; + } + + if ($.isPlainObject(this.options[key])) { + $.extend(this.options[key], data[key]); + } else { + this.options[key] = data[key]; + } + } + + return this; + }; + + Options.prototype.get = function (key) { + return this.options[key]; + }; + + Options.prototype.set = function (key, val) { + this.options[key] = val; + }; + + return Options; + }); + + S2.define('select2/core',[ + 'jquery', + './options', + './utils', + './keys' + ], function ($, Options, Utils, KEYS) { + var Select2 = function ($element, options) { + if (Utils.GetData($element[0], 'select2') != null) { + Utils.GetData($element[0], 'select2').destroy(); + } + + this.$element = $element; + + this.id = this._generateId($element); + + options = options || {}; + + this.options = new Options(options, $element); + + Select2.__super__.constructor.call(this); + + // Set up the tabindex + + var tabindex = $element.attr('tabindex') || 0; + Utils.StoreData($element[0], 'old-tabindex', tabindex); + $element.attr('tabindex', '-1'); + + // Set up containers and adapters + + var DataAdapter = this.options.get('dataAdapter'); + this.dataAdapter = new DataAdapter($element, this.options); + + var $container = this.render(); + + this._placeContainer($container); + + var SelectionAdapter = this.options.get('selectionAdapter'); + this.selection = new SelectionAdapter($element, this.options); + this.$selection = this.selection.render(); + + this.selection.position(this.$selection, $container); + + var DropdownAdapter = this.options.get('dropdownAdapter'); + this.dropdown = new DropdownAdapter($element, this.options); + this.$dropdown = this.dropdown.render(); + + this.dropdown.position(this.$dropdown, $container); + + var ResultsAdapter = this.options.get('resultsAdapter'); + this.results = new ResultsAdapter($element, this.options, this.dataAdapter); + this.$results = this.results.render(); + + this.results.position(this.$results, this.$dropdown); + + // Bind events + + var self = this; + + // Bind the container to all of the adapters + this._bindAdapters(); + + // Register any DOM event handlers + this._registerDomEvents(); + + // Register any internal event handlers + this._registerDataEvents(); + this._registerSelectionEvents(); + this._registerDropdownEvents(); + this._registerResultsEvents(); + this._registerEvents(); + + // Set the initial state + this.dataAdapter.current(function (initialData) { + self.trigger('selection:update', { + data: initialData + }); + }); + + // Hide the original select + $element.addClass('select2-hidden-accessible'); + $element.attr('aria-hidden', 'true'); + + // Synchronize any monitored attributes + this._syncAttributes(); + + Utils.StoreData($element[0], 'select2', this); + + // Ensure backwards compatibility with $element.data('select2'). + $element.data('select2', this); + }; + + Utils.Extend(Select2, Utils.Observable); + + Select2.prototype._generateId = function ($element) { + var id = ''; + + if ($element.attr('id') != null) { + id = $element.attr('id'); + } else if ($element.attr('name') != null) { + id = $element.attr('name') + '-' + Utils.generateChars(2); + } else { + id = Utils.generateChars(4); + } + + id = id.replace(/(:|\.|\[|\]|,)/g, ''); + id = 'select2-' + id; + + return id; + }; + + Select2.prototype._placeContainer = function ($container) { + $container.insertAfter(this.$element); + + var width = this._resolveWidth(this.$element, this.options.get('width')); + + if (width != null) { + $container.css('width', width); + } + }; + + Select2.prototype._resolveWidth = function ($element, method) { + var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i; + + if (method == 'resolve') { + var styleWidth = this._resolveWidth($element, 'style'); + + if (styleWidth != null) { + return styleWidth; + } + + return this._resolveWidth($element, 'element'); + } + + if (method == 'element') { + var elementWidth = $element.outerWidth(false); + + if (elementWidth <= 0) { + return 'auto'; + } + + return elementWidth + 'px'; + } + + if (method == 'style') { + var style = $element.attr('style'); + + if (typeof(style) !== 'string') { + return null; + } + + var attrs = style.split(';'); + + for (var i = 0, l = attrs.length; i < l; i = i + 1) { + var attr = attrs[i].replace(/\s/g, ''); + var matches = attr.match(WIDTH); + + if (matches !== null && matches.length >= 1) { + return matches[1]; + } + } + + return null; + } + + return method; + }; + + Select2.prototype._bindAdapters = function () { + this.dataAdapter.bind(this, this.$container); + this.selection.bind(this, this.$container); + + this.dropdown.bind(this, this.$container); + this.results.bind(this, this.$container); + }; + + Select2.prototype._registerDomEvents = function () { + var self = this; + + this.$element.on('change.select2', function () { + self.dataAdapter.current(function (data) { + self.trigger('selection:update', { + data: data + }); + }); + }); + + this.$element.on('focus.select2', function (evt) { + self.trigger('focus', evt); + }); + + this._syncA = Utils.bind(this._syncAttributes, this); + this._syncS = Utils.bind(this._syncSubtree, this); + + if (this.$element[0].attachEvent) { + this.$element[0].attachEvent('onpropertychange', this._syncA); + } + + var observer = window.MutationObserver || + window.WebKitMutationObserver || + window.MozMutationObserver + ; + + if (observer != null) { + this._observer = new observer(function (mutations) { + $.each(mutations, self._syncA); + $.each(mutations, self._syncS); + }); + this._observer.observe(this.$element[0], { + attributes: true, + childList: true, + subtree: false + }); + } else if (this.$element[0].addEventListener) { + this.$element[0].addEventListener( + 'DOMAttrModified', + self._syncA, + false + ); + this.$element[0].addEventListener( + 'DOMNodeInserted', + self._syncS, + false + ); + this.$element[0].addEventListener( + 'DOMNodeRemoved', + self._syncS, + false + ); + } + }; + + Select2.prototype._registerDataEvents = function () { + var self = this; + + this.dataAdapter.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerSelectionEvents = function () { + var self = this; + var nonRelayEvents = ['toggle', 'focus']; + + this.selection.on('toggle', function () { + self.toggleDropdown(); + }); + + this.selection.on('focus', function (params) { + self.focus(params); + }); + + this.selection.on('*', function (name, params) { + if ($.inArray(name, nonRelayEvents) !== -1) { + return; + } + + self.trigger(name, params); + }); + }; + + Select2.prototype._registerDropdownEvents = function () { + var self = this; + + this.dropdown.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerResultsEvents = function () { + var self = this; + + this.results.on('*', function (name, params) { + self.trigger(name, params); + }); + }; + + Select2.prototype._registerEvents = function () { + var self = this; + + this.on('open', function () { + self.$container.addClass('select2-container--open'); + }); + + this.on('close', function () { + self.$container.removeClass('select2-container--open'); + }); + + this.on('enable', function () { + self.$container.removeClass('select2-container--disabled'); + }); + + this.on('disable', function () { + self.$container.addClass('select2-container--disabled'); + }); + + this.on('blur', function () { + self.$container.removeClass('select2-container--focus'); + }); + + this.on('query', function (params) { + if (!self.isOpen()) { + self.trigger('open', {}); + } + + this.dataAdapter.query(params, function (data) { + self.trigger('results:all', { + data: data, + query: params + }); + }); + }); + + this.on('query:append', function (params) { + this.dataAdapter.query(params, function (data) { + self.trigger('results:append', { + data: data, + query: params + }); + }); + }); + + this.on('keypress', function (evt) { + var key = evt.which; + + if (self.isOpen()) { + if (key === KEYS.ESC || key === KEYS.TAB || + (key === KEYS.UP && evt.altKey)) { + self.close(); + + evt.preventDefault(); + } else if (key === KEYS.ENTER) { + self.trigger('results:select', {}); + + evt.preventDefault(); + } else if ((key === KEYS.SPACE && evt.ctrlKey)) { + self.trigger('results:toggle', {}); + + evt.preventDefault(); + } else if (key === KEYS.UP) { + self.trigger('results:previous', {}); + + evt.preventDefault(); + } else if (key === KEYS.DOWN) { + self.trigger('results:next', {}); + + evt.preventDefault(); + } + } else { + if (key === KEYS.ENTER || key === KEYS.SPACE || + (key === KEYS.DOWN && evt.altKey)) { + self.open(); + + evt.preventDefault(); + } + } + }); + }; + + Select2.prototype._syncAttributes = function () { + this.options.set('disabled', this.$element.prop('disabled')); + + if (this.options.get('disabled')) { + if (this.isOpen()) { + this.close(); + } + + this.trigger('disable', {}); + } else { + this.trigger('enable', {}); + } + }; + + Select2.prototype._syncSubtree = function (evt, mutations) { + var changed = false; + var self = this; + + // Ignore any mutation events raised for elements that aren't options or + // optgroups. This handles the case when the select element is destroyed + if ( + evt && evt.target && ( + evt.target.nodeName !== 'OPTION' && evt.target.nodeName !== 'OPTGROUP' + ) + ) { + return; + } + + if (!mutations) { + // If mutation events aren't supported, then we can only assume that the + // change affected the selections + changed = true; + } else if (mutations.addedNodes && mutations.addedNodes.length > 0) { + for (var n = 0; n < mutations.addedNodes.length; n++) { + var node = mutations.addedNodes[n]; + + if (node.selected) { + changed = true; + } + } + } else if (mutations.removedNodes && mutations.removedNodes.length > 0) { + changed = true; + } + + // Only re-pull the data if we think there is a change + if (changed) { + this.dataAdapter.current(function (currentData) { + self.trigger('selection:update', { + data: currentData + }); + }); + } + }; + + /** + * Override the trigger method to automatically trigger pre-events when + * there are events that can be prevented. + */ + Select2.prototype.trigger = function (name, args) { + var actualTrigger = Select2.__super__.trigger; + var preTriggerMap = { + 'open': 'opening', + 'close': 'closing', + 'select': 'selecting', + 'unselect': 'unselecting', + 'clear': 'clearing' + }; + + if (args === undefined) { + args = {}; + } + + if (name in preTriggerMap) { + var preTriggerName = preTriggerMap[name]; + var preTriggerArgs = { + prevented: false, + name: name, + args: args + }; + + actualTrigger.call(this, preTriggerName, preTriggerArgs); + + if (preTriggerArgs.prevented) { + args.prevented = true; + + return; + } + } + + actualTrigger.call(this, name, args); + }; + + Select2.prototype.toggleDropdown = function () { + if (this.options.get('disabled')) { + return; + } + + if (this.isOpen()) { + this.close(); + } else { + this.open(); + } + }; + + Select2.prototype.open = function () { + if (this.isOpen()) { + return; + } + + this.trigger('query', {}); + }; + + Select2.prototype.close = function () { + if (!this.isOpen()) { + return; + } + + this.trigger('close', {}); + }; + + Select2.prototype.isOpen = function () { + return this.$container.hasClass('select2-container--open'); + }; + + Select2.prototype.hasFocus = function () { + return this.$container.hasClass('select2-container--focus'); + }; + + Select2.prototype.focus = function (data) { + // No need to re-trigger focus events if we are already focused + if (this.hasFocus()) { + return; + } + + this.$container.addClass('select2-container--focus'); + this.trigger('focus', {}); + }; + + Select2.prototype.enable = function (args) { + if (this.options.get('debug') && window.console && console.warn) { + console.warn( + 'Select2: The `select2("enable")` method has been deprecated and will' + + ' be removed in later Select2 versions. Use $element.prop("disabled")' + + ' instead.' + ); + } + + if (args == null || args.length === 0) { + args = [true]; + } + + var disabled = !args[0]; + + this.$element.prop('disabled', disabled); + }; + + Select2.prototype.data = function () { + if (this.options.get('debug') && + arguments.length > 0 && window.console && console.warn) { + console.warn( + 'Select2: Data can no longer be set using `select2("data")`. You ' + + 'should consider setting the value instead using `$element.val()`.' + ); + } + + var data = []; + + this.dataAdapter.current(function (currentData) { + data = currentData; + }); + + return data; + }; + + Select2.prototype.val = function (args) { + if (this.options.get('debug') && window.console && console.warn) { + console.warn( + 'Select2: The `select2("val")` method has been deprecated and will be' + + ' removed in later Select2 versions. Use $element.val() instead.' + ); + } + + if (args == null || args.length === 0) { + return this.$element.val(); + } + + var newVal = args[0]; + + if ($.isArray(newVal)) { + newVal = $.map(newVal, function (obj) { + return obj.toString(); + }); + } + + this.$element.val(newVal).trigger('change'); + }; + + Select2.prototype.destroy = function () { + this.$container.remove(); + + if (this.$element[0].detachEvent) { + this.$element[0].detachEvent('onpropertychange', this._syncA); + } + + if (this._observer != null) { + this._observer.disconnect(); + this._observer = null; + } else if (this.$element[0].removeEventListener) { + this.$element[0] + .removeEventListener('DOMAttrModified', this._syncA, false); + this.$element[0] + .removeEventListener('DOMNodeInserted', this._syncS, false); + this.$element[0] + .removeEventListener('DOMNodeRemoved', this._syncS, false); + } + + this._syncA = null; + this._syncS = null; + + this.$element.off('.select2'); + this.$element.attr('tabindex', + Utils.GetData(this.$element[0], 'old-tabindex')); + + this.$element.removeClass('select2-hidden-accessible'); + this.$element.attr('aria-hidden', 'false'); + Utils.RemoveData(this.$element[0]); + this.$element.removeData('select2'); + + this.dataAdapter.destroy(); + this.selection.destroy(); + this.dropdown.destroy(); + this.results.destroy(); + + this.dataAdapter = null; + this.selection = null; + this.dropdown = null; + this.results = null; + }; + + Select2.prototype.render = function () { + var $container = $( + '' + + '' + + '' + + '' + ); + + $container.attr('dir', this.options.get('dir')); + + this.$container = $container; + + this.$container.addClass('select2-container--' + this.options.get('theme')); + + Utils.StoreData($container[0], 'element', this.$element); + + return $container; + }; + + return Select2; + }); + + S2.define('jquery-mousewheel',[ + 'jquery' + ], function ($) { + // Used to shim jQuery.mousewheel for non-full builds. + return $; + }); + + S2.define('jquery.select2',[ + 'jquery', + 'jquery-mousewheel', + + './select2/core', + './select2/defaults', + './select2/utils' + ], function ($, _, Select2, Defaults, Utils) { + if ($.fn.select2 == null) { + // All methods that should return the element + var thisMethods = ['open', 'close', 'destroy']; + + $.fn.select2 = function (options) { + options = options || {}; + + if (typeof options === 'object') { + this.each(function () { + var instanceOptions = $.extend(true, {}, options); + + var instance = new Select2($(this), instanceOptions); + }); + + return this; + } else if (typeof options === 'string') { + var ret; + var args = Array.prototype.slice.call(arguments, 1); + + this.each(function () { + var instance = Utils.GetData(this, 'select2'); + + if (instance == null && window.console && console.error) { + console.error( + 'The select2(\'' + options + '\') method was called on an ' + + 'element that is not using Select2.' + ); + } + + ret = instance[options].apply(instance, args); + }); + + // Check if we should be returning `this` + if ($.inArray(options, thisMethods) > -1) { + return this; + } + + return ret; + } else { + throw new Error('Invalid arguments for Select2: ' + options); + } + }; + } + + if ($.fn.select2.defaults == null) { + $.fn.select2.defaults = Defaults; + } + + return Select2; + }); + + // Return the AMD loader configuration so it can be used outside of this file + return { + define: S2.define, + require: S2.require + }; + }()); + + // Autoload the jQuery bindings + // We know that all of the modules exist above this, so we're safe + var select2 = S2.require('jquery.select2'); + + // Hold the AMD module references on the jQuery function that was just loaded + // This allows Select2 to use the internal loader outside of this file, such + // as in the language files. + jQuery.fn.select2.amd = S2; + + // Return the Select2 instance for anyone who is importing it. + return select2; +})); diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/crud/lib/select2.min.js b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/crud/lib/select2.min.js new file mode 100644 index 0000000..6601160 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/crud/lib/select2.min.js @@ -0,0 +1 @@ +/*! Select2 4.0.7 | https://github.com/select2/select2/blob/master/LICENSE.md */!function(a){"function"==typeof define&&define.amd?define(["jquery"],a):"object"==typeof module&&module.exports?module.exports=function(b,c){return void 0===c&&(c="undefined"!=typeof window?require("jquery"):require("jquery")(b)),a(c),c}:a(jQuery)}(function(a){var b=function(){if(a&&a.fn&&a.fn.select2&&a.fn.select2.amd)var b=a.fn.select2.amd;var b;return function(){if(!b||!b.requirejs){b?c=b:b={};var a,c,d;!function(b){function e(a,b){return v.call(a,b)}function f(a,b){var c,d,e,f,g,h,i,j,k,l,m,n,o=b&&b.split("/"),p=t.map,q=p&&p["*"]||{};if(a){for(a=a.split("/"),g=a.length-1,t.nodeIdCompat&&x.test(a[g])&&(a[g]=a[g].replace(x,"")),"."===a[0].charAt(0)&&o&&(n=o.slice(0,o.length-1),a=n.concat(a)),k=0;k0&&(a.splice(k-1,2),k-=2)}a=a.join("/")}if((o||q)&&p){for(c=a.split("/"),k=c.length;k>0;k-=1){if(d=c.slice(0,k).join("/"),o)for(l=o.length;l>0;l-=1)if((e=p[o.slice(0,l).join("/")])&&(e=e[d])){f=e,h=k;break}if(f)break;!i&&q&&q[d]&&(i=q[d],j=k)}!f&&i&&(f=i,h=j),f&&(c.splice(0,h,f),a=c.join("/"))}return a}function g(a,c){return function(){var d=w.call(arguments,0);return"string"!=typeof d[0]&&1===d.length&&d.push(null),o.apply(b,d.concat([a,c]))}}function h(a){return function(b){return f(b,a)}}function i(a){return function(b){r[a]=b}}function j(a){if(e(s,a)){var c=s[a];delete s[a],u[a]=!0,n.apply(b,c)}if(!e(r,a)&&!e(u,a))throw new Error("No "+a);return r[a]}function k(a){var b,c=a?a.indexOf("!"):-1;return c>-1&&(b=a.substring(0,c),a=a.substring(c+1,a.length)),[b,a]}function l(a){return a?k(a):[]}function m(a){return function(){return t&&t.config&&t.config[a]||{}}}var n,o,p,q,r={},s={},t={},u={},v=Object.prototype.hasOwnProperty,w=[].slice,x=/\.js$/;p=function(a,b){var c,d=k(a),e=d[0],g=b[1];return a=d[1],e&&(e=f(e,g),c=j(e)),e?a=c&&c.normalize?c.normalize(a,h(g)):f(a,g):(a=f(a,g),d=k(a),e=d[0],a=d[1],e&&(c=j(e))),{f:e?e+"!"+a:a,n:a,pr:e,p:c}},q={require:function(a){return g(a)},exports:function(a){var b=r[a];return void 0!==b?b:r[a]={}},module:function(a){return{id:a,uri:"",exports:r[a],config:m(a)}}},n=function(a,c,d,f){var h,k,m,n,o,t,v,w=[],x=typeof d;if(f=f||a,t=l(f),"undefined"===x||"function"===x){for(c=!c.length&&d.length?["require","exports","module"]:c,o=0;o0&&(b.call(arguments,a.prototype.constructor),e=c.prototype.constructor),e.apply(this,arguments)}function e(){this.constructor=d}var f=b(c),g=b(a);c.displayName=a.displayName,d.prototype=new e;for(var h=0;h":">",'"':""","'":"'","/":"/"};return"string"!=typeof a?a:String(a).replace(/[&<>"'\/\\]/g,function(a){return b[a]})},c.appendMany=function(b,c){if("1.7"===a.fn.jquery.substr(0,3)){var d=a();a.map(c,function(a){d=d.add(a)}),c=d}b.append(c)},c.__cache={};var e=0;return c.GetUniqueElementId=function(a){var b=a.getAttribute("data-select2-id");return null==b&&(a.id?(b=a.id,a.setAttribute("data-select2-id",b)):(a.setAttribute("data-select2-id",++e),b=e.toString())),b},c.StoreData=function(a,b,d){var e=c.GetUniqueElementId(a);c.__cache[e]||(c.__cache[e]={}),c.__cache[e][b]=d},c.GetData=function(b,d){var e=c.GetUniqueElementId(b);return d?c.__cache[e]&&null!=c.__cache[e][d]?c.__cache[e][d]:a(b).data(d):c.__cache[e]},c.RemoveData=function(a){var b=c.GetUniqueElementId(a);null!=c.__cache[b]&&delete c.__cache[b]},c}),b.define("select2/results",["jquery","./utils"],function(a,b){function c(a,b,d){this.$element=a,this.data=d,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('
                        ');return this.options.get("multiple")&&b.attr("aria-multiselectable","true"),this.$results=b,b},c.prototype.clear=function(){this.$results.empty()},c.prototype.displayMessage=function(b){var c=this.options.get("escapeMarkup");this.clear(),this.hideLoading();var d=a('
                      • '),e=this.options.get("translations").get(b.message);d.append(c(e(b.args))),d[0].className+=" select2-results__message",this.$results.append(d)},c.prototype.hideMessages=function(){this.$results.find(".select2-results__message").remove()},c.prototype.append=function(a){this.hideLoading();var b=[];if(null==a.results||0===a.results.length)return void(0===this.$results.children().length&&this.trigger("results:message",{message:"noResults"}));a.results=this.sort(a.results);for(var c=0;c0?b.first().trigger("mouseenter"):a.first().trigger("mouseenter"),this.ensureHighlightVisible()},c.prototype.setClasses=function(){var c=this;this.data.current(function(d){var e=a.map(d,function(a){return a.id.toString()});c.$results.find(".select2-results__option[aria-selected]").each(function(){var c=a(this),d=b.GetData(this,"data"),f=""+d.id;null!=d.element&&d.element.selected||null==d.element&&a.inArray(f,e)>-1?c.attr("aria-selected","true"):c.attr("aria-selected","false")})})},c.prototype.showLoading=function(a){this.hideLoading();var b=this.options.get("translations").get("searching"),c={disabled:!0,loading:!0,text:b(a)},d=this.option(c);d.className+=" loading-results",this.$results.prepend(d)},c.prototype.hideLoading=function(){this.$results.find(".loading-results").remove()},c.prototype.option=function(c){var d=document.createElement("li");d.className="select2-results__option";var e={role:"treeitem","aria-selected":"false"};c.disabled&&(delete e["aria-selected"],e["aria-disabled"]="true"),null==c.id&&delete e["aria-selected"],null!=c._resultId&&(d.id=c._resultId),c.title&&(d.title=c.title),c.children&&(e.role="group",e["aria-label"]=c.text,delete e["aria-selected"]);for(var f in e){var g=e[f];d.setAttribute(f,g)}if(c.children){var h=a(d),i=document.createElement("strong");i.className="select2-results__group";a(i);this.template(c,i);for(var j=[],k=0;k
                    ",{class:"select2-results__options select2-results__options--nested"});n.append(j),h.append(i),h.append(n)}else this.template(c,d);return b.StoreData(d,"data",c),d},c.prototype.bind=function(c,d){var e=this,f=c.id+"-results";this.$results.attr("id",f),c.on("results:all",function(a){e.clear(),e.append(a.data),c.isOpen()&&(e.setClasses(),e.highlightFirstItem())}),c.on("results:append",function(a){e.append(a.data),c.isOpen()&&e.setClasses()}),c.on("query",function(a){e.hideMessages(),e.showLoading(a)}),c.on("select",function(){c.isOpen()&&(e.setClasses(),e.options.get("scrollAfterSelect")&&e.highlightFirstItem())}),c.on("unselect",function(){c.isOpen()&&(e.setClasses(),e.options.get("scrollAfterSelect")&&e.highlightFirstItem())}),c.on("open",function(){e.$results.attr("aria-expanded","true"),e.$results.attr("aria-hidden","false"),e.setClasses(),e.ensureHighlightVisible()}),c.on("close",function(){e.$results.attr("aria-expanded","false"),e.$results.attr("aria-hidden","true"),e.$results.removeAttr("aria-activedescendant")}),c.on("results:toggle",function(){var a=e.getHighlightedResults();0!==a.length&&a.trigger("mouseup")}),c.on("results:select",function(){var a=e.getHighlightedResults();if(0!==a.length){var c=b.GetData(a[0],"data");"true"==a.attr("aria-selected")?e.trigger("close",{}):e.trigger("select",{data:c})}}),c.on("results:previous",function(){var a=e.getHighlightedResults(),b=e.$results.find("[aria-selected]"),c=b.index(a);if(!(c<=0)){var d=c-1;0===a.length&&(d=0);var f=b.eq(d);f.trigger("mouseenter");var g=e.$results.offset().top,h=f.offset().top,i=e.$results.scrollTop()+(h-g);0===d?e.$results.scrollTop(0):h-g<0&&e.$results.scrollTop(i)}}),c.on("results:next",function(){var a=e.getHighlightedResults(),b=e.$results.find("[aria-selected]"),c=b.index(a),d=c+1;if(!(d>=b.length)){var f=b.eq(d);f.trigger("mouseenter");var g=e.$results.offset().top+e.$results.outerHeight(!1),h=f.offset().top+f.outerHeight(!1),i=e.$results.scrollTop()+h-g;0===d?e.$results.scrollTop(0):h>g&&e.$results.scrollTop(i)}}),c.on("results:focus",function(a){a.element.addClass("select2-results__option--highlighted")}),c.on("results:message",function(a){e.displayMessage(a)}),a.fn.mousewheel&&this.$results.on("mousewheel",function(a){var b=e.$results.scrollTop(),c=e.$results.get(0).scrollHeight-b+a.deltaY,d=a.deltaY>0&&b-a.deltaY<=0,f=a.deltaY<0&&c<=e.$results.height();d?(e.$results.scrollTop(0),a.preventDefault(),a.stopPropagation()):f&&(e.$results.scrollTop(e.$results.get(0).scrollHeight-e.$results.height()),a.preventDefault(),a.stopPropagation())}),this.$results.on("mouseup",".select2-results__option[aria-selected]",function(c){var d=a(this),f=b.GetData(this,"data");if("true"===d.attr("aria-selected"))return void(e.options.get("multiple")?e.trigger("unselect",{originalEvent:c,data:f}):e.trigger("close",{}));e.trigger("select",{originalEvent:c,data:f})}),this.$results.on("mouseenter",".select2-results__option[aria-selected]",function(c){var d=b.GetData(this,"data");e.getHighlightedResults().removeClass("select2-results__option--highlighted"),e.trigger("results:focus",{data:d,element:a(this)})})},c.prototype.getHighlightedResults=function(){return this.$results.find(".select2-results__option--highlighted")},c.prototype.destroy=function(){this.$results.remove()},c.prototype.ensureHighlightVisible=function(){var a=this.getHighlightedResults();if(0!==a.length){var b=this.$results.find("[aria-selected]"),c=b.index(a),d=this.$results.offset().top,e=a.offset().top,f=this.$results.scrollTop()+(e-d),g=e-d;f-=2*a.outerHeight(!1),c<=2?this.$results.scrollTop(0):(g>this.$results.outerHeight()||g<0)&&this.$results.scrollTop(f)}},c.prototype.template=function(b,c){var d=this.options.get("templateResult"),e=this.options.get("escapeMarkup"),f=d(b,c);null==f?c.style.display="none":"string"==typeof f?c.innerHTML=e(f):a(c).append(f)},c}),b.define("select2/keys",[],function(){return{BACKSPACE:8,TAB:9,ENTER:13,SHIFT:16,CTRL:17,ALT:18,ESC:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT:37,UP:38,RIGHT:39,DOWN:40,DELETE:46}}),b.define("select2/selection/base",["jquery","../utils","../keys"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,b.Observable),d.prototype.render=function(){var c=a('');return this._tabindex=0,null!=b.GetData(this.$element[0],"old-tabindex")?this._tabindex=b.GetData(this.$element[0],"old-tabindex"):null!=this.$element.attr("tabindex")&&(this._tabindex=this.$element.attr("tabindex")),c.attr("title",this.$element.attr("title")),c.attr("tabindex",this._tabindex),this.$selection=c,c},d.prototype.bind=function(a,b){var d=this,e=(a.id,a.id+"-results");this.container=a,this.$selection.on("focus",function(a){d.trigger("focus",a)}),this.$selection.on("blur",function(a){d._handleBlur(a)}),this.$selection.on("keydown",function(a){d.trigger("keypress",a),a.which===c.SPACE&&a.preventDefault()}),a.on("results:focus",function(a){d.$selection.attr("aria-activedescendant",a.data._resultId)}),a.on("selection:update",function(a){d.update(a.data)}),a.on("open",function(){d.$selection.attr("aria-expanded","true"),d.$selection.attr("aria-owns",e),d._attachCloseHandler(a)}),a.on("close",function(){d.$selection.attr("aria-expanded","false"),d.$selection.removeAttr("aria-activedescendant"),d.$selection.removeAttr("aria-owns"),window.setTimeout(function(){d.$selection.focus()},0),d._detachCloseHandler(a)}),a.on("enable",function(){d.$selection.attr("tabindex",d._tabindex)}),a.on("disable",function(){d.$selection.attr("tabindex","-1")})},d.prototype._handleBlur=function(b){var c=this;window.setTimeout(function(){document.activeElement==c.$selection[0]||a.contains(c.$selection[0],document.activeElement)||c.trigger("blur",b)},1)},d.prototype._attachCloseHandler=function(c){a(document.body).on("mousedown.select2."+c.id,function(c){var d=a(c.target),e=d.closest(".select2");a(".select2.select2-container--open").each(function(){a(this),this!=e[0]&&b.GetData(this,"element").select2("close")})})},d.prototype._detachCloseHandler=function(b){a(document.body).off("mousedown.select2."+b.id)},d.prototype.position=function(a,b){b.find(".selection").append(a)},d.prototype.destroy=function(){this._detachCloseHandler(this.container)},d.prototype.update=function(a){throw new Error("The `update` method must be defined in child classes.")},d}),b.define("select2/selection/single",["jquery","./base","../utils","../keys"],function(a,b,c,d){function e(){e.__super__.constructor.apply(this,arguments)}return c.Extend(e,b),e.prototype.render=function(){var a=e.__super__.render.call(this);return a.addClass("select2-selection--single"),a.html(''),a},e.prototype.bind=function(a,b){var c=this;e.__super__.bind.apply(this,arguments);var d=a.id+"-container";this.$selection.find(".select2-selection__rendered").attr("id",d).attr("role","textbox").attr("aria-readonly","true"),this.$selection.attr("aria-labelledby",d),this.$selection.on("mousedown",function(a){1===a.which&&c.trigger("toggle",{originalEvent:a})}),this.$selection.on("focus",function(a){}),this.$selection.on("blur",function(a){}),a.on("focus",function(b){a.isOpen()||c.$selection.focus()})},e.prototype.clear=function(){var a=this.$selection.find(".select2-selection__rendered");a.empty(),a.removeAttr("title")},e.prototype.display=function(a,b){var c=this.options.get("templateSelection");return this.options.get("escapeMarkup")(c(a,b))},e.prototype.selectionContainer=function(){return a("")},e.prototype.update=function(a){if(0===a.length)return void this.clear();var b=a[0],c=this.$selection.find(".select2-selection__rendered"),d=this.display(b,c);c.empty().append(d),c.attr("title",b.title||b.text)},e}),b.define("select2/selection/multiple",["jquery","./base","../utils"],function(a,b,c){function d(a,b){d.__super__.constructor.apply(this,arguments)}return c.Extend(d,b),d.prototype.render=function(){var a=d.__super__.render.call(this);return a.addClass("select2-selection--multiple"),a.html('
                      '),a},d.prototype.bind=function(b,e){var f=this;d.__super__.bind.apply(this,arguments),this.$selection.on("click",function(a){f.trigger("toggle",{originalEvent:a})}),this.$selection.on("click",".select2-selection__choice__remove",function(b){if(!f.options.get("disabled")){var d=a(this),e=d.parent(),g=c.GetData(e[0],"data");f.trigger("unselect",{originalEvent:b,data:g})}})},d.prototype.clear=function(){var a=this.$selection.find(".select2-selection__rendered");a.empty(),a.removeAttr("title")},d.prototype.display=function(a,b){var c=this.options.get("templateSelection");return this.options.get("escapeMarkup")(c(a,b))},d.prototype.selectionContainer=function(){return a('
                    • ×
                    • ')},d.prototype.update=function(a){if(this.clear(),0!==a.length){for(var b=[],d=0;d1||c)return a.call(this,b);this.clear();var d=this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append(d)},b}),b.define("select2/selection/allowClear",["jquery","../keys","../utils"],function(a,b,c){function d(){}return d.prototype.bind=function(a,b,c){var d=this;a.call(this,b,c),null==this.placeholder&&this.options.get("debug")&&window.console&&console.error&&console.error("Select2: The `allowClear` option should be used in combination with the `placeholder` option."),this.$selection.on("mousedown",".select2-selection__clear",function(a){d._handleClear(a)}),b.on("keypress",function(a){d._handleKeyboardClear(a,b)})},d.prototype._handleClear=function(a,b){if(!this.options.get("disabled")){var d=this.$selection.find(".select2-selection__clear");if(0!==d.length){b.stopPropagation();var e=c.GetData(d[0],"data"),f=this.$element.val();this.$element.val(this.placeholder.id);var g={data:e};if(this.trigger("clear",g),g.prevented)return void this.$element.val(f);for(var h=0;h0||0===d.length)){var e=this.options.get("translations").get("removeAllItems"),f=a('×');c.StoreData(f[0],"data",d),this.$selection.find(".select2-selection__rendered").prepend(f)}},d}),b.define("select2/selection/search",["jquery","../utils","../keys"],function(a,b,c){function d(a,b,c){a.call(this,b,c)}return d.prototype.render=function(b){var c=a('');this.$searchContainer=c,this.$search=c.find("input");var d=b.call(this);return this._transferTabIndex(),d},d.prototype.bind=function(a,d,e){var f=this;a.call(this,d,e),d.on("open",function(){f.$search.trigger("focus")}),d.on("close",function(){f.$search.val(""),f.$search.removeAttr("aria-activedescendant"),f.$search.trigger("focus")}),d.on("enable",function(){f.$search.prop("disabled",!1),f._transferTabIndex()}),d.on("disable",function(){f.$search.prop("disabled",!0)}),d.on("focus",function(a){f.$search.trigger("focus")}),d.on("results:focus",function(a){f.$search.attr("aria-activedescendant",a.id)}),this.$selection.on("focusin",".select2-search--inline",function(a){f.trigger("focus",a)}),this.$selection.on("focusout",".select2-search--inline",function(a){f._handleBlur(a)}),this.$selection.on("keydown",".select2-search--inline",function(a){if(a.stopPropagation(),f.trigger("keypress",a),f._keyUpPrevented=a.isDefaultPrevented(),a.which===c.BACKSPACE&&""===f.$search.val()){var d=f.$searchContainer.prev(".select2-selection__choice");if(d.length>0){var e=b.GetData(d[0],"data");f.searchRemoveChoice(e),a.preventDefault()}}});var g=document.documentMode,h=g&&g<=11;this.$selection.on("input.searchcheck",".select2-search--inline",function(a){if(h)return void f.$selection.off("input.search input.searchcheck");f.$selection.off("keyup.search")}),this.$selection.on("keyup.search input.search",".select2-search--inline",function(a){if(h&&"input"===a.type)return void f.$selection.off("input.search input.searchcheck");var b=a.which;b!=c.SHIFT&&b!=c.CTRL&&b!=c.ALT&&b!=c.TAB&&f.handleSearch(a)})},d.prototype._transferTabIndex=function(a){this.$search.attr("tabindex",this.$selection.attr("tabindex")),this.$selection.attr("tabindex","-1")},d.prototype.createPlaceholder=function(a,b){this.$search.attr("placeholder",b.text)},d.prototype.update=function(a,b){var c=this.$search[0]==document.activeElement;if(this.$search.attr("placeholder",""),a.call(this,b),this.$selection.find(".select2-selection__rendered").append(this.$searchContainer),this.resizeSearch(),c){this.$element.find("[data-select2-tag]").length?this.$element.focus():this.$search.focus()}},d.prototype.handleSearch=function(){if(this.resizeSearch(),!this._keyUpPrevented){var a=this.$search.val();this.trigger("query",{term:a})}this._keyUpPrevented=!1},d.prototype.searchRemoveChoice=function(a,b){this.trigger("unselect",{data:b}),this.$search.val(b.text),this.handleSearch()},d.prototype.resizeSearch=function(){this.$search.css("width","25px");var a="";if(""!==this.$search.attr("placeholder"))a=this.$selection.find(".select2-selection__rendered").innerWidth();else{a=.75*(this.$search.val().length+1)+"em"}this.$search.css("width",a)},d}),b.define("select2/selection/eventRelay",["jquery"],function(a){function b(){}return b.prototype.bind=function(b,c,d){var e=this,f=["open","opening","close","closing","select","selecting","unselect","unselecting","clear","clearing"],g=["opening","closing","selecting","unselecting","clearing"];b.call(this,c,d),c.on("*",function(b,c){if(-1!==a.inArray(b,f)){c=c||{};var d=a.Event("select2:"+b,{params:c});e.$element.trigger(d),-1!==a.inArray(b,g)&&(c.prevented=d.isDefaultPrevented())}})},b}),b.define("select2/translation",["jquery","require"],function(a,b){function c(a){this.dict=a||{}}return c.prototype.all=function(){return this.dict},c.prototype.get=function(a){return this.dict[a]},c.prototype.extend=function(b){this.dict=a.extend({},b.all(),this.dict)},c._cache={},c.loadPath=function(a){if(!(a in c._cache)){var d=b(a);c._cache[a]=d}return new c(c._cache[a])},c}),b.define("select2/diacritics",[],function(){return{"Ⓐ":"A","A":"A","À":"A","Á":"A","Â":"A","Ầ":"A","Ấ":"A","Ẫ":"A","Ẩ":"A","Ã":"A","Ā":"A","Ă":"A","Ằ":"A","Ắ":"A","Ẵ":"A","Ẳ":"A","Ȧ":"A","Ǡ":"A","Ä":"A","Ǟ":"A","Ả":"A","Å":"A","Ǻ":"A","Ǎ":"A","Ȁ":"A","Ȃ":"A","Ạ":"A","Ậ":"A","Ặ":"A","Ḁ":"A","Ą":"A","Ⱥ":"A","Ɐ":"A","Ꜳ":"AA","Æ":"AE","Ǽ":"AE","Ǣ":"AE","Ꜵ":"AO","Ꜷ":"AU","Ꜹ":"AV","Ꜻ":"AV","Ꜽ":"AY","Ⓑ":"B","B":"B","Ḃ":"B","Ḅ":"B","Ḇ":"B","Ƀ":"B","Ƃ":"B","Ɓ":"B","Ⓒ":"C","C":"C","Ć":"C","Ĉ":"C","Ċ":"C","Č":"C","Ç":"C","Ḉ":"C","Ƈ":"C","Ȼ":"C","Ꜿ":"C","Ⓓ":"D","D":"D","Ḋ":"D","Ď":"D","Ḍ":"D","Ḑ":"D","Ḓ":"D","Ḏ":"D","Đ":"D","Ƌ":"D","Ɗ":"D","Ɖ":"D","Ꝺ":"D","DZ":"DZ","DŽ":"DZ","Dz":"Dz","Dž":"Dz","Ⓔ":"E","E":"E","È":"E","É":"E","Ê":"E","Ề":"E","Ế":"E","Ễ":"E","Ể":"E","Ẽ":"E","Ē":"E","Ḕ":"E","Ḗ":"E","Ĕ":"E","Ė":"E","Ë":"E","Ẻ":"E","Ě":"E","Ȅ":"E","Ȇ":"E","Ẹ":"E","Ệ":"E","Ȩ":"E","Ḝ":"E","Ę":"E","Ḙ":"E","Ḛ":"E","Ɛ":"E","Ǝ":"E","Ⓕ":"F","F":"F","Ḟ":"F","Ƒ":"F","Ꝼ":"F","Ⓖ":"G","G":"G","Ǵ":"G","Ĝ":"G","Ḡ":"G","Ğ":"G","Ġ":"G","Ǧ":"G","Ģ":"G","Ǥ":"G","Ɠ":"G","Ꞡ":"G","Ᵹ":"G","Ꝿ":"G","Ⓗ":"H","H":"H","Ĥ":"H","Ḣ":"H","Ḧ":"H","Ȟ":"H","Ḥ":"H","Ḩ":"H","Ḫ":"H","Ħ":"H","Ⱨ":"H","Ⱶ":"H","Ɥ":"H","Ⓘ":"I","I":"I","Ì":"I","Í":"I","Î":"I","Ĩ":"I","Ī":"I","Ĭ":"I","İ":"I","Ï":"I","Ḯ":"I","Ỉ":"I","Ǐ":"I","Ȉ":"I","Ȋ":"I","Ị":"I","Į":"I","Ḭ":"I","Ɨ":"I","Ⓙ":"J","J":"J","Ĵ":"J","Ɉ":"J","Ⓚ":"K","K":"K","Ḱ":"K","Ǩ":"K","Ḳ":"K","Ķ":"K","Ḵ":"K","Ƙ":"K","Ⱪ":"K","Ꝁ":"K","Ꝃ":"K","Ꝅ":"K","Ꞣ":"K","Ⓛ":"L","L":"L","Ŀ":"L","Ĺ":"L","Ľ":"L","Ḷ":"L","Ḹ":"L","Ļ":"L","Ḽ":"L","Ḻ":"L","Ł":"L","Ƚ":"L","Ɫ":"L","Ⱡ":"L","Ꝉ":"L","Ꝇ":"L","Ꞁ":"L","LJ":"LJ","Lj":"Lj","Ⓜ":"M","M":"M","Ḿ":"M","Ṁ":"M","Ṃ":"M","Ɱ":"M","Ɯ":"M","Ⓝ":"N","N":"N","Ǹ":"N","Ń":"N","Ñ":"N","Ṅ":"N","Ň":"N","Ṇ":"N","Ņ":"N","Ṋ":"N","Ṉ":"N","Ƞ":"N","Ɲ":"N","Ꞑ":"N","Ꞥ":"N","NJ":"NJ","Nj":"Nj","Ⓞ":"O","O":"O","Ò":"O","Ó":"O","Ô":"O","Ồ":"O","Ố":"O","Ỗ":"O","Ổ":"O","Õ":"O","Ṍ":"O","Ȭ":"O","Ṏ":"O","Ō":"O","Ṑ":"O","Ṓ":"O","Ŏ":"O","Ȯ":"O","Ȱ":"O","Ö":"O","Ȫ":"O","Ỏ":"O","Ő":"O","Ǒ":"O","Ȍ":"O","Ȏ":"O","Ơ":"O","Ờ":"O","Ớ":"O","Ỡ":"O","Ở":"O","Ợ":"O","Ọ":"O","Ộ":"O","Ǫ":"O","Ǭ":"O","Ø":"O","Ǿ":"O","Ɔ":"O","Ɵ":"O","Ꝋ":"O","Ꝍ":"O","Œ":"OE","Ƣ":"OI","Ꝏ":"OO","Ȣ":"OU","Ⓟ":"P","P":"P","Ṕ":"P","Ṗ":"P","Ƥ":"P","Ᵽ":"P","Ꝑ":"P","Ꝓ":"P","Ꝕ":"P","Ⓠ":"Q","Q":"Q","Ꝗ":"Q","Ꝙ":"Q","Ɋ":"Q","Ⓡ":"R","R":"R","Ŕ":"R","Ṙ":"R","Ř":"R","Ȑ":"R","Ȓ":"R","Ṛ":"R","Ṝ":"R","Ŗ":"R","Ṟ":"R","Ɍ":"R","Ɽ":"R","Ꝛ":"R","Ꞧ":"R","Ꞃ":"R","Ⓢ":"S","S":"S","ẞ":"S","Ś":"S","Ṥ":"S","Ŝ":"S","Ṡ":"S","Š":"S","Ṧ":"S","Ṣ":"S","Ṩ":"S","Ș":"S","Ş":"S","Ȿ":"S","Ꞩ":"S","Ꞅ":"S","Ⓣ":"T","T":"T","Ṫ":"T","Ť":"T","Ṭ":"T","Ț":"T","Ţ":"T","Ṱ":"T","Ṯ":"T","Ŧ":"T","Ƭ":"T","Ʈ":"T","Ⱦ":"T","Ꞇ":"T","Ꜩ":"TZ","Ⓤ":"U","U":"U","Ù":"U","Ú":"U","Û":"U","Ũ":"U","Ṹ":"U","Ū":"U","Ṻ":"U","Ŭ":"U","Ü":"U","Ǜ":"U","Ǘ":"U","Ǖ":"U","Ǚ":"U","Ủ":"U","Ů":"U","Ű":"U","Ǔ":"U","Ȕ":"U","Ȗ":"U","Ư":"U","Ừ":"U","Ứ":"U","Ữ":"U","Ử":"U","Ự":"U","Ụ":"U","Ṳ":"U","Ų":"U","Ṷ":"U","Ṵ":"U","Ʉ":"U","Ⓥ":"V","V":"V","Ṽ":"V","Ṿ":"V","Ʋ":"V","Ꝟ":"V","Ʌ":"V","Ꝡ":"VY","Ⓦ":"W","W":"W","Ẁ":"W","Ẃ":"W","Ŵ":"W","Ẇ":"W","Ẅ":"W","Ẉ":"W","Ⱳ":"W","Ⓧ":"X","X":"X","Ẋ":"X","Ẍ":"X","Ⓨ":"Y","Y":"Y","Ỳ":"Y","Ý":"Y","Ŷ":"Y","Ỹ":"Y","Ȳ":"Y","Ẏ":"Y","Ÿ":"Y","Ỷ":"Y","Ỵ":"Y","Ƴ":"Y","Ɏ":"Y","Ỿ":"Y","Ⓩ":"Z","Z":"Z","Ź":"Z","Ẑ":"Z","Ż":"Z","Ž":"Z","Ẓ":"Z","Ẕ":"Z","Ƶ":"Z","Ȥ":"Z","Ɀ":"Z","Ⱬ":"Z","Ꝣ":"Z","ⓐ":"a","a":"a","ẚ":"a","à":"a","á":"a","â":"a","ầ":"a","ấ":"a","ẫ":"a","ẩ":"a","ã":"a","ā":"a","ă":"a","ằ":"a","ắ":"a","ẵ":"a","ẳ":"a","ȧ":"a","ǡ":"a","ä":"a","ǟ":"a","ả":"a","å":"a","ǻ":"a","ǎ":"a","ȁ":"a","ȃ":"a","ạ":"a","ậ":"a","ặ":"a","ḁ":"a","ą":"a","ⱥ":"a","ɐ":"a","ꜳ":"aa","æ":"ae","ǽ":"ae","ǣ":"ae","ꜵ":"ao","ꜷ":"au","ꜹ":"av","ꜻ":"av","ꜽ":"ay","ⓑ":"b","b":"b","ḃ":"b","ḅ":"b","ḇ":"b","ƀ":"b","ƃ":"b","ɓ":"b","ⓒ":"c","c":"c","ć":"c","ĉ":"c","ċ":"c","č":"c","ç":"c","ḉ":"c","ƈ":"c","ȼ":"c","ꜿ":"c","ↄ":"c","ⓓ":"d","d":"d","ḋ":"d","ď":"d","ḍ":"d","ḑ":"d","ḓ":"d","ḏ":"d","đ":"d","ƌ":"d","ɖ":"d","ɗ":"d","ꝺ":"d","dz":"dz","dž":"dz","ⓔ":"e","e":"e","è":"e","é":"e","ê":"e","ề":"e","ế":"e","ễ":"e","ể":"e","ẽ":"e","ē":"e","ḕ":"e","ḗ":"e","ĕ":"e","ė":"e","ë":"e","ẻ":"e","ě":"e","ȅ":"e","ȇ":"e","ẹ":"e","ệ":"e","ȩ":"e","ḝ":"e","ę":"e","ḙ":"e","ḛ":"e","ɇ":"e","ɛ":"e","ǝ":"e","ⓕ":"f","f":"f","ḟ":"f","ƒ":"f","ꝼ":"f","ⓖ":"g","g":"g","ǵ":"g","ĝ":"g","ḡ":"g","ğ":"g","ġ":"g","ǧ":"g","ģ":"g","ǥ":"g","ɠ":"g","ꞡ":"g","ᵹ":"g","ꝿ":"g","ⓗ":"h","h":"h","ĥ":"h","ḣ":"h","ḧ":"h","ȟ":"h","ḥ":"h","ḩ":"h","ḫ":"h","ẖ":"h","ħ":"h","ⱨ":"h","ⱶ":"h","ɥ":"h","ƕ":"hv","ⓘ":"i","i":"i","ì":"i","í":"i","î":"i","ĩ":"i","ī":"i","ĭ":"i","ï":"i","ḯ":"i","ỉ":"i","ǐ":"i","ȉ":"i","ȋ":"i","ị":"i","į":"i","ḭ":"i","ɨ":"i","ı":"i","ⓙ":"j","j":"j","ĵ":"j","ǰ":"j","ɉ":"j","ⓚ":"k","k":"k","ḱ":"k","ǩ":"k","ḳ":"k","ķ":"k","ḵ":"k","ƙ":"k","ⱪ":"k","ꝁ":"k","ꝃ":"k","ꝅ":"k","ꞣ":"k","ⓛ":"l","l":"l","ŀ":"l","ĺ":"l","ľ":"l","ḷ":"l","ḹ":"l","ļ":"l","ḽ":"l","ḻ":"l","ſ":"l","ł":"l","ƚ":"l","ɫ":"l","ⱡ":"l","ꝉ":"l","ꞁ":"l","ꝇ":"l","lj":"lj","ⓜ":"m","m":"m","ḿ":"m","ṁ":"m","ṃ":"m","ɱ":"m","ɯ":"m","ⓝ":"n","n":"n","ǹ":"n","ń":"n","ñ":"n","ṅ":"n","ň":"n","ṇ":"n","ņ":"n","ṋ":"n","ṉ":"n","ƞ":"n","ɲ":"n","ʼn":"n","ꞑ":"n","ꞥ":"n","nj":"nj","ⓞ":"o","o":"o","ò":"o","ó":"o","ô":"o","ồ":"o","ố":"o","ỗ":"o","ổ":"o","õ":"o","ṍ":"o","ȭ":"o","ṏ":"o","ō":"o","ṑ":"o","ṓ":"o","ŏ":"o","ȯ":"o","ȱ":"o","ö":"o","ȫ":"o","ỏ":"o","ő":"o","ǒ":"o","ȍ":"o","ȏ":"o","ơ":"o","ờ":"o","ớ":"o","ỡ":"o","ở":"o","ợ":"o","ọ":"o","ộ":"o","ǫ":"o","ǭ":"o","ø":"o","ǿ":"o","ɔ":"o","ꝋ":"o","ꝍ":"o","ɵ":"o","œ":"oe","ƣ":"oi","ȣ":"ou","ꝏ":"oo","ⓟ":"p","p":"p","ṕ":"p","ṗ":"p","ƥ":"p","ᵽ":"p","ꝑ":"p","ꝓ":"p","ꝕ":"p","ⓠ":"q","q":"q","ɋ":"q","ꝗ":"q","ꝙ":"q","ⓡ":"r","r":"r","ŕ":"r","ṙ":"r","ř":"r","ȑ":"r","ȓ":"r","ṛ":"r","ṝ":"r","ŗ":"r","ṟ":"r","ɍ":"r","ɽ":"r","ꝛ":"r","ꞧ":"r","ꞃ":"r","ⓢ":"s","s":"s","ß":"s","ś":"s","ṥ":"s","ŝ":"s","ṡ":"s","š":"s","ṧ":"s","ṣ":"s","ṩ":"s","ș":"s","ş":"s","ȿ":"s","ꞩ":"s","ꞅ":"s","ẛ":"s","ⓣ":"t","t":"t","ṫ":"t","ẗ":"t","ť":"t","ṭ":"t","ț":"t","ţ":"t","ṱ":"t","ṯ":"t","ŧ":"t","ƭ":"t","ʈ":"t","ⱦ":"t","ꞇ":"t","ꜩ":"tz","ⓤ":"u","u":"u","ù":"u","ú":"u","û":"u","ũ":"u","ṹ":"u","ū":"u","ṻ":"u","ŭ":"u","ü":"u","ǜ":"u","ǘ":"u","ǖ":"u","ǚ":"u","ủ":"u","ů":"u","ű":"u","ǔ":"u","ȕ":"u","ȗ":"u","ư":"u","ừ":"u","ứ":"u","ữ":"u","ử":"u","ự":"u","ụ":"u","ṳ":"u","ų":"u","ṷ":"u","ṵ":"u","ʉ":"u","ⓥ":"v","v":"v","ṽ":"v","ṿ":"v","ʋ":"v","ꝟ":"v","ʌ":"v","ꝡ":"vy","ⓦ":"w","w":"w","ẁ":"w","ẃ":"w","ŵ":"w","ẇ":"w","ẅ":"w","ẘ":"w","ẉ":"w","ⱳ":"w","ⓧ":"x","x":"x","ẋ":"x","ẍ":"x","ⓨ":"y","y":"y","ỳ":"y","ý":"y","ŷ":"y","ỹ":"y","ȳ":"y","ẏ":"y","ÿ":"y","ỷ":"y","ẙ":"y","ỵ":"y","ƴ":"y","ɏ":"y","ỿ":"y","ⓩ":"z","z":"z","ź":"z","ẑ":"z","ż":"z","ž":"z","ẓ":"z","ẕ":"z","ƶ":"z","ȥ":"z","ɀ":"z","ⱬ":"z","ꝣ":"z","Ά":"Α","Έ":"Ε","Ή":"Η","Ί":"Ι","Ϊ":"Ι","Ό":"Ο","Ύ":"Υ","Ϋ":"Υ","Ώ":"Ω","ά":"α","έ":"ε","ή":"η","ί":"ι","ϊ":"ι","ΐ":"ι","ό":"ο","ύ":"υ","ϋ":"υ","ΰ":"υ","ώ":"ω","ς":"σ","’":"'"}}),b.define("select2/data/base",["../utils"],function(a){function b(a,c){b.__super__.constructor.call(this)}return a.Extend(b,a.Observable),b.prototype.current=function(a){throw new Error("The `current` method must be defined in child classes.")},b.prototype.query=function(a,b){throw new Error("The `query` method must be defined in child classes.")},b.prototype.bind=function(a,b){},b.prototype.destroy=function(){},b.prototype.generateResultId=function(b,c){var d=b.id+"-result-";return d+=a.generateChars(4),null!=c.id?d+="-"+c.id.toString():d+="-"+a.generateChars(4),d},b}),b.define("select2/data/select",["./base","../utils","jquery"],function(a,b,c){function d(a,b){this.$element=a,this.options=b,d.__super__.constructor.call(this)}return b.Extend(d,a),d.prototype.current=function(a){var b=[],d=this;this.$element.find(":selected").each(function(){var a=c(this),e=d.item(a);b.push(e)}),a(b)},d.prototype.select=function(a){var b=this;if(a.selected=!0,c(a.element).is("option"))return a.element.selected=!0,void this.$element.trigger("change");if(this.$element.prop("multiple"))this.current(function(d){var e=[];a=[a],a.push.apply(a,d);for(var f=0;f=0){var k=f.filter(d(j)),l=this.item(k),m=c.extend(!0,{},j,l),n=this.option(m);k.replaceWith(n)}else{var o=this.option(j);if(j.children){var p=this.convertToOptions(j.children);b.appendMany(o,p)}h.push(o)}}return h},d}),b.define("select2/data/ajax",["./array","../utils","jquery"],function(a,b,c){function d(a,b){this.ajaxOptions=this._applyDefaults(b.get("ajax")),null!=this.ajaxOptions.processResults&&(this.processResults=this.ajaxOptions.processResults),d.__super__.constructor.call(this,a,b)}return b.Extend(d,a),d.prototype._applyDefaults=function(a){var b={data:function(a){return c.extend({},a,{q:a.term})},transport:function(a,b,d){var e=c.ajax(a);return e.then(b),e.fail(d),e}};return c.extend({},b,a,!0)},d.prototype.processResults=function(a){return a},d.prototype.query=function(a,b){function d(){var d=f.transport(f,function(d){var f=e.processResults(d,a);e.options.get("debug")&&window.console&&console.error&&(f&&f.results&&c.isArray(f.results)||console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")),b(f)},function(){"status"in d&&(0===d.status||"0"===d.status)||e.trigger("results:message",{message:"errorLoading"})});e._request=d}var e=this;null!=this._request&&(c.isFunction(this._request.abort)&&this._request.abort(),this._request=null);var f=c.extend({type:"GET"},this.ajaxOptions);"function"==typeof f.url&&(f.url=f.url.call(this.$element,a)),"function"==typeof f.data&&(f.data=f.data.call(this.$element,a)),this.ajaxOptions.delay&&null!=a.term?(this._queryTimeout&&window.clearTimeout(this._queryTimeout),this._queryTimeout=window.setTimeout(d,this.ajaxOptions.delay)):d()},d}),b.define("select2/data/tags",["jquery"],function(a){function b(b,c,d){var e=d.get("tags"),f=d.get("createTag");void 0!==f&&(this.createTag=f);var g=d.get("insertTag");if(void 0!==g&&(this.insertTag=g),b.call(this,c,d),a.isArray(e))for(var h=0;h0&&b.term.length>this.maximumInputLength)return void this.trigger("results:message",{message:"inputTooLong",args:{maximum:this.maximumInputLength,input:b.term,params:b}});a.call(this,b,c)},a}),b.define("select2/data/maximumSelectionLength",[],function(){function a(a,b,c){this.maximumSelectionLength=c.get("maximumSelectionLength"),a.call(this,b,c)}return a.prototype.query=function(a,b,c){var d=this;this.current(function(e){var f=null!=e?e.length:0;if(d.maximumSelectionLength>0&&f>=d.maximumSelectionLength)return void d.trigger("results:message",{message:"maximumSelected",args:{maximum:d.maximumSelectionLength}});a.call(d,b,c)})},a}),b.define("select2/dropdown",["jquery","./utils"],function(a,b){function c(a,b){this.$element=a,this.options=b,c.__super__.constructor.call(this)}return b.Extend(c,b.Observable),c.prototype.render=function(){var b=a('');return b.attr("dir",this.options.get("dir")),this.$dropdown=b,b},c.prototype.bind=function(){},c.prototype.position=function(a,b){},c.prototype.destroy=function(){this.$dropdown.remove()},c}),b.define("select2/dropdown/search",["jquery","../utils"],function(a,b){function c(){}return c.prototype.render=function(b){var c=b.call(this),d=a('');return this.$searchContainer=d,this.$search=d.find("input"),c.prepend(d),c},c.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),this.$search.on("keydown",function(a){e.trigger("keypress",a),e._keyUpPrevented=a.isDefaultPrevented()}),this.$search.on("input",function(b){a(this).off("keyup")}),this.$search.on("keyup input",function(a){e.handleSearch(a)}),c.on("open",function(){e.$search.attr("tabindex",0),e.$search.focus(),window.setTimeout(function(){e.$search.focus()},0)}),c.on("close",function(){e.$search.attr("tabindex",-1),e.$search.val(""),e.$search.blur()}),c.on("focus",function(){c.isOpen()||e.$search.focus()}),c.on("results:all",function(a){if(null==a.query.term||""===a.query.term){e.showSearch(a)?e.$searchContainer.removeClass("select2-search--hide"):e.$searchContainer.addClass("select2-search--hide")}})},c.prototype.handleSearch=function(a){if(!this._keyUpPrevented){var b=this.$search.val();this.trigger("query",{term:b})}this._keyUpPrevented=!1},c.prototype.showSearch=function(a,b){return!0},c}),b.define("select2/dropdown/hidePlaceholder",[],function(){function a(a,b,c,d){this.placeholder=this.normalizePlaceholder(c.get("placeholder")),a.call(this,b,c,d)}return a.prototype.append=function(a,b){b.results=this.removePlaceholder(b.results),a.call(this,b)},a.prototype.normalizePlaceholder=function(a,b){return"string"==typeof b&&(b={id:"",text:b}),b},a.prototype.removePlaceholder=function(a,b){for(var c=b.slice(0),d=b.length-1;d>=0;d--){var e=b[d];this.placeholder.id===e.id&&c.splice(d,1)}return c},a}),b.define("select2/dropdown/infiniteScroll",["jquery"],function(a){function b(a,b,c,d){this.lastParams={},a.call(this,b,c,d),this.$loadingMore=this.createLoadingMore(),this.loading=!1}return b.prototype.append=function(a,b){this.$loadingMore.remove(),this.loading=!1,a.call(this,b),this.showLoadingMore(b)&&this.$results.append(this.$loadingMore)},b.prototype.bind=function(b,c,d){var e=this;b.call(this,c,d),c.on("query",function(a){e.lastParams=a,e.loading=!0}),c.on("query:append",function(a){e.lastParams=a,e.loading=!0}),this.$results.on("scroll",function(){var b=a.contains(document.documentElement,e.$loadingMore[0]);if(!e.loading&&b){e.$results.offset().top+e.$results.outerHeight(!1)+50>=e.$loadingMore.offset().top+e.$loadingMore.outerHeight(!1)&&e.loadMore()}})},b.prototype.loadMore=function(){this.loading=!0;var b=a.extend({},{page:1},this.lastParams);b.page++,this.trigger("query:append",b)},b.prototype.showLoadingMore=function(a,b){return b.pagination&&b.pagination.more},b.prototype.createLoadingMore=function(){var b=a('
                    • '),c=this.options.get("translations").get("loadingMore");return b.html(c(this.lastParams)),b},b}),b.define("select2/dropdown/attachBody",["jquery","../utils"],function(a,b){function c(b,c,d){this.$dropdownParent=d.get("dropdownParent")||a(document.body),b.call(this,c,d)}return c.prototype.bind=function(a,b,c){var d=this,e=!1;a.call(this,b,c),b.on("open",function(){d._showDropdown(),d._attachPositioningHandler(b),e||(e=!0,b.on("results:all",function(){d._positionDropdown(),d._resizeDropdown()}),b.on("results:append",function(){d._positionDropdown(),d._resizeDropdown()}))}),b.on("close",function(){d._hideDropdown(),d._detachPositioningHandler(b)}),this.$dropdownContainer.on("mousedown",function(a){a.stopPropagation()})},c.prototype.destroy=function(a){a.call(this),this.$dropdownContainer.remove()},c.prototype.position=function(a,b,c){b.attr("class",c.attr("class")),b.removeClass("select2"),b.addClass("select2-container--open"),b.css({position:"absolute",top:-999999}),this.$container=c},c.prototype.render=function(b){var c=a(""),d=b.call(this);return c.append(d),this.$dropdownContainer=c,c},c.prototype._hideDropdown=function(a){this.$dropdownContainer.detach()},c.prototype._attachPositioningHandler=function(c,d){var e=this,f="scroll.select2."+d.id,g="resize.select2."+d.id,h="orientationchange.select2."+d.id,i=this.$container.parents().filter(b.hasScroll);i.each(function(){b.StoreData(this,"select2-scroll-position",{x:a(this).scrollLeft(),y:a(this).scrollTop()})}),i.on(f,function(c){var d=b.GetData(this,"select2-scroll-position");a(this).scrollTop(d.y)}),a(window).on(f+" "+g+" "+h,function(a){e._positionDropdown(),e._resizeDropdown()})},c.prototype._detachPositioningHandler=function(c,d){var e="scroll.select2."+d.id,f="resize.select2."+d.id,g="orientationchange.select2."+d.id;this.$container.parents().filter(b.hasScroll).off(e),a(window).off(e+" "+f+" "+g)},c.prototype._positionDropdown=function(){var b=a(window),c=this.$dropdown.hasClass("select2-dropdown--above"),d=this.$dropdown.hasClass("select2-dropdown--below"),e=null,f=this.$container.offset();f.bottom=f.top+this.$container.outerHeight(!1);var g={height:this.$container.outerHeight(!1)};g.top=f.top,g.bottom=f.top+g.height;var h={height:this.$dropdown.outerHeight(!1)},i={top:b.scrollTop(),bottom:b.scrollTop()+b.height()},j=i.topf.bottom+h.height,l={left:f.left,top:g.bottom},m=this.$dropdownParent;"static"===m.css("position")&&(m=m.offsetParent());var n=m.offset();l.top-=n.top,l.left-=n.left,c||d||(e="below"),k||!j||c?!j&&k&&c&&(e="below"):e="above",("above"==e||c&&"below"!==e)&&(l.top=g.top-n.top-h.height),null!=e&&(this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--"+e),this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--"+e)),this.$dropdownContainer.css(l)},c.prototype._resizeDropdown=function(){var a={width:this.$container.outerWidth(!1)+"px"};this.options.get("dropdownAutoWidth")&&(a.minWidth=a.width,a.position="relative",a.width="auto"),this.$dropdown.css(a)},c.prototype._showDropdown=function(a){this.$dropdownContainer.appendTo(this.$dropdownParent),this._positionDropdown(),this._resizeDropdown()},c}),b.define("select2/dropdown/minimumResultsForSearch",[],function(){function a(b){for(var c=0,d=0;d0&&(l.dataAdapter=j.Decorate(l.dataAdapter,r)),l.maximumInputLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,s)),l.maximumSelectionLength>0&&(l.dataAdapter=j.Decorate(l.dataAdapter,t)),l.tags&&(l.dataAdapter=j.Decorate(l.dataAdapter,p)),null==l.tokenSeparators&&null==l.tokenizer||(l.dataAdapter=j.Decorate(l.dataAdapter,q)),null!=l.query){var C=b(l.amdBase+"compat/query");l.dataAdapter=j.Decorate(l.dataAdapter,C)}if(null!=l.initSelection){var D=b(l.amdBase+"compat/initSelection");l.dataAdapter=j.Decorate(l.dataAdapter,D)}}if(null==l.resultsAdapter&&(l.resultsAdapter=c,null!=l.ajax&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,x)),null!=l.placeholder&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,w)),l.selectOnClose&&(l.resultsAdapter=j.Decorate(l.resultsAdapter,A))),null==l.dropdownAdapter){if(l.multiple)l.dropdownAdapter=u;else{var E=j.Decorate(u,v);l.dropdownAdapter=E}if(0!==l.minimumResultsForSearch&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,z)),l.closeOnSelect&&(l.dropdownAdapter=j.Decorate(l.dropdownAdapter,B)),null!=l.dropdownCssClass||null!=l.dropdownCss||null!=l.adaptDropdownCssClass){var F=b(l.amdBase+"compat/dropdownCss");l.dropdownAdapter=j.Decorate(l.dropdownAdapter,F)}l.dropdownAdapter=j.Decorate(l.dropdownAdapter,y)}if(null==l.selectionAdapter){if(l.multiple?l.selectionAdapter=e:l.selectionAdapter=d,null!=l.placeholder&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,f)),l.allowClear&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,g)),l.multiple&&(l.selectionAdapter=j.Decorate(l.selectionAdapter,h)),null!=l.containerCssClass||null!=l.containerCss||null!=l.adaptContainerCssClass){var G=b(l.amdBase+"compat/containerCss");l.selectionAdapter=j.Decorate(l.selectionAdapter,G)}l.selectionAdapter=j.Decorate(l.selectionAdapter,i)}if("string"==typeof l.language)if(l.language.indexOf("-")>0){var H=l.language.split("-"),I=H[0];l.language=[l.language,I]}else l.language=[l.language];if(a.isArray(l.language)){var J=new k;l.language.push("en");for(var K=l.language,L=0;L0){for(var f=a.extend(!0,{},e),g=e.children.length-1;g>=0;g--){null==c(d,e.children[g])&&f.children.splice(g,1)}return f.children.length>0?f:c(d,f)}var h=b(e.text).toUpperCase(),i=b(d.term).toUpperCase();return h.indexOf(i)>-1?e:null}this.defaults={amdBase:"./",amdLanguageBase:"./i18n/",closeOnSelect:!0,debug:!1,dropdownAutoWidth:!1,escapeMarkup:j.escapeMarkup,language:C,matcher:c,minimumInputLength:0,maximumInputLength:0,maximumSelectionLength:0,minimumResultsForSearch:0,selectOnClose:!1,scrollAfterSelect:!1,sorter:function(a){return a},templateResult:function(a){return a.text},templateSelection:function(a){return a.text},theme:"default",width:"resolve"}},D.prototype.set=function(b,c){var d=a.camelCase(b),e={};e[d]=c;var f=j._convertData(e);a.extend(!0,this.defaults,f)},new D}),b.define("select2/options",["require","jquery","./defaults","./utils"],function(a,b,c,d){function e(b,e){if(this.options=b,null!=e&&this.fromElement(e),this.options=c.apply(this.options),e&&e.is("input")){var f=a(this.get("amdBase")+"compat/inputData");this.options.dataAdapter=d.Decorate(this.options.dataAdapter,f)}}return e.prototype.fromElement=function(a){function c(a,b){return b.toUpperCase()}var e=["select2"];null==this.options.multiple&&(this.options.multiple=a.prop("multiple")),null==this.options.disabled&&(this.options.disabled=a.prop("disabled")),null==this.options.language&&(a.prop("lang")?this.options.language=a.prop("lang").toLowerCase():a.closest("[lang]").prop("lang")&&(this.options.language=a.closest("[lang]").prop("lang"))),null==this.options.dir&&(a.prop("dir")?this.options.dir=a.prop("dir"):a.closest("[dir]").prop("dir")?this.options.dir=a.closest("[dir]").prop("dir"):this.options.dir="ltr"),a.prop("disabled",this.options.disabled),a.prop("multiple",this.options.multiple),d.GetData(a[0],"select2Tags")&&(this.options.debug&&window.console&&console.warn&&console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'),d.StoreData(a[0],"data",d.GetData(a[0],"select2Tags")),d.StoreData(a[0],"tags",!0)),d.GetData(a[0],"ajaxUrl")&&(this.options.debug&&window.console&&console.warn&&console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."),a.attr("ajax--url",d.GetData(a[0],"ajaxUrl")),d.StoreData(a[0],"ajax-Url",d.GetData(a[0],"ajaxUrl")));for(var f={},g=0;g-1||(b.isPlainObject(this.options[m])?b.extend(this.options[m],l[m]):this.options[m]=l[m]);return this},e.prototype.get=function(a){return this.options[a]},e.prototype.set=function(a,b){this.options[a]=b},e}),b.define("select2/core",["jquery","./options","./utils","./keys"],function(a,b,c,d){var e=function(a,d){null!=c.GetData(a[0],"select2")&&c.GetData(a[0],"select2").destroy(),this.$element=a,this.id=this._generateId(a),d=d||{},this.options=new b(d,a),e.__super__.constructor.call(this);var f=a.attr("tabindex")||0;c.StoreData(a[0],"old-tabindex",f),a.attr("tabindex","-1");var g=this.options.get("dataAdapter");this.dataAdapter=new g(a,this.options);var h=this.render();this._placeContainer(h);var i=this.options.get("selectionAdapter");this.selection=new i(a,this.options),this.$selection=this.selection.render(),this.selection.position(this.$selection,h);var j=this.options.get("dropdownAdapter");this.dropdown=new j(a,this.options),this.$dropdown=this.dropdown.render(),this.dropdown.position(this.$dropdown,h);var k=this.options.get("resultsAdapter");this.results=new k(a,this.options,this.dataAdapter),this.$results=this.results.render(),this.results.position(this.$results,this.$dropdown);var l=this;this._bindAdapters(),this._registerDomEvents(),this._registerDataEvents(),this._registerSelectionEvents(),this._registerDropdownEvents(),this._registerResultsEvents(),this._registerEvents(),this.dataAdapter.current(function(a){l.trigger("selection:update",{data:a})}),a.addClass("select2-hidden-accessible"),a.attr("aria-hidden","true"),this._syncAttributes(),c.StoreData(a[0],"select2",this),a.data("select2",this)};return c.Extend(e,c.Observable),e.prototype._generateId=function(a){var b="";return b=null!=a.attr("id")?a.attr("id"):null!=a.attr("name")?a.attr("name")+"-"+c.generateChars(2):c.generateChars(4),b=b.replace(/(:|\.|\[|\]|,)/g,""),b="select2-"+b},e.prototype._placeContainer=function(a){a.insertAfter(this.$element);var b=this._resolveWidth(this.$element,this.options.get("width"));null!=b&&a.css("width",b)},e.prototype._resolveWidth=function(a,b){var c=/^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if("resolve"==b){var d=this._resolveWidth(a,"style");return null!=d?d:this._resolveWidth(a,"element")}if("element"==b){var e=a.outerWidth(!1);return e<=0?"auto":e+"px"}if("style"==b){var f=a.attr("style");if("string"!=typeof f)return null;for(var g=f.split(";"),h=0,i=g.length;h=1)return k[1]}return null}return b},e.prototype._bindAdapters=function(){this.dataAdapter.bind(this,this.$container),this.selection.bind(this,this.$container),this.dropdown.bind(this,this.$container),this.results.bind(this,this.$container)},e.prototype._registerDomEvents=function(){var b=this;this.$element.on("change.select2",function(){b.dataAdapter.current(function(a){b.trigger("selection:update",{data:a})})}),this.$element.on("focus.select2",function(a){b.trigger("focus",a)}),this._syncA=c.bind(this._syncAttributes,this),this._syncS=c.bind(this._syncSubtree,this),this.$element[0].attachEvent&&this.$element[0].attachEvent("onpropertychange",this._syncA);var d=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver;null!=d?(this._observer=new d(function(c){a.each(c,b._syncA),a.each(c,b._syncS)}),this._observer.observe(this.$element[0],{attributes:!0,childList:!0,subtree:!1})):this.$element[0].addEventListener&&(this.$element[0].addEventListener("DOMAttrModified",b._syncA,!1),this.$element[0].addEventListener("DOMNodeInserted",b._syncS,!1),this.$element[0].addEventListener("DOMNodeRemoved",b._syncS,!1))},e.prototype._registerDataEvents=function(){var a=this;this.dataAdapter.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerSelectionEvents=function(){var b=this,c=["toggle","focus"];this.selection.on("toggle",function(){b.toggleDropdown()}),this.selection.on("focus",function(a){b.focus(a)}),this.selection.on("*",function(d,e){-1===a.inArray(d,c)&&b.trigger(d,e)})},e.prototype._registerDropdownEvents=function(){var a=this;this.dropdown.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerResultsEvents=function(){var a=this;this.results.on("*",function(b,c){a.trigger(b,c)})},e.prototype._registerEvents=function(){var a=this;this.on("open",function(){a.$container.addClass("select2-container--open")}),this.on("close",function(){a.$container.removeClass("select2-container--open")}),this.on("enable",function(){a.$container.removeClass("select2-container--disabled")}),this.on("disable",function(){a.$container.addClass("select2-container--disabled")}),this.on("blur",function(){a.$container.removeClass("select2-container--focus")}),this.on("query",function(b){a.isOpen()||a.trigger("open",{}),this.dataAdapter.query(b,function(c){a.trigger("results:all",{data:c,query:b})})}),this.on("query:append",function(b){this.dataAdapter.query(b,function(c){a.trigger("results:append",{data:c,query:b})})}),this.on("keypress",function(b){var c=b.which;a.isOpen()?c===d.ESC||c===d.TAB||c===d.UP&&b.altKey?(a.close(),b.preventDefault()):c===d.ENTER?(a.trigger("results:select",{}),b.preventDefault()):c===d.SPACE&&b.ctrlKey?(a.trigger("results:toggle",{}),b.preventDefault()):c===d.UP?(a.trigger("results:previous",{}),b.preventDefault()):c===d.DOWN&&(a.trigger("results:next",{}),b.preventDefault()):(c===d.ENTER||c===d.SPACE||c===d.DOWN&&b.altKey)&&(a.open(),b.preventDefault())})},e.prototype._syncAttributes=function(){this.options.set("disabled",this.$element.prop("disabled")),this.options.get("disabled")?(this.isOpen()&&this.close(),this.trigger("disable",{})):this.trigger("enable",{})},e.prototype._syncSubtree=function(a,b){var c=!1,d=this;if(!a||!a.target||"OPTION"===a.target.nodeName||"OPTGROUP"===a.target.nodeName){if(b)if(b.addedNodes&&b.addedNodes.length>0)for(var e=0;e0&&(c=!0);else c=!0;c&&this.dataAdapter.current(function(a){d.trigger("selection:update",{data:a})})}},e.prototype.trigger=function(a,b){var c=e.__super__.trigger,d={open:"opening",close:"closing",select:"selecting",unselect:"unselecting",clear:"clearing"};if(void 0===b&&(b={}),a in d){var f=d[a],g={prevented:!1,name:a,args:b};if(c.call(this,f,g),g.prevented)return void(b.prevented=!0)}c.call(this,a,b)},e.prototype.toggleDropdown=function(){this.options.get("disabled")||(this.isOpen()?this.close():this.open())},e.prototype.open=function(){this.isOpen()||this.trigger("query",{})},e.prototype.close=function(){this.isOpen()&&this.trigger("close",{})},e.prototype.isOpen=function(){return this.$container.hasClass("select2-container--open")},e.prototype.hasFocus=function(){return this.$container.hasClass("select2-container--focus")},e.prototype.focus=function(a){this.hasFocus()||(this.$container.addClass("select2-container--focus"),this.trigger("focus",{}))},e.prototype.enable=function(a){this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.'),null!=a&&0!==a.length||(a=[!0]);var b=!a[0];this.$element.prop("disabled",b)},e.prototype.data=function(){this.options.get("debug")&&arguments.length>0&&window.console&&console.warn&&console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var a=[];return this.dataAdapter.current(function(b){a=b}),a},e.prototype.val=function(b){if(this.options.get("debug")&&window.console&&console.warn&&console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'),null==b||0===b.length)return this.$element.val();var c=b[0];a.isArray(c)&&(c=a.map(c,function(a){return a.toString()})),this.$element.val(c).trigger("change")},e.prototype.destroy=function(){this.$container.remove(),this.$element[0].detachEvent&&this.$element[0].detachEvent("onpropertychange",this._syncA),null!=this._observer?(this._observer.disconnect(),this._observer=null):this.$element[0].removeEventListener&&(this.$element[0].removeEventListener("DOMAttrModified",this._syncA,!1),this.$element[0].removeEventListener("DOMNodeInserted",this._syncS,!1),this.$element[0].removeEventListener("DOMNodeRemoved",this._syncS,!1)),this._syncA=null,this._syncS=null,this.$element.off(".select2"),this.$element.attr("tabindex",c.GetData(this.$element[0],"old-tabindex")),this.$element.removeClass("select2-hidden-accessible"),this.$element.attr("aria-hidden","false"),c.RemoveData(this.$element[0]),this.$element.removeData("select2"),this.dataAdapter.destroy(),this.selection.destroy(),this.dropdown.destroy(),this.results.destroy(),this.dataAdapter=null,this.selection=null,this.dropdown=null,this.results=null},e.prototype.render=function(){var b=a('');return b.attr("dir",this.options.get("dir")),this.$container=b,this.$container.addClass("select2-container--"+this.options.get("theme")),c.StoreData(b[0],"element",this.$element),b},e}),b.define("jquery-mousewheel",["jquery"],function(a){return a}),b.define("jquery.select2",["jquery","jquery-mousewheel","./select2/core","./select2/defaults","./select2/utils"],function(a,b,c,d,e){if(null==a.fn.select2){var f=["open","close","destroy"];a.fn.select2=function(b){if("object"==typeof(b=b||{}))return this.each(function(){var d=a.extend(!0,{},b);new c(a(this),d)}),this;if("string"==typeof b){var d,g=Array.prototype.slice.call(arguments,1);return this.each(function(){var a=e.GetData(this,"select2");null==a&&window.console&&console.error&&console.error("The select2('"+b+"') method was called on an element that is not using Select2."),d=a[b].apply(a,g)}),a.inArray(b,f)>-1?this:d}throw new Error("Invalid arguments for Select2: "+b)}}return null==a.fn.select2.defaults&&(a.fn.select2.defaults=d),c}),{define:b.define,require:b.require}}(),c=b.require("jquery.select2");return a.fn.select2.amd=b,c}); diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/crud/youya-boot-all.min.js b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/crud/youya-boot-all.min.js new file mode 100644 index 0000000..7aca37c --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/crud/youya-boot-all.min.js @@ -0,0 +1,9 @@ +/*制作方法参考YouyabootAllJsCompressTest.java*/ +!function(){var c=layui.jquery,b=layui.form;var a={render:function(i,e,f){var h=f.inputname?f.inputname:"menuids[]";var g=f.layfilter?f.layfilter:"checkauth";var d=f.openall?f.openall:false;c(i).html(a.renderAuth(e,0,{inputname:h,layfilter:g,openall:d}));b.render();c(i).find(".auth-single:first").unbind("click").on("click",".layui-form-checkbox",function(){var k=c(this).prev();var j=k.is(":checked");var l=k.parent().next().find('input[type="checkbox"]').prop("checked",j);if(j){k.parents(".auth-child").prev().find('input[type="checkbox"]').prop("checked",true)}b.render("checkbox")});c(i).unbind("click").on("click",".auth-icon",function(){var j=c(this);var k=j.parent().parent().find(".auth-child:first");if(j.is(".active")){j.removeClass("active").html("");k.slideUp("fast")}else{j.addClass("active").html("");k.slideDown("fast")}return false})},renderAuth:function(d,i,f){var h=f.inputname;var g=f.layfilter;var e=f.openall;var j='
                      ';layui.each(d,function(l,m){var n=m.list?1:0;var k=n?a.renderAuth(m.list,i+1,f):"";j+='
                      '+(n?''+(e?"":"")+"":'')+(i>0?"├─ ":"")+'
                      '+k+"
                      "});j+="
                      ";return j},getLeaf:function(f){var d=c(f).find(".auth-leaf").parent().find('input[type="checkbox"]:checked');var e=[];d.each(function(g,h){e.push(h.value)});return e},getAll:function(f){var d=c(f).find('input[type="checkbox"]');var e=[];d.each(function(g,h){e.push(h.value)});return e},getChecked:function(f){var d=c(f).find('input[type="checkbox"]:checked');var e=[];d.each(function(g,h){e.push(h.value)});return e},getNotChecked:function(f){var d=c(f).find('input[type="checkbox"]:not(:checked)');var e=[];d.each(function(g,h){e.push(h.value)});return e}};youyaboot_all.authtree=a}(); +!function(){var b=layui.form,c=layui.jquery;var a={getParameter:function(d){var f=window.location.search.substring(1);if(f!=""){var g=f.split("&");for(var e=0;e/g,">").replace(/"/g,""").replace(/'/g,"'")},autoSetImgUrl:function(g,e){if(typeof e=="undefined"||e+""==""){return}if(e.indexOf("http://")==0||e.indexOf("https://")==0){g.attr("src",e);return}var d=_GLOBAL.file.fileExtraAddPrefix;if(d!=""){var f=e.substr(0,d.length);if(f==d){e=e.substring(d.length)}}e=_GLOBAL.file.requestPrefix+"/"+e;g.attr("src",e)},mappingEntityToFormUiValue:function(e,d){var g=e;if(d){for(var l in d){var k=d[l];if(k!=null&&typeof k!="undefined"){var j=g.find("[name='"+l+"']");if(j.length<=0){continue}var m=j.attr("lay-skin");if(m&&m=="switch"){continue}var h=j.attr("class");if(h&&h.indexOf("magicalcoder-foreign-select2")!=-1){j.attr("data-value",k);continue}var i=j.attr("type");if(i&&i=="radio"&&k+""!=""){g.find("[name='"+l+"'][value='"+k+"']").prop("checked","checked");continue}var f=g.find(".img_"+l);if(f.length>0&&k!=""){this.autoSetImgUrl(f,k)}j.val(k)}}g.find("input[lay-skin='switch']").each(function(p,q){var o=c(q).attr("name");var n=(d[o]+""=="true"||d[o]+""=="1")?true:false;c(q).prop("checked",n)});b.render()}},};youyaboot_all.mc_util=a}(); +!function(){var a={MC_LAY_CLASS_NAME:{FORM:{foreign_select2:"magicalcoder-foreign-select2",laydate:"magicalcoder-laydate",layupload:"magicalcoder-layupload",layedit:"magicalcoder-layedit",slider:"magicalcoder-slider",color_picker:"magicalcoder-color-picker",rate:"magicalcoder-rate",code:"magicalcoder-code"},TABLE:{single_select2:"magicalcoder-table-single-select2",foreign_select2:"magicalcoder-table-foreign-select2",lay_switch:"magicalcoder-table-layswitch",lay_date:"magicalcoder-table-laydate",text:"magicalcoder-table-text",radio:"magicalcoder-table-radio",}},QUERY_TYPE_EXPORT_EXCEL:1};youyaboot_all.mc_constant=a}(); +!function(){var e=layui.jquery,d=parent.layer===undefined?layui.layer:top.layer;var b="layui-form-danger";var c="form-danger";var a={layuiVerify:{mc_required:function(h,g){var f=/[\S]+/;if(!f.test(h)){return"必填项不能为空"}},mc_phone:function(h,g){if(h&&h!=""){var f=/^1\d{10}$/;if(!f.test(h)){return"请输入正确的手机号"}}},mc_email:function(h,g){if(h&&h!=""){var f=/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;if(!f.test(h)){return"邮箱格式不正确"}}},mc_url:function(h,g){if(h&&h!=""){var f=/(^#)|(^http(s*):\/\/[^\s]+\.[^\s]+)/;if(!f.test(h)){return"链接格式不正确"}}},mc_number:function(f){if(f+""!=""&&isNaN(f)){return"只能填写数字"}},mc_date:function(h,g){if(h&&h!=""){var f=/^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/;if(!f.test(h)){return"日期格式不正确"}}},mc_identity:function(h,g){if(h&&h!=""){var f=/(^\d{15}$)|(^\d{17}(x|X|\d)$)/;if(!f.test(h)){return"请输入正确的身份证号"}}}},magicalVerify:{mc_digits:function(h,g){if(h&&h!=""){var f=/^[-+]?\d*$/;if(!f.test(h)){return"必须为整数"}}},mc_chinese_character:function(h,g){if(h&&h!=""){var f=/[\u4e00-\u9fa5]+/;if(!f.test(h)){return"请使用中文汉字"}}},mc_variable:function(h,g){if(h&&h!=""){var f=/[A-Za-z0-9_]+/;if(!f.test(h)){return"请使用字母数字下划线组合"}}},magicalCoderVerify:function(m,n){if(m&&m!=""){if(!(n instanceof layui.jquery)){n=e(n)}var l=n.attr("magicalcoder-verify");if(l&&l!=""){var f=l.split("|");if(f.length>0){for(var j=0;jparseFloat(h)){return"最大值 "+h}}break;case"minValues":if(!isNaN(m)&&!isNaN(h)){if(parseFloat(m)parseInt(h)){return"最大长度 "+h}break;case"definedOne":case"definedTwo":case"definedThree":var g=new RegExp(h,"g");if(!a.regExpMatch(g,m)){return"不满足 "+h}break}}}}}}}}},regExpMatch:function(h,g){var f=g.match(h);if(f){return f[0]==g}return false},clearDangerClass:function(f){if(f.hasClass("magicalcoder-foreign-select2")||f.hasClass("magicalcoder-table-single-select2")){var g=f.parent();if(g){g.find(".select2-selection--single").removeClass(c)}}else{if(f.hasClass("magicalcoder-layedit")){var g=f.parent();if(g){g.find(".layui-layedit").removeClass(c)}}else{if(f.is("select")){var g=f.parent();if(g){g.find("input.layui-unselect").removeClass(b)}}else{f.removeClass(b)}}}},verify:function(m,n){var l=this.layuiVerify;var h=this.magicalVerify;var i=e.extend(l,h);var p=n.attr("lay-verify");if(p){for(var j in i){if(("|"+p+"|").indexOf("|"+j+"|")!=-1){var o=i[j];var g=o(m,n);if(g&&g.length>0){d.msg(g,{icon:5,shift:6});if(n.hasClass("magicalcoder-foreign-select2")||n.hasClass("magicalcoder-table-single-select2")){var k=n.parent();if(k){var f=k.find(".select2-selection--single");f.addClass(c);f.focus()}}else{if(n.hasClass("magicalcoder-layedit")){var k=n.parent();if(k){var f=k.find(".layui-layedit");f.addClass(c);f.focus()}}else{if(n.is("select")){var k=n.parent();if(k){var f=k.find("input.layui-unselect");f.addClass(b);f.focus()}}else{n.addClass(b);n.focus()}}}return false}}}}this.clearDangerClass(n);return true}};youyaboot_all.mc_verify=a}(); +!function(){var d=layui.jquery,c=parent.layer===undefined?layui.layer:top.layer,b=youyaboot_all.mc_verify;var a={listToMap:function(k,g){var j={};if(g&&g.length>0){for(var e=0;e0){for(var j=0;j0){realName=dataName}else{if(name.lastIndexOf("First")!=-1){realName=name.substring(0,name.lastIndexOf("First"))}if(name.lastIndexOf("Second")!=-1){realName=name.substring(0,name.lastIndexOf("Second"))}}if(realName!=null){if(formConfig[realName]){formRenderConfig=formConfig[realName].renderConfig}}}var domRenderConfig=_t.iteratorAttr({},item);var options=$.extend(true,domRenderConfig,formRenderConfig);var select=id?"#"+id:"[name='"+name+"']";var identify=$(item).attr("data-identify");var value=$(item).val();if(value&&value!=""){var reg=/^(\d{4})[-\/].*/;if(!reg.test(value)){try{if(value.toUpperCase()=="CURRENT_TIMESTAMP"){value=new Date()}else{value=eval(value)}}catch(e){value=""}}}$.extend(options,{elem:options.elem||select,type:options.type||"datetime",value:options.value||value,format:options.format||"yyyy-MM-dd HH:mm:ss",trigger:options.trigger||"click",done:options.done||function(value,date,endDate){if(identify&&identify!=""){var index=layer.msg("修改中,请稍候",{icon:16,time:true,shade:0.8});var postData={};postData[name]=value;if(!mc_verify.verify(value,$(item))){return}$.post("admin/"+tableNameRest+"/update/"+identify,postData,function(data){layer.close(index);if(data.flag){layer.msg("修改成功!")}else{layer.msg("修改失败!"+data.desc);if(doneFailCallback){doneFailCallback()}}})}}});laydate.render(options)})},_bindUpload:function(elem,doneFailCallback){var _t=this;$(elem).each(function(index,item){var name=$(item).attr("name");var inputName=name.replace("FileUpload","");var options=_t._options(item);var inputNameItem=$("input[name='"+inputName+"']");$.extend(options,{elem:options.elem||$(item),url:options.url||"admin/common_file_rest/upload",method:options.method||"post",accept:options.accept||"file",before:options.before||function(obj){layer.load()},done:options.done||function(res,index,upload){layer.closeAll("loading");if(res.flag){var src=res.data.src;inputNameItem.val(src);mc_util.autoSetImgUrl($(".img_"+inputName),src)}else{layer.alert("上传失败:"+res.desc);if(doneFailCallback){doneFailCallback()}}},error:options.error||function(index,upload){layer.closeAll("loading");layer.alert("上传失败,请重试");if(doneFailCallback){doneFailCallback()}}});upload.render(options)})},_bindSingleSelect2:function(tableNameRest,$elem,select2ConfigData,selectChangeFailCallback,config){mc_select2.bindTableSingleSelect2(tableNameRest,$elem,select2ConfigData,selectChangeFailCallback,config)},_bindForeignSelect2:function(tableNameRest,$elem,select2ConfigData,selectChangeFailCallback,config){mc_select2.bindForeignSelect2ByDomId(tableNameRest,$elem,select2ConfigData,selectChangeFailCallback,config)},_bindSwitchAjaxUpdate:function(elem,doneFailCallback){var tableNameRest=this.config.tableNameRest;$(elem).each(function(index,item){var name=$(item).attr("name");var id=$(item).attr("id");var filter=$(item).attr("lay-filter");var select=name?name:id;form.on("switch("+filter+")",function(domData){var _t=$(this);var identify=_t.attr("data-identify");if(identify&&identify!=""){var targetChecked=domData.elem.checked;var index=layer.msg("修改中,请稍候",{icon:16,time:true,shade:0.8});var postData={};var value=targetChecked?1:0;postData[select]=value;if(!mc_verify.verify(value,$(item))){return}$.post("admin/"+tableNameRest+"/update/"+identify,postData,function(data){layer.close(index);if(data.flag){_t.prop("checked",targetChecked);layer.msg("修改成功!")}else{layer.msg("修改失败:"+data.desc);_t.prop("checked",!targetChecked)}form.render("checkbox")})}})})},_bindEdit:function(elem){var formVerifyEditData={};$(elem).each(function(index,item){var id=$(item).attr("id");var editIndex=layedit.build(id,{height:300,uploadImage:{type:"post",url:"admin/common_file_rest/upload?from=layedit"}});formVerifyEditData[id+"VerifyEdit"]=function(val){layedit.sync(editIndex)}});return formVerifyEditData},_options:function(item){var name=$(item).attr("name");var domRenderConfig=this.iteratorAttr({},item);var formConfig={};$.extend(true,formConfig,this.config.form);var formRenderConfig=formConfig[name]?formConfig[name].renderConfig:{};var options=$.extend(true,domRenderConfig,formRenderConfig);return options},_bindSlider:function(elem){var _t=this;$(elem).each(function(index,item){var name=$(item).attr("name");var inputName=name.replace("Slider","");var options=_t._options(item);var inputNameItem=$("input[name='"+inputName+"']");var value=inputNameItem.val();$.extend(options,{elem:options.elem||$(item),value:options.value||value,change:options.change||function(value){inputNameItem.val(value)}});slider.render(options)})},_bindColorPicker:function(elem,doneFailCallback){var tableNameRest=this.config.tableNameRest;var _t=this;$(elem).each(function(index,item){var name=$(item).attr("name");var inputName=name.replace("ColorPicker","");var options=_t._options(item);var inputNameItem=$("input[name='"+inputName+"']");var value=inputNameItem.val();var identify=$(item).attr("data-identify");$.extend(options,{elem:options.elem||select,format:options.format||"hex",color:options.color||value,done:options.done||function(color){$(item).val(color);if(identify&&identify!=""){var index=layer.msg("修改中,请稍候",{icon:16,time:true,shade:0.8});var postData={};postData[name]=color;if(!mc_verify.verify(color,$(item))){return}$.post("admin/"+tableNameRest+"/update/"+identify,postData,function(data){layer.close(index);if(data.flag){layer.msg("修改成功!")}else{layer.msg("修改失败!"+data.desc);if(doneFailCallback){doneFailCallback()}}})}}});colorpicker.render(options)})},_bindRate:function(elem,doneFailCallback){var tableNameRest=this.config.tableNameRest;var _t=this;$(elem).each(function(index,item){var name=$(item).attr("name");var inputName=name.replace("Rate","");var options=_t._options(item);var inputNameItem=$("input[name='"+inputName+"']");var value=inputNameItem.val();var identify=$(item).attr("data-identify");$.extend(options,{elem:options.elem||$(item),length:options.length||5,value:options.value||value,theme:options.theme||"#FFB800",half:options.half||false,text:options.text||false,readonly:options.readonly||false,choose:options.choose||function(val){inputNameItem.val(val);if(identify&&identify!=""){var index=layer.msg("修改中,请稍候",{icon:16,time:true,shade:0.8});var postData={};postData[name]=val;if(!mc_verify.verify(val,$(item))){return}$.post("admin/"+tableNameRest+"/update/"+identify,postData,function(data){layer.close(index);if(data.flag){layer.msg("修改成功!")}else{layer.msg("修改失败!"+data.desc);if(doneFailCallback){doneFailCallback()}}})}}});rate.render(options)})},_bindCode:function(elem,doneFailCallback){var _t=this;$(elem).each(function(index,item){var name=$(item).attr("name");var inputName=name.replace("Code","");var options=_t._options(item);var inputNameItem=$("textarea[name='"+inputName+"']");var value=inputNameItem.val();$(elem).html(value);$.extend(options,{elem:elem,title:options.title||"",height:options.height||"200px",encode:options.encode||true,skin:options.skin||"notepad",about:options.about||false});layui.code(options)})},iteratorAttr:function(renderConfig,dom){var attrs=dom.attributes;for(var i=0;i0){var scriptJson=scriptCodeDome.html();if(scriptJson!=""){var jsonObj=JSON.parse(scriptJson);var event=jsonObj.event;var executeList=jsonObj.execute;$(this).bind(event,function(){for(var i=0;i'+mcForeignValue+"";j.append(g);j.val(mcForeignValue);if(d){j.attr("data-value",mcForeignValue)}}}else{j.val(mcForeignValue)}j.attr("disabled","disabled")})},disabledFromQueryParentArea:function(){if(mcForeignName&&mcForeignName!=""){$("button[type='reset']").hide();this._disableForeignDom(mcForeignName+"First",mc_constant.MC_LAY_CLASS_NAME.FORM.foreign_select2,true);this._disableForeignDom(mcForeignName+"Second",mc_constant.MC_LAY_CLASS_NAME.FORM.foreign_select2,true);return true}return false},disabledTableParentArea:function(){if(mcForeignName&&mcForeignName!=""){this._disableForeignDom(mcForeignName,mc_constant.MC_LAY_CLASS_NAME.TABLE.foreign_select2,false)}},disabledFormParentArea:function(){if(mcForeignName&&mcForeignName!=""){$("button[type='reset']").hide();this._disableForeignDom(mcForeignName,mc_constant.MC_LAY_CLASS_NAME.FORM.foreign_select2,true)}},buildTabTemplate:function(b,d,e){var c=laytpl('
                        {{# layui.each(d.childrenPage,function(index,item){ }}
                      • {{ item.tabTitle }}
                      • {{# }); }}
                      {{# layui.each(d.childrenPage,function(index,item){ }} {{# if(index==0){ }}
                      {{# }else{ }}
                      {{# } }}{{# }); }}
                      ').render({tableName:b,identify:d,childrenPage:e});return c},tabClickEvent:function(){var b={};element.on("tab(tabClick)",function(d){if(d.index!=0){var c=d.index+"";if(!b[c]){b[c]=true;var f=$(".mcChildrenPage").find(".childrenIframe").eq(c);var e=f.attr("src");if(!e||e==""){f.attr("src",f.attr("futureSrc"))}}}})}};youyaboot_all.mc_children=a}(); diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/css/index.css b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/css/index.css new file mode 100644 index 0000000..9a26362 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/css/index.css @@ -0,0 +1,159 @@ +/*公共样式*/ +.header .layui-nav-child{ z-index:99999; top:60px; left: auto; right: 0;} +.seraph{ font-size:16px !important;} +.main_body{ min-width:320px; } +.main_body .layui-body{ bottom:0px; } +.layui-nav .layui-nav-item a{ cursor:pointer;} +.layui-nav .layui-nav-item>a{ color:rgba(255,255,255,1); max-height:60px;} +.layui-layer-tab .layui-layer-title span{ padding:0 !important;} +iframe{ position:absolute; height:100%; width:100%; border:none;} +.top_menu.layui-nav .layui-nav-child dd.layui-this a,.closeBox.layui-nav .layui-nav-child dd.layui-this a,.closeBox .layui-nav-child dd.layui-this,.top_menu .layui-nav-child dd.layui-this{ background:none; color:#333;} +.layui-nav .layui-nav-child a:hover,.layui-nav .layui-nav-child dd.layui-this a:hover{background-color:#5FB878;color:#fff;} + +/*模拟加载层图标样式*/ +.layui-layer-dialog .layui-layer-content .layui-layer-ico16{ background-size:100% 100% !important; } +/*样式改变的过渡*/ +.layui-body,.layui-footer,.layui-layout-admin .layui-side,.logo,.topLevelMenus li.layui-nav-item,.topLevelMenus li.layui-nav-item:hover{ transition: all 0.3s ease-in-out;-webkit-transition: all 0.3s ease-in-out;-o-transition: all 0.3s ease-in-out;-moz-transition: all 0.3s ease-in-out;-ms-transition: all 0.3s ease-in-out; } +/*隐藏*/ +*[mobile],.component .layui-select-title i.layui-edge{ display:none;} + +/*打开页面动画*/ +.layui-tab-item.layui-show{ animation:moveTop 1s; -webkit-animation:moveTop 1s; animation-fill-mode:both; -webkit-animation-fill-mode:both; position:relative; height:100%; -webkit-overflow-scrolling: touch; overflow:auto; } +@keyframes moveTop{ + 0% {opacity: 0;-webkit-transform: translateY(20px);-ms-transform: translateY(20px);transform: translateY(20px);} + 100% {opacity: 1;-webkit-transform: translateY(0);-ms-transform: translateY(0);transform: translateY(0);} +} +@-o-keyframes moveTop{ + 0% {opacity: 0;-webkit-transform: translateY(20px);-ms-transform: translateY(20px);transform: translateY(20px);} + 100% {opacity: 1;-webkit-transform: translateY(0);-ms-transform: translateY(0);transform: translateY(0);} +} +@-moz-keyframes moveTop{ + 0% {opacity: 0;-webkit-transform: translateY(20px);-ms-transform: translateY(20px);transform: translateY(20px);} + 100% {opacity: 1;-webkit-transform: translateY(0);-ms-transform: translateY(0);transform: translateY(0);} +} +@-webkit-keyframes moveTop{ + 0% {opacity: 0;-webkit-transform: translateY(20px);-ms-transform: translateY(20px);transform: translateY(20px);} + 100% {opacity: 1;-webkit-transform: translateY(0);-ms-transform: translateY(0);transform: translateY(0);} +} +/*锁屏*/ +.admin-header-lock{width: 320px; height: 68px; padding: 20px; position: relative; text-align: center;} +.admin-header-lock-img{width:70px; height:70px; margin: 0 auto;} +.admin-header-lock-img img{width:70px; height:70px; border-radius: 100%; box-shadow:0 0 30px #44576b;} +.admin-header-lock-name{color: #009688;margin: 8px 0 15px 0;} +.input_btn{ overflow: hidden; margin-bottom: 10px; } +.admin-header-lock-input{width: 170px; color: #fff;background-color: #009688; float: left; margin:0 10px 0 40px; border:none;} +.admin-header-lock-input::-webkit-input-placeholder {color:#fff;} +.admin-header-lock-input::-moz-placeholder {color:#fff;} +.admin-header-lock-input:-ms-input-placeholder {color:#fff;} +.admin-header-lock-input:-moz-placeholder {color:#fff;} +#unlock{ float: left; } +#lock-box p{ color:#e60000; } +/*顶部*/ +.header{ z-index:2000;} +.logo{ color: #fff; float: left; line-height:60px; font-size:20px; padding:0 25px; text-align: center; width:150px;} +.hideMenu{ float:left; width:20px; height:20px; margin-top:15px; font-size:17px; line-height:20px; text-align:center; padding:5px 5px; color:#fff; background-color:#1AA094; } +.hideMenu:hover{ color:#fff; } +.layui-nav cite{ margin-left: 5px;} +/*顶部右侧*/ +.topLevelMenus{float:left;} +.topLevelMenus li.layui-nav-item:hover{ background-color:rgba(221,221,221,0.2);} +.layui-nav .layui-this:after{ bottom:-5px!important;} +.header .layui-nav-bar{top:60px !important;} +.topLevelMenus .layui-nav-item.layui-this{ background-color:rgba(0,0,0,0.5);} +.top_menu.layui-nav .layui-this:after{ width:0px; } +.top_menu .layui-nav-bar,.mobileTopLevelMenus .layui-nav-bar{background-color:rgba(0,0,0,0.7);} + +/*左侧导航*/ +.layui-nav{background-color: inherit !important;} +.showMenu.layui-layout-admin .layui-side{ left:-200px; } +.showMenu .layui-body,.showMenu .layui-footer{ left:0; } +/*左侧用户头像*/ +.top_menu{ background-color:inherit !important; position:absolute; right:0;top:0; } +.layui-layout-admin .layui-side{ left:0; overflow:hidden;} +.user-photo{width: 200px; height: 120px; padding:15px 0 5px;} +.user-photo a.img{ display: block; width:80px; height:80px; margin: 0 auto 10px;} +.user-photo a.img img{ display: block; border: none; width: 100%; height: 100%; border-radius: 50%; -webkit-border-radius: 50%; -moz-border-radius: 50%; border: 4px solid #44576b; box-sizing:border-box;} +.user-photo p{ display: block; width: 100%; height: 25px; color: #ffffff; text-align: center; font-size: 12px; white-space: nowrap;line-height: 25px; overflow: hidden;} +/*左侧导航重定义*/ +.layui-nav-item.layui-nav-itemed{ background-color:#2B2E37 !important;} +.layui-nav-itemed:before{ width:5px; height:100%; background-color:#009688; position:absolute; content:''; left:0; top:0;} +.layui-nav-itemed .layui-nav-child a{ padding-left:40px;} +/*左侧搜索框*/ +.component{ width:180px; height:30px; margin:0 auto 5px; position:relative;} +.component .layui-input{ height:30px; line-height: 30px; font-size:12px; border:none; transition: all 0.3s; background:rgba(255,255,255,0.05); } +.component .layui-input:focus{ background:#fff; color:#000; } +.component .layui-form-select dl{ top:33px; background:#fff; } +.component .layui-icon{ position: absolute; right:8px; top:8px; color:#000; } +.component dl dd{ color:#000 !important;} +.component dl dd.layui-this{ color:#fff !important;} +.component dl dd.layui-select-tips{ color:#999 !important;} + +/*layui-body*/ +.layui-body{overflow:hidden; border-top:5px solid #1AA094;border-left:2px solid #1AA094; background:#fff;} +#top_tabs_box{ padding-right:138px; height:40px; border-bottom:1px solid #e2e2e2; } +#top_tabs{ position: absolute; border-bottom:none;} +.layui-tab-title .layui-this{ background-color:#1AA094; color:#fff; } +.layui-tab-title .layui-this:after{ border:none; } +.layui-tab-title li cite{ font-style: normal; padding-left:5px; } +.clildFrame.layui-tab-content{ top:50px; position:absolute; bottom:0; width:100%; padding:0;} +/*多窗口页面操作下拉*/ +.closeBox{ position:absolute; right:0; background-color:#fff !important; color:#000; border-left:1px solid #e2e2e2; border-bottom:1px solid #e2e2e2; } +.closeBox .layui-nav-item{ line-height:40px; } +.closeBox .layui-nav-item>a,.closeBox .layui-nav-item>a:hover{ color:#000; } +.closeBox .layui-nav-child{ top:42px; left:-12px; } +.closeBox .layui-nav-bar{ display:none; } +.closeBox a i.caozuo{ font-size: 20px; position:absolute; top:1px; left:0; } +.closeBox a span.layui-nav-more{ border-color:#333 transparent transparent;} +.closeBox a span.layui-nav-more.layui-nav-mored{ border-color:transparent transparent #333;} +/*功能设定*/ +.functionSrtting_box{ padding-top:15px;} +.functionSrtting_box .layui-form-label{ width:81px;} +.functionSrtting_box .layui-word-aux{ position:absolute;left:60px; top:9px; font-size: 12px;} +/*换肤*/ +.skins_box{ padding:10px 34px 0; } +.skinBtn{ text-align:center; } +/*橙色*/ +.orange .layui-layout-admin .layui-header{ background-color:orange !important; } +.orange .layui-bg-black{ background-color:#e47214 !important; } +/*蓝色*/ +.blue .layui-layout-admin .layui-header{ background-color:#3396d8 !important; } +.blue .layui-bg-black,.blue .hideMenu{ background-color:#146aa2 !important; } +/*自定义*/ +.skinCustom{ visibility:hidden; } +.skinCustom input{ width:48%; margin:5px 2% 5px 0; float:left; } +.orange .layui-nav-tree .layui-nav-child a,.blue .layui-nav-tree .layui-nav-child a{ color:#fff; } +.orange .top_menu.layui-nav .layui-nav-more,.blue .top_menu.layui-nav .layui-nav-more{border-color:#fff transparent transparent !important;} +.orange .top_menu.layui-nav-itemed .layui-nav-more,.orange .top_menu.layui-nav .layui-nav-mored,.blue .top_menu.layui-nav-itemed .layui-nav-more,.blue .top_menu.layui-nav .layui-nav-mored{border-color:transparent transparent #fff !important;} +/*底部*/ +.footer{ text-align: center; line-height:44px;border-left: 2px solid #1AA094; z-index:999;} + +/*响应式样式*/ +@media screen and (max-width:1080px){ + .mobileTopLevelMenus[mobile]{display:inline-block;} + .site-mobile .site-tree-mobile,.topLevelMenus[pc]{display:none !important;} +} +@media screen and (max-width: 720px){ + .hideMenu{ display: none !important; } + .mobileTopLevelMenus[mobile]{ padding:0;} + .top_menu>li[pc]{ display: none !important; } + /*左侧导航*/ + .layui-layout-admin .layui-side{ left:-260px; } + .site-mobile .layui-side{ left: 0; z-index:1100; } + .site-tree-mobile {display: block!important; position: fixed; z-index: 100000; bottom: 15px; left: 15px; width:40px; height:40px; line-height:40px; border-radius: 2px; text-align: center; background-color: rgba(0,0,0,.7); color: #fff;} + .site-mobile .site-mobile-shade { content: ''; position: fixed; top: 0; bottom: 0; left: 0; right: 0; background-color: rgba(0,0,0,.8); z-index: 999;} + .layui-body,.layui-layout-admin .layui-footer{ left:-2px; } +} +@media screen and (max-width:480px){ + .logo{ width:120px; font-size: 18px;} + #userInfo>a{ padding:0 10px;} + .mobileTopLevelMenus[mobile] li>a{ padding:0 17px 0 15px;} + .logo,.layui-nav.top_menu{ padding:0 5px;} + .adminName,.top_menu dd[pc]{ display: none !important; } + *[mobile],.top_menu .layui-nav-item.showNotice[pc]{ display:inline-block !important; } +} + +/*修改顶部高度*/ +.header .layui-nav-child,.layui-body,.layui-layout-admin .layui-side,.header .layui-nav-bar{ top:50px !important;} +.header .layui-nav .layui-nav-item,.header .layui-nav .layui-nav-item>a,.header,.logo{ line-height:50px !important; max-height:50px; !important;} +.mobileTopLevelMenus{ float:left;} +.hideMenu{ margin-top: 10px;} diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/css/magicalcoder.css b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/css/magicalcoder.css new file mode 100644 index 0000000..adc5f24 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/css/magicalcoder.css @@ -0,0 +1,100 @@ +/*微调样式*/ +/*表格太窄*/ +.layui-table-cell{ + height : 38px; +} +/*select2 样式保持跟layui一致 太窄 太靠上*/ +.select2-container .select2-selection--single { + height: 36px !important; + margin-top: 1px !important;; + border-radius:0px !important;; + border-color : #e6e6e6 !important;; +} +.select2-container .select2-selection--single .select2-selection__rendered { + padding-top: 3px !important;; +} +.form-danger{ + border-color:#FF5722!important +} +/*仅仅在权限控制模块使用 其他清空请不要使用此样式*/ +.security-hide{display:none!important} +/*控制子表弹窗样式*/ +.childrenIframe{position:absolute;height:100%;width:98%;border:none;} + + +/** admin风格的弹窗 start*/ +.layui-layer.magicalcoder-layer-admin { + box-shadow: 1px 1px 50px rgba(0, 0, 0, .3) !important; + border: none !important; +} + +.layui-layer.magicalcoder-layer-admin .layui-layer-title { + background-color: #24262F; + color: #ffffff; + height: 50px; + line-height: 50px; + border: 0; +} + +.layui-layer.magicalcoder-layer-admin .layui-layer-setwin { + top: 17px; +} + +.layui-layer.magicalcoder-layer-admin .layui-layer-setwin a { + font-family: layui-icon !important; + font-size: 16px; + font-style: normal; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + color: #ffffff; +} + +/* 关闭按钮 */ +.layui-layer.magicalcoder-layer-admin .layui-layer-setwin .layui-layer-close1 { + background: none; +} + +.layui-layer.magicalcoder-layer-admin .layui-layer-setwin .layui-layer-close1:before { + content: "\1006"; +} + +/* 最小化按钮 */ +.layui-layer.magicalcoder-layer-admin .layui-layer-setwin .layui-layer-min cite { + background-color: #dddddd; +} + +/* 最大化按钮 */ +.layui-layer.magicalcoder-layer-admin .layui-layer-setwin .layui-layer-max { + background: none; + font-size: 14px; + padding-top: 1px; +} + +.layui-layer.magicalcoder-layer-admin .layui-layer-setwin .layui-layer-max:before { + content: "\e622"; +} + +.layui-layer.magicalcoder-layer-admin .layui-layer-setwin .layui-layer-maxmin:before { + content: "\e758"; +} + +/** 弹窗按钮 */ +.layui-layer.magicalcoder-layer-admin .layui-layer-btn .layui-layer-btn0 { + border-color: #009688; + background-color: #009688; +} + +.layui-layer.magicalcoder-layer-admin .layui-layer-btn a { + height: 34px; + line-height: 34px; +} + +.magicalcoder-layer-admin { + max-width: 100%; +} + +.layui-layer-iframe .layui-layer-content { + overflow: auto; + -webkit-overflow-scrolling: touch; +} +/** admin风格的弹窗-end */ diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/css/public.css b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/css/public.css new file mode 100644 index 0000000..0bd2114 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/css/public.css @@ -0,0 +1,171 @@ +/*公共样式*/ +.childrenBody{ padding:10px;background: #f2f2f2;} +.layui-table-view{ margin:0 !important;} +.magb0{margin-bottom:0 !important;} +.magt0{ margin-top:0 !important;} +.magt3{ margin-top:3px !important;} +.magt10{ margin-top:10px !important;} +.magb15{ margin-bottom:15px !important;} +.magt30{ margin-top:30px !important;} +.layui-left{text-align:left;} +.layui-block{ width:100% !important;} +.layui-center{text-align:center;} +.layui-right{text-align:right;} +.layui-elem-quote.title{ padding:10px 15px; margin-bottom:0;} +.layui-bg-white{ background-color:#fff !important;} +.border{ border:1px solid #e6e6e6 !important; padding:10px; border-top:none;} +.main_btn .layui-btn{ margin:2px 5px 2px 0;} +.layui-timeline-axis{ left:-4px;} +.layui-elem-quote{ word-break: break-all;} +.icons li,.icons li:hover,.loginBody .seraph,.loginBody .seraph:hover,.loginBody .layui-form-item.layui-input-focus label,.loginBody .layui-form-item label,.loginBody .layui-form-item.layui-input-focus input,.loginBody .layui-form-item input{transition: all 0.3s ease-in-out;-webkit-transition: all 0.3s ease-in-out;} +.icons li:hover i,.icons li i{transition: font-size 0.3s ease-in-out;-webkit-transition: font-size 0.3s ease-in-out;} +.loginBody .layui-input-focus .layui-input::-webkit-input-placeholder{transition: color 0.2s linear 0.2s;-webkit-transition: color 0.2s linear 0.2s;} +.loginBody .layui-input-focus .layui-input::-moz-placeholder{transition: color 0.2s linear 0.2s;} +.loginBody .layui-input-focus .layui-input:-ms-input-placeholder{transition: color 0.2s linear 0.2s;} +.loginBody .layui-input-focus .layui-input::placeholder{transition: color 0.2s linear 0.2s;-webkit-transition: color 0.2s linear 0.2s;} +/*后台首页*/ +.panel_box{ margin-bottom:5px;} +.panel{ text-align:center; height:90px;} +.panel_box a{display:block; border-radius:5px; overflow:hidden; height:80px; background-color:#f2f2f2 !important; } +.panel_icon{ width:40%; display: inline-block; line-height:80px; float:left; position:relative; height:100%;} +.panel_icon i{ font-size:40px !important; color:#fff; display: inline-block;} +.panel_word{ width:60%; display: inline-block; float:right; margin:13px 0 14px; } +.panel_word span{ font-size:25px; display:block; height:34px; } +.panel .loginTime{ font-size:15px; color:#1E9FFF; line-height:17px;} +.panel em{ font-style:normal;} +.history_box{ min-height:500px; height:500px; overflow-y:scroll; padding:10px !important;} +.history_box .layui-timeline .layui-timeline-item:last-child{ padding-bottom:0;} +@media screen and (max-width:1200px) { + .history_box { height: auto !important; overflow-y: inherit; } +} +/*修改密码*/ +.pwdTips{ min-height:auto; margin:40px 0 15px 110px;} +/*个人资料*/ +form input.layui-input[disabled]{ background:#f2f2f2; color:#595963!important; } +.user_right{ text-align: center; } +.user_right p{ margin:10px 0 25px; font-size: 12px; text-align: center; color: #FF5722;} +.user_right img#userFace{ width:200px; height:200px; margin-top:20px; cursor:pointer; box-shadow:0 0 50px #44576b; } +.userAddress.layui-form-item .layui-input-inline{ width:23%; } +.userAddress.layui-form-item .layui-input-inline:last-child{ margin-right:0; } +/*下拉多选*/ +.layui-form-item select[multiple]+.layui-form-select dd{ padding:0;} +.layui-form-item select[multiple]+.layui-form-select .layui-form-checkbox[lay-skin=primary]{ margin:0 !important; display:block; line-height:36px !important; position:relative; padding-left:26px;} +.layui-form-item select[multiple]+.layui-form-select .layui-form-checkbox[lay-skin=primary] span{line-height:36px !important; float:none;} +.layui-form-item select[multiple]+.layui-form-select .layui-form-checkbox[lay-skin=primary] i{ position:absolute; left:10px; top:0; margin-top:9px;} +.multiSelect{ line-height:normal; height:auto; padding:4px 10px; overflow:hidden;min-height:38px; margin-top:-38px; left:0; z-index:99;position:relative;background:none;} +.multiSelect a{ padding:2px 5px; background:#908e8e; border-radius:2px; color:#fff; display:block; line-height:20px; height:20px; margin:2px 5px 2px 0; float:left;} +.multiSelect a span{ float:left;} +.multiSelect a i{ float:left; display:block; margin:2px 0 0 2px; border-radius:2px; width:8px; height:8px; background:url(../images/close.png) no-repeat center; background-size:65%; padding:4px;} +.multiSelect a i:hover{ background-color:#545556;} +/*404页面*/ +.noFind{ text-align:center; padding-top:2%;} +.noFind i{ line-height:1em; font-size:12em !important; color: #393D50; display:block;} +.ufo{ text-align:center; height:100%; position:relative;} +.noFind .page_icon,.noFind .ufo_icon{ opacity:1; position:absolute; left:50%; transform:translateX(-50%); -ms-transform:translateX(-50%); -moz-transform:translateX(-50%); -webkit-transform:translateX(-50%); -o-transform:translateX(-50%);} +.noFind .page_icon{ top:300px; animation:pageGo 0.3s ease-in 0.3s forwards; -webkit-animation:pageGo 0.3s ease-in 0.3s forwards; -o-animation:pageGo 0.3s ease-in 0.3s forwards; -moz-animation:pageGo 0.3s ease-in 0.3s forwards;} +.noFind .ufo_icon{ top:100px; animation:ufo 1s ease-in 0.6s forwards; -webkit-animation:ufo 1s ease-in 0.6s forwards; -o-animation:ufo 1s ease-in 0.6s forwards; -moz-animation:ufo 1s ease-in 0.6s forwards;} +.page404{ margin-top:10%; opacity:0; font-size:0; animation:page404 0.5s ease-in 1.7s forwards; -webkit-animation:page404 0.5s ease-in 1.7s forwards; -o-animation:page404 0.5s ease-in 1.7s forwards; -moz-animation:page404 0.5s ease-in 1.7s forwards;} +.page404 p{ font-size: 20px; font-weight: 300; color: #999;} +/*页面被吸走*/ +@keyframes pageGo{from{font-size: 12em; top:300px;} to{font-size:0; opacity:0; top: 100px;}} +@-moz-keyframes pageGo{from{font-size: 12em; top:300px;} to{font-size:0; opacity:0; top:100px}} +@-webkit-keyframes pageGo{from{font-size: 12em; top:300px;} to{font-size:0; opacity:0; top:100px}} +@-o-keyframes pageGo{from{font-size: 12em; top:300px;} to{font-size:0; opacity:0; top:100px}} +/*ufo飞走*/ +@keyframes ufo{0%{font-size: 14em; top:100px;} 20%{font-size: 12em; top:50px;} 100%{font-size:0; opacity:0; top:-100px; left:80%;}} +@-moz-keyframes ufo{0%{font-size: 14em; top:100px;} 20%{font-size: 12em; top:50px;} 100%{font-size:0; opacity:0; top:-100px; left:80%;}} +@-webkit-keyframes ufo{0%{font-size: 14em; top:100px;} 20%{font-size: 12em; top:50px;} 100%{font-size:0; opacity:0; top:-100px; left:80%;}} +@-o-keyframes ufo{0%{font-size: 14em; top:100px;} 20%{font-size: 12em; top:50px;} 100%{font-size:0; opacity:0; top:-100px; left:80%;}} +/*404显示*/ +@keyframes page404{from{opacity:0; font-size:2em;} to{opacity:1;font-size:2em;}} +@-moz-keyframes page404{from{opacity:0; font-size:2em;} to{opacity:1;font-size:2em;}} +@-webkit-keyframes page404{from{opacity:0; font-size:2em;} to{opacity:1;font-size:2em;}} +@-o-keyframes page404{from{opacity:0; font-size:2em;} to{opacity:1;font-size:2em;}} +/*图标管理*/ +.iconsLength{ margin:0 5px;} +.icons li{ margin:5px 0; text-align:center; height:120px; cursor:pointer;} +.icons li i{ display:block; font-size:35px; margin:10px 0; line-height:60px; height:60px;} +.icons li:hover{ background:rgba(13,10,49,.9); border-radius:5px; color:#fff;} +.icons li:hover i{ font-size:50px;} +#copyText{ width:0;height:0; opacity:0; position:absolute; left:-9999px; top:-9999px;} +/*开发文档*/ +h2.method{ font-size:18px; line-height:45px; padding-left:5px;} +/*登录*/ +.loginHtml,.loginBody{ height:100%;} +.loginBody{ background:url("../images/login_bg.jpg") no-repeat center center;} +.loginBody form.layui-form{ padding:0 20px; width:300px; height:335px; position:absolute; left:50%; top:50%; margin:-150px 0 0 -150px; -webkit-box-sizing:border-box;-moz-box-sizing:border-box; -o-box-sizing:border-box; box-sizing:border-box; background:#fff;-webkit-border-radius:5px; -moz-border-radius:5px; border-radius:5px; box-shadow:0 0 50px #009688;} +.login_face{ margin:-55px auto 20px; width:100px; height:100px; -webkit-border-radius:50%; -moz-border-radius:50%; border-radius:50%; border:5px solid #fff; overflow:hidden;box-shadow:0 0 30px #009688;} +.login_face img{ width:100%;} +.loginBody .layui-form-item{ position:relative;} +.loginBody .layui-form-item label{ position:absolute; color:#757575; left:10px; top:9px; line-height:20px; background:#fff; padding:0 5px; font-size:14px; cursor:text;} +.loginBody .layui-form-item.layui-input-focus label{ top:-10px; font-size:12px; color:#ff6700;} +.loginBody .layui-form-item.layui-input-active label{ top:-10px; font-size:12px;} +.loginBody .layui-input::-webkit-input-placeholder{color:#fff;} +.loginBody .layui-input::-moz-placeholder{color:#fff;} +.loginBody .layui-input:-ms-input-placeholder{color:#fff;} +.loginBody .layui-input::placeholder{color:#fff;} +.loginBody .layui-form-item.layui-input-focus input{ border-color:#ff6700 !important;} +.loginBody .layui-input-focus .layui-input::-webkit-input-placeholder{color:#757575;} +.loginBody .layui-input-focus .layui-input::-moz-placeholder{color:#757575;} +.loginBody .layui-input-focus .layui-input:-ms-input-placeholder{color:#757575;} +.loginBody .layui-input-focus .layui-input::placeholder{color:#757575;} +.loginBody .seraph{ font-size:30px; text-align:center;} +.loginBody .seraph.icon-qq:hover{ color:#0288d1;} +.loginBody .seraph.icon-wechat:hover{ color:#00d20d;} +.loginBody .seraph.icon-sina:hover{ color:#d32f2f;} +.imgCode{ position:relative;} +#imgCode img{ position:absolute; top:1px; right:1px; cursor:pointer;} +/*用户等级*/ +.layui-table-view .layui-table span.seraph{ font-size:25px !important;} +.vip1{ color:#994a2b;} +.vip2{ color:#899396;} +.vip3{ color:#bd6a08;} +.vip4{ color:#a3b8c4;} +.vip5{ color:#63c3ea;} +.vip6{ color:#b563ed;} +.vip7{ color:#ff9831;} +.vip8{ color:#A757A8;} +.vip9{ color:#0ff;} +.vip10{ color:#f00;} +/*新闻添加*/ +.layui-elem-quote .layui-inline{ margin:3px 0;} +.category .layui-form-checkbox{ margin:5px 0;} +.border .layui-form-item{ margin-bottom:10px;} +.border .layui-form-label{ width:50px;} +.border .layui-form-label i{ position:absolute; top:10px; left:3px;} +.border .layui-input-block{ margin-left:80px;} +.thumbBox{ height:151px; overflow:hidden; border:1px solid #e6e6e6; border-radius:2px; cursor:pointer; position:relative; text-align:center; line-height:153px;} +.thumbImg{ max-width:100%; max-height:100%; border:none;} +.thumbBox:after{ position:absolute; width:100%; height:100%;line-height:153px; z-index:-1; text-align:center; font-size:20px; content:"缩略图"; left:0; top:0; color:#9F9F9F;} +/*图片管理*/ +#Images li{ width:19%; margin:0.5% 0.5%; float: left; overflow:hidden;} +#Images li img{ width:100%; cursor:pointer; } +#Images li .operate{ display: block; height: 40px; width:100%; background:#f4f5f9; } +#Images li .operate .check{ float:left; margin-left:11px; height:18px; padding:11px 0; width:74%; position:relative;} +#Images li .operate .check .layui-form-checkbox[lay-skin=primary]{ width:100%;} +#Images li .operate .check .layui-form-checkbox[lay-skin=primary] span{ padding:0 5px 0 25px; width:100%; box-sizing:border-box;} +#Images li .operate .check .layui-form-checkbox[lay-skin=primary] i{position:absolute; left:0; top:0;} +#Images li .operate .img_del{ float:right; margin:9px 11px 0 0; font-size: 22px !important; cursor:pointer; } +#Images li .operate .img_del:hover{ color:#f00; } +@media screen and (max-width:1050px){#Images li{ width:24%;}} +@media screen and (max-width: 750px){#Images li{ width:49%;}} +@media screen and (max-width:432px){#Images li{ width:99%;}} +/*系统日志*/ +.layui-btn-green{ background-color:#5FB878 !important;} +/*友情链接*/ +.linkLogo{ width:80px; height:40px; overflow:hidden; border:1px solid #e6e6e6; border-radius:2px; cursor:pointer; margin:0 auto; position:relative; text-align:center; line-height:42px;} +.linkLogoImg{ max-width:90%; max-height:90%;} +.linkLogo:after{ position:absolute; width:100%; height:100%;line-height:42px; z-index:-1; text-align:center; font-size:12px; content:"上传LOGO"; left:0; top:0; color:#9F9F9F;} +.linksAdd .layui-form-label{ width:60px; padding-left:0;} +.linksAdd .layui-input-block{ margin-left:75px;} +.linksAdd .layui-input-block input{ padding:0 5px;} +/*响应式*/ +@media screen and (max-width:450px) { + #userFaceBtn{ height: 30px;line-height: 30px; padding: 0 10px; font-size: 12px;} + .user_right img#userFace{ width:100px; height:100px; margin-top:0;} + .layui-col-xs12 .layui-form-label{ width:60px; padding-left:0;} + .layui-col-xs12 .layui-input-block,.layui-col-xs12 .layui-input-inline{ margin-left:75px;} + .layui-col-xs12 .layui-input-inline{ left:0 !important; width:auto !important;} + .noFind{ padding-top:0;} + *[pc]{ display:none;} +} diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/css/select2.min.css b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/css/select2.min.css new file mode 100644 index 0000000..60d5990 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/css/select2.min.css @@ -0,0 +1 @@ +.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0 !important;clip:rect(0 0 0 0) !important;-webkit-clip-path:inset(50%) !important;clip-path:inset(50%) !important;height:1px !important;overflow:hidden !important;padding:0 !important;position:absolute !important;width:1px !important;white-space:nowrap !important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #fff 50%, #eee 100%);background-image:-o-linear-gradient(top, #fff 50%, #eee 100%);background-image:linear-gradient(to bottom, #fff 50%, #eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eee 50%, #ccc 100%);background-image:-o-linear-gradient(top, #eee 50%, #ccc 100%);background-image:linear-gradient(to bottom, #eee 50%, #ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFCCCCCC', GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #fff 0%, #eee 50%);background-image:-o-linear-gradient(top, #fff 0%, #eee 50%);background-image:linear-gradient(to bottom, #fff 0%, #eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFEEEEEE', GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eee 50%, #fff 100%);background-image:-o-linear-gradient(top, #eee 50%, #fff 100%);background-image:linear-gradient(to bottom, #eee 50%, #fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE', endColorstr='#FFFFFFFF', GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right;margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:none}.select2-container--classic .select2-dropdown--below{border-top:none}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb} diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/css/youya-boot-all.min.css b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/css/youya-boot-all.min.css new file mode 100644 index 0000000..f59cee9 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/css/youya-boot-all.min.css @@ -0,0 +1,4 @@ +/*制作方法参考YouyabootAllCssCompressTest.java*/ +.childrenBody{padding:10px;background:#f2f2f2}.layui-table-view{margin:0!important}.magb0{margin-bottom:0!important}.magt0{margin-top:0!important}.magt3{margin-top:3px!important}.magt10{margin-top:10px!important}.magb15{margin-bottom:15px!important}.magt30{margin-top:30px!important}.layui-left{text-align:left}.layui-block{width:100%!important}.layui-center{text-align:center}.layui-right{text-align:right}.layui-elem-quote.title{padding:10px 15px;margin-bottom:0}.layui-bg-white{background-color:#fff!important}.border{border:1px solid #e6e6e6!important;padding:10px;border-top:0}.main_btn .layui-btn{margin:2px 5px 2px 0}.layui-timeline-axis{left:-4px}.layui-elem-quote{word-break:break-all}.icons li,.icons li:hover,.loginBody .seraph,.loginBody .seraph:hover,.loginBody .layui-form-item.layui-input-focus label,.loginBody .layui-form-item label,.loginBody .layui-form-item.layui-input-focus input,.loginBody .layui-form-item input{transition:all .3s ease-in-out;-webkit-transition:all .3s ease-in-out}.icons li:hover i,.icons li i{transition:font-size .3s ease-in-out;-webkit-transition:font-size .3s ease-in-out}.loginBody .layui-input-focus .layui-input::-webkit-input-placeholder{transition:color .2s linear .2s;-webkit-transition:color .2s linear .2s}.loginBody .layui-input-focus .layui-input::-moz-placeholder{transition:color .2s linear .2s}.loginBody .layui-input-focus .layui-input:-ms-input-placeholder{transition:color .2s linear .2s}.loginBody .layui-input-focus .layui-input::placeholder{transition:color .2s linear .2s;-webkit-transition:color .2s linear .2s}.panel_box{margin-bottom:5px}.panel{text-align:center;height:90px}.panel_box a{display:block;border-radius:5px;overflow:hidden;height:80px;background-color:#f2f2f2!important}.panel_icon{width:40%;display:inline-block;line-height:80px;float:left;position:relative;height:100%}.panel_icon i{font-size:40px!important;color:#fff;display:inline-block}.panel_word{width:60%;display:inline-block;float:right;margin:13px 0 14px}.panel_word span{font-size:25px;display:block;height:34px}.panel .loginTime{font-size:15px;color:#1e9fff;line-height:17px}.panel em{font-style:normal}.history_box{min-height:500px;height:500px;overflow-y:scroll;padding:10px!important}.history_box .layui-timeline .layui-timeline-item:last-child{padding-bottom:0}@media screen and (max-width:1200px){.history_box{height:auto!important;overflow-y:inherit}}.pwdTips{min-height:auto;margin:40px 0 15px 110px}form input.layui-input[disabled]{background:#f2f2f2;color:#595963!important}.user_right{text-align:center}.user_right p{margin:10px 0 25px;font-size:12px;text-align:center;color:#ff5722}.user_right img#userFace{width:200px;height:200px;margin-top:20px;cursor:pointer;box-shadow:0 0 50px #44576b}.userAddress.layui-form-item .layui-input-inline{width:23%}.userAddress.layui-form-item .layui-input-inline:last-child{margin-right:0}.layui-form-item select[multiple]+.layui-form-select dd{padding:0}.layui-form-item select[multiple]+.layui-form-select .layui-form-checkbox[lay-skin=primary]{margin:0!important;display:block;line-height:36px!important;position:relative;padding-left:26px}.layui-form-item select[multiple]+.layui-form-select .layui-form-checkbox[lay-skin=primary] span{line-height:36px!important;float:none}.layui-form-item select[multiple]+.layui-form-select .layui-form-checkbox[lay-skin=primary] i{position:absolute;left:10px;top:0;margin-top:9px}.multiSelect{line-height:normal;height:auto;padding:4px 10px;overflow:hidden;min-height:38px;margin-top:-38px;left:0;z-index:99;position:relative;background:0}.multiSelect a{padding:2px 5px;background:#908e8e;border-radius:2px;color:#fff;display:block;line-height:20px;height:20px;margin:2px 5px 2px 0;float:left}.multiSelect a span{float:left}.multiSelect a i{float:left;display:block;margin:2px 0 0 2px;border-radius:2px;width:8px;height:8px;background:url(../images/close.png) no-repeat center;background-size:65%;padding:4px}.multiSelect a i:hover{background-color:#545556}.noFind{text-align:center;padding-top:2%}.noFind i{line-height:1em;font-size:12em!important;color:#393d50;display:block}.ufo{text-align:center;height:100%;position:relative}.noFind .page_icon,.noFind .ufo_icon{opacity:1;position:absolute;left:50%;transform:translateX(-50%);-ms-transform:translateX(-50%);-moz-transform:translateX(-50%);-webkit-transform:translateX(-50%);-o-transform:translateX(-50%)}.noFind .page_icon{top:300px;animation:pageGo .3s ease-in .3s forwards;-webkit-animation:pageGo .3s ease-in .3s forwards;-o-animation:pageGo .3s ease-in .3s forwards;-moz-animation:pageGo .3s ease-in .3s forwards}.noFind .ufo_icon{top:100px;animation:ufo 1s ease-in .6s forwards;-webkit-animation:ufo 1s ease-in .6s forwards;-o-animation:ufo 1s ease-in .6s forwards;-moz-animation:ufo 1s ease-in .6s forwards}.page404{margin-top:10%;opacity:0;font-size:0;animation:page404 .5s ease-in 1.7s forwards;-webkit-animation:page404 .5s ease-in 1.7s forwards;-o-animation:page404 .5s ease-in 1.7s forwards;-moz-animation:page404 .5s ease-in 1.7s forwards}.page404 p{font-size:20px;font-weight:300;color:#999}@keyframes pageGo{from{font-size:12em;top:300px}to{font-size:0;opacity:0;top:100px}}@-moz-keyframes pageGo{from{font-size:12em;top:300px}to{font-size:0;opacity:0;top:100px}}@-webkit-keyframes pageGo{from{font-size:12em;top:300px}to{font-size:0;opacity:0;top:100px}}@-o-keyframes pageGo{from{font-size:12em;top:300px}to{font-size:0;opacity:0;top:100px}}@keyframes ufo{0%{font-size:14em;top:100px}20%{font-size:12em;top:50px}100%{font-size:0;opacity:0;top:-100px;left:80%}}@-moz-keyframes ufo{0%{font-size:14em;top:100px}20%{font-size:12em;top:50px}100%{font-size:0;opacity:0;top:-100px;left:80%}}@-webkit-keyframes ufo{0%{font-size:14em;top:100px}20%{font-size:12em;top:50px}100%{font-size:0;opacity:0;top:-100px;left:80%}}@-o-keyframes ufo{0%{font-size:14em;top:100px}20%{font-size:12em;top:50px}100%{font-size:0;opacity:0;top:-100px;left:80%}}@keyframes page404{from{opacity:0;font-size:2em}to{opacity:1;font-size:2em}}@-moz-keyframes page404{from{opacity:0;font-size:2em}to{opacity:1;font-size:2em}}@-webkit-keyframes page404{from{opacity:0;font-size:2em}to{opacity:1;font-size:2em}}@-o-keyframes page404{from{opacity:0;font-size:2em}to{opacity:1;font-size:2em}}.iconsLength{margin:0 5px}.icons li{margin:5px 0;text-align:center;height:120px;cursor:pointer}.icons li i{display:block;font-size:35px;margin:10px 0;line-height:60px;height:60px}.icons li:hover{background:rgba(13,10,49,.9);border-radius:5px;color:#fff}.icons li:hover i{font-size:50px}#copyText{width:0;height:0;opacity:0;position:absolute;left:-9999px;top:-9999px}h2.method{font-size:18px;line-height:45px;padding-left:5px}.loginHtml,.loginBody{height:100%}.loginBody{background:url("../images/login_bg.jpg") no-repeat center center}.loginBody form.layui-form{padding:0 20px;width:300px;height:335px;position:absolute;left:50%;top:50%;margin:-150px 0 0 -150px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;-o-box-sizing:border-box;box-sizing:border-box;background:#fff;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;box-shadow:0 0 50px #009688}.login_face{margin:-55px auto 20px;width:100px;height:100px;-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;border:5px solid #fff;overflow:hidden;box-shadow:0 0 30px #009688}.login_face img{width:100%}.loginBody .layui-form-item{position:relative}.loginBody .layui-form-item label{position:absolute;color:#757575;left:10px;top:9px;line-height:20px;background:#fff;padding:0 5px;font-size:14px;cursor:text}.loginBody .layui-form-item.layui-input-focus label{top:-10px;font-size:12px;color:#ff6700}.loginBody .layui-form-item.layui-input-active label{top:-10px;font-size:12px}.loginBody .layui-input::-webkit-input-placeholder{color:#fff}.loginBody .layui-input::-moz-placeholder{color:#fff}.loginBody .layui-input:-ms-input-placeholder{color:#fff}.loginBody .layui-input::placeholder{color:#fff}.loginBody .layui-form-item.layui-input-focus input{border-color:#ff6700!important}.loginBody .layui-input-focus .layui-input::-webkit-input-placeholder{color:#757575}.loginBody .layui-input-focus .layui-input::-moz-placeholder{color:#757575}.loginBody .layui-input-focus .layui-input:-ms-input-placeholder{color:#757575}.loginBody .layui-input-focus .layui-input::placeholder{color:#757575}.loginBody .seraph{font-size:30px;text-align:center}.loginBody .seraph.icon-qq:hover{color:#0288d1}.loginBody .seraph.icon-wechat:hover{color:#00d20d}.loginBody .seraph.icon-sina:hover{color:#d32f2f}.imgCode{position:relative}#imgCode img{position:absolute;top:1px;right:1px;cursor:pointer}.layui-table-view .layui-table span.seraph{font-size:25px!important}.vip1{color:#994a2b}.vip2{color:#899396}.vip3{color:#bd6a08}.vip4{color:#a3b8c4}.vip5{color:#63c3ea}.vip6{color:#b563ed}.vip7{color:#ff9831}.vip8{color:#a757a8}.vip9{color:#0ff}.vip10{color:#f00}.layui-elem-quote .layui-inline{margin:3px 0}.category .layui-form-checkbox{margin:5px 0}.border .layui-form-item{margin-bottom:10px}.border .layui-form-label{width:50px}.border .layui-form-label i{position:absolute;top:10px;left:3px}.border .layui-input-block{margin-left:80px}.thumbBox{height:151px;overflow:hidden;border:1px solid #e6e6e6;border-radius:2px;cursor:pointer;position:relative;text-align:center;line-height:153px}.thumbImg{max-width:100%;max-height:100%;border:0}.thumbBox:after{position:absolute;width:100%;height:100%;line-height:153px;z-index:-1;text-align:center;font-size:20px;content:"缩略图";left:0;top:0;color:#9f9f9f}#Images li{width:19%;margin:.5% .5%;float:left;overflow:hidden}#Images li img{width:100%;cursor:pointer}#Images li .operate{display:block;height:40px;width:100%;background:#f4f5f9}#Images li .operate .check{float:left;margin-left:11px;height:18px;padding:11px 0;width:74%;position:relative}#Images li .operate .check .layui-form-checkbox[lay-skin=primary]{width:100%}#Images li .operate .check .layui-form-checkbox[lay-skin=primary] span{padding:0 5px 0 25px;width:100%;box-sizing:border-box}#Images li .operate .check .layui-form-checkbox[lay-skin=primary] i{position:absolute;left:0;top:0}#Images li .operate .img_del{float:right;margin:9px 11px 0 0;font-size:22px!important;cursor:pointer}#Images li .operate .img_del:hover{color:#f00}@media screen and (max-width:1050px){#Images li{width:24%}}@media screen and (max-width:750px){#Images li{width:49%}}@media screen and (max-width:432px){#Images li{width:99%}}.layui-btn-green{background-color:#5fb878!important}.linkLogo{width:80px;height:40px;overflow:hidden;border:1px solid #e6e6e6;border-radius:2px;cursor:pointer;margin:0 auto;position:relative;text-align:center;line-height:42px}.linkLogoImg{max-width:90%;max-height:90%}.linkLogo:after{position:absolute;width:100%;height:100%;line-height:42px;z-index:-1;text-align:center;font-size:12px;content:"上传LOGO";left:0;top:0;color:#9f9f9f}.linksAdd .layui-form-label{width:60px;padding-left:0}.linksAdd .layui-input-block{margin-left:75px}.linksAdd .layui-input-block input{padding:0 5px}@media screen and (max-width:450px){#userFaceBtn{height:30px;line-height:30px;padding:0 10px;font-size:12px}.user_right img#userFace{width:100px;height:100px;margin-top:0}.layui-col-xs12 .layui-form-label{width:60px;padding-left:0}.layui-col-xs12 .layui-input-block,.layui-col-xs12 .layui-input-inline{margin-left:75px}.layui-col-xs12 .layui-input-inline{left:0!important;width:auto!important}.noFind{padding-top:0}*[pc]{display:none}} +.layui-table-cell{height:38px}.select2-container .select2-selection--single{height:36px!important;margin-top:1px!important;border-radius:0!important;border-color:#e6e6e6!important}.select2-container .select2-selection--single .select2-selection__rendered{padding-top:3px!important}.form-danger{border-color:#ff5722!important}.security-hide{display:none!important}.childrenIframe{position:absolute;height:100%;width:98%;border:0}.layui-layer.magicalcoder-layer-admin{box-shadow:1px 1px 50px rgba(0,0,0,.3)!important;border:none!important}.layui-layer.magicalcoder-layer-admin .layui-layer-title{background-color:#24262f;color:#fff;height:50px;line-height:50px;border:0}.layui-layer.magicalcoder-layer-admin .layui-layer-setwin{top:17px}.layui-layer.magicalcoder-layer-admin .layui-layer-setwin a{font-family:layui-icon!important;font-size:16px;font-style:normal;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;color:#fff}.layui-layer.magicalcoder-layer-admin .layui-layer-setwin .layui-layer-close1{background:0}.layui-layer.magicalcoder-layer-admin .layui-layer-setwin .layui-layer-close1:before{content:"\1006"}.layui-layer.magicalcoder-layer-admin .layui-layer-setwin .layui-layer-min cite{background-color:#ddd}.layui-layer.magicalcoder-layer-admin .layui-layer-setwin .layui-layer-max{background:0;font-size:14px;padding-top:1px}.layui-layer.magicalcoder-layer-admin .layui-layer-setwin .layui-layer-max:before{content:"\e622"}.layui-layer.magicalcoder-layer-admin .layui-layer-setwin .layui-layer-maxmin:before{content:"\e758"}.layui-layer.magicalcoder-layer-admin .layui-layer-btn .layui-layer-btn0{border-color:#009688;background-color:#009688}.layui-layer.magicalcoder-layer-admin .layui-layer-btn a{height:34px;line-height:34px}.magicalcoder-layer-admin{max-width:100%}.layui-layer-iframe .layui-layer-content{overflow:auto;-webkit-overflow-scrolling:touch} +.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-selection--single .select2-selection__clear{position:relative}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap}.select2-container .select2-search--inline{float:left}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:0;font-size:100%;margin-top:5px;padding:0}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051}.select2-results{display:block}.select2-results__options{list-style:none;margin:0;padding:0}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none}.select2-results__option[aria-selected]{cursor:pointer}.select2-container--open .select2-dropdown{left:0}.select2-container--open .select2-dropdown--above{border-bottom:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--open .select2-dropdown--below{border-top:0;border-top-left-radius:0;border-top-right-radius:0}.select2-search--dropdown{display:block;padding:4px}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none}.select2-search--dropdown.select2-search--hide{display:none}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0)}.select2-hidden-accessible{border:0!important;clip:rect(0 0 0 0)!important;-webkit-clip-path:inset(50%)!important;clip-path:inset(50%)!important;height:1px!important;overflow:hidden!important;padding:0!important;position:absolute!important;width:1px!important;white-space:nowrap!important}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%}.select2-container--default .select2-selection--multiple .select2-selection__rendered li{list-style:none}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-search--inline{float:right}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:0;outline:0;box-shadow:none;-webkit-appearance:textfield}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--default .select2-results__option[role=group]{padding:0}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic .select2-selection--single{background-color:#f7f7f7;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top,#fff 50%,#eee 100%);background-image:-o-linear-gradient(top,#fff 50%,#eee 100%);background-image:linear-gradient(to bottom,#fff 50%,#eee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF',endColorstr='#FFEEEEEE',GradientType=0)}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:0;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top,#eee 50%,#ccc 100%);background-image:-o-linear-gradient(top,#eee 50%,#ccc 100%);background-image:linear-gradient(to bottom,#eee 50%,#ccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE',endColorstr='#FFCCCCCC',GradientType=0)}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:0;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:0}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:0;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top,#fff 0,#eee 50%);background-image:-o-linear-gradient(top,#fff 0,#eee 50%);background-image:linear-gradient(to bottom,#fff 0,#eee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF',endColorstr='#FFEEEEEE',GradientType=0)}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:0;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top,#eee 50%,#fff 100%);background-image:-o-linear-gradient(top,#eee 50%,#fff 100%);background-image:linear-gradient(to bottom,#eee 50%,#fff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEEEEEE',endColorstr='#FFFFFFFF',GradientType=0)}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:0;border-top-left-radius:0;border-top-right-radius:0}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:0;border-bottom-left-radius:0;border-bottom-right-radius:0}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;box-shadow:none}.select2-container--classic .select2-dropdown{background-color:#fff;border:1px solid transparent}.select2-container--classic .select2-dropdown--above{border-bottom:0}.select2-container--classic .select2-dropdown--below{border-top:0}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto}.select2-container--classic .select2-results__option[role=group]{padding:0}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:#fff}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb} diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/close.png b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/close.png new file mode 100644 index 0000000..51df78b Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/close.png differ diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/code.jpg b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/code.jpg new file mode 100644 index 0000000..487b194 Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/code.jpg differ diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/face.jpg b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/face.jpg new file mode 100644 index 0000000..319d698 Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/face.jpg differ diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/face1.jpg b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/face1.jpg new file mode 100644 index 0000000..1eff1bc Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/face1.jpg differ diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/face2.jpg b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/face2.jpg new file mode 100644 index 0000000..07f2652 Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/face2.jpg differ diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/fly.png b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/fly.png new file mode 100644 index 0000000..08c2599 Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/fly.png differ diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/git.png b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/git.png new file mode 100644 index 0000000..67209e8 Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/git.png differ diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/layui.png b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/layui.png new file mode 100644 index 0000000..2d144df Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/layui.png differ diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/logo.png b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/logo.png new file mode 100644 index 0000000..ccc62c2 Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/logo.png differ diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/mayun.png b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/mayun.png new file mode 100644 index 0000000..8453fc4 Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/mayun.png differ diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/t_login_bg.jpg b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/t_login_bg.jpg new file mode 100644 index 0000000..b0985ed Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/t_login_bg.jpg differ diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/userface1.jpg b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/userface1.jpg new file mode 100644 index 0000000..14feb30 Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/userface1.jpg differ diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/userface2.jpg b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/userface2.jpg new file mode 100644 index 0000000..9c23f4c Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/userface2.jpg differ diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/userface3.jpg b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/userface3.jpg new file mode 100644 index 0000000..a5c95f4 Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/userface3.jpg differ diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/userface4.jpg b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/userface4.jpg new file mode 100644 index 0000000..d06b939 Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/userface4.jpg differ diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/userface5.jpg b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/userface5.jpg new file mode 100644 index 0000000..48e3767 Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/images/userface5.jpg differ diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/js/body-tab.js b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/js/body-tab.js new file mode 100644 index 0000000..6aa7419 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/js/body-tab.js @@ -0,0 +1,392 @@ +var tabFilter,menu=[],liIndex,curNav,delMenu, bodyTab, + changeRefreshStr = window.sessionStorage.getItem("changeRefresh"); +;!function(){ + var element = layui.element, + $ = layui.$, + layId, + Tab = function(){ + this.tabConfig = { + openTabNum : undefined, //最大可打开窗口数量 + tabFilter : "bodyTab", //添加窗口的filter + url : undefined //获取菜单json地址 + } + }; + //生成左侧菜单 + Tab.prototype.navBar = function(strData){ + var data; + if(typeof(strData) == "string"){ + var data = JSON.parse(strData); //部分用户解析出来的是字符串,转换一下 + }else{ + data = strData; + } + data = data || [] + var ulHtml = ''; + for(var i=0;i 0){ + ulHtml += ''; + if(data[i].icon != undefined && data[i].icon != ''){ + if(data[i].icon.indexOf("icon-") != -1){ + ulHtml += ''; + }else{ + ulHtml += ''+data[i].icon+''; + } + } + ulHtml += ''+data[i].title+''; + ulHtml += ''; + ulHtml += ''; + ulHtml += '
                      '; + for(var j=0;j'; + }else{ + ulHtml += '
                      '; + } + if(data[i].children[j].icon != undefined && data[i].children[j].icon != ''){ + if(data[i].children[j].icon.indexOf("icon-") != -1){ + ulHtml += ''; + }else{ + ulHtml += ''+data[i].children[j].icon+''; + } + } + ulHtml += ''+data[i].children[j].title+'
                      '; + } + ulHtml += "
                      "; + }else{ + if(data[i].target == "_blank"){ + ulHtml += ''; + }else{ + ulHtml += ''; + } + if(data[i].icon != undefined && data[i].icon != ''){ + if(data[i].icon.indexOf("icon-") != -1){ + ulHtml += ''; + }else{ + ulHtml += ''+data[i].icon+''; + } + } + ulHtml += ''+data[i].title+''; + } + ulHtml += ''; + } + return ulHtml; + } + //获取二级菜单数据 + Tab.prototype.render = function() { + //显示左侧菜单 + var _this = this; + $(".navBar ul").html('
                    • 后台首页
                    • ').append(_this.navBar(dataStr)).height($(window).height()-210); + element.init(); //初始化页面元素 + $(window).resize(function(){ + $(".navBar").height($(window).height()-210); + }) + } + + //是否点击窗口切换刷新页面 + Tab.prototype.changeRegresh = function(index){ + if(changeRefreshStr == "true"){ + $(".clildFrame .layui-tab-item").eq(index).find("iframe")[0].contentWindow.location.reload(); + } + } + + //参数设置 + Tab.prototype.set = function(option) { + var _this = this; + $.extend(true, _this.tabConfig, option); + return _this; + }; + + //通过title获取lay-id + Tab.prototype.getLayId = function(title){ + $(".layui-tab-title.top_tab li").each(function(){ + if($(this).find("cite").text() == title){ + layId = $(this).attr("lay-id"); + } + }) + return layId; + } + //通过title判断tab是否存在 + Tab.prototype.hasTab = function(title){ + var tabIndex = -1; + $(".layui-tab-title.top_tab li").each(function(){ + if($(this).find("cite").text() == title){ + tabIndex = 1; + } + }) + return tabIndex; + } + + //右侧内容tab操作 + var tabIdIndex = 0; + Tab.prototype.tabAdd = function(_this){ + if(window.sessionStorage.getItem("menu")){ + menu = JSON.parse(window.sessionStorage.getItem("menu")); + } + var that = this; + var openTabNum = that.tabConfig.openTabNum; + tabFilter = that.tabConfig.tabFilter; + if(_this.attr("target") == "_blank"){ + window.open(_this.attr("data-url")); + }else if(_this.attr("data-url") != undefined){ + var title = ''; + if(_this.find("i.seraph,i.layui-icon").attr("data-icon") != undefined){ + if(_this.find("i.seraph").attr("data-icon") != undefined){ + title += ''; + }else{ + title += ''+_this.find("i.layui-icon").attr("data-icon")+''; + } + } + //已打开的窗口中不存在 + if(that.hasTab(_this.find("cite").text()) == -1 && _this.siblings("dl.layui-nav-child").length == 0){ + if($(".layui-tab-title.top_tab li").length == openTabNum){ + layer.msg('只能同时打开'+openTabNum+'个选项卡哦。不然系统会卡的!'); + return; + } + tabIdIndex++; + title += ''+_this.find("cite").text()+''; + title += ''; + element.tabAdd(tabFilter, { + title : title, + content :"', "", ""].join("")); + return l.ie && l.ie < 8 ? c.removeClass("layui-hide").addClass(o) : (d[0] && d.remove(), s.call(a, m, c[0], y), c.addClass("layui-hide").after(m), a.index) + }, + c.prototype.getContent = function(t) { + var e = u(t); + if (e[0]) return d(e[0].document.body.innerHTML) + }, + c.prototype.getText = function(t) { + var i = u(t); + if (i[0]) return e(i[0].document.body).text() + }, + c.prototype.setContent = function(t, i, a) { + var l = u(t); + l[0] && (a ? e(l[0].document.body).append(i) : e(l[0].document.body).html(i), layedit.sync(t)) + }, + c.prototype.sync = function(t) { + var i = u(t); + if (i[0]) { + var a = e("#" + i[1].attr("textarea")); + a.val(d(i[0].document.body.innerHTML)) + } + }, + c.prototype.getSelection = function(t) { + var e = u(t); + if (e[0]) { + var i = m(e[0].document); + return document.selection ? i.text: i.toString() + } + }; + var s = function(t, i, a) { + var l = this, + n = t.find("iframe"); + n.css({ + height: a.height + }).on("load", + function() { + var o = n.contents(), + r = n.prop("contentWindow"), + c = o.find("head"), + s = e([""].join("")), + u = o.find("body"); + c.append(s), + //fix by www.magicalcoder.com 我希望能根据textarea disabled属性 + u.attr("contenteditable", (i.disabled+''=='true' || i.disabled+''=='disabled' ) ? 'false' : "true").css({ + // u.attr("contenteditable", "true").css({ + "min-height": a.height + }).html(i.value || ""), + y.apply(l, [r, n, i, a]), + g.call(l, r, t, a) + }) + }, + u = function(t) { + var i = e("#LAY_layedit_" + t), + a = i.prop("contentWindow"); + return [a, i] + }, + d = function(t) { + return 8 == l.ie && (t = t.replace(/<.+>/g, + function(t) { + return t.toLowerCase() + })), + t + }, + y = function(t, a, n, o) { + var r = t.document, + c = e(r.body); + c.on("keydown", + function(t) { + var e = t.keyCode; + if (13 === e) { + var a = m(r), + l = p(a), + n = l.parentNode; + if ("pre" === n.tagName.toLowerCase()) { + if (t.shiftKey) return; + return i.msg("请暂时用shift+enter"), + !1 + } + r.execCommand("formatBlock", !1, "

                      ") + } + }), + e(n).parents("form").on("submit", + function() { + var t = c.html(); + 8 == l.ie && (t = t.replace(/<.+>/g, + function(t) { + return t.toLowerCase() + })), + n.value = t + }), + c.on("paste", + function(e) { + r.execCommand("formatBlock", !1, "

                      "), + setTimeout(function() { + f.call(t, c), + n.value = c.html() + }, + 100) + }) + }, + f = function(t) { + var i = this; + i.document; + t.find("*[style]").each(function() { + var t = this.style.textAlign; + this.removeAttribute("style"), + e(this).css({ + "text-align": t || "" + }) + }), + t.find("table").addClass("layui-table"), + t.find("script,link").remove() + }, + m = function(t) { + return t.selection ? t.selection.createRange() : t.getSelection().getRangeAt(0) + }, + p = function(t) { + return t.endContainer || t.parentElement().childNodes[0] + }, + v = function(t, i, a) { + var l = this.document, + n = document.createElement(t); + for (var o in i) n.setAttribute(o, i[o]); + if (n.removeAttribute("text"), l.selection) { + var r = a.text || i.text; + if ("a" === t && !r) return; + r && (n.innerHTML = r), + a.pasteHTML(e(n).prop("outerHTML")), + a.select() + } else { + var r = a.toString() || i.text; + if ("a" === t && !r) return; + r && (n.innerHTML = r), + a.deleteContents(), + a.insertNode(n) + } + }, + h = function(t, i) { + var a = this.document, + l = "layedit-tool-active", + n = p(m(a)), + o = function(e) { + return t.find(".layedit-tool-" + e) + }; + i && i[i.hasClass(l) ? "removeClass": "addClass"](l), + t.find(">i").removeClass(l), + o("unlink").addClass(r), + e(n).parents().each(function() { + var t = this.tagName.toLowerCase(), + e = this.style.textAlign; + "b" !== t && "strong" !== t || o("b").addClass(l), + "i" !== t && "em" !== t || o("i").addClass(l), + "u" === t && o("u").addClass(l), + "strike" === t && o("d").addClass(l), + "p" === t && ("center" === e ? o("center").addClass(l) : "right" === e ? o("right").addClass(l) : o("left").addClass(l)), + "a" === t && (o("link").addClass(l), o("unlink").removeClass(r)) + }) + }, + g = function(t, a, l) { + var n = t.document, + o = e(n.body), + c = { + link: function(i) { + var a = p(i), + l = e(a).parent(); + b.call(o, { + href: l.attr("href"), + target: l.attr("target") + }, + function(e) { + var a = l[0]; + "A" === a.tagName ? a.href = e.url: v.call(t, "a", { + target: e.target, + href: e.url, + text: e.url + }, + i) + }) + }, + unlink: function(t) { + n.execCommand("unlink") + }, + face: function(e) { + x.call(this, + function(i) { + v.call(t, "img", { + src: i.src, + alt: i.alt + }, + e) + }) + }, + image: function(a) { + var n = this; + layui.use("upload", + function(o) { + var r = l.uploadImage || {}; + o.render({ + url: r.url, + method: r.type, + elem: e(n).find("input")[0], + done: function(e) { + 0 == e.code ? (e.data = e.data || {}, + v.call(t, "img", { + src: e.data.src, + alt: e.data.title + }, + a)) : i.msg(e.msg || "上传失败") + } + }) + }) + }, + code: function(e) { + k.call(o, + function(i) { + v.call(t, "pre", { + text: i.code, + "lay-lang": i.lang + }, + e) + }) + }, + help: function() { + i.open({ + type: 2, + title: "帮助", + area: ["600px", "380px"], + shadeClose: !0, + shade: .1, + skin: "layui-layer-msg", + content: ["http://www.layui.com/about/layedit/help.html", "no"] + }) + } + }, + s = a.find(".layui-layedit-tool"), + u = function() { + var i = e(this), + a = i.attr("layedit-event"), + l = i.attr("lay-command"); + if (!i.hasClass(r)) { + o.focus(); + var u = m(n); + u.commonAncestorContainer; + l ? (n.execCommand(l), /justifyLeft|justifyCenter|justifyRight/.test(l) && n.execCommand("formatBlock", !1, "

                      "), setTimeout(function() { + o.focus() + }, + 10)) : c[a] && c[a].call(this, u), + h.call(t, s, i) + } + }, + d = /image/; + s.find(">i").on("mousedown", + function() { + var t = e(this), + i = t.attr("layedit-event"); + d.test(i) || u.call(this) + }).on("click", + function() { + var t = e(this), + i = t.attr("layedit-event"); + d.test(i) && u.call(this) + }), + o.on("click", + function() { + h.call(t, s), + i.close(x.index) + }) + }, + b = function(t, e) { + var l = this, + n = i.open({ + type: 1, + id: "LAY_layedit_link", + area: "350px", + shade: .05, + shadeClose: !0, + moveType: 1, + title: "超链接", + skin: "layui-layer-msg", + content: ['

                        ', '
                      • ', '', '
                        ', '', "
                        ", "
                      • ", '
                      • ', '', '
                        ', '", '", "
                        ", "
                      • ", '
                      • ', '', '', "
                      • ", "
                      "].join(""), + success: function(t, n) { + var o = "submit(layedit-link-yes)"; + a.render("radio"), + t.find(".layui-btn-primary").on("click", + function() { + i.close(n), + l.focus() + }), + a.on(o, + function(t) { + i.close(b.index), + e && e(t.field) + }) + } + }); + b.index = n + }, + x = function(t) { + var a = function() { + var t = ["[微笑]", "[嘻嘻]", "[哈哈]", "[可爱]", "[可怜]", "[挖鼻]", "[吃惊]", "[害羞]", "[挤眼]", "[闭嘴]", "[鄙视]", "[爱你]", "[泪]", "[偷笑]", "[亲亲]", "[生病]", "[太开心]", "[白眼]", "[右哼哼]", "[左哼哼]", "[嘘]", "[衰]", "[委屈]", "[吐]", "[哈欠]", "[抱抱]", "[怒]", "[疑问]", "[馋嘴]", "[拜拜]", "[思考]", "[汗]", "[困]", "[睡]", "[钱]", "[失望]", "[酷]", "[色]", "[哼]", "[鼓掌]", "[晕]", "[悲伤]", "[抓狂]", "[黑线]", "[阴险]", "[怒骂]", "[互粉]", "[心]", "[伤心]", "[猪头]", "[熊猫]", "[兔子]", "[ok]", "[耶]", "[good]", "[NO]", "[赞]", "[来]", "[弱]", "[草泥马]", "[神马]", "[囧]", "[浮云]", "[给力]", "[围观]", "[威武]", "[奥特曼]", "[礼物]", "[钟]", "[话筒]", "[蜡烛]", "[蛋糕]"], + e = {}; + return layui.each(t, + function(t, i) { + e[i] = layui.cache.dir + "images/face/" + t + ".gif" + }), + e + } (); + return x.hide = x.hide || + function(t) { + "face" !== e(t.target).attr("layedit-event") && i.close(x.index) + }, + x.index = i.tips(function() { + var t = []; + return layui.each(a, + function(e, i) { + t.push('
                    • ' + e + '
                    • ') + }), + '
                        ' + t.join("") + "
                      " + } (), this, { + tips: 1, + time: 0, + skin: "layui-box layui-util-face", + maxWidth: 500, + success: function(l, n) { + l.css({ + marginTop: -4, + marginLeft: -10 + }).find(".layui-clear>li").on("click", + function() { + t && t({ + src: a[this.title], + alt: this.title + }), + i.close(n) + }), + e(document).off("click", x.hide).on("click", x.hide) + } + }) + }, + k = function(t) { + var e = this, + l = i.open({ + type: 1, + id: "LAY_layedit_code", + area: "550px", + shade: .05, + shadeClose: !0, + moveType: 1, + title: "插入代码", + skin: "layui-layer-msg", + content: ['
                        ', '
                      • ', '', '
                        ', '", "
                        ", "
                      • ", '
                      • ', '', '
                        ', '', "
                        ", "
                      • ", '
                      • ', '', '', "
                      • ", "
                      "].join(""), + success: function(l, n) { + var o = "submit(layedit-code-yes)"; + a.render("select"), + l.find(".layui-btn-primary").on("click", + function() { + i.close(n), + e.focus() + }), + a.on(o, + function(e) { + i.close(k.index), + t && t(e.field) + }) + } + }); + k.index = l + }, + C = { + html: '', + strong: '', + italic: '', + underline: '', + del: '', + "|": '', + left: '', + center: '', + right: '', + link: '', + unlink: '', + face: '', + image: '', + code: '', + help: '' + }, + w = new c; + t(n, w) + }); diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/layui/lay/modules/layer.js b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/layui/lay/modules/layer.js new file mode 100644 index 0000000..c6d5378 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/layui/lay/modules/layer.js @@ -0,0 +1,2 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + ;!function(e,t){"use strict";var i,n,a=e.layui&&layui.define,o={getPath:function(){var e=document.currentScript?document.currentScript.src:function(){for(var e,t=document.scripts,i=t.length-1,n=i;n>0;n--)if("interactive"===t[n].readyState){e=t[n].src;break}return e||t[i].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),config:{},end:{},minIndex:0,minLeft:[],btn:["确定","取消"],type:["dialog","page","iframe","loading","tips"],getStyle:function(t,i){var n=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](i)},link:function(t,i,n){if(r.path){var a=document.getElementsByTagName("head")[0],s=document.createElement("link");"string"==typeof i&&(n=i);var l=(n||t).replace(/\.|\//g,""),f="layuicss-"+l,c=0;s.rel="stylesheet",s.href=r.path+t,s.id=f,document.getElementById(f)||a.appendChild(s),"function"==typeof i&&!function u(){return++c>80?e.console&&console.error("layer.css: Invalid"):void(1989===parseInt(o.getStyle(document.getElementById(f),"width"))?i():setTimeout(u,100))}()}}},r={v:"3.1.1",ie:function(){var t=navigator.userAgent.toLowerCase();return!!(e.ActiveXObject||"ActiveXObject"in e)&&((t.match(/msie\s(\d+)/)||[])[1]||"11")}(),index:e.layer&&e.layer.v?1e5:0,path:o.getPath,config:function(e,t){return e=e||{},r.cache=o.config=i.extend({},o.config,e),r.path=o.config.path||r.path,"string"==typeof e.extend&&(e.extend=[e.extend]),o.config.path&&r.ready(),e.extend?(a?layui.addcss("modules/layer/"+e.extend):o.link("theme/"+e.extend),this):this},ready:function(e){var t="layer",i="",n=(a?"modules/layer/":"theme/")+"default/layer.css?v="+r.v+i;return a?layui.addcss(n,e,t):o.link(n,e,t),this},alert:function(e,t,n){var a="function"==typeof t;return a&&(n=t),r.open(i.extend({content:e,yes:n},a?{}:t))},confirm:function(e,t,n,a){var s="function"==typeof t;return s&&(a=n,n=t),r.open(i.extend({content:e,btn:o.btn,yes:n,btn2:a},s?{}:t))},msg:function(e,n,a){var s="function"==typeof n,f=o.config.skin,c=(f?f+" "+f+"-msg":"")||"layui-layer-msg",u=l.anim.length-1;return s&&(a=n),r.open(i.extend({content:e,time:3e3,shade:!1,skin:c,title:!1,closeBtn:!1,btn:!1,resize:!1,end:a},s&&!o.config.skin?{skin:c+" layui-layer-hui",anim:u}:function(){return n=n||{},(n.icon===-1||n.icon===t&&!o.config.skin)&&(n.skin=c+" "+(n.skin||"layui-layer-hui")),n}()))},load:function(e,t){return r.open(i.extend({type:3,icon:e||0,resize:!1,shade:.01},t))},tips:function(e,t,n){return r.open(i.extend({type:4,content:[e,t],closeBtn:!1,time:3e3,shade:!1,resize:!1,fixed:!1,maxWidth:210},n))}},s=function(e){var t=this;t.index=++r.index,t.config=i.extend({},t.config,o.config,e),document.body?t.creat():setTimeout(function(){t.creat()},30)};s.pt=s.prototype;var l=["layui-layer",".layui-layer-title",".layui-layer-main",".layui-layer-dialog","layui-layer-iframe","layui-layer-content","layui-layer-btn","layui-layer-close"];l.anim=["layer-anim-00","layer-anim-01","layer-anim-02","layer-anim-03","layer-anim-04","layer-anim-05","layer-anim-06"],s.pt.config={type:0,shade:.3,fixed:!0,move:l[1],title:"信息",offset:"auto",area:"auto",closeBtn:1,time:0,zIndex:19891014,maxWidth:360,anim:0,isOutAnim:!0,icon:-1,moveType:1,resize:!0,scrollbar:!0,tips:2},s.pt.vessel=function(e,t){var n=this,a=n.index,r=n.config,s=r.zIndex+a,f="object"==typeof r.title,c=r.maxmin&&(1===r.type||2===r.type),u=r.title?'
                      '+(f?r.title[0]:r.title)+"
                      ":"";return r.zIndex=s,t([r.shade?'
                      ':"",'
                      '+(e&&2!=r.type?"":u)+'
                      '+(0==r.type&&r.icon!==-1?'':"")+(1==r.type&&e?"":r.content||"")+'
                      '+function(){var e=c?'':"";return r.closeBtn&&(e+=''),e}()+""+(r.btn?function(){var e="";"string"==typeof r.btn&&(r.btn=[r.btn]);for(var t=0,i=r.btn.length;t'+r.btn[t]+"";return'
                      '+e+"
                      "}():"")+(r.resize?'':"")+"
                      "],u,i('
                      ')),n},s.pt.creat=function(){var e=this,t=e.config,a=e.index,s=t.content,f="object"==typeof s,c=i("body");if(!t.id||!i("#"+t.id)[0]){switch("string"==typeof t.area&&(t.area="auto"===t.area?["",""]:[t.area,""]),t.shift&&(t.anim=t.shift),6==r.ie&&(t.fixed=!1),t.type){case 0:t.btn="btn"in t?t.btn:o.btn[0],r.closeAll("dialog");break;case 2:var s=t.content=f?t.content:[t.content||"","auto"];t.content='';break;case 3:delete t.title,delete t.closeBtn,t.icon===-1&&0===t.icon,r.closeAll("loading");break;case 4:f||(t.content=[t.content,"body"]),t.follow=t.content[1],t.content=t.content[0]+'',delete t.title,t.tips="object"==typeof t.tips?t.tips:[t.tips,!0],t.tipsMore||r.closeAll("tips")}if(e.vessel(f,function(n,r,u){c.append(n[0]),f?function(){2==t.type||4==t.type?function(){i("body").append(n[1])}():function(){s.parents("."+l[0])[0]||(s.data("display",s.css("display")).show().addClass("layui-layer-wrap").wrap(n[1]),i("#"+l[0]+a).find("."+l[5]).before(r))}()}():c.append(n[1]),i(".layui-layer-move")[0]||c.append(o.moveElem=u),e.layero=i("#"+l[0]+a),t.scrollbar||l.html.css("overflow","hidden").attr("layer-full",a)}).auto(a),i("#layui-layer-shade"+e.index).css({"background-color":t.shade[1]||"#000",opacity:t.shade[0]||t.shade}),2==t.type&&6==r.ie&&e.layero.find("iframe").attr("src",s[0]),4==t.type?e.tips():e.offset(),t.fixed&&n.on("resize",function(){e.offset(),(/^\d+%$/.test(t.area[0])||/^\d+%$/.test(t.area[1]))&&e.auto(a),4==t.type&&e.tips()}),t.time<=0||setTimeout(function(){r.close(e.index)},t.time),e.move().callback(),l.anim[t.anim]){var u="layer-anim "+l.anim[t.anim];e.layero.addClass(u).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",function(){i(this).removeClass(u)})}t.isOutAnim&&e.layero.data("isOutAnim",!0)}},s.pt.auto=function(e){var t=this,a=t.config,o=i("#"+l[0]+e);""===a.area[0]&&a.maxWidth>0&&(r.ie&&r.ie<8&&a.btn&&o.width(o.innerWidth()),o.outerWidth()>a.maxWidth&&o.width(a.maxWidth));var s=[o.innerWidth(),o.innerHeight()],f=o.find(l[1]).outerHeight()||0,c=o.find("."+l[6]).outerHeight()||0,u=function(e){e=o.find(e),e.height(s[1]-f-c-2*(0|parseFloat(e.css("padding-top"))))};switch(a.type){case 2:u("iframe");break;default:""===a.area[1]?a.maxHeight>0&&o.outerHeight()>a.maxHeight?(s[1]=a.maxHeight,u("."+l[5])):a.fixed&&s[1]>=n.height()&&(s[1]=n.height(),u("."+l[5])):u("."+l[5])}return t},s.pt.offset=function(){var e=this,t=e.config,i=e.layero,a=[i.outerWidth(),i.outerHeight()],o="object"==typeof t.offset;e.offsetTop=(n.height()-a[1])/2,e.offsetLeft=(n.width()-a[0])/2,o?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):"auto"!==t.offset&&("t"===t.offset?e.offsetTop=0:"r"===t.offset?e.offsetLeft=n.width()-a[0]:"b"===t.offset?e.offsetTop=n.height()-a[1]:"l"===t.offset?e.offsetLeft=0:"lt"===t.offset?(e.offsetTop=0,e.offsetLeft=0):"lb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=0):"rt"===t.offset?(e.offsetTop=0,e.offsetLeft=n.width()-a[0]):"rb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=n.width()-a[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?n.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?n.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=n.scrollTop(),e.offsetLeft+=n.scrollLeft()),i.attr("minLeft")&&(e.offsetTop=n.height()-(i.find(l[1]).outerHeight()||0),e.offsetLeft=i.css("left")),i.css({top:e.offsetTop,left:e.offsetLeft})},s.pt.tips=function(){var e=this,t=e.config,a=e.layero,o=[a.outerWidth(),a.outerHeight()],r=i(t.follow);r[0]||(r=i("body"));var s={width:r.outerWidth(),height:r.outerHeight(),top:r.offset().top,left:r.offset().left},f=a.find(".layui-layer-TipsG"),c=t.tips[0];t.tips[1]||f.remove(),s.autoLeft=function(){s.left+o[0]-n.width()>0?(s.tipLeft=s.left+s.width-o[0],f.css({right:12,left:"auto"})):s.tipLeft=s.left},s.where=[function(){s.autoLeft(),s.tipTop=s.top-o[1]-10,f.removeClass("layui-layer-TipsB").addClass("layui-layer-TipsT").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left+s.width+10,s.tipTop=s.top,f.removeClass("layui-layer-TipsL").addClass("layui-layer-TipsR").css("border-bottom-color",t.tips[1])},function(){s.autoLeft(),s.tipTop=s.top+s.height+10,f.removeClass("layui-layer-TipsT").addClass("layui-layer-TipsB").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left-o[0]-10,s.tipTop=s.top,f.removeClass("layui-layer-TipsR").addClass("layui-layer-TipsL").css("border-bottom-color",t.tips[1])}],s.where[c-1](),1===c?s.top-(n.scrollTop()+o[1]+16)<0&&s.where[2]():2===c?n.width()-(s.left+s.width+o[0]+16)>0||s.where[3]():3===c?s.top-n.scrollTop()+s.height+o[1]+16-n.height()>0&&s.where[0]():4===c&&o[0]+16-s.left>0&&s.where[1](),a.find("."+l[5]).css({"background-color":t.tips[1],"padding-right":t.closeBtn?"30px":""}),a.css({left:s.tipLeft-(t.fixed?n.scrollLeft():0),top:s.tipTop-(t.fixed?n.scrollTop():0)})},s.pt.move=function(){var e=this,t=e.config,a=i(document),s=e.layero,l=s.find(t.move),f=s.find(".layui-layer-resize"),c={};return t.move&&l.css("cursor","move"),l.on("mousedown",function(e){e.preventDefault(),t.move&&(c.moveStart=!0,c.offset=[e.clientX-parseFloat(s.css("left")),e.clientY-parseFloat(s.css("top"))],o.moveElem.css("cursor","move").show())}),f.on("mousedown",function(e){e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],c.area=[s.outerWidth(),s.outerHeight()],o.moveElem.css("cursor","se-resize").show()}),a.on("mousemove",function(i){if(c.moveStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1],l="fixed"===s.css("position");if(i.preventDefault(),c.stX=l?0:n.scrollLeft(),c.stY=l?0:n.scrollTop(),!t.moveOut){var f=n.width()-s.outerWidth()+c.stX,u=n.height()-s.outerHeight()+c.stY;af&&(a=f),ou&&(o=u)}s.css({left:a,top:o})}if(t.resize&&c.resizeStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1];i.preventDefault(),r.style(e.index,{width:c.area[0]+a,height:c.area[1]+o}),c.isResize=!0,t.resizing&&t.resizing(s)}}).on("mouseup",function(e){c.moveStart&&(delete c.moveStart,o.moveElem.hide(),t.moveEnd&&t.moveEnd(s)),c.resizeStart&&(delete c.resizeStart,o.moveElem.hide())}),e},s.pt.callback=function(){function e(){var e=a.cancel&&a.cancel(t.index,n);e===!1||r.close(t.index)}var t=this,n=t.layero,a=t.config;t.openLayer(),a.success&&(2==a.type?n.find("iframe").on("load",function(){a.success(n,t.index)}):a.success(n,t.index)),6==r.ie&&t.IE6(n),n.find("."+l[6]).children("a").on("click",function(){var e=i(this).index();if(0===e)a.yes?a.yes(t.index,n):a.btn1?a.btn1(t.index,n):r.close(t.index);else{var o=a["btn"+(e+1)]&&a["btn"+(e+1)](t.index,n);o===!1||r.close(t.index)}}),n.find("."+l[7]).on("click",e),a.shadeClose&&i("#layui-layer-shade"+t.index).on("click",function(){r.close(t.index)}),n.find(".layui-layer-min").on("click",function(){var e=a.min&&a.min(n);e===!1||r.min(t.index,a)}),n.find(".layui-layer-max").on("click",function(){i(this).hasClass("layui-layer-maxmin")?(r.restore(t.index),a.restore&&a.restore(n)):(r.full(t.index,a),setTimeout(function(){a.full&&a.full(n)},100))}),a.end&&(o.end[t.index]=a.end)},o.reselect=function(){i.each(i("select"),function(e,t){var n=i(this);n.parents("."+l[0])[0]||1==n.attr("layer")&&i("."+l[0]).length<1&&n.removeAttr("layer").show(),n=null})},s.pt.IE6=function(e){i("select").each(function(e,t){var n=i(this);n.parents("."+l[0])[0]||"none"===n.css("display")||n.attr({layer:"1"}).hide(),n=null})},s.pt.openLayer=function(){var e=this;r.zIndex=e.config.zIndex,r.setTop=function(e){var t=function(){r.zIndex++,e.css("z-index",r.zIndex+1)};return r.zIndex=parseInt(e[0].style.zIndex),e.on("mousedown",t),r.zIndex}},o.record=function(e){var t=[e.width(),e.height(),e.position().top,e.position().left+parseFloat(e.css("margin-left"))];e.find(".layui-layer-max").addClass("layui-layer-maxmin"),e.attr({area:t})},o.rescollbar=function(e){l.html.attr("layer-full")==e&&(l.html[0].style.removeProperty?l.html[0].style.removeProperty("overflow"):l.html[0].style.removeAttribute("overflow"),l.html.removeAttr("layer-full"))},e.layer=r,r.getChildFrame=function(e,t){return t=t||i("."+l[4]).attr("times"),i("#"+l[0]+t).find("iframe").contents().find(e)},r.getFrameIndex=function(e){return i("#"+e).parents("."+l[4]).attr("times")},r.iframeAuto=function(e){if(e){var t=r.getChildFrame("html",e).outerHeight(),n=i("#"+l[0]+e),a=n.find(l[1]).outerHeight()||0,o=n.find("."+l[6]).outerHeight()||0;n.css({height:t+a+o}),n.find("iframe").css({height:t})}},r.iframeSrc=function(e,t){i("#"+l[0]+e).find("iframe").attr("src",t)},r.style=function(e,t,n){var a=i("#"+l[0]+e),r=a.find(".layui-layer-content"),s=a.attr("type"),f=a.find(l[1]).outerHeight()||0,c=a.find("."+l[6]).outerHeight()||0;a.attr("minLeft");s!==o.type[3]&&s!==o.type[4]&&(n||(parseFloat(t.width)<=260&&(t.width=260),parseFloat(t.height)-f-c<=64&&(t.height=64+f+c)),a.css(t),c=a.find("."+l[6]).outerHeight(),s===o.type[2]?a.find("iframe").css({height:parseFloat(t.height)-f-c}):r.css({height:parseFloat(t.height)-f-c-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom"))}))},r.min=function(e,t){var a=i("#"+l[0]+e),s=a.find(l[1]).outerHeight()||0,f=a.attr("minLeft")||181*o.minIndex+"px",c=a.css("position");o.record(a),o.minLeft[0]&&(f=o.minLeft[0],o.minLeft.shift()),a.attr("position",c),r.style(e,{width:180,height:s,left:f,top:n.height()-s,position:"fixed",overflow:"hidden"},!0),a.find(".layui-layer-min").hide(),"page"===a.attr("type")&&a.find(l[4]).hide(),o.rescollbar(e),a.attr("minLeft")||o.minIndex++,a.attr("minLeft",f)},r.restore=function(e){var t=i("#"+l[0]+e),n=t.attr("area").split(",");t.attr("type");r.style(e,{width:parseFloat(n[0]),height:parseFloat(n[1]),top:parseFloat(n[2]),left:parseFloat(n[3]),position:t.attr("position"),overflow:"visible"},!0),t.find(".layui-layer-max").removeClass("layui-layer-maxmin"),t.find(".layui-layer-min").show(),"page"===t.attr("type")&&t.find(l[4]).show(),o.rescollbar(e)},r.full=function(e){var t,a=i("#"+l[0]+e);o.record(a),l.html.attr("layer-full")||l.html.css("overflow","hidden").attr("layer-full",e),clearTimeout(t),t=setTimeout(function(){var t="fixed"===a.css("position");r.style(e,{top:t?0:n.scrollTop(),left:t?0:n.scrollLeft(),width:n.width(),height:n.height()},!0),a.find(".layui-layer-min").hide()},100)},r.title=function(e,t){var n=i("#"+l[0]+(t||r.index)).find(l[1]);n.html(e)},r.close=function(e){var t=i("#"+l[0]+e),n=t.attr("type"),a="layer-anim-close";if(t[0]){var s="layui-layer-wrap",f=function(){if(n===o.type[1]&&"object"===t.attr("conType")){t.children(":not(."+l[5]+")").remove();for(var a=t.find("."+s),r=0;r<2;r++)a.unwrap();a.css("display",a.data("display")).removeClass(s)}else{if(n===o.type[2])try{var f=i("#"+l[4]+e)[0];f.contentWindow.document.write(""),f.contentWindow.close(),t.find("."+l[5])[0].removeChild(f)}catch(c){}t[0].innerHTML="",t.remove()}"function"==typeof o.end[e]&&o.end[e](),delete o.end[e]};t.data("isOutAnim")&&t.addClass("layer-anim "+a),i("#layui-layer-moves, #layui-layer-shade"+e).remove(),6==r.ie&&o.reselect(),o.rescollbar(e),t.attr("minLeft")&&(o.minIndex--,o.minLeft.push(t.attr("minLeft"))),r.ie&&r.ie<10||!t.data("isOutAnim")?f():setTimeout(function(){f()},200)}},r.closeAll=function(e){i.each(i("."+l[0]),function(){var t=i(this),n=e?t.attr("type")===e:1;n&&r.close(t.attr("times")),n=null})};var f=r.cache||{},c=function(e){return f.skin?" "+f.skin+" "+f.skin+"-"+e:""};r.prompt=function(e,t){var a="";if(e=e||{},"function"==typeof e&&(t=e),e.area){var o=e.area;a='style="width: '+o[0]+"; height: "+o[1]+';"',delete e.area}var s,l=2==e.formType?'":function(){return''}(),f=e.success;return delete e.success,r.open(i.extend({type:1,btn:["确定","取消"],content:l,skin:"layui-layer-prompt"+c("prompt"),maxWidth:n.width(),success:function(t){s=t.find(".layui-layer-input"),s.val(e.value||"").focus(),"function"==typeof f&&f(t)},resize:!1,yes:function(i){var n=s.val();""===n?s.focus():n.length>(e.maxlength||500)?r.tips("最多输入"+(e.maxlength||500)+"个字数",s,{tips:1}):t&&t(n,i,s)}},e))},r.tab=function(e){e=e||{};var t=e.tab||{},n="layui-this",a=e.success;return delete e.success,r.open(i.extend({type:1,skin:"layui-layer-tab"+c("tab"),resize:!1,title:function(){var e=t.length,i=1,a="";if(e>0)for(a=''+t[0].title+"";i"+t[i].title+"";return a}(),content:'
                        '+function(){var e=t.length,i=1,a="";if(e>0)for(a='
                      • '+(t[0].content||"no content")+"
                      • ";i'+(t[i].content||"no content")+"";return a}()+"
                      ",success:function(t){var o=t.find(".layui-layer-title").children(),r=t.find(".layui-layer-tabmain").children();o.on("mousedown",function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0;var a=i(this),o=a.index();a.addClass(n).siblings().removeClass(n),r.eq(o).show().siblings().hide(),"function"==typeof e.change&&e.change(o)}),"function"==typeof a&&a(t)}},e))},r.photos=function(t,n,a){function o(e,t,i){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,t(n)},void(n.onerror=function(e){n.onerror=null,i(e)}))}var s={};if(t=t||{},t.photos){var l=t.photos.constructor===Object,f=l?t.photos:{},u=f.data||[],d=f.start||0;s.imgIndex=(0|d)+1,t.img=t.img||"img";var y=t.success;if(delete t.success,l){if(0===u.length)return r.msg("没有图片")}else{var p=i(t.photos),h=function(){u=[],p.find(t.img).each(function(e){var t=i(this);t.attr("layer-index",e),u.push({alt:t.attr("alt"),pid:t.attr("layer-pid"),src:t.attr("layer-src")||t.attr("src"),thumb:t.attr("src")})})};if(h(),0===u.length)return;if(n||p.on("click",t.img,function(){var e=i(this),n=e.attr("layer-index");r.photos(i.extend(t,{photos:{start:n,data:u,tab:t.tab},full:t.full}),!0),h()}),!n)return}s.imgprev=function(e){s.imgIndex--,s.imgIndex<1&&(s.imgIndex=u.length),s.tabimg(e)},s.imgnext=function(e,t){s.imgIndex++,s.imgIndex>u.length&&(s.imgIndex=1,t)||s.tabimg(e)},s.keyup=function(e){if(!s.end){var t=e.keyCode;e.preventDefault(),37===t?s.imgprev(!0):39===t?s.imgnext(!0):27===t&&r.close(s.index)}},s.tabimg=function(e){if(!(u.length<=1))return f.start=s.imgIndex-1,r.close(s.index),r.photos(t,!0,e)},s.event=function(){s.bigimg.hover(function(){s.imgsee.show()},function(){s.imgsee.hide()}),s.bigimg.find(".layui-layer-imgprev").on("click",function(e){e.preventDefault(),s.imgprev()}),s.bigimg.find(".layui-layer-imgnext").on("click",function(e){e.preventDefault(),s.imgnext()}),i(document).on("keyup",s.keyup)},s.loadi=r.load(1,{shade:!("shade"in t)&&.9,scrollbar:!1}),o(u[d].src,function(n){r.close(s.loadi),s.index=r.open(i.extend({type:1,id:"layui-layer-photos",area:function(){var a=[n.width,n.height],o=[i(e).width()-100,i(e).height()-100];if(!t.full&&(a[0]>o[0]||a[1]>o[1])){var r=[a[0]/o[0],a[1]/o[1]];r[0]>r[1]?(a[0]=a[0]/r[0],a[1]=a[1]/r[0]):r[0]'+(u[d].alt||
                      '+(u.length>1?'':"")+'
                      '+(u[d].alt||"")+""+s.imgIndex+"/"+u.length+"
                      ",success:function(e,i){s.bigimg=e.find(".layui-layer-phimg"),s.imgsee=e.find(".layui-layer-imguide,.layui-layer-imgbar"),s.event(e),t.tab&&t.tab(u[d],e),"function"==typeof y&&y(e)},end:function(){s.end=!0,i(document).off("keyup",s.keyup)}},t))},function(){r.close(s.loadi),r.msg("当前图片地址异常
                      是否继续查看下一张?",{time:3e4,btn:["下一张","不看了"],yes:function(){u.length>1&&s.imgnext(!0,!0)}})})}},o.run=function(t){i=t,n=i(e),l.html=i("html"),r.open=function(e){var t=new s(e);return t.index}},e.layui&&layui.define?(r.ready(),layui.define("jquery",function(t){r.path=layui.cache.dir,o.run(layui.$),e.layer=r,t("layer",r)})):"function"==typeof define&&define.amd?define(["jquery"],function(){return o.run(e.jQuery),r}):function(){o.run(e.jQuery),r.ready()}()}(window); \ No newline at end of file diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/layui/lay/modules/laypage.js b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/layui/lay/modules/laypage.js new file mode 100644 index 0000000..fd07fda --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/layui/lay/modules/laypage.js @@ -0,0 +1,2 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + ;layui.define(function(e){"use strict";var a=document,t="getElementById",n="getElementsByTagName",i="laypage",r="layui-disabled",u=function(e){var a=this;a.config=e||{},a.config.index=++s.index,a.render(!0)};u.prototype.type=function(){var e=this.config;if("object"==typeof e.elem)return void 0===e.elem.length?2:3},u.prototype.view=function(){var e=this,a=e.config,t=a.groups="groups"in a?0|a.groups:5;a.layout="object"==typeof a.layout?a.layout:["prev","page","next"],a.count=0|a.count,a.curr=0|a.curr||1,a.limits="object"==typeof a.limits?a.limits:[10,20,30,40,50],a.limit=0|a.limit||10,a.pages=Math.ceil(a.count/a.limit)||1,a.curr>a.pages&&(a.curr=a.pages),t<0?t=1:t>a.pages&&(t=a.pages),a.prev="prev"in a?a.prev:"上一页",a.next="next"in a?a.next:"下一页";var n=a.pages>t?Math.ceil((a.curr+(t>1?1:0))/(t>0?t:1)):1,i={prev:function(){return a.prev?''+a.prev+"":""}(),page:function(){var e=[];if(a.count<1)return"";n>1&&a.first!==!1&&0!==t&&e.push(''+(a.first||1)+"");var i=Math.floor((t-1)/2),r=n>1?a.curr-i:1,u=n>1?function(){var e=a.curr+(t-i-1);return e>a.pages?a.pages:e}():t;for(u-r2&&e.push('');r<=u;r++)r===a.curr?e.push('"+r+""):e.push(''+r+"");return a.pages>t&&a.pages>u&&a.last!==!1&&(u+1…'),0!==t&&e.push(''+(a.last||a.pages)+"")),e.join("")}(),next:function(){return a.next?''+a.next+"":""}(),count:'共 '+a.count+" 条",limit:function(){var e=['"}(),refresh:['','',""].join(""),skip:function(){return['到第','','页',""].join("")}()};return['
                      ',function(){var e=[];return layui.each(a.layout,function(a,t){i[t]&&e.push(i[t])}),e.join("")}(),"
                      "].join("")},u.prototype.jump=function(e,a){if(e){var t=this,i=t.config,r=e.children,u=e[n]("button")[0],l=e[n]("input")[0],p=e[n]("select")[0],c=function(){var e=0|l.value.replace(/\s|\D/g,"");e&&(i.curr=e,t.render())};if(a)return c();for(var o=0,y=r.length;oi.pages||(i.curr=e,t.render())});p&&s.on(p,"change",function(){var e=this.value;i.curr*e>i.count&&(i.curr=Math.ceil(i.count/e)),i.limit=e,t.render()}),u&&s.on(u,"click",function(){c()})}},u.prototype.skip=function(e){if(e){var a=this,t=e[n]("input")[0];t&&s.on(t,"keyup",function(t){var n=this.value,i=t.keyCode;/^(37|38|39|40)$/.test(i)||(/\D/.test(n)&&(this.value=n.replace(/\D/,"")),13===i&&a.jump(e,!0))})}},u.prototype.render=function(e){var n=this,i=n.config,r=n.type(),u=n.view();2===r?i.elem&&(i.elem.innerHTML=u):3===r?i.elem.html(u):a[t](i.elem)&&(a[t](i.elem).innerHTML=u),i.jump&&i.jump(i,e);var s=a[t]("layui-laypage-"+i.index);n.jump(s),i.hash&&!e&&(location.hash="!"+i.hash+"="+i.curr),n.skip(s)};var s={render:function(e){var a=new u(e);return a.index},index:layui.laypage?layui.laypage.index+1e4:0,on:function(e,a,t){return e.attachEvent?e.attachEvent("on"+a,function(a){a.target=a.srcElement,t.call(e,a)}):e.addEventListener(a,t,!1),this}};e(i,s)}); \ No newline at end of file diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/layui/lay/modules/laytpl.js b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/layui/lay/modules/laytpl.js new file mode 100644 index 0000000..d482d4e --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/layui/lay/modules/laytpl.js @@ -0,0 +1,2 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + ;layui.define(function(e){"use strict";var r={open:"{{",close:"}}"},c={exp:function(e){return new RegExp(e,"g")},query:function(e,c,t){var o=["#([\\s\\S])+?","([^{#}])*?"][e||0];return n((c||"")+r.open+o+r.close+(t||""))},escape:function(e){return String(e||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var c="Laytpl Error:";return"object"==typeof console&&console.error(c+e+"\n"+(r||"")),c+e}},n=c.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=n("^"+r.open+"#",""),l=n(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(n(r.open+"#"),r.open+"# ").replace(n(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(n(r.open+"!(.+?)!"+r.close),function(e){return e=e.replace(n("^"+r.open+"!"),"").replace(n("!"+r.close),"").replace(n(r.open+"|"+r.close),function(e){return e.replace(/(.)/g,"\\$1")})}).replace(/(?="|')/g,"\\").replace(c.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\/g,"")+';view+="'}).replace(c.query(1),function(e){var c='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(n(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),c='"+_escape_('),c+e.replace(/\\/g,"")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,c.escape)}catch(u){return delete o.cache,c.error(u,p)}},t.pt.render=function(e,r){var n,t=this;return e?(n=t.cache?t.cache(e,c.escape):t.parse(t.tpl,e),r?void r(n):n):c.error("no data")};var o=function(e){return"string"!=typeof e?c.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var c in e)r[c]=e[c]},o.v="1.2.0",e("laytpl",o)}); \ No newline at end of file diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/layui/lay/modules/mobile.js b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/layui/lay/modules/mobile.js new file mode 100644 index 0000000..35cfdf0 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/layui/lay/modules/mobile.js @@ -0,0 +1,2 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + ;layui.define(function(i){i("layui.mobile",layui.v)});layui.define(function(e){"use strict";var r={open:"{{",close:"}}"},c={exp:function(e){return new RegExp(e,"g")},query:function(e,c,t){var o=["#([\\s\\S])+?","([^{#}])*?"][e||0];return n((c||"")+r.open+o+r.close+(t||""))},escape:function(e){return String(e||"").replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var c="Laytpl Error:";return"object"==typeof console&&console.error(c+e+"\n"+(r||"")),c+e}},n=c.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=n("^"+r.open+"#",""),l=n(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(n(r.open+"#"),r.open+"# ").replace(n(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(n(r.open+"!(.+?)!"+r.close),function(e){return e=e.replace(n("^"+r.open+"!"),"").replace(n("!"+r.close),"").replace(n(r.open+"|"+r.close),function(e){return e.replace(/(.)/g,"\\$1")})}).replace(/(?="|')/g,"\\").replace(c.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\/g,"")+';view+="'}).replace(c.query(1),function(e){var c='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(n(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),c='"+_escape_('),c+e.replace(/\\/g,"")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,c.escape)}catch(u){return delete o.cache,c.error(u,p)}},t.pt.render=function(e,r){var n,t=this;return e?(n=t.cache?t.cache(e,c.escape):t.parse(t.tpl,e),r?void r(n):n):c.error("no data")};var o=function(e){return"string"!=typeof e?c.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var c in e)r[c]=e[c]},o.v="1.2.0",e("laytpl",o)});layui.define(function(e){"use strict";var t=(window,document),i="querySelectorAll",n="getElementsByClassName",a=function(e){return t[i](e)},s={type:0,shade:!0,shadeClose:!0,fixed:!0,anim:"scale"},l={extend:function(e){var t=JSON.parse(JSON.stringify(s));for(var i in e)t[i]=e[i];return t},timer:{},end:{}};l.touch=function(e,t){e.addEventListener("click",function(e){t.call(this,e)},!1)};var o=0,r=["layui-m-layer"],d=function(e){var t=this;t.config=l.extend(e),t.view()};d.prototype.view=function(){var e=this,i=e.config,s=t.createElement("div");e.id=s.id=r[0]+o,s.setAttribute("class",r[0]+" "+r[0]+(i.type||0)),s.setAttribute("index",o);var l=function(){var e="object"==typeof i.title;return i.title?'

                      '+(e?i.title[0]:i.title)+"

                      ":""}(),d=function(){"string"==typeof i.btn&&(i.btn=[i.btn]);var e,t=(i.btn||[]).length;return 0!==t&&i.btn?(e=''+i.btn[0]+"",2===t&&(e=''+i.btn[1]+""+e),'
                      '+e+"
                      "):""}();if(i.fixed||(i.top=i.hasOwnProperty("top")?i.top:100,i.style=i.style||"",i.style+=" top:"+(t.body.scrollTop+i.top)+"px"),2===i.type&&(i.content='

                      '+(i.content||"")+"

                      "),i.skin&&(i.anim="up"),"msg"===i.skin&&(i.shade=!1),s.innerHTML=(i.shade?"
                      ':"")+'
                      "+l+'
                      '+i.content+"
                      "+d+"
                      ",!i.type||2===i.type){var y=t[n](r[0]+i.type),u=y.length;u>=1&&c.close(y[0].getAttribute("index"))}document.body.appendChild(s);var m=e.elem=a("#"+e.id)[0];i.success&&i.success(m),e.index=o++,e.action(i,m)},d.prototype.action=function(e,t){var i=this;e.time&&(l.timer[i.index]=setTimeout(function(){c.close(i.index)},1e3*e.time));var a=function(){var t=this.getAttribute("type");0==t?(e.no&&e.no(),c.close(i.index)):e.yes?e.yes(i.index):c.close(i.index)};if(e.btn)for(var s=t[n]("layui-m-layerbtn")[0].children,o=s.length,r=0;r0&&e-1 in t)}function s(t){return A.call(t,function(t){return null!=t})}function u(t){return t.length>0?T.fn.concat.apply([],t):t}function c(t){return t.replace(/::/g,"/").replace(/([A-Z]+)([A-Z][a-z])/g,"$1_$2").replace(/([a-z\d])([A-Z])/g,"$1_$2").replace(/_/g,"-").toLowerCase()}function l(t){return t in F?F[t]:F[t]=new RegExp("(^|\\s)"+t+"(\\s|$)")}function f(t,e){return"number"!=typeof e||k[c(t)]?e:e+"px"}function h(t){var e,n;return $[t]||(e=L.createElement(t),L.body.appendChild(e),n=getComputedStyle(e,"").getPropertyValue("display"),e.parentNode.removeChild(e),"none"==n&&(n="block"),$[t]=n),$[t]}function p(t){return"children"in t?D.call(t.children):T.map(t.childNodes,function(t){if(1==t.nodeType)return t})}function d(t,e){var n,r=t?t.length:0;for(n=0;n]*>/,R=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,z=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,Z=/^(?:body|html)$/i,q=/([A-Z])/g,H=["val","css","html","text","data","width","height","offset"],I=["after","prepend","before","append"],V=L.createElement("table"),_=L.createElement("tr"),B={tr:L.createElement("tbody"),tbody:V,thead:V,tfoot:V,td:_,th:_,"*":L.createElement("div")},U=/complete|loaded|interactive/,X=/^[\w-]*$/,J={},W=J.toString,Y={},G=L.createElement("div"),K={tabindex:"tabIndex",readonly:"readOnly","for":"htmlFor","class":"className",maxlength:"maxLength",cellspacing:"cellSpacing",cellpadding:"cellPadding",rowspan:"rowSpan",colspan:"colSpan",usemap:"useMap",frameborder:"frameBorder",contenteditable:"contentEditable"},Q=Array.isArray||function(t){return t instanceof Array};return Y.matches=function(t,e){if(!e||!t||1!==t.nodeType)return!1;var n=t.matches||t.webkitMatchesSelector||t.mozMatchesSelector||t.oMatchesSelector||t.matchesSelector;if(n)return n.call(t,e);var r,i=t.parentNode,o=!i;return o&&(i=G).appendChild(t),r=~Y.qsa(i,e).indexOf(t),o&&G.removeChild(t),r},C=function(t){return t.replace(/-+(.)?/g,function(t,e){return e?e.toUpperCase():""})},N=function(t){return A.call(t,function(e,n){return t.indexOf(e)==n})},Y.fragment=function(t,e,n){var r,i,a;return R.test(t)&&(r=T(L.createElement(RegExp.$1))),r||(t.replace&&(t=t.replace(z,"<$1>")),e===E&&(e=M.test(t)&&RegExp.$1),e in B||(e="*"),a=B[e],a.innerHTML=""+t,r=T.each(D.call(a.childNodes),function(){a.removeChild(this)})),o(n)&&(i=T(r),T.each(n,function(t,e){H.indexOf(t)>-1?i[t](e):i.attr(t,e)})),r},Y.Z=function(t,e){return new d(t,e)},Y.isZ=function(t){return t instanceof Y.Z},Y.init=function(t,n){var r;if(!t)return Y.Z();if("string"==typeof t)if(t=t.trim(),"<"==t[0]&&M.test(t))r=Y.fragment(t,RegExp.$1,n),t=null;else{if(n!==E)return T(n).find(t);r=Y.qsa(L,t)}else{if(e(t))return T(L).ready(t);if(Y.isZ(t))return t;if(Q(t))r=s(t);else if(i(t))r=[t],t=null;else if(M.test(t))r=Y.fragment(t.trim(),RegExp.$1,n),t=null;else{if(n!==E)return T(n).find(t);r=Y.qsa(L,t)}}return Y.Z(r,t)},T=function(t,e){return Y.init(t,e)},T.extend=function(t){var e,n=D.call(arguments,1);return"boolean"==typeof t&&(e=t,t=n.shift()),n.forEach(function(n){m(t,n,e)}),t},Y.qsa=function(t,e){var n,r="#"==e[0],i=!r&&"."==e[0],o=r||i?e.slice(1):e,a=X.test(o);return t.getElementById&&a&&r?(n=t.getElementById(o))?[n]:[]:1!==t.nodeType&&9!==t.nodeType&&11!==t.nodeType?[]:D.call(a&&!r&&t.getElementsByClassName?i?t.getElementsByClassName(o):t.getElementsByTagName(e):t.querySelectorAll(e))},T.contains=L.documentElement.contains?function(t,e){return t!==e&&t.contains(e)}:function(t,e){for(;e&&(e=e.parentNode);)if(e===t)return!0;return!1},T.type=t,T.isFunction=e,T.isWindow=n,T.isArray=Q,T.isPlainObject=o,T.isEmptyObject=function(t){var e;for(e in t)return!1;return!0},T.isNumeric=function(t){var e=Number(t),n=typeof t;return null!=t&&"boolean"!=n&&("string"!=n||t.length)&&!isNaN(e)&&isFinite(e)||!1},T.inArray=function(t,e,n){return O.indexOf.call(e,t,n)},T.camelCase=C,T.trim=function(t){return null==t?"":String.prototype.trim.call(t)},T.uuid=0,T.support={},T.expr={},T.noop=function(){},T.map=function(t,e){var n,r,i,o=[];if(a(t))for(r=0;r=0?t:t+this.length]},toArray:function(){return this.get()},size:function(){return this.length},remove:function(){return this.each(function(){null!=this.parentNode&&this.parentNode.removeChild(this)})},each:function(t){return O.every.call(this,function(e,n){return t.call(e,n,e)!==!1}),this},filter:function(t){return e(t)?this.not(this.not(t)):T(A.call(this,function(e){return Y.matches(e,t)}))},add:function(t,e){return T(N(this.concat(T(t,e))))},is:function(t){return this.length>0&&Y.matches(this[0],t)},not:function(t){var n=[];if(e(t)&&t.call!==E)this.each(function(e){t.call(this,e)||n.push(this)});else{var r="string"==typeof t?this.filter(t):a(t)&&e(t.item)?D.call(t):T(t);this.forEach(function(t){r.indexOf(t)<0&&n.push(t)})}return T(n)},has:function(t){return this.filter(function(){return i(t)?T.contains(this,t):T(this).find(t).size()})},eq:function(t){return t===-1?this.slice(t):this.slice(t,+t+1)},first:function(){var t=this[0];return t&&!i(t)?t:T(t)},last:function(){var t=this[this.length-1];return t&&!i(t)?t:T(t)},find:function(t){var e,n=this;return e=t?"object"==typeof t?T(t).filter(function(){var t=this;return O.some.call(n,function(e){return T.contains(e,t)})}):1==this.length?T(Y.qsa(this[0],t)):this.map(function(){return Y.qsa(this,t)}):T()},closest:function(t,e){var n=[],i="object"==typeof t&&T(t);return this.each(function(o,a){for(;a&&!(i?i.indexOf(a)>=0:Y.matches(a,t));)a=a!==e&&!r(a)&&a.parentNode;a&&n.indexOf(a)<0&&n.push(a)}),T(n)},parents:function(t){for(var e=[],n=this;n.length>0;)n=T.map(n,function(t){if((t=t.parentNode)&&!r(t)&&e.indexOf(t)<0)return e.push(t),t});return v(e,t)},parent:function(t){return v(N(this.pluck("parentNode")),t)},children:function(t){return v(this.map(function(){return p(this)}),t)},contents:function(){return this.map(function(){return this.contentDocument||D.call(this.childNodes)})},siblings:function(t){return v(this.map(function(t,e){return A.call(p(e.parentNode),function(t){return t!==e})}),t)},empty:function(){return this.each(function(){this.innerHTML=""})},pluck:function(t){return T.map(this,function(e){return e[t]})},show:function(){return this.each(function(){"none"==this.style.display&&(this.style.display=""),"none"==getComputedStyle(this,"").getPropertyValue("display")&&(this.style.display=h(this.nodeName))})},replaceWith:function(t){return this.before(t).remove()},wrap:function(t){var n=e(t);if(this[0]&&!n)var r=T(t).get(0),i=r.parentNode||this.length>1;return this.each(function(e){T(this).wrapAll(n?t.call(this,e):i?r.cloneNode(!0):r)})},wrapAll:function(t){if(this[0]){T(this[0]).before(t=T(t));for(var e;(e=t.children()).length;)t=e.first();T(t).append(this)}return this},wrapInner:function(t){var n=e(t);return this.each(function(e){var r=T(this),i=r.contents(),o=n?t.call(this,e):t;i.length?i.wrapAll(o):r.append(o)})},unwrap:function(){return this.parent().each(function(){T(this).replaceWith(T(this).children())}),this},clone:function(){return this.map(function(){return this.cloneNode(!0)})},hide:function(){return this.css("display","none")},toggle:function(t){return this.each(function(){var e=T(this);(t===E?"none"==e.css("display"):t)?e.show():e.hide()})},prev:function(t){return T(this.pluck("previousElementSibling")).filter(t||"*")},next:function(t){return T(this.pluck("nextElementSibling")).filter(t||"*")},html:function(t){return 0 in arguments?this.each(function(e){var n=this.innerHTML;T(this).empty().append(g(this,t,e,n))}):0 in this?this[0].innerHTML:null},text:function(t){return 0 in arguments?this.each(function(e){var n=g(this,t,e,this.textContent);this.textContent=null==n?"":""+n}):0 in this?this.pluck("textContent").join(""):null},attr:function(t,e){var n;return"string"!=typeof t||1 in arguments?this.each(function(n){if(1===this.nodeType)if(i(t))for(j in t)y(this,j,t[j]);else y(this,t,g(this,e,n,this.getAttribute(t)))}):0 in this&&1==this[0].nodeType&&null!=(n=this[0].getAttribute(t))?n:E},removeAttr:function(t){return this.each(function(){1===this.nodeType&&t.split(" ").forEach(function(t){y(this,t)},this)})},prop:function(t,e){return t=K[t]||t,1 in arguments?this.each(function(n){this[t]=g(this,e,n,this[t])}):this[0]&&this[0][t]},removeProp:function(t){return t=K[t]||t,this.each(function(){delete this[t]})},data:function(t,e){var n="data-"+t.replace(q,"-$1").toLowerCase(),r=1 in arguments?this.attr(n,e):this.attr(n);return null!==r?b(r):E},val:function(t){return 0 in arguments?(null==t&&(t=""),this.each(function(e){this.value=g(this,t,e,this.value)})):this[0]&&(this[0].multiple?T(this[0]).find("option").filter(function(){return this.selected}).pluck("value"):this[0].value)},offset:function(t){if(t)return this.each(function(e){var n=T(this),r=g(this,t,e,n.offset()),i=n.offsetParent().offset(),o={top:r.top-i.top,left:r.left-i.left};"static"==n.css("position")&&(o.position="relative"),n.css(o)});if(!this.length)return null;if(L.documentElement!==this[0]&&!T.contains(L.documentElement,this[0]))return{top:0,left:0};var e=this[0].getBoundingClientRect();return{left:e.left+window.pageXOffset,top:e.top+window.pageYOffset,width:Math.round(e.width),height:Math.round(e.height)}},css:function(e,n){if(arguments.length<2){var r=this[0];if("string"==typeof e){if(!r)return;return r.style[C(e)]||getComputedStyle(r,"").getPropertyValue(e)}if(Q(e)){if(!r)return;var i={},o=getComputedStyle(r,"");return T.each(e,function(t,e){i[e]=r.style[C(e)]||o.getPropertyValue(e)}),i}}var a="";if("string"==t(e))n||0===n?a=c(e)+":"+f(e,n):this.each(function(){this.style.removeProperty(c(e))});else for(j in e)e[j]||0===e[j]?a+=c(j)+":"+f(j,e[j])+";":this.each(function(){this.style.removeProperty(c(j))});return this.each(function(){this.style.cssText+=";"+a})},index:function(t){return t?this.indexOf(T(t)[0]):this.parent().children().indexOf(this[0])},hasClass:function(t){return!!t&&O.some.call(this,function(t){return this.test(x(t))},l(t))},addClass:function(t){return t?this.each(function(e){if("className"in this){S=[];var n=x(this),r=g(this,t,e,n);r.split(/\s+/g).forEach(function(t){T(this).hasClass(t)||S.push(t)},this),S.length&&x(this,n+(n?" ":"")+S.join(" "))}}):this},removeClass:function(t){return this.each(function(e){if("className"in this){if(t===E)return x(this,"");S=x(this),g(this,t,e,S).split(/\s+/g).forEach(function(t){S=S.replace(l(t)," ")}),x(this,S.trim())}})},toggleClass:function(t,e){return t?this.each(function(n){var r=T(this),i=g(this,t,n,x(this));i.split(/\s+/g).forEach(function(t){(e===E?!r.hasClass(t):e)?r.addClass(t):r.removeClass(t)})}):this},scrollTop:function(t){if(this.length){var e="scrollTop"in this[0];return t===E?e?this[0].scrollTop:this[0].pageYOffset:this.each(e?function(){this.scrollTop=t}:function(){this.scrollTo(this.scrollX,t)})}},scrollLeft:function(t){if(this.length){var e="scrollLeft"in this[0];return t===E?e?this[0].scrollLeft:this[0].pageXOffset:this.each(e?function(){this.scrollLeft=t}:function(){this.scrollTo(t,this.scrollY)})}},position:function(){if(this.length){var t=this[0],e=this.offsetParent(),n=this.offset(),r=Z.test(e[0].nodeName)?{top:0,left:0}:e.offset();return n.top-=parseFloat(T(t).css("margin-top"))||0,n.left-=parseFloat(T(t).css("margin-left"))||0,r.top+=parseFloat(T(e[0]).css("border-top-width"))||0,r.left+=parseFloat(T(e[0]).css("border-left-width"))||0,{top:n.top-r.top,left:n.left-r.left}}},offsetParent:function(){return this.map(function(){for(var t=this.offsetParent||L.body;t&&!Z.test(t.nodeName)&&"static"==T(t).css("position");)t=t.offsetParent;return t})}},T.fn.detach=T.fn.remove,["width","height"].forEach(function(t){var e=t.replace(/./,function(t){return t[0].toUpperCase()});T.fn[t]=function(i){var o,a=this[0];return i===E?n(a)?a["inner"+e]:r(a)?a.documentElement["scroll"+e]:(o=this.offset())&&o[t]:this.each(function(e){a=T(this),a.css(t,g(this,i,e,a[t]()))})}}),I.forEach(function(e,n){var r=n%2;T.fn[e]=function(){var e,i,o=T.map(arguments,function(n){var r=[];return e=t(n),"array"==e?(n.forEach(function(t){return t.nodeType!==E?r.push(t):T.zepto.isZ(t)?r=r.concat(t.get()):void(r=r.concat(Y.fragment(t)))}),r):"object"==e||null==n?n:Y.fragment(n)}),a=this.length>1;return o.length<1?this:this.each(function(t,e){i=r?e:e.parentNode,e=0==n?e.nextSibling:1==n?e.firstChild:2==n?e:null;var s=T.contains(L.documentElement,i);o.forEach(function(t){if(a)t=t.cloneNode(!0);else if(!i)return T(t).remove();i.insertBefore(t,e),s&&w(t,function(t){if(!(null==t.nodeName||"SCRIPT"!==t.nodeName.toUpperCase()||t.type&&"text/javascript"!==t.type||t.src)){var e=t.ownerDocument?t.ownerDocument.defaultView:window;e.eval.call(e,t.innerHTML)}})})})},T.fn[r?e+"To":"insert"+(n?"Before":"After")]=function(t){return T(t)[e](this),this}}),Y.Z.prototype=d.prototype=T.fn,Y.uniq=N,Y.deserializeValue=b,T.zepto=Y,T}();!function(t){function e(t){return t._zid||(t._zid=h++)}function n(t,n,o,a){if(n=r(n),n.ns)var s=i(n.ns);return(v[e(t)]||[]).filter(function(t){return t&&(!n.e||t.e==n.e)&&(!n.ns||s.test(t.ns))&&(!o||e(t.fn)===e(o))&&(!a||t.sel==a)})}function r(t){var e=(""+t).split(".");return{e:e[0],ns:e.slice(1).sort().join(" ")}}function i(t){return new RegExp("(?:^| )"+t.replace(" "," .* ?")+"(?: |$)")}function o(t,e){return t.del&&!y&&t.e in x||!!e}function a(t){return b[t]||y&&x[t]||t}function s(n,i,s,u,l,h,p){var d=e(n),m=v[d]||(v[d]=[]);i.split(/\s/).forEach(function(e){if("ready"==e)return t(document).ready(s);var i=r(e);i.fn=s,i.sel=l,i.e in b&&(s=function(e){var n=e.relatedTarget;if(!n||n!==this&&!t.contains(this,n))return i.fn.apply(this,arguments)}),i.del=h;var d=h||s;i.proxy=function(t){if(t=c(t),!t.isImmediatePropagationStopped()){t.data=u;var e=d.apply(n,t._args==f?[t]:[t].concat(t._args));return e===!1&&(t.preventDefault(),t.stopPropagation()),e}},i.i=m.length,m.push(i),"addEventListener"in n&&n.addEventListener(a(i.e),i.proxy,o(i,p))})}function u(t,r,i,s,u){var c=e(t);(r||"").split(/\s/).forEach(function(e){n(t,e,i,s).forEach(function(e){delete v[c][e.i],"removeEventListener"in t&&t.removeEventListener(a(e.e),e.proxy,o(e,u))})})}function c(e,n){return!n&&e.isDefaultPrevented||(n||(n=e),t.each(T,function(t,r){var i=n[t];e[t]=function(){return this[r]=w,i&&i.apply(n,arguments)},e[r]=E}),e.timeStamp||(e.timeStamp=Date.now()),(n.defaultPrevented!==f?n.defaultPrevented:"returnValue"in n?n.returnValue===!1:n.getPreventDefault&&n.getPreventDefault())&&(e.isDefaultPrevented=w)),e}function l(t){var e,n={originalEvent:t};for(e in t)j.test(e)||t[e]===f||(n[e]=t[e]);return c(n,t)}var f,h=1,p=Array.prototype.slice,d=t.isFunction,m=function(t){return"string"==typeof t},v={},g={},y="onfocusin"in window,x={focus:"focusin",blur:"focusout"},b={mouseenter:"mouseover",mouseleave:"mouseout"};g.click=g.mousedown=g.mouseup=g.mousemove="MouseEvents",t.event={add:s,remove:u},t.proxy=function(n,r){var i=2 in arguments&&p.call(arguments,2);if(d(n)){var o=function(){return n.apply(r,i?i.concat(p.call(arguments)):arguments)};return o._zid=e(n),o}if(m(r))return i?(i.unshift(n[r],n),t.proxy.apply(null,i)):t.proxy(n[r],n);throw new TypeError("expected function")},t.fn.bind=function(t,e,n){return this.on(t,e,n)},t.fn.unbind=function(t,e){return this.off(t,e)},t.fn.one=function(t,e,n,r){return this.on(t,e,n,r,1)};var w=function(){return!0},E=function(){return!1},j=/^([A-Z]|returnValue$|layer[XY]$|webkitMovement[XY]$)/,T={preventDefault:"isDefaultPrevented",stopImmediatePropagation:"isImmediatePropagationStopped",stopPropagation:"isPropagationStopped"};t.fn.delegate=function(t,e,n){return this.on(e,t,n)},t.fn.undelegate=function(t,e,n){return this.off(e,t,n)},t.fn.live=function(e,n){return t(document.body).delegate(this.selector,e,n),this},t.fn.die=function(e,n){return t(document.body).undelegate(this.selector,e,n),this},t.fn.on=function(e,n,r,i,o){var a,c,h=this;return e&&!m(e)?(t.each(e,function(t,e){h.on(t,n,r,e,o)}),h):(m(n)||d(i)||i===!1||(i=r,r=n,n=f),i!==f&&r!==!1||(i=r,r=f),i===!1&&(i=E),h.each(function(f,h){o&&(a=function(t){return u(h,t.type,i),i.apply(this,arguments)}),n&&(c=function(e){var r,o=t(e.target).closest(n,h).get(0);if(o&&o!==h)return r=t.extend(l(e),{currentTarget:o,liveFired:h}),(a||i).apply(o,[r].concat(p.call(arguments,1)))}),s(h,e,i,r,n,c||a)}))},t.fn.off=function(e,n,r){var i=this;return e&&!m(e)?(t.each(e,function(t,e){i.off(t,n,e)}),i):(m(n)||d(r)||r===!1||(r=n,n=f),r===!1&&(r=E),i.each(function(){u(this,e,r,n)}))},t.fn.trigger=function(e,n){return e=m(e)||t.isPlainObject(e)?t.Event(e):c(e),e._args=n,this.each(function(){e.type in x&&"function"==typeof this[e.type]?this[e.type]():"dispatchEvent"in this?this.dispatchEvent(e):t(this).triggerHandler(e,n)})},t.fn.triggerHandler=function(e,r){var i,o;return this.each(function(a,s){i=l(m(e)?t.Event(e):e),i._args=r,i.target=s,t.each(n(s,e.type||e),function(t,e){if(o=e.proxy(i),i.isImmediatePropagationStopped())return!1})}),o},"focusin focusout focus blur load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select keydown keypress keyup error".split(" ").forEach(function(e){t.fn[e]=function(t){return 0 in arguments?this.bind(e,t):this.trigger(e)}}),t.Event=function(t,e){m(t)||(e=t,t=e.type);var n=document.createEvent(g[t]||"Events"),r=!0;if(e)for(var i in e)"bubbles"==i?r=!!e[i]:n[i]=e[i];return n.initEvent(t,r,!0),c(n)}}(e),function(t){function e(e,n,r){var i=t.Event(n);return t(e).trigger(i,r),!i.isDefaultPrevented()}function n(t,n,r,i){if(t.global)return e(n||x,r,i)}function r(e){e.global&&0===t.active++&&n(e,null,"ajaxStart")}function i(e){e.global&&!--t.active&&n(e,null,"ajaxStop")}function o(t,e){var r=e.context;return e.beforeSend.call(r,t,e)!==!1&&n(e,r,"ajaxBeforeSend",[t,e])!==!1&&void n(e,r,"ajaxSend",[t,e])}function a(t,e,r,i){var o=r.context,a="success";r.success.call(o,t,a,e),i&&i.resolveWith(o,[t,a,e]),n(r,o,"ajaxSuccess",[e,r,t]),u(a,e,r)}function s(t,e,r,i,o){var a=i.context;i.error.call(a,r,e,t),o&&o.rejectWith(a,[r,e,t]),n(i,a,"ajaxError",[r,i,t||e]),u(e,r,i)}function u(t,e,r){var o=r.context;r.complete.call(o,e,t),n(r,o,"ajaxComplete",[e,r]),i(r)}function c(t,e,n){if(n.dataFilter==l)return t;var r=n.context;return n.dataFilter.call(r,t,e)}function l(){}function f(t){return t&&(t=t.split(";",2)[0]),t&&(t==T?"html":t==j?"json":w.test(t)?"script":E.test(t)&&"xml")||"text"}function h(t,e){return""==e?t:(t+"&"+e).replace(/[&?]{1,2}/,"?")}function p(e){e.processData&&e.data&&"string"!=t.type(e.data)&&(e.data=t.param(e.data,e.traditional)),!e.data||e.type&&"GET"!=e.type.toUpperCase()&&"jsonp"!=e.dataType||(e.url=h(e.url,e.data),e.data=void 0)}function d(e,n,r,i){return t.isFunction(n)&&(i=r,r=n,n=void 0),t.isFunction(r)||(i=r,r=void 0),{url:e,data:n,success:r,dataType:i}}function m(e,n,r,i){var o,a=t.isArray(n),s=t.isPlainObject(n);t.each(n,function(n,u){o=t.type(u),i&&(n=r?i:i+"["+(s||"object"==o||"array"==o?n:"")+"]"),!i&&a?e.add(u.name,u.value):"array"==o||!r&&"object"==o?m(e,u,r,n):e.add(n,u)})}var v,g,y=+new Date,x=window.document,b=/)<[^<]*)*<\/script>/gi,w=/^(?:text|application)\/javascript/i,E=/^(?:text|application)\/xml/i,j="application/json",T="text/html",S=/^\s*$/,C=x.createElement("a");C.href=window.location.href,t.active=0,t.ajaxJSONP=function(e,n){if(!("type"in e))return t.ajax(e);var r,i,u=e.jsonpCallback,c=(t.isFunction(u)?u():u)||"Zepto"+y++,l=x.createElement("script"),f=window[c],h=function(e){t(l).triggerHandler("error",e||"abort")},p={abort:h};return n&&n.promise(p),t(l).on("load error",function(o,u){clearTimeout(i),t(l).off().remove(),"error"!=o.type&&r?a(r[0],p,e,n):s(null,u||"error",p,e,n),window[c]=f,r&&t.isFunction(f)&&f(r[0]),f=r=void 0}),o(p,e)===!1?(h("abort"),p):(window[c]=function(){r=arguments},l.src=e.url.replace(/\?(.+)=\?/,"?$1="+c),x.head.appendChild(l),e.timeout>0&&(i=setTimeout(function(){h("timeout")},e.timeout)),p)},t.ajaxSettings={type:"GET",beforeSend:l,success:l,error:l,complete:l,context:null,global:!0,xhr:function(){return new window.XMLHttpRequest},accepts:{script:"text/javascript, application/javascript, application/x-javascript",json:j,xml:"application/xml, text/xml",html:T,text:"text/plain"},crossDomain:!1,timeout:0,processData:!0,cache:!0,dataFilter:l},t.ajax=function(e){var n,i,u=t.extend({},e||{}),d=t.Deferred&&t.Deferred();for(v in t.ajaxSettings)void 0===u[v]&&(u[v]=t.ajaxSettings[v]);r(u),u.crossDomain||(n=x.createElement("a"),n.href=u.url,n.href=n.href,u.crossDomain=C.protocol+"//"+C.host!=n.protocol+"//"+n.host),u.url||(u.url=window.location.toString()),(i=u.url.indexOf("#"))>-1&&(u.url=u.url.slice(0,i)),p(u);var m=u.dataType,y=/\?.+=\?/.test(u.url);if(y&&(m="jsonp"),u.cache!==!1&&(e&&e.cache===!0||"script"!=m&&"jsonp"!=m)||(u.url=h(u.url,"_="+Date.now())),"jsonp"==m)return y||(u.url=h(u.url,u.jsonp?u.jsonp+"=?":u.jsonp===!1?"":"callback=?")),t.ajaxJSONP(u,d);var b,w=u.accepts[m],E={},j=function(t,e){E[t.toLowerCase()]=[t,e]},T=/^([\w-]+:)\/\//.test(u.url)?RegExp.$1:window.location.protocol,N=u.xhr(),O=N.setRequestHeader;if(d&&d.promise(N),u.crossDomain||j("X-Requested-With","XMLHttpRequest"),j("Accept",w||"*/*"),(w=u.mimeType||w)&&(w.indexOf(",")>-1&&(w=w.split(",",2)[0]),N.overrideMimeType&&N.overrideMimeType(w)),(u.contentType||u.contentType!==!1&&u.data&&"GET"!=u.type.toUpperCase())&&j("Content-Type",u.contentType||"application/x-www-form-urlencoded"),u.headers)for(g in u.headers)j(g,u.headers[g]);if(N.setRequestHeader=j,N.onreadystatechange=function(){if(4==N.readyState){N.onreadystatechange=l,clearTimeout(b);var e,n=!1;if(N.status>=200&&N.status<300||304==N.status||0==N.status&&"file:"==T){if(m=m||f(u.mimeType||N.getResponseHeader("content-type")),"arraybuffer"==N.responseType||"blob"==N.responseType)e=N.response;else{e=N.responseText;try{e=c(e,m,u),"script"==m?(0,eval)(e):"xml"==m?e=N.responseXML:"json"==m&&(e=S.test(e)?null:t.parseJSON(e))}catch(r){n=r}if(n)return s(n,"parsererror",N,u,d)}a(e,N,u,d)}else s(N.statusText||null,N.status?"error":"abort",N,u,d)}},o(N,u)===!1)return N.abort(),s(null,"abort",N,u,d),N;var P=!("async"in u)||u.async;if(N.open(u.type,u.url,P,u.username,u.password),u.xhrFields)for(g in u.xhrFields)N[g]=u.xhrFields[g];for(g in E)O.apply(N,E[g]);return u.timeout>0&&(b=setTimeout(function(){N.onreadystatechange=l,N.abort(),s(null,"timeout",N,u,d)},u.timeout)),N.send(u.data?u.data:null),N},t.get=function(){return t.ajax(d.apply(null,arguments))},t.post=function(){var e=d.apply(null,arguments);return e.type="POST",t.ajax(e)},t.getJSON=function(){var e=d.apply(null,arguments);return e.dataType="json",t.ajax(e)},t.fn.load=function(e,n,r){if(!this.length)return this;var i,o=this,a=e.split(/\s/),s=d(e,n,r),u=s.success;return a.length>1&&(s.url=a[0],i=a[1]),s.success=function(e){o.html(i?t("
                      ").html(e.replace(b,"")).find(i):e),u&&u.apply(o,arguments)},t.ajax(s),this};var N=encodeURIComponent;t.param=function(e,n){var r=[];return r.add=function(e,n){t.isFunction(n)&&(n=n()),null==n&&(n=""),this.push(N(e)+"="+N(n))},m(r,e,n),r.join("&").replace(/%20/g,"+")}}(e),function(t){t.fn.serializeArray=function(){var e,n,r=[],i=function(t){return t.forEach?t.forEach(i):void r.push({name:e,value:t})};return this[0]&&t.each(this[0].elements,function(r,o){n=o.type,e=o.name,e&&"fieldset"!=o.nodeName.toLowerCase()&&!o.disabled&&"submit"!=n&&"reset"!=n&&"button"!=n&&"file"!=n&&("radio"!=n&&"checkbox"!=n||o.checked)&&i(t(o).val())}),r},t.fn.serialize=function(){var t=[];return this.serializeArray().forEach(function(e){t.push(encodeURIComponent(e.name)+"="+encodeURIComponent(e.value))}),t.join("&")},t.fn.submit=function(e){if(0 in arguments)this.bind("submit",e);else if(this.length){var n=t.Event("submit");this.eq(0).trigger(n),n.isDefaultPrevented()||this.get(0).submit()}return this}}(e),function(){try{getComputedStyle(void 0)}catch(t){var e=getComputedStyle;window.getComputedStyle=function(t,n){try{return e(t,n)}catch(r){return null}}}}(),t("zepto",e)});layui.define(["layer-mobile","zepto"],function(e){"use strict";var t=layui.zepto,a=layui["layer-mobile"],i=(layui.device(),"layui-upload-enter"),n="layui-upload-iframe",r={icon:2,shift:6},o={file:"文件",video:"视频",audio:"音频"};a.msg=function(e){return a.open({content:e||"",skin:"msg",time:2})};var s=function(e){this.options=e};s.prototype.init=function(){var e=this,a=e.options,r=t("body"),s=t(a.elem||".layui-upload-file"),u=t('');return t("#"+n)[0]||r.append(u),s.each(function(r,s){s=t(s);var u='
                      ',l=s.attr("lay-type")||a.type;a.unwrap||(u='
                      '+u+''+(s.attr("lay-title")||a.title||"上传"+(o[l]||"图片"))+"
                      "),u=t(u),a.unwrap||u.on("dragover",function(e){e.preventDefault(),t(this).addClass(i)}).on("dragleave",function(){t(this).removeClass(i)}).on("drop",function(){t(this).removeClass(i)}),s.parent("form").attr("target")===n&&(a.unwrap?s.unwrap():(s.parent().next().remove(),s.unwrap().unwrap())),s.wrap(u),s.off("change").on("change",function(){e.action(this,l)})})},s.prototype.action=function(e,i){var o=this,s=o.options,u=e.value,l=t(e),p=l.attr("lay-ext")||s.ext||"";if(u){switch(i){case"file":if(p&&!RegExp("\\w\\.("+p+")$","i").test(escape(u)))return a.msg("不支持该文件格式",r),e.value="";break;case"video":if(!RegExp("\\w\\.("+(p||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(u)))return a.msg("不支持该视频格式",r),e.value="";break;case"audio":if(!RegExp("\\w\\.("+(p||"mp3|wav|mid")+")$","i").test(escape(u)))return a.msg("不支持该音频格式",r),e.value="";break;default:if(!RegExp("\\w\\.("+(p||"jpg|png|gif|bmp|jpeg")+")$","i").test(escape(u)))return a.msg("不支持该图片格式",r),e.value=""}s.before&&s.before(e),l.parent().submit();var c=t("#"+n),f=setInterval(function(){var t;try{t=c.contents().find("body").text()}catch(i){a.msg("上传接口存在跨域",r),clearInterval(f)}if(t){clearInterval(f),c.contents().find("body").html("");try{t=JSON.parse(t)}catch(i){return t={},a.msg("请对上传接口返回JSON字符",r)}"function"==typeof s.success&&s.success(t,e)}},30);e.value=""}},e("upload-mobile",function(e){var t=new s(e=e||{});t.init()})});layui.define(function(i){i("layim-mobile",layui.v)});layui["layui.mobile"]||layui.config({base:layui.cache.dir+"lay/modules/mobile/"}).extend({"layer-mobile":"layer-mobile",zepto:"zepto","upload-mobile":"upload-mobile","layim-mobile":"layim-mobile"}),layui.define(["layer-mobile","zepto","layim-mobile"],function(l){l("mobile",{layer:layui["layer-mobile"],layim:layui["layim-mobile"]})}); \ No newline at end of file diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/layui/lay/modules/rate.js b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/layui/lay/modules/rate.js new file mode 100644 index 0000000..762fb3a --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/layui/lay/modules/rate.js @@ -0,0 +1,2 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + ;layui.define("jquery",function(e){"use strict";var a=layui.jquery,i={config:{},index:layui.rate?layui.rate.index+1e4:0,set:function(e){var i=this;return i.config=a.extend({},i.config,e),i},on:function(e,a){return layui.onevent.call(this,n,e,a)}},l=function(){var e=this,a=e.config;return{setvalue:function(a){e.setvalue.call(e,a)},config:a}},n="rate",t="layui-rate",o="layui-icon-rate",s="layui-icon-rate-solid",u="layui-icon-rate-half",r="layui-icon-rate-solid layui-icon-rate-half",c="layui-icon-rate-solid layui-icon-rate",f="layui-icon-rate layui-icon-rate-half",v=function(e){var l=this;l.index=++i.index,l.config=a.extend({},l.config,i.config,e),l.render()};v.prototype.config={length:5,text:!1,readonly:!1,half:!1,value:0,theme:""},v.prototype.render=function(){var e=this,i=e.config,l=i.theme?'style="color: '+i.theme+';"':"";i.elem=a(i.elem),parseInt(i.value)!==i.value&&(i.half||(i.value=Math.ceil(i.value)-i.value<.5?Math.ceil(i.value):Math.floor(i.value)));for(var n='
                        ",u=1;u<=i.length;u++){var r='
                      • ";i.half&&parseInt(i.value)!==i.value&&u==Math.ceil(i.value)?n=n+'
                      • ":n+=r}n+="
                      "+(i.text?''+i.value+"星":"")+"";var c=i.elem,f=c.next("."+t);f[0]&&f.remove(),e.elemTemp=a(n),i.span=e.elemTemp.next("span"),i.setText&&i.setText(i.value),c.html(e.elemTemp),c.addClass("layui-inline"),i.readonly||e.action()},v.prototype.setvalue=function(e){var a=this,i=a.config;i.value=e,a.render()},v.prototype.action=function(){var e=this,i=e.config,l=e.elemTemp,n=l.find("i").width();l.children("li").each(function(e){var t=e+1,v=a(this);v.on("click",function(e){if(i.value=t,i.half){var o=e.pageX-a(this).offset().left;o<=n/2&&(i.value=i.value-.5)}i.text&&l.next("span").text(i.value+"星"),i.choose&&i.choose(i.value),i.setText&&i.setText(i.value)}),v.on("mousemove",function(e){if(l.find("i").each(function(){a(this).addClass(o).removeClass(r)}),l.find("i:lt("+t+")").each(function(){a(this).addClass(s).removeClass(f)}),i.half){var c=e.pageX-a(this).offset().left;c<=n/2&&v.children("i").addClass(u).removeClass(s)}}),v.on("mouseleave",function(){l.find("i").each(function(){a(this).addClass(o).removeClass(r)}),l.find("i:lt("+Math.floor(i.value)+")").each(function(){a(this).addClass(s).removeClass(f)}),i.half&&parseInt(i.value)!==i.value&&l.children("li:eq("+Math.floor(i.value)+")").children("i").addClass(u).removeClass(c)})})},v.prototype.events=function(){var e=this;e.config},i.render=function(e){var a=new v(e);return l.call(a)},e(n,i)}); \ No newline at end of file diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/layui/lay/modules/slider.js b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/layui/lay/modules/slider.js new file mode 100644 index 0000000..446378d --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/layui/lay/modules/slider.js @@ -0,0 +1,2 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + ;layui.define("jquery",function(e){"use strict";var i=layui.jquery,t={config:{},index:layui.slider?layui.slider.index+1e4:0,set:function(e){var t=this;return t.config=i.extend({},t.config,e),t},on:function(e,i){return layui.onevent.call(this,n,e,i)}},a=function(){var e=this,i=e.config;return{setValue:function(i,t){return e.slide("set",i,t||0)},config:i}},n="slider",l="layui-disabled",s="layui-slider",r="layui-slider-bar",o="layui-slider-wrap",u="layui-slider-wrap-btn",d="layui-slider-tips",v="layui-slider-input",c="layui-slider-input-txt",m="layui-slider-input-btn",p="layui-slider-hover",f=function(e){var a=this;a.index=++t.index,a.config=i.extend({},a.config,t.config,e),a.render()};f.prototype.config={type:"default",min:0,max:100,value:0,step:1,showstep:!1,tips:!0,input:!1,range:!1,height:200,disabled:!1,theme:"#009688"},f.prototype.render=function(){var e=this,t=e.config;if(t.step<1&&(t.step=1),t.maxt.min?a:t.min,t.value[1]=n>t.min?n:t.min,t.value[0]=t.value[0]>t.max?t.max:t.value[0],t.value[1]=t.value[1]>t.max?t.max:t.value[1];var r=Math.floor((t.value[0]-t.min)/(t.max-t.min)*100),v=Math.floor((t.value[1]-t.min)/(t.max-t.min)*100),m=v-r+"%";r+="%",v+="%"}else{"object"==typeof t.value&&(t.value=Math.min.apply(null,t.value)),t.valuet.max&&(t.value=t.max);var m=Math.floor((t.value-t.min)/(t.max-t.min)*100)+"%"}var p=t.disabled?"#c2c2c2":t.theme,f='
                      '+(t.tips?'
                      ':"")+'
                      '+(t.range?'
                      ':"")+"
                      ",h=i(t.elem),y=h.next("."+s);if(y[0]&&y.remove(),e.elemTemp=i(f),t.range?(e.elemTemp.find("."+o).eq(0).data("value",t.value[0]),e.elemTemp.find("."+o).eq(1).data("value",t.value[1])):e.elemTemp.find("."+o).data("value",t.value),h.html(e.elemTemp),"vertical"===t.type&&e.elemTemp.height(t.height+"px"),t.showstep){for(var g=(t.max-t.min)/t.step,b="",x=1;x
                      ')}e.elemTemp.append(b)}if(t.input&&!t.range){var w=i('
                      ');h.css("position","relative"),h.append(w),h.find("."+c).children("input").val(t.value),"vertical"===t.type?w.css({left:0,top:-48}):e.elemTemp.css("margin-right",w.outerWidth()+15)}t.disabled?(e.elemTemp.addClass(l),e.elemTemp.find("."+u).addClass(l)):e.slide(),e.elemTemp.find("."+u).on("mouseover",function(){var a="vertical"===t.type?t.height:e.elemTemp[0].offsetWidth,n=e.elemTemp.find("."+o),l="vertical"===t.type?a-i(this).parent()[0].offsetTop-n.height():i(this).parent()[0].offsetLeft,s=l/a*100,r=i(this).parent().data("value"),u=t.setTips?t.setTips(r):r;e.elemTemp.find("."+d).html(u),"vertical"===t.type?e.elemTemp.find("."+d).css({bottom:s+"%","margin-bottom":"20px",display:"inline-block"}):e.elemTemp.find("."+d).css({left:s+"%",display:"inline-block"})}).on("mouseout",function(){e.elemTemp.find("."+d).css("display","none")})},f.prototype.slide=function(e,t,a){var n=this,l=n.config,s=n.elemTemp,f=function(){return"vertical"===l.type?l.height:s[0].offsetWidth},h=s.find("."+o),y=s.next("."+v),g=y.children("."+c).children("input").val(),b=100/((l.max-l.min)/Math.ceil(l.step)),x=function(e,i){e=Math.ceil(e)*b>100?Math.ceil(e)*b:Math.round(e)*b,e=e>100?100:e,h.eq(i).css("vertical"===l.type?"bottom":"left",e+"%");var t=T(h[0].offsetLeft),a=l.range?T(h[1].offsetLeft):0;"vertical"===l.type?(s.find("."+d).css({bottom:e+"%","margin-bottom":"20px"}),t=T(f()-h[0].offsetTop-h.height()),a=l.range?T(f()-h[1].offsetTop-h.height()):0):s.find("."+d).css("left",e+"%"),t=t>100?100:t,a=a>100?100:a;var n=Math.min(t,a),o=Math.abs(t-a);"vertical"===l.type?s.find("."+r).css({height:o+"%",bottom:n+"%"}):s.find("."+r).css({width:o+"%",left:n+"%"});var u=l.min+Math.round((l.max-l.min)*e/100);if(g=u,y.children("."+c).children("input").val(g),h.eq(i).data("value",u),u=l.setTips?l.setTips(u):u,s.find("."+d).html(u),l.range){var v=[h.eq(0).data("value"),h.eq(1).data("value")];v[0]>v[1]&&v.reverse()}l.change&&l.change(l.range?v:u)},T=function(e){var i=e/f()*100/b,t=Math.round(i)*b;return e==f()&&(t=Math.ceil(i)*b),t},w=i(['
                      f()&&(r=f());var o=r/f()*100/b;x(o,e),t.addClass(p),s.find("."+d).show(),i.preventDefault()},o=function(){t.removeClass(p),s.find("."+d).hide()};M(r,o)})}),s.on("click",function(e){var t=i("."+u);if(!t.is(event.target)&&0===t.has(event.target).length&&t.length){var a,n="vertical"===l.type?f()-e.clientY+i(this).offset().top:e.clientX-i(this).offset().left;n<0&&(n=0),n>f()&&(n=f());var s=n/f()*100/b;a=l.range?"vertical"===l.type?Math.abs(n-parseInt(i(h[0]).css("bottom")))>Math.abs(n-parseInt(i(h[1]).css("bottom")))?1:0:Math.abs(n-h[0].offsetLeft)>Math.abs(n-h[1].offsetLeft)?1:0:0,x(s,a),e.preventDefault()}}),y.hover(function(){var e=i(this);e.children("."+m).fadeIn("fast")},function(){var e=i(this);e.children("."+m).fadeOut("fast")}),y.children("."+m).children("i").each(function(e){i(this).on("click",function(){g=1==e?g-l.stepl.max?l.max:Number(g)+l.step;var i=(g-l.min)/(l.max-l.min)*100/b;x(i,0)})});var q=function(){var e=this.value;e=isNaN(e)?0:e,e=el.max?l.max:e,this.value=e;var i=(e-l.min)/(l.max-l.min)*100/b;x(i,0)};y.children("."+c).children("input").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),q.call(this))}).on("change",q)},f.prototype.events=function(){var e=this;e.config},t.render=function(e){var i=new f(e);return a.call(i)},e(n,t)}); \ No newline at end of file diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/layui/lay/modules/table.js b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/layui/lay/modules/table.js new file mode 100644 index 0000000..be677e3 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/layui/lay/modules/table.js @@ -0,0 +1,2 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + ;layui.define(["laytpl","laypage","layer","form","util"],function(e){"use strict";var t=layui.$,i=layui.laytpl,a=layui.laypage,l=layui.layer,n=layui.form,o=(layui.util,layui.hint()),r=layui.device(),d={config:{checkName:"LAY_CHECKED",indexName:"LAY_TABLE_INDEX"},cache:{},index:layui.table?layui.table.index+1e4:0,set:function(e){var i=this;return i.config=t.extend({},i.config,e),i},on:function(e,t){return layui.onevent.call(this,u,e,t)}},c=function(){var e=this,t=e.config,i=t.id||t.index;return i&&(c.that[i]=e,c.config[i]=t),{reload:function(t){e.reload.call(e,t)},setColsWidth:function(){e.setColsWidth.call(e)},resize:function(){e.resize.call(e)},config:t}},s=function(e){var t=c.config[e];return t||o.error("The ID option was not found in the table instance"),t||null},u="table",h=".layui-table",y="layui-hide",f="layui-none",p="layui-table-view",v=".layui-table-tool",m=".layui-table-box",g=".layui-table-init",b=".layui-table-header",x=".layui-table-body",k=".layui-table-main",C=".layui-table-fixed",w=".layui-table-fixed-l",T=".layui-table-fixed-r",A=".layui-table-total",L=".layui-table-page",S=".layui-table-sort",N="layui-table-edit",W="layui-table-hover",_=function(e){var t='{{#if(item2.colspan){}} colspan="{{item2.colspan}}"{{#} if(item2.rowspan){}} rowspan="{{item2.rowspan}}"{{#}}}';return e=e||{},['',"","{{# layui.each(d.data.cols, function(i1, item1){ }}","","{{# layui.each(item1, function(i2, item2){ }}",'{{# if(item2.fixed && item2.fixed !== "right"){ left = true; } }}','{{# if(item2.fixed === "right"){ right = true; } }}',function(){return e.fixed&&"right"!==e.fixed?'{{# if(item2.fixed && item2.fixed !== "right"){ }}':"right"===e.fixed?'{{# if(item2.fixed === "right"){ }}':""}(),"{{# var isSort = !(item2.colGroup) && item2.sort; }}",'",e.fixed?"{{# }; }}":"","{{# }); }}","","{{# }); }}","","
                      ','
                      ','{{# if(item2.type === "checkbox"){ }}','',"{{# } else { }}",'{{item2.title||""}}',"{{# if(isSort){ }}",'',"{{# } }}","{{# } }}","
                      ","
                      "].join("")},E=['',"","
                      "].join(""),z=['
                      ',"{{# if(d.data.toolbar){ }}",'
                      ','
                      ','
                      ',"
                      ","{{# } }}",'
                      ',"{{# if(d.data.loading){ }}",'
                      ','',"
                      ","{{# } }}","{{# var left, right; }}",'
                      ',_(),"
                      ",'
                      ',E,"
                      ","{{# if(left){ }}",'
                      ','
                      ',_({fixed:!0}),"
                      ",'
                      ',E,"
                      ","
                      ","{{# }; }}","{{# if(right){ }}",'
                      ','
                      ',_({fixed:"right"}),'
                      ',"
                      ",'
                      ',E,"
                      ","
                      ","{{# }; }}","
                      ","{{# if(d.data.totalRow){ }}",'
                      ','','',"
                      ","
                      ","{{# } }}","{{# if(d.data.page){ }}",'
                      ','
                      ',"
                      ","{{# } }}","","
                      "].join(""),H=t(window),R=t(document),F=function(e){var i=this;i.index=++d.index,i.config=t.extend({},i.config,d.config,e),i.render()};F.prototype.config={limit:10,loading:!0,cellMinWidth:60,defaultToolbar:["filter","exports","print"],autoSort:!0,text:{none:"无数据"}},F.prototype.render=function(){var e=this,a=e.config;if(a.elem=t(a.elem),a.where=a.where||{},a.id=a.id||a.elem.attr("id")||e.index,a.request=t.extend({pageName:"page",limitName:"limit"},a.request),a.response=t.extend({statusName:"code",statusCode:0,msgName:"msg",dataName:"data",countName:"count"},a.response),"object"==typeof a.page&&(a.limit=a.page.limit||a.limit,a.limits=a.page.limits||a.limits,e.page=a.page.curr=a.page.curr||1,delete a.page.elem,delete a.page.jump),!a.elem[0])return e;a.height&&/^full-\d+$/.test(a.height)&&(e.fullHeightGap=a.height.split("-")[1],a.height=H.height()-e.fullHeightGap),e.setInit();var l=a.elem,n=l.next("."+p),o=e.elem=t(i(z).render({VIEW_CLASS:p,data:a,index:e.index}));if(a.index=e.index,n[0]&&n.remove(),l.after(o),e.layTool=o.find(v),e.layBox=o.find(m),e.layHeader=o.find(b),e.layMain=o.find(k),e.layBody=o.find(x),e.layFixed=o.find(C),e.layFixLeft=o.find(w),e.layFixRight=o.find(T),e.layTotal=o.find(A),e.layPage=o.find(L),e.renderToolbar(),e.fullSize(),a.cols.length>1){var r=e.layFixed.find(b).find("th");r.height(e.layHeader.height()-1-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom")))}e.pullData(e.page),e.events()},F.prototype.initOpts=function(e){var t=this,i=(t.config,{checkbox:48,radio:48,space:15,numbers:40});e.checkbox&&(e.type="checkbox"),e.space&&(e.type="space"),e.type||(e.type="normal"),"normal"!==e.type&&(e.unresize=!0,e.width=e.width||i[e.type])},F.prototype.setInit=function(e){var t=this,i=t.config;return i.clientWidth=i.width||function(){var e=function(t){var a,l;t=t||i.elem.parent(),a=t.width();try{l="none"===t.css("display")}catch(n){}return!t[0]||a&&!l?a:e(t.parent())};return e()}(),"width"===e?i.clientWidth:void layui.each(i.cols,function(e,a){layui.each(a,function(l,n){if(!n)return void a.splice(l,1);if(n.key=e+"-"+l,n.hide=n.hide||!1,n.colGroup||n.colspan>1){var o=0;layui.each(i.cols[e+1],function(t,i){i.HAS_PARENT||o>1&&o==n.colspan||(i.HAS_PARENT=!0,i.parentKey=e+"-"+l,o+=parseInt(i.colspan>1?i.colspan:1))}),n.colGroup=!0}t.initOpts(n)})})},F.prototype.renderToolbar=function(){var e=this,a=e.config,l=['
                      ','
                      ','
                      '].join(""),n=e.layTool.find(".layui-table-tool-temp");if("default"===a.toolbar)n.html(l);else if("string"==typeof a.toolbar){var o=t(a.toolbar).html()||"";o&&n.html(i(o).render(a))}var r={filter:{title:"筛选列",layEvent:"LAYTABLE_COLS",icon:"layui-icon-cols"},exports:{title:"导出",layEvent:"LAYTABLE_EXPORT",icon:"layui-icon-export"},print:{title:"打印",layEvent:"LAYTABLE_PRINT",icon:"layui-icon-print"}},d=[];"object"==typeof a.defaultToolbar&&layui.each(a.defaultToolbar,function(e,t){var i=r[t];i&&d.push('
                      ')}),e.layTool.find(".layui-table-tool-self").html(d.join(""))},F.prototype.setParentCol=function(e,t){var i=this,a=i.config,l=i.layHeader.find('th[data-key="'+a.index+"-"+t+'"]'),n=parseInt(l.attr("colspan"))||0;if(l[0]){var o=t.split("-"),r=a.cols[o[0]][o[1]];e?n--:n++,l.attr("colspan",n),l[n<1?"addClass":"removeClass"](y),r.colspan=n,r.hide=n<1;var d=l.data("parentkey");d&&i.setParentCol(e,d)}},F.prototype.setColsPatch=function(){var e=this,t=e.config;layui.each(t.cols,function(t,i){layui.each(i,function(t,i){i.hide&&e.setParentCol(i.hide,i.parentKey)})})},F.prototype.setColsWidth=function(){var e=this,t=e.config,i=0,a=0,l=0,n=0,o=e.setInit("width");e.eachCols(function(e,t){t.hide||i++}),o=o-function(){return"line"===t.skin||"nob"===t.skin?2:i+1}()-e.getScrollWidth(e.layMain[0])-1;var r=function(e){layui.each(t.cols,function(i,r){layui.each(r,function(i,d){var c=0,s=d.minWidth||t.cellMinWidth;return d?void(d.colGroup||d.hide||(e?l&&ln&&a&&(l=(o-n)/a)};r(),r(!0),e.autoColNums=a,e.eachCols(function(i,a){var n=a.minWidth||t.cellMinWidth;a.colGroup||a.hide||(0===a.width?e.getCssRule(t.index+"-"+a.key,function(e){e.style.width=Math.floor(l>=n?l:n)+"px"}):/\d+%$/.test(a.width)&&e.getCssRule(t.index+"-"+a.key,function(e){e.style.width=Math.floor(parseFloat(a.width)/100*o)+"px"}))});var d=e.layMain.width()-e.getScrollWidth(e.layMain[0])-e.layMain.children("table").outerWidth();if(e.autoColNums&&d>=-i&&d<=i){var c=function(t){var i;return t=t||e.layHeader.eq(0).find("thead th:last-child"),i=t.data("field"),!i&&t.prev()[0]?c(t.prev()):t},s=c(),u=s.data("key");e.getCssRule(u,function(t){var i=t.style.width||s.outerWidth();t.style.width=parseFloat(i)+d+"px",e.layMain.height()-e.layMain.prop("clientHeight")>0&&(t.style.width=parseFloat(t.style.width)-1+"px")})}e.loading(!0)},F.prototype.resize=function(){var e=this;e.fullSize(),e.setColsWidth(),e.scrollPatch()},F.prototype.reload=function(e){var i=this;i.config.data&&i.config.data.constructor===Array&&delete i.config.data,i.config=t.extend({},i.config,e),i.render()},F.prototype.page=1,F.prototype.pullData=function(e){var i=this,a=i.config,l=a.request,n=a.response,o=function(){"object"==typeof a.initSort&&i.sort(a.initSort.field,a.initSort.type)};if(i.startTime=(new Date).getTime(),a.url){var r={};r[l.pageName]=e,r[l.limitName]=a.limit;var d=t.extend(r,a.where);a.contentType&&0==a.contentType.indexOf("application/json")&&(d=JSON.stringify(d)),t.ajax({type:a.method||"get",url:a.url,contentType:a.contentType,data:d,dataType:"json",headers:a.headers||{},success:function(t){"function"==typeof a.parseData&&(t=a.parseData(t)||t),t[n.statusName]!=n.statusCode?(i.renderForm(),i.layMain.html('
                      '+(t[n.msgName]||"返回的数据不符合规范,正确的成功状态码 ("+n.statusName+") 应为:"+n.statusCode)+"
                      ")):(i.renderData(t,e,t[n.countName]),o(),a.time=(new Date).getTime()-i.startTime+" ms"),i.setColsWidth(),"function"==typeof a.done&&a.done(t,e,t[n.countName])},error:function(e,t){i.layMain.html('
                      数据接口请求异常:'+t+"
                      "),i.renderForm(),i.setColsWidth()}})}else if(a.data&&a.data.constructor===Array){var c={},s=e*a.limit-a.limit;c[n.dataName]=a.data.concat().splice(s,a.limit),c[n.countName]=a.data.length,i.renderData(c,e,a.data.length),o(),i.setColsWidth(),"function"==typeof a.done&&a.done(c,e,c[n.countName])}},F.prototype.eachCols=function(e){var t=this;return d.eachCols(null,e,t.config.cols),t},F.prototype.renderData=function(e,n,o,r){var c=this,s=c.config,u=e[s.response.dataName]||[],h=[],p=[],v=[],m=function(){var e;return!r&&c.sortKey?c.sort(c.sortKey.field,c.sortKey.sort,!0):(layui.each(u,function(a,l){var o=[],u=[],f=[],m=a+s.limit*(n-1)+1;0!==l.length&&(r||(l[d.config.indexName]=a),c.eachCols(function(n,r){var c=r.field||n,h=s.index+"-"+r.key,p=l[c];if(void 0!==p&&null!==p||(p=""),!r.colGroup){var v=['/g, ">").replace(/"/g, """).replace(/'/g, "'")+'"'),r.toolbar&&e.push('data-off="true"'),r.event&&e.push('lay-event="'+r.event+'"'),r.style&&e.push('style="'+r.style+'"'),r.minWidth&&e.push('data-minwidth="'+r.minWidth+'"'),e.join(" ")}()+' class="'+function(){var e=[];return r.hide&&e.push(y),r.field||e.push("layui-table-col-special"),e.join(" ")}()+'">','
                      '+function(){var n=t.extend(!0,{LAY_INDEX:m},l),o=d.config.checkName;switch(r.type){case"checkbox":return'";case"radio":return n[o]&&(e=a),'';case"numbers":return m}return r.toolbar?i(t(r.toolbar).html()||"").render(n):r.templet?function(){return"function"==typeof r.templet?r.templet(n):i(t(r.templet).html()||String(p)).render(n)}():p}(),"
                      "].join("");o.push(v),r.fixed&&"right"!==r.fixed&&u.push(v),"right"===r.fixed&&f.push(v)}}),h.push(''+o.join("")+""),p.push(''+u.join("")+""),v.push(''+f.join("")+""))}),c.layBody.scrollTop(0),c.layMain.find("."+f).remove(),c.layMain.find("tbody").html(h.join("")),c.layFixLeft.find("tbody").html(p.join("")),c.layFixRight.find("tbody").html(v.join("")),c.renderForm(),"number"==typeof e&&c.setThisRowChecked(e),c.syncCheckAll(),c.haveInit?c.scrollPatch():setTimeout(function(){c.scrollPatch()},50),c.haveInit=!0,l.close(c.tipsIndex),s.HAS_SET_COLS_PATCH||c.setColsPatch(),void(s.HAS_SET_COLS_PATCH=!0))};return c.key=s.id||s.index,d.cache[c.key]=u,c.layPage[0==o||0===u.length&&1==n?"addClass":"removeClass"](y),r?m():0===u.length?(c.renderForm(),c.layFixed.remove(),c.layMain.find("tbody").html(""),c.layMain.find("."+f).remove(),c.layMain.append('
                      '+s.text.none+"
                      ")):(m(),c.renderTotal(u),void(s.page&&(s.page=t.extend({elem:"layui-table-page"+s.index,count:o,limit:s.limit,limits:s.limits||[10,20,30,40,50,60,70,80,90],groups:3,layout:["prev","page","next","skip","count","limit"],prev:'',next:'',jump:function(e,t){t||(c.page=e.curr,s.limit=e.limit,c.loading(),c.pullData(e.curr))}},s.page),s.page.count=o,a.render(s.page))))},F.prototype.renderTotal=function(e){var t=this,i=t.config,a={};if(i.totalRow){layui.each(e,function(e,i){0!==i.length&&t.eachCols(function(e,t){var l=t.field||e,n=i[l];t.totalRow&&(a[l]=(a[l]||0)+(parseFloat(n)||0))})});var l=[];t.eachCols(function(e,t){var n=t.field||e,o=['','
                      '+function(){var e=t.totalRowText||"";return t.totalRow?parseFloat(a[n]).toFixed(2)||e:e}(),"
                      "].join("");l.push(o)}),t.layTotal.find("tbody").html(""+l.join("")+"")}},F.prototype.getColElem=function(e,t){var i=this,a=i.config;return e.eq(0).find(".laytable-cell-"+(a.index+"-"+t)+":eq(0)")},F.prototype.renderForm=function(e){n.render(e,"LAY-table-"+this.index)},F.prototype.setThisRowChecked=function(e){var t=this,i=(t.config,"layui-table-click"),a=t.layBody.find('tr[data-index="'+e+'"]');a.addClass(i).siblings("tr").removeClass(i)},F.prototype.sort=function(e,i,a,l){var n,r,c=this,s={},h=c.config,y=h.elem.attr("lay-filter"),f=d.cache[c.key];"string"==typeof e&&c.layHeader.find("th").each(function(i,a){var l=t(this),o=l.data("field");if(o===e)return e=l,n=o,!1});try{var n=n||e.data("field"),p=e.data("key");if(c.sortKey&&!a&&n===c.sortKey.field&&i===c.sortKey.sort)return;var v=c.layHeader.find("th .laytable-cell-"+p).find(S);c.layHeader.find("th").find(S).removeAttr("lay-sort"),v.attr("lay-sort",i||null),c.layFixed.find("th")}catch(m){return o.error("Table modules: Did not match to field")}c.sortKey={field:n,sort:i},h.autoSort&&("asc"===i?r=layui.sort(f,n):"desc"===i?r=layui.sort(f,n,!0):(r=layui.sort(f,d.config.indexName),delete c.sortKey)),s[h.response.dataName]=r||f,c.renderData(s,c.page,c.count,!0),l&&layui.event.call(e,u,"sort("+y+")",{field:n,type:i})},F.prototype.loading=function(e){var i=this,a=i.config;a.loading&&(e?(i.layInit&&i.layInit.remove(),delete i.layInit,i.layBox.find(g).remove()):(i.layInit=t(['
                      ','',"
                      "].join("")),i.layBox.append(i.layInit)))},F.prototype.setCheckData=function(e,t){var i=this,a=i.config,l=d.cache[i.key];l[e]&&l[e].constructor!==Array&&(l[e][a.checkName]=t)},F.prototype.syncCheckAll=function(){var e=this,t=e.config,i=e.layHeader.find('input[name="layTableCheckbox"]'),a=function(i){return e.eachCols(function(e,a){"checkbox"===a.type&&(a[t.checkName]=i)}),i};i[0]&&(d.checkStatus(e.key).isAll?(i[0].checked||(i.prop("checked",!0),e.renderForm("checkbox")),a(!0)):(i[0].checked&&(i.prop("checked",!1),e.renderForm("checkbox")),a(!1)))},F.prototype.getCssRule=function(e,t){var i=this,a=i.elem.find("style")[0],l=a.sheet||a.styleSheet||{},n=l.cssRules||l.rules;layui.each(n,function(i,a){if(a.selectorText===".laytable-cell-"+e)return t(a),!0})},F.prototype.fullSize=function(){var e,t=this,i=t.config,a=i.height;t.fullHeightGap&&(a=H.height()-t.fullHeightGap,a<135&&(a=135),t.elem.css("height",a)),a&&(e=parseFloat(a)-(t.layHeader.outerHeight()||38),i.toolbar&&(e-=t.layTool.outerHeight()||50),i.totalRow&&(e-=t.layTotal.outerHeight()||40),i.page&&(e=e-(t.layPage.outerHeight()||41)-2),t.layMain.css("height",e))},F.prototype.getScrollWidth=function(e){var t=0;return e?t=e.offsetWidth-e.clientWidth:(e=document.createElement("div"),e.style.width="100px",e.style.height="100px",e.style.overflowY="scroll",document.body.appendChild(e),t=e.offsetWidth-e.clientWidth,document.body.removeChild(e)),t},F.prototype.scrollPatch=function(){var e=this,i=e.layMain.children("table"),a=e.layMain.width()-e.layMain.prop("clientWidth"),l=e.layMain.height()-e.layMain.prop("clientHeight"),n=(e.getScrollWidth(e.layMain[0]),i.outerWidth()-e.layMain.width()),o=function(e){if(a&&l){if(e=e.eq(0),!e.find(".layui-table-patch")[0]){var i=t('
                      ');i.find("div").css({width:a}),e.find("tr").append(i)}}else e.find(".layui-table-patch").remove()};o(e.layHeader),o(e.layTotal);var r=e.layMain.height(),d=r-l;e.layFixed.find(x).css("height",i.height()>=d?d:"auto"),e.layFixRight[n>0?"removeClass":"addClass"](y),e.layFixRight.css("right",a-1)},F.prototype.events=function(){var e,a=this,o=a.config,c=t("body"),s={},h=a.layHeader.find("th"),f=".layui-table-cell",p=o.elem.attr("lay-filter");a.layTool.on("click","*[lay-event]",function(e){var i=t(this),c=i.attr("lay-event"),s=function(e){var l=t(e.list),n=t('
                        ');n.html(l),o.height&&n.css("max-height",o.height-(a.layTool.outerHeight()||50)),i.find(".layui-table-tool-panel")[0]||i.append(n),a.renderForm(),n.on("click",function(e){layui.stope(e)}),e.done&&e.done(n,l)};switch(layui.stope(e),R.trigger("table.tool.panel.remove"),l.close(a.tipsIndex),c){case"LAYTABLE_COLS":s({list:function(){var e=[];return a.eachCols(function(t,i){i.field&&"normal"==i.type&&e.push('
                      • ')}),e.join("")}(),done:function(){n.on("checkbox(LAY_TABLE_TOOL_COLS)",function(e){var i=t(e.elem),l=this.checked,n=i.data("key"),r=i.data("parentkey");layui.each(o.cols,function(e,t){layui.each(t,function(t,i){if(e+"-"+t===n){var d=i.hide;i.hide=!l,a.elem.find('*[data-key="'+o.index+"-"+n+'"]')[l?"removeClass":"addClass"](y),d!=i.hide&&a.setParentCol(!l,r),a.resize()}})})})}});break;case"LAYTABLE_EXPORT":r.ie?l.tips("导出功能不支持 IE,请用 Chrome 等高级浏览器导出",this,{tips:3}):s({list:function(){return['
                      • 导出到 Csv 文件
                      • ','
                      • 导出到 Excel 文件
                      • '].join("")}(),done:function(e,i){i.on("click",function(){var e=t(this).data("type");d.exportFile(o.id,null,e)})}});break;case"LAYTABLE_PRINT":var h=window.open("打印窗口","_blank"),f=[""].join(""),v=t(a.layHeader.html());v.append(a.layMain.find("table").html()),v.find("th.layui-table-patch").remove(),v.find(".layui-table-col-special").remove(),h.document.write(f+v.prop("outerHTML")),h.document.close(),h.print(),h.close()}layui.event.call(this,u,"toolbar("+p+")",t.extend({event:c,config:o},{}))}),h.on("mousemove",function(e){var i=t(this),a=i.offset().left,l=e.clientX-a;i.data("unresize")||s.resizeStart||(s.allowResize=i.width()-l<=10,c.css("cursor",s.allowResize?"col-resize":""))}).on("mouseleave",function(){t(this);s.resizeStart||c.css("cursor","")}).on("mousedown",function(e){var i=t(this);if(s.allowResize){var l=i.data("key");e.preventDefault(),s.resizeStart=!0,s.offset=[e.clientX,e.clientY],a.getCssRule(l,function(e){var t=e.style.width||i.outerWidth();s.rule=e,s.ruleWidth=parseFloat(t),s.minWidth=i.data("minwidth")||o.cellMinWidth})}}),R.on("mousemove",function(t){if(s.resizeStart){if(t.preventDefault(),s.rule){var i=s.ruleWidth+t.clientX-s.offset[0];i');return n[0].value=i.data("content")||l.text(),i.find("."+N)[0]||i.append(n),n.focus(),void layui.stope(e)}}).on("mouseenter","td",function(){b.call(this)}).on("mouseleave","td",function(){b.call(this,"hide")});var g="layui-table-grid-down",b=function(e){var i=t(this),a=i.children(f);if(e)i.find(".layui-table-grid-down").remove();else if(a.prop("scrollWidth")>a.outerWidth()){if(a.find("."+g)[0])return;i.append('
                        ')}};a.layBody.on("click","."+g,function(e){var i=t(this),n=i.parent(),d=n.children(f);a.tipsIndex=l.tips(['
                        ',d.html(),"
                        ",''].join(""),d[0],{tips:[3,""],time:-1,anim:-1,maxWidth:r.ios||r.android?300:a.elem.width()/2,isOutAnim:!1,skin:"layui-table-tips",success:function(e,t){e.find(".layui-table-tips-c").on("click",function(){l.close(t)})}}),layui.stope(e)}),a.layBody.on("click","*[lay-event]",function(){var e=t(this),i=e.parents("tr").eq(0).data("index");layui.event.call(this,u,"tool("+p+")",v.call(this,{event:e.attr("lay-event")})),a.setThisRowChecked(i)}),a.layMain.on("scroll",function(){var e=t(this),i=e.scrollLeft(),n=e.scrollTop();a.layHeader.scrollLeft(i),a.layTotal.scrollLeft(i),a.layFixed.find(x).scrollTop(n),l.close(a.tipsIndex)}),R.on("click",function(){R.trigger("table.remove.tool.panel")}),R.on("table.remove.tool.panel",function(){t(".layui-table-tool-panel").remove()}),H.on("resize",function(){a.resize()})},d.init=function(e,i){i=i||{};var a=this,l=t(e?'table[lay-filter="'+e+'"]':h+"[lay-data]"),n="Table element property lay-data configuration item has a syntax error: ";return l.each(function(){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(r){o.error(n+l)}var c=[],s=t.extend({elem:this,cols:[],data:[],skin:a.attr("lay-skin"),size:a.attr("lay-size"),even:"string"==typeof a.attr("lay-even")},d.config,i,l);e&&a.hide(),a.find("thead>tr").each(function(e){s.cols[e]=[],t(this).children().each(function(i){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(r){return o.error(n+l)}var d=t.extend({title:a.text(),colspan:a.attr("colspan")||0,rowspan:a.attr("rowspan")||0},l);d.colspan<2&&c.push(d),s.cols[e].push(d)})}),a.find("tbody>tr").each(function(e){var i=t(this),a={};i.children("td").each(function(e,i){var l=t(this),n=l.data("field");if(n)return a[n]=l.html()}),layui.each(c,function(e,t){var l=i.children("td").eq(e);a[t.field]=l.html()}),s.data[e]=a}),d.render(s)}),a},c.that={},c.config={},d.eachCols=function(e,i,a){var l=c.config[e]||{},n=[],o=0;a=t.extend(!0,[],a||l.cols),layui.each(a,function(e,t){layui.each(t,function(t,i){if(i.colGroup){var l=0;o++,i.CHILD_COLS=[],layui.each(a[e+1],function(e,t){t.PARENT_COL_INDEX||l>1&&l==i.colspan||(t.PARENT_COL_INDEX=o,i.CHILD_COLS.push(t),l+=parseInt(t.colspan>1?t.colspan:1))})}i.PARENT_COL_INDEX||n.push(i)})});var r=function(e){layui.each(e||n,function(e,t){return t.CHILD_COLS?r(t.CHILD_COLS):void("function"==typeof i&&i(e,t))})};r()},d.checkStatus=function(e){var t=0,i=0,a=[],l=d.cache[e]||[];return layui.each(l,function(e,l){return l.constructor===Array?void i++:void(l[d.config.checkName]&&(t++,a.push(d.clearCacheKey(l))))}),{data:a,isAll:!!l.length&&t===l.length-i}},d.exportFile=function(e,t,i){t=t||d.clearCacheKey(d.cache[e]),i=i||"csv";var a=c.config[e]||{},l={csv:"text/csv",xls:"application/vnd.ms-excel"}[i],n=document.createElement("a");return r.ie?o.error("IE_NOT_SUPPORT_EXPORTS"):(n.href="data:"+l+";charset=utf-8,\ufeff"+encodeURIComponent(function(){var i=[],a=[];return layui.each(t,function(t,l){var n=[];"object"==typeof e?(layui.each(e,function(e,a){0==t&&i.push(a||"")}),layui.each(d.clearCacheKey(l),function(e,t){n.push(t)})):d.eachCols(e,function(e,a){a.field&&"normal"==a.type&&!a.hide&&(0==t&&i.push(a.title||""),n.push(l[a.field]))}),a.push(n.join(","))}),i.join(",")+"\r\n"+a.join("\r\n")}()),n.download=(a.title||"table_"+(a.index||""))+"."+i,document.body.appendChild(n),n.click(),void document.body.removeChild(n))},d.resize=function(e){if(e){var t=s(e);if(!t)return;c.that[e].resize()}else layui.each(c.that,function(){this.resize()})},d.reload=function(e,i){i=i||{};var a=s(e);if(a)return i.data&&i.data.constructor===Array&&delete a.data,d.render(t.extend(!0,{},a,i))},d.render=function(e){var t=new F(e);return c.call(t)},d.clearCacheKey=function(e){return e=t.extend({},e),delete e[d.config.checkName],delete e[d.config.indexName],e},d.init(),e(u,d)}); diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/layui/lay/modules/tree.js b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/layui/lay/modules/tree.js new file mode 100644 index 0000000..e8c053d --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/layui/lay/modules/tree.js @@ -0,0 +1,2 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + ;layui.define("jquery",function(e){"use strict";var o=layui.$,a=layui.hint(),i="layui-tree-enter",r=function(e){this.options=e},t={arrow:["",""],checkbox:["",""],radio:["",""],branch:["",""],leaf:""};r.prototype.init=function(e){var o=this;e.addClass("layui-box layui-tree"),o.options.skin&&e.addClass("layui-tree-skin-"+o.options.skin),o.tree(e),o.on(e)},r.prototype.tree=function(e,a){var i=this,r=i.options,n=a||r.nodes;layui.each(n,function(a,n){var l=n.children&&n.children.length>0,c=o('
                          '),s=o(["
                        • ",function(){return l?''+(n.spread?t.arrow[1]:t.arrow[0])+"":""}(),function(){return r.check?''+("checkbox"===r.check?t.checkbox[0]:"radio"===r.check?t.radio[0]:"")+"":""}(),function(){return'"+(''+(l?n.spread?t.branch[1]:t.branch[0]:t.leaf)+"")+(""+(n.name||"未命名")+"")}(),"
                        • "].join(""));l&&(s.append(c),i.tree(c,n.children)),e.append(s),"function"==typeof r.click&&i.click(s,n),i.spread(s,n),r.drag&&i.drag(s,n)})},r.prototype.click=function(e,o){var a=this,i=a.options;e.children("a").on("click",function(e){layui.stope(e),i.click(o)})},r.prototype.spread=function(e,o){var a=this,i=(a.options,e.children(".layui-tree-spread")),r=e.children("ul"),n=e.children("a"),l=function(){e.data("spread")?(e.data("spread",null),r.removeClass("layui-show"),i.html(t.arrow[0]),n.find(".layui-icon").html(t.branch[0])):(e.data("spread",!0),r.addClass("layui-show"),i.html(t.arrow[1]),n.find(".layui-icon").html(t.branch[1]))};r[0]&&(i.on("click",l),n.on("dblclick",l))},r.prototype.on=function(e){var a=this,r=a.options,t="layui-tree-drag";e.find("i").on("selectstart",function(e){return!1}),r.drag&&o(document).on("mousemove",function(e){var i=a.move;if(i.from){var r=(i.to,o('
                          '));e.preventDefault(),o("."+t)[0]||o("body").append(r);var n=o("."+t)[0]?o("."+t):r;n.addClass("layui-show").html(i.from.elem.children("a").html()),n.css({left:e.pageX+10,top:e.pageY+10})}}).on("mouseup",function(){var e=a.move;e.from&&(e.from.elem.children("a").removeClass(i),e.to&&e.to.elem.children("a").removeClass(i),a.move={},o("."+t).remove())})},r.prototype.move={},r.prototype.drag=function(e,a){var r=this,t=(r.options,e.children("a")),n=function(){var t=o(this),n=r.move;n.from&&(n.to={item:a,elem:e},t.addClass(i))};t.on("mousedown",function(){var o=r.move;o.from={item:a,elem:e}}),t.on("mouseenter",n).on("mousemove",n).on("mouseleave",function(){var e=o(this),a=r.move;a.from&&(delete a.to,e.removeClass(i))})},e("tree",function(e){var i=new r(e=e||{}),t=o(e.elem);return t[0]?void i.init(t):a.error("layui.tree 没有找到"+e.elem+"元素")})}); \ No newline at end of file diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/layui/lay/modules/upload.js b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/layui/lay/modules/upload.js new file mode 100644 index 0000000..404d534 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/layui/lay/modules/upload.js @@ -0,0 +1,2 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + ;layui.define("layer",function(e){"use strict";var i=layui.$,t=layui.layer,n=layui.hint(),a=layui.device(),o={config:{},set:function(e){var t=this;return t.config=i.extend({},t.config,e),t},on:function(e,i){return layui.onevent.call(this,r,e,i)}},l=function(){var e=this;return{upload:function(i){e.upload.call(e,i)},config:e.config}},r="upload",u="layui-upload-file",c="layui-upload-form",f="layui-upload-iframe",s="layui-upload-choose",p=function(e){var t=this;t.config=i.extend({},t.config,o.config,e),t.render()};p.prototype.config={accept:"images",exts:"",auto:!0,bindAction:"",url:"",field:"file",method:"post",data:{},drag:!0,size:0,number:0,multiple:!1},p.prototype.render=function(e){var t=this,e=t.config;e.elem=i(e.elem),e.bindAction=i(e.bindAction),t.file(),t.events()},p.prototype.file=function(){var e=this,t=e.config,n=e.elemFile=i(['"].join("")),o=t.elem.next();(o.hasClass(u)||o.hasClass(c))&&o.remove(),a.ie&&a.ie<10&&t.elem.wrap('
                          '),e.isFile()?(e.elemFile=t.elem,t.field=t.elem[0].name):t.elem.after(n),a.ie&&a.ie<10&&e.initIE()},p.prototype.initIE=function(){var e=this,t=e.config,n=i(''),a=i(['
                          ',"
                          "].join(""));i("#"+f)[0]||i("body").append(n),t.elem.next().hasClass(c)||(e.elemFile.wrap(a),t.elem.next("."+c).append(function(){var e=[];return layui.each(t.data,function(i,t){t="function"==typeof t?t():t,e.push('')}),e.join("")}()))},p.prototype.msg=function(e){return t.msg(e,{icon:2,shift:6})},p.prototype.isFile=function(){var e=this.config.elem[0];if(e)return"input"===e.tagName.toLocaleLowerCase()&&"file"===e.type},p.prototype.preview=function(e){var i=this;window.FileReader&&layui.each(i.chooseFiles,function(i,t){var n=new FileReader;n.readAsDataURL(t),n.onload=function(){e&&e(i,t,this.result)}})},p.prototype.upload=function(e,t){var n,o=this,l=o.config,r=o.elemFile[0],u=function(){var t=0,n=0,a=e||o.files||o.chooseFiles||r.files,u=function(){l.multiple&&t+n===o.fileLength&&"function"==typeof l.allDone&&l.allDone({total:o.fileLength,successful:t,aborted:n})};layui.each(a,function(e,a){var r=new FormData;r.append(l.field,a),layui.each(l.data,function(e,i){i="function"==typeof i?i():i,r.append(e,i)}),i.ajax({url:l.url,type:"post",data:r,contentType:!1,processData:!1,dataType:"json",headers:l.headers||{},success:function(i){t++,d(e,i),u()},error:function(){n++,o.msg("请求上传接口出现异常"),m(e),u()}})})},c=function(){var e=i("#"+f);o.elemFile.parent().submit(),clearInterval(p.timer),p.timer=setInterval(function(){var i,t=e.contents().find("body");try{i=t.text()}catch(n){o.msg("获取上传后的响应信息出现异常"),clearInterval(p.timer),m()}i&&(clearInterval(p.timer),t.html(""),d(0,i))},30)},d=function(e,i){if(o.elemFile.next("."+s).remove(),r.value="","object"!=typeof i)try{i=JSON.parse(i)}catch(t){return i={},o.msg("请对上传接口返回有效JSON")}"function"==typeof l.done&&l.done(i,e||0,function(e){o.upload(e)})},m=function(e){l.auto&&(r.value=""),"function"==typeof l.error&&l.error(e||0,function(e){o.upload(e)})},h=l.exts,v=function(){var i=[];return layui.each(e||o.chooseFiles,function(e,t){i.push(t.name)}),i}(),g={preview:function(e){o.preview(e)},upload:function(e,i){var t={};t[e]=i,o.upload(t)},pushFile:function(){return o.files=o.files||{},layui.each(o.chooseFiles,function(e,i){o.files[e]=i}),o.files},resetFile:function(e,i,t){var n=new File([i],t);o.files=o.files||{},o.files[e]=n}},y=function(){if("choose"!==t&&!l.auto||(l.choose&&l.choose(g),"choose"!==t))return l.before&&l.before(g),a.ie?a.ie>9?u():c():void u()};if(v=0===v.length?r.value.match(/[^\/\\]+\..+/g)||[]||"":v,0!==v.length){switch(l.accept){case"file":if(h&&!RegExp("\\w\\.("+h+")$","i").test(escape(v)))return o.msg("选择的文件中包含不支持的格式"),r.value="";break;case"video":if(!RegExp("\\w\\.("+(h||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(v)))return o.msg("选择的视频中包含不支持的格式"),r.value="";break;case"audio":if(!RegExp("\\w\\.("+(h||"mp3|wav|mid")+")$","i").test(escape(v)))return o.msg("选择的音频中包含不支持的格式"),r.value="";break;default:if(layui.each(v,function(e,i){RegExp("\\w\\.("+(h||"jpg|png|gif|bmp|jpeg$")+")","i").test(escape(i))||(n=!0)}),n)return o.msg("选择的图片中包含不支持的格式"),r.value=""}if(o.fileLength=function(){var i=0,t=e||o.files||o.chooseFiles||r.files;return layui.each(t,function(){i++}),i}(),l.number&&o.fileLength>l.number)return o.msg("同时最多只能上传的数量为:"+l.number);if(l.size>0&&!(a.ie&&a.ie<10)){var F;if(layui.each(o.chooseFiles,function(e,i){if(i.size>1024*l.size){var t=l.size/1024;t=t>=1?t.toFixed(2)+"MB":l.size+"KB",r.value="",F=t}}),F)return o.msg("文件不能超过"+F)}y()}},p.prototype.events=function(){var e=this,t=e.config,o=function(i){e.chooseFiles={},layui.each(i,function(i,t){var n=(new Date).getTime();e.chooseFiles[n+"-"+i]=t})},l=function(i,n){var a=e.elemFile,o=i.length>1?i.length+"个文件":(i[0]||{}).name||a[0].value.match(/[^\/\\]+\..+/g)||[]||"";a.next().hasClass(s)&&a.next().remove(),e.upload(null,"choose"),e.isFile()||t.choose||a.after(''+o+"")};t.elem.off("upload.start").on("upload.start",function(){var a=i(this),o=a.attr("lay-data");if(o)try{o=new Function("return "+o)(),e.config=i.extend({},t,o)}catch(l){n.error("Upload element property lay-data configuration item has a syntax error: "+o)}e.config.item=a,e.elemFile[0].click()}),a.ie&&a.ie<10||t.elem.off("upload.over").on("upload.over",function(){var e=i(this);e.attr("lay-over","")}).off("upload.leave").on("upload.leave",function(){var e=i(this);e.removeAttr("lay-over")}).off("upload.drop").on("upload.drop",function(n,a){var r=i(this),u=a.originalEvent.dataTransfer.files||[];r.removeAttr("lay-over"),o(u),t.auto?e.upload(u):l(u)}),e.elemFile.off("upload.change").on("upload.change",function(){var i=this.files||[];o(i),t.auto?e.upload():l(i)}),t.bindAction.off("upload.action").on("upload.action",function(){e.upload()}),t.elem.data("haveEvents")||(e.elemFile.on("change",function(){i(this).trigger("upload.change")}),t.elem.on("click",function(){e.isFile()||i(this).trigger("upload.start")}),t.drag&&t.elem.on("dragover",function(e){e.preventDefault(),i(this).trigger("upload.over")}).on("dragleave",function(e){i(this).trigger("upload.leave")}).on("drop",function(e){e.preventDefault(),i(this).trigger("upload.drop",e)}),t.bindAction.on("click",function(){i(this).trigger("upload.action")}),t.elem.data("haveEvents",!0))},o.render=function(e){var i=new p(e);return l.call(i)},e(r,o)}); \ No newline at end of file diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/layui/lay/modules/util.js b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/layui/lay/modules/util.js new file mode 100644 index 0000000..8d38508 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/layui/lay/modules/util.js @@ -0,0 +1,2 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + ;layui.define("jquery",function(t){"use strict";var e=layui.$,i={fixbar:function(t){var i,a,n="layui-fixbar",r="layui-fixbar-top",o=e(document),l=e("body");t=e.extend({showHeight:200},t),t.bar1=t.bar1===!0?"":t.bar1,t.bar2=t.bar2===!0?"":t.bar2,t.bgcolor=t.bgcolor?"background-color:"+t.bgcolor:"";var c=[t.bar1,t.bar2,""],g=e(['
                            ',t.bar1?'
                          • '+c[0]+"
                          • ":"",t.bar2?'
                          • '+c[1]+"
                          • ":"",'
                          • '+c[2]+"
                          • ","
                          "].join("")),s=g.find("."+r),u=function(){var e=o.scrollTop();e>=t.showHeight?i||(s.show(),i=1):i&&(s.hide(),i=0)};e("."+n)[0]||("object"==typeof t.css&&g.css(t.css),l.append(g),u(),g.find("li").on("click",function(){var i=e(this),a=i.attr("lay-type");"top"===a&&e("html,body").animate({scrollTop:0},200),t.click&&t.click.call(this,a)}),o.on("scroll",function(){clearTimeout(a),a=setTimeout(function(){u()},100)}))},countdown:function(t,e,i){var a=this,n="function"==typeof e,r=new Date(t).getTime(),o=new Date(!e||n?(new Date).getTime():e).getTime(),l=r-o,c=[Math.floor(l/864e5),Math.floor(l/36e5)%24,Math.floor(l/6e4)%60,Math.floor(l/1e3)%60];n&&(i=e);var g=setTimeout(function(){a.countdown(t,o+1e3,i)},1e3);return i&&i(l>0?c:[0,0,0,0],e,g),l<=0&&clearTimeout(g),g},timeAgo:function(t,e){var i=this,a=[[],[]],n=(new Date).getTime()-new Date(t).getTime();return n>6912e5?(n=new Date(t),a[0][0]=i.digit(n.getFullYear(),4),a[0][1]=i.digit(n.getMonth()+1),a[0][2]=i.digit(n.getDate()),e||(a[1][0]=i.digit(n.getHours()),a[1][1]=i.digit(n.getMinutes()),a[1][2]=i.digit(n.getSeconds())),a[0].join("-")+" "+a[1].join(":")):n>=864e5?(n/1e3/60/60/24|0)+"天前":n>=36e5?(n/1e3/60/60|0)+"小时前":n>=12e4?(n/1e3/60|0)+"分钟前":n<0?"未来":"刚刚"},digit:function(t,e){var i="";t=String(t),e=e||2;for(var a=t.length;a/g,">").replace(/'/g,"'").replace(/"/g,""")}};!function(t,e,i){"$:nomunge";function a(){n=e[l](function(){r.each(function(){var e=t(this),i=e.width(),a=e.height(),n=t.data(this,g);(i!==n.w||a!==n.h)&&e.trigger(c,[n.w=i,n.h=a])}),a()},o[s])}var n,r=t([]),o=t.resize=t.extend(t.resize,{}),l="setTimeout",c="resize",g=c+"-special-event",s="delay",u="throttleWindow";o[s]=250,o[u]=!0,t.event.special[c]={setup:function(){if(!o[u]&&this[l])return!1;var e=t(this);r=r.add(e),t.data(this,g,{w:e.width(),h:e.height()}),1===r.length&&a()},teardown:function(){if(!o[u]&&this[l])return!1;var e=t(this);r=r.not(e),e.removeData(g),r.length||clearTimeout(n)},add:function(e){function a(e,a,r){var o=t(this),l=t.data(this,g)||{};l.w=a!==i?a:o.width(),l.h=r!==i?r:o.height(),n.apply(this,arguments)}if(!o[u]&&this[l])return!1;var n;return t.isFunction(e)?(n=e,a):(n=e.handler,void(e.handler=a))}}}(e,window),t("util",i)}); \ No newline at end of file diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/layui/layui.all.js b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/layui/layui.all.js new file mode 100644 index 0000000..5cd5973 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/layui/layui.all.js @@ -0,0 +1,5 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + ;!function(e){"use strict";var t=document,o={modules:{},status:{},timeout:10,event:{}},n=function(){this.v="2.4.5"},r=function(){var e=t.currentScript?t.currentScript.src:function(){for(var e,o=t.scripts,n=o.length-1,r=n;r>0;r--)if("interactive"===o[r].readyState){e=o[r].src;break}return e||o[n].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),i=function(t){e.console&&console.error&&console.error("Layui hint: "+t)},a="undefined"!=typeof opera&&"[object Opera]"===opera.toString(),u={layer:"modules/layer",laydate:"modules/laydate",laypage:"modules/laypage",laytpl:"modules/laytpl",layim:"modules/layim",layedit:"modules/layedit",form:"modules/form",upload:"modules/upload",tree:"modules/tree",table:"modules/table",element:"modules/element",rate:"modules/rate",colorpicker:"modules/colorpicker",slider:"modules/slider",carousel:"modules/carousel",flow:"modules/flow",util:"modules/util",code:"modules/code",jquery:"modules/jquery",mobile:"modules/mobile","layui.all":"../layui.all"};n.prototype.cache=o,n.prototype.define=function(e,t){var n=this,r="function"==typeof e,i=function(){var e=function(e,t){layui[e]=t,o.status[e]=!0};return"function"==typeof t&&t(function(n,r){e(n,r),o.callback[n]=function(){t(e)}}),this};return r&&(t=e,e=[]),layui["layui.all"]||!layui["layui.all"]&&layui["layui.mobile"]?i.call(n):(n.use(e,i),n)},n.prototype.use=function(e,n,l){function s(e,t){var n="PLaySTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/;("load"===e.type||n.test((e.currentTarget||e.srcElement).readyState))&&(o.modules[f]=t,d.removeChild(v),function r(){return++m>1e3*o.timeout/4?i(f+" is not a valid module"):void(o.status[f]?c():setTimeout(r,4))}())}function c(){l.push(layui[f]),e.length>1?y.use(e.slice(1),n,l):"function"==typeof n&&n.apply(layui,l)}var y=this,p=o.dir=o.dir?o.dir:r,d=t.getElementsByTagName("head")[0];e="string"==typeof e?[e]:e,window.jQuery&&jQuery.fn.on&&(y.each(e,function(t,o){"jquery"===o&&e.splice(t,1)}),layui.jquery=layui.$=jQuery);var f=e[0],m=0;if(l=l||[],o.host=o.host||(p.match(/\/\/([\s\S]+?)\//)||["//"+location.host+"/"])[0],0===e.length||layui["layui.all"]&&u[f]||!layui["layui.all"]&&layui["layui.mobile"]&&u[f])return c(),y;if(o.modules[f])!function g(){return++m>1e3*o.timeout/4?i(f+" is not a valid module"):void("string"==typeof o.modules[f]&&o.status[f]?c():setTimeout(g,4))}();else{var v=t.createElement("script"),h=(u[f]?p+"lay/":/^\{\/\}/.test(y.modules[f])?"":o.base||"")+(y.modules[f]||f)+".js";h=h.replace(/^\{\/\}/,""),v.async=!0,v.charset="utf-8",v.src=h+function(){var e=o.version===!0?o.v||(new Date).getTime():o.version||"";return e?"?v="+e:""}(),d.appendChild(v),!v.attachEvent||v.attachEvent.toString&&v.attachEvent.toString().indexOf("[native code")<0||a?v.addEventListener("load",function(e){s(e,h)},!1):v.attachEvent("onreadystatechange",function(e){s(e,h)}),o.modules[f]=h}return y},n.prototype.getStyle=function(t,o){var n=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](o)},n.prototype.link=function(e,n,r){var a=this,u=t.createElement("link"),l=t.getElementsByTagName("head")[0];"string"==typeof n&&(r=n);var s=(r||e).replace(/\.|\//g,""),c=u.id="layuicss-"+s,y=0;return u.rel="stylesheet",u.href=e+(o.debug?"?v="+(new Date).getTime():""),u.media="all",t.getElementById(c)||l.appendChild(u),"function"!=typeof n?a:(function p(){return++y>1e3*o.timeout/100?i(e+" timeout"):void(1989===parseInt(a.getStyle(t.getElementById(c),"width"))?function(){n()}():setTimeout(p,100))}(),a)},o.callback={},n.prototype.factory=function(e){if(layui[e])return"function"==typeof o.callback[e]?o.callback[e]:null},n.prototype.addcss=function(e,t,n){return layui.link(o.dir+"css/"+e,t,n)},n.prototype.img=function(e,t,o){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,"function"==typeof t&&t(n)},void(n.onerror=function(e){n.onerror=null,"function"==typeof o&&o(e)}))},n.prototype.config=function(e){e=e||{};for(var t in e)o[t]=e[t];return this},n.prototype.modules=function(){var e={};for(var t in u)e[t]=u[t];return e}(),n.prototype.extend=function(e){var t=this;e=e||{};for(var o in e)t[o]||t.modules[o]?i("模块名 "+o+" 已被占用"):t.modules[o]=e[o];return t},n.prototype.router=function(e){var t=this,e=e||location.hash,o={path:[],search:{},hash:(e.match(/[^#](#.*$)/)||[])[1]||""};return/^#\//.test(e)?(e=e.replace(/^#\//,""),o.href="/"+e,e=e.replace(/([^#])(#.*$)/,"$1").split("/")||[],t.each(e,function(e,t){/^\w+=/.test(t)?function(){t=t.split("="),o.search[t[0]]=t[1]}():o.path.push(t)}),o):o},n.prototype.data=function(t,o,n){if(t=t||"layui",n=n||localStorage,e.JSON&&e.JSON.parse){if(null===o)return delete n[t];o="object"==typeof o?o:{key:o};try{var r=JSON.parse(n[t])}catch(i){var r={}}return"value"in o&&(r[o.key]=o.value),o.remove&&delete r[o.key],n[t]=JSON.stringify(r),o.key?r[o.key]:r}},n.prototype.sessionData=function(e,t){return this.data(e,t,sessionStorage)},n.prototype.device=function(t){var o=navigator.userAgent.toLowerCase(),n=function(e){var t=new RegExp(e+"/([^\\s\\_\\-]+)");return e=(o.match(t)||[])[1],e||!1},r={os:function(){return/windows/.test(o)?"windows":/linux/.test(o)?"linux":/iphone|ipod|ipad|ios/.test(o)?"ios":/mac/.test(o)?"mac":void 0}(),ie:function(){return!!(e.ActiveXObject||"ActiveXObject"in e)&&((o.match(/msie\s(\d+)/)||[])[1]||"11")}(),weixin:n("micromessenger")};return t&&!r[t]&&(r[t]=n(t)),r.android=/android/.test(o),r.ios="ios"===r.os,r},n.prototype.hint=function(){return{error:i}},n.prototype.each=function(e,t){var o,n=this;if("function"!=typeof t)return n;if(e=e||[],e.constructor===Object){for(o in e)if(t.call(e[o],o,e[o]))break}else for(o=0;oi?1:r/g,">").replace(/'/g,"'").replace(/"/g,""")},error:function(e,r){var c="Laytpl Error:";return"object"==typeof console&&console.error(c+e+"\n"+(r||"")),c+e}},n=c.exp,t=function(e){this.tpl=e};t.pt=t.prototype,window.errors=0,t.pt.parse=function(e,t){var o=this,p=e,a=n("^"+r.open+"#",""),l=n(r.close+"$","");e=e.replace(/\s+|\r|\t|\n/g," ").replace(n(r.open+"#"),r.open+"# ").replace(n(r.close+"}"),"} "+r.close).replace(/\\/g,"\\\\").replace(n(r.open+"!(.+?)!"+r.close),function(e){return e=e.replace(n("^"+r.open+"!"),"").replace(n("!"+r.close),"").replace(n(r.open+"|"+r.close),function(e){return e.replace(/(.)/g,"\\$1")})}).replace(/(?="|')/g,"\\").replace(c.query(),function(e){return e=e.replace(a,"").replace(l,""),'";'+e.replace(/\\/g,"")+';view+="'}).replace(c.query(1),function(e){var c='"+(';return e.replace(/\s/g,"")===r.open+r.close?"":(e=e.replace(n(r.open+"|"+r.close),""),/^=/.test(e)&&(e=e.replace(/^=/,""),c='"+_escape_('),c+e.replace(/\\/g,"")+')+"')}),e='"use strict";var view = "'+e+'";return view;';try{return o.cache=e=new Function("d, _escape_",e),e(t,c.escape)}catch(u){return delete o.cache,c.error(u,p)}},t.pt.render=function(e,r){var n,t=this;return e?(n=t.cache?t.cache(e,c.escape):t.parse(t.tpl,e),r?void r(n):n):c.error("no data")};var o=function(e){return"string"!=typeof e?c.error("Template not found"):new t(e)};o.config=function(e){e=e||{};for(var c in e)r[c]=e[c]},o.v="1.2.0",e("laytpl",o)});layui.define(function(e){"use strict";var a=document,t="getElementById",n="getElementsByTagName",i="laypage",r="layui-disabled",u=function(e){var a=this;a.config=e||{},a.config.index=++s.index,a.render(!0)};u.prototype.type=function(){var e=this.config;if("object"==typeof e.elem)return void 0===e.elem.length?2:3},u.prototype.view=function(){var e=this,a=e.config,t=a.groups="groups"in a?0|a.groups:5;a.layout="object"==typeof a.layout?a.layout:["prev","page","next"],a.count=0|a.count,a.curr=0|a.curr||1,a.limits="object"==typeof a.limits?a.limits:[10,20,30,40,50],a.limit=0|a.limit||10,a.pages=Math.ceil(a.count/a.limit)||1,a.curr>a.pages&&(a.curr=a.pages),t<0?t=1:t>a.pages&&(t=a.pages),a.prev="prev"in a?a.prev:"上一页",a.next="next"in a?a.next:"下一页";var n=a.pages>t?Math.ceil((a.curr+(t>1?1:0))/(t>0?t:1)):1,i={prev:function(){return a.prev?''+a.prev+"":""}(),page:function(){var e=[];if(a.count<1)return"";n>1&&a.first!==!1&&0!==t&&e.push(''+(a.first||1)+"");var i=Math.floor((t-1)/2),r=n>1?a.curr-i:1,u=n>1?function(){var e=a.curr+(t-i-1);return e>a.pages?a.pages:e}():t;for(u-r2&&e.push('');r<=u;r++)r===a.curr?e.push('"+r+""):e.push(''+r+"");return a.pages>t&&a.pages>u&&a.last!==!1&&(u+1…'),0!==t&&e.push(''+(a.last||a.pages)+"")),e.join("")}(),next:function(){return a.next?''+a.next+"":""}(),count:'共 '+a.count+" 条",limit:function(){var e=['"}(),refresh:['','',""].join(""),skip:function(){return['到第','','页',""].join("")}()};return['
                          ',function(){var e=[];return layui.each(a.layout,function(a,t){i[t]&&e.push(i[t])}),e.join("")}(),"
                          "].join("")},u.prototype.jump=function(e,a){if(e){var t=this,i=t.config,r=e.children,u=e[n]("button")[0],l=e[n]("input")[0],p=e[n]("select")[0],c=function(){var e=0|l.value.replace(/\s|\D/g,"");e&&(i.curr=e,t.render())};if(a)return c();for(var o=0,y=r.length;oi.pages||(i.curr=e,t.render())});p&&s.on(p,"change",function(){var e=this.value;i.curr*e>i.count&&(i.curr=Math.ceil(i.count/e)),i.limit=e,t.render()}),u&&s.on(u,"click",function(){c()})}},u.prototype.skip=function(e){if(e){var a=this,t=e[n]("input")[0];t&&s.on(t,"keyup",function(t){var n=this.value,i=t.keyCode;/^(37|38|39|40)$/.test(i)||(/\D/.test(n)&&(this.value=n.replace(/\D/,"")),13===i&&a.jump(e,!0))})}},u.prototype.render=function(e){var n=this,i=n.config,r=n.type(),u=n.view();2===r?i.elem&&(i.elem.innerHTML=u):3===r?i.elem.html(u):a[t](i.elem)&&(a[t](i.elem).innerHTML=u),i.jump&&i.jump(i,e);var s=a[t]("layui-laypage-"+i.index);n.jump(s),i.hash&&!e&&(location.hash="!"+i.hash+"="+i.curr),n.skip(s)};var s={render:function(e){var a=new u(e);return a.index},index:layui.laypage?layui.laypage.index+1e4:0,on:function(e,a,t){return e.attachEvent?e.attachEvent("on"+a,function(a){a.target=a.srcElement,t.call(e,a)}):e.addEventListener(a,t,!1),this}};e(i,s)});!function(){"use strict";var e=window.layui&&layui.define,t={getPath:function(){var e=document.currentScript?document.currentScript.src:function(){for(var e,t=document.scripts,n=t.length-1,a=n;a>0;a--)if("interactive"===t[a].readyState){e=t[a].src;break}return e||t[n].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),getStyle:function(e,t){var n=e.currentStyle?e.currentStyle:window.getComputedStyle(e,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](t)},link:function(e,a,i){if(n.path){var r=document.getElementsByTagName("head")[0],o=document.createElement("link");"string"==typeof a&&(i=a);var s=(i||e).replace(/\.|\//g,""),l="layuicss-"+s,d=0;o.rel="stylesheet",o.href=n.path+e,o.id=l,document.getElementById(l)||r.appendChild(o),"function"==typeof a&&!function c(){return++d>80?window.console&&console.error("laydate.css: Invalid"):void(1989===parseInt(t.getStyle(document.getElementById(l),"width"))?a():setTimeout(c,100))}()}}},n={v:"5.0.9",config:{},index:window.laydate&&window.laydate.v?1e5:0,path:t.getPath,set:function(e){var t=this;return t.config=w.extend({},t.config,e),t},ready:function(a){var i="laydate",r="",o=(e?"modules/laydate/":"theme/")+"default/laydate.css?v="+n.v+r;return e?layui.addcss(o,a,i):t.link(o,a,i),this}},a=function(){var e=this;return{hint:function(t){e.hint.call(e,t)},config:e.config}},i="laydate",r=".layui-laydate",o="layui-this",s="laydate-disabled",l="开始日期超出了结束日期
                          建议重新选择",d=[100,2e5],c="layui-laydate-static",m="layui-laydate-list",u="laydate-selected",h="layui-laydate-hint",y="laydate-day-prev",f="laydate-day-next",p="layui-laydate-footer",g=".laydate-btns-confirm",v="laydate-time-text",D=".laydate-btns-time",T=function(e){var t=this;t.index=++n.index,t.config=w.extend({},t.config,n.config,e),n.ready(function(){t.init()})},w=function(e){return new C(e)},C=function(e){for(var t=0,n="object"==typeof e?[e]:(this.selector=e,document.querySelectorAll(e||null));t0)return n[0].getAttribute(e)}():n.each(function(n,a){a.setAttribute(e,t)})},C.prototype.removeAttr=function(e){return this.each(function(t,n){n.removeAttribute(e)})},C.prototype.html=function(e){return this.each(function(t,n){n.innerHTML=e})},C.prototype.val=function(e){return this.each(function(t,n){n.value=e})},C.prototype.append=function(e){return this.each(function(t,n){"object"==typeof e?n.appendChild(e):n.innerHTML=n.innerHTML+e})},C.prototype.remove=function(e){return this.each(function(t,n){e?n.removeChild(e):n.parentNode.removeChild(n)})},C.prototype.on=function(e,t){return this.each(function(n,a){a.attachEvent?a.attachEvent("on"+e,function(e){e.target=e.srcElement,t.call(a,e)}):a.addEventListener(e,t,!1)})},C.prototype.off=function(e,t){return this.each(function(n,a){a.detachEvent?a.detachEvent("on"+e,t):a.removeEventListener(e,t,!1)})},T.isLeapYear=function(e){return e%4===0&&e%100!==0||e%400===0},T.prototype.config={type:"date",range:!1,format:"yyyy-MM-dd",value:null,isInitValue:!0,min:"1900-1-1",max:"2099-12-31",trigger:"focus",show:!1,showBottom:!0,btns:["clear","now","confirm"],lang:"cn",theme:"default",position:null,calendar:!1,mark:{},zIndex:null,done:null,change:null},T.prototype.lang=function(){var e=this,t=e.config,n={cn:{weeks:["日","一","二","三","四","五","六"],time:["时","分","秒"],timeTips:"选择时间",startTime:"开始时间",endTime:"结束时间",dateTips:"返回日期",month:["一","二","三","四","五","六","七","八","九","十","十一","十二"],tools:{confirm:"确定",clear:"清空",now:"现在"}},en:{weeks:["Su","Mo","Tu","We","Th","Fr","Sa"],time:["Hours","Minutes","Seconds"],timeTips:"Select Time",startTime:"Start Time",endTime:"End Time",dateTips:"Select Date",month:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],tools:{confirm:"Confirm",clear:"Clear",now:"Now"}}};return n[t.lang]||n.cn},T.prototype.init=function(){var e=this,t=e.config,n="yyyy|y|MM|M|dd|d|HH|H|mm|m|ss|s",a="static"===t.position,i={year:"yyyy",month:"yyyy-MM",date:"yyyy-MM-dd",time:"HH:mm:ss",datetime:"yyyy-MM-dd HH:mm:ss"};t.elem=w(t.elem),t.eventElem=w(t.eventElem),t.elem[0]&&(t.range===!0&&(t.range="-"),t.format===i.date&&(t.format=i[t.type]),e.format=t.format.match(new RegExp(n+"|.","g"))||[],e.EXP_IF="",e.EXP_SPLIT="",w.each(e.format,function(t,a){var i=new RegExp(n).test(a)?"\\d{"+function(){return new RegExp(n).test(e.format[0===t?t+1:t-1]||"")?/^yyyy|y$/.test(a)?4:a.length:/^yyyy$/.test(a)?"1,4":/^y$/.test(a)?"1,308":"1,2"}()+"}":"\\"+a;e.EXP_IF=e.EXP_IF+i,e.EXP_SPLIT=e.EXP_SPLIT+"("+i+")"}),e.EXP_IF=new RegExp("^"+(t.range?e.EXP_IF+"\\s\\"+t.range+"\\s"+e.EXP_IF:e.EXP_IF)+"$"),e.EXP_SPLIT=new RegExp("^"+e.EXP_SPLIT+"$",""),e.isInput(t.elem[0])||"focus"===t.trigger&&(t.trigger="click"),t.elem.attr("lay-key")||(t.elem.attr("lay-key",e.index),t.eventElem.attr("lay-key",e.index)),t.mark=w.extend({},t.calendar&&"cn"===t.lang?{"0-1-1":"元旦","0-2-14":"情人","0-3-8":"妇女","0-3-12":"植树","0-4-1":"愚人","0-5-1":"劳动","0-5-4":"青年","0-6-1":"儿童","0-9-10":"教师","0-9-18":"国耻","0-10-1":"国庆","0-12-25":"圣诞"}:{},t.mark),w.each(["min","max"],function(e,n){var a=[],i=[];if("number"==typeof t[n]){var r=t[n],o=(new Date).getTime(),s=864e5,l=new Date(r?r0)return!0;var a=w.elem("div",{"class":"layui-laydate-header"}),i=[function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-prev-y"});return e.innerHTML="",e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-prev-m"});return e.innerHTML="",e}(),function(){var e=w.elem("div",{"class":"laydate-set-ym"}),t=w.elem("span"),n=w.elem("span");return e.appendChild(t),e.appendChild(n),e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-next-m"});return e.innerHTML="",e}(),function(){var e=w.elem("i",{"class":"layui-icon laydate-icon laydate-next-y"});return e.innerHTML="",e}()],d=w.elem("div",{"class":"layui-laydate-content"}),c=w.elem("table"),m=w.elem("thead"),u=w.elem("tr");w.each(i,function(e,t){a.appendChild(t)}),m.appendChild(u),w.each(new Array(6),function(e){var t=c.insertRow(0);w.each(new Array(7),function(a){if(0===e){var i=w.elem("th");i.innerHTML=n.weeks[a],u.appendChild(i)}t.insertCell(a)})}),c.insertBefore(m,c.children[0]),d.appendChild(c),r[e]=w.elem("div",{"class":"layui-laydate-main laydate-main-list-"+e}),r[e].appendChild(a),r[e].appendChild(d),o.push(i),s.push(d),l.push(c)}),w(d).html(function(){var e=[],i=[];return"datetime"===t.type&&e.push(''+n.timeTips+""),w.each(t.btns,function(e,r){var o=n.tools[r]||"btn";t.range&&"now"===r||(a&&"clear"===r&&(o="cn"===t.lang?"重置":"Reset"),i.push(''+o+""))}),e.push('"),e.join("")}()),w.each(r,function(e,t){i.appendChild(t)}),t.showBottom&&i.appendChild(d),/^#/.test(t.theme)){var m=w.elem("style"),u=["#{{id}} .layui-laydate-header{background-color:{{theme}};}","#{{id}} .layui-this{background-color:{{theme}} !important;}"].join("").replace(/{{id}}/g,e.elemID).replace(/{{theme}}/g,t.theme);"styleSheet"in m?(m.setAttribute("type","text/css"),m.styleSheet.cssText=u):m.innerHTML=u,w(i).addClass("laydate-theme-molv"),i.appendChild(m)}e.remove(T.thisElemDate),a?t.elem.append(i):(document.body.appendChild(i),e.position()),e.checkDate().calendar(),e.changeEvent(),T.thisElemDate=e.elemID,"function"==typeof t.ready&&t.ready(w.extend({},t.dateTime,{month:t.dateTime.month+1}))},T.prototype.remove=function(e){var t=this,n=(t.config,w("#"+(e||t.elemID)));return n.hasClass(c)||t.checkDate(function(){n.remove()}),t},T.prototype.position=function(){var e=this,t=e.config,n=e.bindElem||t.elem[0],a=n.getBoundingClientRect(),i=e.elem.offsetWidth,r=e.elem.offsetHeight,o=function(e){return e=e?"scrollLeft":"scrollTop",document.body[e]|document.documentElement[e]},s=function(e){return document.documentElement[e?"clientWidth":"clientHeight"]},l=5,d=a.left,c=a.bottom;d+i+l>s("width")&&(d=s("width")-i-l),c+r+l>s()&&(c=a.top>r?a.top-r:s()-r,c-=2*l),t.position&&(e.elem.style.position=t.position),e.elem.style.left=d+("fixed"===t.position?0:o(1))+"px",e.elem.style.top=c+("fixed"===t.position?0:o())+"px"},T.prototype.hint=function(e){var t=this,n=(t.config,w.elem("div",{"class":h}));t.elem&&(n.innerHTML=e||"",w(t.elem).find("."+h).remove(),t.elem.appendChild(n),clearTimeout(t.hinTimer),t.hinTimer=setTimeout(function(){w(t.elem).find("."+h).remove()},3e3))},T.prototype.getAsYM=function(e,t,n){return n?t--:t++,t<0&&(t=11,e--),t>11&&(t=0,e++),[e,t]},T.prototype.systemDate=function(e){var t=e||new Date;return{year:t.getFullYear(),month:t.getMonth(),date:t.getDate(),hours:e?e.getHours():0,minutes:e?e.getMinutes():0,seconds:e?e.getSeconds():0}},T.prototype.checkDate=function(e){var t,a,i=this,r=(new Date,i.config),o=r.dateTime=r.dateTime||i.systemDate(),s=i.bindElem||r.elem[0],l=(i.isInput(s)?"val":"html",i.isInput(s)?s.value:"static"===r.position?"":s.innerHTML),c=function(e){e.year>d[1]&&(e.year=d[1],a=!0),e.month>11&&(e.month=11,a=!0),e.hours>23&&(e.hours=0,a=!0),e.minutes>59&&(e.minutes=0,e.hours++,a=!0),e.seconds>59&&(e.seconds=0,e.minutes++,a=!0),t=n.getEndDate(e.month+1,e.year),e.date>t&&(e.date=t,a=!0)},m=function(e,t,n){var o=["startTime","endTime"];t=(t.match(i.EXP_SPLIT)||[]).slice(1),n=n||0,r.range&&(i[o[n]]=i[o[n]]||{}),w.each(i.format,function(s,l){var c=parseFloat(t[s]);t[s].length必须遵循下述格式:
                          "+(r.range?r.format+" "+r.range+" "+r.format:r.format)+"
                          已为你重置"),a=!0):l&&l.constructor===Date?r.dateTime=i.systemDate(l):(r.dateTime=i.systemDate(),delete i.startState,delete i.endState,delete i.startDate,delete i.endDate,delete i.startTime,delete i.endTime),c(o),a&&l&&i.setValue(r.range?i.endDate?i.parse():"":i.parse()),e&&e(),i)},T.prototype.mark=function(e,t){var n,a=this,i=a.config;return w.each(i.mark,function(e,a){var i=e.split("-");i[0]!=t[0]&&0!=i[0]||i[1]!=t[1]&&0!=i[1]||i[2]!=t[2]||(n=a||t[2])}),n&&e.html(''+n+""),a},T.prototype.limit=function(e,t,n,a){var i,r=this,o=r.config,l={},d=o[n>41?"endDate":"dateTime"],c=w.extend({},d,t||{});return w.each({now:c,min:o.min,max:o.max},function(e,t){l[e]=r.newDate(w.extend({year:t.year,month:t.month,date:t.date},function(){var e={};return w.each(a,function(n,a){e[a]=t[a]}),e}())).getTime()}),i=l.nowl.max,e&&e[i?"addClass":"removeClass"](s),i},T.prototype.calendar=function(e){var t,a,i,r=this,s=r.config,l=e||s.dateTime,c=new Date,m=r.lang(),u="date"!==s.type&&"datetime"!==s.type,h=e?1:0,y=w(r.table[h]).find("td"),f=w(r.elemHeader[h][2]).find("span");if(l.yeard[1]&&(l.year=d[1],r.hint("最高只能支持到公元"+d[1]+"年")),r.firstDate||(r.firstDate=w.extend({},l)),c.setFullYear(l.year,l.month,1),t=c.getDay(),a=n.getEndDate(l.month||12,l.year),i=n.getEndDate(l.month+1,l.year),w.each(y,function(e,n){var d=[l.year,l.month],c=0;n=w(n),n.removeAttr("class"),e=t&&e=n.firstDate.year&&(r.month=a.max.month,r.date=a.max.date),n.limit(w(i),r,t),M++}),w(u[f?0:1]).attr("lay-ym",M-8+"-"+T[1]).html(b+p+" - "+(M-1+p))}else if("month"===e)w.each(new Array(12),function(e){var i=w.elem("li",{"lay-ym":e}),s={year:T[0],month:e};e+1==T[1]&&w(i).addClass(o),i.innerHTML=r.month[e]+(f?"月":""),d.appendChild(i),T[0]=n.firstDate.year&&(s.date=a.max.date),n.limit(w(i),s,t)}),w(u[f?0:1]).attr("lay-ym",T[0]+"-"+T[1]).html(T[0]+p);else if("time"===e){var E=function(){w(d).find("ol").each(function(e,a){w(a).find("li").each(function(a,i){n.limit(w(i),[{hours:a},{hours:n[x].hours,minutes:a},{hours:n[x].hours,minutes:n[x].minutes,seconds:a}][e],t,[["hours"],["hours","minutes"],["hours","minutes","seconds"]][e])})}),a.range||n.limit(w(n.footer).find(g),n[x],0,["hours","minutes","seconds"])};a.range?n[x]||(n[x]={hours:0,minutes:0,seconds:0}):n[x]=i,w.each([24,60,60],function(e,t){var a=w.elem("li"),i=["

                          "+r.time[e]+"

                            "];w.each(new Array(t),function(t){i.push(""+w.digit(t,2)+"")}),a.innerHTML=i.join("")+"
                          ",d.appendChild(a)}),E()}if(y&&h.removeChild(y),h.appendChild(d),"year"===e||"month"===e)w(n.elemMain[t]).addClass("laydate-ym-show"),w(d).find("li").on("click",function(){var r=0|w(this).attr("lay-ym");if(!w(this).hasClass(s)){if(0===t)i[e]=r,l&&(n.startDate[e]=r),n.limit(w(n.footer).find(g),null,0);else if(l)n.endDate[e]=r;else{var c="year"===e?n.getAsYM(r,T[1]-1,"sub"):n.getAsYM(T[0],r,"sub");w.extend(i,{year:c[0],month:c[1]})}"year"===a.type||"month"===a.type?(w(d).find("."+o).removeClass(o),w(this).addClass(o),"month"===a.type&&"year"===e&&(n.listYM[t][0]=r,l&&(n[["startDate","endDate"][t]].year=r),n.list("month",t))):(n.checkDate("limit").calendar(),n.closeList()),n.setBtnStatus(),a.range||n.done(null,"change"),w(n.footer).find(D).removeClass(s)}});else{var S=w.elem("span",{"class":v}),k=function(){w(d).find("ol").each(function(e){var t=this,a=w(t).find("li");t.scrollTop=30*(n[x][C[e]]-2),t.scrollTop<=0&&a.each(function(e,n){if(!w(this).hasClass(s))return t.scrollTop=30*(e-2),!0})})},H=w(c[2]).find("."+v);k(),S.innerHTML=a.range?[r.startTime,r.endTime][t]:r.timeTips,w(n.elemMain[t]).addClass("laydate-time-show"),H[0]&&H.remove(),c[2].appendChild(S),w(d).find("ol").each(function(e){var t=this;w(t).find("li").on("click",function(){var r=0|this.innerHTML;w(this).hasClass(s)||(a.range?n[x][C[e]]=r:i[C[e]]=r,w(t).find("."+o).removeClass(o),w(this).addClass(o),E(),k(),(n.endDate||"time"===a.type)&&n.done(null,"change"),n.setBtnStatus())})})}return n},T.prototype.listYM=[],T.prototype.closeList=function(){var e=this;e.config;w.each(e.elemCont,function(t,n){w(this).find("."+m).remove(),w(e.elemMain[t]).removeClass("laydate-ym-show laydate-time-show")}),w(e.elem).find("."+v).remove()},T.prototype.setBtnStatus=function(e,t,n){var a,i=this,r=i.config,o=w(i.footer).find(g),d=r.range&&"date"!==r.type&&"time"!==r.type;d&&(t=t||i.startDate,n=n||i.endDate,a=i.newDate(t).getTime()>i.newDate(n).getTime(),i.limit(null,t)||i.limit(null,n)?o.addClass(s):o[a?"addClass":"removeClass"](s),e&&a&&i.hint("string"==typeof e?l.replace(/日期/g,e):l))},T.prototype.parse=function(e,t){var n=this,a=n.config,i=t||(e?w.extend({},n.endDate,n.endTime):a.range?w.extend({},n.startDate,n.startTime):a.dateTime),r=n.format.concat();return w.each(r,function(e,t){/yyyy|y/.test(t)?r[e]=w.digit(i.year,t.length):/MM|M/.test(t)?r[e]=w.digit(i.month+1,t.length):/dd|d/.test(t)?r[e]=w.digit(i.date,t.length):/HH|H/.test(t)?r[e]=w.digit(i.hours,t.length):/mm|m/.test(t)?r[e]=w.digit(i.minutes,t.length):/ss|s/.test(t)&&(r[e]=w.digit(i.seconds,t.length))}),a.range&&!e?r.join("")+" "+a.range+" "+n.parse(1):r.join("")},T.prototype.newDate=function(e){return e=e||{},new Date(e.year||1,e.month||0,e.date||1,e.hours||0,e.minutes||0,e.seconds||0)},T.prototype.setValue=function(e){var t=this,n=t.config,a=t.bindElem||n.elem[0],i=t.isInput(a)?"val":"html";return"static"===n.position||w(a)[i](e||""),this},T.prototype.stampRange=function(){var e,t,n=this,a=n.config,i=w(n.elem).find("td");if(a.range&&!n.endDate&&w(n.footer).find(g).addClass(s),n.endDate)return e=n.newDate({year:n.startDate.year,month:n.startDate.month,date:n.startDate.date}).getTime(),t=n.newDate({year:n.endDate.year,month:n.endDate.month,date:n.endDate.date}).getTime(),e>t?n.hint(l):void w.each(i,function(a,i){var r=w(i).attr("lay-ymd").split("-"),s=n.newDate({year:r[0],month:r[1]-1,date:r[2]}).getTime();w(i).removeClass(u+" "+o),s!==e&&s!==t||w(i).addClass(w(i).hasClass(y)||w(i).hasClass(f)?u:o),s>e&&s0&&t-1 in e)}function r(e,t,n){if(pe.isFunction(t))return pe.grep(e,function(e,r){return!!t.call(e,r,e)!==n});if(t.nodeType)return pe.grep(e,function(e){return e===t!==n});if("string"==typeof t){if(Ce.test(t))return pe.filter(t,e,n);t=pe.filter(t,e)}return pe.grep(e,function(e){return pe.inArray(e,t)>-1!==n})}function i(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}function o(e){var t={};return pe.each(e.match(De)||[],function(e,n){t[n]=!0}),t}function a(){re.addEventListener?(re.removeEventListener("DOMContentLoaded",s),e.removeEventListener("load",s)):(re.detachEvent("onreadystatechange",s),e.detachEvent("onload",s))}function s(){(re.addEventListener||"load"===e.event.type||"complete"===re.readyState)&&(a(),pe.ready())}function u(e,t,n){if(void 0===n&&1===e.nodeType){var r="data-"+t.replace(_e,"-$1").toLowerCase();if(n=e.getAttribute(r),"string"==typeof n){try{n="true"===n||"false"!==n&&("null"===n?null:+n+""===n?+n:qe.test(n)?pe.parseJSON(n):n)}catch(i){}pe.data(e,t,n)}else n=void 0}return n}function l(e){var t;for(t in e)if(("data"!==t||!pe.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}function c(e,t,n,r){if(He(e)){var i,o,a=pe.expando,s=e.nodeType,u=s?pe.cache:e,l=s?e[a]:e[a]&&a;if(l&&u[l]&&(r||u[l].data)||void 0!==n||"string"!=typeof t)return l||(l=s?e[a]=ne.pop()||pe.guid++:a),u[l]||(u[l]=s?{}:{toJSON:pe.noop}),"object"!=typeof t&&"function"!=typeof t||(r?u[l]=pe.extend(u[l],t):u[l].data=pe.extend(u[l].data,t)),o=u[l],r||(o.data||(o.data={}),o=o.data),void 0!==n&&(o[pe.camelCase(t)]=n),"string"==typeof t?(i=o[t],null==i&&(i=o[pe.camelCase(t)])):i=o,i}}function f(e,t,n){if(He(e)){var r,i,o=e.nodeType,a=o?pe.cache:e,s=o?e[pe.expando]:pe.expando;if(a[s]){if(t&&(r=n?a[s]:a[s].data)){pe.isArray(t)?t=t.concat(pe.map(t,pe.camelCase)):t in r?t=[t]:(t=pe.camelCase(t),t=t in r?[t]:t.split(" ")),i=t.length;for(;i--;)delete r[t[i]];if(n?!l(r):!pe.isEmptyObject(r))return}(n||(delete a[s].data,l(a[s])))&&(o?pe.cleanData([e],!0):fe.deleteExpando||a!=a.window?delete a[s]:a[s]=void 0)}}}function d(e,t,n,r){var i,o=1,a=20,s=r?function(){return r.cur()}:function(){return pe.css(e,t,"")},u=s(),l=n&&n[3]||(pe.cssNumber[t]?"":"px"),c=(pe.cssNumber[t]||"px"!==l&&+u)&&Me.exec(pe.css(e,t));if(c&&c[3]!==l){l=l||c[3],n=n||[],c=+u||1;do o=o||".5",c/=o,pe.style(e,t,c+l);while(o!==(o=s()/u)&&1!==o&&--a)}return n&&(c=+c||+u||0,i=n[1]?c+(n[1]+1)*n[2]:+n[2],r&&(r.unit=l,r.start=c,r.end=i)),i}function p(e){var t=ze.split("|"),n=e.createDocumentFragment();if(n.createElement)for(;t.length;)n.createElement(t.pop());return n}function h(e,t){var n,r,i=0,o="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):void 0;if(!o)for(o=[],n=e.childNodes||e;null!=(r=n[i]);i++)!t||pe.nodeName(r,t)?o.push(r):pe.merge(o,h(r,t));return void 0===t||t&&pe.nodeName(e,t)?pe.merge([e],o):o}function g(e,t){for(var n,r=0;null!=(n=e[r]);r++)pe._data(n,"globalEval",!t||pe._data(t[r],"globalEval"))}function m(e){Be.test(e.type)&&(e.defaultChecked=e.checked)}function y(e,t,n,r,i){for(var o,a,s,u,l,c,f,d=e.length,y=p(t),v=[],x=0;x"!==f[1]||Ve.test(a)?0:u:u.firstChild,o=a&&a.childNodes.length;o--;)pe.nodeName(c=a.childNodes[o],"tbody")&&!c.childNodes.length&&a.removeChild(c);for(pe.merge(v,u.childNodes),u.textContent="";u.firstChild;)u.removeChild(u.firstChild);u=y.lastChild}else v.push(t.createTextNode(a));for(u&&y.removeChild(u),fe.appendChecked||pe.grep(h(v,"input"),m),x=0;a=v[x++];)if(r&&pe.inArray(a,r)>-1)i&&i.push(a);else if(s=pe.contains(a.ownerDocument,a),u=h(y.appendChild(a),"script"),s&&g(u),n)for(o=0;a=u[o++];)Ie.test(a.type||"")&&n.push(a);return u=null,y}function v(){return!0}function x(){return!1}function b(){try{return re.activeElement}catch(e){}}function w(e,t,n,r,i,o){var a,s;if("object"==typeof t){"string"!=typeof n&&(r=r||n,n=void 0);for(s in t)w(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),i===!1)i=x;else if(!i)return e;return 1===o&&(a=i,i=function(e){return pe().off(e),a.apply(this,arguments)},i.guid=a.guid||(a.guid=pe.guid++)),e.each(function(){pe.event.add(this,t,i,r,n)})}function T(e,t){return pe.nodeName(e,"table")&&pe.nodeName(11!==t.nodeType?t:t.firstChild,"tr")?e.getElementsByTagName("tbody")[0]||e.appendChild(e.ownerDocument.createElement("tbody")):e}function C(e){return e.type=(null!==pe.find.attr(e,"type"))+"/"+e.type,e}function E(e){var t=it.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function N(e,t){if(1===t.nodeType&&pe.hasData(e)){var n,r,i,o=pe._data(e),a=pe._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;r1&&"string"==typeof p&&!fe.checkClone&&rt.test(p))return e.each(function(i){var o=e.eq(i);g&&(t[0]=p.call(this,i,o.html())),S(o,t,n,r)});if(f&&(l=y(t,e[0].ownerDocument,!1,e,r),i=l.firstChild,1===l.childNodes.length&&(l=i),i||r)){for(s=pe.map(h(l,"script"),C),a=s.length;c")).appendTo(t.documentElement),t=(ut[0].contentWindow||ut[0].contentDocument).document,t.write(),t.close(),n=D(e,t),ut.detach()),lt[e]=n),n}function L(e,t){return{get:function(){return e()?void delete this.get:(this.get=t).apply(this,arguments)}}}function H(e){if(e in Et)return e;for(var t=e.charAt(0).toUpperCase()+e.slice(1),n=Ct.length;n--;)if(e=Ct[n]+t,e in Et)return e}function q(e,t){for(var n,r,i,o=[],a=0,s=e.length;a=0&&n=0},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},isPlainObject:function(e){var t;if(!e||"object"!==pe.type(e)||e.nodeType||pe.isWindow(e))return!1;try{if(e.constructor&&!ce.call(e,"constructor")&&!ce.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}if(!fe.ownFirst)for(t in e)return ce.call(e,t);for(t in e);return void 0===t||ce.call(e,t)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?ue[le.call(e)]||"object":typeof e},globalEval:function(t){t&&pe.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(ge,"ms-").replace(me,ye)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t){var r,i=0;if(n(e))for(r=e.length;iT.cacheLength&&delete e[t.shift()],e[n+" "]=r}var t=[];return e}function r(e){return e[P]=!0,e}function i(e){var t=H.createElement("div");try{return!!e(t)}catch(n){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function o(e,t){for(var n=e.split("|"),r=n.length;r--;)T.attrHandle[n[r]]=t}function a(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&(~t.sourceIndex||V)-(~e.sourceIndex||V);if(r)return r;if(n)for(;n=n.nextSibling;)if(n===t)return-1;return e?1:-1}function s(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function u(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function l(e){return r(function(t){return t=+t,r(function(n,r){for(var i,o=e([],n.length,t),a=o.length;a--;)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}function c(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}function f(){}function d(e){for(var t=0,n=e.length,r="";t1?function(t,n,r){for(var i=e.length;i--;)if(!e[i](t,n,r))return!1;return!0}:e[0]}function g(e,n,r){for(var i=0,o=n.length;i-1&&(r[l]=!(a[l]=f))}}else x=m(x===a?x.splice(h,x.length):x),o?o(null,a,x,u):Q.apply(a,x)})}function v(e){for(var t,n,r,i=e.length,o=T.relative[e[0].type],a=o||T.relative[" "],s=o?1:0,u=p(function(e){return e===t},a,!0),l=p(function(e){return ee(t,e)>-1},a,!0),c=[function(e,n,r){var i=!o&&(r||n!==A)||((t=n).nodeType?u(e,n,r):l(e,n,r));return t=null,i}];s1&&h(c),s>1&&d(e.slice(0,s-1).concat({value:" "===e[s-2].type?"*":""})).replace(se,"$1"),n,s0,o=e.length>0,a=function(r,a,s,u,l){var c,f,d,p=0,h="0",g=r&&[],y=[],v=A,x=r||o&&T.find.TAG("*",l),b=W+=null==v?1:Math.random()||.1,w=x.length;for(l&&(A=a===H||a||l);h!==w&&null!=(c=x[h]);h++){if(o&&c){for(f=0,a||c.ownerDocument===H||(L(c),s=!_);d=e[f++];)if(d(c,a||H,s)){u.push(c);break}l&&(W=b)}i&&((c=!d&&c)&&p--,r&&g.push(c))}if(p+=h,i&&h!==p){for(f=0;d=n[f++];)d(g,y,a,s);if(r){if(p>0)for(;h--;)g[h]||y[h]||(y[h]=G.call(u));y=m(y)}Q.apply(u,y),l&&!r&&y.length>0&&p+n.length>1&&t.uniqueSort(u)}return l&&(W=b,A=v),g};return i?r(a):a}var b,w,T,C,E,N,k,S,A,D,j,L,H,q,_,F,M,O,R,P="sizzle"+1*new Date,B=e.document,W=0,I=0,$=n(),z=n(),X=n(),U=function(e,t){return e===t&&(j=!0),0},V=1<<31,Y={}.hasOwnProperty,J=[],G=J.pop,K=J.push,Q=J.push,Z=J.slice,ee=function(e,t){for(var n=0,r=e.length;n+~]|"+ne+")"+ne+"*"),ce=new RegExp("="+ne+"*([^\\]'\"]*?)"+ne+"*\\]","g"),fe=new RegExp(oe),de=new RegExp("^"+re+"$"),pe={ID:new RegExp("^#("+re+")"),CLASS:new RegExp("^\\.("+re+")"),TAG:new RegExp("^("+re+"|[*])"),ATTR:new RegExp("^"+ie),PSEUDO:new RegExp("^"+oe),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+ne+"*(even|odd|(([+-]|)(\\d*)n|)"+ne+"*(?:([+-]|)"+ne+"*(\\d+)|))"+ne+"*\\)|)","i"),bool:new RegExp("^(?:"+te+")$","i"),needsContext:new RegExp("^"+ne+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+ne+"*((?:-\\d)?\\d*)"+ne+"*\\)|)(?=[^-]|$)","i")},he=/^(?:input|select|textarea|button)$/i,ge=/^h\d$/i,me=/^[^{]+\{\s*\[native \w/,ye=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ve=/[+~]/,xe=/'|\\/g,be=new RegExp("\\\\([\\da-f]{1,6}"+ne+"?|("+ne+")|.)","ig"),we=function(e,t,n){var r="0x"+t-65536;return r!==r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},Te=function(){L()};try{Q.apply(J=Z.call(B.childNodes),B.childNodes),J[B.childNodes.length].nodeType}catch(Ce){Q={apply:J.length?function(e,t){K.apply(e,Z.call(t))}:function(e,t){for(var n=e.length,r=0;e[n++]=t[r++];);e.length=n-1}}}w=t.support={},E=t.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return!!t&&"HTML"!==t.nodeName},L=t.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:B;return r!==H&&9===r.nodeType&&r.documentElement?(H=r,q=H.documentElement,_=!E(H),(n=H.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",Te,!1):n.attachEvent&&n.attachEvent("onunload",Te)),w.attributes=i(function(e){return e.className="i",!e.getAttribute("className")}),w.getElementsByTagName=i(function(e){return e.appendChild(H.createComment("")),!e.getElementsByTagName("*").length}),w.getElementsByClassName=me.test(H.getElementsByClassName),w.getById=i(function(e){return q.appendChild(e).id=P,!H.getElementsByName||!H.getElementsByName(P).length}),w.getById?(T.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&_){var n=t.getElementById(e);return n?[n]:[]}},T.filter.ID=function(e){var t=e.replace(be,we);return function(e){return e.getAttribute("id")===t}}):(delete T.find.ID,T.filter.ID=function(e){var t=e.replace(be,we);return function(e){var n="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return n&&n.value===t}}),T.find.TAG=w.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):w.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){for(;n=o[i++];)1===n.nodeType&&r.push(n);return r}return o},T.find.CLASS=w.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&_)return t.getElementsByClassName(e)},M=[],F=[],(w.qsa=me.test(H.querySelectorAll))&&(i(function(e){q.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&F.push("[*^$]="+ne+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||F.push("\\["+ne+"*(?:value|"+te+")"),e.querySelectorAll("[id~="+P+"-]").length||F.push("~="),e.querySelectorAll(":checked").length||F.push(":checked"),e.querySelectorAll("a#"+P+"+*").length||F.push(".#.+[+~]")}),i(function(e){var t=H.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&F.push("name"+ne+"*[*^$|!~]?="),e.querySelectorAll(":enabled").length||F.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),F.push(",.*:")})),(w.matchesSelector=me.test(O=q.matches||q.webkitMatchesSelector||q.mozMatchesSelector||q.oMatchesSelector||q.msMatchesSelector))&&i(function(e){w.disconnectedMatch=O.call(e,"div"),O.call(e,"[s!='']:x"),M.push("!=",oe)}),F=F.length&&new RegExp(F.join("|")),M=M.length&&new RegExp(M.join("|")),t=me.test(q.compareDocumentPosition),R=t||me.test(q.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)for(;t=t.parentNode;)if(t===e)return!0;return!1},U=t?function(e,t){if(e===t)return j=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n?n:(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1,1&n||!w.sortDetached&&t.compareDocumentPosition(e)===n?e===H||e.ownerDocument===B&&R(B,e)?-1:t===H||t.ownerDocument===B&&R(B,t)?1:D?ee(D,e)-ee(D,t):0:4&n?-1:1)}:function(e,t){if(e===t)return j=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,s=[e],u=[t];if(!i||!o)return e===H?-1:t===H?1:i?-1:o?1:D?ee(D,e)-ee(D,t):0;if(i===o)return a(e,t);for(n=e;n=n.parentNode;)s.unshift(n);for(n=t;n=n.parentNode;)u.unshift(n);for(;s[r]===u[r];)r++;return r?a(s[r],u[r]):s[r]===B?-1:u[r]===B?1:0},H):H},t.matches=function(e,n){return t(e,null,null,n)},t.matchesSelector=function(e,n){if((e.ownerDocument||e)!==H&&L(e),n=n.replace(ce,"='$1']"),w.matchesSelector&&_&&!X[n+" "]&&(!M||!M.test(n))&&(!F||!F.test(n)))try{var r=O.call(e,n);if(r||w.disconnectedMatch||e.document&&11!==e.document.nodeType)return r}catch(i){}return t(n,H,null,[e]).length>0},t.contains=function(e,t){return(e.ownerDocument||e)!==H&&L(e),R(e,t)},t.attr=function(e,t){(e.ownerDocument||e)!==H&&L(e);var n=T.attrHandle[t.toLowerCase()],r=n&&Y.call(T.attrHandle,t.toLowerCase())?n(e,t,!_):void 0;return void 0!==r?r:w.attributes||!_?e.getAttribute(t):(r=e.getAttributeNode(t))&&r.specified?r.value:null},t.error=function(e){throw new Error("Syntax error, unrecognized expression: "+e)},t.uniqueSort=function(e){var t,n=[],r=0,i=0;if(j=!w.detectDuplicates,D=!w.sortStable&&e.slice(0),e.sort(U),j){for(;t=e[i++];)t===e[i]&&(r=n.push(i));for(;r--;)e.splice(n[r],1)}return D=null,e},C=t.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=C(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r++];)n+=C(t);return n},T=t.selectors={cacheLength:50,createPseudo:r,match:pe,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(be,we),e[3]=(e[3]||e[4]||e[5]||"").replace(be,we),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||t.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&t.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return pe.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&fe.test(n)&&(t=N(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(be,we).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=$[e+" "];return t||(t=new RegExp("(^|"+ne+")"+e+"("+ne+"|$)"))&&$(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(e,n,r){return function(i){var o=t.attr(i,e);return null==o?"!="===n:!n||(o+="","="===n?o===r:"!="===n?o!==r:"^="===n?r&&0===o.indexOf(r):"*="===n?r&&o.indexOf(r)>-1:"$="===n?r&&o.slice(-r.length)===r:"~="===n?(" "+o.replace(ae," ")+" ").indexOf(r)>-1:"|="===n&&(o===r||o.slice(0,r.length+1)===r+"-"))}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,f,d,p,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s,x=!1;if(m){if(o){for(;g;){for(d=t;d=d[g];)if(s?d.nodeName.toLowerCase()===y:1===d.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){for(d=m,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}), +l=c[e]||[],p=l[0]===W&&l[1],x=p&&l[2],d=p&&m.childNodes[p];d=++p&&d&&d[g]||(x=p=0)||h.pop();)if(1===d.nodeType&&++x&&d===t){c[e]=[W,p,x];break}}else if(v&&(d=t,f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),l=c[e]||[],p=l[0]===W&&l[1],x=p),x===!1)for(;(d=++p&&d&&d[g]||(x=p=0)||h.pop())&&((s?d.nodeName.toLowerCase()!==y:1!==d.nodeType)||!++x||(v&&(f=d[P]||(d[P]={}),c=f[d.uniqueID]||(f[d.uniqueID]={}),c[e]=[W,x]),d!==t)););return x-=i,x===r||x%r===0&&x/r>=0}}},PSEUDO:function(e,n){var i,o=T.pseudos[e]||T.setFilters[e.toLowerCase()]||t.error("unsupported pseudo: "+e);return o[P]?o(n):o.length>1?(i=[e,e,"",n],T.setFilters.hasOwnProperty(e.toLowerCase())?r(function(e,t){for(var r,i=o(e,n),a=i.length;a--;)r=ee(e,i[a]),e[r]=!(t[r]=i[a])}):function(e){return o(e,0,i)}):o}},pseudos:{not:r(function(e){var t=[],n=[],i=k(e.replace(se,"$1"));return i[P]?r(function(e,t,n,r){for(var o,a=i(e,null,r,[]),s=e.length;s--;)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,r,o){return t[0]=e,i(t,null,o,n),t[0]=null,!n.pop()}}),has:r(function(e){return function(n){return t(e,n).length>0}}),contains:r(function(e){return e=e.replace(be,we),function(t){return(t.textContent||t.innerText||C(t)).indexOf(e)>-1}}),lang:r(function(e){return de.test(e||"")||t.error("unsupported lang: "+e),e=e.replace(be,we).toLowerCase(),function(t){var n;do if(n=_?t.lang:t.getAttribute("xml:lang")||t.getAttribute("lang"))return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===q},focus:function(e){return e===H.activeElement&&(!H.hasFocus||H.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeType<6)return!1;return!0},parent:function(e){return!T.pseudos.empty(e)},header:function(e){return ge.test(e.nodeName)},input:function(e){return he.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||"text"===t.toLowerCase())},first:l(function(){return[0]}),last:l(function(e,t){return[t-1]}),eq:l(function(e,t,n){return[n<0?n+t:n]}),even:l(function(e,t){for(var n=0;n=0;)e.push(r);return e}),gt:l(function(e,t,n){for(var r=n<0?n+t:n;++r2&&"ID"===(a=o[0]).type&&w.getById&&9===t.nodeType&&_&&T.relative[o[1].type]){if(t=(T.find.ID(a.matches[0].replace(be,we),t)||[])[0],!t)return n;l&&(t=t.parentNode),e=e.slice(o.shift().value.length)}for(i=pe.needsContext.test(e)?0:o.length;i--&&(a=o[i],!T.relative[s=a.type]);)if((u=T.find[s])&&(r=u(a.matches[0].replace(be,we),ve.test(o[0].type)&&c(t.parentNode)||t))){if(o.splice(i,1),e=r.length&&d(o),!e)return Q.apply(n,r),n;break}}return(l||k(e,f))(r,t,!_,n,!t||ve.test(e)&&c(t.parentNode)||t),n},w.sortStable=P.split("").sort(U).join("")===P,w.detectDuplicates=!!j,L(),w.sortDetached=i(function(e){return 1&e.compareDocumentPosition(H.createElement("div"))}),i(function(e){return e.innerHTML="","#"===e.firstChild.getAttribute("href")})||o("type|href|height|width",function(e,t,n){if(!n)return e.getAttribute(t,"type"===t.toLowerCase()?1:2)}),w.attributes&&i(function(e){return e.innerHTML="",e.firstChild.setAttribute("value",""),""===e.firstChild.getAttribute("value")})||o("value",function(e,t,n){if(!n&&"input"===e.nodeName.toLowerCase())return e.defaultValue}),i(function(e){return null==e.getAttribute("disabled")})||o(te,function(e,t,n){var r;if(!n)return e[t]===!0?t.toLowerCase():(r=e.getAttributeNode(t))&&r.specified?r.value:null}),t}(e);pe.find=ve,pe.expr=ve.selectors,pe.expr[":"]=pe.expr.pseudos,pe.uniqueSort=pe.unique=ve.uniqueSort,pe.text=ve.getText,pe.isXMLDoc=ve.isXML,pe.contains=ve.contains;var xe=function(e,t,n){for(var r=[],i=void 0!==n;(e=e[t])&&9!==e.nodeType;)if(1===e.nodeType){if(i&&pe(e).is(n))break;r.push(e)}return r},be=function(e,t){for(var n=[];e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n},we=pe.expr.match.needsContext,Te=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,Ce=/^.[^:#\[\.,]*$/;pe.filter=function(e,t,n){var r=t[0];return n&&(e=":not("+e+")"),1===t.length&&1===r.nodeType?pe.find.matchesSelector(r,e)?[r]:[]:pe.find.matches(e,pe.grep(t,function(e){return 1===e.nodeType}))},pe.fn.extend({find:function(e){var t,n=[],r=this,i=r.length;if("string"!=typeof e)return this.pushStack(pe(e).filter(function(){for(t=0;t1?pe.unique(n):n),n.selector=this.selector?this.selector+" "+e:e,n},filter:function(e){return this.pushStack(r(this,e||[],!1))},not:function(e){return this.pushStack(r(this,e||[],!0))},is:function(e){return!!r(this,"string"==typeof e&&we.test(e)?pe(e):e||[],!1).length}});var Ee,Ne=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,ke=pe.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||Ee,"string"==typeof e){if(r="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:Ne.exec(e),!r||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof pe?t[0]:t,pe.merge(this,pe.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:re,!0)),Te.test(r[1])&&pe.isPlainObject(t))for(r in t)pe.isFunction(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}if(i=re.getElementById(r[2]),i&&i.parentNode){if(i.id!==r[2])return Ee.find(e);this.length=1,this[0]=i}return this.context=re,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):pe.isFunction(e)?"undefined"!=typeof n.ready?n.ready(e):e(pe):(void 0!==e.selector&&(this.selector=e.selector,this.context=e.context),pe.makeArray(e,this))};ke.prototype=pe.fn,Ee=pe(re);var Se=/^(?:parents|prev(?:Until|All))/,Ae={children:!0,contents:!0,next:!0,prev:!0};pe.fn.extend({has:function(e){var t,n=pe(e,this),r=n.length;return this.filter(function(){for(t=0;t-1:1===n.nodeType&&pe.find.matchesSelector(n,e))){o.push(n);break}return this.pushStack(o.length>1?pe.uniqueSort(o):o)},index:function(e){return e?"string"==typeof e?pe.inArray(this[0],pe(e)):pe.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){return this.pushStack(pe.uniqueSort(pe.merge(this.get(),pe(e,t))))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),pe.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return xe(e,"parentNode")},parentsUntil:function(e,t,n){return xe(e,"parentNode",n)},next:function(e){return i(e,"nextSibling")},prev:function(e){return i(e,"previousSibling")},nextAll:function(e){return xe(e,"nextSibling")},prevAll:function(e){return xe(e,"previousSibling")},nextUntil:function(e,t,n){return xe(e,"nextSibling",n)},prevUntil:function(e,t,n){return xe(e,"previousSibling",n)},siblings:function(e){return be((e.parentNode||{}).firstChild,e)},children:function(e){return be(e.firstChild)},contents:function(e){return pe.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:pe.merge([],e.childNodes)}},function(e,t){pe.fn[e]=function(n,r){var i=pe.map(this,t,n);return"Until"!==e.slice(-5)&&(r=n),r&&"string"==typeof r&&(i=pe.filter(r,i)),this.length>1&&(Ae[e]||(i=pe.uniqueSort(i)),Se.test(e)&&(i=i.reverse())),this.pushStack(i)}});var De=/\S+/g;pe.Callbacks=function(e){e="string"==typeof e?o(e):pe.extend({},e);var t,n,r,i,a=[],s=[],u=-1,l=function(){for(i=e.once,r=t=!0;s.length;u=-1)for(n=s.shift();++u-1;)a.splice(n,1),n<=u&&u--}),this},has:function(e){return e?pe.inArray(e,a)>-1:a.length>0},empty:function(){return a&&(a=[]),this},disable:function(){return i=s=[],a=n="",this},disabled:function(){return!a},lock:function(){return i=!0,n||c.disable(),this},locked:function(){return!!i},fireWith:function(e,n){return i||(n=n||[],n=[e,n.slice?n.slice():n],s.push(n),t||l()),this},fire:function(){return c.fireWith(this,arguments),this},fired:function(){return!!r}};return c},pe.extend({Deferred:function(e){var t=[["resolve","done",pe.Callbacks("once memory"),"resolved"],["reject","fail",pe.Callbacks("once memory"),"rejected"],["notify","progress",pe.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return pe.Deferred(function(n){pe.each(t,function(t,o){var a=pe.isFunction(e[t])&&e[t];i[o[1]](function(){var e=a&&a.apply(this,arguments);e&&pe.isFunction(e.promise)?e.promise().progress(n.notify).done(n.resolve).fail(n.reject):n[o[0]+"With"](this===r?n.promise():this,a?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?pe.extend(e,r):r}},i={};return r.pipe=r.then,pe.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t,n,r,i=0,o=ie.call(arguments),a=o.length,s=1!==a||e&&pe.isFunction(e.promise)?a:0,u=1===s?e:pe.Deferred(),l=function(e,n,r){return function(i){n[e]=this,r[e]=arguments.length>1?ie.call(arguments):i,r===t?u.notifyWith(n,r):--s||u.resolveWith(n,r)}};if(a>1)for(t=new Array(a),n=new Array(a),r=new Array(a);i0||(je.resolveWith(re,[pe]),pe.fn.triggerHandler&&(pe(re).triggerHandler("ready"),pe(re).off("ready"))))}}),pe.ready.promise=function(t){if(!je)if(je=pe.Deferred(),"complete"===re.readyState||"loading"!==re.readyState&&!re.documentElement.doScroll)e.setTimeout(pe.ready);else if(re.addEventListener)re.addEventListener("DOMContentLoaded",s),e.addEventListener("load",s);else{re.attachEvent("onreadystatechange",s),e.attachEvent("onload",s);var n=!1;try{n=null==e.frameElement&&re.documentElement}catch(r){}n&&n.doScroll&&!function i(){if(!pe.isReady){try{n.doScroll("left")}catch(t){return e.setTimeout(i,50)}a(),pe.ready()}}()}return je.promise(t)},pe.ready.promise();var Le;for(Le in pe(fe))break;fe.ownFirst="0"===Le,fe.inlineBlockNeedsLayout=!1,pe(function(){var e,t,n,r;n=re.getElementsByTagName("body")[0],n&&n.style&&(t=re.createElement("div"),r=re.createElement("div"),r.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",n.appendChild(r).appendChild(t),"undefined"!=typeof t.style.zoom&&(t.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",fe.inlineBlockNeedsLayout=e=3===t.offsetWidth,e&&(n.style.zoom=1)),n.removeChild(r))}),function(){var e=re.createElement("div");fe.deleteExpando=!0;try{delete e.test}catch(t){fe.deleteExpando=!1}e=null}();var He=function(e){var t=pe.noData[(e.nodeName+" ").toLowerCase()],n=+e.nodeType||1;return(1===n||9===n)&&(!t||t!==!0&&e.getAttribute("classid")===t)},qe=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,_e=/([A-Z])/g;pe.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(e){return e=e.nodeType?pe.cache[e[pe.expando]]:e[pe.expando],!!e&&!l(e)},data:function(e,t,n){return c(e,t,n)},removeData:function(e,t){return f(e,t)},_data:function(e,t,n){return c(e,t,n,!0)},_removeData:function(e,t){return f(e,t,!0)}}),pe.fn.extend({data:function(e,t){var n,r,i,o=this[0],a=o&&o.attributes;if(void 0===e){if(this.length&&(i=pe.data(o),1===o.nodeType&&!pe._data(o,"parsedAttrs"))){for(n=a.length;n--;)a[n]&&(r=a[n].name,0===r.indexOf("data-")&&(r=pe.camelCase(r.slice(5)),u(o,r,i[r])));pe._data(o,"parsedAttrs",!0)}return i}return"object"==typeof e?this.each(function(){pe.data(this,e)}):arguments.length>1?this.each(function(){pe.data(this,e,t)}):o?u(o,e,pe.data(o,e)):void 0},removeData:function(e){return this.each(function(){pe.removeData(this,e)})}}),pe.extend({queue:function(e,t,n){var r;if(e)return t=(t||"fx")+"queue",r=pe._data(e,t),n&&(!r||pe.isArray(n)?r=pe._data(e,t,pe.makeArray(n)):r.push(n)),r||[]},dequeue:function(e,t){t=t||"fx";var n=pe.queue(e,t),r=n.length,i=n.shift(),o=pe._queueHooks(e,t),a=function(){pe.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return pe._data(e,n)||pe._data(e,n,{empty:pe.Callbacks("once memory").add(function(){pe._removeData(e,t+"queue"),pe._removeData(e,n)})})}}),pe.fn.extend({queue:function(e,t){var n=2;return"string"!=typeof e&&(t=e,e="fx",n--),arguments.length
                          a",fe.leadingWhitespace=3===e.firstChild.nodeType,fe.tbody=!e.getElementsByTagName("tbody").length,fe.htmlSerialize=!!e.getElementsByTagName("link").length,fe.html5Clone="<:nav>"!==re.createElement("nav").cloneNode(!0).outerHTML,n.type="checkbox",n.checked=!0,t.appendChild(n),fe.appendChecked=n.checked,e.innerHTML="",fe.noCloneChecked=!!e.cloneNode(!0).lastChild.defaultValue,t.appendChild(e),n=re.createElement("input"),n.setAttribute("type","radio"),n.setAttribute("checked","checked"),n.setAttribute("name","t"),e.appendChild(n),fe.checkClone=e.cloneNode(!0).cloneNode(!0).lastChild.checked,fe.noCloneEvent=!!e.addEventListener,e[pe.expando]=1,fe.attributes=!e.getAttribute(pe.expando)}();var Xe={option:[1,""],legend:[1,"
                          ","
                          "],area:[1,"",""],param:[1,"",""],thead:[1,"","
                          "],tr:[2,"","
                          "],col:[2,"","
                          "],td:[3,"","
                          "],_default:fe.htmlSerialize?[0,"",""]:[1,"X
                          ","
                          "]};Xe.optgroup=Xe.option,Xe.tbody=Xe.tfoot=Xe.colgroup=Xe.caption=Xe.thead,Xe.th=Xe.td;var Ue=/<|&#?\w+;/,Ve=/-1&&(h=p.split("."),p=h.shift(),h.sort()),a=p.indexOf(":")<0&&"on"+p,t=t[pe.expando]?t:new pe.Event(p,"object"==typeof t&&t),t.isTrigger=i?2:3,t.namespace=h.join("."),t.rnamespace=t.namespace?new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,t.result=void 0,t.target||(t.target=r),n=null==n?[t]:pe.makeArray(n,[t]),l=pe.event.special[p]||{},i||!l.trigger||l.trigger.apply(r,n)!==!1)){if(!i&&!l.noBubble&&!pe.isWindow(r)){for(u=l.delegateType||p,Ke.test(u+p)||(s=s.parentNode);s;s=s.parentNode)d.push(s),c=s;c===(r.ownerDocument||re)&&d.push(c.defaultView||c.parentWindow||e)}for(f=0;(s=d[f++])&&!t.isPropagationStopped();)t.type=f>1?u:l.bindType||p,o=(pe._data(s,"events")||{})[t.type]&&pe._data(s,"handle"),o&&o.apply(s,n),o=a&&s[a],o&&o.apply&&He(s)&&(t.result=o.apply(s,n),t.result===!1&&t.preventDefault());if(t.type=p,!i&&!t.isDefaultPrevented()&&(!l._default||l._default.apply(d.pop(),n)===!1)&&He(r)&&a&&r[p]&&!pe.isWindow(r)){c=r[a],c&&(r[a]=null),pe.event.triggered=p;try{r[p]()}catch(g){}pe.event.triggered=void 0,c&&(r[a]=c)}return t.result}},dispatch:function(e){e=pe.event.fix(e);var t,n,r,i,o,a=[],s=ie.call(arguments),u=(pe._data(this,"events")||{})[e.type]||[],l=pe.event.special[e.type]||{};if(s[0]=e,e.delegateTarget=this,!l.preDispatch||l.preDispatch.call(this,e)!==!1){for(a=pe.event.handlers.call(this,e,u),t=0;(i=a[t++])&&!e.isPropagationStopped();)for(e.currentTarget=i.elem,n=0;(o=i.handlers[n++])&&!e.isImmediatePropagationStopped();)e.rnamespace&&!e.rnamespace.test(o.namespace)||(e.handleObj=o,e.data=o.data,r=((pe.event.special[o.origType]||{}).handle||o.handler).apply(i.elem,s),void 0!==r&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()));return l.postDispatch&&l.postDispatch.call(this,e),e.result}},handlers:function(e,t){var n,r,i,o,a=[],s=t.delegateCount,u=e.target;if(s&&u.nodeType&&("click"!==e.type||isNaN(e.button)||e.button<1))for(;u!=this;u=u.parentNode||this)if(1===u.nodeType&&(u.disabled!==!0||"click"!==e.type)){for(r=[],n=0;n-1:pe.find(i,this,null,[u]).length),r[i]&&r.push(o);r.length&&a.push({elem:u,handlers:r})}return s]","i"),tt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,nt=/\s*$/g,at=p(re),st=at.appendChild(re.createElement("div"));pe.extend({htmlPrefilter:function(e){return e.replace(tt,"<$1>")},clone:function(e,t,n){var r,i,o,a,s,u=pe.contains(e.ownerDocument,e);if(fe.html5Clone||pe.isXMLDoc(e)||!et.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(st.innerHTML=e.outerHTML,st.removeChild(o=st.firstChild)),!(fe.noCloneEvent&&fe.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||pe.isXMLDoc(e)))for(r=h(o),s=h(e),a=0;null!=(i=s[a]);++a)r[a]&&k(i,r[a]);if(t)if(n)for(s=s||h(e),r=r||h(o),a=0;null!=(i=s[a]);a++)N(i,r[a]);else N(e,o);return r=h(o,"script"),r.length>0&&g(r,!u&&h(e,"script")),r=s=i=null,o},cleanData:function(e,t){for(var n,r,i,o,a=0,s=pe.expando,u=pe.cache,l=fe.attributes,c=pe.event.special;null!=(n=e[a]);a++)if((t||He(n))&&(i=n[s],o=i&&u[i])){if(o.events)for(r in o.events)c[r]?pe.event.remove(n,r):pe.removeEvent(n,r,o.handle);u[i]&&(delete u[i],l||"undefined"==typeof n.removeAttribute?n[s]=void 0:n.removeAttribute(s),ne.push(i))}}}),pe.fn.extend({domManip:S,detach:function(e){return A(this,e,!0)},remove:function(e){return A(this,e)},text:function(e){return Pe(this,function(e){return void 0===e?pe.text(this):this.empty().append((this[0]&&this[0].ownerDocument||re).createTextNode(e))},null,e,arguments.length)},append:function(){return S(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=T(this,e);t.appendChild(e)}})},prepend:function(){return S(this,arguments,function(e){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var t=T(this,e);t.insertBefore(e,t.firstChild)}})},before:function(){return S(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return S(this,arguments,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},empty:function(){for(var e,t=0;null!=(e=this[t]);t++){for(1===e.nodeType&&pe.cleanData(h(e,!1));e.firstChild;)e.removeChild(e.firstChild);e.options&&pe.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null!=e&&e,t=null==t?e:t,this.map(function(){return pe.clone(this,e,t)})},html:function(e){return Pe(this,function(e){var t=this[0]||{},n=0,r=this.length;if(void 0===e)return 1===t.nodeType?t.innerHTML.replace(Ze,""):void 0;if("string"==typeof e&&!nt.test(e)&&(fe.htmlSerialize||!et.test(e))&&(fe.leadingWhitespace||!$e.test(e))&&!Xe[(We.exec(e)||["",""])[1].toLowerCase()]){e=pe.htmlPrefilter(e);try{for(;nt",t=l.getElementsByTagName("td"),t[0].style.cssText="margin:0;border:0;padding:0;display:none",o=0===t[0].offsetHeight,o&&(t[0].style.display="",t[1].style.display="none",o=0===t[0].offsetHeight)),f.removeChild(u)}var n,r,i,o,a,s,u=re.createElement("div"),l=re.createElement("div");l.style&&(l.style.cssText="float:left;opacity:.5",fe.opacity="0.5"===l.style.opacity,fe.cssFloat=!!l.style.cssFloat,l.style.backgroundClip="content-box",l.cloneNode(!0).style.backgroundClip="",fe.clearCloneStyle="content-box"===l.style.backgroundClip,u=re.createElement("div"),u.style.cssText="border:0;width:8px;height:0;top:0;left:-9999px;padding:0;margin-top:1px;position:absolute",l.innerHTML="",u.appendChild(l),fe.boxSizing=""===l.style.boxSizing||""===l.style.MozBoxSizing||""===l.style.WebkitBoxSizing,pe.extend(fe,{reliableHiddenOffsets:function(){return null==n&&t(),o},boxSizingReliable:function(){return null==n&&t(),i},pixelMarginRight:function(){return null==n&&t(),r},pixelPosition:function(){return null==n&&t(),n},reliableMarginRight:function(){return null==n&&t(),a},reliableMarginLeft:function(){return null==n&&t(),s}}))}();var ht,gt,mt=/^(top|right|bottom|left)$/;e.getComputedStyle?(ht=function(t){var n=t.ownerDocument.defaultView;return n&&n.opener||(n=e),n.getComputedStyle(t)},gt=function(e,t,n){var r,i,o,a,s=e.style;return n=n||ht(e),a=n?n.getPropertyValue(t)||n[t]:void 0,""!==a&&void 0!==a||pe.contains(e.ownerDocument,e)||(a=pe.style(e,t)),n&&!fe.pixelMarginRight()&&ft.test(a)&&ct.test(t)&&(r=s.width,i=s.minWidth,o=s.maxWidth,s.minWidth=s.maxWidth=s.width=a,a=n.width,s.width=r,s.minWidth=i,s.maxWidth=o),void 0===a?a:a+""}):pt.currentStyle&&(ht=function(e){return e.currentStyle},gt=function(e,t,n){var r,i,o,a,s=e.style;return n=n||ht(e),a=n?n[t]:void 0,null==a&&s&&s[t]&&(a=s[t]),ft.test(a)&&!mt.test(t)&&(r=s.left,i=e.runtimeStyle,o=i&&i.left,o&&(i.left=e.currentStyle.left),s.left="fontSize"===t?"1em":a,a=s.pixelLeft+"px",s.left=r,o&&(i.left=o)),void 0===a?a:a+""||"auto"});var yt=/alpha\([^)]*\)/i,vt=/opacity\s*=\s*([^)]*)/i,xt=/^(none|table(?!-c[ea]).+)/,bt=new RegExp("^("+Fe+")(.*)$","i"),wt={position:"absolute",visibility:"hidden",display:"block"},Tt={letterSpacing:"0",fontWeight:"400"},Ct=["Webkit","O","Moz","ms"],Et=re.createElement("div").style;pe.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=gt(e,"opacity");return""===n?"1":n}}}},cssNumber:{animationIterationCount:!0,columnCount:!0,fillOpacity:!0,flexGrow:!0,flexShrink:!0,fontWeight:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":fe.cssFloat?"cssFloat":"styleFloat"},style:function(e,t,n,r){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var i,o,a,s=pe.camelCase(t),u=e.style;if(t=pe.cssProps[s]||(pe.cssProps[s]=H(s)||s),a=pe.cssHooks[t]||pe.cssHooks[s],void 0===n)return a&&"get"in a&&void 0!==(i=a.get(e,!1,r))?i:u[t];if(o=typeof n,"string"===o&&(i=Me.exec(n))&&i[1]&&(n=d(e,t,i),o="number"),null!=n&&n===n&&("number"===o&&(n+=i&&i[3]||(pe.cssNumber[s]?"":"px")),fe.clearCloneStyle||""!==n||0!==t.indexOf("background")||(u[t]="inherit"),!(a&&"set"in a&&void 0===(n=a.set(e,n,r)))))try{u[t]=n}catch(l){}}},css:function(e,t,n,r){var i,o,a,s=pe.camelCase(t);return t=pe.cssProps[s]||(pe.cssProps[s]=H(s)||s),a=pe.cssHooks[t]||pe.cssHooks[s],a&&"get"in a&&(o=a.get(e,!0,n)),void 0===o&&(o=gt(e,t,r)),"normal"===o&&t in Tt&&(o=Tt[t]),""===n||n?(i=parseFloat(o),n===!0||isFinite(i)?i||0:o):o}}),pe.each(["height","width"],function(e,t){pe.cssHooks[t]={get:function(e,n,r){if(n)return xt.test(pe.css(e,"display"))&&0===e.offsetWidth?dt(e,wt,function(){return M(e,t,r)}):M(e,t,r)},set:function(e,n,r){var i=r&&ht(e);return _(e,n,r?F(e,t,r,fe.boxSizing&&"border-box"===pe.css(e,"boxSizing",!1,i),i):0)}}}),fe.opacity||(pe.cssHooks.opacity={get:function(e,t){return vt.test((t&&e.currentStyle?e.currentStyle.filter:e.style.filter)||"")?.01*parseFloat(RegExp.$1)+"":t?"1":""},set:function(e,t){var n=e.style,r=e.currentStyle,i=pe.isNumeric(t)?"alpha(opacity="+100*t+")":"",o=r&&r.filter||n.filter||"";n.zoom=1,(t>=1||""===t)&&""===pe.trim(o.replace(yt,""))&&n.removeAttribute&&(n.removeAttribute("filter"),""===t||r&&!r.filter)||(n.filter=yt.test(o)?o.replace(yt,i):o+" "+i)}}),pe.cssHooks.marginRight=L(fe.reliableMarginRight,function(e,t){if(t)return dt(e,{display:"inline-block"},gt,[e,"marginRight"])}),pe.cssHooks.marginLeft=L(fe.reliableMarginLeft,function(e,t){if(t)return(parseFloat(gt(e,"marginLeft"))||(pe.contains(e.ownerDocument,e)?e.getBoundingClientRect().left-dt(e,{marginLeft:0},function(){return e.getBoundingClientRect().left}):0))+"px"}),pe.each({margin:"",padding:"",border:"Width"},function(e,t){pe.cssHooks[e+t]={expand:function(n){for(var r=0,i={},o="string"==typeof n?n.split(" "):[n];r<4;r++)i[e+Oe[r]+t]=o[r]||o[r-2]||o[0];return i}},ct.test(e)||(pe.cssHooks[e+t].set=_)}),pe.fn.extend({css:function(e,t){return Pe(this,function(e,t,n){var r,i,o={},a=0;if(pe.isArray(t)){for(r=ht(e),i=t.length;a1)},show:function(){return q(this,!0)},hide:function(){return q(this)},toggle:function(e){return"boolean"==typeof e?e?this.show():this.hide():this.each(function(){Re(this)?pe(this).show():pe(this).hide()})}}),pe.Tween=O,O.prototype={constructor:O,init:function(e,t,n,r,i,o){this.elem=e,this.prop=n,this.easing=i||pe.easing._default,this.options=t,this.start=this.now=this.cur(),this.end=r,this.unit=o||(pe.cssNumber[n]?"":"px")},cur:function(){var e=O.propHooks[this.prop];return e&&e.get?e.get(this):O.propHooks._default.get(this)},run:function(e){var t,n=O.propHooks[this.prop];return this.options.duration?this.pos=t=pe.easing[this.easing](e,this.options.duration*e,0,1,this.options.duration):this.pos=t=e,this.now=(this.end-this.start)*t+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),n&&n.set?n.set(this):O.propHooks._default.set(this),this}},O.prototype.init.prototype=O.prototype,O.propHooks={_default:{get:function(e){var t;return 1!==e.elem.nodeType||null!=e.elem[e.prop]&&null==e.elem.style[e.prop]?e.elem[e.prop]:(t=pe.css(e.elem,e.prop,""),t&&"auto"!==t?t:0)},set:function(e){pe.fx.step[e.prop]?pe.fx.step[e.prop](e):1!==e.elem.nodeType||null==e.elem.style[pe.cssProps[e.prop]]&&!pe.cssHooks[e.prop]?e.elem[e.prop]=e.now:pe.style(e.elem,e.prop,e.now+e.unit)}}},O.propHooks.scrollTop=O.propHooks.scrollLeft={set:function(e){e.elem.nodeType&&e.elem.parentNode&&(e.elem[e.prop]=e.now)}},pe.easing={linear:function(e){return e},swing:function(e){return.5-Math.cos(e*Math.PI)/2},_default:"swing"},pe.fx=O.prototype.init,pe.fx.step={};var Nt,kt,St=/^(?:toggle|show|hide)$/,At=/queueHooks$/;pe.Animation=pe.extend($,{tweeners:{"*":[function(e,t){var n=this.createTween(e,t);return d(n.elem,e,Me.exec(t),n),n}]},tweener:function(e,t){pe.isFunction(e)?(t=e,e=["*"]):e=e.match(De);for(var n,r=0,i=e.length;r
                          a",e=n.getElementsByTagName("a")[0],t.setAttribute("type","checkbox"),n.appendChild(t),e=n.getElementsByTagName("a")[0],e.style.cssText="top:1px",fe.getSetAttribute="t"!==n.className,fe.style=/top/.test(e.getAttribute("style")),fe.hrefNormalized="/a"===e.getAttribute("href"),fe.checkOn=!!t.value,fe.optSelected=i.selected,fe.enctype=!!re.createElement("form").enctype,r.disabled=!0,fe.optDisabled=!i.disabled,t=re.createElement("input"),t.setAttribute("value",""),fe.input=""===t.getAttribute("value"),t.value="t",t.setAttribute("type","radio"),fe.radioValue="t"===t.value}();var Dt=/\r/g,jt=/[\x20\t\r\n\f]+/g;pe.fn.extend({val:function(e){var t,n,r,i=this[0];{if(arguments.length)return r=pe.isFunction(e),this.each(function(n){var i;1===this.nodeType&&(i=r?e.call(this,n,pe(this).val()):e,null==i?i="":"number"==typeof i?i+="":pe.isArray(i)&&(i=pe.map(i,function(e){return null==e?"":e+""})),t=pe.valHooks[this.type]||pe.valHooks[this.nodeName.toLowerCase()],t&&"set"in t&&void 0!==t.set(this,i,"value")||(this.value=i))});if(i)return t=pe.valHooks[i.type]||pe.valHooks[i.nodeName.toLowerCase()],t&&"get"in t&&void 0!==(n=t.get(i,"value"))?n:(n=i.value,"string"==typeof n?n.replace(Dt,""):null==n?"":n)}}}),pe.extend({valHooks:{option:{get:function(e){var t=pe.find.attr(e,"value");return null!=t?t:pe.trim(pe.text(e)).replace(jt," ")}},select:{get:function(e){for(var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||i<0,a=o?null:[],s=o?i+1:r.length,u=i<0?s:o?i:0;u-1)try{r.selected=n=!0}catch(s){r.scrollHeight}else r.selected=!1;return n||(e.selectedIndex=-1),i}}}}),pe.each(["radio","checkbox"],function(){pe.valHooks[this]={set:function(e,t){if(pe.isArray(t))return e.checked=pe.inArray(pe(e).val(),t)>-1}},fe.checkOn||(pe.valHooks[this].get=function(e){return null===e.getAttribute("value")?"on":e.value})});var Lt,Ht,qt=pe.expr.attrHandle,_t=/^(?:checked|selected)$/i,Ft=fe.getSetAttribute,Mt=fe.input;pe.fn.extend({attr:function(e,t){return Pe(this,pe.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){pe.removeAttr(this,e)})}}),pe.extend({attr:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return"undefined"==typeof e.getAttribute?pe.prop(e,t,n):(1===o&&pe.isXMLDoc(e)||(t=t.toLowerCase(),i=pe.attrHooks[t]||(pe.expr.match.bool.test(t)?Ht:Lt)),void 0!==n?null===n?void pe.removeAttr(e,t):i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:(e.setAttribute(t,n+""),n):i&&"get"in i&&null!==(r=i.get(e,t))?r:(r=pe.find.attr(e,t),null==r?void 0:r))},attrHooks:{type:{set:function(e,t){if(!fe.radioValue&&"radio"===t&&pe.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(De);if(o&&1===e.nodeType)for(;n=o[i++];)r=pe.propFix[n]||n,pe.expr.match.bool.test(n)?Mt&&Ft||!_t.test(n)?e[r]=!1:e[pe.camelCase("default-"+n)]=e[r]=!1:pe.attr(e,n,""),e.removeAttribute(Ft?n:r)}}),Ht={set:function(e,t,n){return t===!1?pe.removeAttr(e,n):Mt&&Ft||!_t.test(n)?e.setAttribute(!Ft&&pe.propFix[n]||n,n):e[pe.camelCase("default-"+n)]=e[n]=!0,n}},pe.each(pe.expr.match.bool.source.match(/\w+/g),function(e,t){var n=qt[t]||pe.find.attr;Mt&&Ft||!_t.test(t)?qt[t]=function(e,t,r){var i,o;return r||(o=qt[t],qt[t]=i,i=null!=n(e,t,r)?t.toLowerCase():null,qt[t]=o),i}:qt[t]=function(e,t,n){if(!n)return e[pe.camelCase("default-"+t)]?t.toLowerCase():null}}),Mt&&Ft||(pe.attrHooks.value={set:function(e,t,n){return pe.nodeName(e,"input")?void(e.defaultValue=t):Lt&&Lt.set(e,t,n)}}),Ft||(Lt={set:function(e,t,n){var r=e.getAttributeNode(n);if(r||e.setAttributeNode(r=e.ownerDocument.createAttribute(n)),r.value=t+="","value"===n||t===e.getAttribute(n))return t}},qt.id=qt.name=qt.coords=function(e,t,n){var r;if(!n)return(r=e.getAttributeNode(t))&&""!==r.value?r.value:null},pe.valHooks.button={get:function(e,t){var n=e.getAttributeNode(t);if(n&&n.specified)return n.value},set:Lt.set},pe.attrHooks.contenteditable={set:function(e,t,n){Lt.set(e,""!==t&&t,n)}},pe.each(["width","height"],function(e,t){pe.attrHooks[t]={set:function(e,n){if(""===n)return e.setAttribute(t,"auto"),n}}})),fe.style||(pe.attrHooks.style={get:function(e){return e.style.cssText||void 0},set:function(e,t){return e.style.cssText=t+""}});var Ot=/^(?:input|select|textarea|button|object)$/i,Rt=/^(?:a|area)$/i;pe.fn.extend({prop:function(e,t){return Pe(this,pe.prop,e,t,arguments.length>1)},removeProp:function(e){return e=pe.propFix[e]||e,this.each(function(){try{this[e]=void 0,delete this[e]}catch(t){}})}}),pe.extend({prop:function(e,t,n){var r,i,o=e.nodeType;if(3!==o&&8!==o&&2!==o)return 1===o&&pe.isXMLDoc(e)||(t=pe.propFix[t]||t,i=pe.propHooks[t]),void 0!==n?i&&"set"in i&&void 0!==(r=i.set(e,n,t))?r:e[t]=n:i&&"get"in i&&null!==(r=i.get(e,t))?r:e[t]},propHooks:{tabIndex:{get:function(e){var t=pe.find.attr(e,"tabindex");return t?parseInt(t,10):Ot.test(e.nodeName)||Rt.test(e.nodeName)&&e.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),fe.hrefNormalized||pe.each(["href","src"],function(e,t){pe.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}}),fe.optSelected||(pe.propHooks.selected={get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null},set:function(e){var t=e.parentNode;t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex)}}),pe.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){pe.propFix[this.toLowerCase()]=this}),fe.enctype||(pe.propFix.enctype="encoding");var Pt=/[\t\r\n\f]/g;pe.fn.extend({addClass:function(e){var t,n,r,i,o,a,s,u=0;if(pe.isFunction(e))return this.each(function(t){pe(this).addClass(e.call(this,t,z(this)))});if("string"==typeof e&&e)for(t=e.match(De)||[];n=this[u++];)if(i=z(n),r=1===n.nodeType&&(" "+i+" ").replace(Pt," ")){for(a=0;o=t[a++];)r.indexOf(" "+o+" ")<0&&(r+=o+" ");s=pe.trim(r),i!==s&&pe.attr(n,"class",s)}return this},removeClass:function(e){var t,n,r,i,o,a,s,u=0;if(pe.isFunction(e))return this.each(function(t){pe(this).removeClass(e.call(this,t,z(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof e&&e)for(t=e.match(De)||[];n=this[u++];)if(i=z(n),r=1===n.nodeType&&(" "+i+" ").replace(Pt," ")){for(a=0;o=t[a++];)for(;r.indexOf(" "+o+" ")>-1;)r=r.replace(" "+o+" "," ");s=pe.trim(r),i!==s&&pe.attr(n,"class",s)}return this},toggleClass:function(e,t){var n=typeof e;return"boolean"==typeof t&&"string"===n?t?this.addClass(e):this.removeClass(e):pe.isFunction(e)?this.each(function(n){pe(this).toggleClass(e.call(this,n,z(this),t),t)}):this.each(function(){var t,r,i,o;if("string"===n)for(r=0,i=pe(this),o=e.match(De)||[];t=o[r++];)i.hasClass(t)?i.removeClass(t):i.addClass(t);else void 0!==e&&"boolean"!==n||(t=z(this),t&&pe._data(this,"__className__",t),pe.attr(this,"class",t||e===!1?"":pe._data(this,"__className__")||""))})},hasClass:function(e){var t,n,r=0;for(t=" "+e+" ";n=this[r++];)if(1===n.nodeType&&(" "+z(n)+" ").replace(Pt," ").indexOf(t)>-1)return!0;return!1}}),pe.each("blur focus focusin focusout load resize scroll unload click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup error contextmenu".split(" "),function(e,t){pe.fn[t]=function(e,n){return arguments.length>0?this.on(t,null,e,n):this.trigger(t)}}),pe.fn.extend({hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}});var Bt=e.location,Wt=pe.now(),It=/\?/,$t=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;pe.parseJSON=function(t){if(e.JSON&&e.JSON.parse)return e.JSON.parse(t+"");var n,r=null,i=pe.trim(t+"");return i&&!pe.trim(i.replace($t,function(e,t,i,o){return n&&t&&(r=0),0===r?e:(n=i||t,r+=!o-!i,"")}))?Function("return "+i)():pe.error("Invalid JSON: "+t)},pe.parseXML=function(t){var n,r;if(!t||"string"!=typeof t)return null;try{e.DOMParser?(r=new e.DOMParser,n=r.parseFromString(t,"text/xml")):(n=new e.ActiveXObject("Microsoft.XMLDOM"),n.async="false",n.loadXML(t))}catch(i){n=void 0}return n&&n.documentElement&&!n.getElementsByTagName("parsererror").length||pe.error("Invalid XML: "+t),n};var zt=/#.*$/,Xt=/([?&])_=[^&]*/,Ut=/^(.*?):[ \t]*([^\r\n]*)\r?$/gm,Vt=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Yt=/^(?:GET|HEAD)$/,Jt=/^\/\//,Gt=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,Kt={},Qt={},Zt="*/".concat("*"),en=Bt.href,tn=Gt.exec(en.toLowerCase())||[];pe.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:en,type:"GET",isLocal:Vt.test(tn[1]),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Zt,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/\bxml\b/,html:/\bhtml/,json:/\bjson\b/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":!0,"text json":pe.parseJSON,"text xml":pe.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(e,t){return t?V(V(e,pe.ajaxSettings),t):V(pe.ajaxSettings,e)},ajaxPrefilter:X(Kt),ajaxTransport:X(Qt),ajax:function(t,n){function r(t,n,r,i){var o,f,v,x,w,C=n;2!==b&&(b=2,u&&e.clearTimeout(u),c=void 0,s=i||"",T.readyState=t>0?4:0,o=t>=200&&t<300||304===t,r&&(x=Y(d,T,r)),x=J(d,x,T,o),o?(d.ifModified&&(w=T.getResponseHeader("Last-Modified"),w&&(pe.lastModified[a]=w),w=T.getResponseHeader("etag"),w&&(pe.etag[a]=w)),204===t||"HEAD"===d.type?C="nocontent":304===t?C="notmodified":(C=x.state,f=x.data,v=x.error,o=!v)):(v=C,!t&&C||(C="error",t<0&&(t=0))),T.status=t,T.statusText=(n||C)+"",o?g.resolveWith(p,[f,C,T]):g.rejectWith(p,[T,C,v]),T.statusCode(y),y=void 0,l&&h.trigger(o?"ajaxSuccess":"ajaxError",[T,d,o?f:v]),m.fireWith(p,[T,C]),l&&(h.trigger("ajaxComplete",[T,d]),--pe.active||pe.event.trigger("ajaxStop")))}"object"==typeof t&&(n=t,t=void 0),n=n||{};var i,o,a,s,u,l,c,f,d=pe.ajaxSetup({},n),p=d.context||d,h=d.context&&(p.nodeType||p.jquery)?pe(p):pe.event,g=pe.Deferred(),m=pe.Callbacks("once memory"),y=d.statusCode||{},v={},x={},b=0,w="canceled",T={readyState:0,getResponseHeader:function(e){var t;if(2===b){if(!f)for(f={};t=Ut.exec(s);)f[t[1].toLowerCase()]=t[2];t=f[e.toLowerCase()]}return null==t?null:t},getAllResponseHeaders:function(){return 2===b?s:null},setRequestHeader:function(e,t){var n=e.toLowerCase();return b||(e=x[n]=x[n]||e,v[e]=t),this},overrideMimeType:function(e){return b||(d.mimeType=e),this},statusCode:function(e){var t;if(e)if(b<2)for(t in e)y[t]=[y[t],e[t]];else T.always(e[T.status]);return this},abort:function(e){var t=e||w;return c&&c.abort(t),r(0,t),this}};if(g.promise(T).complete=m.add,T.success=T.done,T.error=T.fail,d.url=((t||d.url||en)+"").replace(zt,"").replace(Jt,tn[1]+"//"),d.type=n.method||n.type||d.method||d.type,d.dataTypes=pe.trim(d.dataType||"*").toLowerCase().match(De)||[""],null==d.crossDomain&&(i=Gt.exec(d.url.toLowerCase()),d.crossDomain=!(!i||i[1]===tn[1]&&i[2]===tn[2]&&(i[3]||("http:"===i[1]?"80":"443"))===(tn[3]||("http:"===tn[1]?"80":"443")))),d.data&&d.processData&&"string"!=typeof d.data&&(d.data=pe.param(d.data,d.traditional)),U(Kt,d,n,T),2===b)return T;l=pe.event&&d.global,l&&0===pe.active++&&pe.event.trigger("ajaxStart"),d.type=d.type.toUpperCase(),d.hasContent=!Yt.test(d.type),a=d.url,d.hasContent||(d.data&&(a=d.url+=(It.test(a)?"&":"?")+d.data,delete d.data),d.cache===!1&&(d.url=Xt.test(a)?a.replace(Xt,"$1_="+Wt++):a+(It.test(a)?"&":"?")+"_="+Wt++)),d.ifModified&&(pe.lastModified[a]&&T.setRequestHeader("If-Modified-Since",pe.lastModified[a]),pe.etag[a]&&T.setRequestHeader("If-None-Match",pe.etag[a])),(d.data&&d.hasContent&&d.contentType!==!1||n.contentType)&&T.setRequestHeader("Content-Type",d.contentType),T.setRequestHeader("Accept",d.dataTypes[0]&&d.accepts[d.dataTypes[0]]?d.accepts[d.dataTypes[0]]+("*"!==d.dataTypes[0]?", "+Zt+"; q=0.01":""):d.accepts["*"]);for(o in d.headers)T.setRequestHeader(o,d.headers[o]);if(d.beforeSend&&(d.beforeSend.call(p,T,d)===!1||2===b))return T.abort();w="abort";for(o in{success:1,error:1,complete:1})T[o](d[o]);if(c=U(Qt,d,n,T)){if(T.readyState=1,l&&h.trigger("ajaxSend",[T,d]),2===b)return T;d.async&&d.timeout>0&&(u=e.setTimeout(function(){T.abort("timeout")},d.timeout));try{b=1,c.send(v,r)}catch(C){if(!(b<2))throw C;r(-1,C)}}else r(-1,"No Transport");return T},getJSON:function(e,t,n){return pe.get(e,t,n,"json")},getScript:function(e,t){return pe.get(e,void 0,t,"script")}}),pe.each(["get","post"],function(e,t){pe[t]=function(e,n,r,i){return pe.isFunction(n)&&(i=i||r,r=n,n=void 0),pe.ajax(pe.extend({url:e,type:t,dataType:i,data:n,success:r},pe.isPlainObject(e)&&e))}}),pe._evalUrl=function(e){return pe.ajax({url:e,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},pe.fn.extend({wrapAll:function(e){if(pe.isFunction(e))return this.each(function(t){pe(this).wrapAll(e.call(this,t))});if(this[0]){var t=pe(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){for(var e=this;e.firstChild&&1===e.firstChild.nodeType;)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return pe.isFunction(e)?this.each(function(t){pe(this).wrapInner(e.call(this,t))}):this.each(function(){var t=pe(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=pe.isFunction(e);return this.each(function(n){pe(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){pe.nodeName(this,"body")||pe(this).replaceWith(this.childNodes)}).end()}}),pe.expr.filters.hidden=function(e){return fe.reliableHiddenOffsets()?e.offsetWidth<=0&&e.offsetHeight<=0&&!e.getClientRects().length:K(e)},pe.expr.filters.visible=function(e){return!pe.expr.filters.hidden(e)};var nn=/%20/g,rn=/\[\]$/,on=/\r?\n/g,an=/^(?:submit|button|image|reset|file)$/i,sn=/^(?:input|select|textarea|keygen)/i;pe.param=function(e,t){var n,r=[],i=function(e,t){t=pe.isFunction(t)?t():null==t?"":t,r[r.length]=encodeURIComponent(e)+"="+encodeURIComponent(t)};if(void 0===t&&(t=pe.ajaxSettings&&pe.ajaxSettings.traditional),pe.isArray(e)||e.jquery&&!pe.isPlainObject(e))pe.each(e,function(){i(this.name,this.value)});else for(n in e)Q(n,e[n],t,i);return r.join("&").replace(nn,"+")},pe.fn.extend({serialize:function(){return pe.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var e=pe.prop(this,"elements");return e?pe.makeArray(e):this}).filter(function(){var e=this.type;return this.name&&!pe(this).is(":disabled")&&sn.test(this.nodeName)&&!an.test(e)&&(this.checked||!Be.test(e))}).map(function(e,t){var n=pe(this).val();return null==n?null:pe.isArray(n)?pe.map(n,function(e){return{name:t.name,value:e.replace(on,"\r\n")}}):{name:t.name,value:n.replace(on,"\r\n")}}).get()}}),pe.ajaxSettings.xhr=void 0!==e.ActiveXObject?function(){return this.isLocal?ee():re.documentMode>8?Z():/^(get|post|head|put|delete|options)$/i.test(this.type)&&Z()||ee()}:Z;var un=0,ln={},cn=pe.ajaxSettings.xhr();e.attachEvent&&e.attachEvent("onunload",function(){for(var e in ln)ln[e](void 0,!0)}),fe.cors=!!cn&&"withCredentials"in cn,cn=fe.ajax=!!cn,cn&&pe.ajaxTransport(function(t){if(!t.crossDomain||fe.cors){var n;return{send:function(r,i){var o,a=t.xhr(),s=++un;if(a.open(t.type,t.url,t.async,t.username,t.password),t.xhrFields)for(o in t.xhrFields)a[o]=t.xhrFields[o];t.mimeType&&a.overrideMimeType&&a.overrideMimeType(t.mimeType),t.crossDomain||r["X-Requested-With"]||(r["X-Requested-With"]="XMLHttpRequest");for(o in r)void 0!==r[o]&&a.setRequestHeader(o,r[o]+"");a.send(t.hasContent&&t.data||null),n=function(e,r){var o,u,l;if(n&&(r||4===a.readyState))if(delete ln[s],n=void 0,a.onreadystatechange=pe.noop,r)4!==a.readyState&&a.abort();else{l={},o=a.status,"string"==typeof a.responseText&&(l.text=a.responseText);try{u=a.statusText}catch(c){u=""}o||!t.isLocal||t.crossDomain?1223===o&&(o=204):o=l.text?200:404}l&&i(o,u,l,a.getAllResponseHeaders())},t.async?4===a.readyState?e.setTimeout(n):a.onreadystatechange=ln[s]=n:n()},abort:function(){n&&n(void 0,!0)}}}}),pe.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(e){return pe.globalEval(e),e}}}),pe.ajaxPrefilter("script",function(e){void 0===e.cache&&(e.cache=!1),e.crossDomain&&(e.type="GET",e.global=!1)}),pe.ajaxTransport("script",function(e){if(e.crossDomain){var t,n=re.head||pe("head")[0]||re.documentElement;return{send:function(r,i){t=re.createElement("script"),t.async=!0,e.scriptCharset&&(t.charset=e.scriptCharset),t.src=e.url,t.onload=t.onreadystatechange=function(e,n){(n||!t.readyState||/loaded|complete/.test(t.readyState))&&(t.onload=t.onreadystatechange=null,t.parentNode&&t.parentNode.removeChild(t),t=null,n||i(200,"success"))},n.insertBefore(t,n.firstChild)},abort:function(){t&&t.onload(void 0,!0)}}}});var fn=[],dn=/(=)\?(?=&|$)|\?\?/;pe.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=fn.pop()||pe.expando+"_"+Wt++;return this[e]=!0,e}}),pe.ajaxPrefilter("json jsonp",function(t,n,r){var i,o,a,s=t.jsonp!==!1&&(dn.test(t.url)?"url":"string"==typeof t.data&&0===(t.contentType||"").indexOf("application/x-www-form-urlencoded")&&dn.test(t.data)&&"data");if(s||"jsonp"===t.dataTypes[0])return i=t.jsonpCallback=pe.isFunction(t.jsonpCallback)?t.jsonpCallback():t.jsonpCallback,s?t[s]=t[s].replace(dn,"$1"+i):t.jsonp!==!1&&(t.url+=(It.test(t.url)?"&":"?")+t.jsonp+"="+i),t.converters["script json"]=function(){return a||pe.error(i+" was not called"),a[0]},t.dataTypes[0]="json",o=e[i],e[i]=function(){a=arguments},r.always(function(){void 0===o?pe(e).removeProp(i):e[i]=o,t[i]&&(t.jsonpCallback=n.jsonpCallback,fn.push(i)),a&&pe.isFunction(o)&&o(a[0]),a=o=void 0}),"script"}),pe.parseHTML=function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||re;var r=Te.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=y([e],t,i),i&&i.length&&pe(i).remove(),pe.merge([],r.childNodes))};var pn=pe.fn.load;return pe.fn.load=function(e,t,n){if("string"!=typeof e&&pn)return pn.apply(this,arguments);var r,i,o,a=this,s=e.indexOf(" ");return s>-1&&(r=pe.trim(e.slice(s,e.length)),e=e.slice(0,s)),pe.isFunction(t)?(n=t,t=void 0):t&&"object"==typeof t&&(i="POST"),a.length>0&&pe.ajax({url:e,type:i||"GET",dataType:"html",data:t}).done(function(e){o=arguments,a.html(r?pe("
                          ").append(pe.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},pe.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){pe.fn[t]=function(e){return this.on(t,e)}}),pe.expr.filters.animated=function(e){return pe.grep(pe.timers,function(t){return e===t.elem}).length},pe.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l,c=pe.css(e,"position"),f=pe(e),d={};"static"===c&&(e.style.position="relative"),s=f.offset(),o=pe.css(e,"top"),u=pe.css(e,"left"),l=("absolute"===c||"fixed"===c)&&pe.inArray("auto",[o,u])>-1,l?(r=f.position(),a=r.top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),pe.isFunction(t)&&(t=t.call(e,n,pe.extend({},s))),null!=t.top&&(d.top=t.top-s.top+a),null!=t.left&&(d.left=t.left-s.left+i),"using"in t?t.using.call(e,d):f.css(d)}},pe.fn.extend({offset:function(e){if(arguments.length)return void 0===e?this:this.each(function(t){pe.offset.setOffset(this,e,t)});var t,n,r={top:0,left:0},i=this[0],o=i&&i.ownerDocument;if(o)return t=o.documentElement,pe.contains(t,i)?("undefined"!=typeof i.getBoundingClientRect&&(r=i.getBoundingClientRect()),n=te(o),{top:r.top+(n.pageYOffset||t.scrollTop)-(t.clientTop||0),left:r.left+(n.pageXOffset||t.scrollLeft)-(t.clientLeft||0)}):r},position:function(){if(this[0]){var e,t,n={top:0,left:0},r=this[0];return"fixed"===pe.css(r,"position")?t=r.getBoundingClientRect():(e=this.offsetParent(),t=this.offset(),pe.nodeName(e[0],"html")||(n=e.offset()),n.top+=pe.css(e[0],"borderTopWidth",!0),n.left+=pe.css(e[0],"borderLeftWidth",!0)),{top:t.top-n.top-pe.css(r,"marginTop",!0),left:t.left-n.left-pe.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){ +for(var e=this.offsetParent;e&&!pe.nodeName(e,"html")&&"static"===pe.css(e,"position");)e=e.offsetParent;return e||pt})}}),pe.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(e,t){var n=/Y/.test(t);pe.fn[e]=function(r){return Pe(this,function(e,r,i){var o=te(e);return void 0===i?o?t in o?o[t]:o.document.documentElement[r]:e[r]:void(o?o.scrollTo(n?pe(o).scrollLeft():i,n?i:pe(o).scrollTop()):e[r]=i)},e,r,arguments.length,null)}}),pe.each(["top","left"],function(e,t){pe.cssHooks[t]=L(fe.pixelPosition,function(e,n){if(n)return n=gt(e,t),ft.test(n)?pe(e).position()[t]+"px":n})}),pe.each({Height:"height",Width:"width"},function(e,t){pe.each({padding:"inner"+e,content:t,"":"outer"+e},function(n,r){pe.fn[r]=function(r,i){var o=arguments.length&&(n||"boolean"!=typeof r),a=n||(r===!0||i===!0?"margin":"border");return Pe(this,function(t,n,r){var i;return pe.isWindow(t)?t.document.documentElement["client"+e]:9===t.nodeType?(i=t.documentElement,Math.max(t.body["scroll"+e],i["scroll"+e],t.body["offset"+e],i["offset"+e],i["client"+e])):void 0===r?pe.css(t,n,a):pe.style(t,n,r,a)},t,o?r:void 0,o,null)}})}),pe.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)}}),pe.fn.size=function(){return this.length},pe.fn.andSelf=pe.fn.addBack,layui.define(function(e){layui.$=pe,e("jquery",pe)}),pe});!function(e,t){"use strict";var i,n,a=e.layui&&layui.define,o={getPath:function(){var e=document.currentScript?document.currentScript.src:function(){for(var e,t=document.scripts,i=t.length-1,n=i;n>0;n--)if("interactive"===t[n].readyState){e=t[n].src;break}return e||t[i].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),config:{},end:{},minIndex:0,minLeft:[],btn:["确定","取消"],type:["dialog","page","iframe","loading","tips"],getStyle:function(t,i){var n=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](i)},link:function(t,i,n){if(r.path){var a=document.getElementsByTagName("head")[0],s=document.createElement("link");"string"==typeof i&&(n=i);var l=(n||t).replace(/\.|\//g,""),f="layuicss-"+l,c=0;s.rel="stylesheet",s.href=r.path+t,s.id=f,document.getElementById(f)||a.appendChild(s),"function"==typeof i&&!function u(){return++c>80?e.console&&console.error("layer.css: Invalid"):void(1989===parseInt(o.getStyle(document.getElementById(f),"width"))?i():setTimeout(u,100))}()}}},r={v:"3.1.1",ie:function(){var t=navigator.userAgent.toLowerCase();return!!(e.ActiveXObject||"ActiveXObject"in e)&&((t.match(/msie\s(\d+)/)||[])[1]||"11")}(),index:e.layer&&e.layer.v?1e5:0,path:o.getPath,config:function(e,t){return e=e||{},r.cache=o.config=i.extend({},o.config,e),r.path=o.config.path||r.path,"string"==typeof e.extend&&(e.extend=[e.extend]),o.config.path&&r.ready(),e.extend?(a?layui.addcss("modules/layer/"+e.extend):o.link("theme/"+e.extend),this):this},ready:function(e){var t="layer",i="",n=(a?"modules/layer/":"theme/")+"default/layer.css?v="+r.v+i;return a?layui.addcss(n,e,t):o.link(n,e,t),this},alert:function(e,t,n){var a="function"==typeof t;return a&&(n=t),r.open(i.extend({content:e,yes:n},a?{}:t))},confirm:function(e,t,n,a){var s="function"==typeof t;return s&&(a=n,n=t),r.open(i.extend({content:e,btn:o.btn,yes:n,btn2:a},s?{}:t))},msg:function(e,n,a){var s="function"==typeof n,f=o.config.skin,c=(f?f+" "+f+"-msg":"")||"layui-layer-msg",u=l.anim.length-1;return s&&(a=n),r.open(i.extend({content:e,time:3e3,shade:!1,skin:c,title:!1,closeBtn:!1,btn:!1,resize:!1,end:a},s&&!o.config.skin?{skin:c+" layui-layer-hui",anim:u}:function(){return n=n||{},(n.icon===-1||n.icon===t&&!o.config.skin)&&(n.skin=c+" "+(n.skin||"layui-layer-hui")),n}()))},load:function(e,t){return r.open(i.extend({type:3,icon:e||0,resize:!1,shade:.01},t))},tips:function(e,t,n){return r.open(i.extend({type:4,content:[e,t],closeBtn:!1,time:3e3,shade:!1,resize:!1,fixed:!1,maxWidth:210},n))}},s=function(e){var t=this;t.index=++r.index,t.config=i.extend({},t.config,o.config,e),document.body?t.creat():setTimeout(function(){t.creat()},30)};s.pt=s.prototype;var l=["layui-layer",".layui-layer-title",".layui-layer-main",".layui-layer-dialog","layui-layer-iframe","layui-layer-content","layui-layer-btn","layui-layer-close"];l.anim=["layer-anim-00","layer-anim-01","layer-anim-02","layer-anim-03","layer-anim-04","layer-anim-05","layer-anim-06"],s.pt.config={type:0,shade:.3,fixed:!0,move:l[1],title:"信息",offset:"auto",area:"auto",closeBtn:1,time:0,zIndex:19891014,maxWidth:360,anim:0,isOutAnim:!0,icon:-1,moveType:1,resize:!0,scrollbar:!0,tips:2},s.pt.vessel=function(e,t){var n=this,a=n.index,r=n.config,s=r.zIndex+a,f="object"==typeof r.title,c=r.maxmin&&(1===r.type||2===r.type),u=r.title?'
                          '+(f?r.title[0]:r.title)+"
                          ":"";return r.zIndex=s,t([r.shade?'
                          ':"",'
                          '+(e&&2!=r.type?"":u)+'
                          '+(0==r.type&&r.icon!==-1?'':"")+(1==r.type&&e?"":r.content||"")+'
                          '+function(){var e=c?'':"";return r.closeBtn&&(e+=''),e}()+""+(r.btn?function(){var e="";"string"==typeof r.btn&&(r.btn=[r.btn]);for(var t=0,i=r.btn.length;t'+r.btn[t]+"";return'
                          '+e+"
                          "}():"")+(r.resize?'':"")+"
                          "],u,i('
                          ')),n},s.pt.creat=function(){var e=this,t=e.config,a=e.index,s=t.content,f="object"==typeof s,c=i("body");if(!t.id||!i("#"+t.id)[0]){switch("string"==typeof t.area&&(t.area="auto"===t.area?["",""]:[t.area,""]),t.shift&&(t.anim=t.shift),6==r.ie&&(t.fixed=!1),t.type){case 0:t.btn="btn"in t?t.btn:o.btn[0],r.closeAll("dialog");break;case 2:var s=t.content=f?t.content:[t.content||"","auto"];t.content='';break;case 3:delete t.title,delete t.closeBtn,t.icon===-1&&0===t.icon,r.closeAll("loading");break;case 4:f||(t.content=[t.content,"body"]),t.follow=t.content[1],t.content=t.content[0]+'',delete t.title,t.tips="object"==typeof t.tips?t.tips:[t.tips,!0],t.tipsMore||r.closeAll("tips")}if(e.vessel(f,function(n,r,u){c.append(n[0]),f?function(){2==t.type||4==t.type?function(){i("body").append(n[1])}():function(){s.parents("."+l[0])[0]||(s.data("display",s.css("display")).show().addClass("layui-layer-wrap").wrap(n[1]),i("#"+l[0]+a).find("."+l[5]).before(r))}()}():c.append(n[1]),i(".layui-layer-move")[0]||c.append(o.moveElem=u),e.layero=i("#"+l[0]+a),t.scrollbar||l.html.css("overflow","hidden").attr("layer-full",a)}).auto(a),i("#layui-layer-shade"+e.index).css({"background-color":t.shade[1]||"#000",opacity:t.shade[0]||t.shade}),2==t.type&&6==r.ie&&e.layero.find("iframe").attr("src",s[0]),4==t.type?e.tips():e.offset(),t.fixed&&n.on("resize",function(){e.offset(),(/^\d+%$/.test(t.area[0])||/^\d+%$/.test(t.area[1]))&&e.auto(a),4==t.type&&e.tips()}),t.time<=0||setTimeout(function(){r.close(e.index)},t.time),e.move().callback(),l.anim[t.anim]){var u="layer-anim "+l.anim[t.anim];e.layero.addClass(u).one("webkitAnimationEnd mozAnimationEnd MSAnimationEnd oanimationend animationend",function(){i(this).removeClass(u)})}t.isOutAnim&&e.layero.data("isOutAnim",!0)}},s.pt.auto=function(e){var t=this,a=t.config,o=i("#"+l[0]+e);""===a.area[0]&&a.maxWidth>0&&(r.ie&&r.ie<8&&a.btn&&o.width(o.innerWidth()),o.outerWidth()>a.maxWidth&&o.width(a.maxWidth));var s=[o.innerWidth(),o.innerHeight()],f=o.find(l[1]).outerHeight()||0,c=o.find("."+l[6]).outerHeight()||0,u=function(e){e=o.find(e),e.height(s[1]-f-c-2*(0|parseFloat(e.css("padding-top"))))};switch(a.type){case 2:u("iframe");break;default:""===a.area[1]?a.maxHeight>0&&o.outerHeight()>a.maxHeight?(s[1]=a.maxHeight,u("."+l[5])):a.fixed&&s[1]>=n.height()&&(s[1]=n.height(),u("."+l[5])):u("."+l[5])}return t},s.pt.offset=function(){var e=this,t=e.config,i=e.layero,a=[i.outerWidth(),i.outerHeight()],o="object"==typeof t.offset;e.offsetTop=(n.height()-a[1])/2,e.offsetLeft=(n.width()-a[0])/2,o?(e.offsetTop=t.offset[0],e.offsetLeft=t.offset[1]||e.offsetLeft):"auto"!==t.offset&&("t"===t.offset?e.offsetTop=0:"r"===t.offset?e.offsetLeft=n.width()-a[0]:"b"===t.offset?e.offsetTop=n.height()-a[1]:"l"===t.offset?e.offsetLeft=0:"lt"===t.offset?(e.offsetTop=0,e.offsetLeft=0):"lb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=0):"rt"===t.offset?(e.offsetTop=0,e.offsetLeft=n.width()-a[0]):"rb"===t.offset?(e.offsetTop=n.height()-a[1],e.offsetLeft=n.width()-a[0]):e.offsetTop=t.offset),t.fixed||(e.offsetTop=/%$/.test(e.offsetTop)?n.height()*parseFloat(e.offsetTop)/100:parseFloat(e.offsetTop),e.offsetLeft=/%$/.test(e.offsetLeft)?n.width()*parseFloat(e.offsetLeft)/100:parseFloat(e.offsetLeft),e.offsetTop+=n.scrollTop(),e.offsetLeft+=n.scrollLeft()),i.attr("minLeft")&&(e.offsetTop=n.height()-(i.find(l[1]).outerHeight()||0),e.offsetLeft=i.css("left")),i.css({top:e.offsetTop,left:e.offsetLeft})},s.pt.tips=function(){var e=this,t=e.config,a=e.layero,o=[a.outerWidth(),a.outerHeight()],r=i(t.follow);r[0]||(r=i("body"));var s={width:r.outerWidth(),height:r.outerHeight(),top:r.offset().top,left:r.offset().left},f=a.find(".layui-layer-TipsG"),c=t.tips[0];t.tips[1]||f.remove(),s.autoLeft=function(){s.left+o[0]-n.width()>0?(s.tipLeft=s.left+s.width-o[0],f.css({right:12,left:"auto"})):s.tipLeft=s.left},s.where=[function(){s.autoLeft(),s.tipTop=s.top-o[1]-10,f.removeClass("layui-layer-TipsB").addClass("layui-layer-TipsT").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left+s.width+10,s.tipTop=s.top,f.removeClass("layui-layer-TipsL").addClass("layui-layer-TipsR").css("border-bottom-color",t.tips[1])},function(){s.autoLeft(),s.tipTop=s.top+s.height+10,f.removeClass("layui-layer-TipsT").addClass("layui-layer-TipsB").css("border-right-color",t.tips[1])},function(){s.tipLeft=s.left-o[0]-10,s.tipTop=s.top,f.removeClass("layui-layer-TipsR").addClass("layui-layer-TipsL").css("border-bottom-color",t.tips[1])}],s.where[c-1](),1===c?s.top-(n.scrollTop()+o[1]+16)<0&&s.where[2]():2===c?n.width()-(s.left+s.width+o[0]+16)>0||s.where[3]():3===c?s.top-n.scrollTop()+s.height+o[1]+16-n.height()>0&&s.where[0]():4===c&&o[0]+16-s.left>0&&s.where[1](),a.find("."+l[5]).css({"background-color":t.tips[1],"padding-right":t.closeBtn?"30px":""}),a.css({left:s.tipLeft-(t.fixed?n.scrollLeft():0),top:s.tipTop-(t.fixed?n.scrollTop():0)})},s.pt.move=function(){var e=this,t=e.config,a=i(document),s=e.layero,l=s.find(t.move),f=s.find(".layui-layer-resize"),c={};return t.move&&l.css("cursor","move"),l.on("mousedown",function(e){e.preventDefault(),t.move&&(c.moveStart=!0,c.offset=[e.clientX-parseFloat(s.css("left")),e.clientY-parseFloat(s.css("top"))],o.moveElem.css("cursor","move").show())}),f.on("mousedown",function(e){e.preventDefault(),c.resizeStart=!0,c.offset=[e.clientX,e.clientY],c.area=[s.outerWidth(),s.outerHeight()],o.moveElem.css("cursor","se-resize").show()}),a.on("mousemove",function(i){if(c.moveStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1],l="fixed"===s.css("position");if(i.preventDefault(),c.stX=l?0:n.scrollLeft(),c.stY=l?0:n.scrollTop(),!t.moveOut){var f=n.width()-s.outerWidth()+c.stX,u=n.height()-s.outerHeight()+c.stY;af&&(a=f),ou&&(o=u)}s.css({left:a,top:o})}if(t.resize&&c.resizeStart){var a=i.clientX-c.offset[0],o=i.clientY-c.offset[1];i.preventDefault(),r.style(e.index,{width:c.area[0]+a,height:c.area[1]+o}),c.isResize=!0,t.resizing&&t.resizing(s)}}).on("mouseup",function(e){c.moveStart&&(delete c.moveStart,o.moveElem.hide(),t.moveEnd&&t.moveEnd(s)),c.resizeStart&&(delete c.resizeStart,o.moveElem.hide())}),e},s.pt.callback=function(){function e(){var e=a.cancel&&a.cancel(t.index,n);e===!1||r.close(t.index)}var t=this,n=t.layero,a=t.config;t.openLayer(),a.success&&(2==a.type?n.find("iframe").on("load",function(){a.success(n,t.index)}):a.success(n,t.index)),6==r.ie&&t.IE6(n),n.find("."+l[6]).children("a").on("click",function(){var e=i(this).index();if(0===e)a.yes?a.yes(t.index,n):a.btn1?a.btn1(t.index,n):r.close(t.index);else{var o=a["btn"+(e+1)]&&a["btn"+(e+1)](t.index,n);o===!1||r.close(t.index)}}),n.find("."+l[7]).on("click",e),a.shadeClose&&i("#layui-layer-shade"+t.index).on("click",function(){r.close(t.index)}),n.find(".layui-layer-min").on("click",function(){var e=a.min&&a.min(n);e===!1||r.min(t.index,a)}),n.find(".layui-layer-max").on("click",function(){i(this).hasClass("layui-layer-maxmin")?(r.restore(t.index),a.restore&&a.restore(n)):(r.full(t.index,a),setTimeout(function(){a.full&&a.full(n)},100))}),a.end&&(o.end[t.index]=a.end)},o.reselect=function(){i.each(i("select"),function(e,t){var n=i(this);n.parents("."+l[0])[0]||1==n.attr("layer")&&i("."+l[0]).length<1&&n.removeAttr("layer").show(),n=null})},s.pt.IE6=function(e){i("select").each(function(e,t){var n=i(this);n.parents("."+l[0])[0]||"none"===n.css("display")||n.attr({layer:"1"}).hide(),n=null})},s.pt.openLayer=function(){var e=this;r.zIndex=e.config.zIndex,r.setTop=function(e){var t=function(){r.zIndex++,e.css("z-index",r.zIndex+1)};return r.zIndex=parseInt(e[0].style.zIndex),e.on("mousedown",t),r.zIndex}},o.record=function(e){var t=[e.width(),e.height(),e.position().top,e.position().left+parseFloat(e.css("margin-left"))];e.find(".layui-layer-max").addClass("layui-layer-maxmin"),e.attr({area:t})},o.rescollbar=function(e){l.html.attr("layer-full")==e&&(l.html[0].style.removeProperty?l.html[0].style.removeProperty("overflow"):l.html[0].style.removeAttribute("overflow"),l.html.removeAttr("layer-full"))},e.layer=r,r.getChildFrame=function(e,t){return t=t||i("."+l[4]).attr("times"),i("#"+l[0]+t).find("iframe").contents().find(e)},r.getFrameIndex=function(e){return i("#"+e).parents("."+l[4]).attr("times")},r.iframeAuto=function(e){if(e){var t=r.getChildFrame("html",e).outerHeight(),n=i("#"+l[0]+e),a=n.find(l[1]).outerHeight()||0,o=n.find("."+l[6]).outerHeight()||0;n.css({height:t+a+o}),n.find("iframe").css({height:t})}},r.iframeSrc=function(e,t){i("#"+l[0]+e).find("iframe").attr("src",t)},r.style=function(e,t,n){var a=i("#"+l[0]+e),r=a.find(".layui-layer-content"),s=a.attr("type"),f=a.find(l[1]).outerHeight()||0,c=a.find("."+l[6]).outerHeight()||0;a.attr("minLeft");s!==o.type[3]&&s!==o.type[4]&&(n||(parseFloat(t.width)<=260&&(t.width=260),parseFloat(t.height)-f-c<=64&&(t.height=64+f+c)),a.css(t),c=a.find("."+l[6]).outerHeight(),s===o.type[2]?a.find("iframe").css({height:parseFloat(t.height)-f-c}):r.css({height:parseFloat(t.height)-f-c-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom"))}))},r.min=function(e,t){var a=i("#"+l[0]+e),s=a.find(l[1]).outerHeight()||0,f=a.attr("minLeft")||181*o.minIndex+"px",c=a.css("position");o.record(a),o.minLeft[0]&&(f=o.minLeft[0],o.minLeft.shift()),a.attr("position",c),r.style(e,{width:180,height:s,left:f,top:n.height()-s,position:"fixed",overflow:"hidden"},!0),a.find(".layui-layer-min").hide(),"page"===a.attr("type")&&a.find(l[4]).hide(),o.rescollbar(e),a.attr("minLeft")||o.minIndex++,a.attr("minLeft",f)},r.restore=function(e){var t=i("#"+l[0]+e),n=t.attr("area").split(",");t.attr("type");r.style(e,{width:parseFloat(n[0]),height:parseFloat(n[1]),top:parseFloat(n[2]),left:parseFloat(n[3]),position:t.attr("position"),overflow:"visible"},!0),t.find(".layui-layer-max").removeClass("layui-layer-maxmin"),t.find(".layui-layer-min").show(),"page"===t.attr("type")&&t.find(l[4]).show(),o.rescollbar(e)},r.full=function(e){var t,a=i("#"+l[0]+e);o.record(a),l.html.attr("layer-full")||l.html.css("overflow","hidden").attr("layer-full",e),clearTimeout(t),t=setTimeout(function(){var t="fixed"===a.css("position");r.style(e,{top:t?0:n.scrollTop(),left:t?0:n.scrollLeft(),width:n.width(),height:n.height()},!0),a.find(".layui-layer-min").hide()},100)},r.title=function(e,t){var n=i("#"+l[0]+(t||r.index)).find(l[1]);n.html(e)},r.close=function(e){var t=i("#"+l[0]+e),n=t.attr("type"),a="layer-anim-close";if(t[0]){var s="layui-layer-wrap",f=function(){if(n===o.type[1]&&"object"===t.attr("conType")){t.children(":not(."+l[5]+")").remove();for(var a=t.find("."+s),r=0;r<2;r++)a.unwrap();a.css("display",a.data("display")).removeClass(s)}else{if(n===o.type[2])try{var f=i("#"+l[4]+e)[0];f.contentWindow.document.write(""),f.contentWindow.close(),t.find("."+l[5])[0].removeChild(f)}catch(c){}t[0].innerHTML="",t.remove()}"function"==typeof o.end[e]&&o.end[e](),delete o.end[e]};t.data("isOutAnim")&&t.addClass("layer-anim "+a),i("#layui-layer-moves, #layui-layer-shade"+e).remove(),6==r.ie&&o.reselect(),o.rescollbar(e),t.attr("minLeft")&&(o.minIndex--,o.minLeft.push(t.attr("minLeft"))),r.ie&&r.ie<10||!t.data("isOutAnim")?f():setTimeout(function(){f()},200)}},r.closeAll=function(e){i.each(i("."+l[0]),function(){var t=i(this),n=e?t.attr("type")===e:1;n&&r.close(t.attr("times")),n=null})};var f=r.cache||{},c=function(e){return f.skin?" "+f.skin+" "+f.skin+"-"+e:""};r.prompt=function(e,t){var a="";if(e=e||{},"function"==typeof e&&(t=e),e.area){var o=e.area;a='style="width: '+o[0]+"; height: "+o[1]+';"',delete e.area}var s,l=2==e.formType?'":function(){return''}(),f=e.success;return delete e.success,r.open(i.extend({type:1,btn:["确定","取消"],content:l,skin:"layui-layer-prompt"+c("prompt"),maxWidth:n.width(),success:function(t){s=t.find(".layui-layer-input"),s.val(e.value||"").focus(),"function"==typeof f&&f(t)},resize:!1,yes:function(i){var n=s.val();""===n?s.focus():n.length>(e.maxlength||500)?r.tips("最多输入"+(e.maxlength||500)+"个字数",s,{tips:1}):t&&t(n,i,s)}},e))},r.tab=function(e){e=e||{};var t=e.tab||{},n="layui-this",a=e.success;return delete e.success,r.open(i.extend({type:1,skin:"layui-layer-tab"+c("tab"),resize:!1,title:function(){var e=t.length,i=1,a="";if(e>0)for(a=''+t[0].title+"";i"+t[i].title+"";return a}(),content:'
                            '+function(){var e=t.length,i=1,a="";if(e>0)for(a='
                          • '+(t[0].content||"no content")+"
                          • ";i'+(t[i].content||"no content")+"";return a}()+"
                          ",success:function(t){var o=t.find(".layui-layer-title").children(),r=t.find(".layui-layer-tabmain").children();o.on("mousedown",function(t){t.stopPropagation?t.stopPropagation():t.cancelBubble=!0;var a=i(this),o=a.index();a.addClass(n).siblings().removeClass(n),r.eq(o).show().siblings().hide(),"function"==typeof e.change&&e.change(o)}),"function"==typeof a&&a(t)}},e))},r.photos=function(t,n,a){function o(e,t,i){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,t(n)},void(n.onerror=function(e){n.onerror=null,i(e)}))}var s={};if(t=t||{},t.photos){var l=t.photos.constructor===Object,f=l?t.photos:{},u=f.data||[],d=f.start||0;s.imgIndex=(0|d)+1,t.img=t.img||"img";var y=t.success;if(delete t.success,l){if(0===u.length)return r.msg("没有图片")}else{var p=i(t.photos),h=function(){u=[],p.find(t.img).each(function(e){var t=i(this);t.attr("layer-index",e),u.push({alt:t.attr("alt"),pid:t.attr("layer-pid"),src:t.attr("layer-src")||t.attr("src"),thumb:t.attr("src")})})};if(h(),0===u.length)return;if(n||p.on("click",t.img,function(){var e=i(this),n=e.attr("layer-index");r.photos(i.extend(t,{photos:{start:n,data:u,tab:t.tab},full:t.full}),!0),h()}),!n)return}s.imgprev=function(e){s.imgIndex--,s.imgIndex<1&&(s.imgIndex=u.length),s.tabimg(e)},s.imgnext=function(e,t){s.imgIndex++,s.imgIndex>u.length&&(s.imgIndex=1,t)||s.tabimg(e)},s.keyup=function(e){if(!s.end){var t=e.keyCode;e.preventDefault(),37===t?s.imgprev(!0):39===t?s.imgnext(!0):27===t&&r.close(s.index)}},s.tabimg=function(e){if(!(u.length<=1))return f.start=s.imgIndex-1,r.close(s.index),r.photos(t,!0,e)},s.event=function(){s.bigimg.hover(function(){s.imgsee.show()},function(){s.imgsee.hide()}),s.bigimg.find(".layui-layer-imgprev").on("click",function(e){e.preventDefault(),s.imgprev()}),s.bigimg.find(".layui-layer-imgnext").on("click",function(e){e.preventDefault(),s.imgnext()}),i(document).on("keyup",s.keyup)},s.loadi=r.load(1,{shade:!("shade"in t)&&.9,scrollbar:!1}),o(u[d].src,function(n){r.close(s.loadi),s.index=r.open(i.extend({type:1,id:"layui-layer-photos",area:function(){var a=[n.width,n.height],o=[i(e).width()-100,i(e).height()-100];if(!t.full&&(a[0]>o[0]||a[1]>o[1])){var r=[a[0]/o[0],a[1]/o[1]];r[0]>r[1]?(a[0]=a[0]/r[0],a[1]=a[1]/r[0]):r[0]'+(u[d].alt||
                          '+(u.length>1?'':"")+'
                          '+(u[d].alt||"")+""+s.imgIndex+"/"+u.length+"
                          ",success:function(e,i){s.bigimg=e.find(".layui-layer-phimg"),s.imgsee=e.find(".layui-layer-imguide,.layui-layer-imgbar"),s.event(e),t.tab&&t.tab(u[d],e),"function"==typeof y&&y(e)},end:function(){s.end=!0,i(document).off("keyup",s.keyup)}},t))},function(){r.close(s.loadi),r.msg("当前图片地址异常
                          是否继续查看下一张?",{time:3e4,btn:["下一张","不看了"],yes:function(){u.length>1&&s.imgnext(!0,!0)}})})}},o.run=function(t){i=t,n=i(e),l.html=i("html"),r.open=function(e){var t=new s(e);return t.index}},e.layui&&layui.define?(r.ready(),layui.define("jquery",function(t){r.path=layui.cache.dir,o.run(layui.$),e.layer=r,t("layer",r)})):"function"==typeof define&&define.amd?define(["jquery"],function(){return o.run(e.jQuery),r}):function(){o.run(e.jQuery),r.ready()}()}(window);layui.define("jquery",function(t){"use strict";var a=layui.$,i=(layui.hint(),layui.device()),e="element",l="layui-this",n="layui-show",s=function(){this.config={}};s.prototype.set=function(t){var i=this;return a.extend(!0,i.config,t),i},s.prototype.on=function(t,a){return layui.onevent.call(this,e,t,a)},s.prototype.tabAdd=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.children(".layui-tab-bar"),o=l.children(".layui-tab-content"),r='
                        • "+(i.title||"unnaming")+"
                        • ";return s[0]?s.before(r):n.append(r),o.append('
                          '+(i.content||"")+"
                          "),f.hideTabMore(!0),f.tabAuto(),this},s.prototype.tabDelete=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.find('>li[lay-id="'+i+'"]');return f.tabDelete(null,s),this},s.prototype.tabChange=function(t,i){var e=".layui-tab-title",l=a(".layui-tab[lay-filter="+t+"]"),n=l.children(e),s=n.find('>li[lay-id="'+i+'"]');return f.tabClick.call(s[0],null,null,s),this},s.prototype.tab=function(t){t=t||{},b.on("click",t.headerElem,function(i){var e=a(this).index();f.tabClick.call(this,i,e,null,t)})},s.prototype.progress=function(t,i){var e="layui-progress",l=a("."+e+"[lay-filter="+t+"]"),n=l.find("."+e+"-bar"),s=n.find("."+e+"-text");return n.css("width",i),s.text(i),this};var o=".layui-nav",r="layui-nav-item",c="layui-nav-bar",u="layui-nav-tree",d="layui-nav-child",y="layui-nav-more",h="layui-anim layui-anim-upbit",f={tabClick:function(t,i,s,o){o=o||{};var r=s||a(this),i=i||r.parent().children("li").index(r),c=o.headerElem?r.parent():r.parents(".layui-tab").eq(0),u=o.bodyElem?a(o.bodyElem):c.children(".layui-tab-content").children(".layui-tab-item"),d=r.find("a"),y=c.attr("lay-filter");"javascript:;"!==d.attr("href")&&"_blank"===d.attr("target")||(r.addClass(l).siblings().removeClass(l),u.eq(i).addClass(n).siblings().removeClass(n)),layui.event.call(this,e,"tab("+y+")",{elem:c,index:i})},tabDelete:function(t,i){var n=i||a(this).parent(),s=n.index(),o=n.parents(".layui-tab").eq(0),r=o.children(".layui-tab-content").children(".layui-tab-item"),c=o.attr("lay-filter");n.hasClass(l)&&(n.next()[0]?f.tabClick.call(n.next()[0],null,s+1):n.prev()[0]&&f.tabClick.call(n.prev()[0],null,s-1)),n.remove(),r.eq(s).remove(),setTimeout(function(){f.tabAuto()},50),layui.event.call(this,e,"tabDelete("+c+")",{elem:o,index:s})},tabAuto:function(){var t="layui-tab-more",e="layui-tab-bar",l="layui-tab-close",n=this;a(".layui-tab").each(function(){var s=a(this),o=s.children(".layui-tab-title"),r=(s.children(".layui-tab-content").children(".layui-tab-item"),'lay-stope="tabmore"'),c=a('');if(n===window&&8!=i.ie&&f.hideTabMore(!0),s.attr("lay-allowClose")&&o.find("li").each(function(){var t=a(this);if(!t.find("."+l)[0]){var i=a('');i.on("click",f.tabDelete),t.append(i)}}),"string"!=typeof s.attr("lay-unauto"))if(o.prop("scrollWidth")>o.outerWidth()+1){if(o.find("."+e)[0])return;o.append(c),s.attr("overflow",""),c.on("click",function(a){o[this.title?"removeClass":"addClass"](t),this.title=this.title?"":"收缩"})}else o.find("."+e).remove(),s.removeAttr("overflow")})},hideTabMore:function(t){var i=a(".layui-tab-title");t!==!0&&"tabmore"===a(t.target).attr("lay-stope")||(i.removeClass("layui-tab-more"),i.find(".layui-tab-bar").attr("title",""))},clickThis:function(){var t=a(this),i=t.parents(o),n=i.attr("lay-filter"),s=t.parent(),c=t.siblings("."+d),y="string"==typeof s.attr("lay-unselect");"javascript:;"!==t.attr("href")&&"_blank"===t.attr("target")||y||c[0]||(i.find("."+l).removeClass(l),s.addClass(l)),i.hasClass(u)&&(c.removeClass(h),c[0]&&(s["none"===c.css("display")?"addClass":"removeClass"](r+"ed"),"all"===i.attr("lay-shrink")&&s.siblings().removeClass(r+"ed"))),layui.event.call(this,e,"nav("+n+")",t)},collapse:function(){var t=a(this),i=t.find(".layui-colla-icon"),l=t.siblings(".layui-colla-content"),s=t.parents(".layui-collapse").eq(0),o=s.attr("lay-filter"),r="none"===l.css("display");if("string"==typeof s.attr("lay-accordion")){var c=s.children(".layui-colla-item").children("."+n);c.siblings(".layui-colla-title").children(".layui-colla-icon").html(""),c.removeClass(n)}l[r?"addClass":"removeClass"](n),i.html(r?"":""),layui.event.call(this,e,"collapse("+o+")",{title:t,content:l,show:r})}};s.prototype.init=function(t,e){var l=function(){return e?'[lay-filter="'+e+'"]':""}(),s={tab:function(){f.tabAuto.call({})},nav:function(){var t=200,e={},s={},p={},b=function(l,o,r){var c=a(this),f=c.find("."+d);o.hasClass(u)?l.css({top:c.position().top,height:c.children("a").outerHeight(),opacity:1}):(f.addClass(h),l.css({left:c.position().left+parseFloat(c.css("marginLeft")),top:c.position().top+c.height()-l.height()}),e[r]=setTimeout(function(){l.css({width:c.width(),opacity:1})},i.ie&&i.ie<10?0:t),clearTimeout(p[r]),"block"===f.css("display")&&clearTimeout(s[r]),s[r]=setTimeout(function(){f.addClass(n),c.find("."+y).addClass(y+"d")},300))};a(o+l).each(function(i){var l=a(this),o=a(''),h=l.find("."+r);l.find("."+c)[0]||(l.append(o),h.on("mouseenter",function(){b.call(this,o,l,i)}).on("mouseleave",function(){l.hasClass(u)||(clearTimeout(s[i]),s[i]=setTimeout(function(){l.find("."+d).removeClass(n),l.find("."+y).removeClass(y+"d")},300))}),l.on("mouseleave",function(){clearTimeout(e[i]),p[i]=setTimeout(function(){l.hasClass(u)?o.css({height:0,top:o.position().top+o.height()/2,opacity:0}):o.css({width:0,left:o.position().left+o.width()/2,opacity:0})},t)})),h.find("a").each(function(){var t=a(this),i=(t.parent(),t.siblings("."+d));i[0]&&!t.children("."+y)[0]&&t.append(''),t.off("click",f.clickThis).on("click",f.clickThis)})})},breadcrumb:function(){var t=".layui-breadcrumb";a(t+l).each(function(){var t=a(this),i="lay-separator",e=t.attr(i)||"/",l=t.find("a");l.next("span["+i+"]")[0]||(l.each(function(t){t!==l.length-1&&a(this).after(""+e+"")}),t.css("visibility","visible"))})},progress:function(){var t="layui-progress";a("."+t+l).each(function(){var i=a(this),e=i.find(".layui-progress-bar"),l=e.attr("lay-percent");e.css("width",function(){return/^.+\/.+$/.test(l)?100*new Function("return "+l)()+"%":l}()),i.attr("lay-showPercent")&&setTimeout(function(){e.html(''+l+"")},350)})},collapse:function(){var t="layui-collapse";a("."+t+l).each(function(){var t=a(this).find(".layui-colla-item");t.each(function(){var t=a(this),i=t.find(".layui-colla-title"),e=t.find(".layui-colla-content"),l="none"===e.css("display");i.find(".layui-colla-icon").remove(),i.append(''+(l?"":"")+""),i.off("click",f.collapse).on("click",f.collapse)})})}};return s[t]?s[t]():layui.each(s,function(t,a){a()})},s.prototype.render=s.prototype.init;var p=new s,b=a(document);p.render();var v=".layui-tab-title li";b.on("click",v,f.tabClick),b.on("click",f.hideTabMore),a(window).on("resize",f.tabAuto),t(e,p)});layui.define("layer",function(e){"use strict";var i=layui.$,t=layui.layer,n=layui.hint(),a=layui.device(),o={config:{},set:function(e){var t=this;return t.config=i.extend({},t.config,e),t},on:function(e,i){return layui.onevent.call(this,r,e,i)}},l=function(){var e=this;return{upload:function(i){e.upload.call(e,i)},config:e.config}},r="upload",u="layui-upload-file",c="layui-upload-form",f="layui-upload-iframe",s="layui-upload-choose",p=function(e){var t=this;t.config=i.extend({},t.config,o.config,e),t.render()};p.prototype.config={accept:"images",exts:"",auto:!0,bindAction:"",url:"",field:"file",method:"post",data:{},drag:!0,size:0,number:0,multiple:!1},p.prototype.render=function(e){var t=this,e=t.config;e.elem=i(e.elem),e.bindAction=i(e.bindAction),t.file(),t.events()},p.prototype.file=function(){var e=this,t=e.config,n=e.elemFile=i(['"].join("")),o=t.elem.next();(o.hasClass(u)||o.hasClass(c))&&o.remove(),a.ie&&a.ie<10&&t.elem.wrap('
                          '),e.isFile()?(e.elemFile=t.elem,t.field=t.elem[0].name):t.elem.after(n),a.ie&&a.ie<10&&e.initIE()},p.prototype.initIE=function(){var e=this,t=e.config,n=i(''),a=i(['
                          ',"
                          "].join(""));i("#"+f)[0]||i("body").append(n),t.elem.next().hasClass(c)||(e.elemFile.wrap(a),t.elem.next("."+c).append(function(){var e=[];return layui.each(t.data,function(i,t){t="function"==typeof t?t():t,e.push('')}),e.join("")}()))},p.prototype.msg=function(e){return t.msg(e,{icon:2,shift:6})},p.prototype.isFile=function(){var e=this.config.elem[0];if(e)return"input"===e.tagName.toLocaleLowerCase()&&"file"===e.type},p.prototype.preview=function(e){var i=this;window.FileReader&&layui.each(i.chooseFiles,function(i,t){var n=new FileReader;n.readAsDataURL(t),n.onload=function(){e&&e(i,t,this.result)}})},p.prototype.upload=function(e,t){var n,o=this,l=o.config,r=o.elemFile[0],u=function(){var t=0,n=0,a=e||o.files||o.chooseFiles||r.files,u=function(){l.multiple&&t+n===o.fileLength&&"function"==typeof l.allDone&&l.allDone({total:o.fileLength,successful:t,aborted:n})};layui.each(a,function(e,a){var r=new FormData;r.append(l.field,a),layui.each(l.data,function(e,i){i="function"==typeof i?i():i,r.append(e,i)}),i.ajax({url:l.url,type:"post",data:r,contentType:!1,processData:!1,dataType:"json",headers:l.headers||{},success:function(i){t++,d(e,i),u()},error:function(){n++,o.msg("请求上传接口出现异常"),m(e),u()}})})},c=function(){var e=i("#"+f);o.elemFile.parent().submit(),clearInterval(p.timer),p.timer=setInterval(function(){var i,t=e.contents().find("body");try{i=t.text()}catch(n){o.msg("获取上传后的响应信息出现异常"),clearInterval(p.timer),m()}i&&(clearInterval(p.timer),t.html(""),d(0,i))},30)},d=function(e,i){if(o.elemFile.next("."+s).remove(),r.value="","object"!=typeof i)try{i=JSON.parse(i)}catch(t){return i={},o.msg("请对上传接口返回有效JSON")}"function"==typeof l.done&&l.done(i,e||0,function(e){o.upload(e)})},m=function(e){l.auto&&(r.value=""),"function"==typeof l.error&&l.error(e||0,function(e){o.upload(e)})},h=l.exts,v=function(){var i=[];return layui.each(e||o.chooseFiles,function(e,t){i.push(t.name)}),i}(),g={preview:function(e){o.preview(e)},upload:function(e,i){var t={};t[e]=i,o.upload(t)},pushFile:function(){return o.files=o.files||{},layui.each(o.chooseFiles,function(e,i){o.files[e]=i}),o.files},resetFile:function(e,i,t){var n=new File([i],t);o.files=o.files||{},o.files[e]=n}},y=function(){if("choose"!==t&&!l.auto||(l.choose&&l.choose(g),"choose"!==t))return l.before&&l.before(g),a.ie?a.ie>9?u():c():void u()};if(v=0===v.length?r.value.match(/[^\/\\]+\..+/g)||[]||"":v,0!==v.length){switch(l.accept){case"file":if(h&&!RegExp("\\w\\.("+h+")$","i").test(escape(v)))return o.msg("选择的文件中包含不支持的格式"),r.value="";break;case"video":if(!RegExp("\\w\\.("+(h||"avi|mp4|wma|rmvb|rm|flash|3gp|flv")+")$","i").test(escape(v)))return o.msg("选择的视频中包含不支持的格式"),r.value="";break;case"audio":if(!RegExp("\\w\\.("+(h||"mp3|wav|mid")+")$","i").test(escape(v)))return o.msg("选择的音频中包含不支持的格式"),r.value="";break;default:if(layui.each(v,function(e,i){RegExp("\\w\\.("+(h||"jpg|png|gif|bmp|jpeg$")+")","i").test(escape(i))||(n=!0)}),n)return o.msg("选择的图片中包含不支持的格式"),r.value=""}if(o.fileLength=function(){var i=0,t=e||o.files||o.chooseFiles||r.files;return layui.each(t,function(){i++}),i}(),l.number&&o.fileLength>l.number)return o.msg("同时最多只能上传的数量为:"+l.number);if(l.size>0&&!(a.ie&&a.ie<10)){var F;if(layui.each(o.chooseFiles,function(e,i){if(i.size>1024*l.size){var t=l.size/1024;t=t>=1?t.toFixed(2)+"MB":l.size+"KB",r.value="",F=t}}),F)return o.msg("文件不能超过"+F)}y()}},p.prototype.events=function(){var e=this,t=e.config,o=function(i){e.chooseFiles={},layui.each(i,function(i,t){var n=(new Date).getTime();e.chooseFiles[n+"-"+i]=t})},l=function(i,n){var a=e.elemFile,o=i.length>1?i.length+"个文件":(i[0]||{}).name||a[0].value.match(/[^\/\\]+\..+/g)||[]||"";a.next().hasClass(s)&&a.next().remove(),e.upload(null,"choose"),e.isFile()||t.choose||a.after(''+o+"")};t.elem.off("upload.start").on("upload.start",function(){var a=i(this),o=a.attr("lay-data");if(o)try{o=new Function("return "+o)(),e.config=i.extend({},t,o)}catch(l){n.error("Upload element property lay-data configuration item has a syntax error: "+o)}e.config.item=a,e.elemFile[0].click()}),a.ie&&a.ie<10||t.elem.off("upload.over").on("upload.over",function(){var e=i(this);e.attr("lay-over","")}).off("upload.leave").on("upload.leave",function(){var e=i(this);e.removeAttr("lay-over")}).off("upload.drop").on("upload.drop",function(n,a){var r=i(this),u=a.originalEvent.dataTransfer.files||[];r.removeAttr("lay-over"),o(u),t.auto?e.upload(u):l(u)}),e.elemFile.off("upload.change").on("upload.change",function(){var i=this.files||[];o(i),t.auto?e.upload():l(i)}),t.bindAction.off("upload.action").on("upload.action",function(){e.upload()}),t.elem.data("haveEvents")||(e.elemFile.on("change",function(){i(this).trigger("upload.change")}),t.elem.on("click",function(){e.isFile()||i(this).trigger("upload.start")}),t.drag&&t.elem.on("dragover",function(e){e.preventDefault(),i(this).trigger("upload.over")}).on("dragleave",function(e){i(this).trigger("upload.leave")}).on("drop",function(e){e.preventDefault(),i(this).trigger("upload.drop",e)}),t.bindAction.on("click",function(){i(this).trigger("upload.action")}),t.elem.data("haveEvents",!0))},o.render=function(e){var i=new p(e);return l.call(i)},e(r,o)});layui.define("jquery",function(e){"use strict";var i=layui.jquery,t={config:{},index:layui.slider?layui.slider.index+1e4:0,set:function(e){var t=this;return t.config=i.extend({},t.config,e),t},on:function(e,i){return layui.onevent.call(this,n,e,i)}},a=function(){var e=this,i=e.config;return{setValue:function(i,t){return e.slide("set",i,t||0)},config:i}},n="slider",l="layui-disabled",s="layui-slider",r="layui-slider-bar",o="layui-slider-wrap",u="layui-slider-wrap-btn",d="layui-slider-tips",v="layui-slider-input",c="layui-slider-input-txt",m="layui-slider-input-btn",p="layui-slider-hover",f=function(e){var a=this;a.index=++t.index,a.config=i.extend({},a.config,t.config,e),a.render()};f.prototype.config={type:"default",min:0,max:100,value:0,step:1,showstep:!1,tips:!0,input:!1,range:!1,height:200,disabled:!1,theme:"#009688"},f.prototype.render=function(){var e=this,t=e.config;if(t.step<1&&(t.step=1),t.maxt.min?a:t.min,t.value[1]=n>t.min?n:t.min,t.value[0]=t.value[0]>t.max?t.max:t.value[0],t.value[1]=t.value[1]>t.max?t.max:t.value[1];var r=Math.floor((t.value[0]-t.min)/(t.max-t.min)*100),v=Math.floor((t.value[1]-t.min)/(t.max-t.min)*100),m=v-r+"%";r+="%",v+="%"}else{"object"==typeof t.value&&(t.value=Math.min.apply(null,t.value)),t.valuet.max&&(t.value=t.max);var m=Math.floor((t.value-t.min)/(t.max-t.min)*100)+"%"}var p=t.disabled?"#c2c2c2":t.theme,f='
                          '+(t.tips?'
                          ':"")+'
                          '+(t.range?'
                          ':"")+"
                          ",h=i(t.elem),y=h.next("."+s);if(y[0]&&y.remove(),e.elemTemp=i(f),t.range?(e.elemTemp.find("."+o).eq(0).data("value",t.value[0]),e.elemTemp.find("."+o).eq(1).data("value",t.value[1])):e.elemTemp.find("."+o).data("value",t.value),h.html(e.elemTemp),"vertical"===t.type&&e.elemTemp.height(t.height+"px"),t.showstep){for(var g=(t.max-t.min)/t.step,b="",x=1;x
                          ')}e.elemTemp.append(b)}if(t.input&&!t.range){var w=i('
                          ');h.css("position","relative"),h.append(w),h.find("."+c).children("input").val(t.value),"vertical"===t.type?w.css({left:0,top:-48}):e.elemTemp.css("margin-right",w.outerWidth()+15)}t.disabled?(e.elemTemp.addClass(l),e.elemTemp.find("."+u).addClass(l)):e.slide(),e.elemTemp.find("."+u).on("mouseover",function(){var a="vertical"===t.type?t.height:e.elemTemp[0].offsetWidth,n=e.elemTemp.find("."+o),l="vertical"===t.type?a-i(this).parent()[0].offsetTop-n.height():i(this).parent()[0].offsetLeft,s=l/a*100,r=i(this).parent().data("value"),u=t.setTips?t.setTips(r):r;e.elemTemp.find("."+d).html(u),"vertical"===t.type?e.elemTemp.find("."+d).css({bottom:s+"%","margin-bottom":"20px",display:"inline-block"}):e.elemTemp.find("."+d).css({left:s+"%",display:"inline-block"})}).on("mouseout",function(){e.elemTemp.find("."+d).css("display","none")})},f.prototype.slide=function(e,t,a){var n=this,l=n.config,s=n.elemTemp,f=function(){return"vertical"===l.type?l.height:s[0].offsetWidth},h=s.find("."+o),y=s.next("."+v),g=y.children("."+c).children("input").val(),b=100/((l.max-l.min)/Math.ceil(l.step)),x=function(e,i){e=Math.ceil(e)*b>100?Math.ceil(e)*b:Math.round(e)*b,e=e>100?100:e,h.eq(i).css("vertical"===l.type?"bottom":"left",e+"%");var t=T(h[0].offsetLeft),a=l.range?T(h[1].offsetLeft):0;"vertical"===l.type?(s.find("."+d).css({bottom:e+"%","margin-bottom":"20px"}),t=T(f()-h[0].offsetTop-h.height()),a=l.range?T(f()-h[1].offsetTop-h.height()):0):s.find("."+d).css("left",e+"%"),t=t>100?100:t,a=a>100?100:a;var n=Math.min(t,a),o=Math.abs(t-a);"vertical"===l.type?s.find("."+r).css({height:o+"%",bottom:n+"%"}):s.find("."+r).css({width:o+"%",left:n+"%"});var u=l.min+Math.round((l.max-l.min)*e/100);if(g=u,y.children("."+c).children("input").val(g),h.eq(i).data("value",u),u=l.setTips?l.setTips(u):u,s.find("."+d).html(u),l.range){var v=[h.eq(0).data("value"),h.eq(1).data("value")];v[0]>v[1]&&v.reverse()}l.change&&l.change(l.range?v:u)},T=function(e){var i=e/f()*100/b,t=Math.round(i)*b;return e==f()&&(t=Math.ceil(i)*b),t},w=i(['
                          f()&&(r=f());var o=r/f()*100/b;x(o,e),t.addClass(p),s.find("."+d).show(),i.preventDefault()},o=function(){t.removeClass(p),s.find("."+d).hide()};M(r,o)})}),s.on("click",function(e){var t=i("."+u);if(!t.is(event.target)&&0===t.has(event.target).length&&t.length){var a,n="vertical"===l.type?f()-e.clientY+i(this).offset().top:e.clientX-i(this).offset().left;n<0&&(n=0),n>f()&&(n=f());var s=n/f()*100/b;a=l.range?"vertical"===l.type?Math.abs(n-parseInt(i(h[0]).css("bottom")))>Math.abs(n-parseInt(i(h[1]).css("bottom")))?1:0:Math.abs(n-h[0].offsetLeft)>Math.abs(n-h[1].offsetLeft)?1:0:0,x(s,a),e.preventDefault()}}),y.hover(function(){var e=i(this);e.children("."+m).fadeIn("fast")},function(){var e=i(this);e.children("."+m).fadeOut("fast")}),y.children("."+m).children("i").each(function(e){i(this).on("click",function(){g=1==e?g-l.stepl.max?l.max:Number(g)+l.step;var i=(g-l.min)/(l.max-l.min)*100/b;x(i,0)})});var q=function(){var e=this.value;e=isNaN(e)?0:e,e=el.max?l.max:e,this.value=e;var i=(e-l.min)/(l.max-l.min)*100/b;x(i,0)};y.children("."+c).children("input").on("keydown",function(e){13===e.keyCode&&(e.preventDefault(),q.call(this))}).on("change",q)},f.prototype.events=function(){var e=this;e.config},t.render=function(e){var i=new f(e);return a.call(i)},e(n,t)});layui.define("jquery",function(e){"use strict";var i=layui.jquery,o={config:{},index:layui.colorpicker?layui.colorpicker.index+1e4:0,set:function(e){var o=this;return o.config=i.extend({},o.config,e),o},on:function(e,i){return layui.onevent.call(this,"colorpicker",e,i)}},r=function(){var e=this,i=e.config;return{config:i}},t="colorpicker",n="layui-show",l="layui-colorpicker",c=".layui-colorpicker-main",a="layui-icon-down",s="layui-icon-close",f="layui-colorpicker-trigger-span",d="layui-colorpicker-trigger-i",u="layui-colorpicker-side",p="layui-colorpicker-side-slider",g="layui-colorpicker-basis",v="layui-colorpicker-alpha-bgcolor",h="layui-colorpicker-alpha-slider",m="layui-colorpicker-basis-cursor",b="layui-colorpicker-main-input",k=function(e){var i={h:0,s:0,b:0},o=Math.min(e.r,e.g,e.b),r=Math.max(e.r,e.g,e.b),t=r-o;return i.b=r,i.s=0!=r?255*t/r:0,0!=i.s?e.r==r?i.h=(e.g-e.b)/t:e.g==r?i.h=2+(e.b-e.r)/t:i.h=4+(e.r-e.g)/t:i.h=-1,r==o&&(i.h=0),i.h*=60,i.h<0&&(i.h+=360),i.s*=100/255,i.b*=100/255,i},y=function(e){var e=e.indexOf("#")>-1?e.substring(1):e;if(3==e.length){var i=e.split("");e=i[0]+i[0]+i[1]+i[1]+i[2]+i[2]}e=parseInt(e,16);var o={r:e>>16,g:(65280&e)>>8,b:255&e};return k(o)},x=function(e){var i={},o=e.h,r=255*e.s/100,t=255*e.b/100;if(0==r)i.r=i.g=i.b=t;else{var n=t,l=(255-r)*t/255,c=(n-l)*(o%60)/60;360==o&&(o=0),o<60?(i.r=n,i.b=l,i.g=l+c):o<120?(i.g=n,i.b=l,i.r=n-c):o<180?(i.g=n,i.r=l,i.b=l+c):o<240?(i.b=n,i.r=l,i.g=n-c):o<300?(i.b=n,i.g=l,i.r=l+c):o<360?(i.r=n,i.g=l,i.b=n-c):(i.r=0,i.g=0,i.b=0)}return{r:Math.round(i.r),g:Math.round(i.g),b:Math.round(i.b)}},C=function(e){var o=x(e),r=[o.r.toString(16),o.g.toString(16),o.b.toString(16)];return i.each(r,function(e,i){1==i.length&&(r[e]="0"+i)}),r.join("")},P=function(e){var i=/[0-9]{1,3}/g,o=e.match(i)||[];return{r:o[0],g:o[1],b:o[2]}},B=i(window),w=i(document),D=function(e){var r=this;r.index=++o.index,r.config=i.extend({},r.config,o.config,e),r.render()};D.prototype.config={color:"",size:null,alpha:!1,format:"hex",predefine:!1,colors:["#009688","#5FB878","#1E9FFF","#FF5722","#FFB800","#01AAED","#999","#c00","#ff8c00","#ffd700","#90ee90","#00ced1","#1e90ff","#c71585","rgb(0, 186, 189)","rgb(255, 120, 0)","rgb(250, 212, 0)","#393D49","rgba(0,0,0,.5)","rgba(255, 69, 0, 0.68)","rgba(144, 240, 144, 0.5)","rgba(31, 147, 255, 0.73)"]},D.prototype.render=function(){var e=this,o=e.config,r=i(['
                          ',"",'3&&(o.alpha&&"rgb"==o.format||(e="#"+C(k(P(o.color))))),"background: "+e):e}()+'">','',"","","
                          "].join("")),t=i(o.elem);o.size&&r.addClass("layui-colorpicker-"+o.size),t.addClass("layui-inline").html(e.elemColorBox=r),e.color=e.elemColorBox.find("."+f)[0].style.background,e.events()},D.prototype.renderPicker=function(){var e=this,o=e.config,r=e.elemColorBox[0],t=e.elemPicker=i(['
                          ','
                          ','
                          ','
                          ','
                          ','
                          ',"
                          ",'
                          ','
                          ',"
                          ","
                          ",'
                          ','
                          ','
                          ',"
                          ","
                          ",function(){if(o.predefine){var e=['
                          '];return layui.each(o.colors,function(i,o){e.push(['
                          ','
                          ',"
                          "].join(""))}),e.push("
                          "),e.join("")}return""}(),'
                          ','
                          ','',"
                          ",'
                          ','','',"","
                          "].join(""));e.elemColorBox.find("."+f)[0];i(c)[0]&&i(c).data("index")==e.index?e.removePicker(D.thisElemInd):(e.removePicker(D.thisElemInd),i("body").append(t)),D.thisElemInd=e.index,D.thisColor=r.style.background,e.position(),e.pickerEvents()},D.prototype.removePicker=function(e){var o=this;o.config;return i("#layui-colorpicker"+(e||o.index)).remove(),o},D.prototype.position=function(){var e=this,i=e.config,o=e.bindElem||e.elemColorBox[0],r=e.elemPicker[0],t=o.getBoundingClientRect(),n=r.offsetWidth,l=r.offsetHeight,c=function(e){return e=e?"scrollLeft":"scrollTop",document.body[e]|document.documentElement[e]},a=function(e){return document.documentElement[e?"clientWidth":"clientHeight"]},s=5,f=t.left,d=t.bottom;f-=(n-o.offsetWidth)/2,d+=s,f+n+s>a("width")?f=a("width")-n-s:fa()&&(d=t.top>l?t.top-l:a()-l,d-=2*s),i.position&&(r.style.position=i.position),r.style.left=f+("fixed"===i.position?0:c(1))+"px",r.style.top=d+("fixed"===i.position?0:c())+"px"},D.prototype.val=function(){var e=this,i=(e.config,e.elemColorBox.find("."+f)),o=e.elemPicker.find("."+b),r=i[0],t=r.style.backgroundColor;if(t){var n=k(P(t)),l=i.attr("lay-type");if(e.select(n.h,n.s,n.b),"torgb"===l&&o.find("input").val(t),"rgba"===l){var c=P(t);if(3==(t.match(/[0-9]{1,3}/g)||[]).length)o.find("input").val("rgba("+c.r+", "+c.g+", "+c.b+", 1)"),e.elemPicker.find("."+h).css("left",280);else{o.find("input").val(t);var a=280*t.slice(t.lastIndexOf(",")+1,t.length-1);e.elemPicker.find("."+h).css("left",a)}e.elemPicker.find("."+v)[0].style.background="linear-gradient(to right, rgba("+c.r+", "+c.g+", "+c.b+", 0), rgb("+c.r+", "+c.g+", "+c.b+"))"}}else e.select(0,100,100),o.find("input").val(""),e.elemPicker.find("."+v)[0].style.background="",e.elemPicker.find("."+h).css("left",280)},D.prototype.side=function(){var e=this,o=e.config,r=e.elemColorBox.find("."+f),t=r.attr("lay-type"),n=e.elemPicker.find("."+u),l=e.elemPicker.find("."+p),c=e.elemPicker.find("."+g),y=e.elemPicker.find("."+m),C=e.elemPicker.find("."+v),w=e.elemPicker.find("."+h),D=l[0].offsetTop/180*360,E=100-(y[0].offsetTop+3)/180*100,H=(y[0].offsetLeft+3)/260*100,W=Math.round(w[0].offsetLeft/280*100)/100,j=e.elemColorBox.find("."+d),F=e.elemPicker.find(".layui-colorpicker-pre").children("div"),L=function(i,n,l,c){e.select(i,n,l);var f=x({h:i,s:n,b:l});if(j.addClass(a).removeClass(s),r[0].style.background="rgb("+f.r+", "+f.g+", "+f.b+")","torgb"===t&&e.elemPicker.find("."+b).find("input").val("rgb("+f.r+", "+f.g+", "+f.b+")"),"rgba"===t){var d=0;d=280*c,w.css("left",d),e.elemPicker.find("."+b).find("input").val("rgba("+f.r+", "+f.g+", "+f.b+", "+c+")"),r[0].style.background="rgba("+f.r+", "+f.g+", "+f.b+", "+c+")",C[0].style.background="linear-gradient(to right, rgba("+f.r+", "+f.g+", "+f.b+", 0), rgb("+f.r+", "+f.g+", "+f.b+"))"}o.change&&o.change(e.elemPicker.find("."+b).find("input").val())},M=i(['
                          t&&(r=t);var l=r/180*360;D=l,L(l,H,E,W),e.preventDefault()};Y(r),e.preventDefault()}),n.on("click",function(e){var o=e.clientY-i(this).offset().top;o<0&&(o=0),o>this.offsetHeight&&(o=this.offsetHeight);var r=o/180*360;D=r,L(r,H,E,W),e.preventDefault()}),y.on("mousedown",function(e){var i=this.offsetTop,o=this.offsetLeft,r=e.clientY,t=e.clientX,n=function(e){var n=i+(e.clientY-r),l=o+(e.clientX-t),a=c[0].offsetHeight-3,s=c[0].offsetWidth-3;n<-3&&(n=-3),n>a&&(n=a),l<-3&&(l=-3),l>s&&(l=s);var f=(l+3)/260*100,d=100-(n+3)/180*100;E=d,H=f,L(D,f,d,W),e.preventDefault()};layui.stope(e),Y(n),e.preventDefault()}),c.on("mousedown",function(e){var o=e.clientY-i(this).offset().top-3+B.scrollTop(),r=e.clientX-i(this).offset().left-3+B.scrollLeft();o<-3&&(o=-3),o>this.offsetHeight-3&&(o=this.offsetHeight-3),r<-3&&(r=-3),r>this.offsetWidth-3&&(r=this.offsetWidth-3);var t=(r+3)/260*100,n=100-(o+3)/180*100;E=n,H=t,L(D,t,n,W),e.preventDefault(),y.trigger(e,"mousedown")}),w.on("mousedown",function(e){var i=this.offsetLeft,o=e.clientX,r=function(e){var r=i+(e.clientX-o),t=C[0].offsetWidth;r<0&&(r=0),r>t&&(r=t);var n=Math.round(r/280*100)/100;W=n,L(D,H,E,n),e.preventDefault()};Y(r),e.preventDefault()}),C.on("click",function(e){var o=e.clientX-i(this).offset().left;o<0&&(o=0),o>this.offsetWidth&&(o=this.offsetWidth);var r=Math.round(o/280*100)/100;W=r,L(D,H,E,r),e.preventDefault()}),F.each(function(){i(this).on("click",function(){i(this).parent(".layui-colorpicker-pre").addClass("selected").siblings().removeClass("selected");var e,o=this.style.backgroundColor,r=k(P(o)),t=o.slice(o.lastIndexOf(",")+1,o.length-1);D=r.h,H=r.s,E=r.b,3==(o.match(/[0-9]{1,3}/g)||[]).length&&(t=1),W=t,e=280*t,L(r.h,r.s,r.b,t)})})},D.prototype.select=function(e,i,o,r){var t=this,n=(t.config,C({h:e,s:100,b:100})),l=C({h:e,s:i,b:o}),c=e/360*180,a=180-o/100*180-3,s=i/100*260-3;t.elemPicker.find("."+p).css("top",c),t.elemPicker.find("."+g)[0].style.background="#"+n,t.elemPicker.find("."+m).css({top:a,left:s}),"change"!==r&&t.elemPicker.find("."+b).find("input").val("#"+l)},D.prototype.pickerEvents=function(){var e=this,o=e.config,r=e.elemColorBox.find("."+f),t=e.elemPicker.find("."+b+" input"),n={clear:function(i){r[0].style.background="",e.elemColorBox.find("."+d).removeClass(a).addClass(s),e.color="",o.done&&o.done(""),e.removePicker()},confirm:function(i,n){var l=t.val(),c=l,f={};if(l.indexOf(",")>-1){if(f=k(P(l)),e.select(f.h,f.s,f.b),r[0].style.background=c="#"+C(f),(l.match(/[0-9]{1,3}/g)||[]).length>3&&"rgba"===r.attr("lay-type")){var u=280*l.slice(l.lastIndexOf(",")+1,l.length-1);e.elemPicker.find("."+h).css("left",u),r[0].style.background=l,c=l}}else f=y(l),r[0].style.background=c="#"+C(f),e.elemColorBox.find("."+d).removeClass(s).addClass(a);return"change"===n?(e.select(f.h,f.s,f.b,n),void(o.change&&o.change(c))):(e.color=l,o.done&&o.done(l),void e.removePicker())}};e.elemPicker.on("click","*[colorpicker-events]",function(){var e=i(this),o=e.attr("colorpicker-events");n[o]&&n[o].call(this,e)}),t.on("keyup",function(e){var o=i(this);n.confirm.call(this,o,13===e.keyCode?null:"change")})},D.prototype.events=function(){var e=this,o=e.config,r=e.elemColorBox.find("."+f);e.elemColorBox.on("click",function(){e.renderPicker(),i(c)[0]&&(e.val(),e.side())}),o.elem[0]&&!e.elemColorBox[0].eventHandler&&(w.on("click",function(o){if(!i(o.target).hasClass(l)&&!i(o.target).parents("."+l)[0]&&!i(o.target).hasClass(c.replace(/\./g,""))&&!i(o.target).parents(c)[0]&&e.elemPicker){if(e.color){var t=k(P(e.color));e.select(t.h,t.s,t.b)}else e.elemColorBox.find("."+d).removeClass(a).addClass(s);r[0].style.background=e.color||"",e.removePicker()}}),B.on("resize",function(){return!(!e.elemPicker||!i(c)[0])&&void e.position()}),e.elemColorBox[0].eventHandler=!0)},o.render=function(e){var i=new D(e);return r.call(i)},e(t,o)});layui.define("layer",function(e){"use strict";var t=layui.$,i=layui.layer,a=layui.hint(),n=layui.device(),l="form",r=".layui-form",s="layui-this",o="layui-hide",c="layui-disabled",u=function(){this.config={verify:{required:[/[\S]+/,"必填项不能为空"],phone:[/^1\d{10}$/,"请输入正确的手机号"],email:[/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/,"邮箱格式不正确"],url:[/(^#)|(^http(s*):\/\/[^\s]+\.[^\s]+)/,"链接格式不正确"],number:function(e){if(!e||isNaN(e))return"只能填写数字"},date:[/^(\d{4})[-\/](\d{1}|0\d{1}|1[0-2])([-\/](\d{1}|0\d{1}|[1-2][0-9]|3[0-1]))*$/,"日期格式不正确"],identity:[/(^\d{15}$)|(^\d{17}(x|X|\d)$)/,"请输入正确的身份证号"]}}};u.prototype.set=function(e){var i=this;return t.extend(!0,i.config,e),i},u.prototype.verify=function(e){var i=this;return t.extend(!0,i.config.verify,e),i},u.prototype.on=function(e,t){return layui.onevent.call(this,l,e,t)},u.prototype.val=function(e,i){var a=t(r+'[lay-filter="'+e+'"]');a.each(function(e,a){var n=t(this);layui.each(i,function(e,t){var i,a=n.find('[name="'+e+'"]');a[0]&&(i=a[0].type,"checkbox"===i?a[0].checked=t:"radio"===i?a.each(function(){this.value===t&&(this.checked=!0)}):a.val(t))})}),f.render(null,e)},u.prototype.render=function(e,i){var n=this,u=t(r+function(){return i?'[lay-filter="'+i+'"]':""}()),d={select:function(){var e,i="请选择",a="layui-form-select",n="layui-select-title",r="layui-select-none",d="",f=u.find("select"),v=function(i,l){t(i.target).parent().hasClass(n)&&!l||(t("."+a).removeClass(a+"ed "+a+"up"),e&&d&&e.val(d)),e=null},y=function(i,u,f){var y,p=t(this),m=i.find("."+n),k=m.find("input"),x=i.find("dl"),g=x.children("dd"),b=this.selectedIndex;if(!u){var C=function(){var e=i.offset().top+i.outerHeight()+5-h.scrollTop(),t=x.outerHeight();b=p[0].selectedIndex,i.addClass(a+"ed"),g.removeClass(o),y=null,g.eq(b).addClass(s).siblings().removeClass(s),e+t>h.height()&&e>=t&&i.addClass(a+"up"),$()},w=function(e){i.removeClass(a+"ed "+a+"up"),k.blur(),y=null,e||T(k.val(),function(e){var i=p[0].selectedIndex;e&&(d=t(p[0].options[i]).html(),0===i&&d===k.attr("placeholder")&&(d=""),k.val(d||""))})},$=function(){var e=x.children("dd."+s);if(e[0]){var t=e.position().top,i=x.height(),a=e.height();t>i&&x.scrollTop(t+x.scrollTop()-i+a-5),t<0&&x.scrollTop(t+x.scrollTop()-5)}};m.on("click",function(e){i.hasClass(a+"ed")?w():(v(e,!0),C()),x.find("."+r).remove()}),m.find(".layui-edge").on("click",function(){k.focus()}),k.on("keyup",function(e){var t=e.keyCode;9===t&&C()}).on("keydown",function(e){var t=e.keyCode;9===t&&w();var i=function(t,a){var n,l;e.preventDefault();var r=function(){var e=x.children("dd."+s);if(x.children("dd."+o)[0]&&"next"===t){var i=x.children("dd:not(."+o+",."+c+")"),n=i.eq(0).index();if(n>=0&&n无匹配项

                          '):x.find("."+r).remove()},"keyup"),""===t&&x.find("."+r).remove(),void $())};f&&k.on("keyup",j).on("blur",function(i){var a=p[0].selectedIndex;e=k,d=t(p[0].options[a]).html(),0===a&&d===k.attr("placeholder")&&(d=""),setTimeout(function(){T(k.val(),function(e){d||k.val("")},"blur")},200)}),g.on("click",function(){var e=t(this),a=e.attr("lay-value"),n=p.attr("lay-filter");return!e.hasClass(c)&&(e.hasClass("layui-select-tips")?k.val(""):(k.val(e.text()),e.addClass(s)),e.siblings().removeClass(s),p.val(a).removeClass("layui-form-danger"),layui.event.call(this,l,"select("+n+")",{elem:p[0],value:a,othis:i}),w(!0),!1)}),i.find("dl>dt").on("click",function(e){return!1}),t(document).off("click",v).on("click",v)}};f.each(function(e,l){var r=t(this),o=r.next("."+a),u=this.disabled,d=l.value,f=t(l.options[l.selectedIndex]),v=l.options[0];if("string"==typeof r.attr("lay-ignore"))return r.show();var h="string"==typeof r.attr("lay-search"),p=v?v.value?i:v.innerHTML||i:i,m=t(['
                          ','
                          ','','
                          ','
                          ',function(e){var t=[];return layui.each(e,function(e,a){0!==e||a.value?"optgroup"===a.tagName.toLowerCase()?t.push("
                          "+a.label+"
                          "):t.push('
                          '+a.innerHTML+"
                          "):t.push('
                          '+(a.innerHTML||i)+"
                          ")}),0===t.length&&t.push('
                          没有选项
                          '),t.join("")}(r.find("*"))+"
                          ","
                          "].join(""));o[0]&&o.remove(),r.after(m),y.call(this,m,u,h)})},checkbox:function(){var e={checkbox:["layui-form-checkbox","layui-form-checked","checkbox"],_switch:["layui-form-switch","layui-form-onswitch","switch"]},i=u.find("input[type=checkbox]"),a=function(e,i){var a=t(this);e.on("click",function(){var t=a.attr("lay-filter"),n=(a.attr("lay-text")||"").split("|");a[0].disabled||(a[0].checked?(a[0].checked=!1,e.removeClass(i[1]).find("em").text(n[1])):(a[0].checked=!0,e.addClass(i[1]).find("em").text(n[0])),layui.event.call(a[0],l,i[2]+"("+t+")",{elem:a[0],value:a[0].value,othis:e}))})};i.each(function(i,n){var l=t(this),r=l.attr("lay-skin"),s=(l.attr("lay-text")||"").split("|"),o=this.disabled;"switch"===r&&(r="_"+r);var u=e[r]||e.checkbox;if("string"==typeof l.attr("lay-ignore"))return l.show();var d=l.next("."+u[0]),f=t(['
                          ",function(){var e=n.title.replace(/\s/g,""),t={checkbox:[e?""+n.title+"":"",''].join(""),_switch:""+((n.checked?s[0]:s[1])||"")+""};return t[r]||t.checkbox}(),"
                          "].join(""));d[0]&&d.remove(),l.after(f),a.call(this,f,u)})},radio:function(){var e="layui-form-radio",i=["",""],a=u.find("input[type=radio]"),n=function(a){var n=t(this),s="layui-anim-scaleSpring";a.on("click",function(){var o=n[0].name,c=n.parents(r),u=n.attr("lay-filter"),d=c.find("input[name="+o.replace(/(\.|#|\[|\])/g,"\\$1")+"]");n[0].disabled||(layui.each(d,function(){var a=t(this).next("."+e);this.checked=!1,a.removeClass(e+"ed"),a.find(".layui-icon").removeClass(s).html(i[1])}),n[0].checked=!0,a.addClass(e+"ed"),a.find(".layui-icon").addClass(s).html(i[0]),layui.event.call(n[0],l,"radio("+u+")",{elem:n[0],value:n[0].value,othis:a}))})};a.each(function(a,l){var r=t(this),s=r.next("."+e),o=this.disabled;if("string"==typeof r.attr("lay-ignore"))return r.show();s[0]&&s.remove();var u=t(['
                          ',''+i[l.checked?0:1]+"","
                          "+function(){var e=l.title||"";return"string"==typeof r.next().attr("lay-radio")&&(e=r.next().html(),r.next().remove()),e}()+"
                          ","
                          "].join(""));r.after(u),n.call(this,u)})}};return e?d[e]?d[e]():a.error("不支持的"+e+"表单渲染"):layui.each(d,function(e,t){t()}),n};var d=function(){var e=t(this),a=f.config.verify,s=null,o="layui-form-danger",c={},u=e.parents(r),d=u.find("*[lay-verify]"),v=e.parents("form")[0],h=u.find("input,select,textarea"),y=e.attr("lay-filter");if(layui.each(d,function(e,l){var r=t(this),c=r.attr("lay-verify").split("|"),u=r.attr("lay-verType"),d=r.val();if(r.removeClass(o),layui.each(c,function(e,t){var c,f="",v="function"==typeof a[t];if(a[t]){var c=v?f=a[t](d,l):!a[t][0].test(d);if(f=f||a[t][1],c)return"tips"===u?i.tips(f,function(){return"string"==typeof r.attr("lay-ignore")||"select"!==l.tagName.toLowerCase()&&!/^checkbox|radio$/.test(l.type)?r:r.next()}(),{tips:1}):"alert"===u?i.alert(f,{title:"提示",shadeClose:!0}):i.msg(f,{icon:5,shift:6}),n.android||n.ios||l.focus(),r.addClass(o),s=!0}}),s)return s}),s)return!1;var p={};return layui.each(h,function(e,t){if(t.name=(t.name||"").replace(/^\s*|\s*&/,""),t.name){if(/^.*\[\]$/.test(t.name)){var i=t.name.match(/^(.*)\[\]$/g)[0];p[i]=0|p[i],t.name=t.name.replace(/^(.*)\[\]$/,"$1["+p[i]++ +"]")}/^checkbox|radio$/.test(t.type)&&!t.checked||(c[t.name]=t.value)}}),layui.event.call(this,l,"submit("+y+")",{elem:this,form:v,field:c})},f=new u,v=t(document),h=t(window);f.render(),v.on("reset",r,function(){var e=t(this).attr("lay-filter");setTimeout(function(){f.render(null,e)},50)}),v.on("submit",r,d).on("click","*[lay-submit]",d),e(l,f)});layui.define("jquery",function(e){"use strict";var o=layui.$,a=layui.hint(),i="layui-tree-enter",r=function(e){this.options=e},t={arrow:["",""],checkbox:["",""],radio:["",""],branch:["",""],leaf:""};r.prototype.init=function(e){var o=this;e.addClass("layui-box layui-tree"),o.options.skin&&e.addClass("layui-tree-skin-"+o.options.skin),o.tree(e),o.on(e)},r.prototype.tree=function(e,a){var i=this,r=i.options,n=a||r.nodes;layui.each(n,function(a,n){var l=n.children&&n.children.length>0,c=o('
                            '),s=o(["
                          • ",function(){return l?''+(n.spread?t.arrow[1]:t.arrow[0])+"":""}(),function(){return r.check?''+("checkbox"===r.check?t.checkbox[0]:"radio"===r.check?t.radio[0]:"")+"":""}(),function(){return'"+(''+(l?n.spread?t.branch[1]:t.branch[0]:t.leaf)+"")+(""+(n.name||"未命名")+"")}(),"
                          • "].join(""));l&&(s.append(c),i.tree(c,n.children)),e.append(s),"function"==typeof r.click&&i.click(s,n),i.spread(s,n),r.drag&&i.drag(s,n)})},r.prototype.click=function(e,o){var a=this,i=a.options;e.children("a").on("click",function(e){layui.stope(e),i.click(o)})},r.prototype.spread=function(e,o){var a=this,i=(a.options,e.children(".layui-tree-spread")),r=e.children("ul"),n=e.children("a"),l=function(){e.data("spread")?(e.data("spread",null),r.removeClass("layui-show"),i.html(t.arrow[0]),n.find(".layui-icon").html(t.branch[0])):(e.data("spread",!0),r.addClass("layui-show"),i.html(t.arrow[1]),n.find(".layui-icon").html(t.branch[1]))};r[0]&&(i.on("click",l),n.on("dblclick",l))},r.prototype.on=function(e){var a=this,r=a.options,t="layui-tree-drag";e.find("i").on("selectstart",function(e){return!1}),r.drag&&o(document).on("mousemove",function(e){var i=a.move;if(i.from){var r=(i.to,o('
                            '));e.preventDefault(),o("."+t)[0]||o("body").append(r);var n=o("."+t)[0]?o("."+t):r;n.addClass("layui-show").html(i.from.elem.children("a").html()),n.css({left:e.pageX+10,top:e.pageY+10})}}).on("mouseup",function(){var e=a.move;e.from&&(e.from.elem.children("a").removeClass(i),e.to&&e.to.elem.children("a").removeClass(i),a.move={},o("."+t).remove())})},r.prototype.move={},r.prototype.drag=function(e,a){var r=this,t=(r.options,e.children("a")),n=function(){var t=o(this),n=r.move;n.from&&(n.to={item:a,elem:e},t.addClass(i))};t.on("mousedown",function(){var o=r.move;o.from={item:a,elem:e}}),t.on("mouseenter",n).on("mousemove",n).on("mouseleave",function(){var e=o(this),a=r.move;a.from&&(delete a.to,e.removeClass(i))})},e("tree",function(e){var i=new r(e=e||{}),t=o(e.elem);return t[0]?void i.init(t):a.error("layui.tree 没有找到"+e.elem+"元素")})});layui.define(["laytpl","laypage","layer","form","util"],function(e){"use strict";var t=layui.$,i=layui.laytpl,a=layui.laypage,l=layui.layer,n=layui.form,o=(layui.util,layui.hint()),r=layui.device(),d={config:{checkName:"LAY_CHECKED",indexName:"LAY_TABLE_INDEX"},cache:{},index:layui.table?layui.table.index+1e4:0,set:function(e){var i=this;return i.config=t.extend({},i.config,e),i},on:function(e,t){return layui.onevent.call(this,u,e,t)}},c=function(){var e=this,t=e.config,i=t.id||t.index;return i&&(c.that[i]=e,c.config[i]=t),{reload:function(t){e.reload.call(e,t)},setColsWidth:function(){e.setColsWidth.call(e)},resize:function(){e.resize.call(e)},config:t}},s=function(e){var t=c.config[e];return t||o.error("The ID option was not found in the table instance"),t||null},u="table",h=".layui-table",y="layui-hide",f="layui-none",p="layui-table-view",v=".layui-table-tool",m=".layui-table-box",g=".layui-table-init",b=".layui-table-header",x=".layui-table-body",k=".layui-table-main",C=".layui-table-fixed",w=".layui-table-fixed-l",T=".layui-table-fixed-r",A=".layui-table-total",L=".layui-table-page",S=".layui-table-sort",N="layui-table-edit",W="layui-table-hover",_=function(e){var t='{{#if(item2.colspan){}} colspan="{{item2.colspan}}"{{#} if(item2.rowspan){}} rowspan="{{item2.rowspan}}"{{#}}}';return e=e||{},['',"","{{# layui.each(d.data.cols, function(i1, item1){ }}","","{{# layui.each(item1, function(i2, item2){ }}",'{{# if(item2.fixed && item2.fixed !== "right"){ left = true; } }}','{{# if(item2.fixed === "right"){ right = true; } }}',function(){return e.fixed&&"right"!==e.fixed?'{{# if(item2.fixed && item2.fixed !== "right"){ }}':"right"===e.fixed?'{{# if(item2.fixed === "right"){ }}':""}(),"{{# var isSort = !(item2.colGroup) && item2.sort; }}",'",e.fixed?"{{# }; }}":"","{{# }); }}","","{{# }); }}","","
                            ','
                            ','{{# if(item2.type === "checkbox"){ }}','',"{{# } else { }}",'{{item2.title||""}}',"{{# if(isSort){ }}",'',"{{# } }}","{{# } }}","
                            ","
                            "].join("")},E=['',"","
                            "].join(""),z=['
                            ',"{{# if(d.data.toolbar){ }}",'
                            ','
                            ','
                            ',"
                            ","{{# } }}",'
                            ',"{{# if(d.data.loading){ }}",'
                            ','',"
                            ","{{# } }}","{{# var left, right; }}",'
                            ',_(),"
                            ",'
                            ',E,"
                            ","{{# if(left){ }}",'
                            ','
                            ',_({fixed:!0}),"
                            ",'
                            ',E,"
                            ","
                            ","{{# }; }}","{{# if(right){ }}",'
                            ','
                            ',_({fixed:"right"}),'
                            ',"
                            ",'
                            ',E,"
                            ","
                            ","{{# }; }}","
                            ","{{# if(d.data.totalRow){ }}",'
                            ','','',"
                            ","
                            ","{{# } }}","{{# if(d.data.page){ }}",'
                            ','
                            ',"
                            ","{{# } }}","","
                            "].join(""),H=t(window),R=t(document),F=function(e){var i=this;i.index=++d.index,i.config=t.extend({},i.config,d.config,e),i.render()};F.prototype.config={limit:10,loading:!0,cellMinWidth:60,defaultToolbar:["filter","exports","print"],autoSort:!0,text:{none:"无数据"}},F.prototype.render=function(){var e=this,a=e.config;if(a.elem=t(a.elem),a.where=a.where||{},a.id=a.id||a.elem.attr("id")||e.index,a.request=t.extend({pageName:"page",limitName:"limit"},a.request),a.response=t.extend({statusName:"code",statusCode:0,msgName:"msg",dataName:"data",countName:"count"},a.response),"object"==typeof a.page&&(a.limit=a.page.limit||a.limit,a.limits=a.page.limits||a.limits,e.page=a.page.curr=a.page.curr||1,delete a.page.elem,delete a.page.jump),!a.elem[0])return e;a.height&&/^full-\d+$/.test(a.height)&&(e.fullHeightGap=a.height.split("-")[1],a.height=H.height()-e.fullHeightGap),e.setInit();var l=a.elem,n=l.next("."+p),o=e.elem=t(i(z).render({VIEW_CLASS:p,data:a,index:e.index}));if(a.index=e.index,n[0]&&n.remove(),l.after(o),e.layTool=o.find(v),e.layBox=o.find(m),e.layHeader=o.find(b),e.layMain=o.find(k),e.layBody=o.find(x),e.layFixed=o.find(C),e.layFixLeft=o.find(w),e.layFixRight=o.find(T),e.layTotal=o.find(A),e.layPage=o.find(L),e.renderToolbar(),e.fullSize(),a.cols.length>1){var r=e.layFixed.find(b).find("th");r.height(e.layHeader.height()-1-parseFloat(r.css("padding-top"))-parseFloat(r.css("padding-bottom")))}e.pullData(e.page),e.events()},F.prototype.initOpts=function(e){var t=this,i=(t.config,{checkbox:48,radio:48,space:15,numbers:40});e.checkbox&&(e.type="checkbox"),e.space&&(e.type="space"),e.type||(e.type="normal"),"normal"!==e.type&&(e.unresize=!0,e.width=e.width||i[e.type])},F.prototype.setInit=function(e){var t=this,i=t.config;return i.clientWidth=i.width||function(){var e=function(t){var a,l;t=t||i.elem.parent(),a=t.width();try{l="none"===t.css("display")}catch(n){}return!t[0]||a&&!l?a:e(t.parent())};return e()}(),"width"===e?i.clientWidth:void layui.each(i.cols,function(e,a){layui.each(a,function(l,n){if(!n)return void a.splice(l,1);if(n.key=e+"-"+l,n.hide=n.hide||!1,n.colGroup||n.colspan>1){var o=0;layui.each(i.cols[e+1],function(t,i){i.HAS_PARENT||o>1&&o==n.colspan||(i.HAS_PARENT=!0,i.parentKey=e+"-"+l,o+=parseInt(i.colspan>1?i.colspan:1))}),n.colGroup=!0}t.initOpts(n)})})},F.prototype.renderToolbar=function(){var e=this,a=e.config,l=['
                            ','
                            ','
                            '].join(""),n=e.layTool.find(".layui-table-tool-temp");if("default"===a.toolbar)n.html(l);else if("string"==typeof a.toolbar){var o=t(a.toolbar).html()||"";o&&n.html(i(o).render(a))}var r={filter:{title:"筛选列",layEvent:"LAYTABLE_COLS",icon:"layui-icon-cols"},exports:{title:"导出",layEvent:"LAYTABLE_EXPORT",icon:"layui-icon-export"},print:{title:"打印",layEvent:"LAYTABLE_PRINT",icon:"layui-icon-print"}},d=[];"object"==typeof a.defaultToolbar&&layui.each(a.defaultToolbar,function(e,t){var i=r[t];i&&d.push('
                            ')}),e.layTool.find(".layui-table-tool-self").html(d.join(""))},F.prototype.setParentCol=function(e,t){var i=this,a=i.config,l=i.layHeader.find('th[data-key="'+a.index+"-"+t+'"]'),n=parseInt(l.attr("colspan"))||0;if(l[0]){var o=t.split("-"),r=a.cols[o[0]][o[1]];e?n--:n++,l.attr("colspan",n),l[n<1?"addClass":"removeClass"](y),r.colspan=n,r.hide=n<1;var d=l.data("parentkey");d&&i.setParentCol(e,d)}},F.prototype.setColsPatch=function(){var e=this,t=e.config;layui.each(t.cols,function(t,i){layui.each(i,function(t,i){i.hide&&e.setParentCol(i.hide,i.parentKey)})})},F.prototype.setColsWidth=function(){var e=this,t=e.config,i=0,a=0,l=0,n=0,o=e.setInit("width");e.eachCols(function(e,t){t.hide||i++}),o=o-function(){return"line"===t.skin||"nob"===t.skin?2:i+1}()-e.getScrollWidth(e.layMain[0])-1;var r=function(e){layui.each(t.cols,function(i,r){layui.each(r,function(i,d){var c=0,s=d.minWidth||t.cellMinWidth;return d?void(d.colGroup||d.hide||(e?l&&ln&&a&&(l=(o-n)/a)};r(),r(!0),e.autoColNums=a,e.eachCols(function(i,a){var n=a.minWidth||t.cellMinWidth;a.colGroup||a.hide||(0===a.width?e.getCssRule(t.index+"-"+a.key,function(e){e.style.width=Math.floor(l>=n?l:n)+"px"}):/\d+%$/.test(a.width)&&e.getCssRule(t.index+"-"+a.key,function(e){e.style.width=Math.floor(parseFloat(a.width)/100*o)+"px"}))});var d=e.layMain.width()-e.getScrollWidth(e.layMain[0])-e.layMain.children("table").outerWidth();if(e.autoColNums&&d>=-i&&d<=i){var c=function(t){var i;return t=t||e.layHeader.eq(0).find("thead th:last-child"),i=t.data("field"),!i&&t.prev()[0]?c(t.prev()):t},s=c(),u=s.data("key");e.getCssRule(u,function(t){var i=t.style.width||s.outerWidth();t.style.width=parseFloat(i)+d+"px",e.layMain.height()-e.layMain.prop("clientHeight")>0&&(t.style.width=parseFloat(t.style.width)-1+"px")})}e.loading(!0)},F.prototype.resize=function(){var e=this;e.fullSize(),e.setColsWidth(),e.scrollPatch()},F.prototype.reload=function(e){var i=this;i.config.data&&i.config.data.constructor===Array&&delete i.config.data,i.config=t.extend({},i.config,e),i.render()},F.prototype.page=1,F.prototype.pullData=function(e){var i=this,a=i.config,l=a.request,n=a.response,o=function(){"object"==typeof a.initSort&&i.sort(a.initSort.field,a.initSort.type)};if(i.startTime=(new Date).getTime(),a.url){var r={};r[l.pageName]=e,r[l.limitName]=a.limit;var d=t.extend(r,a.where);a.contentType&&0==a.contentType.indexOf("application/json")&&(d=JSON.stringify(d)),t.ajax({type:a.method||"get",url:a.url,contentType:a.contentType,data:d,dataType:"json",headers:a.headers||{},success:function(t){"function"==typeof a.parseData&&(t=a.parseData(t)||t),t[n.statusName]!=n.statusCode?(i.renderForm(),i.layMain.html('
                            '+(t[n.msgName]||"返回的数据不符合规范,正确的成功状态码 ("+n.statusName+") 应为:"+n.statusCode)+"
                            ")):(i.renderData(t,e,t[n.countName]),o(),a.time=(new Date).getTime()-i.startTime+" ms"),i.setColsWidth(),"function"==typeof a.done&&a.done(t,e,t[n.countName])},error:function(e,t){i.layMain.html('
                            数据接口请求异常:'+t+"
                            "),i.renderForm(),i.setColsWidth()}})}else if(a.data&&a.data.constructor===Array){var c={},s=e*a.limit-a.limit;c[n.dataName]=a.data.concat().splice(s,a.limit),c[n.countName]=a.data.length,i.renderData(c,e,a.data.length),o(),i.setColsWidth(),"function"==typeof a.done&&a.done(c,e,c[n.countName])}},F.prototype.eachCols=function(e){var t=this;return d.eachCols(null,e,t.config.cols),t},F.prototype.renderData=function(e,n,o,r){var c=this,s=c.config,u=e[s.response.dataName]||[],h=[],p=[],v=[],m=function(){var e;return!r&&c.sortKey?c.sort(c.sortKey.field,c.sortKey.sort,!0):(layui.each(u,function(a,l){var o=[],u=[],f=[],m=a+s.limit*(n-1)+1;0!==l.length&&(r||(l[d.config.indexName]=a),c.eachCols(function(n,r){var c=r.field||n,h=s.index+"-"+r.key,p=l[c];if(void 0!==p&&null!==p||(p=""),!r.colGroup){var v=['','
                            '+function(){var n=t.extend(!0,{LAY_INDEX:m},l),o=d.config.checkName;switch(r.type){case"checkbox":return'";case"radio":return n[o]&&(e=a),'';case"numbers":return m}return r.toolbar?i(t(r.toolbar).html()||"").render(n):r.templet?function(){return"function"==typeof r.templet?r.templet(n):i(t(r.templet).html()||String(p)).render(n)}():p}(),"
                            "].join("");o.push(v),r.fixed&&"right"!==r.fixed&&u.push(v),"right"===r.fixed&&f.push(v)}}),h.push(''+o.join("")+""),p.push(''+u.join("")+""),v.push(''+f.join("")+""))}),c.layBody.scrollTop(0),c.layMain.find("."+f).remove(),c.layMain.find("tbody").html(h.join("")),c.layFixLeft.find("tbody").html(p.join("")),c.layFixRight.find("tbody").html(v.join("")),c.renderForm(),"number"==typeof e&&c.setThisRowChecked(e),c.syncCheckAll(),c.haveInit?c.scrollPatch():setTimeout(function(){c.scrollPatch()},50),c.haveInit=!0,l.close(c.tipsIndex),s.HAS_SET_COLS_PATCH||c.setColsPatch(),void(s.HAS_SET_COLS_PATCH=!0))};return c.key=s.id||s.index,d.cache[c.key]=u,c.layPage[0==o||0===u.length&&1==n?"addClass":"removeClass"](y),r?m():0===u.length?(c.renderForm(),c.layFixed.remove(),c.layMain.find("tbody").html(""),c.layMain.find("."+f).remove(),c.layMain.append('
                            '+s.text.none+"
                            ")):(m(),c.renderTotal(u),void(s.page&&(s.page=t.extend({elem:"layui-table-page"+s.index,count:o,limit:s.limit,limits:s.limits||[10,20,30,40,50,60,70,80,90],groups:3,layout:["prev","page","next","skip","count","limit"],prev:'',next:'',jump:function(e,t){t||(c.page=e.curr,s.limit=e.limit,c.loading(),c.pullData(e.curr))}},s.page),s.page.count=o,a.render(s.page))))},F.prototype.renderTotal=function(e){var t=this,i=t.config,a={};if(i.totalRow){layui.each(e,function(e,i){0!==i.length&&t.eachCols(function(e,t){var l=t.field||e,n=i[l];t.totalRow&&(a[l]=(a[l]||0)+(parseFloat(n)||0))})});var l=[];t.eachCols(function(e,t){var n=t.field||e,o=['','
                            '+function(){var e=t.totalRowText||"";return t.totalRow?parseFloat(a[n]).toFixed(2)||e:e}(),"
                            "].join("");l.push(o)}),t.layTotal.find("tbody").html(""+l.join("")+"")}},F.prototype.getColElem=function(e,t){var i=this,a=i.config;return e.eq(0).find(".laytable-cell-"+(a.index+"-"+t)+":eq(0)")},F.prototype.renderForm=function(e){n.render(e,"LAY-table-"+this.index)},F.prototype.setThisRowChecked=function(e){var t=this,i=(t.config,"layui-table-click"),a=t.layBody.find('tr[data-index="'+e+'"]');a.addClass(i).siblings("tr").removeClass(i)},F.prototype.sort=function(e,i,a,l){var n,r,c=this,s={},h=c.config,y=h.elem.attr("lay-filter"),f=d.cache[c.key];"string"==typeof e&&c.layHeader.find("th").each(function(i,a){var l=t(this),o=l.data("field");if(o===e)return e=l,n=o,!1});try{var n=n||e.data("field"),p=e.data("key");if(c.sortKey&&!a&&n===c.sortKey.field&&i===c.sortKey.sort)return;var v=c.layHeader.find("th .laytable-cell-"+p).find(S);c.layHeader.find("th").find(S).removeAttr("lay-sort"),v.attr("lay-sort",i||null),c.layFixed.find("th")}catch(m){return o.error("Table modules: Did not match to field")}c.sortKey={field:n,sort:i},h.autoSort&&("asc"===i?r=layui.sort(f,n):"desc"===i?r=layui.sort(f,n,!0):(r=layui.sort(f,d.config.indexName),delete c.sortKey)),s[h.response.dataName]=r||f,c.renderData(s,c.page,c.count,!0),l&&layui.event.call(e,u,"sort("+y+")",{field:n,type:i})},F.prototype.loading=function(e){var i=this,a=i.config;a.loading&&(e?(i.layInit&&i.layInit.remove(),delete i.layInit,i.layBox.find(g).remove()):(i.layInit=t(['
                            ','',"
                            "].join("")),i.layBox.append(i.layInit)))},F.prototype.setCheckData=function(e,t){var i=this,a=i.config,l=d.cache[i.key];l[e]&&l[e].constructor!==Array&&(l[e][a.checkName]=t)},F.prototype.syncCheckAll=function(){var e=this,t=e.config,i=e.layHeader.find('input[name="layTableCheckbox"]'),a=function(i){return e.eachCols(function(e,a){"checkbox"===a.type&&(a[t.checkName]=i)}),i};i[0]&&(d.checkStatus(e.key).isAll?(i[0].checked||(i.prop("checked",!0),e.renderForm("checkbox")),a(!0)):(i[0].checked&&(i.prop("checked",!1),e.renderForm("checkbox")),a(!1)))},F.prototype.getCssRule=function(e,t){var i=this,a=i.elem.find("style")[0],l=a.sheet||a.styleSheet||{},n=l.cssRules||l.rules;layui.each(n,function(i,a){if(a.selectorText===".laytable-cell-"+e)return t(a),!0})},F.prototype.fullSize=function(){var e,t=this,i=t.config,a=i.height;t.fullHeightGap&&(a=H.height()-t.fullHeightGap,a<135&&(a=135),t.elem.css("height",a)),a&&(e=parseFloat(a)-(t.layHeader.outerHeight()||38),i.toolbar&&(e-=t.layTool.outerHeight()||50),i.totalRow&&(e-=t.layTotal.outerHeight()||40),i.page&&(e=e-(t.layPage.outerHeight()||41)-2),t.layMain.css("height",e))},F.prototype.getScrollWidth=function(e){var t=0;return e?t=e.offsetWidth-e.clientWidth:(e=document.createElement("div"),e.style.width="100px",e.style.height="100px",e.style.overflowY="scroll",document.body.appendChild(e),t=e.offsetWidth-e.clientWidth,document.body.removeChild(e)),t},F.prototype.scrollPatch=function(){var e=this,i=e.layMain.children("table"),a=e.layMain.width()-e.layMain.prop("clientWidth"),l=e.layMain.height()-e.layMain.prop("clientHeight"),n=(e.getScrollWidth(e.layMain[0]),i.outerWidth()-e.layMain.width()),o=function(e){if(a&&l){if(e=e.eq(0),!e.find(".layui-table-patch")[0]){var i=t('
                            ');i.find("div").css({width:a}),e.find("tr").append(i)}}else e.find(".layui-table-patch").remove()};o(e.layHeader),o(e.layTotal);var r=e.layMain.height(),d=r-l;e.layFixed.find(x).css("height",i.height()>=d?d:"auto"),e.layFixRight[n>0?"removeClass":"addClass"](y),e.layFixRight.css("right",a-1)},F.prototype.events=function(){var e,a=this,o=a.config,c=t("body"),s={},h=a.layHeader.find("th"),f=".layui-table-cell",p=o.elem.attr("lay-filter");a.layTool.on("click","*[lay-event]",function(e){var i=t(this),c=i.attr("lay-event"),s=function(e){var l=t(e.list),n=t('
                              ');n.html(l),o.height&&n.css("max-height",o.height-(a.layTool.outerHeight()||50)),i.find(".layui-table-tool-panel")[0]||i.append(n),a.renderForm(),n.on("click",function(e){layui.stope(e)}),e.done&&e.done(n,l)};switch(layui.stope(e),R.trigger("table.tool.panel.remove"),l.close(a.tipsIndex),c){case"LAYTABLE_COLS":s({list:function(){var e=[];return a.eachCols(function(t,i){i.field&&"normal"==i.type&&e.push('
                            • ')}),e.join("")}(),done:function(){n.on("checkbox(LAY_TABLE_TOOL_COLS)",function(e){var i=t(e.elem),l=this.checked,n=i.data("key"),r=i.data("parentkey");layui.each(o.cols,function(e,t){layui.each(t,function(t,i){if(e+"-"+t===n){var d=i.hide;i.hide=!l,a.elem.find('*[data-key="'+o.index+"-"+n+'"]')[l?"removeClass":"addClass"](y),d!=i.hide&&a.setParentCol(!l,r),a.resize()}})})})}});break;case"LAYTABLE_EXPORT":r.ie?l.tips("导出功能不支持 IE,请用 Chrome 等高级浏览器导出",this,{tips:3}):s({list:function(){return['
                            • 导出到 Csv 文件
                            • ','
                            • 导出到 Excel 文件
                            • '].join("")}(),done:function(e,i){i.on("click",function(){var e=t(this).data("type");d.exportFile(o.id,null,e)})}});break;case"LAYTABLE_PRINT":var h=window.open("打印窗口","_blank"),f=[""].join(""),v=t(a.layHeader.html());v.append(a.layMain.find("table").html()),v.find("th.layui-table-patch").remove(),v.find(".layui-table-col-special").remove(),h.document.write(f+v.prop("outerHTML")),h.document.close(),h.print(),h.close()}layui.event.call(this,u,"toolbar("+p+")",t.extend({event:c,config:o},{}))}),h.on("mousemove",function(e){var i=t(this),a=i.offset().left,l=e.clientX-a;i.data("unresize")||s.resizeStart||(s.allowResize=i.width()-l<=10,c.css("cursor",s.allowResize?"col-resize":""))}).on("mouseleave",function(){t(this);s.resizeStart||c.css("cursor","")}).on("mousedown",function(e){var i=t(this);if(s.allowResize){var l=i.data("key");e.preventDefault(),s.resizeStart=!0,s.offset=[e.clientX,e.clientY],a.getCssRule(l,function(e){var t=e.style.width||i.outerWidth();s.rule=e,s.ruleWidth=parseFloat(t),s.minWidth=i.data("minwidth")||o.cellMinWidth})}}),R.on("mousemove",function(t){if(s.resizeStart){if(t.preventDefault(),s.rule){var i=s.ruleWidth+t.clientX-s.offset[0];i');return n[0].value=i.data("content")||l.text(),i.find("."+N)[0]||i.append(n),n.focus(),void layui.stope(e)}}).on("mouseenter","td",function(){b.call(this)}).on("mouseleave","td",function(){b.call(this,"hide")});var g="layui-table-grid-down",b=function(e){var i=t(this),a=i.children(f);if(e)i.find(".layui-table-grid-down").remove();else if(a.prop("scrollWidth")>a.outerWidth()){if(a.find("."+g)[0])return;i.append('
                              ')}};a.layBody.on("click","."+g,function(e){var i=t(this),n=i.parent(),d=n.children(f);a.tipsIndex=l.tips(['
                              ',d.html(),"
                              ",''].join(""),d[0],{tips:[3,""],time:-1,anim:-1,maxWidth:r.ios||r.android?300:a.elem.width()/2,isOutAnim:!1,skin:"layui-table-tips",success:function(e,t){e.find(".layui-table-tips-c").on("click",function(){l.close(t)})}}),layui.stope(e)}),a.layBody.on("click","*[lay-event]",function(){var e=t(this),i=e.parents("tr").eq(0).data("index");layui.event.call(this,u,"tool("+p+")",v.call(this,{event:e.attr("lay-event")})),a.setThisRowChecked(i)}),a.layMain.on("scroll",function(){var e=t(this),i=e.scrollLeft(),n=e.scrollTop();a.layHeader.scrollLeft(i),a.layTotal.scrollLeft(i),a.layFixed.find(x).scrollTop(n),l.close(a.tipsIndex)}),R.on("click",function(){R.trigger("table.remove.tool.panel")}),R.on("table.remove.tool.panel",function(){t(".layui-table-tool-panel").remove()}),H.on("resize",function(){a.resize()})},d.init=function(e,i){i=i||{};var a=this,l=t(e?'table[lay-filter="'+e+'"]':h+"[lay-data]"),n="Table element property lay-data configuration item has a syntax error: ";return l.each(function(){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(r){o.error(n+l)}var c=[],s=t.extend({elem:this,cols:[],data:[],skin:a.attr("lay-skin"),size:a.attr("lay-size"),even:"string"==typeof a.attr("lay-even")},d.config,i,l);e&&a.hide(),a.find("thead>tr").each(function(e){s.cols[e]=[],t(this).children().each(function(i){var a=t(this),l=a.attr("lay-data");try{l=new Function("return "+l)()}catch(r){return o.error(n+l)}var d=t.extend({title:a.text(),colspan:a.attr("colspan")||0,rowspan:a.attr("rowspan")||0},l);d.colspan<2&&c.push(d),s.cols[e].push(d)})}),a.find("tbody>tr").each(function(e){var i=t(this),a={};i.children("td").each(function(e,i){var l=t(this),n=l.data("field");if(n)return a[n]=l.html()}),layui.each(c,function(e,t){var l=i.children("td").eq(e);a[t.field]=l.html()}),s.data[e]=a}),d.render(s)}),a},c.that={},c.config={},d.eachCols=function(e,i,a){var l=c.config[e]||{},n=[],o=0;a=t.extend(!0,[],a||l.cols),layui.each(a,function(e,t){layui.each(t,function(t,i){if(i.colGroup){var l=0;o++,i.CHILD_COLS=[],layui.each(a[e+1],function(e,t){t.PARENT_COL_INDEX||l>1&&l==i.colspan||(t.PARENT_COL_INDEX=o,i.CHILD_COLS.push(t),l+=parseInt(t.colspan>1?t.colspan:1))})}i.PARENT_COL_INDEX||n.push(i)})});var r=function(e){layui.each(e||n,function(e,t){return t.CHILD_COLS?r(t.CHILD_COLS):void("function"==typeof i&&i(e,t))})};r()},d.checkStatus=function(e){var t=0,i=0,a=[],l=d.cache[e]||[];return layui.each(l,function(e,l){return l.constructor===Array?void i++:void(l[d.config.checkName]&&(t++,a.push(d.clearCacheKey(l))))}),{data:a,isAll:!!l.length&&t===l.length-i}},d.exportFile=function(e,t,i){t=t||d.clearCacheKey(d.cache[e]),i=i||"csv";var a=c.config[e]||{},l={csv:"text/csv",xls:"application/vnd.ms-excel"}[i],n=document.createElement("a");return r.ie?o.error("IE_NOT_SUPPORT_EXPORTS"):(n.href="data:"+l+";charset=utf-8,\ufeff"+encodeURIComponent(function(){var i=[],a=[];return layui.each(t,function(t,l){var n=[];"object"==typeof e?(layui.each(e,function(e,a){0==t&&i.push(a||"")}),layui.each(d.clearCacheKey(l),function(e,t){n.push(t)})):d.eachCols(e,function(e,a){a.field&&"normal"==a.type&&!a.hide&&(0==t&&i.push(a.title||""),n.push(l[a.field]))}),a.push(n.join(","))}),i.join(",")+"\r\n"+a.join("\r\n")}()),n.download=(a.title||"table_"+(a.index||""))+"."+i,document.body.appendChild(n),n.click(),void document.body.removeChild(n))},d.resize=function(e){if(e){var t=s(e);if(!t)return;c.that[e].resize()}else layui.each(c.that,function(){this.resize()})},d.reload=function(e,i){i=i||{};var a=s(e);if(a)return i.data&&i.data.constructor===Array&&delete a.data,d.render(t.extend(!0,{},a,i))},d.render=function(e){var t=new F(e);return c.call(t)},d.clearCacheKey=function(e){return e=t.extend({},e),delete e[d.config.checkName],delete e[d.config.indexName],e},d.init(),e(u,d)});layui.define("jquery",function(e){"use strict";var i=layui.$,n=(layui.hint(),layui.device(),{config:{},set:function(e){var n=this;return n.config=i.extend({},n.config,e),n},on:function(e,i){return layui.onevent.call(this,t,e,i)}}),t="carousel",a="layui-this",l=">*[carousel-item]>*",o="layui-carousel-left",r="layui-carousel-right",d="layui-carousel-prev",s="layui-carousel-next",u="layui-carousel-arrow",c="layui-carousel-ind",m=function(e){var t=this;t.config=i.extend({},t.config,n.config,e),t.render()};m.prototype.config={width:"600px",height:"280px",full:!1,arrow:"hover",indicator:"inside",autoplay:!0,interval:3e3,anim:"",trigger:"click",index:0},m.prototype.render=function(){var e=this,n=e.config;n.elem=i(n.elem),n.elem[0]&&(e.elemItem=n.elem.find(l),n.index<0&&(n.index=0),n.index>=e.elemItem.length&&(n.index=e.elemItem.length-1),n.interval<800&&(n.interval=800),n.full?n.elem.css({position:"fixed",width:"100%",height:"100%",zIndex:9999}):n.elem.css({width:n.width,height:n.height}),n.elem.attr("lay-anim",n.anim),e.elemItem.eq(n.index).addClass(a),e.elemItem.length<=1||(e.indicator(),e.arrow(),e.autoplay(),e.events()))},m.prototype.reload=function(e){var n=this;clearInterval(n.timer),n.config=i.extend({},n.config,e),n.render()},m.prototype.prevIndex=function(){var e=this,i=e.config,n=i.index-1;return n<0&&(n=e.elemItem.length-1),n},m.prototype.nextIndex=function(){var e=this,i=e.config,n=i.index+1;return n>=e.elemItem.length&&(n=0),n},m.prototype.addIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index+e,n.index>=i.elemItem.length&&(n.index=0)},m.prototype.subIndex=function(e){var i=this,n=i.config;e=e||1,n.index=n.index-e,n.index<0&&(n.index=i.elemItem.length-1)},m.prototype.autoplay=function(){var e=this,i=e.config;i.autoplay&&(e.timer=setInterval(function(){e.slide()},i.interval))},m.prototype.arrow=function(){var e=this,n=e.config,t=i(['",'"].join(""));n.elem.attr("lay-arrow",n.arrow),n.elem.find("."+u)[0]&&n.elem.find("."+u).remove(),n.elem.append(t),t.on("click",function(){var n=i(this),t=n.attr("lay-type");e.slide(t)})},m.prototype.indicator=function(){var e=this,n=e.config,t=e.elemInd=i(['
                                ',function(){var i=[];return layui.each(e.elemItem,function(e){i.push("")}),i.join("")}(),"
                              "].join(""));n.elem.attr("lay-indicator",n.indicator),n.elem.find("."+c)[0]&&n.elem.find("."+c).remove(),n.elem.append(t),"updown"===n.anim&&t.css("margin-top",-(t.height()/2)),t.find("li").on("hover"===n.trigger?"mouseover":n.trigger,function(){var t=i(this),a=t.index();a>n.index?e.slide("add",a-n.index):a",u=1;u<=i.length;u++){var r='
                            • ";i.half&&parseInt(i.value)!==i.value&&u==Math.ceil(i.value)?n=n+'
                            • ":n+=r}n+=""+(i.text?''+i.value+"星":"")+"";var c=i.elem,f=c.next("."+t);f[0]&&f.remove(),e.elemTemp=a(n),i.span=e.elemTemp.next("span"),i.setText&&i.setText(i.value),c.html(e.elemTemp),c.addClass("layui-inline"),i.readonly||e.action()},v.prototype.setvalue=function(e){var a=this,i=a.config;i.value=e,a.render()},v.prototype.action=function(){var e=this,i=e.config,l=e.elemTemp,n=l.find("i").width();l.children("li").each(function(e){var t=e+1,v=a(this);v.on("click",function(e){if(i.value=t,i.half){var o=e.pageX-a(this).offset().left;o<=n/2&&(i.value=i.value-.5)}i.text&&l.next("span").text(i.value+"星"),i.choose&&i.choose(i.value),i.setText&&i.setText(i.value)}),v.on("mousemove",function(e){if(l.find("i").each(function(){a(this).addClass(o).removeClass(r)}),l.find("i:lt("+t+")").each(function(){a(this).addClass(s).removeClass(f)}),i.half){var c=e.pageX-a(this).offset().left;c<=n/2&&v.children("i").addClass(u).removeClass(s)}}),v.on("mouseleave",function(){l.find("i").each(function(){a(this).addClass(o).removeClass(r)}),l.find("i:lt("+Math.floor(i.value)+")").each(function(){a(this).addClass(s).removeClass(f)}),i.half&&parseInt(i.value)!==i.value&&l.children("li:eq("+Math.floor(i.value)+")").children("i").addClass(u).removeClass(c)})})},v.prototype.events=function(){var e=this;e.config},i.render=function(e){var a=new v(e);return l.call(a)},e(n,i)});layui.define("jquery",function(t){"use strict";var e=layui.$,i={fixbar:function(t){var i,a,n="layui-fixbar",r="layui-fixbar-top",o=e(document),l=e("body");t=e.extend({showHeight:200},t),t.bar1=t.bar1===!0?"":t.bar1,t.bar2=t.bar2===!0?"":t.bar2,t.bgcolor=t.bgcolor?"background-color:"+t.bgcolor:"";var c=[t.bar1,t.bar2,""],g=e(['
                                ',t.bar1?'
                              • '+c[0]+"
                              • ":"",t.bar2?'
                              • '+c[1]+"
                              • ":"",'
                              • '+c[2]+"
                              • ","
                              "].join("")),s=g.find("."+r),u=function(){var e=o.scrollTop();e>=t.showHeight?i||(s.show(),i=1):i&&(s.hide(),i=0)};e("."+n)[0]||("object"==typeof t.css&&g.css(t.css),l.append(g),u(),g.find("li").on("click",function(){var i=e(this),a=i.attr("lay-type");"top"===a&&e("html,body").animate({scrollTop:0},200),t.click&&t.click.call(this,a)}),o.on("scroll",function(){clearTimeout(a),a=setTimeout(function(){u()},100)}))},countdown:function(t,e,i){var a=this,n="function"==typeof e,r=new Date(t).getTime(),o=new Date(!e||n?(new Date).getTime():e).getTime(),l=r-o,c=[Math.floor(l/864e5),Math.floor(l/36e5)%24,Math.floor(l/6e4)%60,Math.floor(l/1e3)%60];n&&(i=e);var g=setTimeout(function(){a.countdown(t,o+1e3,i)},1e3);return i&&i(l>0?c:[0,0,0,0],e,g),l<=0&&clearTimeout(g),g},timeAgo:function(t,e){var i=this,a=[[],[]],n=(new Date).getTime()-new Date(t).getTime();return n>6912e5?(n=new Date(t),a[0][0]=i.digit(n.getFullYear(),4),a[0][1]=i.digit(n.getMonth()+1),a[0][2]=i.digit(n.getDate()),e||(a[1][0]=i.digit(n.getHours()),a[1][1]=i.digit(n.getMinutes()),a[1][2]=i.digit(n.getSeconds())),a[0].join("-")+" "+a[1].join(":")):n>=864e5?(n/1e3/60/60/24|0)+"天前":n>=36e5?(n/1e3/60/60|0)+"小时前":n>=12e4?(n/1e3/60|0)+"分钟前":n<0?"未来":"刚刚"},digit:function(t,e){var i="";t=String(t),e=e||2;for(var a=t.length;a/g,">").replace(/'/g,"'").replace(/"/g,""")}};!function(t,e,i){"$:nomunge";function a(){n=e[l](function(){r.each(function(){var e=t(this),i=e.width(),a=e.height(),n=t.data(this,g);(i!==n.w||a!==n.h)&&e.trigger(c,[n.w=i,n.h=a])}),a()},o[s])}var n,r=t([]),o=t.resize=t.extend(t.resize,{}),l="setTimeout",c="resize",g=c+"-special-event",s="delay",u="throttleWindow";o[s]=250,o[u]=!0,t.event.special[c]={setup:function(){if(!o[u]&&this[l])return!1;var e=t(this);r=r.add(e),t.data(this,g,{w:e.width(),h:e.height()}),1===r.length&&a()},teardown:function(){if(!o[u]&&this[l])return!1;var e=t(this);r=r.not(e),e.removeData(g),r.length||clearTimeout(n)},add:function(e){function a(e,a,r){var o=t(this),l=t.data(this,g)||{};l.w=a!==i?a:o.width(),l.h=r!==i?r:o.height(),n.apply(this,arguments)}if(!o[u]&&this[l])return!1;var n;return t.isFunction(e)?(n=e,a):(n=e.handler,void(e.handler=a))}}}(e,window),t("util",i)});layui.define("jquery",function(e){"use strict";var l=layui.$,o=function(e){},t='';o.prototype.load=function(e){var o,i,n,r,a=this,c=0;e=e||{};var f=l(e.elem);if(f[0]){var m=l(e.scrollElem||document),u=e.mb||50,s=!("isAuto"in e)||e.isAuto,v=e.end||"没有更多了",y=e.scrollElem&&e.scrollElem!==document,d="加载更多",h=l('");f.find(".layui-flow-more")[0]||f.append(h);var p=function(e,t){e=l(e),h.before(e),t=0==t||null,t?h.html(v):h.find("a").html(d),i=t,o=null,n&&n()},g=function(){o=!0,h.find("a").html(t),"function"==typeof e.done&&e.done(++c,p)};if(g(),h.find("a").on("click",function(){l(this);i||o||g()}),e.isLazyimg)var n=a.lazyimg({elem:e.elem+" img",scrollElem:e.scrollElem});return s?(m.on("scroll",function(){var e=l(this),t=e.scrollTop();r&&clearTimeout(r),i||(r=setTimeout(function(){var i=y?e.height():l(window).height(),n=y?e.prop("scrollHeight"):document.documentElement.scrollHeight;n-t-i<=u&&(o||g())},100))}),a):a}},o.prototype.lazyimg=function(e){var o,t=this,i=0;e=e||{};var n=l(e.scrollElem||document),r=e.elem||"img",a=e.scrollElem&&e.scrollElem!==document,c=function(e,l){var o=n.scrollTop(),r=o+l,c=a?function(){return e.offset().top-n.offset().top+o}():e.offset().top;if(c>=o&&c<=r&&!e.attr("src")){var m=e.attr("lay-src");layui.img(m,function(){var l=t.lazyimg.elem.eq(i);e.attr("src",m).removeAttr("lay-src"),l[0]&&f(l),i++})}},f=function(e,o){var f=a?(o||n).height():l(window).height(),m=n.scrollTop(),u=m+f;if(t.lazyimg.elem=l(r),e)c(e,f);else for(var s=0;su)break}};if(f(),!o){var m;n.on("scroll",function(){var e=l(this);m&&clearTimeout(m),m=setTimeout(function(){f(null,e)},50)}),o=!0}return f},e("flow",new o)});layui.define(["layer","form"],function(t){"use strict";var e=layui.$,i=layui.layer,a=layui.form,l=(layui.hint(),layui.device()),n="layedit",o="layui-show",r="layui-disabled",c=function(){var t=this;t.index=0,t.config={tool:["strong","italic","underline","del","|","left","center","right","|","link","unlink","face","image"],hideTool:[],height:280}};c.prototype.set=function(t){var i=this;return e.extend(!0,i.config,t),i},c.prototype.on=function(t,e){return layui.onevent(n,t,e)},c.prototype.build=function(t,i){i=i||{};var a=this,n=a.config,r="layui-layedit",c=e("string"==typeof t?"#"+t:t),u="LAY_layedit_"+ ++a.index,d=c.next("."+r),y=e.extend({},n,i),f=function(){var t=[],e={};return layui.each(y.hideTool,function(t,i){e[i]=!0}),layui.each(y.tool,function(i,a){C[a]&&!e[a]&&t.push(C[a])}),t.join("")}(),m=e(['
                              ','
                              '+f+"
                              ",'
                              ','',"
                              ","
                              "].join(""));return l.ie&&l.ie<8?c.removeClass("layui-hide").addClass(o):(d[0]&&d.remove(),s.call(a,m,c[0],y),c.addClass("layui-hide").after(m),a.index)},c.prototype.getContent=function(t){var e=u(t);if(e[0])return d(e[0].document.body.innerHTML)},c.prototype.getText=function(t){var i=u(t);if(i[0])return e(i[0].document.body).text()},c.prototype.setContent=function(t,i,a){var l=u(t);l[0]&&(a?e(l[0].document.body).append(i):e(l[0].document.body).html(i),layedit.sync(t))},c.prototype.sync=function(t){var i=u(t);if(i[0]){var a=e("#"+i[1].attr("textarea"));a.val(d(i[0].document.body.innerHTML))}},c.prototype.getSelection=function(t){var e=u(t);if(e[0]){var i=m(e[0].document);return document.selection?i.text:i.toString()}};var s=function(t,i,a){var l=this,n=t.find("iframe");n.css({height:a.height}).on("load",function(){var o=n.contents(),r=n.prop("contentWindow"),c=o.find("head"),s=e([""].join("")),u=o.find("body");c.append(s),u.attr("contenteditable","true").css({"min-height":a.height}).html(i.value||""),y.apply(l,[r,n,i,a]),g.call(l,r,t,a)})},u=function(t){var i=e("#LAY_layedit_"+t),a=i.prop("contentWindow");return[a,i]},d=function(t){return 8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),t},y=function(t,a,n,o){var r=t.document,c=e(r.body);c.on("keydown",function(t){var e=t.keyCode;if(13===e){var a=m(r),l=p(a),n=l.parentNode;if("pre"===n.tagName.toLowerCase()){if(t.shiftKey)return;return i.msg("请暂时用shift+enter"),!1}r.execCommand("formatBlock",!1,"

                              ")}}),e(n).parents("form").on("submit",function(){var t=c.html();8==l.ie&&(t=t.replace(/<.+>/g,function(t){return t.toLowerCase()})),n.value=t}),c.on("paste",function(e){r.execCommand("formatBlock",!1,"

                              "),setTimeout(function(){f.call(t,c),n.value=c.html()},100)})},f=function(t){var i=this;i.document;t.find("*[style]").each(function(){var t=this.style.textAlign;this.removeAttribute("style"),e(this).css({"text-align":t||""})}),t.find("table").addClass("layui-table"),t.find("script,link").remove()},m=function(t){return t.selection?t.selection.createRange():t.getSelection().getRangeAt(0)},p=function(t){return t.endContainer||t.parentElement().childNodes[0]},v=function(t,i,a){var l=this.document,n=document.createElement(t);for(var o in i)n.setAttribute(o,i[o]);if(n.removeAttribute("text"),l.selection){var r=a.text||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.pasteHTML(e(n).prop("outerHTML")),a.select()}else{var r=a.toString()||i.text;if("a"===t&&!r)return;r&&(n.innerHTML=r),a.deleteContents(),a.insertNode(n)}},h=function(t,i){var a=this.document,l="layedit-tool-active",n=p(m(a)),o=function(e){return t.find(".layedit-tool-"+e)};i&&i[i.hasClass(l)?"removeClass":"addClass"](l),t.find(">i").removeClass(l),o("unlink").addClass(r),e(n).parents().each(function(){var t=this.tagName.toLowerCase(),e=this.style.textAlign;"b"!==t&&"strong"!==t||o("b").addClass(l),"i"!==t&&"em"!==t||o("i").addClass(l),"u"===t&&o("u").addClass(l),"strike"===t&&o("d").addClass(l),"p"===t&&("center"===e?o("center").addClass(l):"right"===e?o("right").addClass(l):o("left").addClass(l)),"a"===t&&(o("link").addClass(l),o("unlink").removeClass(r))})},g=function(t,a,l){var n=t.document,o=e(n.body),c={link:function(i){var a=p(i),l=e(a).parent();b.call(o,{href:l.attr("href"),target:l.attr("target")},function(e){var a=l[0];"A"===a.tagName?a.href=e.url:v.call(t,"a",{target:e.target,href:e.url,text:e.url},i)})},unlink:function(t){n.execCommand("unlink")},face:function(e){x.call(this,function(i){v.call(t,"img",{src:i.src,alt:i.alt},e)})},image:function(a){var n=this;layui.use("upload",function(o){var r=l.uploadImage||{};o.render({url:r.url,method:r.type,elem:e(n).find("input")[0],done:function(e){0==e.code?(e.data=e.data||{},v.call(t,"img",{src:e.data.src,alt:e.data.title},a)):i.msg(e.msg||"上传失败")}})})},code:function(e){k.call(o,function(i){v.call(t,"pre",{text:i.code,"lay-lang":i.lang},e)})},help:function(){i.open({type:2,title:"帮助",area:["600px","380px"],shadeClose:!0,shade:.1,skin:"layui-layer-msg",content:["http://www.layui.com/about/layedit/help.html","no"]})}},s=a.find(".layui-layedit-tool"),u=function(){var i=e(this),a=i.attr("layedit-event"),l=i.attr("lay-command");if(!i.hasClass(r)){o.focus();var u=m(n);u.commonAncestorContainer;l?(n.execCommand(l),/justifyLeft|justifyCenter|justifyRight/.test(l)&&n.execCommand("formatBlock",!1,"

                              "),setTimeout(function(){o.focus()},10)):c[a]&&c[a].call(this,u),h.call(t,s,i)}},d=/image/;s.find(">i").on("mousedown",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)||u.call(this)}).on("click",function(){var t=e(this),i=t.attr("layedit-event");d.test(i)&&u.call(this)}),o.on("click",function(){h.call(t,s),i.close(x.index)})},b=function(t,e){var l=this,n=i.open({type:1,id:"LAY_layedit_link",area:"350px",shade:.05,shadeClose:!0,moveType:1,title:"超链接",skin:"layui-layer-msg",content:['

                                ','
                              • ','','
                                ','',"
                                ","
                              • ",'
                              • ','','
                                ','",'","
                                ","
                              • ",'
                              • ','','',"
                              • ","
                              "].join(""),success:function(t,n){var o="submit(layedit-link-yes)";a.render("radio"),t.find(".layui-btn-primary").on("click",function(){i.close(n),l.focus()}),a.on(o,function(t){i.close(b.index),e&&e(t.field)})}});b.index=n},x=function(t){var a=function(){var t=["[微笑]","[嘻嘻]","[哈哈]","[可爱]","[可怜]","[挖鼻]","[吃惊]","[害羞]","[挤眼]","[闭嘴]","[鄙视]","[爱你]","[泪]","[偷笑]","[亲亲]","[生病]","[太开心]","[白眼]","[右哼哼]","[左哼哼]","[嘘]","[衰]","[委屈]","[吐]","[哈欠]","[抱抱]","[怒]","[疑问]","[馋嘴]","[拜拜]","[思考]","[汗]","[困]","[睡]","[钱]","[失望]","[酷]","[色]","[哼]","[鼓掌]","[晕]","[悲伤]","[抓狂]","[黑线]","[阴险]","[怒骂]","[互粉]","[心]","[伤心]","[猪头]","[熊猫]","[兔子]","[ok]","[耶]","[good]","[NO]","[赞]","[来]","[弱]","[草泥马]","[神马]","[囧]","[浮云]","[给力]","[围观]","[威武]","[奥特曼]","[礼物]","[钟]","[话筒]","[蜡烛]","[蛋糕]"],e={};return layui.each(t,function(t,i){e[i]=layui.cache.dir+"images/face/"+t+".gif"}),e}();return x.hide=x.hide||function(t){"face"!==e(t.target).attr("layedit-event")&&i.close(x.index)},x.index=i.tips(function(){var t=[];return layui.each(a,function(e,i){t.push('
                            • '+e+'
                            • ')}),'
                                '+t.join("")+"
                              "}(),this,{tips:1,time:0,skin:"layui-box layui-util-face",maxWidth:500,success:function(l,n){l.css({marginTop:-4,marginLeft:-10}).find(".layui-clear>li").on("click",function(){t&&t({src:a[this.title],alt:this.title}),i.close(n)}),e(document).off("click",x.hide).on("click",x.hide)}})},k=function(t){var e=this,l=i.open({type:1,id:"LAY_layedit_code",area:"550px",shade:.05,shadeClose:!0,moveType:1,title:"插入代码",skin:"layui-layer-msg",content:['
                                ','
                              • ','','
                                ','","
                                ","
                              • ",'
                              • ','','
                                ','',"
                                ","
                              • ",'
                              • ','','',"
                              • ","
                              "].join(""),success:function(l,n){var o="submit(layedit-code-yes)";a.render("select"),l.find(".layui-btn-primary").on("click",function(){i.close(n),e.focus()}),a.on(o,function(e){i.close(k.index),t&&t(e.field)})}});k.index=l},C={html:'',strong:'',italic:'',underline:'',del:'',"|":'',left:'',center:'',right:'',link:'',unlink:'',face:'',image:'',code:'',help:''},w=new c;t(n,w)});layui.define("jquery",function(e){"use strict";var a=layui.$,l="http://www.layui.com/doc/modules/code.html";e("code",function(e){var t=[];e=e||{},e.elem=a(e.elem||".layui-code"),e.about=!("about"in e)||e.about,e.elem.each(function(){t.push(this)}),layui.each(t.reverse(),function(t,i){var c=a(i),o=c.html();(c.attr("lay-encode")||e.encode)&&(o=o.replace(/&(?!#?[a-zA-Z0-9]+;)/g,"&").replace(//g,">").replace(/'/g,"'").replace(/"/g,""")),c.html('
                              1. '+o.replace(/[\r\t\n]+/g,"
                              2. ")+"
                              "),c.find(">.layui-code-h3")[0]||c.prepend('

                              '+(c.attr("lay-title")||e.title||"code")+(e.about?'layui.code':"")+"

                              ");var d=c.find(">.layui-code-ol");c.addClass("layui-box layui-code-view"),(c.attr("lay-skin")||e.skin)&&c.addClass("layui-code-"+(c.attr("lay-skin")||e.skin)),(d.find("li").length/100|0)>0&&d.css("margin-left",(d.find("li").length/100|0)+"px"),(c.attr("lay-height")||e.height)&&d.css("max-height",c.attr("lay-height")||e.height)})})}).addcss("modules/code.css","skincodecss"); \ No newline at end of file diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/layui/layui.js b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/layui/layui.js new file mode 100644 index 0000000..3cd51c2 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/layui/layui.js @@ -0,0 +1,2 @@ +/** layui-v2.4.5 MIT License By https://www.layui.com */ + ;!function(e){"use strict";var t=document,o={modules:{},status:{},timeout:10,event:{}},n=function(){this.v="2.4.5"},r=function(){var e=t.currentScript?t.currentScript.src:function(){for(var e,o=t.scripts,n=o.length-1,r=n;r>0;r--)if("interactive"===o[r].readyState){e=o[r].src;break}return e||o[n].src}();return e.substring(0,e.lastIndexOf("/")+1)}(),i=function(t){e.console&&console.error&&console.error("Layui hint: "+t)},a="undefined"!=typeof opera&&"[object Opera]"===opera.toString(),u={layer:"modules/layer",laydate:"modules/laydate",laypage:"modules/laypage",laytpl:"modules/laytpl",layim:"modules/layim",layedit:"modules/layedit",form:"modules/form",upload:"modules/upload",tree:"modules/tree",table:"modules/table",element:"modules/element",rate:"modules/rate",colorpicker:"modules/colorpicker",slider:"modules/slider",carousel:"modules/carousel",flow:"modules/flow",util:"modules/util",code:"modules/code",jquery:"modules/jquery",mobile:"modules/mobile","layui.all":"../layui.all"};n.prototype.cache=o,n.prototype.define=function(e,t){var n=this,r="function"==typeof e,i=function(){var e=function(e,t){layui[e]=t,o.status[e]=!0};return"function"==typeof t&&t(function(n,r){e(n,r),o.callback[n]=function(){t(e)}}),this};return r&&(t=e,e=[]),layui["layui.all"]||!layui["layui.all"]&&layui["layui.mobile"]?i.call(n):(n.use(e,i),n)},n.prototype.use=function(e,n,l){function s(e,t){var n="PLaySTATION 3"===navigator.platform?/^complete$/:/^(complete|loaded)$/;("load"===e.type||n.test((e.currentTarget||e.srcElement).readyState))&&(o.modules[f]=t,d.removeChild(v),function r(){return++m>1e3*o.timeout/4?i(f+" is not a valid module"):void(o.status[f]?c():setTimeout(r,4))}())}function c(){l.push(layui[f]),e.length>1?y.use(e.slice(1),n,l):"function"==typeof n&&n.apply(layui,l)}var y=this,p=o.dir=o.dir?o.dir:r,d=t.getElementsByTagName("head")[0];e="string"==typeof e?[e]:e,window.jQuery&&jQuery.fn.on&&(y.each(e,function(t,o){"jquery"===o&&e.splice(t,1)}),layui.jquery=layui.$=jQuery);var f=e[0],m=0;if(l=l||[],o.host=o.host||(p.match(/\/\/([\s\S]+?)\//)||["//"+location.host+"/"])[0],0===e.length||layui["layui.all"]&&u[f]||!layui["layui.all"]&&layui["layui.mobile"]&&u[f])return c(),y;if(o.modules[f])!function g(){return++m>1e3*o.timeout/4?i(f+" is not a valid module"):void("string"==typeof o.modules[f]&&o.status[f]?c():setTimeout(g,4))}();else{var v=t.createElement("script"),h=(u[f]?p+"lay/":/^\{\/\}/.test(y.modules[f])?"":o.base||"")+(y.modules[f]||f)+".js";h=h.replace(/^\{\/\}/,""),v.async=!0,v.charset="utf-8",v.src=h+function(){var e=o.version===!0?o.v||(new Date).getTime():o.version||"";return e?"?v="+e:""}(),d.appendChild(v),!v.attachEvent||v.attachEvent.toString&&v.attachEvent.toString().indexOf("[native code")<0||a?v.addEventListener("load",function(e){s(e,h)},!1):v.attachEvent("onreadystatechange",function(e){s(e,h)}),o.modules[f]=h}return y},n.prototype.getStyle=function(t,o){var n=t.currentStyle?t.currentStyle:e.getComputedStyle(t,null);return n[n.getPropertyValue?"getPropertyValue":"getAttribute"](o)},n.prototype.link=function(e,n,r){var a=this,u=t.createElement("link"),l=t.getElementsByTagName("head")[0];"string"==typeof n&&(r=n);var s=(r||e).replace(/\.|\//g,""),c=u.id="layuicss-"+s,y=0;return u.rel="stylesheet",u.href=e+(o.debug?"?v="+(new Date).getTime():""),u.media="all",t.getElementById(c)||l.appendChild(u),"function"!=typeof n?a:(function p(){return++y>1e3*o.timeout/100?i(e+" timeout"):void(1989===parseInt(a.getStyle(t.getElementById(c),"width"))?function(){n()}():setTimeout(p,100))}(),a)},o.callback={},n.prototype.factory=function(e){if(layui[e])return"function"==typeof o.callback[e]?o.callback[e]:null},n.prototype.addcss=function(e,t,n){return layui.link(o.dir+"css/"+e,t,n)},n.prototype.img=function(e,t,o){var n=new Image;return n.src=e,n.complete?t(n):(n.onload=function(){n.onload=null,"function"==typeof t&&t(n)},void(n.onerror=function(e){n.onerror=null,"function"==typeof o&&o(e)}))},n.prototype.config=function(e){e=e||{};for(var t in e)o[t]=e[t];return this},n.prototype.modules=function(){var e={};for(var t in u)e[t]=u[t];return e}(),n.prototype.extend=function(e){var t=this;e=e||{};for(var o in e)t[o]||t.modules[o]?i("模块名 "+o+" 已被占用"):t.modules[o]=e[o];return t},n.prototype.router=function(e){var t=this,e=e||location.hash,o={path:[],search:{},hash:(e.match(/[^#](#.*$)/)||[])[1]||""};return/^#\//.test(e)?(e=e.replace(/^#\//,""),o.href="/"+e,e=e.replace(/([^#])(#.*$)/,"$1").split("/")||[],t.each(e,function(e,t){/^\w+=/.test(t)?function(){t=t.split("="),o.search[t[0]]=t[1]}():o.path.push(t)}),o):o},n.prototype.data=function(t,o,n){if(t=t||"layui",n=n||localStorage,e.JSON&&e.JSON.parse){if(null===o)return delete n[t];o="object"==typeof o?o:{key:o};try{var r=JSON.parse(n[t])}catch(i){var r={}}return"value"in o&&(r[o.key]=o.value),o.remove&&delete r[o.key],n[t]=JSON.stringify(r),o.key?r[o.key]:r}},n.prototype.sessionData=function(e,t){return this.data(e,t,sessionStorage)},n.prototype.device=function(t){var o=navigator.userAgent.toLowerCase(),n=function(e){var t=new RegExp(e+"/([^\\s\\_\\-]+)");return e=(o.match(t)||[])[1],e||!1},r={os:function(){return/windows/.test(o)?"windows":/linux/.test(o)?"linux":/iphone|ipod|ipad|ios/.test(o)?"ios":/mac/.test(o)?"mac":void 0}(),ie:function(){return!!(e.ActiveXObject||"ActiveXObject"in e)&&((o.match(/msie\s(\d+)/)||[])[1]||"11")}(),weixin:n("micromessenger")};return t&&!r[t]&&(r[t]=n(t)),r.android=/android/.test(o),r.ios="ios"===r.os,r},n.prototype.hint=function(){return{error:i}},n.prototype.each=function(e,t){var o,n=this;if("function"!=typeof t)return n;if(e=e||[],e.constructor===Object){for(o in e)if(t.call(e[o],o,e[o]))break}else for(o=0;oi?1:r/g, ">").replace(/"/g, """).replace(/'/g, "'")+'"') + +lay\modules\layedit.js +2018-9-6 +95行 //fix by www.magicalcoder.com 我希望能根据textarea disabled属性 + u.attr("contenteditable", (i.disabled+''=='true' || i.disabled+''=='disabled' ) ? 'false' : "true").css({ + // u.attr("contenteditable", "true").css({ + "min-height": a.height + }).html(i.value || ""), diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/awesomeStyle/awesome.css b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/awesomeStyle/awesome.css new file mode 100644 index 0000000..c1fcf3a --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/awesomeStyle/awesome.css @@ -0,0 +1,386 @@ +/*------------------------------------- +zTree Style using fontawesome instead of images + +version: 1.1 +author: Mike King +email: mikkelking @ hotmail . com +website: http://code.google.com/p/jquerytree/ + +-------------------------------------*/ +/* Definitions ----------------------*/ +/* End of Definitions ---------------*/ +/* Imports -------------------------*/ +/* End of Imports ------------------*/ +.ztree * { + padding: 0; + margin: 0; + font-size: 12px; + font-family: Verdana, Arial, Helvetica, AppleGothic, sans-serif; + background-color: #af0000; +} +.ztree { + margin: 0; + padding: 5px; + color: #ffffff; + background-color: #af0000; +} +.ztree li { + padding: 0; + margin: 0; + list-style: none; + line-height: 17px; + text-align: left; + white-space: nowrap; + outline: 0; +} +.ztree li ul { + margin: 0px; + padding: 0 0 0 18px; +} +.ztree li a { + padding-right: 3px; + margin: 0; + cursor: pointer; + height: 17px; + color: #ffffff; + background-color: transparent; + text-decoration: none; + vertical-align: top; + display: inline-block; +} +.ztree li a input.rename { + height: 14px; + width: 80px; + padding: 0; + margin: 0; + color: #af0000; + background-color: #ffffff; + font-size: 12px; + border: 1px #585956 solid; + *border: 0px; +} +.ztree li a:hover { + text-decoration: underline; +} +.ztree li a.curSelectedNode { + padding-top: 0px; + background-color: #af4040; + color: #ffff00; + height: 17px; + opacity: 0.8; +} +.ztree li a.curSelectedNode_Edit { + padding-top: 0px; + background-color: transparent; + color: #ffff00; + height: 17px; + border: 1px #666 solid; + opacity: 0.8; +} +.ztree li a.tmpTargetNode_inner { + padding-top: 0px; + background-color: #aaa; + color: #ffff00; + height: 17px; + border: 1px #666 solid; + opacity: 0.8; + filter: alpha(opacity=80); +} +.ztree li span { + line-height: 17px; + margin-right: 2px; + background-color: transparent; +} +.ztree li span.button { + line-height: 0; + margin: 0; + padding: 0; + width: 15px; + height: 17px; + display: inline-block; + vertical-align: top; + border: 0px solid; + cursor: pointer; + outline: none; + background-color: transparent; + background-repeat: no-repeat; + background-attachment: scroll; +} +.ztree li span.button::before { + color: #ffffff; + font-family: FontAwesome; + padding-top: 10px; +} +.ztree li span.button.chk { + margin: 0px; + cursor: auto; + width: 12px; + display: inline-block; + padding-top: 10px; + padding-left: 2px; +} +.ztree li span.button.chk.checkbox_false_full::before { + content: "\f096"; +} +.ztree li span.button.chk.checkbox_false_full_focus::before { + content: "\f096"; + color: #ffff00; +} +.ztree li span.button.chk.checkbox_false_part::before { + content: "\f096"; + color: #aaaaaa; +} +.ztree li span.button.chk.checkbox_false_part_focus::before { + content: "\f096"; + color: #cad96c; +} +.ztree li span.button.chk.checkbox_false_disable::before { + content: "\f096"; + color: #808080; +} +.ztree li span.button.chk.checkbox_true_full::before { + content: "\f046"; +} +.ztree li span.button.chk.checkbox_true_full_focus::before { + content: "\f046"; +} +.ztree li span.button.chk.checkbox_true_part::before { + content: "\f14a"; +} +.ztree li span.button.chk.checkbox_true_part_focus::before { + content: "\f14a"; + color: #ffff00; +} +.ztree li span.button.chk.checkbox_true_full_focus::before { + content: "\f046"; + color: #ffff00; +} +.ztree li span.button.chk.checkbox_true_part::before { + content: "\f046"; + color: #aaaaaa; +} +.ztree li span.button.chk.checkbox_true_part_focus::before { + content: "\f046"; + color: #cad96c; +} +.ztree li span.button.chk.checkbox_true_disable::before { + content: "\f046"; + color: #808080; +} +.ztree li span.button.chk.radio_false_full::before { + content: "\f10c"; +} +.ztree li span.button.chk.radio_false_full_focus::before { + content: "\f10c"; + color: #ffff00; +} +.ztree li span.button.chk.radio_false_part::before { + content: "\f10c"; + color: #aaaaaa; +} +.ztree li span.button.chk.radio_false_part_focus::before { + content: "\f10c"; + color: #ffff00; +} +.ztree li span.button.chk.radio_false_disable::before { + content: "\f1db"; + color: #808080; +} +.ztree li span.button.chk.radio_true_full::before { + content: "\f192"; +} +.ztree li span.button.chk.radio_true_full_focus::before { + content: "\f192"; + color: #ffff00; +} +.ztree li span.button.chk.radio_true_part::before { + content: "\f192"; + color: #aaaaaa; +} +.ztree li span.button.chk.radio_true_part_focus::before { + content: "\f192"; + color: #aaaaaa; +} +.ztree li span.button.chk.radio_true_disable::before { + content: "\f1db"; + color: #808080; +} +.ztree li span.button.switch { + width: 15px; + height: 17px; +} +.ztree li span.button.root_open::before { + content: "\f078"; + padding-top: 10px; + padding-left: 2px; + display: inline-block; +} +.ztree li span.button.root_close::before { + content: "\f115"; + padding-top: 10px; + padding-left: 2px; + display: inline-block; +} +.ztree li span.button.roots_open::before { + content: "\f078"; + padding-top: 10px; + padding-left: 2px; + display: inline-block; +} +.ztree li span.button.roots_close::before { + content: "\f054"; + padding-top: 10px; + padding-left: 2px; + display: inline-block; +} +.ztree li span.button.center_open::before { + content: "\f078"; + padding-top: 10px; + padding-left: 2px; + display: inline-block; +} +.ztree li span.button.center_close::before { + content: "\f054"; + padding-top: 10px; + padding-left: 2px; + display: inline-block; +} +.ztree li span.button.bottom_open::before { + content: "\f078"; + padding-top: 10px; + padding-left: 2px; + display: inline-block; +} +.ztree li span.button.bottom_close::before { + content: "\f054"; + padding-top: 10px; + padding-left: 2px; + display: inline-block; +} +.ztree li span.button.root_docu { + background: none; +} +.ztree li span.button.roots_docu::before { + content: "\f022"; + padding-left: 2px; + display: inline-block; + color: #ffffff; +} +.ztree li span.button.center_docu::before { + padding-top: 10px; + padding-left: 2px; + display: inline-block; + color: #ffffff; +} +.ztree li span.button.bottom_docu::before { + padding-top: 10px; + padding-left: 2px; + display: inline-block; + color: #ffffff; +} +.ztree li span.button.noline_docu { + background: none; +} +.ztree li span.button.ico_open::before { + content: "\f115"; + font-family: FontAwesome; + padding-top: 10px; + padding-left: 2px; + display: inline-block; + color: #ffffff; +} +.ztree li span.button.ico_close::before { + content: "\f114"; + font-family: FontAwesome; + padding-top: 10px; + padding-left: 2px; + display: inline-block; + color: #ffffff; +} +.ztree li span.button.ico_docu::before { + content: "\f022"; + font-family: FontAwesome; + padding-top: 10px; + padding-left: 2px; + display: inline-block; + color: #ffffff; +} +.ztree li span.button.edit { + margin-left: 4px; + margin-right: -1px; + vertical-align: top; + *vertical-align: middle; + padding-top: 10px; +} +.ztree li span.button.edit::before { + content: "\f044"; + font-family: FontAwesome; +} +.ztree li span.button.remove { + margin-left: 4px; + margin-right: -1px; + vertical-align: top; + *vertical-align: middle; + padding-top: 10px; +} +.ztree li span.button.remove::before { + content: "\f1f8"; + font-family: FontAwesome; +} +.ztree li span.button.add { + margin-left: 4px; + margin-right: -1px; + vertical-align: top; + *vertical-align: middle; + padding-top: 10px; +} +.ztree li span.button.add::before { + content: "\f067"; + font-family: FontAwesome; +} +.ztree li span.button.ico_loading { + margin-right: 2px; + background: url(./img/loading.gif) no-repeat scroll 0 0 transparent; + vertical-align: top; + *vertical-align: middle; +} +ul.tmpTargetzTree { + background-color: #FFE6B0; + opacity: 0.8; + filter: alpha(opacity=80); +} +span.tmpzTreeMove_arrow { + width: 16px; + height: 17px; + display: inline-block; + padding: 0; + margin: 2px 0 0 1px; + border: 0 none; + position: absolute; + background-color: transparent; + background-attachment: scroll; +} +span.tmpzTreeMove_arrow::before { + content: "\f04b"; + font-family: FontAwesome; + color: #ffff00; +} +ul.ztree.zTreeDragUL { + margin: 0; + padding: 0; + position: absolute; + width: auto; + height: auto; + overflow: hidden; + background-color: #cfcfcf; + border: 1px #ffff00 dotted; + opacity: 0.8; + filter: alpha(opacity=80); +} +.ztreeMask { + z-index: 10000; + background-color: #cfcfcf; + opacity: 0.0; + filter: alpha(opacity=0); + position: absolute; +} diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/awesomeStyle/awesome.less b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/awesomeStyle/awesome.less new file mode 100644 index 0000000..b282d81 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/awesomeStyle/awesome.less @@ -0,0 +1,146 @@ +/*------------------------------------- +zTree Style using fontawesome instead of images + +version: 1.1 +author: Mike King +email: mikkelking @ hotmail . com +website: http://code.google.com/p/jquerytree/ + +-------------------------------------*/ + +/* Definitions ----------------------*/ +@font-size: 12px; +// Regular icon and text color is white, which suits any medium -> dark background +@color-normal: white; +// Background color +@color-bg: #af0000; +// Highlight color +@color-highlight: yellow; +// Partially selected (checkboxes, radio buttons) +@color-partial: #aaaaaa; +// Partially selected and focused (checkboxes, radio buttons) +@color-partfocus: #cad96c; +// Disabled altogether +@color-disabled: #808080; +// Editing color +@color-edit: yellow; +@w: 15px; +@h: 17px; +@pad-left: 2px; +@pad-top: 10px; +/* End of Definitions ---------------*/ + +/* Imports -------------------------*/ +@import "fa.less"; +/* End of Imports ------------------*/ + +.ztree * {padding:0; margin:0; font-size:@font-size; font-family: Verdana, Arial, Helvetica, AppleGothic, sans-serif; background-color: @color-bg;} +.ztree { + margin:0; padding:5px; color:@color-normal; background-color: @color-bg; + li { + padding:0; margin:0; list-style:none; line-height:17px; text-align:left; white-space:nowrap; outline:0; + ul { + margin: 0px; padding:0 0 0 18px; + } + ul.line { } + a {padding-right:3px; margin:0; cursor:pointer; height:@h; color:@color-normal; background-color: transparent; + text-decoration:none; vertical-align:top; display: inline-block; + input.rename {height:14px; width:80px; padding:0; margin:0; + color: @color-bg; background-color: @color-normal; + font-size:@font-size; border:1px #585956 solid; *border:0px} + } + a:hover {text-decoration:underline} + a.curSelectedNode {padding-top:0px; background-color:#af4040; color:@color-highlight; height:@h; opacity:0.8;} + a.curSelectedNode_Edit {padding-top:0px; background-color:transparent; color:@color-highlight; height:@h; border:1px #666 solid; opacity:0.8;} + a.tmpTargetNode_inner {padding-top:0px; background-color:#aaa; color:@color-highlight; height:@h; border:1px #666 solid; + opacity:0.8; filter:alpha(opacity=80)} + a.tmpTargetNode_prev {} + a.tmpTargetNode_next {} + span {line-height:@h; margin-right:2px; background-color:transparent;} + span.button {line-height:0; margin:0; padding: 0; width:@w; height:@h; display: inline-block; vertical-align:top; + border:0px solid; cursor: pointer;outline:none; + background-color:transparent; background-repeat:no-repeat; background-attachment: scroll; + + &::before{color: @color-normal; font-family: FontAwesome; padding-top:@pad-top;} + &.chk { margin:0px; cursor: auto; width: 12px; + display: inline-block;padding-top:@pad-top;padding-left:@pad-left; + + &.checkbox_false_full::before {content: @fa-square-o;} + &.checkbox_false_full_focus::before {content: @fa-square-o; color:@color-highlight;} + &.checkbox_false_part::before {content: @fa-square-o;color: @color-partial;} + &.checkbox_false_part_focus::before {content: @fa-square-o; color:@color-partfocus;} + &.checkbox_false_disable::before {content: @fa-square-o; color:@color-disabled;} + &.checkbox_true_full::before {content: @fa-check-square-o;} + &.checkbox_true_full_focus::before {content: @fa-check-square-o;} + &.checkbox_true_part::before {content: @fa-check-square;} + &.checkbox_true_part_focus::before {content: @fa-check-square; color: @color-highlight} + &.checkbox_true_full_focus::before {content: @fa-check-square-o; color: @color-highlight} + &.checkbox_true_part::before {content: @fa-check-square-o;color: @color-partial} + &.checkbox_true_part_focus::before {content: @fa-check-square-o;color: @color-partfocus;} + &.checkbox_true_disable::before {content: @fa-check-square-o;color: @color-disabled} + + &.radio_false_full::before {content: @fa-circle-o;} + &.radio_false_full_focus::before {content: @fa-circle-o;color: @color-highlight} + &.radio_false_part::before {content: @fa-circle-o;color: @color-partial} + &.radio_false_part_focus::before {content: @fa-circle-o;color: @color-highlight} + &.radio_false_disable::before {content: @fa-circle-thin;color: @color-disabled} + &.radio_true_full::before {content: @fa-dot-circle-o;} + &.radio_true_full_focus::before {content: @fa-dot-circle-o;color: @color-highlight} + &.radio_true_part::before {content: @fa-dot-circle-o;color: @color-partial} + &.radio_true_part_focus::before {content: @fa-dot-circle-o;color: @color-partial;} + &.radio_true_disable::before {content: @fa-circle-thin;color: @color-disabled} + + } + &.switch {width:@w; height:@h} + &.root_open::before{content: @fa-chevron-down;padding-top:@pad-top;padding-left:@pad-left;display: inline-block;} + &.root_close::before{content: @fa-folder-open-o;padding-top:@pad-top;padding-left:@pad-left;display: inline-block;} + &.roots_open::before{content: @fa-chevron-down;padding-top:@pad-top;padding-left:@pad-left;display: inline-block;} + &.roots_close::before{content: @fa-chevron-right;padding-top:@pad-top;padding-left:@pad-left;display: inline-block;} + &.center_open::before{content: @fa-chevron-down;padding-top:@pad-top;padding-left:@pad-left;display: inline-block;} + &.center_close::before{content: @fa-chevron-right;padding-top:@pad-top;padding-left:@pad-left;display: inline-block;} + &.bottom_open::before{content: @fa-chevron-down;padding-top:@pad-top;padding-left:@pad-left;display: inline-block;} + &.bottom_close::before{content: @fa-chevron-right;padding-top:@pad-top;padding-left:@pad-left;display: inline-block;} + &.noline_open{} + &.noline_close{} + &.root_docu{ background:none;} + &.roots_docu::before{content: @fa-list-alt;padding-left:@pad-left;display: inline-block;color:@color-normal;} + &.center_docu::before{padding-top:@pad-top;padding-left:@pad-left;display: inline-block;color:@color-normal;} + &.bottom_docu::before{padding-top:@pad-top;padding-left:@pad-left;display: inline-block;color:@color-normal;} + &.noline_docu{ background:none;} + + &.ico_open::before {content: @fa-folder-open-o;font-family: FontAwesome;padding-top:@pad-top;padding-left:@pad-left;display: inline-block;color:@color-normal;} + &.ico_close::before {content: @fa-folder-o;font-family: FontAwesome;padding-top:@pad-top;padding-left:@pad-left;display: inline-block;color:@color-normal;} + &.ico_docu::before{content: @fa-list-alt;font-family: FontAwesome;padding-top:@pad-top;padding-left:@pad-left;display: inline-block;color:@color-normal;} + + &.edit {margin-left:4px; margin-right: -1px; vertical-align:top; *vertical-align:middle;padding-top:@pad-top;} + &.edit::before{content: @fa-pencil-square-o;font-family: FontAwesome;} + + &.remove {margin-left:4px; margin-right: -1px; vertical-align:top; *vertical-align:middle;padding-top:@pad-top;} + &.remove::before{content: @fa-trash;font-family: FontAwesome;} + + + &.add {margin-left:4px; margin-right: -1px; vertical-align:top; *vertical-align:middle;padding-top:@pad-top;} + &.add::before{content: @fa-plus;font-family: FontAwesome;} + + &.ico_loading{margin-right:2px; background:url(./img/loading.gif) no-repeat scroll 0 0 transparent; vertical-align:top; *vertical-align:middle} + } + + } +} + + +ul.tmpTargetzTree {background-color:#FFE6B0; opacity:0.8; filter:alpha(opacity=80)} + +// this is the arrow that moves +span.tmpzTreeMove_arrow{width:16px; height:@h; display: inline-block; + padding:0; margin:2px 0 0 1px; border:0 none; position:absolute; + background-color:transparent; background-attachment: scroll; + } +span.tmpzTreeMove_arrow::before{content: @fa-play;font-family: FontAwesome;color: @color-highlight; + } +// outline + +ul.ztree.zTreeDragUL {margin:0; padding:0; position:absolute; width:auto; height:auto;overflow:hidden; + background-color:#cfcfcf; border:1px @color-highlight dotted; opacity:0.8; filter:alpha(opacity=80)} +.ztreeMask {z-index:10000; background-color:#cfcfcf; opacity:0.0; filter:alpha(opacity=0); position:absolute} + diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/awesomeStyle/fa.less b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/awesomeStyle/fa.less new file mode 100644 index 0000000..3714884 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/awesomeStyle/fa.less @@ -0,0 +1,480 @@ +@fa-glass: "\f000"; +@fa-music: "\f001"; +@fa-search: "\f002"; +@fa-envelope-o: "\f003"; +@fa-heart: "\f004"; +@fa-star: "\f005"; +@fa-star-o: "\f006"; +@fa-user: "\f007"; +@fa-film: "\f008"; +@fa-th-large: "\f009"; +@fa-th: "\f00a"; +@fa-th-list: "\f00b"; +@fa-check: "\f00c"; +@fa-times: "\f00d"; +@fa-search-plus: "\f00e"; +@fa-search-minus: "\f010"; +@fa-power-off: "\f011"; +@fa-signal: "\f012"; +@fa-cog: "\f013"; +@fa-trash-o: "\f014"; +@fa-home: "\f015"; +@fa-file-o: "\f016"; +@fa-clock-o: "\f017"; +@fa-road: "\f018"; +@fa-download: "\f019"; +@fa-arrow-circle-o-down: "\f01a"; +@fa-arrow-circle-o-up: "\f01b"; +@fa-inbox: "\f01c"; +@fa-play-circle-o: "\f01d"; +@fa-repeat: "\f01e"; +@fa-refresh: "\f021"; +@fa-list-alt: "\f022"; +@fa-lock: "\f023"; +@fa-flag: "\f024"; +@fa-headphones: "\f025"; +@fa-volume-off: "\f026"; +@fa-volume-down: "\f027"; +@fa-volume-up: "\f028"; +@fa-qrcode: "\f029"; +@fa-barcode: "\f02a"; +@fa-tag: "\f02b"; +@fa-tags: "\f02c"; +@fa-book: "\f02d"; +@fa-bookmark: "\f02e"; +@fa-print: "\f02f"; +@fa-camera: "\f030"; +@fa-font: "\f031"; +@fa-bold: "\f032"; +@fa-italic: "\f033"; +@fa-text-height: "\f034"; +@fa-text-width: "\f035"; +@fa-align-left: "\f036"; +@fa-align-center: "\f037"; +@fa-align-right: "\f038"; +@fa-align-justify: "\f039"; +@fa-list: "\f03a"; +@fa-outdent: "\f03b"; +@fa-indent: "\f03c"; +@fa-video-camera: "\f03d"; +@fa-picture-o: "\f03e"; +@fa-pencil: "\f040"; +@fa-map-marker: "\f041"; +@fa-adjust: "\f042"; +@fa-tint: "\f043"; +@fa-pencil-square-o: "\f044"; +@fa-share-square-o: "\f045"; +@fa-check-square-o: "\f046"; +@fa-arrows: "\f047"; +@fa-step-backward: "\f048"; +@fa-fast-backward: "\f049"; +@fa-backward: "\f04a"; +@fa-play: "\f04b"; +@fa-pause: "\f04c"; +@fa-stop: "\f04d"; +@fa-forward: "\f04e"; +@fa-fast-forward: "\f050"; +@fa-step-forward: "\f051"; +@fa-eject: "\f052"; +@fa-chevron-left: "\f053"; +@fa-chevron-right: "\f054"; +@fa-plus-circle: "\f055"; +@fa-minus-circle: "\f056"; +@fa-times-circle: "\f057"; +@fa-check-circle: "\f058"; +@fa-question-circle: "\f059"; +@fa-info-circle: "\f05a"; +@fa-crosshairs: "\f05b"; +@fa-times-circle-o: "\f05c"; +@fa-check-circle-o: "\f05d"; +@fa-ban: "\f05e"; +@fa-arrow-left: "\f060"; +@fa-arrow-right: "\f061"; +@fa-arrow-up: "\f062"; +@fa-arrow-down: "\f063"; +@fa-share: "\f064"; +@fa-expand: "\f065"; +@fa-compress: "\f066"; +@fa-plus: "\f067"; +@fa-minus: "\f068"; +@fa-asterisk: "\f069"; +@fa-exclamation-circle: "\f06a"; +@fa-gift: "\f06b"; +@fa-leaf: "\f06c"; +@fa-fire: "\f06d"; +@fa-eye: "\f06e"; +@fa-eye-slash: "\f070"; +@fa-exclamation-triangle: "\f071"; +@fa-plane: "\f072"; +@fa-calendar: "\f073"; +@fa-random: "\f074"; +@fa-comment: "\f075"; +@fa-magnet: "\f076"; +@fa-chevron-up: "\f077"; +@fa-chevron-down: "\f078"; +@fa-retweet: "\f079"; +@fa-shopping-cart: "\f07a"; +@fa-folder: "\f07b"; +@fa-folder-open: "\f07c"; +@fa-arrows-v: "\f07d"; +@fa-arrows-h: "\f07e"; +@fa-bar-chart: "\f080"; +@fa-twitter-square: "\f081"; +@fa-facebook-square: "\f082"; +@fa-camera-retro: "\f083"; +@fa-key: "\f084"; +@fa-cogs: "\f085"; +@fa-comments: "\f086"; +@fa-thumbs-o-up: "\f087"; +@fa-thumbs-o-down: "\f088"; +@fa-star-half: "\f089"; +@fa-heart-o: "\f08a"; +@fa-sign-out: "\f08b"; +@fa-linkedin-square: "\f08c"; +@fa-thumb-tack: "\f08d"; +@fa-external-link: "\f08e"; +@fa-sign-in: "\f090"; +@fa-trophy: "\f091"; +@fa-github-square: "\f092"; +@fa-upload: "\f093"; +@fa-lemon-o: "\f094"; +@fa-phone: "\f095"; +@fa-square-o: "\f096"; +@fa-bookmark-o: "\f097"; +@fa-phone-square: "\f098"; +@fa-twitter: "\f099"; +@fa-facebook: "\f09a"; +@fa-github: "\f09b"; +@fa-unlock: "\f09c"; +@fa-credit-card: "\f09d"; +@fa-rss: "\f09e"; +@fa-hdd-o: "\f0a0"; +@fa-bullhorn: "\f0a1"; +@fa-bell: "\f0f3"; +@fa-certificate: "\f0a3"; +@fa-hand-o-right: "\f0a4"; +@fa-hand-o-left: "\f0a5"; +@fa-hand-o-up: "\f0a6"; +@fa-hand-o-down: "\f0a7"; +@fa-arrow-circle-left: "\f0a8"; +@fa-arrow-circle-right: "\f0a9"; +@fa-arrow-circle-up: "\f0aa"; +@fa-arrow-circle-down: "\f0ab"; +@fa-globe: "\f0ac"; +@fa-wrench: "\f0ad"; +@fa-tasks: "\f0ae"; +@fa-filter: "\f0b0"; +@fa-briefcase: "\f0b1"; +@fa-arrows-alt: "\f0b2"; +@fa-users: "\f0c0"; +@fa-link: "\f0c1"; +@fa-cloud: "\f0c2"; +@fa-flask: "\f0c3"; +@fa-scissors: "\f0c4"; +@fa-files-o: "\f0c5"; +@fa-paperclip: "\f0c6"; +@fa-floppy-o: "\f0c7"; +@fa-square: "\f0c8"; +@fa-bars: "\f0c9"; +@fa-list-ul: "\f0ca"; +@fa-list-ol: "\f0cb"; +@fa-strikethrough: "\f0cc"; +@fa-underline: "\f0cd"; +@fa-table: "\f0ce"; +@fa-magic: "\f0d0"; +@fa-truck: "\f0d1"; +@fa-pinterest: "\f0d2"; +@fa-pinterest-square: "\f0d3"; +@fa-google-plus-square: "\f0d4"; +@fa-google-plus: "\f0d5"; +@fa-money: "\f0d6"; +@fa-caret-down: "\f0d7"; +@fa-caret-up: "\f0d8"; +@fa-caret-left: "\f0d9"; +@fa-caret-right: "\f0da"; +@fa-columns: "\f0db"; +@fa-sort: "\f0dc"; +@fa-sort-desc: "\f0dd"; +@fa-sort-asc: "\f0de"; +@fa-envelope: "\f0e0"; +@fa-linkedin: "\f0e1"; +@fa-undo: "\f0e2"; +@fa-gavel: "\f0e3"; +@fa-tachometer: "\f0e4"; +@fa-comment-o: "\f0e5"; +@fa-comments-o: "\f0e6"; +@fa-bolt: "\f0e7"; +@fa-sitemap: "\f0e8"; +@fa-umbrella: "\f0e9"; +@fa-clipboard: "\f0ea"; +@fa-lightbulb-o: "\f0eb"; +@fa-exchange: "\f0ec"; +@fa-cloud-download: "\f0ed"; +@fa-cloud-upload: "\f0ee"; +@fa-user-md: "\f0f0"; +@fa-stethoscope: "\f0f1"; +@fa-suitcase: "\f0f2"; +@fa-bell-o: "\f0a2"; +@fa-coffee: "\f0f4"; +@fa-cutlery: "\f0f5"; +@fa-file-text-o: "\f0f6"; +@fa-building-o: "\f0f7"; +@fa-hospital-o: "\f0f8"; +@fa-ambulance: "\f0f9"; +@fa-medkit: "\f0fa"; +@fa-fighter-jet: "\f0fb"; +@fa-beer: "\f0fc"; +@fa-h-square: "\f0fd"; +@fa-plus-square: "\f0fe"; +@fa-angle-double-left: "\f100"; +@fa-angle-double-right: "\f101"; +@fa-angle-double-up: "\f102"; +@fa-angle-double-down: "\f103"; +@fa-angle-left: "\f104"; +@fa-angle-right: "\f105"; +@fa-angle-up: "\f106"; +@fa-angle-down: "\f107"; +@fa-desktop: "\f108"; +@fa-laptop: "\f109"; +@fa-tablet: "\f10a"; +@fa-mobile: "\f10b"; +@fa-circle-o: "\f10c"; +@fa-quote-left: "\f10d"; +@fa-quote-right: "\f10e"; +@fa-spinner: "\f110"; +@fa-circle: "\f111"; +@fa-reply: "\f112"; +@fa-github-alt: "\f113"; +@fa-folder-o: "\f114"; +@fa-folder-open-o: "\f115"; +@fa-smile-o: "\f118"; +@fa-frown-o: "\f119"; +@fa-meh-o: "\f11a"; +@fa-gamepad: "\f11b"; +@fa-keyboard-o: "\f11c"; +@fa-flag-o: "\f11d"; +@fa-flag-checkered: "\f11e"; +@fa-terminal: "\f120"; +@fa-code: "\f121"; +@fa-reply-all: "\f122"; +@fa-star-half-o: "\f123"; +@fa-location-arrow: "\f124"; +@fa-crop: "\f125"; +@fa-code-fork: "\f126"; +@fa-chain-broken: "\f127"; +@fa-question: "\f128"; +@fa-info: "\f129"; +@fa-exclamation: "\f12a"; +@fa-superscript: "\f12b"; +@fa-subscript: "\f12c"; +@fa-eraser: "\f12d"; +@fa-puzzle-piece: "\f12e"; +@fa-microphone: "\f130"; +@fa-microphone-slash: "\f131"; +@fa-shield: "\f132"; +@fa-calendar-o: "\f133"; +@fa-fire-extinguisher: "\f134"; +@fa-rocket: "\f135"; +@fa-maxcdn: "\f136"; +@fa-chevron-circle-left: "\f137"; +@fa-chevron-circle-right: "\f138"; +@fa-chevron-circle-up: "\f139"; +@fa-chevron-circle-down: "\f13a"; +@fa-html5: "\f13b"; +@fa-css3: "\f13c"; +@fa-anchor: "\f13d"; +@fa-unlock-alt: "\f13e"; +@fa-bullseye: "\f140"; +@fa-ellipsis-h: "\f141"; +@fa-ellipsis-v: "\f142"; +@fa-rss-square: "\f143"; +@fa-play-circle: "\f144"; +@fa-ticket: "\f145"; +@fa-minus-square: "\f146"; +@fa-minus-square-o: "\f147"; +@fa-level-up: "\f148"; +@fa-level-down: "\f149"; +@fa-check-square: "\f14a"; +@fa-pencil-square: "\f14b"; +@fa-external-link-square: "\f14c"; +@fa-share-square: "\f14d"; +@fa-compass: "\f14e"; +@fa-caret-square-o-down: "\f150"; +@fa-caret-square-o-up: "\f151"; +@fa-caret-square-o-right: "\f152"; +@fa-eur: "\f153"; +@fa-gbp: "\f154"; +@fa-usd: "\f155"; +@fa-inr: "\f156"; +@fa-jpy: "\f157"; +@fa-rub: "\f158"; +@fa-krw: "\f159"; +@fa-btc: "\f15a"; +@fa-file: "\f15b"; +@fa-file-text: "\f15c"; +@fa-sort-alpha-asc: "\f15d"; +@fa-sort-alpha-desc: "\f15e"; +@fa-sort-amount-asc: "\f160"; +@fa-sort-amount-desc: "\f161"; +@fa-sort-numeric-asc: "\f162"; +@fa-sort-numeric-desc: "\f163"; +@fa-thumbs-up: "\f164"; +@fa-thumbs-down: "\f165"; +@fa-youtube-square: "\f166"; +@fa-youtube: "\f167"; +@fa-xing: "\f168"; +@fa-xing-square: "\f169"; +@fa-youtube-play: "\f16a"; +@fa-dropbox: "\f16b"; +@fa-stack-overflow: "\f16c"; +@fa-instagram: "\f16d"; +@fa-flickr: "\f16e"; +@fa-adn: "\f170"; +@fa-bitbucket: "\f171"; +@fa-bitbucket-square: "\f172"; +@fa-tumblr: "\f173"; +@fa-tumblr-square: "\f174"; +@fa-long-arrow-down: "\f175"; +@fa-long-arrow-up: "\f176"; +@fa-long-arrow-left: "\f177"; +@fa-long-arrow-right: "\f178"; +@fa-apple: "\f179"; +@fa-windows: "\f17a"; +@fa-android: "\f17b"; +@fa-linux: "\f17c"; +@fa-dribbble: "\f17d"; +@fa-skype: "\f17e"; +@fa-foursquare: "\f180"; +@fa-trello: "\f181"; +@fa-female: "\f182"; +@fa-male: "\f183"; +@fa-gittip: "\f184"; +@fa-sun-o: "\f185"; +@fa-moon-o: "\f186"; +@fa-archive: "\f187"; +@fa-bug: "\f188"; +@fa-vk: "\f189"; +@fa-weibo: "\f18a"; +@fa-renren: "\f18b"; +@fa-pagelines: "\f18c"; +@fa-stack-exchange: "\f18d"; +@fa-arrow-circle-o-right: "\f18e"; +@fa-arrow-circle-o-left: "\f190"; +@fa-caret-square-o-left: "\f191"; +@fa-dot-circle-o: "\f192"; +@fa-wheelchair: "\f193"; +@fa-vimeo-square: "\f194"; +@fa-try: "\f195"; +@fa-plus-square-o: "\f196"; +@fa-space-shuttle: "\f197"; +@fa-slack: "\f198"; +@fa-envelope-square: "\f199"; +@fa-wordpress: "\f19a"; +@fa-openid: "\f19b"; +@fa-university: "\f19c"; +@fa-graduation-cap: "\f19d"; +@fa-yahoo: "\f19e"; +@fa-google: "\f1a0"; +@fa-reddit: "\f1a1"; +@fa-reddit-square: "\f1a2"; +@fa-stumbleupon-circle: "\f1a3"; +@fa-stumbleupon: "\f1a4"; +@fa-delicious: "\f1a5"; +@fa-digg: "\f1a6"; +@fa-pied-piper: "\f1a7"; +@fa-pied-piper-alt: "\f1a8"; +@fa-drupal: "\f1a9"; +@fa-joomla: "\f1aa"; +@fa-language: "\f1ab"; +@fa-fax: "\f1ac"; +@fa-building: "\f1ad"; +@fa-child: "\f1ae"; +@fa-paw: "\f1b0"; +@fa-spoon: "\f1b1"; +@fa-cube: "\f1b2"; +@fa-cubes: "\f1b3"; +@fa-behance: "\f1b4"; +@fa-behance-square: "\f1b5"; +@fa-steam: "\f1b6"; +@fa-steam-square: "\f1b7"; +@fa-recycle: "\f1b8"; +@fa-car: "\f1b9"; +@fa-taxi: "\f1ba"; +@fa-tree: "\f1bb"; +@fa-spotify: "\f1bc"; +@fa-deviantart: "\f1bd"; +@fa-soundcloud: "\f1be"; +@fa-database: "\f1c0"; +@fa-file-pdf-o: "\f1c1"; +@fa-file-word-o: "\f1c2"; +@fa-file-excel-o: "\f1c3"; +@fa-file-powerpoint-o: "\f1c4"; +@fa-file-image-o: "\f1c5"; +@fa-file-archive-o: "\f1c6"; +@fa-file-audio-o: "\f1c7"; +@fa-file-video-o: "\f1c8"; +@fa-file-code-o: "\f1c9"; +@fa-vine: "\f1ca"; +@fa-codepen: "\f1cb"; +@fa-jsfiddle: "\f1cc"; +@fa-life-ring: "\f1cd"; +@fa-circle-o-notch: "\f1ce"; +@fa-rebel: "\f1d0"; +@fa-empire: "\f1d1"; +@fa-git-square: "\f1d2"; +@fa-git: "\f1d3"; +@fa-hacker-news: "\f1d4"; +@fa-tencent-weibo: "\f1d5"; +@fa-qq: "\f1d6"; +@fa-weixin: "\f1d7"; +@fa-paper-plane: "\f1d8"; +@fa-paper-plane-o: "\f1d9"; +@fa-history: "\f1da"; +@fa-circle-thin: "\f1db"; +@fa-header: "\f1dc"; +@fa-paragraph: "\f1dd"; +@fa-sliders: "\f1de"; +@fa-share-alt: "\f1e0"; +@fa-share-alt-square: "\f1e1"; +@fa-bomb: "\f1e2"; +@fa-futbol-o: "\f1e3"; +@fa-tty: "\f1e4"; +@fa-binoculars: "\f1e5"; +@fa-plug: "\f1e6"; +@fa-slideshare: "\f1e7"; +@fa-twitch: "\f1e8"; +@fa-yelp: "\f1e9"; +@fa-newspaper-o: "\f1ea"; +@fa-wifi: "\f1eb"; +@fa-calculator: "\f1ec"; +@fa-paypal: "\f1ed"; +@fa-google-wallet: "\f1ee"; +@fa-cc-visa: "\f1f0"; +@fa-cc-mastercard: "\f1f1"; +@fa-cc-discover: "\f1f2"; +@fa-cc-amex: "\f1f3"; +@fa-cc-paypal: "\f1f4"; +@fa-cc-stripe: "\f1f5"; +@fa-bell-slash: "\f1f6"; +@fa-bell-slash-o: "\f1f7"; +@fa-trash: "\f1f8"; +@fa-copyright: "\f1f9"; +@fa-at: "\f1fa"; +@fa-eyedropper: "\f1fb"; +@fa-paint-brush: "\f1fc"; +@fa-birthday-cake: "\f1fd"; +@fa-area-chart: "\f1fe"; +@fa-pie-chart: "\f200"; +@fa-line-chart: "\f201"; +@fa-lastfm: "\f202"; +@fa-lastfm-square: "\f203"; +@fa-toggle-off: "\f204"; +@fa-toggle-on: "\f205"; +@fa-bicycle: "\f206"; +@fa-bus: "\f207"; +@fa-ioxhost: "\f208"; +@fa-angellist: "\f209"; +@fa-cc: "\f20a"; +@fa-ils: "\f20b"; +@fa-meanpath: "\f20c"; + diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/awesomeStyle/img/loading.gif b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/awesomeStyle/img/loading.gif new file mode 100644 index 0000000..e8c2892 Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/awesomeStyle/img/loading.gif differ diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/demo.css b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/demo.css new file mode 100644 index 0000000..f6dba0d --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/demo.css @@ -0,0 +1,33 @@ +html, body, div, span, applet, object, iframe, h1, h2, h3, h4, h5, h6, p, blockquote, pre, a, abbr, acronym, address, big, cite, code, del, dfn, em, font, img, ins, kbd, q, s, samp, small, strike, strong, sub, sup, tt, var, dl, dt, dd, ol, ul, li, fieldset, form, label, legend, table, caption, tbody, tfoot, thead, tr, th, td { + margin: 0;padding: 0;border: 0;outline: 0;font-weight: inherit;font-style: inherit;font-size: 100%;font-family: inherit;vertical-align: baseline;} +body {color: #2f332a;font: 15px/21px Arial, Helvetica, simsun, sans-serif;background: #f0f6e4 \9;} +h1, h2, h3, h4, h5, h6 {color: #2f332a;font-weight: bold;font-family: Helvetica, Arial, sans-serif;padding-bottom: 5px;} +h1 {font-size: 24px;line-height: 34px;text-align: center;} +h2 {font-size: 14px;line-height: 24px;padding-top: 5px;} +h6 {font-weight: normal;font-size: 12px;letter-spacing: 1px;line-height: 24px;text-align: center;} +a {color:#3C6E31;text-decoration: underline;} +a:hover {background-color:#3C6E31;color:white;} +input.radio {margin: 0 2px 0 8px;} +input.radio.first {margin-left:0;} +input.empty {color: lightgray;} +code {color: #2f332a;} +.highlight_red {color:#A60000;} +.highlight_green {color:#A7F43D;} +li {list-style: circle;font-size: 12px;} +li.title {list-style: none;} +ul.list {margin-left: 17px;} + +div.content_wrap {width: 600px;height:380px;} +div.content_wrap div.left{float: left;width: 250px;} +div.content_wrap div.right{float: right;width: 340px;} +div.zTreeDemoBackground {width:250px;height:362px;text-align:left;} + +ul.ztree {margin-top: 10px;border: 1px solid #617775;background: #f0f6e4;width:220px;height:360px;overflow-y:scroll;overflow-x:auto;} +ul.log {border: 1px solid #617775;background: #f0f6e4;width:300px;height:170px;overflow: hidden;} +ul.log.small {height:45px;} +ul.log li {color: #666666;list-style: none;padding-left: 10px;} +ul.log li.dark {background-color: #E3E3E3;} + +/* ruler */ +div.ruler {height:20px; width:220px; background-color:#f0f6e4;border: 1px solid #333; margin-bottom: 5px; cursor: pointer} +div.ruler div.cursor {height:20px; width:30px; background-color:#3C6E31; color:white; text-align: right; padding-right: 5px; cursor: pointer} \ No newline at end of file diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/metroStyle/img/line_conn.png b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/metroStyle/img/line_conn.png new file mode 100644 index 0000000..b211da2 Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/metroStyle/img/line_conn.png differ diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/metroStyle/img/loading.gif b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/metroStyle/img/loading.gif new file mode 100644 index 0000000..e8c2892 Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/metroStyle/img/loading.gif differ diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/metroStyle/img/metro.gif b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/metroStyle/img/metro.gif new file mode 100644 index 0000000..664b969 Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/metroStyle/img/metro.gif differ diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/metroStyle/img/metro.png b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/metroStyle/img/metro.png new file mode 100644 index 0000000..e9e58a3 Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/metroStyle/img/metro.png differ diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/metroStyle/metroStyle.css b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/metroStyle/metroStyle.css new file mode 100644 index 0000000..af81f42 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/metroStyle/metroStyle.css @@ -0,0 +1,96 @@ +/*------------------------------------- +zTree Style + +version: 3.4 +author: Hunter.z +email: hunter.z@263.net +website: http://code.google.com/p/jquerytree/ + +-------------------------------------*/ + +.ztree * {padding:0; margin:0; font-size:12px; font-family: Verdana, Arial, Helvetica, AppleGothic, sans-serif} +.ztree {margin:0; padding:5px; color:#333} +.ztree li{padding:0; margin:0; list-style:none; line-height:17px; text-align:left; white-space:nowrap; outline:0} +.ztree li ul{ margin:0; padding:0 0 0 18px} +.ztree li ul.line{ background:url(./img/line_conn.png) 0 0 repeat-y;} + +.ztree li a {padding-right:3px; margin:0; cursor:pointer; height:21px; color:#333; background-color: transparent; text-decoration:none; vertical-align:top; display: inline-block} +.ztree li a:hover {text-decoration:underline} +.ztree li a.curSelectedNode {padding-top:0px; background-color:#e5e5e5; color:black; height:21px; opacity:0.8;} +.ztree li a.curSelectedNode_Edit {padding-top:0px; background-color:#e5e5e5; color:black; height:21px; border:1px #666 solid; opacity:0.8;} +.ztree li a.tmpTargetNode_inner {padding-top:0px; background-color:#aaa; color:white; height:21px; border:1px #666 solid; + opacity:0.8; filter:alpha(opacity=80)} +.ztree li a.tmpTargetNode_prev {} +.ztree li a.tmpTargetNode_next {} +.ztree li a input.rename {height:14px; width:80px; padding:0; margin:0; + font-size:12px; border:1px #585956 solid; *border:0px} +.ztree li span {line-height:21px; margin-right:2px} +.ztree li span.button {line-height:0; margin:0; padding: 0; width:21px; height:21px; display: inline-block; vertical-align:middle; + border:0 none; cursor: pointer;outline:none; + background-color:transparent; background-repeat:no-repeat; background-attachment: scroll; + background-image:url("./img/metro.png"); *background-image:url("./img/metro.gif")} + +.ztree li span.button.chk {width:13px; height:13px; margin:0 2px; cursor: auto} +.ztree li span.button.chk.checkbox_false_full {background-position: -5px -5px;} +.ztree li span.button.chk.checkbox_false_full_focus {background-position: -5px -26px;} +.ztree li span.button.chk.checkbox_false_part {background-position: -5px -48px;} +.ztree li span.button.chk.checkbox_false_part_focus {background-position: -5px -68px;} +.ztree li span.button.chk.checkbox_false_disable {background-position: -5px -89px;} +.ztree li span.button.chk.checkbox_true_full {background-position: -26px -5px;} +.ztree li span.button.chk.checkbox_true_full_focus {background-position: -26px -26px;} +.ztree li span.button.chk.checkbox_true_part {background-position: -26px -48px;} +.ztree li span.button.chk.checkbox_true_part_focus {background-position: -26px -68px;} +.ztree li span.button.chk.checkbox_true_disable {background-position: -26px -89px;} +.ztree li span.button.chk.radio_false_full {background-position: -47px -5px;} +.ztree li span.button.chk.radio_false_full_focus {background-position: -47px -26px;} +.ztree li span.button.chk.radio_false_part {background-position: -47px -47px;} +.ztree li span.button.chk.radio_false_part_focus {background-position: -47px -68px;} +.ztree li span.button.chk.radio_false_disable {background-position: -47px -89px;} +.ztree li span.button.chk.radio_true_full {background-position: -68px -5px;} +.ztree li span.button.chk.radio_true_full_focus {background-position: -68px -26px;} +.ztree li span.button.chk.radio_true_part {background-position: -68px -47px;} +.ztree li span.button.chk.radio_true_part_focus {background-position: -68px -68px;} +.ztree li span.button.chk.radio_true_disable {background-position: -68px -89px;} + +.ztree li span.button.switch {width:21px; height:21px} +.ztree li span.button.root_open{background-position:-105px -63px} +.ztree li span.button.root_close{background-position:-126px -63px} +.ztree li span.button.roots_open{background-position: -105px 0;} +.ztree li span.button.roots_close{background-position: -126px 0;} +.ztree li span.button.center_open{background-position: -105px -21px;} +.ztree li span.button.center_close{background-position: -126px -21px;} +.ztree li span.button.bottom_open{background-position: -105px -42px;} +.ztree li span.button.bottom_close{background-position: -126px -42px;} +.ztree li span.button.noline_open{background-position: -105px -84px;} +.ztree li span.button.noline_close{background-position: -126px -84px;} +.ztree li span.button.root_docu{ background:none;} +.ztree li span.button.roots_docu{background-position: -84px 0;} +.ztree li span.button.center_docu{background-position: -84px -21px;} +.ztree li span.button.bottom_docu{background-position: -84px -42px;} +.ztree li span.button.noline_docu{ background:none;} + +.ztree li span.button.ico_open{margin-right:2px; background-position: -147px -21px; vertical-align:top; *vertical-align:middle} +.ztree li span.button.ico_close{margin-right:2px; margin-right:2px; background-position: -147px 0; vertical-align:top; *vertical-align:middle} +.ztree li span.button.ico_docu{margin-right:2px; background-position: -147px -42px; vertical-align:top; *vertical-align:middle} +.ztree li span.button.edit {margin-left:2px; margin-right: -1px; background-position: -189px -21px; vertical-align:top; *vertical-align:middle} +.ztree li span.button.edit:hover { + background-position: -168px -21px; +} +.ztree li span.button.remove {margin-left:2px; margin-right: -1px; background-position: -189px -42px; vertical-align:top; *vertical-align:middle} +.ztree li span.button.remove:hover { + background-position: -168px -42px; +} +.ztree li span.button.add {margin-left:2px; margin-right: -1px; background-position: -189px 0; vertical-align:top; *vertical-align:middle} +.ztree li span.button.add:hover { + background-position: -168px 0; +} +.ztree li span.button.ico_loading{margin-right:2px; background:url(./img/loading.gif) no-repeat scroll 0 0 transparent; vertical-align:top; *vertical-align:middle} + +ul.tmpTargetzTree {background-color:#FFE6B0; opacity:0.8; filter:alpha(opacity=80)} + +span.tmpzTreeMove_arrow {width:16px; height:21px; display: inline-block; padding:0; margin:2px 0 0 1px; border:0 none; position:absolute; + background-color:transparent; background-repeat:no-repeat; background-attachment: scroll; + background-position:-168px -84px; background-image:url("./img/metro.png"); *background-image:url("./img/metro.gif")} + +ul.ztree.zTreeDragUL {margin:0; padding:0; position:absolute; width:auto; height:auto;overflow:hidden; background-color:#cfcfcf; border:1px #00B83F dotted; opacity:0.8; filter:alpha(opacity=80)} +.ztreeMask {z-index:10000; background-color:#cfcfcf; opacity:0.0; filter:alpha(opacity=0); position:absolute} diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/diy/1_close.png b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/diy/1_close.png new file mode 100644 index 0000000..68ccb3c Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/diy/1_close.png differ diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/diy/1_open.png b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/diy/1_open.png new file mode 100644 index 0000000..d6ff36d Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/diy/1_open.png differ diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/diy/2.png b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/diy/2.png new file mode 100644 index 0000000..9eff506 Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/diy/2.png differ diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/diy/3.png b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/diy/3.png new file mode 100644 index 0000000..d7ba6d0 Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/diy/3.png differ diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/diy/4.png b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/diy/4.png new file mode 100644 index 0000000..753e2bf Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/diy/4.png differ diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/diy/5.png b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/diy/5.png new file mode 100644 index 0000000..0c5eccd Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/diy/5.png differ diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/diy/6.png b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/diy/6.png new file mode 100644 index 0000000..070b835 Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/diy/6.png differ diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/diy/7.png b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/diy/7.png new file mode 100644 index 0000000..532b037 Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/diy/7.png differ diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/diy/8.png b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/diy/8.png new file mode 100644 index 0000000..a8f3a86 Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/diy/8.png differ diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/diy/9.png b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/diy/9.png new file mode 100644 index 0000000..4db73cd Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/diy/9.png differ diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/line_conn.gif b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/line_conn.gif new file mode 100644 index 0000000..d561d36 Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/line_conn.gif differ diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/loading.gif b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/loading.gif new file mode 100644 index 0000000..e8c2892 Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/loading.gif differ diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/zTreeStandard.gif b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/zTreeStandard.gif new file mode 100644 index 0000000..50c94fd Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/zTreeStandard.gif differ diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/zTreeStandard.png b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/zTreeStandard.png new file mode 100644 index 0000000..ffda01e Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/img/zTreeStandard.png differ diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/zTreeStyle.css b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/zTreeStyle.css new file mode 100644 index 0000000..4a1705b --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/css/zTreeStyle/zTreeStyle.css @@ -0,0 +1,97 @@ +/*------------------------------------- +zTree Style + +version: 3.5.19 +author: Hunter.z +email: hunter.z@263.net +website: http://code.google.com/p/jquerytree/ + +-------------------------------------*/ + +.ztree * {padding:0; margin:0; font-size:12px; font-family: Verdana, Arial, Helvetica, AppleGothic, sans-serif} +.ztree {margin:0; padding:5px; color:#333} +.ztree li{padding:0; margin:0; list-style:none; line-height:14px; text-align:left; white-space:nowrap; outline:0} +.ztree li ul{ margin:0; padding:0 0 0 18px} +.ztree li ul.line{ background:url(./img/line_conn.gif) 0 0 repeat-y;} + +.ztree li a {padding:1px 3px 0 0; margin:0; cursor:pointer; height:17px; color:#333; background-color: transparent; + text-decoration:none; vertical-align:top; display: inline-block} +.ztree li a:hover {text-decoration:underline} +.ztree li a.curSelectedNode {padding-top:0px; background-color:#FFE6B0; color:black; height:16px; border:1px #FFB951 solid; opacity:0.8;} +.ztree li a.curSelectedNode_Edit {padding-top:0px; background-color:#FFE6B0; color:black; height:16px; border:1px #FFB951 solid; opacity:0.8;} +.ztree li a.tmpTargetNode_inner {padding-top:0px; background-color:#316AC5; color:white; height:16px; border:1px #316AC5 solid; + opacity:0.8; filter:alpha(opacity=80)} +.ztree li a.tmpTargetNode_prev {} +.ztree li a.tmpTargetNode_next {} +.ztree li a input.rename {height:14px; width:80px; padding:0; margin:0; + font-size:12px; border:1px #7EC4CC solid; *border:0px} +.ztree li span {line-height:16px; margin-right:2px} +.ztree li span.button {line-height:0; margin:0; width:16px; height:16px; display: inline-block; vertical-align:middle; + border:0 none; cursor: pointer;outline:none; + background-color:transparent; background-repeat:no-repeat; background-attachment: scroll; + background-image:url("./img/zTreeStandard.png"); *background-image:url("./img/zTreeStandard.gif")} + +.ztree li span.button.chk {width:13px; height:13px; margin:0 3px 0 0; cursor: auto} +.ztree li span.button.chk.checkbox_false_full {background-position:0 0} +.ztree li span.button.chk.checkbox_false_full_focus {background-position:0 -14px} +.ztree li span.button.chk.checkbox_false_part {background-position:0 -28px} +.ztree li span.button.chk.checkbox_false_part_focus {background-position:0 -42px} +.ztree li span.button.chk.checkbox_false_disable {background-position:0 -56px} +.ztree li span.button.chk.checkbox_true_full {background-position:-14px 0} +.ztree li span.button.chk.checkbox_true_full_focus {background-position:-14px -14px} +.ztree li span.button.chk.checkbox_true_part {background-position:-14px -28px} +.ztree li span.button.chk.checkbox_true_part_focus {background-position:-14px -42px} +.ztree li span.button.chk.checkbox_true_disable {background-position:-14px -56px} +.ztree li span.button.chk.radio_false_full {background-position:-28px 0} +.ztree li span.button.chk.radio_false_full_focus {background-position:-28px -14px} +.ztree li span.button.chk.radio_false_part {background-position:-28px -28px} +.ztree li span.button.chk.radio_false_part_focus {background-position:-28px -42px} +.ztree li span.button.chk.radio_false_disable {background-position:-28px -56px} +.ztree li span.button.chk.radio_true_full {background-position:-42px 0} +.ztree li span.button.chk.radio_true_full_focus {background-position:-42px -14px} +.ztree li span.button.chk.radio_true_part {background-position:-42px -28px} +.ztree li span.button.chk.radio_true_part_focus {background-position:-42px -42px} +.ztree li span.button.chk.radio_true_disable {background-position:-42px -56px} + +.ztree li span.button.switch {width:18px; height:18px} +.ztree li span.button.root_open{background-position:-92px -54px} +.ztree li span.button.root_close{background-position:-74px -54px} +.ztree li span.button.roots_open{background-position:-92px 0} +.ztree li span.button.roots_close{background-position:-74px 0} +.ztree li span.button.center_open{background-position:-92px -18px} +.ztree li span.button.center_close{background-position:-74px -18px} +.ztree li span.button.bottom_open{background-position:-92px -36px} +.ztree li span.button.bottom_close{background-position:-74px -36px} +.ztree li span.button.noline_open{background-position:-92px -72px} +.ztree li span.button.noline_close{background-position:-74px -72px} +.ztree li span.button.root_docu{ background:none;} +.ztree li span.button.roots_docu{background-position:-56px 0} +.ztree li span.button.center_docu{background-position:-56px -18px} +.ztree li span.button.bottom_docu{background-position:-56px -36px} +.ztree li span.button.noline_docu{ background:none;} + +.ztree li span.button.ico_open{margin-right:2px; background-position:-110px -16px; vertical-align:top; *vertical-align:middle} +.ztree li span.button.ico_close{margin-right:2px; background-position:-110px 0; vertical-align:top; *vertical-align:middle} +.ztree li span.button.ico_docu{margin-right:2px; background-position:-110px -32px; vertical-align:top; *vertical-align:middle} +.ztree li span.button.edit {margin-right:2px; background-position:-110px -48px; vertical-align:top; *vertical-align:middle} +.ztree li span.button.remove {margin-right:2px; background-position:-110px -64px; vertical-align:top; *vertical-align:middle} + +.ztree li span.button.ico_loading{margin-right:2px; background:url(./img/loading.gif) no-repeat scroll 0 0 transparent; vertical-align:top; *vertical-align:middle} + +ul.tmpTargetzTree {background-color:#FFE6B0; opacity:0.8; filter:alpha(opacity=80)} + +span.tmpzTreeMove_arrow {width:16px; height:16px; display: inline-block; padding:0; margin:2px 0 0 1px; border:0 none; position:absolute; + background-color:transparent; background-repeat:no-repeat; background-attachment: scroll; + background-position:-110px -80px; background-image:url("./img/zTreeStandard.png"); *background-image:url("./img/zTreeStandard.gif")} + +ul.ztree.zTreeDragUL {margin:0; padding:0; position:absolute; width:auto; height:auto;overflow:hidden; background-color:#cfcfcf; border:1px #00B83F dotted; opacity:0.8; filter:alpha(opacity=80)} +.zTreeMask {z-index:10000; background-color:#cfcfcf; opacity:0.0; filter:alpha(opacity=0); position:absolute} + +/* level style*/ +/*.ztree li span.button.level0 { + display:none; +} +.ztree li ul.level0 { + padding:0; + background:none; +}*/ \ No newline at end of file diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/js/jquery.ztree.all.js b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/js/jquery.ztree.all.js new file mode 100644 index 0000000..e237613 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/js/jquery.ztree.all.js @@ -0,0 +1,3841 @@ + +/* + * JQuery zTree core v3.5.40 + * http://treejs.cn/ + * + * Copyright (c) 2010 Hunter.z + * + * Licensed same as jquery - MIT License + * http://www.opensource.org/licenses/mit-license.php + * + * email: hunter.z@263.net + * Date: 2019-01-18 + */ +(function ($) { + var settings = {}, roots = {}, caches = {}, + //default consts of core + _consts = { + className: { + BUTTON: "button", + LEVEL: "level", + ICO_LOADING: "ico_loading", + SWITCH: "switch", + NAME: 'node_name' + }, + event: { + NODECREATED: "ztree_nodeCreated", + CLICK: "ztree_click", + EXPAND: "ztree_expand", + COLLAPSE: "ztree_collapse", + ASYNC_SUCCESS: "ztree_async_success", + ASYNC_ERROR: "ztree_async_error", + REMOVE: "ztree_remove", + SELECTED: "ztree_selected", + UNSELECTED: "ztree_unselected" + }, + id: { + A: "_a", + ICON: "_ico", + SPAN: "_span", + SWITCH: "_switch", + UL: "_ul" + }, + line: { + ROOT: "root", + ROOTS: "roots", + CENTER: "center", + BOTTOM: "bottom", + NOLINE: "noline", + LINE: "line" + }, + folder: { + OPEN: "open", + CLOSE: "close", + DOCU: "docu" + }, + node: { + CURSELECTED: "curSelectedNode" + } + }, + //default setting of core + _setting = { + treeId: "", + treeObj: null, + view: { + addDiyDom: null, + autoCancelSelected: true, + dblClickExpand: true, + expandSpeed: "fast", + fontCss: {}, + nameIsHTML: false, + selectedMulti: true, + showIcon: true, + showLine: true, + showTitle: true, + txtSelectedEnable: false + }, + data: { + key: { + isParent: "isParent", + children: "children", + name: "name", + title: "", + url: "url", + icon: "icon" + }, + simpleData: { + enable: false, + idKey: "id", + pIdKey: "pId", + rootPId: null + }, + keep: { + parent: false, + leaf: false + } + }, + async: { + enable: false, + contentType: "application/x-www-form-urlencoded", + type: "post", + dataType: "text", + headers: {}, + xhrFields: {}, + url: "", + autoParam: [], + otherParam: [], + dataFilter: null + }, + callback: { + beforeAsync: null, + beforeClick: null, + beforeDblClick: null, + beforeRightClick: null, + beforeMouseDown: null, + beforeMouseUp: null, + beforeExpand: null, + beforeCollapse: null, + beforeRemove: null, + + onAsyncError: null, + onAsyncSuccess: null, + onNodeCreated: null, + onClick: null, + onDblClick: null, + onRightClick: null, + onMouseDown: null, + onMouseUp: null, + onExpand: null, + onCollapse: null, + onRemove: null + } + }, + //default root of core + //zTree use root to save full data + _initRoot = function (setting) { + var r = data.getRoot(setting); + if (!r) { + r = {}; + data.setRoot(setting, r); + } + data.nodeChildren(setting, r, []); + r.expandTriggerFlag = false; + r.curSelectedList = []; + r.noSelection = true; + r.createdNodes = []; + r.zId = 0; + r._ver = (new Date()).getTime(); + }, + //default cache of core + _initCache = function (setting) { + var c = data.getCache(setting); + if (!c) { + c = {}; + data.setCache(setting, c); + } + c.nodes = []; + c.doms = []; + }, + //default bindEvent of core + _bindEvent = function (setting) { + var o = setting.treeObj, + c = consts.event; + o.bind(c.NODECREATED, function (event, treeId, node) { + tools.apply(setting.callback.onNodeCreated, [event, treeId, node]); + }); + + o.bind(c.CLICK, function (event, srcEvent, treeId, node, clickFlag) { + tools.apply(setting.callback.onClick, [srcEvent, treeId, node, clickFlag]); + }); + + o.bind(c.EXPAND, function (event, treeId, node) { + tools.apply(setting.callback.onExpand, [event, treeId, node]); + }); + + o.bind(c.COLLAPSE, function (event, treeId, node) { + tools.apply(setting.callback.onCollapse, [event, treeId, node]); + }); + + o.bind(c.ASYNC_SUCCESS, function (event, treeId, node, msg) { + tools.apply(setting.callback.onAsyncSuccess, [event, treeId, node, msg]); + }); + + o.bind(c.ASYNC_ERROR, function (event, treeId, node, XMLHttpRequest, textStatus, errorThrown) { + tools.apply(setting.callback.onAsyncError, [event, treeId, node, XMLHttpRequest, textStatus, errorThrown]); + }); + + o.bind(c.REMOVE, function (event, treeId, treeNode) { + tools.apply(setting.callback.onRemove, [event, treeId, treeNode]); + }); + + o.bind(c.SELECTED, function (event, treeId, node) { + tools.apply(setting.callback.onSelected, [treeId, node]); + }); + o.bind(c.UNSELECTED, function (event, treeId, node) { + tools.apply(setting.callback.onUnSelected, [treeId, node]); + }); + }, + _unbindEvent = function (setting) { + var o = setting.treeObj, + c = consts.event; + o.unbind(c.NODECREATED) + .unbind(c.CLICK) + .unbind(c.EXPAND) + .unbind(c.COLLAPSE) + .unbind(c.ASYNC_SUCCESS) + .unbind(c.ASYNC_ERROR) + .unbind(c.REMOVE) + .unbind(c.SELECTED) + .unbind(c.UNSELECTED); + }, + //default event proxy of core + _eventProxy = function (event) { + var target = event.target, + setting = data.getSetting(event.data.treeId), + tId = "", node = null, + nodeEventType = "", treeEventType = "", + nodeEventCallback = null, treeEventCallback = null, + tmp = null; + + if (tools.eqs(event.type, "mousedown")) { + treeEventType = "mousedown"; + } else if (tools.eqs(event.type, "mouseup")) { + treeEventType = "mouseup"; + } else if (tools.eqs(event.type, "contextmenu")) { + treeEventType = "contextmenu"; + } else if (tools.eqs(event.type, "click")) { + if (tools.eqs(target.tagName, "span") && target.getAttribute("treeNode" + consts.id.SWITCH) !== null) { + tId = tools.getNodeMainDom(target).id; + nodeEventType = "switchNode"; + } else { + tmp = tools.getMDom(setting, target, [{tagName: "a", attrName: "treeNode" + consts.id.A}]); + if (tmp) { + tId = tools.getNodeMainDom(tmp).id; + nodeEventType = "clickNode"; + } + } + } else if (tools.eqs(event.type, "dblclick")) { + treeEventType = "dblclick"; + tmp = tools.getMDom(setting, target, [{tagName: "a", attrName: "treeNode" + consts.id.A}]); + if (tmp) { + tId = tools.getNodeMainDom(tmp).id; + nodeEventType = "switchNode"; + } + } + if (treeEventType.length > 0 && tId.length == 0) { + tmp = tools.getMDom(setting, target, [{tagName: "a", attrName: "treeNode" + consts.id.A}]); + if (tmp) { + tId = tools.getNodeMainDom(tmp).id; + } + } + // event to node + if (tId.length > 0) { + node = data.getNodeCache(setting, tId); + switch (nodeEventType) { + case "switchNode" : + var isParent = data.nodeIsParent(setting, node); + if (!isParent) { + nodeEventType = ""; + } else if (tools.eqs(event.type, "click") + || (tools.eqs(event.type, "dblclick") && tools.apply(setting.view.dblClickExpand, [setting.treeId, node], setting.view.dblClickExpand))) { + nodeEventCallback = handler.onSwitchNode; + } else { + nodeEventType = ""; + } + break; + case "clickNode" : + nodeEventCallback = handler.onClickNode; + break; + } + } + // event to zTree + switch (treeEventType) { + case "mousedown" : + treeEventCallback = handler.onZTreeMousedown; + break; + case "mouseup" : + treeEventCallback = handler.onZTreeMouseup; + break; + case "dblclick" : + treeEventCallback = handler.onZTreeDblclick; + break; + case "contextmenu" : + treeEventCallback = handler.onZTreeContextmenu; + break; + } + var proxyResult = { + stop: false, + node: node, + nodeEventType: nodeEventType, + nodeEventCallback: nodeEventCallback, + treeEventType: treeEventType, + treeEventCallback: treeEventCallback + }; + return proxyResult + }, + //default init node of core + _initNode = function (setting, level, n, parentNode, isFirstNode, isLastNode, openFlag) { + if (!n) return; + var r = data.getRoot(setting), + children = data.nodeChildren(setting, n); + n.level = level; + n.tId = setting.treeId + "_" + (++r.zId); + n.parentTId = parentNode ? parentNode.tId : null; + n.open = (typeof n.open == "string") ? tools.eqs(n.open, "true") : !!n.open; + var isParent = data.nodeIsParent(setting, n); + if (tools.isArray(children)) { + data.nodeIsParent(setting, n, true); + n.zAsync = true; + } else { + isParent = data.nodeIsParent(setting, n, isParent); + n.open = (isParent && !setting.async.enable) ? n.open : false; + n.zAsync = !isParent; + } + n.isFirstNode = isFirstNode; + n.isLastNode = isLastNode; + n.getParentNode = function () { + return data.getNodeCache(setting, n.parentTId); + }; + n.getPreNode = function () { + return data.getPreNode(setting, n); + }; + n.getNextNode = function () { + return data.getNextNode(setting, n); + }; + n.getIndex = function () { + return data.getNodeIndex(setting, n); + }; + n.getPath = function () { + return data.getNodePath(setting, n); + }; + n.isAjaxing = false; + data.fixPIdKeyValue(setting, n); + }, + _init = { + bind: [_bindEvent], + unbind: [_unbindEvent], + caches: [_initCache], + nodes: [_initNode], + proxys: [_eventProxy], + roots: [_initRoot], + beforeA: [], + afterA: [], + innerBeforeA: [], + innerAfterA: [], + zTreeTools: [] + }, + //method of operate data + data = { + addNodeCache: function (setting, node) { + data.getCache(setting).nodes[data.getNodeCacheId(node.tId)] = node; + }, + getNodeCacheId: function (tId) { + return tId.substring(tId.lastIndexOf("_") + 1); + }, + addAfterA: function (afterA) { + _init.afterA.push(afterA); + }, + addBeforeA: function (beforeA) { + _init.beforeA.push(beforeA); + }, + addInnerAfterA: function (innerAfterA) { + _init.innerAfterA.push(innerAfterA); + }, + addInnerBeforeA: function (innerBeforeA) { + _init.innerBeforeA.push(innerBeforeA); + }, + addInitBind: function (bindEvent) { + _init.bind.push(bindEvent); + }, + addInitUnBind: function (unbindEvent) { + _init.unbind.push(unbindEvent); + }, + addInitCache: function (initCache) { + _init.caches.push(initCache); + }, + addInitNode: function (initNode) { + _init.nodes.push(initNode); + }, + addInitProxy: function (initProxy, isFirst) { + if (!!isFirst) { + _init.proxys.splice(0, 0, initProxy); + } else { + _init.proxys.push(initProxy); + } + }, + addInitRoot: function (initRoot) { + _init.roots.push(initRoot); + }, + addNodesData: function (setting, parentNode, index, nodes) { + var children = data.nodeChildren(setting, parentNode), params; + if (!children) { + children = data.nodeChildren(setting, parentNode, []); + index = -1; + } else if (index >= children.length) { + index = -1; + } + + if (children.length > 0 && index === 0) { + children[0].isFirstNode = false; + view.setNodeLineIcos(setting, children[0]); + } else if (children.length > 0 && index < 0) { + children[children.length - 1].isLastNode = false; + view.setNodeLineIcos(setting, children[children.length - 1]); + } + data.nodeIsParent(setting, parentNode, true); + + if (index < 0) { + data.nodeChildren(setting, parentNode, children.concat(nodes)); + } else { + params = [index, 0].concat(nodes); + children.splice.apply(children, params); + } + }, + addSelectedNode: function (setting, node) { + var root = data.getRoot(setting); + if (!data.isSelectedNode(setting, node)) { + root.curSelectedList.push(node); + } + }, + addCreatedNode: function (setting, node) { + if (!!setting.callback.onNodeCreated || !!setting.view.addDiyDom) { + var root = data.getRoot(setting); + root.createdNodes.push(node); + } + }, + addZTreeTools: function (zTreeTools) { + _init.zTreeTools.push(zTreeTools); + }, + exSetting: function (s) { + $.extend(true, _setting, s); + }, + fixPIdKeyValue: function (setting, node) { + if (setting.data.simpleData.enable) { + node[setting.data.simpleData.pIdKey] = node.parentTId ? node.getParentNode()[setting.data.simpleData.idKey] : setting.data.simpleData.rootPId; + } + }, + getAfterA: function (setting, node, array) { + for (var i = 0, j = _init.afterA.length; i < j; i++) { + _init.afterA[i].apply(this, arguments); + } + }, + getBeforeA: function (setting, node, array) { + for (var i = 0, j = _init.beforeA.length; i < j; i++) { + _init.beforeA[i].apply(this, arguments); + } + }, + getInnerAfterA: function (setting, node, array) { + for (var i = 0, j = _init.innerAfterA.length; i < j; i++) { + _init.innerAfterA[i].apply(this, arguments); + } + }, + getInnerBeforeA: function (setting, node, array) { + for (var i = 0, j = _init.innerBeforeA.length; i < j; i++) { + _init.innerBeforeA[i].apply(this, arguments); + } + }, + getCache: function (setting) { + return caches[setting.treeId]; + }, + getNodeIndex: function (setting, node) { + if (!node) return null; + var p = node.parentTId ? node.getParentNode() : data.getRoot(setting), + children = data.nodeChildren(setting, p); + for (var i = 0, l = children.length - 1; i <= l; i++) { + if (children[i] === node) { + return i; + } + } + return -1; + }, + getNextNode: function (setting, node) { + if (!node) return null; + var p = node.parentTId ? node.getParentNode() : data.getRoot(setting), + children = data.nodeChildren(setting, p); + for (var i = 0, l = children.length - 1; i <= l; i++) { + if (children[i] === node) { + return (i == l ? null : children[i + 1]); + } + } + return null; + }, + getNodeByParam: function (setting, nodes, key, value) { + if (!nodes || !key) return null; + for (var i = 0, l = nodes.length; i < l; i++) { + var node = nodes[i]; + if (node[key] == value) { + return nodes[i]; + } + var children = data.nodeChildren(setting, node); + var tmp = data.getNodeByParam(setting, children, key, value); + if (tmp) return tmp; + } + return null; + }, + getNodeCache: function (setting, tId) { + if (!tId) return null; + var n = caches[setting.treeId].nodes[data.getNodeCacheId(tId)]; + return n ? n : null; + }, + getNodePath: function (setting, node) { + if (!node) return null; + + var path; + if (node.parentTId) { + path = node.getParentNode().getPath(); + } else { + path = []; + } + + if (path) { + path.push(node); + } + + return path; + }, + getNodes: function (setting) { + return data.nodeChildren(setting, data.getRoot(setting)); + }, + getNodesByParam: function (setting, nodes, key, value) { + if (!nodes || !key) return []; + var result = []; + for (var i = 0, l = nodes.length; i < l; i++) { + var node = nodes[i]; + if (node[key] == value) { + result.push(node); + } + var children = data.nodeChildren(setting, node); + result = result.concat(data.getNodesByParam(setting, children, key, value)); + } + return result; + }, + getNodesByParamFuzzy: function (setting, nodes, key, value) { + if (!nodes || !key) return []; + var result = []; + value = value.toLowerCase(); + for (var i = 0, l = nodes.length; i < l; i++) { + var node = nodes[i]; + if (typeof node[key] == "string" && nodes[i][key].toLowerCase().indexOf(value) > -1) { + result.push(node); + } + var children = data.nodeChildren(setting, node); + result = result.concat(data.getNodesByParamFuzzy(setting, children, key, value)); + } + return result; + }, + getNodesByFilter: function (setting, nodes, filter, isSingle, invokeParam) { + if (!nodes) return (isSingle ? null : []); + var result = isSingle ? null : []; + for (var i = 0, l = nodes.length; i < l; i++) { + var node = nodes[i]; + if (tools.apply(filter, [node, invokeParam], false)) { + if (isSingle) { + return node; + } + result.push(node); + } + var children = data.nodeChildren(setting, node); + var tmpResult = data.getNodesByFilter(setting, children, filter, isSingle, invokeParam); + if (isSingle && !!tmpResult) { + return tmpResult; + } + result = isSingle ? tmpResult : result.concat(tmpResult); + } + return result; + }, + getPreNode: function (setting, node) { + if (!node) return null; + var p = node.parentTId ? node.getParentNode() : data.getRoot(setting), + children = data.nodeChildren(setting, p); + for (var i = 0, l = children.length; i < l; i++) { + if (children[i] === node) { + return (i == 0 ? null : children[i - 1]); + } + } + return null; + }, + getRoot: function (setting) { + return setting ? roots[setting.treeId] : null; + }, + getRoots: function () { + return roots; + }, + getSetting: function (treeId) { + return settings[treeId]; + }, + getSettings: function () { + return settings; + }, + getZTreeTools: function (treeId) { + var r = this.getRoot(this.getSetting(treeId)); + return r ? r.treeTools : null; + }, + initCache: function (setting) { + for (var i = 0, j = _init.caches.length; i < j; i++) { + _init.caches[i].apply(this, arguments); + } + }, + initNode: function (setting, level, node, parentNode, preNode, nextNode) { + for (var i = 0, j = _init.nodes.length; i < j; i++) { + _init.nodes[i].apply(this, arguments); + } + }, + initRoot: function (setting) { + for (var i = 0, j = _init.roots.length; i < j; i++) { + _init.roots[i].apply(this, arguments); + } + }, + isSelectedNode: function (setting, node) { + var root = data.getRoot(setting); + for (var i = 0, j = root.curSelectedList.length; i < j; i++) { + if (node === root.curSelectedList[i]) return true; + } + return false; + }, + nodeChildren: function (setting, node, newChildren) { + if (!node) { + return null; + } + var key = setting.data.key.children; + if (typeof newChildren !== 'undefined') { + node[key] = newChildren; + } + return node[key]; + }, + nodeIsParent: function (setting, node, newIsParent) { + if (!node) { + return false; + } + var key = setting.data.key.isParent; + if (typeof newIsParent !== 'undefined') { + if (typeof newIsParent === "string") { + newIsParent = tools.eqs(newIsParent, "true"); + } + newIsParent = !!newIsParent; + node[key] = newIsParent; + } else if (typeof node[key] == "string"){ + node[key] = tools.eqs(node[key], "true"); + } else { + node[key] = !!node[key]; + } + return node[key]; + }, + nodeName: function (setting, node, newName) { + var key = setting.data.key.name; + if (typeof newName !== 'undefined') { + node[key] = newName; + } + return "" + node[key]; + }, + nodeTitle: function (setting, node) { + var t = setting.data.key.title === "" ? setting.data.key.name : setting.data.key.title; + return "" + node[t]; + }, + removeNodeCache: function (setting, node) { + var children = data.nodeChildren(setting, node); + if (children) { + for (var i = 0, l = children.length; i < l; i++) { + data.removeNodeCache(setting, children[i]); + } + } + data.getCache(setting).nodes[data.getNodeCacheId(node.tId)] = null; + }, + removeSelectedNode: function (setting, node) { + var root = data.getRoot(setting); + for (var i = 0, j = root.curSelectedList.length; i < j; i++) { + if (node === root.curSelectedList[i] || !data.getNodeCache(setting, root.curSelectedList[i].tId)) { + root.curSelectedList.splice(i, 1); + setting.treeObj.trigger(consts.event.UNSELECTED, [setting.treeId, node]); + i--; + j--; + } + } + }, + setCache: function (setting, cache) { + caches[setting.treeId] = cache; + }, + setRoot: function (setting, root) { + roots[setting.treeId] = root; + }, + setZTreeTools: function (setting, zTreeTools) { + for (var i = 0, j = _init.zTreeTools.length; i < j; i++) { + _init.zTreeTools[i].apply(this, arguments); + } + }, + transformToArrayFormat: function (setting, nodes) { + if (!nodes) return []; + var r = []; + if (tools.isArray(nodes)) { + for (var i = 0, l = nodes.length; i < l; i++) { + var node = nodes[i]; + _do(node); + } + } else { + _do(nodes); + } + return r; + + function _do(_node) { + r.push(_node); + var children = data.nodeChildren(setting, _node); + if (children) { + r = r.concat(data.transformToArrayFormat(setting, children)); + } + } + }, + transformTozTreeFormat: function (setting, sNodes) { + var i, l, + key = setting.data.simpleData.idKey, + parentKey = setting.data.simpleData.pIdKey; + if (!key || key == "" || !sNodes) return []; + + if (tools.isArray(sNodes)) { + var r = []; + var tmpMap = {}; + for (i = 0, l = sNodes.length; i < l; i++) { + tmpMap[sNodes[i][key]] = sNodes[i]; + } + for (i = 0, l = sNodes.length; i < l; i++) { + var p = tmpMap[sNodes[i][parentKey]]; + if (p && sNodes[i][key] != sNodes[i][parentKey]) { + var children = data.nodeChildren(setting, p); + if (!children) { + children = data.nodeChildren(setting, p, []); + } + children.push(sNodes[i]); + } else { + r.push(sNodes[i]); + } + } + return r; + } else { + return [sNodes]; + } + } + }, + //method of event proxy + event = { + bindEvent: function (setting) { + for (var i = 0, j = _init.bind.length; i < j; i++) { + _init.bind[i].apply(this, arguments); + } + }, + unbindEvent: function (setting) { + for (var i = 0, j = _init.unbind.length; i < j; i++) { + _init.unbind[i].apply(this, arguments); + } + }, + bindTree: function (setting) { + var eventParam = { + treeId: setting.treeId + }, + o = setting.treeObj; + if (!setting.view.txtSelectedEnable) { + // for can't select text + o.bind('selectstart', handler.onSelectStart).css({ + "-moz-user-select": "-moz-none" + }); + } + o.bind('click', eventParam, event.proxy); + o.bind('dblclick', eventParam, event.proxy); + o.bind('mouseover', eventParam, event.proxy); + o.bind('mouseout', eventParam, event.proxy); + o.bind('mousedown', eventParam, event.proxy); + o.bind('mouseup', eventParam, event.proxy); + o.bind('contextmenu', eventParam, event.proxy); + }, + unbindTree: function (setting) { + var o = setting.treeObj; + o.unbind('selectstart', handler.onSelectStart) + .unbind('click', event.proxy) + .unbind('dblclick', event.proxy) + .unbind('mouseover', event.proxy) + .unbind('mouseout', event.proxy) + .unbind('mousedown', event.proxy) + .unbind('mouseup', event.proxy) + .unbind('contextmenu', event.proxy); + }, + doProxy: function (e) { + var results = []; + for (var i = 0, j = _init.proxys.length; i < j; i++) { + var proxyResult = _init.proxys[i].apply(this, arguments); + results.push(proxyResult); + if (proxyResult.stop) { + break; + } + } + return results; + }, + proxy: function (e) { + var setting = data.getSetting(e.data.treeId); + if (!tools.uCanDo(setting, e)) return true; + var results = event.doProxy(e), + r = true, x = false; + for (var i = 0, l = results.length; i < l; i++) { + var proxyResult = results[i]; + if (proxyResult.nodeEventCallback) { + x = true; + r = proxyResult.nodeEventCallback.apply(proxyResult, [e, proxyResult.node]) && r; + } + if (proxyResult.treeEventCallback) { + x = true; + r = proxyResult.treeEventCallback.apply(proxyResult, [e, proxyResult.node]) && r; + } + } + return r; + } + }, + //method of event handler + handler = { + onSwitchNode: function (event, node) { + var setting = data.getSetting(event.data.treeId); + if (node.open) { + if (tools.apply(setting.callback.beforeCollapse, [setting.treeId, node], true) == false) return true; + data.getRoot(setting).expandTriggerFlag = true; + view.switchNode(setting, node); + } else { + if (tools.apply(setting.callback.beforeExpand, [setting.treeId, node], true) == false) return true; + data.getRoot(setting).expandTriggerFlag = true; + view.switchNode(setting, node); + } + return true; + }, + onClickNode: function (event, node) { + var setting = data.getSetting(event.data.treeId), + clickFlag = ((setting.view.autoCancelSelected && (event.ctrlKey || event.metaKey)) && data.isSelectedNode(setting, node)) ? 0 : (setting.view.autoCancelSelected && (event.ctrlKey || event.metaKey) && setting.view.selectedMulti) ? 2 : 1; + if (tools.apply(setting.callback.beforeClick, [setting.treeId, node, clickFlag], true) == false) return true; + if (clickFlag === 0) { + view.cancelPreSelectedNode(setting, node); + } else { + view.selectNode(setting, node, clickFlag === 2); + } + setting.treeObj.trigger(consts.event.CLICK, [event, setting.treeId, node, clickFlag]); + return true; + }, + onZTreeMousedown: function (event, node) { + var setting = data.getSetting(event.data.treeId); + if (tools.apply(setting.callback.beforeMouseDown, [setting.treeId, node], true)) { + tools.apply(setting.callback.onMouseDown, [event, setting.treeId, node]); + } + return true; + }, + onZTreeMouseup: function (event, node) { + var setting = data.getSetting(event.data.treeId); + if (tools.apply(setting.callback.beforeMouseUp, [setting.treeId, node], true)) { + tools.apply(setting.callback.onMouseUp, [event, setting.treeId, node]); + } + return true; + }, + onZTreeDblclick: function (event, node) { + var setting = data.getSetting(event.data.treeId); + if (tools.apply(setting.callback.beforeDblClick, [setting.treeId, node], true)) { + tools.apply(setting.callback.onDblClick, [event, setting.treeId, node]); + } + return true; + }, + onZTreeContextmenu: function (event, node) { + var setting = data.getSetting(event.data.treeId); + if (tools.apply(setting.callback.beforeRightClick, [setting.treeId, node], true)) { + tools.apply(setting.callback.onRightClick, [event, setting.treeId, node]); + } + return (typeof setting.callback.onRightClick) != "function"; + }, + onSelectStart: function (e) { + var n = e.originalEvent.srcElement.nodeName.toLowerCase(); + return (n === "input" || n === "textarea"); + } + }, + //method of tools for zTree + tools = { + apply: function (fun, param, defaultValue) { + if ((typeof fun) == "function") { + return fun.apply(zt, param ? param : []); + } + return defaultValue; + }, + canAsync: function (setting, node) { + var children = data.nodeChildren(setting, node); + var isParent = data.nodeIsParent(setting, node); + return (setting.async.enable && node && isParent && !(node.zAsync || (children && children.length > 0))); + }, + clone: function (obj) { + if (obj === null) return null; + var o = tools.isArray(obj) ? [] : {}; + for (var i in obj) { + o[i] = (obj[i] instanceof Date) ? new Date(obj[i].getTime()) : (typeof obj[i] === "object" ? tools.clone(obj[i]) : obj[i]); + } + return o; + }, + eqs: function (str1, str2) { + return str1.toLowerCase() === str2.toLowerCase(); + }, + isArray: function (arr) { + return Object.prototype.toString.apply(arr) === "[object Array]"; + }, + isElement: function (o) { + return ( + typeof HTMLElement === "object" ? o instanceof HTMLElement : //DOM2 + o && typeof o === "object" && o !== null && o.nodeType === 1 && typeof o.nodeName === "string" + ); + }, + $: function (node, exp, setting) { + if (!!exp && typeof exp != "string") { + setting = exp; + exp = ""; + } + if (typeof node == "string") { + return $(node, setting ? setting.treeObj.get(0).ownerDocument : null); + } else { + return $("#" + node.tId + exp, setting ? setting.treeObj : null); + } + }, + getMDom: function (setting, curDom, targetExpr) { + if (!curDom) return null; + while (curDom && curDom.id !== setting.treeId) { + for (var i = 0, l = targetExpr.length; curDom.tagName && i < l; i++) { + if (tools.eqs(curDom.tagName, targetExpr[i].tagName) && curDom.getAttribute(targetExpr[i].attrName) !== null) { + return curDom; + } + } + curDom = curDom.parentNode; + } + return null; + }, + getNodeMainDom: function (target) { + return ($(target).parent("li").get(0) || $(target).parentsUntil("li").parent().get(0)); + }, + isChildOrSelf: function (dom, parentId) { + return ($(dom).closest("#" + parentId).length > 0); + }, + uCanDo: function (setting, e) { + return true; + } + }, + //method of operate ztree dom + view = { + addNodes: function (setting, parentNode, index, newNodes, isSilent) { + var isParent = data.nodeIsParent(setting, parentNode); + if (setting.data.keep.leaf && parentNode && !isParent) { + return; + } + if (!tools.isArray(newNodes)) { + newNodes = [newNodes]; + } + if (setting.data.simpleData.enable) { + newNodes = data.transformTozTreeFormat(setting, newNodes); + } + if (parentNode) { + var target_switchObj = $$(parentNode, consts.id.SWITCH, setting), + target_icoObj = $$(parentNode, consts.id.ICON, setting), + target_ulObj = $$(parentNode, consts.id.UL, setting); + + if (!parentNode.open) { + view.replaceSwitchClass(parentNode, target_switchObj, consts.folder.CLOSE); + view.replaceIcoClass(parentNode, target_icoObj, consts.folder.CLOSE); + parentNode.open = false; + target_ulObj.css({ + "display": "none" + }); + } + + data.addNodesData(setting, parentNode, index, newNodes); + view.createNodes(setting, parentNode.level + 1, newNodes, parentNode, index); + if (!isSilent) { + view.expandCollapseParentNode(setting, parentNode, true); + } + } else { + data.addNodesData(setting, data.getRoot(setting), index, newNodes); + view.createNodes(setting, 0, newNodes, null, index); + } + }, + appendNodes: function (setting, level, nodes, parentNode, index, initFlag, openFlag) { + if (!nodes) return []; + var html = []; + + var tmpPNode = (parentNode) ? parentNode : data.getRoot(setting), + tmpPChild = data.nodeChildren(setting, tmpPNode), + isFirstNode, isLastNode; + + if (!tmpPChild || index >= tmpPChild.length - nodes.length) { + index = -1; + } + + for (var i = 0, l = nodes.length; i < l; i++) { + var node = nodes[i]; + if (initFlag) { + isFirstNode = ((index === 0 || tmpPChild.length == nodes.length) && (i == 0)); + isLastNode = (index < 0 && i == (nodes.length - 1)); + data.initNode(setting, level, node, parentNode, isFirstNode, isLastNode, openFlag); + data.addNodeCache(setting, node); + } + var isParent = data.nodeIsParent(setting, node); + + var childHtml = []; + var children = data.nodeChildren(setting, node); + if (children && children.length > 0) { + //make child html first, because checkType + childHtml = view.appendNodes(setting, level + 1, children, node, -1, initFlag, openFlag && node.open); + } + if (openFlag) { + view.makeDOMNodeMainBefore(html, setting, node); + view.makeDOMNodeLine(html, setting, node); + data.getBeforeA(setting, node, html); + view.makeDOMNodeNameBefore(html, setting, node); + data.getInnerBeforeA(setting, node, html); + view.makeDOMNodeIcon(html, setting, node); + data.getInnerAfterA(setting, node, html); + view.makeDOMNodeNameAfter(html, setting, node); + data.getAfterA(setting, node, html); + if (isParent && node.open) { + view.makeUlHtml(setting, node, html, childHtml.join('')); + } + view.makeDOMNodeMainAfter(html, setting, node); + data.addCreatedNode(setting, node); + } + } + return html; + }, + appendParentULDom: function (setting, node) { + var html = [], + nObj = $$(node, setting); + if (!nObj.get(0) && !!node.parentTId) { + view.appendParentULDom(setting, node.getParentNode()); + nObj = $$(node, setting); + } + var ulObj = $$(node, consts.id.UL, setting); + if (ulObj.get(0)) { + ulObj.remove(); + } + var children = data.nodeChildren(setting, node), + childHtml = view.appendNodes(setting, node.level + 1, children, node, -1, false, true); + view.makeUlHtml(setting, node, html, childHtml.join('')); + nObj.append(html.join('')); + }, + asyncNode: function (setting, node, isSilent, callback) { + var i, l; + var isParent = data.nodeIsParent(setting, node); + if (node && !isParent) { + tools.apply(callback); + return false; + } else if (node && node.isAjaxing) { + return false; + } else if (tools.apply(setting.callback.beforeAsync, [setting.treeId, node], true) == false) { + tools.apply(callback); + return false; + } + if (node) { + node.isAjaxing = true; + var icoObj = $$(node, consts.id.ICON, setting); + icoObj.attr({"style": "", "class": consts.className.BUTTON + " " + consts.className.ICO_LOADING}); + } + + var tmpParam = {}; + var autoParam = tools.apply(setting.async.autoParam, [setting.treeId, node], setting.async.autoParam); + for (i = 0, l = autoParam.length; node && i < l; i++) { + var pKey = autoParam[i].split("="), spKey = pKey; + if (pKey.length > 1) { + spKey = pKey[1]; + pKey = pKey[0]; + } + tmpParam[spKey] = node[pKey]; + } + var otherParam = tools.apply(setting.async.otherParam, [setting.treeId, node], setting.async.otherParam); + if (tools.isArray(otherParam)) { + for (i = 0, l = otherParam.length; i < l; i += 2) { + tmpParam[otherParam[i]] = otherParam[i + 1]; + } + } else { + for (var p in otherParam) { + tmpParam[p] = otherParam[p]; + } + } + + var _tmpV = data.getRoot(setting)._ver; + $.ajax({ + contentType: setting.async.contentType, + cache: false, + type: setting.async.type, + url: tools.apply(setting.async.url, [setting.treeId, node], setting.async.url), + data: setting.async.contentType.indexOf('application/json') > -1 ? JSON.stringify(tmpParam) : tmpParam, + dataType: setting.async.dataType, + headers: setting.async.headers, + xhrFields: setting.async.xhrFields, + success: function (msg) { + if (_tmpV != data.getRoot(setting)._ver) { + return; + } + var newNodes = []; + try { + if (!msg || msg.length == 0) { + newNodes = []; + } else if (typeof msg == "string") { + newNodes = eval("(" + msg + ")"); + } else { + newNodes = msg; + } + } catch (err) { + newNodes = msg; + } + + if (node) { + node.isAjaxing = null; + node.zAsync = true; + } + view.setNodeLineIcos(setting, node); + if (newNodes && newNodes !== "") { + newNodes = tools.apply(setting.async.dataFilter, [setting.treeId, node, newNodes], newNodes); + view.addNodes(setting, node, -1, !!newNodes ? tools.clone(newNodes) : [], !!isSilent); + } else { + view.addNodes(setting, node, -1, [], !!isSilent); + } + setting.treeObj.trigger(consts.event.ASYNC_SUCCESS, [setting.treeId, node, msg]); + tools.apply(callback); + }, + error: function (XMLHttpRequest, textStatus, errorThrown) { + if (_tmpV != data.getRoot(setting)._ver) { + return; + } + if (node) node.isAjaxing = null; + view.setNodeLineIcos(setting, node); + setting.treeObj.trigger(consts.event.ASYNC_ERROR, [setting.treeId, node, XMLHttpRequest, textStatus, errorThrown]); + } + }); + return true; + }, + cancelPreSelectedNode: function (setting, node, excludeNode) { + var list = data.getRoot(setting).curSelectedList, + i, n; + for (i = list.length - 1; i >= 0; i--) { + n = list[i]; + if (node === n || (!node && (!excludeNode || excludeNode !== n))) { + $$(n, consts.id.A, setting).removeClass(consts.node.CURSELECTED); + if (node) { + data.removeSelectedNode(setting, node); + break; + } else { + list.splice(i, 1); + setting.treeObj.trigger(consts.event.UNSELECTED, [setting.treeId, n]); + } + } + } + }, + createNodeCallback: function (setting) { + if (!!setting.callback.onNodeCreated || !!setting.view.addDiyDom) { + var root = data.getRoot(setting); + while (root.createdNodes.length > 0) { + var node = root.createdNodes.shift(); + tools.apply(setting.view.addDiyDom, [setting.treeId, node]); + if (!!setting.callback.onNodeCreated) { + setting.treeObj.trigger(consts.event.NODECREATED, [setting.treeId, node]); + } + } + } + }, + createNodes: function (setting, level, nodes, parentNode, index) { + if (!nodes || nodes.length == 0) return; + var root = data.getRoot(setting), + openFlag = !parentNode || parentNode.open || !!$$(data.nodeChildren(setting, parentNode)[0], setting).get(0); + root.createdNodes = []; + var zTreeHtml = view.appendNodes(setting, level, nodes, parentNode, index, true, openFlag), + parentObj, nextObj; + + if (!parentNode) { + parentObj = setting.treeObj; + //setting.treeObj.append(zTreeHtml.join('')); + } else { + var ulObj = $$(parentNode, consts.id.UL, setting); + if (ulObj.get(0)) { + parentObj = ulObj; + //ulObj.append(zTreeHtml.join('')); + } + } + if (parentObj) { + if (index >= 0) { + nextObj = parentObj.children()[index]; + } + if (index >= 0 && nextObj) { + $(nextObj).before(zTreeHtml.join('')); + } else { + parentObj.append(zTreeHtml.join('')); + } + } + + view.createNodeCallback(setting); + }, + destroy: function (setting) { + if (!setting) return; + data.initCache(setting); + data.initRoot(setting); + event.unbindTree(setting); + event.unbindEvent(setting); + setting.treeObj.empty(); + delete settings[setting.treeId]; + }, + expandCollapseNode: function (setting, node, expandFlag, animateFlag, callback) { + var root = data.getRoot(setting); + var tmpCb, _callback; + if (!node) { + tools.apply(callback, []); + return; + } + var children = data.nodeChildren(setting, node); + var isParent = data.nodeIsParent(setting, node); + if (root.expandTriggerFlag) { + _callback = callback; + tmpCb = function () { + if (_callback) _callback(); + if (node.open) { + setting.treeObj.trigger(consts.event.EXPAND, [setting.treeId, node]); + } else { + setting.treeObj.trigger(consts.event.COLLAPSE, [setting.treeId, node]); + } + }; + callback = tmpCb; + root.expandTriggerFlag = false; + } + if (!node.open && isParent && ((!$$(node, consts.id.UL, setting).get(0)) || (children && children.length > 0 && !$$(children[0], setting).get(0)))) { + view.appendParentULDom(setting, node); + view.createNodeCallback(setting); + } + if (node.open == expandFlag) { + tools.apply(callback, []); + return; + } + var ulObj = $$(node, consts.id.UL, setting), + switchObj = $$(node, consts.id.SWITCH, setting), + icoObj = $$(node, consts.id.ICON, setting); + + if (isParent) { + node.open = !node.open; + if (node.iconOpen && node.iconClose) { + icoObj.attr("style", view.makeNodeIcoStyle(setting, node)); + } + + if (node.open) { + view.replaceSwitchClass(node, switchObj, consts.folder.OPEN); + view.replaceIcoClass(node, icoObj, consts.folder.OPEN); + if (animateFlag == false || setting.view.expandSpeed == "") { + ulObj.show(); + tools.apply(callback, []); + } else { + if (children && children.length > 0) { + ulObj.slideDown(setting.view.expandSpeed, callback); + } else { + ulObj.show(); + tools.apply(callback, []); + } + } + } else { + view.replaceSwitchClass(node, switchObj, consts.folder.CLOSE); + view.replaceIcoClass(node, icoObj, consts.folder.CLOSE); + if (animateFlag == false || setting.view.expandSpeed == "" || !(children && children.length > 0)) { + ulObj.hide(); + tools.apply(callback, []); + } else { + ulObj.slideUp(setting.view.expandSpeed, callback); + } + } + } else { + tools.apply(callback, []); + } + }, + expandCollapseParentNode: function (setting, node, expandFlag, animateFlag, callback) { + if (!node) return; + if (!node.parentTId) { + view.expandCollapseNode(setting, node, expandFlag, animateFlag, callback); + return; + } else { + view.expandCollapseNode(setting, node, expandFlag, animateFlag); + } + if (node.parentTId) { + view.expandCollapseParentNode(setting, node.getParentNode(), expandFlag, animateFlag, callback); + } + }, + expandCollapseSonNode: function (setting, node, expandFlag, animateFlag, callback) { + var root = data.getRoot(setting), + treeNodes = (node) ? data.nodeChildren(setting, node) : data.nodeChildren(setting, root), + selfAnimateSign = (node) ? false : animateFlag, + expandTriggerFlag = data.getRoot(setting).expandTriggerFlag; + data.getRoot(setting).expandTriggerFlag = false; + if (treeNodes) { + for (var i = 0, l = treeNodes.length; i < l; i++) { + if (treeNodes[i]) view.expandCollapseSonNode(setting, treeNodes[i], expandFlag, selfAnimateSign); + } + } + data.getRoot(setting).expandTriggerFlag = expandTriggerFlag; + view.expandCollapseNode(setting, node, expandFlag, animateFlag, callback); + }, + isSelectedNode: function (setting, node) { + if (!node) { + return false; + } + var list = data.getRoot(setting).curSelectedList, + i; + for (i = list.length - 1; i >= 0; i--) { + if (node === list[i]) { + return true; + } + } + return false; + }, + makeDOMNodeIcon: function (html, setting, node) { + var nameStr = data.nodeName(setting, node), + name = setting.view.nameIsHTML ? nameStr : nameStr.replace(/&/g, '&').replace(//g, '>'); + html.push("", name, ""); + }, + makeDOMNodeLine: function (html, setting, node) { + html.push(""); + }, + makeDOMNodeMainAfter: function (html, setting, node) { + html.push(""); + }, + makeDOMNodeMainBefore: function (html, setting, node) { + html.push("
                            • "); + }, + makeDOMNodeNameAfter: function (html, setting, node) { + html.push(""); + }, + makeDOMNodeNameBefore: function (html, setting, node) { + var title = data.nodeTitle(setting, node), + url = view.makeNodeUrl(setting, node), + fontcss = view.makeNodeFontCss(setting, node), + fontStyle = []; + for (var f in fontcss) { + fontStyle.push(f, ":", fontcss[f], ";"); + } + html.push(" 0) ? "href='" + url + "'" : ""), " target='", view.makeNodeTarget(node), "' style='", fontStyle.join(''), + "'"); + if (tools.apply(setting.view.showTitle, [setting.treeId, node], setting.view.showTitle) && title) { + html.push("title='", title.replace(/'/g, "'").replace(//g, '>'), "'"); + } + html.push(">"); + }, + makeNodeFontCss: function (setting, node) { + var fontCss = tools.apply(setting.view.fontCss, [setting.treeId, node], setting.view.fontCss); + return (fontCss && ((typeof fontCss) != "function")) ? fontCss : {}; + }, + makeNodeIcoClass: function (setting, node) { + var icoCss = ["ico"]; + if (!node.isAjaxing) { + var isParent = data.nodeIsParent(setting, node); + icoCss[0] = (node.iconSkin ? node.iconSkin + "_" : "") + icoCss[0]; + if (isParent) { + icoCss.push(node.open ? consts.folder.OPEN : consts.folder.CLOSE); + } else { + icoCss.push(consts.folder.DOCU); + } + } + return consts.className.BUTTON + " " + icoCss.join('_'); + }, + makeNodeIcoStyle: function (setting, node) { + var icoStyle = []; + if (!node.isAjaxing) { + var isParent = data.nodeIsParent(setting, node); + var icon = (isParent && node.iconOpen && node.iconClose) ? (node.open ? node.iconOpen : node.iconClose) : node[setting.data.key.icon]; + if (icon) icoStyle.push("background:url(", icon, ") 0 0 no-repeat;"); + if (setting.view.showIcon == false || !tools.apply(setting.view.showIcon, [setting.treeId, node], true)) { + icoStyle.push("width:0px;height:0px;"); + } + } + return icoStyle.join(''); + }, + makeNodeLineClass: function (setting, node) { + var lineClass = []; + if (setting.view.showLine) { + if (node.level == 0 && node.isFirstNode && node.isLastNode) { + lineClass.push(consts.line.ROOT); + } else if (node.level == 0 && node.isFirstNode) { + lineClass.push(consts.line.ROOTS); + } else if (node.isLastNode) { + lineClass.push(consts.line.BOTTOM); + } else { + lineClass.push(consts.line.CENTER); + } + } else { + lineClass.push(consts.line.NOLINE); + } + if (data.nodeIsParent(setting, node)) { + lineClass.push(node.open ? consts.folder.OPEN : consts.folder.CLOSE); + } else { + lineClass.push(consts.folder.DOCU); + } + return view.makeNodeLineClassEx(node) + lineClass.join('_'); + }, + makeNodeLineClassEx: function (node) { + return consts.className.BUTTON + " " + consts.className.LEVEL + node.level + " " + consts.className.SWITCH + " "; + }, + makeNodeTarget: function (node) { + return (node.target || "_blank"); + }, + makeNodeUrl: function (setting, node) { + var urlKey = setting.data.key.url; + return node[urlKey] ? node[urlKey] : null; + }, + makeUlHtml: function (setting, node, html, content) { + html.push("
                                "); + html.push(content); + html.push("
                              "); + }, + makeUlLineClass: function (setting, node) { + return ((setting.view.showLine && !node.isLastNode) ? consts.line.LINE : ""); + }, + removeChildNodes: function (setting, node) { + if (!node) return; + var nodes = data.nodeChildren(setting, node); + if (!nodes) return; + + for (var i = 0, l = nodes.length; i < l; i++) { + data.removeNodeCache(setting, nodes[i]); + } + data.removeSelectedNode(setting); + delete node[setting.data.key.children]; + + if (!setting.data.keep.parent) { + data.nodeIsParent(setting, node, false); + node.open = false; + var tmp_switchObj = $$(node, consts.id.SWITCH, setting), + tmp_icoObj = $$(node, consts.id.ICON, setting); + view.replaceSwitchClass(node, tmp_switchObj, consts.folder.DOCU); + view.replaceIcoClass(node, tmp_icoObj, consts.folder.DOCU); + $$(node, consts.id.UL, setting).remove(); + } else { + $$(node, consts.id.UL, setting).empty(); + } + }, + scrollIntoView: function (setting, dom) { + if (!dom) { + return; + } + // support IE 7 + if (typeof Element === 'undefined') { + var contRect = setting.treeObj.get(0).getBoundingClientRect(), + findMeRect = dom.getBoundingClientRect(); + if (findMeRect.top < contRect.top || findMeRect.bottom > contRect.bottom + || findMeRect.right > contRect.right || findMeRect.left < contRect.left) { + dom.scrollIntoView(); + } + return; + } + // CC-BY jocki84@googlemail.com, https://gist.github.com/jocki84/6ffafd003387179a988e + if (!Element.prototype.scrollIntoViewIfNeeded) { + Element.prototype.scrollIntoViewIfNeeded = function (centerIfNeeded) { + "use strict"; + + function makeRange(start, length) { + return {"start": start, "length": length, "end": start + length}; + } + + function coverRange(inner, outer) { + if ( + false === centerIfNeeded || + (outer.start < inner.end && inner.start < outer.end) + ) { + return Math.max( + inner.end - outer.length, + Math.min(outer.start, inner.start) + ); + } + return (inner.start + inner.end - outer.length) / 2; + } + + function makePoint(x, y) { + return { + "x": x, + "y": y, + "translate": function translate(dX, dY) { + return makePoint(x + dX, y + dY); + } + }; + } + + function absolute(elem, pt) { + while (elem) { + pt = pt.translate(elem.offsetLeft, elem.offsetTop); + elem = elem.offsetParent; + } + return pt; + } + + var target = absolute(this, makePoint(0, 0)), + extent = makePoint(this.offsetWidth, this.offsetHeight), + elem = this.parentNode, + origin; + + while (elem instanceof HTMLElement) { + // Apply desired scroll amount. + origin = absolute(elem, makePoint(elem.clientLeft, elem.clientTop)); + elem.scrollLeft = coverRange( + makeRange(target.x - origin.x, extent.x), + makeRange(elem.scrollLeft, elem.clientWidth) + ); + elem.scrollTop = coverRange( + makeRange(target.y - origin.y, extent.y), + makeRange(elem.scrollTop, elem.clientHeight) + ); + + // Determine actual scroll amount by reading back scroll properties. + target = target.translate(-elem.scrollLeft, -elem.scrollTop); + elem = elem.parentNode; + } + }; + } + dom.scrollIntoViewIfNeeded(); + }, + setFirstNode: function (setting, parentNode) { + var children = data.nodeChildren(setting, parentNode); + if (children.length > 0) { + children[0].isFirstNode = true; + } + }, + setLastNode: function (setting, parentNode) { + var children = data.nodeChildren(setting, parentNode); + if (children.length > 0) { + children[children.length - 1].isLastNode = true; + } + }, + removeNode: function (setting, node) { + var root = data.getRoot(setting), + parentNode = (node.parentTId) ? node.getParentNode() : root; + + node.isFirstNode = false; + node.isLastNode = false; + node.getPreNode = function () { + return null; + }; + node.getNextNode = function () { + return null; + }; + + if (!data.getNodeCache(setting, node.tId)) { + return; + } + + $$(node, setting).remove(); + data.removeNodeCache(setting, node); + data.removeSelectedNode(setting, node); + + var children = data.nodeChildren(setting, parentNode); + for (var i = 0, l = children.length; i < l; i++) { + if (children[i].tId == node.tId) { + children.splice(i, 1); + break; + } + } + view.setFirstNode(setting, parentNode); + view.setLastNode(setting, parentNode); + + var tmp_ulObj, tmp_switchObj, tmp_icoObj, + childLength = children.length; + + //repair nodes old parent + if (!setting.data.keep.parent && childLength == 0) { + //old parentNode has no child nodes + data.nodeIsParent(setting, parentNode, false); + parentNode.open = false; + delete parentNode[setting.data.key.children]; + tmp_ulObj = $$(parentNode, consts.id.UL, setting); + tmp_switchObj = $$(parentNode, consts.id.SWITCH, setting); + tmp_icoObj = $$(parentNode, consts.id.ICON, setting); + view.replaceSwitchClass(parentNode, tmp_switchObj, consts.folder.DOCU); + view.replaceIcoClass(parentNode, tmp_icoObj, consts.folder.DOCU); + tmp_ulObj.css("display", "none"); + + } else if (setting.view.showLine && childLength > 0) { + //old parentNode has child nodes + var newLast = children[childLength - 1]; + tmp_ulObj = $$(newLast, consts.id.UL, setting); + tmp_switchObj = $$(newLast, consts.id.SWITCH, setting); + tmp_icoObj = $$(newLast, consts.id.ICON, setting); + if (parentNode == root) { + if (children.length == 1) { + //node was root, and ztree has only one root after move node + view.replaceSwitchClass(newLast, tmp_switchObj, consts.line.ROOT); + } else { + var tmp_first_switchObj = $$(children[0], consts.id.SWITCH, setting); + view.replaceSwitchClass(children[0], tmp_first_switchObj, consts.line.ROOTS); + view.replaceSwitchClass(newLast, tmp_switchObj, consts.line.BOTTOM); + } + } else { + view.replaceSwitchClass(newLast, tmp_switchObj, consts.line.BOTTOM); + } + tmp_ulObj.removeClass(consts.line.LINE); + } + }, + replaceIcoClass: function (node, obj, newName) { + if (!obj || node.isAjaxing) return; + var tmpName = obj.attr("class"); + if (tmpName == undefined) return; + var tmpList = tmpName.split("_"); + switch (newName) { + case consts.folder.OPEN: + case consts.folder.CLOSE: + case consts.folder.DOCU: + tmpList[tmpList.length - 1] = newName; + break; + } + obj.attr("class", tmpList.join("_")); + }, + replaceSwitchClass: function (node, obj, newName) { + if (!obj) return; + var tmpName = obj.attr("class"); + if (tmpName == undefined) return; + var tmpList = tmpName.split("_"); + switch (newName) { + case consts.line.ROOT: + case consts.line.ROOTS: + case consts.line.CENTER: + case consts.line.BOTTOM: + case consts.line.NOLINE: + tmpList[0] = view.makeNodeLineClassEx(node) + newName; + break; + case consts.folder.OPEN: + case consts.folder.CLOSE: + case consts.folder.DOCU: + tmpList[1] = newName; + break; + } + obj.attr("class", tmpList.join("_")); + if (newName !== consts.folder.DOCU) { + obj.removeAttr("disabled"); + } else { + obj.attr("disabled", "disabled"); + } + }, + selectNode: function (setting, node, addFlag) { + if (!addFlag) { + view.cancelPreSelectedNode(setting, null, node); + } + $$(node, consts.id.A, setting).addClass(consts.node.CURSELECTED); + data.addSelectedNode(setting, node); + setting.treeObj.trigger(consts.event.SELECTED, [setting.treeId, node]); + }, + setNodeFontCss: function (setting, treeNode) { + var aObj = $$(treeNode, consts.id.A, setting), + fontCss = view.makeNodeFontCss(setting, treeNode); + if (fontCss) { + aObj.css(fontCss); + } + }, + setNodeLineIcos: function (setting, node) { + if (!node) return; + var switchObj = $$(node, consts.id.SWITCH, setting), + ulObj = $$(node, consts.id.UL, setting), + icoObj = $$(node, consts.id.ICON, setting), + ulLine = view.makeUlLineClass(setting, node); + if (ulLine.length == 0) { + ulObj.removeClass(consts.line.LINE); + } else { + ulObj.addClass(ulLine); + } + switchObj.attr("class", view.makeNodeLineClass(setting, node)); + if (data.nodeIsParent(setting, node)) { + switchObj.removeAttr("disabled"); + } else { + switchObj.attr("disabled", "disabled"); + } + icoObj.removeAttr("style"); + icoObj.attr("style", view.makeNodeIcoStyle(setting, node)); + icoObj.attr("class", view.makeNodeIcoClass(setting, node)); + }, + setNodeName: function (setting, node) { + var title = data.nodeTitle(setting, node), + nObj = $$(node, consts.id.SPAN, setting); + nObj.empty(); + if (setting.view.nameIsHTML) { + nObj.html(data.nodeName(setting, node)); + } else { + nObj.text(data.nodeName(setting, node)); + } + if (tools.apply(setting.view.showTitle, [setting.treeId, node], setting.view.showTitle)) { + var aObj = $$(node, consts.id.A, setting); + aObj.attr("title", !title ? "" : title); + } + }, + setNodeTarget: function (setting, node) { + var aObj = $$(node, consts.id.A, setting); + aObj.attr("target", view.makeNodeTarget(node)); + }, + setNodeUrl: function (setting, node) { + var aObj = $$(node, consts.id.A, setting), + url = view.makeNodeUrl(setting, node); + if (url == null || url.length == 0) { + aObj.removeAttr("href"); + } else { + aObj.attr("href", url); + } + }, + switchNode: function (setting, node) { + if (node.open || !tools.canAsync(setting, node)) { + view.expandCollapseNode(setting, node, !node.open); + } else if (setting.async.enable) { + if (!view.asyncNode(setting, node)) { + view.expandCollapseNode(setting, node, !node.open); + return; + } + } else if (node) { + view.expandCollapseNode(setting, node, !node.open); + } + } + }; + // zTree defind + $.fn.zTree = { + consts: _consts, + _z: { + tools: tools, + view: view, + event: event, + data: data + }, + getZTreeObj: function (treeId) { + var o = data.getZTreeTools(treeId); + return o ? o : null; + }, + destroy: function (treeId) { + if (!!treeId && treeId.length > 0) { + view.destroy(data.getSetting(treeId)); + } else { + for (var s in settings) { + view.destroy(settings[s]); + } + } + }, + init: function (obj, zSetting, zNodes) { + var setting = tools.clone(_setting); + $.extend(true, setting, zSetting); + setting.treeId = obj.attr("id"); + setting.treeObj = obj; + setting.treeObj.empty(); + settings[setting.treeId] = setting; + //For some older browser,(e.g., ie6) + if (typeof document.body.style.maxHeight === "undefined") { + setting.view.expandSpeed = ""; + } + data.initRoot(setting); + var root = data.getRoot(setting); + zNodes = zNodes ? tools.clone(tools.isArray(zNodes) ? zNodes : [zNodes]) : []; + if (setting.data.simpleData.enable) { + data.nodeChildren(setting, root, data.transformTozTreeFormat(setting, zNodes)); + } else { + data.nodeChildren(setting, root, zNodes); + } + + data.initCache(setting); + event.unbindTree(setting); + event.bindTree(setting); + event.unbindEvent(setting); + event.bindEvent(setting); + + var zTreeTools = { + setting: setting, + addNodes: function (parentNode, index, newNodes, isSilent) { + if (!parentNode) parentNode = null; + var isParent = data.nodeIsParent(setting, parentNode); + if (parentNode && !isParent && setting.data.keep.leaf) return null; + + var i = parseInt(index, 10); + if (isNaN(i)) { + isSilent = !!newNodes; + newNodes = index; + index = -1; + } else { + index = i; + } + if (!newNodes) return null; + + + var xNewNodes = tools.clone(tools.isArray(newNodes) ? newNodes : [newNodes]); + + function addCallback() { + view.addNodes(setting, parentNode, index, xNewNodes, (isSilent == true)); + } + + if (tools.canAsync(setting, parentNode)) { + view.asyncNode(setting, parentNode, isSilent, addCallback); + } else { + addCallback(); + } + return xNewNodes; + }, + cancelSelectedNode: function (node) { + view.cancelPreSelectedNode(setting, node); + }, + destroy: function () { + view.destroy(setting); + }, + expandAll: function (expandFlag) { + expandFlag = !!expandFlag; + view.expandCollapseSonNode(setting, null, expandFlag, true); + return expandFlag; + }, + expandNode: function (node, expandFlag, sonSign, focus, callbackFlag) { + if (!node || !data.nodeIsParent(setting, node)) return null; + if (expandFlag !== true && expandFlag !== false) { + expandFlag = !node.open; + } + callbackFlag = !!callbackFlag; + + if (callbackFlag && expandFlag && (tools.apply(setting.callback.beforeExpand, [setting.treeId, node], true) == false)) { + return null; + } else if (callbackFlag && !expandFlag && (tools.apply(setting.callback.beforeCollapse, [setting.treeId, node], true) == false)) { + return null; + } + if (expandFlag && node.parentTId) { + view.expandCollapseParentNode(setting, node.getParentNode(), expandFlag, false); + } + if (expandFlag === node.open && !sonSign) { + return null; + } + + data.getRoot(setting).expandTriggerFlag = callbackFlag; + if (!tools.canAsync(setting, node) && sonSign) { + view.expandCollapseSonNode(setting, node, expandFlag, true, showNodeFocus); + } else { + node.open = !expandFlag; + view.switchNode(this.setting, node); + showNodeFocus(); + } + return expandFlag; + + function showNodeFocus() { + var a = $$(node, setting).get(0); + if (a && focus !== false) { + view.scrollIntoView(setting, a); + } + } + }, + getNodes: function () { + return data.getNodes(setting); + }, + getNodeByParam: function (key, value, parentNode) { + if (!key) return null; + return data.getNodeByParam(setting, parentNode ? data.nodeChildren(setting, parentNode) : data.getNodes(setting), key, value); + }, + getNodeByTId: function (tId) { + return data.getNodeCache(setting, tId); + }, + getNodesByParam: function (key, value, parentNode) { + if (!key) return null; + return data.getNodesByParam(setting, parentNode ? data.nodeChildren(setting, parentNode) : data.getNodes(setting), key, value); + }, + getNodesByParamFuzzy: function (key, value, parentNode) { + if (!key) return null; + return data.getNodesByParamFuzzy(setting, parentNode ? data.nodeChildren(setting, parentNode) : data.getNodes(setting), key, value); + }, + getNodesByFilter: function (filter, isSingle, parentNode, invokeParam) { + isSingle = !!isSingle; + if (!filter || (typeof filter != "function")) return (isSingle ? null : []); + return data.getNodesByFilter(setting, parentNode ? data.nodeChildren(setting, parentNode) : data.getNodes(setting), filter, isSingle, invokeParam); + }, + getNodeIndex: function (node) { + if (!node) return null; + var parentNode = (node.parentTId) ? node.getParentNode() : data.getRoot(setting); + var children = data.nodeChildren(setting, parentNode); + for (var i = 0, l = children.length; i < l; i++) { + if (children[i] == node) return i; + } + return -1; + }, + getSelectedNodes: function () { + var r = [], list = data.getRoot(setting).curSelectedList; + for (var i = 0, l = list.length; i < l; i++) { + r.push(list[i]); + } + return r; + }, + isSelectedNode: function (node) { + return data.isSelectedNode(setting, node); + }, + reAsyncChildNodesPromise: function (parentNode, reloadType, isSilent) { + var promise = new Promise(function (resolve, reject) { + try { + zTreeTools.reAsyncChildNodes(parentNode, reloadType, isSilent, function () { + resolve(parentNode); + }); + } catch (e) { + reject(e); + } + }); + return promise; + }, + reAsyncChildNodes: function (parentNode, reloadType, isSilent, callback) { + if (!this.setting.async.enable) return; + var isRoot = !parentNode; + if (isRoot) { + parentNode = data.getRoot(setting); + } + if (reloadType == "refresh") { + var children = data.nodeChildren(setting, parentNode); + for (var i = 0, l = children ? children.length : 0; i < l; i++) { + data.removeNodeCache(setting, children[i]); + } + data.removeSelectedNode(setting); + data.nodeChildren(setting, parentNode, []); + if (isRoot) { + this.setting.treeObj.empty(); + } else { + var ulObj = $$(parentNode, consts.id.UL, setting); + ulObj.empty(); + } + } + view.asyncNode(this.setting, isRoot ? null : parentNode, !!isSilent, callback); + }, + refresh: function () { + this.setting.treeObj.empty(); + var root = data.getRoot(setting), + nodes = data.nodeChildren(setting, root); + data.initRoot(setting); + data.nodeChildren(setting, root, nodes); + data.initCache(setting); + view.createNodes(setting, 0, data.nodeChildren(setting, root), null, -1); + }, + removeChildNodes: function (node) { + if (!node) return null; + var nodes = data.nodeChildren(setting, node); + view.removeChildNodes(setting, node); + return nodes ? nodes : null; + }, + removeNode: function (node, callbackFlag) { + if (!node) return; + callbackFlag = !!callbackFlag; + if (callbackFlag && tools.apply(setting.callback.beforeRemove, [setting.treeId, node], true) == false) return; + view.removeNode(setting, node); + if (callbackFlag) { + this.setting.treeObj.trigger(consts.event.REMOVE, [setting.treeId, node]); + } + }, + selectNode: function (node, addFlag, isSilent) { + if (!node) return; + if (tools.uCanDo(setting)) { + addFlag = setting.view.selectedMulti && addFlag; + if (node.parentTId) { + view.expandCollapseParentNode(setting, node.getParentNode(), true, false, showNodeFocus); + } else if (!isSilent) { + try { + $$(node, setting).focus().blur(); + } catch (e) { + } + } + view.selectNode(setting, node, addFlag); + } + + function showNodeFocus() { + if (isSilent) { + return; + } + var a = $$(node, setting).get(0); + view.scrollIntoView(setting, a); + } + }, + transformTozTreeNodes: function (simpleNodes) { + return data.transformTozTreeFormat(setting, simpleNodes); + }, + transformToArray: function (nodes) { + return data.transformToArrayFormat(setting, nodes); + }, + updateNode: function (node, checkTypeFlag) { + if (!node) return; + var nObj = $$(node, setting); + if (nObj.get(0) && tools.uCanDo(setting)) { + view.setNodeName(setting, node); + view.setNodeTarget(setting, node); + view.setNodeUrl(setting, node); + view.setNodeLineIcos(setting, node); + view.setNodeFontCss(setting, node); + } + } + }; + root.treeTools = zTreeTools; + data.setZTreeTools(setting, zTreeTools); + var children = data.nodeChildren(setting, root); + if (children && children.length > 0) { + view.createNodes(setting, 0, children, null, -1); + } else if (setting.async.enable && setting.async.url && setting.async.url !== '') { + view.asyncNode(setting); + } + return zTreeTools; + } + }; + + var zt = $.fn.zTree, + $$ = tools.$, + consts = zt.consts; +})(jQuery); +/* + * JQuery zTree excheck v3.5.40 + * http://treejs.cn/ + * + * Copyright (c) 2010 Hunter.z + * + * Licensed same as jquery - MIT License + * http://www.opensource.org/licenses/mit-license.php + * + * email: hunter.z@263.net + * Date: 2019-01-18 + */ +(function ($) { + //default consts of excheck + var _consts = { + event: { + CHECK: "ztree_check" + }, + id: { + CHECK: "_check" + }, + checkbox: { + STYLE: "checkbox", + DEFAULT: "chk", + DISABLED: "disable", + FALSE: "false", + TRUE: "true", + FULL: "full", + PART: "part", + FOCUS: "focus" + }, + radio: { + STYLE: "radio", + TYPE_ALL: "all", + TYPE_LEVEL: "level" + } + }, + //default setting of excheck + _setting = { + check: { + enable: false, + autoCheckTrigger: false, + chkStyle: _consts.checkbox.STYLE, + nocheckInherit: false, + chkDisabledInherit: false, + radioType: _consts.radio.TYPE_LEVEL, + chkboxType: { + "Y": "ps", + "N": "ps" + } + }, + data: { + key: { + checked: "checked" + } + }, + callback: { + beforeCheck: null, + onCheck: null + } + }, + //default root of excheck + _initRoot = function (setting) { + var r = data.getRoot(setting); + r.radioCheckedList = []; + }, + //default cache of excheck + _initCache = function (treeId) { + }, + //default bind event of excheck + _bindEvent = function (setting) { + var o = setting.treeObj, + c = consts.event; + o.bind(c.CHECK, function (event, srcEvent, treeId, node) { + event.srcEvent = srcEvent; + tools.apply(setting.callback.onCheck, [event, treeId, node]); + }); + }, + _unbindEvent = function (setting) { + var o = setting.treeObj, + c = consts.event; + o.unbind(c.CHECK); + }, + //default event proxy of excheck + _eventProxy = function (e) { + var target = e.target, + setting = data.getSetting(e.data.treeId), + tId = "", node = null, + nodeEventType = "", treeEventType = "", + nodeEventCallback = null, treeEventCallback = null; + + if (tools.eqs(e.type, "mouseover")) { + if (setting.check.enable && tools.eqs(target.tagName, "span") && target.getAttribute("treeNode" + consts.id.CHECK) !== null) { + tId = tools.getNodeMainDom(target).id; + nodeEventType = "mouseoverCheck"; + } + } else if (tools.eqs(e.type, "mouseout")) { + if (setting.check.enable && tools.eqs(target.tagName, "span") && target.getAttribute("treeNode" + consts.id.CHECK) !== null) { + tId = tools.getNodeMainDom(target).id; + nodeEventType = "mouseoutCheck"; + } + } else if (tools.eqs(e.type, "click")) { + if (setting.check.enable && tools.eqs(target.tagName, "span") && target.getAttribute("treeNode" + consts.id.CHECK) !== null) { + tId = tools.getNodeMainDom(target).id; + nodeEventType = "checkNode"; + } + } + if (tId.length > 0) { + node = data.getNodeCache(setting, tId); + switch (nodeEventType) { + case "checkNode" : + nodeEventCallback = _handler.onCheckNode; + break; + case "mouseoverCheck" : + nodeEventCallback = _handler.onMouseoverCheck; + break; + case "mouseoutCheck" : + nodeEventCallback = _handler.onMouseoutCheck; + break; + } + } + var proxyResult = { + stop: nodeEventType === "checkNode", + node: node, + nodeEventType: nodeEventType, + nodeEventCallback: nodeEventCallback, + treeEventType: treeEventType, + treeEventCallback: treeEventCallback + }; + return proxyResult + }, + //default init node of excheck + _initNode = function (setting, level, n, parentNode, isFirstNode, isLastNode, openFlag) { + if (!n) return; + var checked = data.nodeChecked(setting, n); + n.checkedOld = checked; + if (typeof n.nocheck == "string") n.nocheck = tools.eqs(n.nocheck, "true"); + n.nocheck = !!n.nocheck || (setting.check.nocheckInherit && parentNode && !!parentNode.nocheck); + if (typeof n.chkDisabled == "string") n.chkDisabled = tools.eqs(n.chkDisabled, "true"); + n.chkDisabled = !!n.chkDisabled || (setting.check.chkDisabledInherit && parentNode && !!parentNode.chkDisabled); + if (typeof n.halfCheck == "string") n.halfCheck = tools.eqs(n.halfCheck, "true"); + n.halfCheck = !!n.halfCheck; + n.check_Child_State = -1; + n.check_Focus = false; + n.getCheckStatus = function () { + return data.getCheckStatus(setting, n); + }; + + if (setting.check.chkStyle == consts.radio.STYLE && setting.check.radioType == consts.radio.TYPE_ALL && checked) { + var r = data.getRoot(setting); + r.radioCheckedList.push(n); + } + }, + //add dom for check + _beforeA = function (setting, node, html) { + if (setting.check.enable) { + data.makeChkFlag(setting, node); + html.push(""); + } + }, + //update zTreeObj, add method of check + _zTreeTools = function (setting, zTreeTools) { + zTreeTools.checkNode = function (node, checked, checkTypeFlag, callbackFlag) { + var nodeChecked = data.nodeChecked(setting, node); + if (node.chkDisabled === true) return; + if (checked !== true && checked !== false) { + checked = !nodeChecked; + } + callbackFlag = !!callbackFlag; + + if (nodeChecked === checked && !checkTypeFlag) { + return; + } else if (callbackFlag && tools.apply(this.setting.callback.beforeCheck, [this.setting.treeId, node], true) == false) { + return; + } + if (tools.uCanDo(this.setting) && this.setting.check.enable && node.nocheck !== true) { + data.nodeChecked(setting, node, checked); + var checkObj = $$(node, consts.id.CHECK, this.setting); + if (checkTypeFlag || this.setting.check.chkStyle === consts.radio.STYLE) view.checkNodeRelation(this.setting, node); + view.setChkClass(this.setting, checkObj, node); + view.repairParentChkClassWithSelf(this.setting, node); + if (callbackFlag) { + this.setting.treeObj.trigger(consts.event.CHECK, [null, this.setting.treeId, node]); + } + } + } + + zTreeTools.checkAllNodes = function (checked) { + view.repairAllChk(this.setting, !!checked); + } + + zTreeTools.getCheckedNodes = function (checked) { + var checked = (checked !== false); + var children = data.nodeChildren(setting, data.getRoot(this.setting)); + return data.getTreeCheckedNodes(this.setting, children, checked); + } + + zTreeTools.getChangeCheckedNodes = function () { + var children = data.nodeChildren(setting, data.getRoot(this.setting)); + return data.getTreeChangeCheckedNodes(this.setting, children); + } + + zTreeTools.setChkDisabled = function (node, disabled, inheritParent, inheritChildren) { + disabled = !!disabled; + inheritParent = !!inheritParent; + inheritChildren = !!inheritChildren; + view.repairSonChkDisabled(this.setting, node, disabled, inheritChildren); + view.repairParentChkDisabled(this.setting, node.getParentNode(), disabled, inheritParent); + } + + var _updateNode = zTreeTools.updateNode; + zTreeTools.updateNode = function (node, checkTypeFlag) { + if (_updateNode) _updateNode.apply(zTreeTools, arguments); + if (!node || !this.setting.check.enable) return; + var nObj = $$(node, this.setting); + if (nObj.get(0) && tools.uCanDo(this.setting)) { + var checkObj = $$(node, consts.id.CHECK, this.setting); + if (checkTypeFlag == true || this.setting.check.chkStyle === consts.radio.STYLE) view.checkNodeRelation(this.setting, node); + view.setChkClass(this.setting, checkObj, node); + view.repairParentChkClassWithSelf(this.setting, node); + } + } + }, + //method of operate data + _data = { + getRadioCheckedList: function (setting) { + var checkedList = data.getRoot(setting).radioCheckedList; + for (var i = 0, j = checkedList.length; i < j; i++) { + if (!data.getNodeCache(setting, checkedList[i].tId)) { + checkedList.splice(i, 1); + i--; + j--; + } + } + return checkedList; + }, + getCheckStatus: function (setting, node) { + if (!setting.check.enable || node.nocheck || node.chkDisabled) return null; + var checked = data.nodeChecked(setting, node), + r = { + checked: checked, + half: node.halfCheck ? node.halfCheck : (setting.check.chkStyle == consts.radio.STYLE ? (node.check_Child_State === 2) : (checked ? (node.check_Child_State > -1 && node.check_Child_State < 2) : (node.check_Child_State > 0))) + }; + return r; + }, + getTreeCheckedNodes: function (setting, nodes, checked, results) { + if (!nodes) return []; + var onlyOne = (checked && setting.check.chkStyle == consts.radio.STYLE && setting.check.radioType == consts.radio.TYPE_ALL); + results = !results ? [] : results; + for (var i = 0, l = nodes.length; i < l; i++) { + var node = nodes[i]; + var children = data.nodeChildren(setting, node); + var nodeChecked = data.nodeChecked(setting, node); + if (node.nocheck !== true && node.chkDisabled !== true && nodeChecked == checked) { + results.push(node); + if (onlyOne) { + break; + } + } + data.getTreeCheckedNodes(setting, children, checked, results); + if (onlyOne && results.length > 0) { + break; + } + } + return results; + }, + getTreeChangeCheckedNodes: function (setting, nodes, results) { + if (!nodes) return []; + results = !results ? [] : results; + for (var i = 0, l = nodes.length; i < l; i++) { + var node = nodes[i]; + var children = data.nodeChildren(setting, node); + var nodeChecked = data.nodeChecked(setting, node); + if (node.nocheck !== true && node.chkDisabled !== true && nodeChecked != node.checkedOld) { + results.push(node); + } + data.getTreeChangeCheckedNodes(setting, children, results); + } + return results; + }, + makeChkFlag: function (setting, node) { + if (!node) return; + var chkFlag = -1; + var children = data.nodeChildren(setting, node); + if (children) { + for (var i = 0, l = children.length; i < l; i++) { + var cNode = children[i]; + var nodeChecked = data.nodeChecked(setting, cNode); + var tmp = -1; + if (setting.check.chkStyle == consts.radio.STYLE) { + if (cNode.nocheck === true || cNode.chkDisabled === true) { + tmp = cNode.check_Child_State; + } else if (cNode.halfCheck === true) { + tmp = 2; + } else if (nodeChecked) { + tmp = 2; + } else { + tmp = cNode.check_Child_State > 0 ? 2 : 0; + } + if (tmp == 2) { + chkFlag = 2; + break; + } else if (tmp == 0) { + chkFlag = 0; + } + } else if (setting.check.chkStyle == consts.checkbox.STYLE) { + if (cNode.nocheck === true || cNode.chkDisabled === true) { + tmp = cNode.check_Child_State; + } else if (cNode.halfCheck === true) { + tmp = 1; + } else if (nodeChecked) { + tmp = (cNode.check_Child_State === -1 || cNode.check_Child_State === 2) ? 2 : 1; + } else { + tmp = (cNode.check_Child_State > 0) ? 1 : 0; + } + if (tmp === 1) { + chkFlag = 1; + break; + } else if (tmp === 2 && chkFlag > -1 && i > 0 && tmp !== chkFlag) { + chkFlag = 1; + break; + } else if (chkFlag === 2 && tmp > -1 && tmp < 2) { + chkFlag = 1; + break; + } else if (tmp > -1) { + chkFlag = tmp; + } + } + } + } + node.check_Child_State = chkFlag; + } + }, + //method of event proxy + _event = {}, + //method of event handler + _handler = { + onCheckNode: function (event, node) { + if (node.chkDisabled === true) return false; + var setting = data.getSetting(event.data.treeId); + if (tools.apply(setting.callback.beforeCheck, [setting.treeId, node], true) == false) return true; + var nodeChecked = data.nodeChecked(setting, node); + data.nodeChecked(setting, node, !nodeChecked); + view.checkNodeRelation(setting, node); + var checkObj = $$(node, consts.id.CHECK, setting); + view.setChkClass(setting, checkObj, node); + view.repairParentChkClassWithSelf(setting, node); + setting.treeObj.trigger(consts.event.CHECK, [event, setting.treeId, node]); + return true; + }, + onMouseoverCheck: function (event, node) { + if (node.chkDisabled === true) return false; + var setting = data.getSetting(event.data.treeId), + checkObj = $$(node, consts.id.CHECK, setting); + node.check_Focus = true; + view.setChkClass(setting, checkObj, node); + return true; + }, + onMouseoutCheck: function (event, node) { + if (node.chkDisabled === true) return false; + var setting = data.getSetting(event.data.treeId), + checkObj = $$(node, consts.id.CHECK, setting); + node.check_Focus = false; + view.setChkClass(setting, checkObj, node); + return true; + } + }, + //method of tools for zTree + _tools = {}, + //method of operate ztree dom + _view = { + checkNodeRelation: function (setting, node) { + var pNode, i, l, + r = consts.radio; + var nodeChecked = data.nodeChecked(setting, node); + if (setting.check.chkStyle == r.STYLE) { + var checkedList = data.getRadioCheckedList(setting); + if (nodeChecked) { + if (setting.check.radioType == r.TYPE_ALL) { + for (i = checkedList.length - 1; i >= 0; i--) { + pNode = checkedList[i]; + var pNodeChecked = data.nodeChecked(setting, pNode); + if (pNodeChecked && pNode != node) { + data.nodeChecked(setting, pNode, false); + checkedList.splice(i, 1); + + view.setChkClass(setting, $$(pNode, consts.id.CHECK, setting), pNode); + if (pNode.parentTId != node.parentTId) { + view.repairParentChkClassWithSelf(setting, pNode); + } + } + } + checkedList.push(node); + } else { + var parentNode = (node.parentTId) ? node.getParentNode() : data.getRoot(setting); + var children = data.nodeChildren(setting, parentNode); + for (i = 0, l = children.length; i < l; i++) { + pNode = children[i]; + var pNodeChecked = data.nodeChecked(setting, pNode); + if (pNodeChecked && pNode != node) { + data.nodeChecked(setting, pNode, false); + view.setChkClass(setting, $$(pNode, consts.id.CHECK, setting), pNode); + } + } + } + } else if (setting.check.radioType == r.TYPE_ALL) { + for (i = 0, l = checkedList.length; i < l; i++) { + if (node == checkedList[i]) { + checkedList.splice(i, 1); + break; + } + } + } + + } else { + var children = data.nodeChildren(setting, node); + if (nodeChecked && (!children || children.length == 0 || setting.check.chkboxType.Y.indexOf("s") > -1)) { + view.setSonNodeCheckBox(setting, node, true); + } + if (!nodeChecked && (!children || children.length == 0 || setting.check.chkboxType.N.indexOf("s") > -1)) { + view.setSonNodeCheckBox(setting, node, false); + } + if (nodeChecked && setting.check.chkboxType.Y.indexOf("p") > -1) { + view.setParentNodeCheckBox(setting, node, true); + } + if (!nodeChecked && setting.check.chkboxType.N.indexOf("p") > -1) { + view.setParentNodeCheckBox(setting, node, false); + } + } + }, + makeChkClass: function (setting, node) { + var c = consts.checkbox, r = consts.radio, + fullStyle = ""; + var nodeChecked = data.nodeChecked(setting, node); + if (node.chkDisabled === true) { + fullStyle = c.DISABLED; + } else if (node.halfCheck) { + fullStyle = c.PART; + } else if (setting.check.chkStyle == r.STYLE) { + fullStyle = (node.check_Child_State < 1) ? c.FULL : c.PART; + } else { + fullStyle = nodeChecked ? ((node.check_Child_State === 2 || node.check_Child_State === -1) ? c.FULL : c.PART) : ((node.check_Child_State < 1) ? c.FULL : c.PART); + } + var chkName = setting.check.chkStyle + "_" + (nodeChecked ? c.TRUE : c.FALSE) + "_" + fullStyle; + chkName = (node.check_Focus && node.chkDisabled !== true) ? chkName + "_" + c.FOCUS : chkName; + return consts.className.BUTTON + " " + c.DEFAULT + " " + chkName; + }, + repairAllChk: function (setting, checked) { + if (setting.check.enable && setting.check.chkStyle === consts.checkbox.STYLE) { + var root = data.getRoot(setting); + var children = data.nodeChildren(setting, root); + for (var i = 0, l = children.length; i < l; i++) { + var node = children[i]; + if (node.nocheck !== true && node.chkDisabled !== true) { + data.nodeChecked(setting, node, checked); + } + view.setSonNodeCheckBox(setting, node, checked); + } + } + }, + repairChkClass: function (setting, node) { + if (!node) return; + data.makeChkFlag(setting, node); + if (node.nocheck !== true) { + var checkObj = $$(node, consts.id.CHECK, setting); + view.setChkClass(setting, checkObj, node); + } + }, + repairParentChkClass: function (setting, node) { + if (!node || !node.parentTId) return; + var pNode = node.getParentNode(); + view.repairChkClass(setting, pNode); + view.repairParentChkClass(setting, pNode); + }, + repairParentChkClassWithSelf: function (setting, node) { + if (!node) return; + var children = data.nodeChildren(setting, node); + if (children && children.length > 0) { + view.repairParentChkClass(setting, children[0]); + } else { + view.repairParentChkClass(setting, node); + } + }, + repairSonChkDisabled: function (setting, node, chkDisabled, inherit) { + if (!node) return; + if (node.chkDisabled != chkDisabled) { + node.chkDisabled = chkDisabled; + } + view.repairChkClass(setting, node); + var children = data.nodeChildren(setting, node); + if (children && inherit) { + for (var i = 0, l = children.length; i < l; i++) { + var sNode = children[i]; + view.repairSonChkDisabled(setting, sNode, chkDisabled, inherit); + } + } + }, + repairParentChkDisabled: function (setting, node, chkDisabled, inherit) { + if (!node) return; + if (node.chkDisabled != chkDisabled && inherit) { + node.chkDisabled = chkDisabled; + } + view.repairChkClass(setting, node); + view.repairParentChkDisabled(setting, node.getParentNode(), chkDisabled, inherit); + }, + setChkClass: function (setting, obj, node) { + if (!obj) return; + if (node.nocheck === true) { + obj.hide(); + } else { + obj.show(); + } + obj.attr('class', view.makeChkClass(setting, node)); + }, + setParentNodeCheckBox: function (setting, node, value, srcNode) { + var checkObj = $$(node, consts.id.CHECK, setting); + if (!srcNode) srcNode = node; + data.makeChkFlag(setting, node); + if (node.nocheck !== true && node.chkDisabled !== true) { + data.nodeChecked(setting, node, value); + view.setChkClass(setting, checkObj, node); + if (setting.check.autoCheckTrigger && node != srcNode) { + setting.treeObj.trigger(consts.event.CHECK, [null, setting.treeId, node]); + } + } + if (node.parentTId) { + var pSign = true; + if (!value) { + var pNodes = data.nodeChildren(setting, node.getParentNode()); + for (var i = 0, l = pNodes.length; i < l; i++) { + var pNode = pNodes[i]; + var nodeChecked = data.nodeChecked(setting, pNode); + if ((pNode.nocheck !== true && pNode.chkDisabled !== true && nodeChecked) + || ((pNode.nocheck === true || pNode.chkDisabled === true) && pNode.check_Child_State > 0)) { + pSign = false; + break; + } + } + } + if (pSign) { + view.setParentNodeCheckBox(setting, node.getParentNode(), value, srcNode); + } + } + }, + setSonNodeCheckBox: function (setting, node, value, srcNode) { + if (!node) return; + var checkObj = $$(node, consts.id.CHECK, setting); + if (!srcNode) srcNode = node; + + var hasDisable = false; + var children = data.nodeChildren(setting, node); + if (children) { + for (var i = 0, l = children.length; i < l; i++) { + var sNode = children[i]; + view.setSonNodeCheckBox(setting, sNode, value, srcNode); + if (sNode.chkDisabled === true) hasDisable = true; + } + } + + if (node != data.getRoot(setting) && node.chkDisabled !== true) { + if (hasDisable && node.nocheck !== true) { + data.makeChkFlag(setting, node); + } + if (node.nocheck !== true && node.chkDisabled !== true) { + data.nodeChecked(setting, node, value); + if (!hasDisable) node.check_Child_State = (children && children.length > 0) ? (value ? 2 : 0) : -1; + } else { + node.check_Child_State = -1; + } + view.setChkClass(setting, checkObj, node); + if (setting.check.autoCheckTrigger && node != srcNode && node.nocheck !== true && node.chkDisabled !== true) { + setting.treeObj.trigger(consts.event.CHECK, [null, setting.treeId, node]); + } + } + + } + }, + + _z = { + tools: _tools, + view: _view, + event: _event, + data: _data + }; + $.extend(true, $.fn.zTree.consts, _consts); + $.extend(true, $.fn.zTree._z, _z); + + var zt = $.fn.zTree, + tools = zt._z.tools, + consts = zt.consts, + view = zt._z.view, + data = zt._z.data, + event = zt._z.event, + $$ = tools.$; + + data.nodeChecked = function (setting, node, newChecked) { + if (!node) { + return false; + } + var key = setting.data.key.checked; + if (typeof newChecked !== 'undefined') { + if (typeof newChecked === "string") { + newChecked = tools.eqs(newChecked, "true"); + } + newChecked = !!newChecked; + node[key] = newChecked; + } else if (typeof node[key] == "string"){ + node[key] = tools.eqs(node[key], "true"); + } else { + node[key] = !!node[key]; + } + return node[key]; + }; + + data.exSetting(_setting); + data.addInitBind(_bindEvent); + data.addInitUnBind(_unbindEvent); + data.addInitCache(_initCache); + data.addInitNode(_initNode); + data.addInitProxy(_eventProxy, true); + data.addInitRoot(_initRoot); + data.addBeforeA(_beforeA); + data.addZTreeTools(_zTreeTools); + + var _createNodes = view.createNodes; + view.createNodes = function (setting, level, nodes, parentNode, index) { + if (_createNodes) _createNodes.apply(view, arguments); + if (!nodes) return; + view.repairParentChkClassWithSelf(setting, parentNode); + } + var _removeNode = view.removeNode; + view.removeNode = function (setting, node) { + var parentNode = node.getParentNode(); + if (_removeNode) _removeNode.apply(view, arguments); + if (!node || !parentNode) return; + view.repairChkClass(setting, parentNode); + view.repairParentChkClass(setting, parentNode); + } + + var _appendNodes = view.appendNodes; + view.appendNodes = function (setting, level, nodes, parentNode, index, initFlag, openFlag) { + var html = ""; + if (_appendNodes) { + html = _appendNodes.apply(view, arguments); + } + if (parentNode) { + data.makeChkFlag(setting, parentNode); + } + return html; + } +})(jQuery); +/* + * JQuery zTree exedit v3.5.40 + * http://treejs.cn/ + * + * Copyright (c) 2010 Hunter.z + * + * Licensed same as jquery - MIT License + * http://www.opensource.org/licenses/mit-license.php + * + * email: hunter.z@263.net + * Date: 2019-01-18 + */ +(function ($) { + //default consts of exedit + var _consts = { + event: { + DRAG: "ztree_drag", + DROP: "ztree_drop", + RENAME: "ztree_rename", + DRAGMOVE: "ztree_dragmove" + }, + id: { + EDIT: "_edit", + INPUT: "_input", + REMOVE: "_remove" + }, + move: { + TYPE_INNER: "inner", + TYPE_PREV: "prev", + TYPE_NEXT: "next" + }, + node: { + CURSELECTED_EDIT: "curSelectedNode_Edit", + TMPTARGET_TREE: "tmpTargetzTree", + TMPTARGET_NODE: "tmpTargetNode" + } + }, + //default setting of exedit + _setting = { + edit: { + enable: false, + editNameSelectAll: false, + showRemoveBtn: true, + showRenameBtn: true, + removeTitle: "remove", + renameTitle: "rename", + drag: { + autoExpandTrigger: false, + isCopy: true, + isMove: true, + prev: true, + next: true, + inner: true, + minMoveSize: 5, + borderMax: 10, + borderMin: -5, + maxShowNodeNum: 5, + autoOpenTime: 500 + } + }, + view: { + addHoverDom: null, + removeHoverDom: null + }, + callback: { + beforeDrag: null, + beforeDragOpen: null, + beforeDrop: null, + beforeEditName: null, + beforeRename: null, + onDrag: null, + onDragMove: null, + onDrop: null, + onRename: null + } + }, + //default root of exedit + _initRoot = function (setting) { + var r = data.getRoot(setting), rs = data.getRoots(); + r.curEditNode = null; + r.curEditInput = null; + r.curHoverNode = null; + r.dragFlag = 0; + r.dragNodeShowBefore = []; + r.dragMaskList = new Array(); + rs.showHoverDom = true; + }, + //default cache of exedit + _initCache = function (treeId) { + }, + //default bind event of exedit + _bindEvent = function (setting) { + var o = setting.treeObj; + var c = consts.event; + o.bind(c.RENAME, function (event, treeId, treeNode, isCancel) { + tools.apply(setting.callback.onRename, [event, treeId, treeNode, isCancel]); + }); + + o.bind(c.DRAG, function (event, srcEvent, treeId, treeNodes) { + tools.apply(setting.callback.onDrag, [srcEvent, treeId, treeNodes]); + }); + + o.bind(c.DRAGMOVE, function (event, srcEvent, treeId, treeNodes) { + tools.apply(setting.callback.onDragMove, [srcEvent, treeId, treeNodes]); + }); + + o.bind(c.DROP, function (event, srcEvent, treeId, treeNodes, targetNode, moveType, isCopy) { + tools.apply(setting.callback.onDrop, [srcEvent, treeId, treeNodes, targetNode, moveType, isCopy]); + }); + }, + _unbindEvent = function (setting) { + var o = setting.treeObj; + var c = consts.event; + o.unbind(c.RENAME); + o.unbind(c.DRAG); + o.unbind(c.DRAGMOVE); + o.unbind(c.DROP); + }, + //default event proxy of exedit + _eventProxy = function (e) { + var target = e.target, + setting = data.getSetting(e.data.treeId), + relatedTarget = e.relatedTarget, + tId = "", node = null, + nodeEventType = "", treeEventType = "", + nodeEventCallback = null, treeEventCallback = null, + tmp = null; + + if (tools.eqs(e.type, "mouseover")) { + tmp = tools.getMDom(setting, target, [{tagName: "a", attrName: "treeNode" + consts.id.A}]); + if (tmp) { + tId = tools.getNodeMainDom(tmp).id; + nodeEventType = "hoverOverNode"; + } + } else if (tools.eqs(e.type, "mouseout")) { + tmp = tools.getMDom(setting, relatedTarget, [{tagName: "a", attrName: "treeNode" + consts.id.A}]); + if (!tmp) { + tId = "remove"; + nodeEventType = "hoverOutNode"; + } + } else if (tools.eqs(e.type, "mousedown")) { + tmp = tools.getMDom(setting, target, [{tagName: "a", attrName: "treeNode" + consts.id.A}]); + if (tmp) { + tId = tools.getNodeMainDom(tmp).id; + nodeEventType = "mousedownNode"; + } + } + if (tId.length > 0) { + node = data.getNodeCache(setting, tId); + switch (nodeEventType) { + case "mousedownNode" : + nodeEventCallback = _handler.onMousedownNode; + break; + case "hoverOverNode" : + nodeEventCallback = _handler.onHoverOverNode; + break; + case "hoverOutNode" : + nodeEventCallback = _handler.onHoverOutNode; + break; + } + } + var proxyResult = { + stop: false, + node: node, + nodeEventType: nodeEventType, + nodeEventCallback: nodeEventCallback, + treeEventType: treeEventType, + treeEventCallback: treeEventCallback + }; + return proxyResult + }, + //default init node of exedit + _initNode = function (setting, level, n, parentNode, isFirstNode, isLastNode, openFlag) { + if (!n) return; + n.isHover = false; + n.editNameFlag = false; + }, + //update zTreeObj, add method of edit + _zTreeTools = function (setting, zTreeTools) { + zTreeTools.cancelEditName = function (newName) { + var root = data.getRoot(this.setting); + if (!root.curEditNode) return; + view.cancelCurEditNode(this.setting, newName ? newName : null, true); + } + zTreeTools.copyNode = function (targetNode, node, moveType, isSilent) { + if (!node) return null; + var isParent = data.nodeIsParent(setting, targetNode); + if (targetNode && !isParent && this.setting.data.keep.leaf && moveType === consts.move.TYPE_INNER) return null; + var _this = this, + newNode = tools.clone(node); + if (!targetNode) { + targetNode = null; + moveType = consts.move.TYPE_INNER; + } + if (moveType == consts.move.TYPE_INNER) { + function copyCallback() { + view.addNodes(_this.setting, targetNode, -1, [newNode], isSilent); + } + + if (tools.canAsync(this.setting, targetNode)) { + view.asyncNode(this.setting, targetNode, isSilent, copyCallback); + } else { + copyCallback(); + } + } else { + view.addNodes(this.setting, targetNode.parentNode, -1, [newNode], isSilent); + view.moveNode(this.setting, targetNode, newNode, moveType, false, isSilent); + } + return newNode; + } + zTreeTools.editName = function (node) { + if (!node || !node.tId || node !== data.getNodeCache(this.setting, node.tId)) return; + if (node.parentTId) view.expandCollapseParentNode(this.setting, node.getParentNode(), true); + view.editNode(this.setting, node) + } + zTreeTools.moveNode = function (targetNode, node, moveType, isSilent) { + if (!node) return node; + var isParent = data.nodeIsParent(setting, targetNode); + if (targetNode && !isParent && this.setting.data.keep.leaf && moveType === consts.move.TYPE_INNER) { + return null; + } else if (targetNode && ((node.parentTId == targetNode.tId && moveType == consts.move.TYPE_INNER) || $$(node, this.setting).find("#" + targetNode.tId).length > 0)) { + return null; + } else if (!targetNode) { + targetNode = null; + } + var _this = this; + + function moveCallback() { + view.moveNode(_this.setting, targetNode, node, moveType, false, isSilent); + } + + if (tools.canAsync(this.setting, targetNode) && moveType === consts.move.TYPE_INNER) { + view.asyncNode(this.setting, targetNode, isSilent, moveCallback); + } else { + moveCallback(); + } + return node; + } + zTreeTools.setEditable = function (editable) { + this.setting.edit.enable = editable; + return this.refresh(); + } + }, + //method of operate data + _data = { + setSonNodeLevel: function (setting, parentNode, node) { + if (!node) return; + var children = data.nodeChildren(setting, node); + node.level = (parentNode) ? parentNode.level + 1 : 0; + if (!children) return; + for (var i = 0, l = children.length; i < l; i++) { + if (children[i]) data.setSonNodeLevel(setting, node, children[i]); + } + } + }, + //method of event proxy + _event = {}, + //method of event handler + _handler = { + onHoverOverNode: function (event, node) { + var setting = data.getSetting(event.data.treeId), + root = data.getRoot(setting); + if (root.curHoverNode != node) { + _handler.onHoverOutNode(event); + } + root.curHoverNode = node; + view.addHoverDom(setting, node); + }, + onHoverOutNode: function (event, node) { + var setting = data.getSetting(event.data.treeId), + root = data.getRoot(setting); + if (root.curHoverNode && !data.isSelectedNode(setting, root.curHoverNode)) { + view.removeTreeDom(setting, root.curHoverNode); + root.curHoverNode = null; + } + }, + onMousedownNode: function (eventMouseDown, _node) { + var i, l, + setting = data.getSetting(eventMouseDown.data.treeId), + root = data.getRoot(setting), roots = data.getRoots(); + //right click can't drag & drop + if (eventMouseDown.button == 2 || !setting.edit.enable || (!setting.edit.drag.isCopy && !setting.edit.drag.isMove)) return true; + + //input of edit node name can't drag & drop + var target = eventMouseDown.target, + _nodes = data.getRoot(setting).curSelectedList, + nodes = []; + if (!data.isSelectedNode(setting, _node)) { + nodes = [_node]; + } else { + for (i = 0, l = _nodes.length; i < l; i++) { + if (_nodes[i].editNameFlag && tools.eqs(target.tagName, "input") && target.getAttribute("treeNode" + consts.id.INPUT) !== null) { + return true; + } + nodes.push(_nodes[i]); + if (nodes[0].parentTId !== _nodes[i].parentTId) { + nodes = [_node]; + break; + } + } + } + + view.editNodeBlur = true; + view.cancelCurEditNode(setting); + + var doc = $(setting.treeObj.get(0).ownerDocument), + body = $(setting.treeObj.get(0).ownerDocument.body), curNode, tmpArrow, tmpTarget, + isOtherTree = false, + targetSetting = setting, + sourceSetting = setting, + preNode, nextNode, + preTmpTargetNodeId = null, + preTmpMoveType = null, + tmpTargetNodeId = null, + moveType = consts.move.TYPE_INNER, + mouseDownX = eventMouseDown.clientX, + mouseDownY = eventMouseDown.clientY, + startTime = (new Date()).getTime(); + + if (tools.uCanDo(setting)) { + doc.bind("mousemove", _docMouseMove); + } + + function _docMouseMove(event) { + //avoid start drag after click node + if (root.dragFlag == 0 && Math.abs(mouseDownX - event.clientX) < setting.edit.drag.minMoveSize + && Math.abs(mouseDownY - event.clientY) < setting.edit.drag.minMoveSize) { + return true; + } + var i, l, tmpNode, tmpDom, tmpNodes; + body.css("cursor", "pointer"); + + if (root.dragFlag == 0) { + if (tools.apply(setting.callback.beforeDrag, [setting.treeId, nodes], true) == false) { + _docMouseUp(event); + return true; + } + + for (i = 0, l = nodes.length; i < l; i++) { + if (i == 0) { + root.dragNodeShowBefore = []; + } + tmpNode = nodes[i]; + if (data.nodeIsParent(setting, tmpNode) && tmpNode.open) { + view.expandCollapseNode(setting, tmpNode, !tmpNode.open); + root.dragNodeShowBefore[tmpNode.tId] = true; + } else { + root.dragNodeShowBefore[tmpNode.tId] = false; + } + } + + root.dragFlag = 1; + roots.showHoverDom = false; + tools.showIfameMask(setting, true); + + //sort + var isOrder = true, lastIndex = -1; + if (nodes.length > 1) { + var pNodes = nodes[0].parentTId ? data.nodeChildren(setting, nodes[0].getParentNode()) : data.getNodes(setting); + tmpNodes = []; + for (i = 0, l = pNodes.length; i < l; i++) { + if (root.dragNodeShowBefore[pNodes[i].tId] !== undefined) { + if (isOrder && lastIndex > -1 && (lastIndex + 1) !== i) { + isOrder = false; + } + tmpNodes.push(pNodes[i]); + lastIndex = i; + } + if (nodes.length === tmpNodes.length) { + nodes = tmpNodes; + break; + } + } + } + if (isOrder) { + preNode = nodes[0].getPreNode(); + nextNode = nodes[nodes.length - 1].getNextNode(); + } + + //set node in selected + curNode = $$("
                                ", setting); + for (i = 0, l = nodes.length; i < l; i++) { + tmpNode = nodes[i]; + tmpNode.editNameFlag = false; + view.selectNode(setting, tmpNode, i > 0); + view.removeTreeDom(setting, tmpNode); + + if (i > setting.edit.drag.maxShowNodeNum - 1) { + continue; + } + + tmpDom = $$("
                              • ", setting); + tmpDom.append($$(tmpNode, consts.id.A, setting).clone()); + tmpDom.css("padding", "0"); + tmpDom.children("#" + tmpNode.tId + consts.id.A).removeClass(consts.node.CURSELECTED); + curNode.append(tmpDom); + if (i == setting.edit.drag.maxShowNodeNum - 1) { + tmpDom = $$("
                              • ...
                              • ", setting); + curNode.append(tmpDom); + } + } + curNode.attr("id", nodes[0].tId + consts.id.UL + "_tmp"); + curNode.addClass(setting.treeObj.attr("class")); + curNode.appendTo(body); + + tmpArrow = $$("", setting); + tmpArrow.attr("id", "zTreeMove_arrow_tmp"); + tmpArrow.appendTo(body); + + setting.treeObj.trigger(consts.event.DRAG, [event, setting.treeId, nodes]); + } + + if (root.dragFlag == 1) { + if (tmpTarget && tmpArrow.attr("id") == event.target.id && tmpTargetNodeId && (event.clientX + doc.scrollLeft() + 2) > ($("#" + tmpTargetNodeId + consts.id.A, tmpTarget).offset().left)) { + var xT = $("#" + tmpTargetNodeId + consts.id.A, tmpTarget); + event.target = (xT.length > 0) ? xT.get(0) : event.target; + } else if (tmpTarget) { + tmpTarget.removeClass(consts.node.TMPTARGET_TREE); + if (tmpTargetNodeId) $("#" + tmpTargetNodeId + consts.id.A, tmpTarget).removeClass(consts.node.TMPTARGET_NODE + "_" + consts.move.TYPE_PREV) + .removeClass(consts.node.TMPTARGET_NODE + "_" + _consts.move.TYPE_NEXT).removeClass(consts.node.TMPTARGET_NODE + "_" + _consts.move.TYPE_INNER); + } + tmpTarget = null; + tmpTargetNodeId = null; + + //judge drag & drop in multi ztree + isOtherTree = false; + targetSetting = setting; + var settings = data.getSettings(); + for (var s in settings) { + if (settings[s].treeId && settings[s].edit.enable && settings[s].treeId != setting.treeId + && (event.target.id == settings[s].treeId || $(event.target).parents("#" + settings[s].treeId).length > 0)) { + isOtherTree = true; + targetSetting = settings[s]; + } + } + + var docScrollTop = doc.scrollTop(), + docScrollLeft = doc.scrollLeft(), + treeOffset = targetSetting.treeObj.offset(), + scrollHeight = targetSetting.treeObj.get(0).scrollHeight, + scrollWidth = targetSetting.treeObj.get(0).scrollWidth, + dTop = (event.clientY + docScrollTop - treeOffset.top), + dBottom = (targetSetting.treeObj.height() + treeOffset.top - event.clientY - docScrollTop), + dLeft = (event.clientX + docScrollLeft - treeOffset.left), + dRight = (targetSetting.treeObj.width() + treeOffset.left - event.clientX - docScrollLeft), + isTop = (dTop < setting.edit.drag.borderMax && dTop > setting.edit.drag.borderMin), + isBottom = (dBottom < setting.edit.drag.borderMax && dBottom > setting.edit.drag.borderMin), + isLeft = (dLeft < setting.edit.drag.borderMax && dLeft > setting.edit.drag.borderMin), + isRight = (dRight < setting.edit.drag.borderMax && dRight > setting.edit.drag.borderMin), + isTreeInner = dTop > setting.edit.drag.borderMin && dBottom > setting.edit.drag.borderMin && dLeft > setting.edit.drag.borderMin && dRight > setting.edit.drag.borderMin, + isTreeTop = (isTop && targetSetting.treeObj.scrollTop() <= 0), + isTreeBottom = (isBottom && (targetSetting.treeObj.scrollTop() + targetSetting.treeObj.height() + 10) >= scrollHeight), + isTreeLeft = (isLeft && targetSetting.treeObj.scrollLeft() <= 0), + isTreeRight = (isRight && (targetSetting.treeObj.scrollLeft() + targetSetting.treeObj.width() + 10) >= scrollWidth); + + if (event.target && tools.isChildOrSelf(event.target, targetSetting.treeId)) { + //get node
                              • dom + var targetObj = event.target; + while (targetObj && targetObj.tagName && !tools.eqs(targetObj.tagName, "li") && targetObj.id != targetSetting.treeId) { + targetObj = targetObj.parentNode; + } + + var canMove = true; + //don't move to self or children of self + for (i = 0, l = nodes.length; i < l; i++) { + tmpNode = nodes[i]; + if (targetObj.id === tmpNode.tId) { + canMove = false; + break; + } else if ($$(tmpNode, setting).find("#" + targetObj.id).length > 0) { + canMove = false; + break; + } + } + if (canMove && event.target && tools.isChildOrSelf(event.target, targetObj.id + consts.id.A)) { + tmpTarget = $(targetObj); + tmpTargetNodeId = targetObj.id; + } + } + + //the mouse must be in zTree + tmpNode = nodes[0]; + if (isTreeInner && tools.isChildOrSelf(event.target, targetSetting.treeId)) { + //judge mouse move in root of ztree + if (!tmpTarget && (event.target.id == targetSetting.treeId || isTreeTop || isTreeBottom || isTreeLeft || isTreeRight) && (isOtherTree || (!isOtherTree && tmpNode.parentTId))) { + tmpTarget = targetSetting.treeObj; + } + //auto scroll top + if (isTop) { + targetSetting.treeObj.scrollTop(targetSetting.treeObj.scrollTop() - 10); + } else if (isBottom) { + targetSetting.treeObj.scrollTop(targetSetting.treeObj.scrollTop() + 10); + } + if (isLeft) { + targetSetting.treeObj.scrollLeft(targetSetting.treeObj.scrollLeft() - 10); + } else if (isRight) { + targetSetting.treeObj.scrollLeft(targetSetting.treeObj.scrollLeft() + 10); + } + //auto scroll left + if (tmpTarget && tmpTarget != targetSetting.treeObj && tmpTarget.offset().left < targetSetting.treeObj.offset().left) { + targetSetting.treeObj.scrollLeft(targetSetting.treeObj.scrollLeft() + tmpTarget.offset().left - targetSetting.treeObj.offset().left); + } + } + + curNode.css({ + "top": (event.clientY + docScrollTop + 3) + "px", + "left": (event.clientX + docScrollLeft + 3) + "px" + }); + + var dX = 0; + var dY = 0; + if (tmpTarget && tmpTarget.attr("id") != targetSetting.treeId) { + var tmpTargetNode = tmpTargetNodeId == null ? null : data.getNodeCache(targetSetting, tmpTargetNodeId), + isCopy = ((event.ctrlKey || event.metaKey) && setting.edit.drag.isMove && setting.edit.drag.isCopy) || (!setting.edit.drag.isMove && setting.edit.drag.isCopy), + isPrev = !!(preNode && tmpTargetNodeId === preNode.tId), + isNext = !!(nextNode && tmpTargetNodeId === nextNode.tId), + isInner = (tmpNode.parentTId && tmpNode.parentTId == tmpTargetNodeId), + canPrev = (isCopy || !isNext) && tools.apply(targetSetting.edit.drag.prev, [targetSetting.treeId, nodes, tmpTargetNode], !!targetSetting.edit.drag.prev), + canNext = (isCopy || !isPrev) && tools.apply(targetSetting.edit.drag.next, [targetSetting.treeId, nodes, tmpTargetNode], !!targetSetting.edit.drag.next), + canInner = (isCopy || !isInner) && !(targetSetting.data.keep.leaf && !data.nodeIsParent(setting, tmpTargetNode)) && tools.apply(targetSetting.edit.drag.inner, [targetSetting.treeId, nodes, tmpTargetNode], !!targetSetting.edit.drag.inner); + + function clearMove() { + tmpTarget = null; + tmpTargetNodeId = ""; + moveType = consts.move.TYPE_INNER; + tmpArrow.css({ + "display": "none" + }); + if (window.zTreeMoveTimer) { + clearTimeout(window.zTreeMoveTimer); + window.zTreeMoveTargetNodeTId = null + } + } + + if (!canPrev && !canNext && !canInner) { + clearMove(); + } else { + var tmpTargetA = $("#" + tmpTargetNodeId + consts.id.A, tmpTarget), + tmpNextA = tmpTargetNode.isLastNode ? null : $("#" + tmpTargetNode.getNextNode().tId + consts.id.A, tmpTarget.next()), + tmpTop = tmpTargetA.offset().top, + tmpLeft = tmpTargetA.offset().left, + prevPercent = canPrev ? (canInner ? 0.25 : (canNext ? 0.5 : 1)) : -1, + nextPercent = canNext ? (canInner ? 0.75 : (canPrev ? 0.5 : 0)) : -1, + dY_percent = (event.clientY + docScrollTop - tmpTop) / tmpTargetA.height(); + + if ((prevPercent == 1 || dY_percent <= prevPercent && dY_percent >= -.2) && canPrev) { + dX = 1 - tmpArrow.width(); + dY = tmpTop - tmpArrow.height() / 2; + moveType = consts.move.TYPE_PREV; + } else if ((nextPercent == 0 || dY_percent >= nextPercent && dY_percent <= 1.2) && canNext) { + dX = 1 - tmpArrow.width(); + dY = (tmpNextA == null || (data.nodeIsParent(setting, tmpTargetNode) && tmpTargetNode.open)) ? (tmpTop + tmpTargetA.height() - tmpArrow.height() / 2) : (tmpNextA.offset().top - tmpArrow.height() / 2); + moveType = consts.move.TYPE_NEXT; + } else if (canInner) { + dX = 5 - tmpArrow.width(); + dY = tmpTop; + moveType = consts.move.TYPE_INNER; + } else { + clearMove(); + } + + if (tmpTarget) { + tmpArrow.css({ + "display": "block", + "top": dY + "px", + "left": (tmpLeft + dX) + "px" + }); + tmpTargetA.addClass(consts.node.TMPTARGET_NODE + "_" + moveType); + + if (preTmpTargetNodeId != tmpTargetNodeId || preTmpMoveType != moveType) { + startTime = (new Date()).getTime(); + } + if (tmpTargetNode && data.nodeIsParent(setting, tmpTargetNode) && moveType == consts.move.TYPE_INNER) { + var startTimer = true; + if (window.zTreeMoveTimer && window.zTreeMoveTargetNodeTId !== tmpTargetNode.tId) { + clearTimeout(window.zTreeMoveTimer); + window.zTreeMoveTargetNodeTId = null; + } else if (window.zTreeMoveTimer && window.zTreeMoveTargetNodeTId === tmpTargetNode.tId) { + startTimer = false; + } + if (startTimer) { + window.zTreeMoveTimer = setTimeout(function () { + if (moveType != consts.move.TYPE_INNER) return; + if (tmpTargetNode && data.nodeIsParent(setting, tmpTargetNode) && !tmpTargetNode.open && (new Date()).getTime() - startTime > targetSetting.edit.drag.autoOpenTime + && tools.apply(targetSetting.callback.beforeDragOpen, [targetSetting.treeId, tmpTargetNode], true)) { + view.switchNode(targetSetting, tmpTargetNode); + if (targetSetting.edit.drag.autoExpandTrigger) { + targetSetting.treeObj.trigger(consts.event.EXPAND, [targetSetting.treeId, tmpTargetNode]); + } + } + }, targetSetting.edit.drag.autoOpenTime + 50); + window.zTreeMoveTargetNodeTId = tmpTargetNode.tId; + } + } + } + } + } else { + moveType = consts.move.TYPE_INNER; + if (tmpTarget && tools.apply(targetSetting.edit.drag.inner, [targetSetting.treeId, nodes, null], !!targetSetting.edit.drag.inner)) { + tmpTarget.addClass(consts.node.TMPTARGET_TREE); + } else { + tmpTarget = null; + } + tmpArrow.css({ + "display": "none" + }); + if (window.zTreeMoveTimer) { + clearTimeout(window.zTreeMoveTimer); + window.zTreeMoveTargetNodeTId = null; + } + } + preTmpTargetNodeId = tmpTargetNodeId; + preTmpMoveType = moveType; + + setting.treeObj.trigger(consts.event.DRAGMOVE, [event, setting.treeId, nodes]); + } + return false; + } + + doc.bind("mouseup", _docMouseUp); + + function _docMouseUp(event) { + if (window.zTreeMoveTimer) { + clearTimeout(window.zTreeMoveTimer); + window.zTreeMoveTargetNodeTId = null; + } + preTmpTargetNodeId = null; + preTmpMoveType = null; + doc.unbind("mousemove", _docMouseMove); + doc.unbind("mouseup", _docMouseUp); + doc.unbind("selectstart", _docSelect); + body.css("cursor", ""); + if (tmpTarget) { + tmpTarget.removeClass(consts.node.TMPTARGET_TREE); + if (tmpTargetNodeId) $("#" + tmpTargetNodeId + consts.id.A, tmpTarget).removeClass(consts.node.TMPTARGET_NODE + "_" + consts.move.TYPE_PREV) + .removeClass(consts.node.TMPTARGET_NODE + "_" + _consts.move.TYPE_NEXT).removeClass(consts.node.TMPTARGET_NODE + "_" + _consts.move.TYPE_INNER); + } + tools.showIfameMask(setting, false); + + roots.showHoverDom = true; + if (root.dragFlag == 0) return; + root.dragFlag = 0; + + var i, l, tmpNode; + for (i = 0, l = nodes.length; i < l; i++) { + tmpNode = nodes[i]; + if (data.nodeIsParent(setting, tmpNode) && root.dragNodeShowBefore[tmpNode.tId] && !tmpNode.open) { + view.expandCollapseNode(setting, tmpNode, !tmpNode.open); + delete root.dragNodeShowBefore[tmpNode.tId]; + } + } + + if (curNode) curNode.remove(); + if (tmpArrow) tmpArrow.remove(); + + var isCopy = ((event.ctrlKey || event.metaKey) && setting.edit.drag.isMove && setting.edit.drag.isCopy) || (!setting.edit.drag.isMove && setting.edit.drag.isCopy); + if (!isCopy && tmpTarget && tmpTargetNodeId && nodes[0].parentTId && tmpTargetNodeId == nodes[0].parentTId && moveType == consts.move.TYPE_INNER) { + tmpTarget = null; + } + if (tmpTarget) { + var dragTargetNode = tmpTargetNodeId == null ? null : data.getNodeCache(targetSetting, tmpTargetNodeId); + if (tools.apply(setting.callback.beforeDrop, [targetSetting.treeId, nodes, dragTargetNode, moveType, isCopy], true) == false) { + view.selectNodes(sourceSetting, nodes); + return; + } + var newNodes = isCopy ? tools.clone(nodes) : nodes; + + function dropCallback() { + if (isOtherTree) { + if (!isCopy) { + for (var i = 0, l = nodes.length; i < l; i++) { + view.removeNode(setting, nodes[i]); + } + } + if (moveType == consts.move.TYPE_INNER) { + view.addNodes(targetSetting, dragTargetNode, -1, newNodes); + } else { + view.addNodes(targetSetting, dragTargetNode.getParentNode(), moveType == consts.move.TYPE_PREV ? dragTargetNode.getIndex() : dragTargetNode.getIndex() + 1, newNodes); + } + } else { + if (isCopy && moveType == consts.move.TYPE_INNER) { + view.addNodes(targetSetting, dragTargetNode, -1, newNodes); + } else if (isCopy) { + view.addNodes(targetSetting, dragTargetNode.getParentNode(), moveType == consts.move.TYPE_PREV ? dragTargetNode.getIndex() : dragTargetNode.getIndex() + 1, newNodes); + } else { + if (moveType != consts.move.TYPE_NEXT) { + for (i = 0, l = newNodes.length; i < l; i++) { + view.moveNode(targetSetting, dragTargetNode, newNodes[i], moveType, false); + } + } else { + for (i = -1, l = newNodes.length - 1; i < l; l--) { + view.moveNode(targetSetting, dragTargetNode, newNodes[l], moveType, false); + } + } + } + } + view.selectNodes(targetSetting, newNodes); + + var a = $$(newNodes[0], setting).get(0); + view.scrollIntoView(setting, a); + + setting.treeObj.trigger(consts.event.DROP, [event, targetSetting.treeId, newNodes, dragTargetNode, moveType, isCopy]); + } + + if (moveType == consts.move.TYPE_INNER && tools.canAsync(targetSetting, dragTargetNode)) { + view.asyncNode(targetSetting, dragTargetNode, false, dropCallback); + } else { + dropCallback(); + } + + } else { + view.selectNodes(sourceSetting, nodes); + setting.treeObj.trigger(consts.event.DROP, [event, setting.treeId, nodes, null, null, null]); + } + } + + doc.bind("selectstart", _docSelect); + + function _docSelect() { + return false; + } + + // 2018-03-30 FireFox has fixed this issue. + //Avoid FireFox's Bug + //If zTree Div CSS set 'overflow', so drag node outside of zTree, and event.target is error. + // if(eventMouseDown.preventDefault) { + // eventMouseDown.preventDefault(); + // } + return true; + } + }, + //method of tools for zTree + _tools = { + getAbs: function (obj) { + var oRect = obj.getBoundingClientRect(), + scrollTop = document.body.scrollTop + document.documentElement.scrollTop, + scrollLeft = document.body.scrollLeft + document.documentElement.scrollLeft; + return [oRect.left + scrollLeft, oRect.top + scrollTop]; + }, + inputFocus: function (inputObj) { + if (inputObj.get(0)) { + inputObj.focus(); + tools.setCursorPosition(inputObj.get(0), inputObj.val().length); + } + }, + inputSelect: function (inputObj) { + if (inputObj.get(0)) { + inputObj.focus(); + inputObj.select(); + } + }, + setCursorPosition: function (obj, pos) { + if (obj.setSelectionRange) { + obj.focus(); + obj.setSelectionRange(pos, pos); + } else if (obj.createTextRange) { + var range = obj.createTextRange(); + range.collapse(true); + range.moveEnd('character', pos); + range.moveStart('character', pos); + range.select(); + } + }, + showIfameMask: function (setting, showSign) { + var root = data.getRoot(setting); + //clear full mask + while (root.dragMaskList.length > 0) { + root.dragMaskList[0].remove(); + root.dragMaskList.shift(); + } + if (showSign) { + //show mask + var iframeList = $$("iframe", setting); + for (var i = 0, l = iframeList.length; i < l; i++) { + var obj = iframeList.get(i), + r = tools.getAbs(obj), + dragMask = $$("
                                ", setting); + dragMask.appendTo($$("body", setting)); + root.dragMaskList.push(dragMask); + } + } + } + }, + //method of operate ztree dom + _view = { + addEditBtn: function (setting, node) { + if (node.editNameFlag || $$(node, consts.id.EDIT, setting).length > 0) { + return; + } + if (!tools.apply(setting.edit.showRenameBtn, [setting.treeId, node], setting.edit.showRenameBtn)) { + return; + } + var aObj = $$(node, consts.id.A, setting), + editStr = ""; + aObj.append(editStr); + + $$(node, consts.id.EDIT, setting).bind('click', + function () { + if (!tools.uCanDo(setting) || tools.apply(setting.callback.beforeEditName, [setting.treeId, node], true) == false) return false; + view.editNode(setting, node); + return false; + } + ).show(); + }, + addRemoveBtn: function (setting, node) { + if (node.editNameFlag || $$(node, consts.id.REMOVE, setting).length > 0) { + return; + } + if (!tools.apply(setting.edit.showRemoveBtn, [setting.treeId, node], setting.edit.showRemoveBtn)) { + return; + } + var aObj = $$(node, consts.id.A, setting), + removeStr = ""; + aObj.append(removeStr); + + $$(node, consts.id.REMOVE, setting).bind('click', + function () { + if (!tools.uCanDo(setting) || tools.apply(setting.callback.beforeRemove, [setting.treeId, node], true) == false) return false; + view.removeNode(setting, node); + setting.treeObj.trigger(consts.event.REMOVE, [setting.treeId, node]); + return false; + } + ).bind('mousedown', + function (eventMouseDown) { + return true; + } + ).show(); + }, + addHoverDom: function (setting, node) { + if (data.getRoots().showHoverDom) { + node.isHover = true; + if (setting.edit.enable) { + view.addEditBtn(setting, node); + view.addRemoveBtn(setting, node); + } + tools.apply(setting.view.addHoverDom, [setting.treeId, node]); + } + }, + cancelCurEditNode: function (setting, forceName, isCancel) { + var root = data.getRoot(setting), + node = root.curEditNode; + + if (node) { + var inputObj = root.curEditInput, + newName = forceName ? forceName : (isCancel ? data.nodeName(setting, node) : inputObj.val()); + if (tools.apply(setting.callback.beforeRename, [setting.treeId, node, newName, isCancel], true) === false) { + return false; + } + data.nodeName(setting, node, newName); + var aObj = $$(node, consts.id.A, setting); + aObj.removeClass(consts.node.CURSELECTED_EDIT); + inputObj.unbind(); + view.setNodeName(setting, node); + node.editNameFlag = false; + root.curEditNode = null; + root.curEditInput = null; + view.selectNode(setting, node, false); + setting.treeObj.trigger(consts.event.RENAME, [setting.treeId, node, isCancel]); + } + root.noSelection = true; + return true; + }, + editNode: function (setting, node) { + var root = data.getRoot(setting); + view.editNodeBlur = false; + if (data.isSelectedNode(setting, node) && root.curEditNode == node && node.editNameFlag) { + setTimeout(function () { + tools.inputFocus(root.curEditInput); + }, 0); + return; + } + node.editNameFlag = true; + view.removeTreeDom(setting, node); + view.cancelCurEditNode(setting); + view.selectNode(setting, node, false); + $$(node, consts.id.SPAN, setting).html(""); + var inputObj = $$(node, consts.id.INPUT, setting); + inputObj.attr("value", data.nodeName(setting, node)); + if (setting.edit.editNameSelectAll) { + tools.inputSelect(inputObj); + } else { + tools.inputFocus(inputObj); + } + + inputObj.bind('blur', function (event) { + if (!view.editNodeBlur) { + view.cancelCurEditNode(setting); + } + }).bind('keydown', function (event) { + if (event.keyCode == "13") { + view.editNodeBlur = true; + view.cancelCurEditNode(setting); + } else if (event.keyCode == "27") { + view.cancelCurEditNode(setting, null, true); + } + }).bind('click', function (event) { + return false; + }).bind('dblclick', function (event) { + return false; + }); + + $$(node, consts.id.A, setting).addClass(consts.node.CURSELECTED_EDIT); + root.curEditInput = inputObj; + root.noSelection = false; + root.curEditNode = node; + }, + moveNode: function (setting, targetNode, node, moveType, animateFlag, isSilent) { + var root = data.getRoot(setting); + if (targetNode == node) return; + if (setting.data.keep.leaf && targetNode && !data.nodeIsParent(setting, targetNode) && moveType == consts.move.TYPE_INNER) return; + var oldParentNode = (node.parentTId ? node.getParentNode() : root), + targetNodeIsRoot = (targetNode === null || targetNode == root); + if (targetNodeIsRoot && targetNode === null) targetNode = root; + if (targetNodeIsRoot) moveType = consts.move.TYPE_INNER; + var targetParentNode = (targetNode.parentTId ? targetNode.getParentNode() : root); + + if (moveType != consts.move.TYPE_PREV && moveType != consts.move.TYPE_NEXT) { + moveType = consts.move.TYPE_INNER; + } + + if (moveType == consts.move.TYPE_INNER) { + if (targetNodeIsRoot) { + //parentTId of root node is null + node.parentTId = null; + } else { + if (!data.nodeIsParent(setting, targetNode)) { + data.nodeIsParent(setting, targetNode, true); + targetNode.open = !!targetNode.open; + view.setNodeLineIcos(setting, targetNode); + } + node.parentTId = targetNode.tId; + } + } + + //move node Dom + var targetObj, target_ulObj; + if (targetNodeIsRoot) { + targetObj = setting.treeObj; + target_ulObj = targetObj; + } else { + if (!isSilent && moveType == consts.move.TYPE_INNER) { + view.expandCollapseNode(setting, targetNode, true, false); + } else if (!isSilent) { + view.expandCollapseNode(setting, targetNode.getParentNode(), true, false); + } + targetObj = $$(targetNode, setting); + target_ulObj = $$(targetNode, consts.id.UL, setting); + if (!!targetObj.get(0) && !target_ulObj.get(0)) { + var ulstr = []; + view.makeUlHtml(setting, targetNode, ulstr, ''); + targetObj.append(ulstr.join('')); + } + target_ulObj = $$(targetNode, consts.id.UL, setting); + } + var nodeDom = $$(node, setting); + if (!nodeDom.get(0)) { + nodeDom = view.appendNodes(setting, node.level, [node], null, -1, false, true).join(''); + } else if (!targetObj.get(0)) { + nodeDom.remove(); + } + if (target_ulObj.get(0) && moveType == consts.move.TYPE_INNER) { + target_ulObj.append(nodeDom); + } else if (targetObj.get(0) && moveType == consts.move.TYPE_PREV) { + targetObj.before(nodeDom); + } else if (targetObj.get(0) && moveType == consts.move.TYPE_NEXT) { + targetObj.after(nodeDom); + } + + //repair the data after move + var i, l, + tmpSrcIndex = -1, + tmpTargetIndex = 0, + oldNeighbor = null, + newNeighbor = null, + oldLevel = node.level; + var oldChildren = data.nodeChildren(setting, oldParentNode); + var targetParentChildren = data.nodeChildren(setting, targetParentNode); + var targetChildren = data.nodeChildren(setting, targetNode); + if (node.isFirstNode) { + tmpSrcIndex = 0; + if (oldChildren.length > 1) { + oldNeighbor = oldChildren[1]; + oldNeighbor.isFirstNode = true; + } + } else if (node.isLastNode) { + tmpSrcIndex = oldChildren.length - 1; + oldNeighbor = oldChildren[tmpSrcIndex - 1]; + oldNeighbor.isLastNode = true; + } else { + for (i = 0, l = oldChildren.length; i < l; i++) { + if (oldChildren[i].tId == node.tId) { + tmpSrcIndex = i; + break; + } + } + } + if (tmpSrcIndex >= 0) { + oldChildren.splice(tmpSrcIndex, 1); + } + if (moveType != consts.move.TYPE_INNER) { + for (i = 0, l = targetParentChildren.length; i < l; i++) { + if (targetParentChildren[i].tId == targetNode.tId) tmpTargetIndex = i; + } + } + if (moveType == consts.move.TYPE_INNER) { + if (!targetChildren) { + targetChildren = data.nodeChildren(setting, targetNode, []); + } + if (targetChildren.length > 0) { + newNeighbor = targetChildren[targetChildren.length - 1]; + newNeighbor.isLastNode = false; + } + targetChildren.splice(targetChildren.length, 0, node); + node.isLastNode = true; + node.isFirstNode = (targetChildren.length == 1); + } else if (targetNode.isFirstNode && moveType == consts.move.TYPE_PREV) { + targetParentChildren.splice(tmpTargetIndex, 0, node); + newNeighbor = targetNode; + newNeighbor.isFirstNode = false; + node.parentTId = targetNode.parentTId; + node.isFirstNode = true; + node.isLastNode = false; + + } else if (targetNode.isLastNode && moveType == consts.move.TYPE_NEXT) { + targetParentChildren.splice(tmpTargetIndex + 1, 0, node); + newNeighbor = targetNode; + newNeighbor.isLastNode = false; + node.parentTId = targetNode.parentTId; + node.isFirstNode = false; + node.isLastNode = true; + + } else { + if (moveType == consts.move.TYPE_PREV) { + targetParentChildren.splice(tmpTargetIndex, 0, node); + } else { + targetParentChildren.splice(tmpTargetIndex + 1, 0, node); + } + node.parentTId = targetNode.parentTId; + node.isFirstNode = false; + node.isLastNode = false; + } + data.fixPIdKeyValue(setting, node); + data.setSonNodeLevel(setting, node.getParentNode(), node); + + //repair node what been moved + view.setNodeLineIcos(setting, node); + view.repairNodeLevelClass(setting, node, oldLevel); + + //repair node's old parentNode dom + if (!setting.data.keep.parent && oldChildren.length < 1) { + //old parentNode has no child nodes + data.nodeIsParent(setting, oldParentNode, false); + oldParentNode.open = false; + var tmp_ulObj = $$(oldParentNode, consts.id.UL, setting), + tmp_switchObj = $$(oldParentNode, consts.id.SWITCH, setting), + tmp_icoObj = $$(oldParentNode, consts.id.ICON, setting); + view.replaceSwitchClass(oldParentNode, tmp_switchObj, consts.folder.DOCU); + view.replaceIcoClass(oldParentNode, tmp_icoObj, consts.folder.DOCU); + tmp_ulObj.css("display", "none"); + + } else if (oldNeighbor) { + //old neigbor node + view.setNodeLineIcos(setting, oldNeighbor); + } + + //new neigbor node + if (newNeighbor) { + view.setNodeLineIcos(setting, newNeighbor); + } + + //repair checkbox / radio + if (!!setting.check && setting.check.enable && view.repairChkClass) { + view.repairChkClass(setting, oldParentNode); + view.repairParentChkClassWithSelf(setting, oldParentNode); + if (oldParentNode != node.parent) + view.repairParentChkClassWithSelf(setting, node); + } + + //expand parents after move + if (!isSilent) { + view.expandCollapseParentNode(setting, node.getParentNode(), true, animateFlag); + } + }, + removeEditBtn: function (setting, node) { + $$(node, consts.id.EDIT, setting).unbind().remove(); + }, + removeRemoveBtn: function (setting, node) { + $$(node, consts.id.REMOVE, setting).unbind().remove(); + }, + removeTreeDom: function (setting, node) { + node.isHover = false; + view.removeEditBtn(setting, node); + view.removeRemoveBtn(setting, node); + tools.apply(setting.view.removeHoverDom, [setting.treeId, node]); + }, + repairNodeLevelClass: function (setting, node, oldLevel) { + if (oldLevel === node.level) return; + var liObj = $$(node, setting), + aObj = $$(node, consts.id.A, setting), + ulObj = $$(node, consts.id.UL, setting), + oldClass = consts.className.LEVEL + oldLevel, + newClass = consts.className.LEVEL + node.level; + liObj.removeClass(oldClass); + liObj.addClass(newClass); + aObj.removeClass(oldClass); + aObj.addClass(newClass); + ulObj.removeClass(oldClass); + ulObj.addClass(newClass); + }, + selectNodes: function (setting, nodes) { + for (var i = 0, l = nodes.length; i < l; i++) { + view.selectNode(setting, nodes[i], i > 0); + } + } + }, + + _z = { + tools: _tools, + view: _view, + event: _event, + data: _data + }; + $.extend(true, $.fn.zTree.consts, _consts); + $.extend(true, $.fn.zTree._z, _z); + + var zt = $.fn.zTree, + tools = zt._z.tools, + consts = zt.consts, + view = zt._z.view, + data = zt._z.data, + event = zt._z.event, + $$ = tools.$; + + data.exSetting(_setting); + data.addInitBind(_bindEvent); + data.addInitUnBind(_unbindEvent); + data.addInitCache(_initCache); + data.addInitNode(_initNode); + data.addInitProxy(_eventProxy); + data.addInitRoot(_initRoot); + data.addZTreeTools(_zTreeTools); + + var _cancelPreSelectedNode = view.cancelPreSelectedNode; + view.cancelPreSelectedNode = function (setting, node) { + var list = data.getRoot(setting).curSelectedList; + for (var i = 0, j = list.length; i < j; i++) { + if (!node || node === list[i]) { + view.removeTreeDom(setting, list[i]); + if (node) break; + } + } + if (_cancelPreSelectedNode) _cancelPreSelectedNode.apply(view, arguments); + } + + var _createNodes = view.createNodes; + view.createNodes = function (setting, level, nodes, parentNode, index) { + if (_createNodes) { + _createNodes.apply(view, arguments); + } + if (!nodes) return; + if (view.repairParentChkClassWithSelf) { + view.repairParentChkClassWithSelf(setting, parentNode); + } + } + + var _makeNodeUrl = view.makeNodeUrl; + view.makeNodeUrl = function (setting, node) { + return setting.edit.enable ? null : (_makeNodeUrl.apply(view, arguments)); + } + + var _removeNode = view.removeNode; + view.removeNode = function (setting, node) { + var root = data.getRoot(setting); + if (root.curEditNode === node) root.curEditNode = null; + if (_removeNode) { + _removeNode.apply(view, arguments); + } + } + + var _selectNode = view.selectNode; + view.selectNode = function (setting, node, addFlag) { + var root = data.getRoot(setting); + if (data.isSelectedNode(setting, node) && root.curEditNode == node && node.editNameFlag) { + return false; + } + if (_selectNode) _selectNode.apply(view, arguments); + view.addHoverDom(setting, node); + return true; + } + + var _uCanDo = tools.uCanDo; + tools.uCanDo = function (setting, e) { + var root = data.getRoot(setting); + if (e && (tools.eqs(e.type, "mouseover") || tools.eqs(e.type, "mouseout") || tools.eqs(e.type, "mousedown") || tools.eqs(e.type, "mouseup"))) { + return true; + } + if (root.curEditNode) { + view.editNodeBlur = false; + root.curEditInput.focus(); + } + return (!root.curEditNode) && (_uCanDo ? _uCanDo.apply(view, arguments) : true); + } +})(jQuery); diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/js/jquery.ztree.all.min.js b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/js/jquery.ztree.all.min.js new file mode 100644 index 0000000..b50f265 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/js/jquery.ztree.all.min.js @@ -0,0 +1,166 @@ + +/* + * JQuery zTree core v3.5.40 + * http://treejs.cn/ + * + * Copyright (c) 2010 Hunter.z + * + * Licensed same as jquery - MIT License + * http://www.opensource.org/licenses/mit-license.php + * + * email: hunter.z@263.net + * Date: 2019-01-18 + */ +(function(r){var J,K,L,M,N,O,v,t={},w={},x={},P={treeId:"",treeObj:null,view:{addDiyDom:null,autoCancelSelected:!0,dblClickExpand:!0,expandSpeed:"fast",fontCss:{},nameIsHTML:!1,selectedMulti:!0,showIcon:!0,showLine:!0,showTitle:!0,txtSelectedEnable:!1},data:{key:{isParent:"isParent",children:"children",name:"name",title:"",url:"url",icon:"icon"},simpleData:{enable:!1,idKey:"id",pIdKey:"pId",rootPId:null},keep:{parent:!1,leaf:!1}},async:{enable:!1,contentType:"application/x-www-form-urlencoded",type:"post", +dataType:"text",headers:{},xhrFields:{},url:"",autoParam:[],otherParam:[],dataFilter:null},callback:{beforeAsync:null,beforeClick:null,beforeDblClick:null,beforeRightClick:null,beforeMouseDown:null,beforeMouseUp:null,beforeExpand:null,beforeCollapse:null,beforeRemove:null,onAsyncError:null,onAsyncSuccess:null,onNodeCreated:null,onClick:null,onDblClick:null,onRightClick:null,onMouseDown:null,onMouseUp:null,onExpand:null,onCollapse:null,onRemove:null}},y=[function(a){var b=a.treeObj,c=g.event;b.bind(c.NODECREATED, +function(b,c,i){h.apply(a.callback.onNodeCreated,[b,c,i])});b.bind(c.CLICK,function(b,c,i,e,k){h.apply(a.callback.onClick,[c,i,e,k])});b.bind(c.EXPAND,function(b,c,i){h.apply(a.callback.onExpand,[b,c,i])});b.bind(c.COLLAPSE,function(b,c,i){h.apply(a.callback.onCollapse,[b,c,i])});b.bind(c.ASYNC_SUCCESS,function(b,c,i,e){h.apply(a.callback.onAsyncSuccess,[b,c,i,e])});b.bind(c.ASYNC_ERROR,function(b,c,i,e,k,g){h.apply(a.callback.onAsyncError,[b,c,i,e,k,g])});b.bind(c.REMOVE,function(b,c,i){h.apply(a.callback.onRemove, +[b,c,i])});b.bind(c.SELECTED,function(b,c,i){h.apply(a.callback.onSelected,[c,i])});b.bind(c.UNSELECTED,function(b,c,i){h.apply(a.callback.onUnSelected,[c,i])})}],z=[function(a){var b=g.event;a.treeObj.unbind(b.NODECREATED).unbind(b.CLICK).unbind(b.EXPAND).unbind(b.COLLAPSE).unbind(b.ASYNC_SUCCESS).unbind(b.ASYNC_ERROR).unbind(b.REMOVE).unbind(b.SELECTED).unbind(b.UNSELECTED)}],A=[function(a){var b=e.getCache(a);b||(b={},e.setCache(a,b));b.nodes=[];b.doms=[]}],B=[function(a,b,c,d,f,i){if(c){var m= +e.getRoot(a),k=e.nodeChildren(a,c);c.level=b;c.tId=a.treeId+"_"+ ++m.zId;c.parentTId=d?d.tId:null;c.open=typeof c.open=="string"?h.eqs(c.open,"true"):!!c.open;b=e.nodeIsParent(a,c);h.isArray(k)?(e.nodeIsParent(a,c,!0),c.zAsync=!0):(b=e.nodeIsParent(a,c,b),c.open=b&&!a.async.enable?c.open:!1,c.zAsync=!b);c.isFirstNode=f;c.isLastNode=i;c.getParentNode=function(){return e.getNodeCache(a,c.parentTId)};c.getPreNode=function(){return e.getPreNode(a,c)};c.getNextNode=function(){return e.getNextNode(a,c)}; +c.getIndex=function(){return e.getNodeIndex(a,c)};c.getPath=function(){return e.getNodePath(a,c)};c.isAjaxing=!1;e.fixPIdKeyValue(a,c)}}],u=[function(a){var b=a.target,c=e.getSetting(a.data.treeId),d="",f=null,i="",m="",k=null,j=null,o=null;if(h.eqs(a.type,"mousedown"))m="mousedown";else if(h.eqs(a.type,"mouseup"))m="mouseup";else if(h.eqs(a.type,"contextmenu"))m="contextmenu";else if(h.eqs(a.type,"click"))if(h.eqs(b.tagName,"span")&&b.getAttribute("treeNode"+g.id.SWITCH)!==null)d=h.getNodeMainDom(b).id, +i="switchNode";else{if(o=h.getMDom(c,b,[{tagName:"a",attrName:"treeNode"+g.id.A}]))d=h.getNodeMainDom(o).id,i="clickNode"}else if(h.eqs(a.type,"dblclick")&&(m="dblclick",o=h.getMDom(c,b,[{tagName:"a",attrName:"treeNode"+g.id.A}])))d=h.getNodeMainDom(o).id,i="switchNode";if(m.length>0&&d.length==0&&(o=h.getMDom(c,b,[{tagName:"a",attrName:"treeNode"+g.id.A}])))d=h.getNodeMainDom(o).id;if(d.length>0)switch(f=e.getNodeCache(c,d),i){case "switchNode":e.nodeIsParent(c,f)?h.eqs(a.type,"click")||h.eqs(a.type, +"dblclick")&&h.apply(c.view.dblClickExpand,[c.treeId,f],c.view.dblClickExpand)?k=J:i="":i="";break;case "clickNode":k=K}switch(m){case "mousedown":j=L;break;case "mouseup":j=M;break;case "dblclick":j=N;break;case "contextmenu":j=O}return{stop:!1,node:f,nodeEventType:i,nodeEventCallback:k,treeEventType:m,treeEventCallback:j}}],C=[function(a){var b=e.getRoot(a);b||(b={},e.setRoot(a,b));e.nodeChildren(a,b,[]);b.expandTriggerFlag=!1;b.curSelectedList=[];b.noSelection=!0;b.createdNodes=[];b.zId=0;b._ver= +(new Date).getTime()}],D=[],E=[],F=[],G=[],H=[],e={addNodeCache:function(a,b){e.getCache(a).nodes[e.getNodeCacheId(b.tId)]=b},getNodeCacheId:function(a){return a.substring(a.lastIndexOf("_")+1)},addAfterA:function(a){E.push(a)},addBeforeA:function(a){D.push(a)},addInnerAfterA:function(a){G.push(a)},addInnerBeforeA:function(a){F.push(a)},addInitBind:function(a){y.push(a)},addInitUnBind:function(a){z.push(a)},addInitCache:function(a){A.push(a)},addInitNode:function(a){B.push(a)},addInitProxy:function(a, +b){b?u.splice(0,0,a):u.push(a)},addInitRoot:function(a){C.push(a)},addNodesData:function(a,b,c,d){var f=e.nodeChildren(a,b);f?c>=f.length&&(c=-1):(f=e.nodeChildren(a,b,[]),c=-1);if(f.length>0&&c===0)f[0].isFirstNode=!1,j.setNodeLineIcos(a,f[0]);else if(f.length>0&&c<0)f[f.length-1].isLastNode=!1,j.setNodeLineIcos(a,f[f.length-1]);e.nodeIsParent(a,b,!0);c<0?e.nodeChildren(a,b,f.concat(d)):(a=[c,0].concat(d),f.splice.apply(f,a))},addSelectedNode:function(a,b){var c=e.getRoot(a);e.isSelectedNode(a,b)|| +c.curSelectedList.push(b)},addCreatedNode:function(a,b){(a.callback.onNodeCreated||a.view.addDiyDom)&&e.getRoot(a).createdNodes.push(b)},addZTreeTools:function(a){H.push(a)},exSetting:function(a){r.extend(!0,P,a)},fixPIdKeyValue:function(a,b){a.data.simpleData.enable&&(b[a.data.simpleData.pIdKey]=b.parentTId?b.getParentNode()[a.data.simpleData.idKey]:a.data.simpleData.rootPId)},getAfterA:function(a,b,c){for(var d=0,e=E.length;d-1&&f.push(k);k=e.nodeChildren(a, +k);f=f.concat(e.getNodesByParamFuzzy(a,k,c,d))}return f},getNodesByFilter:function(a,b,c,d,f){if(!b)return d?null:[];for(var i=d?null:[],m=0,k=b.length;m0)},clone:function(a){if(a===null)return null;var b=h.isArray(a)?[]:{},c;for(c in a)b[c]=a[c]instanceof Date?new Date(a[c].getTime()):typeof a[c]==="object"?h.clone(a[c]):a[c];return b},eqs:function(a,b){return a.toLowerCase()===b.toLowerCase()},isArray:function(a){return Object.prototype.toString.apply(a)==="[object Array]"},isElement:function(a){return typeof HTMLElement==="object"?a instanceof HTMLElement:a&&typeof a==="object"&&a!==null&& +a.nodeType===1&&typeof a.nodeName==="string"},$:function(a,b,c){b&&typeof b!="string"&&(c=b,b="");return typeof a=="string"?r(a,c?c.treeObj.get(0).ownerDocument:null):r("#"+a.tId+b,c?c.treeObj:null)},getMDom:function(a,b,c){if(!b)return null;for(;b&&b.id!==a.treeId;){for(var d=0,e=c.length;b.tagName&&d0},uCanDo:function(){return!0}},j={addNodes:function(a,b,c,d,f){var i=e.nodeIsParent(a,b);if(!a.data.keep.leaf||!b||i)if(h.isArray(d)||(d=[d]),a.data.simpleData.enable&&(d=e.transformTozTreeFormat(a,d)),b){var i=l(b,g.id.SWITCH,a),m=l(b,g.id.ICON,a),k=l(b,g.id.UL,a);if(!b.open)j.replaceSwitchClass(b,i,g.folder.CLOSE),j.replaceIcoClass(b,m,g.folder.CLOSE),b.open=!1,k.css({display:"none"});e.addNodesData(a,b,c,d);j.createNodes(a,b.level+ +1,d,b,c);f||j.expandCollapseParentNode(a,b,!0)}else e.addNodesData(a,e.getRoot(a),c,d),j.createNodes(a,0,d,null,c)},appendNodes:function(a,b,c,d,f,i,g){if(!c)return[];var k=[],h=d?d:e.getRoot(a),h=e.nodeChildren(a,h),o,l;if(!h||f>=h.length-c.length)f=-1;for(var s=0,n=c.length;s0&&(l=j.appendNodes(a,b+1,I,p,-1, +i,g&&p.open));g&&(j.makeDOMNodeMainBefore(k,a,p),j.makeDOMNodeLine(k,a,p),e.getBeforeA(a,p,k),j.makeDOMNodeNameBefore(k,a,p),e.getInnerBeforeA(a,p,k),j.makeDOMNodeIcon(k,a,p),e.getInnerAfterA(a,p,k),j.makeDOMNodeNameAfter(k,a,p),e.getAfterA(a,p,k),o&&p.open&&j.makeUlHtml(a,p,k,l.join("")),j.makeDOMNodeMainAfter(k,a,p),e.addCreatedNode(a,p))}return k},appendParentULDom:function(a,b){var c=[],d=l(b,a);!d.get(0)&&b.parentTId&&(j.appendParentULDom(a,b.getParentNode()),d=l(b,a));var f=l(b,g.id.UL,a);f.get(0)&& +f.remove();f=e.nodeChildren(a,b);f=j.appendNodes(a,b.level+1,f,b,-1,!1,!0);j.makeUlHtml(a,b,c,f.join(""));d.append(c.join(""))},asyncNode:function(a,b,c,d){var f,i;f=e.nodeIsParent(a,b);if(b&&!f)return h.apply(d),!1;else if(b&&b.isAjaxing)return!1;else if(h.apply(a.callback.beforeAsync,[a.treeId,b],!0)==!1)return h.apply(d),!1;if(b)b.isAjaxing=!0,l(b,g.id.ICON,a).attr({style:"","class":g.className.BUTTON+" "+g.className.ICO_LOADING});var m={},k=h.apply(a.async.autoParam,[a.treeId,b],a.async.autoParam); +for(f=0,i=k.length;b&&f1&&(o=q[1],q=q[0]);m[o]=b[q]}k=h.apply(a.async.otherParam,[a.treeId,b],a.async.otherParam);if(h.isArray(k))for(f=0,i=k.length;f-1?JSON.stringify(m):m,dataType:a.async.dataType,headers:a.async.headers, +xhrFields:a.async.xhrFields,success:function(i){if(s==e.getRoot(a)._ver){var f=[];try{f=!i||i.length==0?[]:typeof i=="string"?eval("("+i+")"):i}catch(k){f=i}if(b)b.isAjaxing=null,b.zAsync=!0;j.setNodeLineIcos(a,b);f&&f!==""?(f=h.apply(a.async.dataFilter,[a.treeId,b,f],f),j.addNodes(a,b,-1,f?h.clone(f):[],!!c)):j.addNodes(a,b,-1,[],!!c);a.treeObj.trigger(g.event.ASYNC_SUCCESS,[a.treeId,b,i]);h.apply(d)}},error:function(c,d,i){if(s==e.getRoot(a)._ver){if(b)b.isAjaxing=null;j.setNodeLineIcos(a,b);a.treeObj.trigger(g.event.ASYNC_ERROR, +[a.treeId,b,c,d,i])}}});return!0},cancelPreSelectedNode:function(a,b,c){var d=e.getRoot(a).curSelectedList,f,i;for(f=d.length-1;f>=0;f--)if(i=d[f],b===i||!b&&(!c||c!==i))if(l(i,g.id.A,a).removeClass(g.node.CURSELECTED),b){e.removeSelectedNode(a,b);break}else d.splice(f,1),a.treeObj.trigger(g.event.UNSELECTED,[a.treeId,i])},createNodeCallback:function(a){if(a.callback.onNodeCreated||a.view.addDiyDom)for(var b=e.getRoot(a);b.createdNodes.length>0;){var c=b.createdNodes.shift();h.apply(a.view.addDiyDom, +[a.treeId,c]);a.callback.onNodeCreated&&a.treeObj.trigger(g.event.NODECREATED,[a.treeId,c])}},createNodes:function(a,b,c,d,f){if(c&&c.length!=0){var i=e.getRoot(a),m=!d||d.open||!!l(e.nodeChildren(a,d)[0],a).get(0);i.createdNodes=[];var b=j.appendNodes(a,b,c,d,f,!0,m),k,h;d?(d=l(d,g.id.UL,a),d.get(0)&&(k=d)):k=a.treeObj;k&&(f>=0&&(h=k.children()[f]),f>=0&&h?r(h).before(b.join("")):k.append(b.join("")));j.createNodeCallback(a)}},destroy:function(a){a&&(e.initCache(a),e.initRoot(a),n.unbindTree(a), +n.unbindEvent(a),a.treeObj.empty(),delete t[a.treeId])},expandCollapseNode:function(a,b,c,d,f){var i=e.getRoot(a),m;if(b){var k=e.nodeChildren(a,b),q=e.nodeIsParent(a,b);if(i.expandTriggerFlag)m=f,f=function(){m&&m();b.open?a.treeObj.trigger(g.event.EXPAND,[a.treeId,b]):a.treeObj.trigger(g.event.COLLAPSE,[a.treeId,b])},i.expandTriggerFlag=!1;if(!b.open&&q&&(!l(b,g.id.UL,a).get(0)||k&&k.length>0&&!l(k[0],a).get(0)))j.appendParentULDom(a,b),j.createNodeCallback(a);if(b.open==c)h.apply(f,[]);else{var c= +l(b,g.id.UL,a),i=l(b,g.id.SWITCH,a),o=l(b,g.id.ICON,a);q?(b.open=!b.open,b.iconOpen&&b.iconClose&&o.attr("style",j.makeNodeIcoStyle(a,b)),b.open?(j.replaceSwitchClass(b,i,g.folder.OPEN),j.replaceIcoClass(b,o,g.folder.OPEN),d==!1||a.view.expandSpeed==""?(c.show(),h.apply(f,[])):k&&k.length>0?c.slideDown(a.view.expandSpeed,f):(c.show(),h.apply(f,[]))):(j.replaceSwitchClass(b,i,g.folder.CLOSE),j.replaceIcoClass(b,o,g.folder.CLOSE),d==!1||a.view.expandSpeed==""||!(k&&k.length>0)?(c.hide(),h.apply(f,[])): +c.slideUp(a.view.expandSpeed,f))):h.apply(f,[])}}else h.apply(f,[])},expandCollapseParentNode:function(a,b,c,d,e){b&&(b.parentTId?(j.expandCollapseNode(a,b,c,d),b.parentTId&&j.expandCollapseParentNode(a,b.getParentNode(),c,d,e)):j.expandCollapseNode(a,b,c,d,e))},expandCollapseSonNode:function(a,b,c,d,f){var i=e.getRoot(a),i=b?e.nodeChildren(a,b):e.nodeChildren(a,i),g=b?!1:d,k=e.getRoot(a).expandTriggerFlag;e.getRoot(a).expandTriggerFlag=!1;if(i)for(var h=0,l=i.length;h=0;d--)if(b===c[d])return!0;return!1},makeDOMNodeIcon:function(a,b,c){var d=e.nodeName(b,c),d=b.view.nameIsHTML?d:d.replace(/&/g,"&").replace(//g,">");a.push("",d,"")},makeDOMNodeLine:function(a,b,c){a.push("")},makeDOMNodeMainAfter:function(a){a.push("
                              • ")},makeDOMNodeMainBefore:function(a,b,c){a.push("
                              • ")},makeDOMNodeNameAfter:function(a){a.push("")},makeDOMNodeNameBefore:function(a,b,c){var d= +e.nodeTitle(b,c),f=j.makeNodeUrl(b,c),i=j.makeNodeFontCss(b,c),m=[],k;for(k in i)m.push(k,":",i[k],";");a.push("0?"href='"+f+"'":""," target='",j.makeNodeTarget(c),"' style='",m.join(""),"'");h.apply(b.view.showTitle,[b.treeId,c],b.view.showTitle)&&d&&a.push("title='",d.replace(/'/g,"'").replace(//g,">"),"'");a.push(">")},makeNodeFontCss:function(a, +b){var c=h.apply(a.view.fontCss,[a.treeId,b],a.view.fontCss);return c&&typeof c!="function"?c:{}},makeNodeIcoClass:function(a,b){var c=["ico"];if(!b.isAjaxing){var d=e.nodeIsParent(a,b);c[0]=(b.iconSkin?b.iconSkin+"_":"")+c[0];d?c.push(b.open?g.folder.OPEN:g.folder.CLOSE):c.push(g.folder.DOCU)}return g.className.BUTTON+" "+c.join("_")},makeNodeIcoStyle:function(a,b){var c=[];if(!b.isAjaxing){var d=e.nodeIsParent(a,b)&&b.iconOpen&&b.iconClose?b.open?b.iconOpen:b.iconClose:b[a.data.key.icon];d&&c.push("background:url(", +d,") 0 0 no-repeat;");(a.view.showIcon==!1||!h.apply(a.view.showIcon,[a.treeId,b],!0))&&c.push("width:0px;height:0px;")}return c.join("")},makeNodeLineClass:function(a,b){var c=[];a.view.showLine?b.level==0&&b.isFirstNode&&b.isLastNode?c.push(g.line.ROOT):b.level==0&&b.isFirstNode?c.push(g.line.ROOTS):b.isLastNode?c.push(g.line.BOTTOM):c.push(g.line.CENTER):c.push(g.line.NOLINE);e.nodeIsParent(a,b)?c.push(b.open?g.folder.OPEN:g.folder.CLOSE):c.push(g.folder.DOCU);return j.makeNodeLineClassEx(b)+c.join("_")}, +makeNodeLineClassEx:function(a){return g.className.BUTTON+" "+g.className.LEVEL+a.level+" "+g.className.SWITCH+" "},makeNodeTarget:function(a){return a.target||"_blank"},makeNodeUrl:function(a,b){var c=a.data.key.url;return b[c]?b[c]:null},makeUlHtml:function(a,b,c,d){c.push("
                                  ");c.push(d);c.push("
                                ")},makeUlLineClass:function(a,b){return a.view.showLine&&!b.isLastNode? +g.line.LINE:""},removeChildNodes:function(a,b){if(b){var c=e.nodeChildren(a,b);if(c){for(var d=0,f=c.length;dc.bottom||d.right>c.right||d.left0)c[0].isFirstNode= +!0},setLastNode:function(a,b){var c=e.nodeChildren(a,b);if(c.length>0)c[c.length-1].isLastNode=!0},removeNode:function(a,b){var c=e.getRoot(a),d=b.parentTId?b.getParentNode():c;b.isFirstNode=!1;b.isLastNode=!1;b.getPreNode=function(){return null};b.getNextNode=function(){return null};if(e.getNodeCache(a,b.tId)){l(b,a).remove();e.removeNodeCache(a,b);e.removeSelectedNode(a,b);for(var f=e.nodeChildren(a,d),i=0,h=f.length;i0){var q=f[i-1],i=l(q,g.id.UL,a),h=l(q,g.id.SWITCH,a);k=l(q,g.id.ICON,a);d==c?f.length==1?j.replaceSwitchClass(q,h,g.line.ROOT):(c=l(f[0],g.id.SWITCH,a),j.replaceSwitchClass(f[0],c,g.line.ROOTS),j.replaceSwitchClass(q, +h,g.line.BOTTOM)):j.replaceSwitchClass(q,h,g.line.BOTTOM);i.removeClass(g.line.LINE)}}},replaceIcoClass:function(a,b,c){if(b&&!a.isAjaxing&&(a=b.attr("class"),a!=void 0)){a=a.split("_");switch(c){case g.folder.OPEN:case g.folder.CLOSE:case g.folder.DOCU:a[a.length-1]=c}b.attr("class",a.join("_"))}},replaceSwitchClass:function(a,b,c){if(b){var d=b.attr("class");if(d!=void 0){d=d.split("_");switch(c){case g.line.ROOT:case g.line.ROOTS:case g.line.CENTER:case g.line.BOTTOM:case g.line.NOLINE:d[0]=j.makeNodeLineClassEx(a)+ +c;break;case g.folder.OPEN:case g.folder.CLOSE:case g.folder.DOCU:d[1]=c}b.attr("class",d.join("_"));c!==g.folder.DOCU?b.removeAttr("disabled"):b.attr("disabled","disabled")}}},selectNode:function(a,b,c){c||j.cancelPreSelectedNode(a,null,b);l(b,g.id.A,a).addClass(g.node.CURSELECTED);e.addSelectedNode(a,b);a.treeObj.trigger(g.event.SELECTED,[a.treeId,b])},setNodeFontCss:function(a,b){var c=l(b,g.id.A,a),d=j.makeNodeFontCss(a,b);d&&c.css(d)},setNodeLineIcos:function(a,b){if(b){var c=l(b,g.id.SWITCH, +a),d=l(b,g.id.UL,a),f=l(b,g.id.ICON,a),i=j.makeUlLineClass(a,b);i.length==0?d.removeClass(g.line.LINE):d.addClass(i);c.attr("class",j.makeNodeLineClass(a,b));e.nodeIsParent(a,b)?c.removeAttr("disabled"):c.attr("disabled","disabled");f.removeAttr("style");f.attr("style",j.makeNodeIcoStyle(a,b));f.attr("class",j.makeNodeIcoClass(a,b))}},setNodeName:function(a,b){var c=e.nodeTitle(a,b),d=l(b,g.id.SPAN,a);d.empty();a.view.nameIsHTML?d.html(e.nodeName(a,b)):d.text(e.nodeName(a,b));h.apply(a.view.showTitle, +[a.treeId,b],a.view.showTitle)&&l(b,g.id.A,a).attr("title",!c?"":c)},setNodeTarget:function(a,b){l(b,g.id.A,a).attr("target",j.makeNodeTarget(b))},setNodeUrl:function(a,b){var c=l(b,g.id.A,a),d=j.makeNodeUrl(a,b);d==null||d.length==0?c.removeAttr("href"):c.attr("href",d)},switchNode:function(a,b){b.open||!h.canAsync(a,b)?j.expandCollapseNode(a,b,!b.open):a.async.enable?j.asyncNode(a,b)||j.expandCollapseNode(a,b,!b.open):b&&j.expandCollapseNode(a,b,!b.open)}};r.fn.zTree={consts:{className:{BUTTON:"button", +LEVEL:"level",ICO_LOADING:"ico_loading",SWITCH:"switch",NAME:"node_name"},event:{NODECREATED:"ztree_nodeCreated",CLICK:"ztree_click",EXPAND:"ztree_expand",COLLAPSE:"ztree_collapse",ASYNC_SUCCESS:"ztree_async_success",ASYNC_ERROR:"ztree_async_error",REMOVE:"ztree_remove",SELECTED:"ztree_selected",UNSELECTED:"ztree_unselected"},id:{A:"_a",ICON:"_ico",SPAN:"_span",SWITCH:"_switch",UL:"_ul"},line:{ROOT:"root",ROOTS:"roots",CENTER:"center",BOTTOM:"bottom",NOLINE:"noline",LINE:"line"},folder:{OPEN:"open", +CLOSE:"close",DOCU:"docu"},node:{CURSELECTED:"curSelectedNode"}},_z:{tools:h,view:j,event:n,data:e},getZTreeObj:function(a){return(a=e.getZTreeTools(a))?a:null},destroy:function(a){if(a&&a.length>0)j.destroy(e.getSetting(a));else for(var b in t)j.destroy(t[b])},init:function(a,b,c){var d=h.clone(P);r.extend(!0,d,b);d.treeId=a.attr("id");d.treeObj=a;d.treeObj.empty();t[d.treeId]=d;if(typeof document.body.style.maxHeight==="undefined")d.view.expandSpeed="";e.initRoot(d);a=e.getRoot(d);c=c?h.clone(h.isArray(c)? +c:[c]):[];d.data.simpleData.enable?e.nodeChildren(d,a,e.transformTozTreeFormat(d,c)):e.nodeChildren(d,a,c);e.initCache(d);n.unbindTree(d);n.bindTree(d);n.unbindEvent(d);n.bindEvent(d);var f={setting:d,addNodes:function(a,b,c,f){function g(){j.addNodes(d,a,b,n,f==!0)}a||(a=null);var l=e.nodeIsParent(d,a);if(a&&!l&&d.data.keep.leaf)return null;l=parseInt(b,10);isNaN(l)?(f=!!c,c=b,b=-1):b=l;if(!c)return null;var n=h.clone(h.isArray(c)?c:[c]);h.canAsync(d,a)?j.asyncNode(d,a,f,g):g();return n},cancelSelectedNode:function(a){j.cancelPreSelectedNode(d, +a)},destroy:function(){j.destroy(d)},expandAll:function(a){a=!!a;j.expandCollapseSonNode(d,null,a,!0);return a},expandNode:function(a,b,c,f,g){function n(){var b=l(a,d).get(0);b&&f!==!1&&j.scrollIntoView(d,b)}if(!a||!e.nodeIsParent(d,a))return null;b!==!0&&b!==!1&&(b=!a.open);if((g=!!g)&&b&&h.apply(d.callback.beforeExpand,[d.treeId,a],!0)==!1)return null;else if(g&&!b&&h.apply(d.callback.beforeCollapse,[d.treeId,a],!0)==!1)return null;b&&a.parentTId&&j.expandCollapseParentNode(d,a.getParentNode(), +b,!1);if(b===a.open&&!c)return null;e.getRoot(d).expandTriggerFlag=g;!h.canAsync(d,a)&&c?j.expandCollapseSonNode(d,a,b,!0,n):(a.open=!b,j.switchNode(this.setting,a),n());return b},getNodes:function(){return e.getNodes(d)},getNodeByParam:function(a,b,c){return!a?null:e.getNodeByParam(d,c?e.nodeChildren(d,c):e.getNodes(d),a,b)},getNodeByTId:function(a){return e.getNodeCache(d,a)},getNodesByParam:function(a,b,c){return!a?null:e.getNodesByParam(d,c?e.nodeChildren(d,c):e.getNodes(d),a,b)},getNodesByParamFuzzy:function(a, +b,c){return!a?null:e.getNodesByParamFuzzy(d,c?e.nodeChildren(d,c):e.getNodes(d),a,b)},getNodesByFilter:function(a,b,c,f){b=!!b;return!a||typeof a!="function"?b?null:[]:e.getNodesByFilter(d,c?e.nodeChildren(d,c):e.getNodes(d),a,b,f)},getNodeIndex:function(a){if(!a)return null;for(var b=a.parentTId?a.getParentNode():e.getRoot(d),b=e.nodeChildren(d,b),c=0,f=b.length;c0?j.createNodes(d,0,c,null,-1):d.async.enable&&d.async.url&&d.async.url!==""&&j.asyncNode(d);return f}};var Q=r.fn.zTree,l=h.$,g=Q.consts})(jQuery); + +/* + * JQuery zTree excheck v3.5.40 + * http://treejs.cn/ + * + * Copyright (c) 2010 Hunter.z + * + * Licensed same as jquery - MIT License + * http://www.opensource.org/licenses/mit-license.php + * + * email: hunter.z@263.net + * Date: 2019-01-18 + */ +(function(m){var p,q,r,o={event:{CHECK:"ztree_check"},id:{CHECK:"_check"},checkbox:{STYLE:"checkbox",DEFAULT:"chk",DISABLED:"disable",FALSE:"false",TRUE:"true",FULL:"full",PART:"part",FOCUS:"focus"},radio:{STYLE:"radio",TYPE_ALL:"all",TYPE_LEVEL:"level"}},v={check:{enable:!1,autoCheckTrigger:!1,chkStyle:o.checkbox.STYLE,nocheckInherit:!1,chkDisabledInherit:!1,radioType:o.radio.TYPE_LEVEL,chkboxType:{Y:"ps",N:"ps"}},data:{key:{checked:"checked"}},callback:{beforeCheck:null,onCheck:null}};p=function(c, +a){if(a.chkDisabled===!0)return!1;var b=f.getSetting(c.data.treeId);if(i.apply(b.callback.beforeCheck,[b.treeId,a],!0)==!1)return!0;var d=f.nodeChecked(b,a);f.nodeChecked(b,a,!d);e.checkNodeRelation(b,a);d=n(a,h.id.CHECK,b);e.setChkClass(b,d,a);e.repairParentChkClassWithSelf(b,a);b.treeObj.trigger(h.event.CHECK,[c,b.treeId,a]);return!0};q=function(c,a){if(a.chkDisabled===!0)return!1;var b=f.getSetting(c.data.treeId),d=n(a,h.id.CHECK,b);a.check_Focus=!0;e.setChkClass(b,d,a);return!0};r=function(c, +a){if(a.chkDisabled===!0)return!1;var b=f.getSetting(c.data.treeId),d=n(a,h.id.CHECK,b);a.check_Focus=!1;e.setChkClass(b,d,a);return!0};m.extend(!0,m.fn.zTree.consts,o);m.extend(!0,m.fn.zTree._z,{tools:{},view:{checkNodeRelation:function(c,a){var b,d,j;d=h.radio;b=f.nodeChecked(c,a);if(c.check.chkStyle==d.STYLE){var g=f.getRadioCheckedList(c);if(b)if(c.check.radioType==d.TYPE_ALL){for(d=g.length-1;d>=0;d--){b=g[d];var k=f.nodeChecked(c,b);k&&b!=a&&(f.nodeChecked(c,b,!1),g.splice(d,1),e.setChkClass(c, +n(b,h.id.CHECK,c),b),b.parentTId!=a.parentTId&&e.repairParentChkClassWithSelf(c,b))}g.push(a)}else{g=a.parentTId?a.getParentNode():f.getRoot(c);g=f.nodeChildren(c,g);for(d=0,j=g.length;d-1)&&e.setSonNodeCheckBox(c,a, +!0),!b&&(!g||g.length==0||c.check.chkboxType.N.indexOf("s")>-1)&&e.setSonNodeCheckBox(c,a,!1),b&&c.check.chkboxType.Y.indexOf("p")>-1&&e.setParentNodeCheckBox(c,a,!0),!b&&c.check.chkboxType.N.indexOf("p")>-1&&e.setParentNodeCheckBox(c,a,!1)},makeChkClass:function(c,a){var b=h.checkbox,d=h.radio,j="",g=f.nodeChecked(c,a),j=a.chkDisabled===!0?b.DISABLED:a.halfCheck?b.PART:c.check.chkStyle==d.STYLE?a.check_Child_State<1?b.FULL:b.PART:g?a.check_Child_State===2||a.check_Child_State===-1?b.FULL:b.PART: +a.check_Child_State<1?b.FULL:b.PART,d=c.check.chkStyle+"_"+(g?b.TRUE:b.FALSE)+"_"+j,d=a.check_Focus&&a.chkDisabled!==!0?d+"_"+b.FOCUS:d;return h.className.BUTTON+" "+b.DEFAULT+" "+d},repairAllChk:function(c,a){if(c.check.enable&&c.check.chkStyle===h.checkbox.STYLE)for(var b=f.getRoot(c),b=f.nodeChildren(c,b),d=0,j=b.length;d0?e.repairParentChkClass(c,b[0]):e.repairParentChkClass(c,a)}},repairSonChkDisabled:function(c,a,b,d){if(a){if(a.chkDisabled!=b)a.chkDisabled=b;e.repairChkClass(c,a);if((a=f.nodeChildren(c,a))&&d)for(var j=0,g=a.length;j0){j=!1;break}}j&&e.setParentNodeCheckBox(c,a.getParentNode(),b,d)}},setSonNodeCheckBox:function(c,a,b,d){if(a){var j=n(a,h.id.CHECK,c);d||(d=a);var g=!1,k=f.nodeChildren(c,a);if(k)for(var i=0,l=k.length;i0?b?2:0:-1}else a.check_Child_State=-1;e.setChkClass(c,j,a);c.check.autoCheckTrigger&&a!=d&&a.nocheck!==!0&&a.chkDisabled!==!0&&c.treeObj.trigger(h.event.CHECK,[null,c.treeId,a])}}}},event:{},data:{getRadioCheckedList:function(c){for(var a=f.getRoot(c).radioCheckedList,b=0,d=a.length;b-1&&a.check_Child_State<2:a.check_Child_State>0}},getTreeCheckedNodes:function(c,a,b,d){if(!a)return[];for(var j=b&&c.check.chkStyle==h.radio.STYLE&&c.check.radioType==h.radio.TYPE_ALL,d=!d?[]:d,g=0,e=a.length;g0)break}return d},getTreeChangeCheckedNodes:function(c,a,b){if(!a)return[];for(var b=!b?[]:b,d=0,j=a.length;d0?2:0,l==2){b=2;break}else l==0&&(b=0);else if(c.check.chkStyle==h.checkbox.STYLE)if(l=e.nocheck===!0||e.chkDisabled===!0?e.check_Child_State:e.halfCheck===!0?1:i?e.check_Child_State===-1||e.check_Child_State===2?2:1:e.check_Child_State>0?1:0,l===1){b=1;break}else if(l===2&&b>-1&&j>0&&l!== +b){b=1;break}else if(b===2&&l>-1&&l<2){b=1;break}else l>-1&&(b=l)}a.check_Child_State=b}}}});var m=m.fn.zTree,i=m._z.tools,h=m.consts,e=m._z.view,f=m._z.data,n=i.$;f.nodeChecked=function(c,a,b){if(!a)return!1;c=c.data.key.checked;typeof b!=="undefined"?(typeof b==="string"&&(b=i.eqs(b,"true")),a[c]=!!b):a[c]=typeof a[c]=="string"?i.eqs(a[c],"true"):!!a[c];return a[c]};f.exSetting(v);f.addInitBind(function(c){c.treeObj.bind(h.event.CHECK,function(a,b,d,e){a.srcEvent=b;i.apply(c.callback.onCheck,[a, +d,e])})});f.addInitUnBind(function(c){c.treeObj.unbind(h.event.CHECK)});f.addInitCache(function(){});f.addInitNode(function(c,a,b,d){if(b){a=f.nodeChecked(c,b);b.checkedOld=a;if(typeof b.nocheck=="string")b.nocheck=i.eqs(b.nocheck,"true");b.nocheck=!!b.nocheck||c.check.nocheckInherit&&d&&!!d.nocheck;if(typeof b.chkDisabled=="string")b.chkDisabled=i.eqs(b.chkDisabled,"true");b.chkDisabled=!!b.chkDisabled||c.check.chkDisabledInherit&&d&&!!d.chkDisabled;if(typeof b.halfCheck=="string")b.halfCheck=i.eqs(b.halfCheck, +"true");b.halfCheck=!!b.halfCheck;b.check_Child_State=-1;b.check_Focus=!1;b.getCheckStatus=function(){return f.getCheckStatus(c,b)};c.check.chkStyle==h.radio.STYLE&&c.check.radioType==h.radio.TYPE_ALL&&a&&f.getRoot(c).radioCheckedList.push(b)}});f.addInitProxy(function(c){var a=c.target,b=f.getSetting(c.data.treeId),d="",e=null,g="",k=null;if(i.eqs(c.type,"mouseover")){if(b.check.enable&&i.eqs(a.tagName,"span")&&a.getAttribute("treeNode"+h.id.CHECK)!==null)d=i.getNodeMainDom(a).id,g="mouseoverCheck"}else if(i.eqs(c.type, +"mouseout")){if(b.check.enable&&i.eqs(a.tagName,"span")&&a.getAttribute("treeNode"+h.id.CHECK)!==null)d=i.getNodeMainDom(a).id,g="mouseoutCheck"}else if(i.eqs(c.type,"click")&&b.check.enable&&i.eqs(a.tagName,"span")&&a.getAttribute("treeNode"+h.id.CHECK)!==null)d=i.getNodeMainDom(a).id,g="checkNode";if(d.length>0)switch(e=f.getNodeCache(b,d),g){case "checkNode":k=p;break;case "mouseoverCheck":k=q;break;case "mouseoutCheck":k=r}return{stop:g==="checkNode",node:e,nodeEventType:g,nodeEventCallback:k, +treeEventType:"",treeEventCallback:null}},!0);f.addInitRoot(function(c){f.getRoot(c).radioCheckedList=[]});f.addBeforeA(function(c,a,b){c.check.enable&&(f.makeChkFlag(c,a),b.push(""))});f.addZTreeTools(function(c,a){a.checkNode=function(a,b,g,k){var m=f.nodeChecked(c,a);if(a.chkDisabled!==!0&&(b!==!0&&b!==!1&&(b=!m),k=!!k,(m!==b||g)&&!(k&&i.apply(this.setting.callback.beforeCheck, +[this.setting.treeId,a],!0)==!1)&&i.uCanDo(this.setting)&&this.setting.check.enable&&a.nocheck!==!0))f.nodeChecked(c,a,b),b=n(a,h.id.CHECK,this.setting),(g||this.setting.check.chkStyle===h.radio.STYLE)&&e.checkNodeRelation(this.setting,a),e.setChkClass(this.setting,b,a),e.repairParentChkClassWithSelf(this.setting,a),k&&this.setting.treeObj.trigger(h.event.CHECK,[null,this.setting.treeId,a])};a.checkAllNodes=function(a){e.repairAllChk(this.setting,!!a)};a.getCheckedNodes=function(a){var a=a!==!1,b= +f.nodeChildren(c,f.getRoot(this.setting));return f.getTreeCheckedNodes(this.setting,b,a)};a.getChangeCheckedNodes=function(){var a=f.nodeChildren(c,f.getRoot(this.setting));return f.getTreeChangeCheckedNodes(this.setting,a)};a.setChkDisabled=function(a,b,c,f){b=!!b;c=!!c;e.repairSonChkDisabled(this.setting,a,b,!!f);e.repairParentChkDisabled(this.setting,a.getParentNode(),b,c)};var b=a.updateNode;a.updateNode=function(c,f){b&&b.apply(a,arguments);if(c&&this.setting.check.enable&&n(c,this.setting).get(0)&& +i.uCanDo(this.setting)){var g=n(c,h.id.CHECK,this.setting);(f==!0||this.setting.check.chkStyle===h.radio.STYLE)&&e.checkNodeRelation(this.setting,c);e.setChkClass(this.setting,g,c);e.repairParentChkClassWithSelf(this.setting,c)}}});var s=e.createNodes;e.createNodes=function(c,a,b,d,f){s&&s.apply(e,arguments);b&&e.repairParentChkClassWithSelf(c,d)};var t=e.removeNode;e.removeNode=function(c,a){var b=a.getParentNode();t&&t.apply(e,arguments);a&&b&&(e.repairChkClass(c,b),e.repairParentChkClass(c,b))}; +var u=e.appendNodes;e.appendNodes=function(c,a,b,d,h,g,i){var m="";u&&(m=u.apply(e,arguments));d&&f.makeChkFlag(c,d);return m}})(jQuery); + +/* + * JQuery zTree exedit v3.5.40 + * http://treejs.cn/ + * + * Copyright (c) 2010 Hunter.z + * + * Licensed same as jquery - MIT License + * http://www.opensource.org/licenses/mit-license.php + * + * email: hunter.z@263.net + * Date: 2019-01-18 + */ +(function(B){var I={event:{DRAG:"ztree_drag",DROP:"ztree_drop",RENAME:"ztree_rename",DRAGMOVE:"ztree_dragmove"},id:{EDIT:"_edit",INPUT:"_input",REMOVE:"_remove"},move:{TYPE_INNER:"inner",TYPE_PREV:"prev",TYPE_NEXT:"next"},node:{CURSELECTED_EDIT:"curSelectedNode_Edit",TMPTARGET_TREE:"tmpTargetzTree",TMPTARGET_NODE:"tmpTargetNode"}},v={onHoverOverNode:function(a,b){var c=i.getSetting(a.data.treeId),d=i.getRoot(c);if(d.curHoverNode!=b)v.onHoverOutNode(a);d.curHoverNode=b;e.addHoverDom(c,b)},onHoverOutNode:function(a){var a= +i.getSetting(a.data.treeId),b=i.getRoot(a);if(b.curHoverNode&&!i.isSelectedNode(a,b.curHoverNode))e.removeTreeDom(a,b.curHoverNode),b.curHoverNode=null},onMousedownNode:function(a,b){function c(a){if(m.dragFlag==0&&Math.abs(N-a.clientX)1){var o=n[0].parentTId?i.nodeChildren(f,n[0].getParentNode()):i.getNodes(f);g=[];for(b=0,c=o.length;b-1&&p+1!==b&&(j=!1),g.push(o[b]),p=b),n.length===g.length){n=g;break}}j&&(H=n[0].getPreNode(),Q=n[n.length-1].getNextNode());C=q("
                                  ", +f);for(b=0,c=n.length;b0),e.removeTreeDom(f,g),b>f.edit.drag.maxShowNodeNum-1||(j=q("
                                • ",f),j.append(q(g,d.id.A,f).clone()),j.css("padding","0"),j.children("#"+g.tId+d.id.A).removeClass(d.node.CURSELECTED),C.append(j),b==f.edit.drag.maxShowNodeNum-1&&(j=q("
                                • ...
                                • ",f),C.append(j)));C.attr("id",n[0].tId+d.id.UL+"_tmp");C.addClass(f.treeObj.attr("class"));C.appendTo(L);u=q("", +f);u.attr("id","zTreeMove_arrow_tmp");u.appendTo(L);f.treeObj.trigger(d.event.DRAG,[a,f.treeId,n])}if(m.dragFlag==1){t&&u.attr("id")==a.target.id&&w&&a.clientX+G.scrollLeft()+2>B("#"+w+d.id.A,t).offset().left?(g=B("#"+w+d.id.A,t),a.target=g.length>0?g.get(0):a.target):t&&(t.removeClass(d.node.TMPTARGET_TREE),w&&B("#"+w+d.id.A,t).removeClass(d.node.TMPTARGET_NODE+"_"+d.move.TYPE_PREV).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_NEXT).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_INNER)); +w=t=null;J=!1;h=f;g=i.getSettings();for(var z in g)if(g[z].treeId&&g[z].edit.enable&&g[z].treeId!=f.treeId&&(a.target.id==g[z].treeId||B(a.target).parents("#"+g[z].treeId).length>0))J=!0,h=g[z];z=G.scrollTop();j=G.scrollLeft();p=h.treeObj.offset();b=h.treeObj.get(0).scrollHeight;g=h.treeObj.get(0).scrollWidth;c=a.clientY+z-p.top;var E=h.treeObj.height()+p.top-a.clientY-z,r=a.clientX+j-p.left,s=h.treeObj.width()+p.left-a.clientX-j,p=cf.edit.drag.borderMin,o=Ef.edit.drag.borderMin,F=rf.edit.drag.borderMin,v=sf.edit.drag.borderMin,E=c>f.edit.drag.borderMin&&E>f.edit.drag.borderMin&&r>f.edit.drag.borderMin&&s>f.edit.drag.borderMin,r=p&&h.treeObj.scrollTop()<=0,s=o&&h.treeObj.scrollTop()+h.treeObj.height()+10>=b,M=F&&h.treeObj.scrollLeft()<=0,P=v&&h.treeObj.scrollLeft()+h.treeObj.width()+10>=g;if(a.target&&k.isChildOrSelf(a.target,h.treeId)){for(var D=a.target;D&&D.tagName&&!k.eqs(D.tagName,"li")&&D.id!= +h.treeId;)D=D.parentNode;var R=!0;for(b=0,c=n.length;b0){R=!1;break}if(R&&a.target&&k.isChildOrSelf(a.target,D.id+d.id.A))t=B(D),w=D.id}g=n[0];if(E&&k.isChildOrSelf(a.target,h.treeId)){if(!t&&(a.target.id==h.treeId||r||s||M||P)&&(J||!J&&g.parentTId))t=h.treeObj;p?h.treeObj.scrollTop(h.treeObj.scrollTop()-10):o&&h.treeObj.scrollTop(h.treeObj.scrollTop()+10);F?h.treeObj.scrollLeft(h.treeObj.scrollLeft()-10):v&&h.treeObj.scrollLeft(h.treeObj.scrollLeft()+ +10);t&&t!=h.treeObj&&t.offset().left=-0.2)&&g?(j=1-u.width(),b=E-u.height()/2,x=d.move.TYPE_PREV):(M==0||z>=M&&z<=1.2)&&c?(j=1-u.width(),b=v==null||i.nodeIsParent(f,A)&&A.open?E+F.height()-u.height()/2:v.offset().top-u.height()/2,x=d.move.TYPE_NEXT):p?(j=5-u.width(),b=E,x=d.move.TYPE_INNER):o(),t){u.css({display:"block",top:b+"px",left:r+j+"px"});F.addClass(d.node.TMPTARGET_NODE+"_"+x);if(S!=w||T!=x)K=(new Date).getTime();if(A&&i.nodeIsParent(f, +A)&&x==d.move.TYPE_INNER&&(z=!0,window.zTreeMoveTimer&&window.zTreeMoveTargetNodeTId!==A.tId?(clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId=null):window.zTreeMoveTimer&&window.zTreeMoveTargetNodeTId===A.tId&&(z=!1),z))window.zTreeMoveTimer=setTimeout(function(){x==d.move.TYPE_INNER&&A&&i.nodeIsParent(f,A)&&!A.open&&(new Date).getTime()-K>h.edit.drag.autoOpenTime&&k.apply(h.callback.beforeDragOpen,[h.treeId,A],!0)&&(e.switchNode(h,A),h.edit.drag.autoExpandTrigger&&h.treeObj.trigger(d.event.EXPAND, +[h.treeId,A]))},h.edit.drag.autoOpenTime+50),window.zTreeMoveTargetNodeTId=A.tId}}else if(x=d.move.TYPE_INNER,t&&k.apply(h.edit.drag.inner,[h.treeId,n,null],!!h.edit.drag.inner)?t.addClass(d.node.TMPTARGET_TREE):t=null,u.css({display:"none"}),window.zTreeMoveTimer)clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId=null;S=w;T=x;f.treeObj.trigger(d.event.DRAGMOVE,[a,f.treeId,n])}return!1}function l(a){if(window.zTreeMoveTimer)clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId= +null;T=S=null;G.unbind("mousemove",c);G.unbind("mouseup",l);G.unbind("selectstart",g);L.css("cursor","");t&&(t.removeClass(d.node.TMPTARGET_TREE),w&&B("#"+w+d.id.A,t).removeClass(d.node.TMPTARGET_NODE+"_"+d.move.TYPE_PREV).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_NEXT).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_INNER));k.showIfameMask(f,!1);y.showHoverDom=!0;if(m.dragFlag!=0){m.dragFlag=0;var b,j,o;for(b=0,j=n.length;b0;)c.dragMaskList[0].remove(),c.dragMaskList.shift();if(b)for(var d=q("iframe",a),g=0,e=d.length;g
                                  ",a);j.appendTo(q("body",a));c.dragMaskList.push(j)}}},view:{addEditBtn:function(a,b){if(!(b.editNameFlag|| +q(b,d.id.EDIT,a).length>0)&&k.apply(a.edit.showRenameBtn,[a.treeId,b],a.edit.showRenameBtn)){var c=q(b,d.id.A,a),l="";c.append(l);q(b,d.id.EDIT,a).bind("click",function(){if(!k.uCanDo(a)||k.apply(a.callback.beforeEditName,[a.treeId,b],!0)==!1)return!1;e.editNode(a,b);return!1}).show()}},addRemoveBtn:function(a, +b){if(!(b.editNameFlag||q(b,d.id.REMOVE,a).length>0)&&k.apply(a.edit.showRemoveBtn,[a.treeId,b],a.edit.showRemoveBtn)){var c=q(b,d.id.A,a),l="";c.append(l);q(b,d.id.REMOVE,a).bind("click",function(){if(!k.uCanDo(a)||k.apply(a.callback.beforeRemove,[a.treeId,b],!0)==!1)return!1;e.removeNode(a,b);a.treeObj.trigger(d.event.REMOVE, +[a.treeId,b]);return!1}).bind("mousedown",function(){return!0}).show()}},addHoverDom:function(a,b){if(i.getRoots().showHoverDom)b.isHover=!0,a.edit.enable&&(e.addEditBtn(a,b),e.addRemoveBtn(a,b)),k.apply(a.view.addHoverDom,[a.treeId,b])},cancelCurEditNode:function(a,b,c){var l=i.getRoot(a),g=l.curEditNode;if(g){var o=l.curEditInput,b=b?b:c?i.nodeName(a,g):o.val();if(k.apply(a.callback.beforeRename,[a.treeId,g,b,c],!0)===!1)return!1;i.nodeName(a,g,b);q(g,d.id.A,a).removeClass(d.node.CURSELECTED_EDIT); +o.unbind();e.setNodeName(a,g);g.editNameFlag=!1;l.curEditNode=null;l.curEditInput=null;e.selectNode(a,g,!1);a.treeObj.trigger(d.event.RENAME,[a.treeId,g,c])}return l.noSelection=!0},editNode:function(a,b){var c=i.getRoot(a);e.editNodeBlur=!1;if(i.isSelectedNode(a,b)&&c.curEditNode==b&&b.editNameFlag)setTimeout(function(){k.inputFocus(c.curEditInput)},0);else{b.editNameFlag=!0;e.removeTreeDom(a,b);e.cancelCurEditNode(a);e.selectNode(a,b,!1);q(b,d.id.SPAN,a).html("");var l=q(b,d.id.INPUT,a);l.attr("value",i.nodeName(a,b));a.edit.editNameSelectAll?k.inputSelect(l):k.inputFocus(l);l.bind("blur",function(){e.editNodeBlur||e.cancelCurEditNode(a)}).bind("keydown",function(b){b.keyCode=="13"?(e.editNodeBlur=!0,e.cancelCurEditNode(a)):b.keyCode=="27"&&e.cancelCurEditNode(a,null,!0)}).bind("click",function(){return!1}).bind("dblclick",function(){return!1});q(b,d.id.A,a).addClass(d.node.CURSELECTED_EDIT);c.curEditInput=l; +c.noSelection=!1;c.curEditNode=b}},moveNode:function(a,b,c,l,g,k){var j=i.getRoot(a);if(b!=c&&(!a.data.keep.leaf||!b||i.nodeIsParent(a,b)||l!=d.move.TYPE_INNER)){var f=c.parentTId?c.getParentNode():j,m=b===null||b==j;m&&b===null&&(b=j);if(m)l=d.move.TYPE_INNER;j=b.parentTId?b.getParentNode():j;if(l!=d.move.TYPE_PREV&&l!=d.move.TYPE_NEXT)l=d.move.TYPE_INNER;if(l==d.move.TYPE_INNER)if(m)c.parentTId=null;else{if(!i.nodeIsParent(a,b))i.nodeIsParent(a,b,!0),b.open=!!b.open,e.setNodeLineIcos(a,b);c.parentTId= +b.tId}var y;m?y=m=a.treeObj:(!k&&l==d.move.TYPE_INNER?e.expandCollapseNode(a,b,!0,!1):k||e.expandCollapseNode(a,b.getParentNode(),!0,!1),m=q(b,a),y=q(b,d.id.UL,a),m.get(0)&&!y.get(0)&&(y=[],e.makeUlHtml(a,b,y,""),m.append(y.join(""))),y=q(b,d.id.UL,a));var r=q(c,a);r.get(0)?m.get(0)||r.remove():r=e.appendNodes(a,c.level,[c],null,-1,!1,!0).join("");y.get(0)&&l==d.move.TYPE_INNER?y.append(r):m.get(0)&&l==d.move.TYPE_PREV?m.before(r):m.get(0)&&l==d.move.TYPE_NEXT&&m.after(r);var s;y=-1;var r=0,n=null, +m=null,B=c.level,v=i.nodeChildren(a,f),C=i.nodeChildren(a,j),u=i.nodeChildren(a,b);if(c.isFirstNode){if(y=0,v.length>1)n=v[1],n.isFirstNode=!0}else if(c.isLastNode)y=v.length-1,n=v[y-1],n.isLastNode=!0;else for(j=0,s=v.length;j=0&&v.splice(y,1);if(l!=d.move.TYPE_INNER)for(j=0,s=C.length;j0)m=u[u.length-1],m.isLastNode=!1;u.splice(u.length,0,c);c.isLastNode=!0;c.isFirstNode= +u.length==1}else b.isFirstNode&&l==d.move.TYPE_PREV?(C.splice(r,0,c),m=b,m.isFirstNode=!1,c.parentTId=b.parentTId,c.isFirstNode=!0,c.isLastNode=!1):b.isLastNode&&l==d.move.TYPE_NEXT?(C.splice(r+1,0,c),m=b,m.isLastNode=!1,c.parentTId=b.parentTId,c.isFirstNode=!1,c.isLastNode=!0):(l==d.move.TYPE_PREV?C.splice(r,0,c):C.splice(r+1,0,c),c.parentTId=b.parentTId,c.isFirstNode=!1,c.isLastNode=!1);i.fixPIdKeyValue(a,c);i.setSonNodeLevel(a,c.getParentNode(),c);e.setNodeLineIcos(a,c);e.repairNodeLevelClass(a, +c,B);!a.data.keep.parent&&v.length<1?(i.nodeIsParent(a,f,!1),f.open=!1,b=q(f,d.id.UL,a),l=q(f,d.id.SWITCH,a),j=q(f,d.id.ICON,a),e.replaceSwitchClass(f,l,d.folder.DOCU),e.replaceIcoClass(f,j,d.folder.DOCU),b.css("display","none")):n&&e.setNodeLineIcos(a,n);m&&e.setNodeLineIcos(a,m);a.check&&a.check.enable&&e.repairChkClass&&(e.repairChkClass(a,f),e.repairParentChkClassWithSelf(a,f),f!=c.parent&&e.repairParentChkClassWithSelf(a,c));k||e.expandCollapseParentNode(a,c.getParentNode(),!0,g)}},removeEditBtn:function(a, +b){q(b,d.id.EDIT,a).unbind().remove()},removeRemoveBtn:function(a,b){q(b,d.id.REMOVE,a).unbind().remove()},removeTreeDom:function(a,b){b.isHover=!1;e.removeEditBtn(a,b);e.removeRemoveBtn(a,b);k.apply(a.view.removeHoverDom,[a.treeId,b])},repairNodeLevelClass:function(a,b,c){if(c!==b.level){var e=q(b,a),g=q(b,d.id.A,a),a=q(b,d.id.UL,a),c=d.className.LEVEL+c,b=d.className.LEVEL+b.level;e.removeClass(c);e.addClass(b);g.removeClass(c);g.addClass(b);a.removeClass(c);a.addClass(b)}},selectNodes:function(a, +b){for(var c=0,d=b.length;c0)}},event:{},data:{setSonNodeLevel:function(a,b,c){if(c){var d=i.nodeChildren(a,c);c.level=b?b.level+1:0;if(d)for(var b=0,g=d.length;b0)switch(o=i.getNodeCache(c,g),j){case "mousedownNode":f=v.onMousedownNode;break;case "hoverOverNode":f=v.onHoverOverNode; +break;case "hoverOutNode":f=v.onHoverOutNode}return{stop:!1,node:o,nodeEventType:j,nodeEventCallback:f,treeEventType:"",treeEventCallback:null}});i.addInitRoot(function(a){var a=i.getRoot(a),b=i.getRoots();a.curEditNode=null;a.curEditInput=null;a.curHoverNode=null;a.dragFlag=0;a.dragNodeShowBefore=[];a.dragMaskList=[];b.showHoverDom=!0});i.addZTreeTools(function(a,b){b.cancelEditName=function(a){i.getRoot(this.setting).curEditNode&&e.cancelCurEditNode(this.setting,a?a:null,!0)};b.copyNode=function(b, +l,g,o){if(!l)return null;var j=i.nodeIsParent(a,b);if(b&&!j&&this.setting.data.keep.leaf&&g===d.move.TYPE_INNER)return null;var f=this,m=k.clone(l);if(!b)b=null,g=d.move.TYPE_INNER;g==d.move.TYPE_INNER?(l=function(){e.addNodes(f.setting,b,-1,[m],o)},k.canAsync(this.setting,b)?e.asyncNode(this.setting,b,o,l):l()):(e.addNodes(this.setting,b.parentNode,-1,[m],o),e.moveNode(this.setting,b,m,g,!1,o));return m};b.editName=function(a){a&&a.tId&&a===i.getNodeCache(this.setting,a.tId)&&(a.parentTId&&e.expandCollapseParentNode(this.setting, +a.getParentNode(),!0),e.editNode(this.setting,a))};b.moveNode=function(b,l,g,o){function j(){e.moveNode(m.setting,b,l,g,!1,o)}if(!l)return l;var f=i.nodeIsParent(a,b);if(b&&!f&&this.setting.data.keep.leaf&&g===d.move.TYPE_INNER)return null;else if(b&&(l.parentTId==b.tId&&g==d.move.TYPE_INNER||q(l,this.setting).find("#"+b.tId).length>0))return null;else b||(b=null);var m=this;k.canAsync(this.setting,b)&&g===d.move.TYPE_INNER?e.asyncNode(this.setting,b,o,j):j();return l};b.setEditable=function(a){this.setting.edit.enable= +a;return this.refresh()}});var N=e.cancelPreSelectedNode;e.cancelPreSelectedNode=function(a,b){for(var c=i.getRoot(a).curSelectedList,d=0,g=c.length;d 0 && tId.length == 0) { + tmp = tools.getMDom(setting, target, [{tagName: "a", attrName: "treeNode" + consts.id.A}]); + if (tmp) { + tId = tools.getNodeMainDom(tmp).id; + } + } + // event to node + if (tId.length > 0) { + node = data.getNodeCache(setting, tId); + switch (nodeEventType) { + case "switchNode" : + var isParent = data.nodeIsParent(setting, node); + if (!isParent) { + nodeEventType = ""; + } else if (tools.eqs(event.type, "click") + || (tools.eqs(event.type, "dblclick") && tools.apply(setting.view.dblClickExpand, [setting.treeId, node], setting.view.dblClickExpand))) { + nodeEventCallback = handler.onSwitchNode; + } else { + nodeEventType = ""; + } + break; + case "clickNode" : + nodeEventCallback = handler.onClickNode; + break; + } + } + // event to zTree + switch (treeEventType) { + case "mousedown" : + treeEventCallback = handler.onZTreeMousedown; + break; + case "mouseup" : + treeEventCallback = handler.onZTreeMouseup; + break; + case "dblclick" : + treeEventCallback = handler.onZTreeDblclick; + break; + case "contextmenu" : + treeEventCallback = handler.onZTreeContextmenu; + break; + } + var proxyResult = { + stop: false, + node: node, + nodeEventType: nodeEventType, + nodeEventCallback: nodeEventCallback, + treeEventType: treeEventType, + treeEventCallback: treeEventCallback + }; + return proxyResult + }, + //default init node of core + _initNode = function (setting, level, n, parentNode, isFirstNode, isLastNode, openFlag) { + if (!n) return; + var r = data.getRoot(setting), + children = data.nodeChildren(setting, n); + n.level = level; + n.tId = setting.treeId + "_" + (++r.zId); + n.parentTId = parentNode ? parentNode.tId : null; + n.open = (typeof n.open == "string") ? tools.eqs(n.open, "true") : !!n.open; + var isParent = data.nodeIsParent(setting, n); + if (tools.isArray(children)) { + data.nodeIsParent(setting, n, true); + n.zAsync = true; + } else { + isParent = data.nodeIsParent(setting, n, isParent); + n.open = (isParent && !setting.async.enable) ? n.open : false; + n.zAsync = !isParent; + } + n.isFirstNode = isFirstNode; + n.isLastNode = isLastNode; + n.getParentNode = function () { + return data.getNodeCache(setting, n.parentTId); + }; + n.getPreNode = function () { + return data.getPreNode(setting, n); + }; + n.getNextNode = function () { + return data.getNextNode(setting, n); + }; + n.getIndex = function () { + return data.getNodeIndex(setting, n); + }; + n.getPath = function () { + return data.getNodePath(setting, n); + }; + n.isAjaxing = false; + data.fixPIdKeyValue(setting, n); + }, + _init = { + bind: [_bindEvent], + unbind: [_unbindEvent], + caches: [_initCache], + nodes: [_initNode], + proxys: [_eventProxy], + roots: [_initRoot], + beforeA: [], + afterA: [], + innerBeforeA: [], + innerAfterA: [], + zTreeTools: [] + }, + //method of operate data + data = { + addNodeCache: function (setting, node) { + data.getCache(setting).nodes[data.getNodeCacheId(node.tId)] = node; + }, + getNodeCacheId: function (tId) { + return tId.substring(tId.lastIndexOf("_") + 1); + }, + addAfterA: function (afterA) { + _init.afterA.push(afterA); + }, + addBeforeA: function (beforeA) { + _init.beforeA.push(beforeA); + }, + addInnerAfterA: function (innerAfterA) { + _init.innerAfterA.push(innerAfterA); + }, + addInnerBeforeA: function (innerBeforeA) { + _init.innerBeforeA.push(innerBeforeA); + }, + addInitBind: function (bindEvent) { + _init.bind.push(bindEvent); + }, + addInitUnBind: function (unbindEvent) { + _init.unbind.push(unbindEvent); + }, + addInitCache: function (initCache) { + _init.caches.push(initCache); + }, + addInitNode: function (initNode) { + _init.nodes.push(initNode); + }, + addInitProxy: function (initProxy, isFirst) { + if (!!isFirst) { + _init.proxys.splice(0, 0, initProxy); + } else { + _init.proxys.push(initProxy); + } + }, + addInitRoot: function (initRoot) { + _init.roots.push(initRoot); + }, + addNodesData: function (setting, parentNode, index, nodes) { + var children = data.nodeChildren(setting, parentNode), params; + if (!children) { + children = data.nodeChildren(setting, parentNode, []); + index = -1; + } else if (index >= children.length) { + index = -1; + } + + if (children.length > 0 && index === 0) { + children[0].isFirstNode = false; + view.setNodeLineIcos(setting, children[0]); + } else if (children.length > 0 && index < 0) { + children[children.length - 1].isLastNode = false; + view.setNodeLineIcos(setting, children[children.length - 1]); + } + data.nodeIsParent(setting, parentNode, true); + + if (index < 0) { + data.nodeChildren(setting, parentNode, children.concat(nodes)); + } else { + params = [index, 0].concat(nodes); + children.splice.apply(children, params); + } + }, + addSelectedNode: function (setting, node) { + var root = data.getRoot(setting); + if (!data.isSelectedNode(setting, node)) { + root.curSelectedList.push(node); + } + }, + addCreatedNode: function (setting, node) { + if (!!setting.callback.onNodeCreated || !!setting.view.addDiyDom) { + var root = data.getRoot(setting); + root.createdNodes.push(node); + } + }, + addZTreeTools: function (zTreeTools) { + _init.zTreeTools.push(zTreeTools); + }, + exSetting: function (s) { + $.extend(true, _setting, s); + }, + fixPIdKeyValue: function (setting, node) { + if (setting.data.simpleData.enable) { + node[setting.data.simpleData.pIdKey] = node.parentTId ? node.getParentNode()[setting.data.simpleData.idKey] : setting.data.simpleData.rootPId; + } + }, + getAfterA: function (setting, node, array) { + for (var i = 0, j = _init.afterA.length; i < j; i++) { + _init.afterA[i].apply(this, arguments); + } + }, + getBeforeA: function (setting, node, array) { + for (var i = 0, j = _init.beforeA.length; i < j; i++) { + _init.beforeA[i].apply(this, arguments); + } + }, + getInnerAfterA: function (setting, node, array) { + for (var i = 0, j = _init.innerAfterA.length; i < j; i++) { + _init.innerAfterA[i].apply(this, arguments); + } + }, + getInnerBeforeA: function (setting, node, array) { + for (var i = 0, j = _init.innerBeforeA.length; i < j; i++) { + _init.innerBeforeA[i].apply(this, arguments); + } + }, + getCache: function (setting) { + return caches[setting.treeId]; + }, + getNodeIndex: function (setting, node) { + if (!node) return null; + var p = node.parentTId ? node.getParentNode() : data.getRoot(setting), + children = data.nodeChildren(setting, p); + for (var i = 0, l = children.length - 1; i <= l; i++) { + if (children[i] === node) { + return i; + } + } + return -1; + }, + getNextNode: function (setting, node) { + if (!node) return null; + var p = node.parentTId ? node.getParentNode() : data.getRoot(setting), + children = data.nodeChildren(setting, p); + for (var i = 0, l = children.length - 1; i <= l; i++) { + if (children[i] === node) { + return (i == l ? null : children[i + 1]); + } + } + return null; + }, + getNodeByParam: function (setting, nodes, key, value) { + if (!nodes || !key) return null; + for (var i = 0, l = nodes.length; i < l; i++) { + var node = nodes[i]; + if (node[key] == value) { + return nodes[i]; + } + var children = data.nodeChildren(setting, node); + var tmp = data.getNodeByParam(setting, children, key, value); + if (tmp) return tmp; + } + return null; + }, + getNodeCache: function (setting, tId) { + if (!tId) return null; + var n = caches[setting.treeId].nodes[data.getNodeCacheId(tId)]; + return n ? n : null; + }, + getNodePath: function (setting, node) { + if (!node) return null; + + var path; + if (node.parentTId) { + path = node.getParentNode().getPath(); + } else { + path = []; + } + + if (path) { + path.push(node); + } + + return path; + }, + getNodes: function (setting) { + return data.nodeChildren(setting, data.getRoot(setting)); + }, + getNodesByParam: function (setting, nodes, key, value) { + if (!nodes || !key) return []; + var result = []; + for (var i = 0, l = nodes.length; i < l; i++) { + var node = nodes[i]; + if (node[key] == value) { + result.push(node); + } + var children = data.nodeChildren(setting, node); + result = result.concat(data.getNodesByParam(setting, children, key, value)); + } + return result; + }, + getNodesByParamFuzzy: function (setting, nodes, key, value) { + if (!nodes || !key) return []; + var result = []; + value = value.toLowerCase(); + for (var i = 0, l = nodes.length; i < l; i++) { + var node = nodes[i]; + if (typeof node[key] == "string" && nodes[i][key].toLowerCase().indexOf(value) > -1) { + result.push(node); + } + var children = data.nodeChildren(setting, node); + result = result.concat(data.getNodesByParamFuzzy(setting, children, key, value)); + } + return result; + }, + getNodesByFilter: function (setting, nodes, filter, isSingle, invokeParam) { + if (!nodes) return (isSingle ? null : []); + var result = isSingle ? null : []; + for (var i = 0, l = nodes.length; i < l; i++) { + var node = nodes[i]; + if (tools.apply(filter, [node, invokeParam], false)) { + if (isSingle) { + return node; + } + result.push(node); + } + var children = data.nodeChildren(setting, node); + var tmpResult = data.getNodesByFilter(setting, children, filter, isSingle, invokeParam); + if (isSingle && !!tmpResult) { + return tmpResult; + } + result = isSingle ? tmpResult : result.concat(tmpResult); + } + return result; + }, + getPreNode: function (setting, node) { + if (!node) return null; + var p = node.parentTId ? node.getParentNode() : data.getRoot(setting), + children = data.nodeChildren(setting, p); + for (var i = 0, l = children.length; i < l; i++) { + if (children[i] === node) { + return (i == 0 ? null : children[i - 1]); + } + } + return null; + }, + getRoot: function (setting) { + return setting ? roots[setting.treeId] : null; + }, + getRoots: function () { + return roots; + }, + getSetting: function (treeId) { + return settings[treeId]; + }, + getSettings: function () { + return settings; + }, + getZTreeTools: function (treeId) { + var r = this.getRoot(this.getSetting(treeId)); + return r ? r.treeTools : null; + }, + initCache: function (setting) { + for (var i = 0, j = _init.caches.length; i < j; i++) { + _init.caches[i].apply(this, arguments); + } + }, + initNode: function (setting, level, node, parentNode, preNode, nextNode) { + for (var i = 0, j = _init.nodes.length; i < j; i++) { + _init.nodes[i].apply(this, arguments); + } + }, + initRoot: function (setting) { + for (var i = 0, j = _init.roots.length; i < j; i++) { + _init.roots[i].apply(this, arguments); + } + }, + isSelectedNode: function (setting, node) { + var root = data.getRoot(setting); + for (var i = 0, j = root.curSelectedList.length; i < j; i++) { + if (node === root.curSelectedList[i]) return true; + } + return false; + }, + nodeChildren: function (setting, node, newChildren) { + if (!node) { + return null; + } + var key = setting.data.key.children; + if (typeof newChildren !== 'undefined') { + node[key] = newChildren; + } + return node[key]; + }, + nodeIsParent: function (setting, node, newIsParent) { + if (!node) { + return false; + } + var key = setting.data.key.isParent; + if (typeof newIsParent !== 'undefined') { + if (typeof newIsParent === "string") { + newIsParent = tools.eqs(newIsParent, "true"); + } + newIsParent = !!newIsParent; + node[key] = newIsParent; + } else if (typeof node[key] == "string"){ + node[key] = tools.eqs(node[key], "true"); + } else { + node[key] = !!node[key]; + } + return node[key]; + }, + nodeName: function (setting, node, newName) { + var key = setting.data.key.name; + if (typeof newName !== 'undefined') { + node[key] = newName; + } + return "" + node[key]; + }, + nodeTitle: function (setting, node) { + var t = setting.data.key.title === "" ? setting.data.key.name : setting.data.key.title; + return "" + node[t]; + }, + removeNodeCache: function (setting, node) { + var children = data.nodeChildren(setting, node); + if (children) { + for (var i = 0, l = children.length; i < l; i++) { + data.removeNodeCache(setting, children[i]); + } + } + data.getCache(setting).nodes[data.getNodeCacheId(node.tId)] = null; + }, + removeSelectedNode: function (setting, node) { + var root = data.getRoot(setting); + for (var i = 0, j = root.curSelectedList.length; i < j; i++) { + if (node === root.curSelectedList[i] || !data.getNodeCache(setting, root.curSelectedList[i].tId)) { + root.curSelectedList.splice(i, 1); + setting.treeObj.trigger(consts.event.UNSELECTED, [setting.treeId, node]); + i--; + j--; + } + } + }, + setCache: function (setting, cache) { + caches[setting.treeId] = cache; + }, + setRoot: function (setting, root) { + roots[setting.treeId] = root; + }, + setZTreeTools: function (setting, zTreeTools) { + for (var i = 0, j = _init.zTreeTools.length; i < j; i++) { + _init.zTreeTools[i].apply(this, arguments); + } + }, + transformToArrayFormat: function (setting, nodes) { + if (!nodes) return []; + var r = []; + if (tools.isArray(nodes)) { + for (var i = 0, l = nodes.length; i < l; i++) { + var node = nodes[i]; + _do(node); + } + } else { + _do(nodes); + } + return r; + + function _do(_node) { + r.push(_node); + var children = data.nodeChildren(setting, _node); + if (children) { + r = r.concat(data.transformToArrayFormat(setting, children)); + } + } + }, + transformTozTreeFormat: function (setting, sNodes) { + var i, l, + key = setting.data.simpleData.idKey, + parentKey = setting.data.simpleData.pIdKey; + if (!key || key == "" || !sNodes) return []; + + if (tools.isArray(sNodes)) { + var r = []; + var tmpMap = {}; + for (i = 0, l = sNodes.length; i < l; i++) { + tmpMap[sNodes[i][key]] = sNodes[i]; + } + for (i = 0, l = sNodes.length; i < l; i++) { + var p = tmpMap[sNodes[i][parentKey]]; + if (p && sNodes[i][key] != sNodes[i][parentKey]) { + var children = data.nodeChildren(setting, p); + if (!children) { + children = data.nodeChildren(setting, p, []); + } + children.push(sNodes[i]); + } else { + r.push(sNodes[i]); + } + } + return r; + } else { + return [sNodes]; + } + } + }, + //method of event proxy + event = { + bindEvent: function (setting) { + for (var i = 0, j = _init.bind.length; i < j; i++) { + _init.bind[i].apply(this, arguments); + } + }, + unbindEvent: function (setting) { + for (var i = 0, j = _init.unbind.length; i < j; i++) { + _init.unbind[i].apply(this, arguments); + } + }, + bindTree: function (setting) { + var eventParam = { + treeId: setting.treeId + }, + o = setting.treeObj; + if (!setting.view.txtSelectedEnable) { + // for can't select text + o.bind('selectstart', handler.onSelectStart).css({ + "-moz-user-select": "-moz-none" + }); + } + o.bind('click', eventParam, event.proxy); + o.bind('dblclick', eventParam, event.proxy); + o.bind('mouseover', eventParam, event.proxy); + o.bind('mouseout', eventParam, event.proxy); + o.bind('mousedown', eventParam, event.proxy); + o.bind('mouseup', eventParam, event.proxy); + o.bind('contextmenu', eventParam, event.proxy); + }, + unbindTree: function (setting) { + var o = setting.treeObj; + o.unbind('selectstart', handler.onSelectStart) + .unbind('click', event.proxy) + .unbind('dblclick', event.proxy) + .unbind('mouseover', event.proxy) + .unbind('mouseout', event.proxy) + .unbind('mousedown', event.proxy) + .unbind('mouseup', event.proxy) + .unbind('contextmenu', event.proxy); + }, + doProxy: function (e) { + var results = []; + for (var i = 0, j = _init.proxys.length; i < j; i++) { + var proxyResult = _init.proxys[i].apply(this, arguments); + results.push(proxyResult); + if (proxyResult.stop) { + break; + } + } + return results; + }, + proxy: function (e) { + var setting = data.getSetting(e.data.treeId); + if (!tools.uCanDo(setting, e)) return true; + var results = event.doProxy(e), + r = true, x = false; + for (var i = 0, l = results.length; i < l; i++) { + var proxyResult = results[i]; + if (proxyResult.nodeEventCallback) { + x = true; + r = proxyResult.nodeEventCallback.apply(proxyResult, [e, proxyResult.node]) && r; + } + if (proxyResult.treeEventCallback) { + x = true; + r = proxyResult.treeEventCallback.apply(proxyResult, [e, proxyResult.node]) && r; + } + } + return r; + } + }, + //method of event handler + handler = { + onSwitchNode: function (event, node) { + var setting = data.getSetting(event.data.treeId); + if (node.open) { + if (tools.apply(setting.callback.beforeCollapse, [setting.treeId, node], true) == false) return true; + data.getRoot(setting).expandTriggerFlag = true; + view.switchNode(setting, node); + } else { + if (tools.apply(setting.callback.beforeExpand, [setting.treeId, node], true) == false) return true; + data.getRoot(setting).expandTriggerFlag = true; + view.switchNode(setting, node); + } + return true; + }, + onClickNode: function (event, node) { + var setting = data.getSetting(event.data.treeId), + clickFlag = ((setting.view.autoCancelSelected && (event.ctrlKey || event.metaKey)) && data.isSelectedNode(setting, node)) ? 0 : (setting.view.autoCancelSelected && (event.ctrlKey || event.metaKey) && setting.view.selectedMulti) ? 2 : 1; + if (tools.apply(setting.callback.beforeClick, [setting.treeId, node, clickFlag], true) == false) return true; + if (clickFlag === 0) { + view.cancelPreSelectedNode(setting, node); + } else { + view.selectNode(setting, node, clickFlag === 2); + } + setting.treeObj.trigger(consts.event.CLICK, [event, setting.treeId, node, clickFlag]); + return true; + }, + onZTreeMousedown: function (event, node) { + var setting = data.getSetting(event.data.treeId); + if (tools.apply(setting.callback.beforeMouseDown, [setting.treeId, node], true)) { + tools.apply(setting.callback.onMouseDown, [event, setting.treeId, node]); + } + return true; + }, + onZTreeMouseup: function (event, node) { + var setting = data.getSetting(event.data.treeId); + if (tools.apply(setting.callback.beforeMouseUp, [setting.treeId, node], true)) { + tools.apply(setting.callback.onMouseUp, [event, setting.treeId, node]); + } + return true; + }, + onZTreeDblclick: function (event, node) { + var setting = data.getSetting(event.data.treeId); + if (tools.apply(setting.callback.beforeDblClick, [setting.treeId, node], true)) { + tools.apply(setting.callback.onDblClick, [event, setting.treeId, node]); + } + return true; + }, + onZTreeContextmenu: function (event, node) { + var setting = data.getSetting(event.data.treeId); + if (tools.apply(setting.callback.beforeRightClick, [setting.treeId, node], true)) { + tools.apply(setting.callback.onRightClick, [event, setting.treeId, node]); + } + return (typeof setting.callback.onRightClick) != "function"; + }, + onSelectStart: function (e) { + var n = e.originalEvent.srcElement.nodeName.toLowerCase(); + return (n === "input" || n === "textarea"); + } + }, + //method of tools for zTree + tools = { + apply: function (fun, param, defaultValue) { + if ((typeof fun) == "function") { + return fun.apply(zt, param ? param : []); + } + return defaultValue; + }, + canAsync: function (setting, node) { + var children = data.nodeChildren(setting, node); + var isParent = data.nodeIsParent(setting, node); + return (setting.async.enable && node && isParent && !(node.zAsync || (children && children.length > 0))); + }, + clone: function (obj) { + if (obj === null) return null; + var o = tools.isArray(obj) ? [] : {}; + for (var i in obj) { + o[i] = (obj[i] instanceof Date) ? new Date(obj[i].getTime()) : (typeof obj[i] === "object" ? tools.clone(obj[i]) : obj[i]); + } + return o; + }, + eqs: function (str1, str2) { + return str1.toLowerCase() === str2.toLowerCase(); + }, + isArray: function (arr) { + return Object.prototype.toString.apply(arr) === "[object Array]"; + }, + isElement: function (o) { + return ( + typeof HTMLElement === "object" ? o instanceof HTMLElement : //DOM2 + o && typeof o === "object" && o !== null && o.nodeType === 1 && typeof o.nodeName === "string" + ); + }, + $: function (node, exp, setting) { + if (!!exp && typeof exp != "string") { + setting = exp; + exp = ""; + } + if (typeof node == "string") { + return $(node, setting ? setting.treeObj.get(0).ownerDocument : null); + } else { + return $("#" + node.tId + exp, setting ? setting.treeObj : null); + } + }, + getMDom: function (setting, curDom, targetExpr) { + if (!curDom) return null; + while (curDom && curDom.id !== setting.treeId) { + for (var i = 0, l = targetExpr.length; curDom.tagName && i < l; i++) { + if (tools.eqs(curDom.tagName, targetExpr[i].tagName) && curDom.getAttribute(targetExpr[i].attrName) !== null) { + return curDom; + } + } + curDom = curDom.parentNode; + } + return null; + }, + getNodeMainDom: function (target) { + return ($(target).parent("li").get(0) || $(target).parentsUntil("li").parent().get(0)); + }, + isChildOrSelf: function (dom, parentId) { + return ($(dom).closest("#" + parentId).length > 0); + }, + uCanDo: function (setting, e) { + return true; + } + }, + //method of operate ztree dom + view = { + addNodes: function (setting, parentNode, index, newNodes, isSilent) { + var isParent = data.nodeIsParent(setting, parentNode); + if (setting.data.keep.leaf && parentNode && !isParent) { + return; + } + if (!tools.isArray(newNodes)) { + newNodes = [newNodes]; + } + if (setting.data.simpleData.enable) { + newNodes = data.transformTozTreeFormat(setting, newNodes); + } + if (parentNode) { + var target_switchObj = $$(parentNode, consts.id.SWITCH, setting), + target_icoObj = $$(parentNode, consts.id.ICON, setting), + target_ulObj = $$(parentNode, consts.id.UL, setting); + + if (!parentNode.open) { + view.replaceSwitchClass(parentNode, target_switchObj, consts.folder.CLOSE); + view.replaceIcoClass(parentNode, target_icoObj, consts.folder.CLOSE); + parentNode.open = false; + target_ulObj.css({ + "display": "none" + }); + } + + data.addNodesData(setting, parentNode, index, newNodes); + view.createNodes(setting, parentNode.level + 1, newNodes, parentNode, index); + if (!isSilent) { + view.expandCollapseParentNode(setting, parentNode, true); + } + } else { + data.addNodesData(setting, data.getRoot(setting), index, newNodes); + view.createNodes(setting, 0, newNodes, null, index); + } + }, + appendNodes: function (setting, level, nodes, parentNode, index, initFlag, openFlag) { + if (!nodes) return []; + var html = []; + + var tmpPNode = (parentNode) ? parentNode : data.getRoot(setting), + tmpPChild = data.nodeChildren(setting, tmpPNode), + isFirstNode, isLastNode; + + if (!tmpPChild || index >= tmpPChild.length - nodes.length) { + index = -1; + } + + for (var i = 0, l = nodes.length; i < l; i++) { + var node = nodes[i]; + if (initFlag) { + isFirstNode = ((index === 0 || tmpPChild.length == nodes.length) && (i == 0)); + isLastNode = (index < 0 && i == (nodes.length - 1)); + data.initNode(setting, level, node, parentNode, isFirstNode, isLastNode, openFlag); + data.addNodeCache(setting, node); + } + var isParent = data.nodeIsParent(setting, node); + + var childHtml = []; + var children = data.nodeChildren(setting, node); + if (children && children.length > 0) { + //make child html first, because checkType + childHtml = view.appendNodes(setting, level + 1, children, node, -1, initFlag, openFlag && node.open); + } + if (openFlag) { + view.makeDOMNodeMainBefore(html, setting, node); + view.makeDOMNodeLine(html, setting, node); + data.getBeforeA(setting, node, html); + view.makeDOMNodeNameBefore(html, setting, node); + data.getInnerBeforeA(setting, node, html); + view.makeDOMNodeIcon(html, setting, node); + data.getInnerAfterA(setting, node, html); + view.makeDOMNodeNameAfter(html, setting, node); + data.getAfterA(setting, node, html); + if (isParent && node.open) { + view.makeUlHtml(setting, node, html, childHtml.join('')); + } + view.makeDOMNodeMainAfter(html, setting, node); + data.addCreatedNode(setting, node); + } + } + return html; + }, + appendParentULDom: function (setting, node) { + var html = [], + nObj = $$(node, setting); + if (!nObj.get(0) && !!node.parentTId) { + view.appendParentULDom(setting, node.getParentNode()); + nObj = $$(node, setting); + } + var ulObj = $$(node, consts.id.UL, setting); + if (ulObj.get(0)) { + ulObj.remove(); + } + var children = data.nodeChildren(setting, node), + childHtml = view.appendNodes(setting, node.level + 1, children, node, -1, false, true); + view.makeUlHtml(setting, node, html, childHtml.join('')); + nObj.append(html.join('')); + }, + asyncNode: function (setting, node, isSilent, callback) { + var i, l; + var isParent = data.nodeIsParent(setting, node); + if (node && !isParent) { + tools.apply(callback); + return false; + } else if (node && node.isAjaxing) { + return false; + } else if (tools.apply(setting.callback.beforeAsync, [setting.treeId, node], true) == false) { + tools.apply(callback); + return false; + } + if (node) { + node.isAjaxing = true; + var icoObj = $$(node, consts.id.ICON, setting); + icoObj.attr({"style": "", "class": consts.className.BUTTON + " " + consts.className.ICO_LOADING}); + } + + var tmpParam = {}; + var autoParam = tools.apply(setting.async.autoParam, [setting.treeId, node], setting.async.autoParam); + for (i = 0, l = autoParam.length; node && i < l; i++) { + var pKey = autoParam[i].split("="), spKey = pKey; + if (pKey.length > 1) { + spKey = pKey[1]; + pKey = pKey[0]; + } + tmpParam[spKey] = node[pKey]; + } + var otherParam = tools.apply(setting.async.otherParam, [setting.treeId, node], setting.async.otherParam); + if (tools.isArray(otherParam)) { + for (i = 0, l = otherParam.length; i < l; i += 2) { + tmpParam[otherParam[i]] = otherParam[i + 1]; + } + } else { + for (var p in otherParam) { + tmpParam[p] = otherParam[p]; + } + } + + var _tmpV = data.getRoot(setting)._ver; + $.ajax({ + contentType: setting.async.contentType, + cache: false, + type: setting.async.type, + url: tools.apply(setting.async.url, [setting.treeId, node], setting.async.url), + data: setting.async.contentType.indexOf('application/json') > -1 ? JSON.stringify(tmpParam) : tmpParam, + dataType: setting.async.dataType, + headers: setting.async.headers, + xhrFields: setting.async.xhrFields, + success: function (msg) { + if (_tmpV != data.getRoot(setting)._ver) { + return; + } + var newNodes = []; + try { + if (!msg || msg.length == 0) { + newNodes = []; + } else if (typeof msg == "string") { + newNodes = eval("(" + msg + ")"); + } else { + newNodes = msg; + } + } catch (err) { + newNodes = msg; + } + + if (node) { + node.isAjaxing = null; + node.zAsync = true; + } + view.setNodeLineIcos(setting, node); + if (newNodes && newNodes !== "") { + newNodes = tools.apply(setting.async.dataFilter, [setting.treeId, node, newNodes], newNodes); + view.addNodes(setting, node, -1, !!newNodes ? tools.clone(newNodes) : [], !!isSilent); + } else { + view.addNodes(setting, node, -1, [], !!isSilent); + } + setting.treeObj.trigger(consts.event.ASYNC_SUCCESS, [setting.treeId, node, msg]); + tools.apply(callback); + }, + error: function (XMLHttpRequest, textStatus, errorThrown) { + if (_tmpV != data.getRoot(setting)._ver) { + return; + } + if (node) node.isAjaxing = null; + view.setNodeLineIcos(setting, node); + setting.treeObj.trigger(consts.event.ASYNC_ERROR, [setting.treeId, node, XMLHttpRequest, textStatus, errorThrown]); + } + }); + return true; + }, + cancelPreSelectedNode: function (setting, node, excludeNode) { + var list = data.getRoot(setting).curSelectedList, + i, n; + for (i = list.length - 1; i >= 0; i--) { + n = list[i]; + if (node === n || (!node && (!excludeNode || excludeNode !== n))) { + $$(n, consts.id.A, setting).removeClass(consts.node.CURSELECTED); + if (node) { + data.removeSelectedNode(setting, node); + break; + } else { + list.splice(i, 1); + setting.treeObj.trigger(consts.event.UNSELECTED, [setting.treeId, n]); + } + } + } + }, + createNodeCallback: function (setting) { + if (!!setting.callback.onNodeCreated || !!setting.view.addDiyDom) { + var root = data.getRoot(setting); + while (root.createdNodes.length > 0) { + var node = root.createdNodes.shift(); + tools.apply(setting.view.addDiyDom, [setting.treeId, node]); + if (!!setting.callback.onNodeCreated) { + setting.treeObj.trigger(consts.event.NODECREATED, [setting.treeId, node]); + } + } + } + }, + createNodes: function (setting, level, nodes, parentNode, index) { + if (!nodes || nodes.length == 0) return; + var root = data.getRoot(setting), + openFlag = !parentNode || parentNode.open || !!$$(data.nodeChildren(setting, parentNode)[0], setting).get(0); + root.createdNodes = []; + var zTreeHtml = view.appendNodes(setting, level, nodes, parentNode, index, true, openFlag), + parentObj, nextObj; + + if (!parentNode) { + parentObj = setting.treeObj; + //setting.treeObj.append(zTreeHtml.join('')); + } else { + var ulObj = $$(parentNode, consts.id.UL, setting); + if (ulObj.get(0)) { + parentObj = ulObj; + //ulObj.append(zTreeHtml.join('')); + } + } + if (parentObj) { + if (index >= 0) { + nextObj = parentObj.children()[index]; + } + if (index >= 0 && nextObj) { + $(nextObj).before(zTreeHtml.join('')); + } else { + parentObj.append(zTreeHtml.join('')); + } + } + + view.createNodeCallback(setting); + }, + destroy: function (setting) { + if (!setting) return; + data.initCache(setting); + data.initRoot(setting); + event.unbindTree(setting); + event.unbindEvent(setting); + setting.treeObj.empty(); + delete settings[setting.treeId]; + }, + expandCollapseNode: function (setting, node, expandFlag, animateFlag, callback) { + var root = data.getRoot(setting); + var tmpCb, _callback; + if (!node) { + tools.apply(callback, []); + return; + } + var children = data.nodeChildren(setting, node); + var isParent = data.nodeIsParent(setting, node); + if (root.expandTriggerFlag) { + _callback = callback; + tmpCb = function () { + if (_callback) _callback(); + if (node.open) { + setting.treeObj.trigger(consts.event.EXPAND, [setting.treeId, node]); + } else { + setting.treeObj.trigger(consts.event.COLLAPSE, [setting.treeId, node]); + } + }; + callback = tmpCb; + root.expandTriggerFlag = false; + } + if (!node.open && isParent && ((!$$(node, consts.id.UL, setting).get(0)) || (children && children.length > 0 && !$$(children[0], setting).get(0)))) { + view.appendParentULDom(setting, node); + view.createNodeCallback(setting); + } + if (node.open == expandFlag) { + tools.apply(callback, []); + return; + } + var ulObj = $$(node, consts.id.UL, setting), + switchObj = $$(node, consts.id.SWITCH, setting), + icoObj = $$(node, consts.id.ICON, setting); + + if (isParent) { + node.open = !node.open; + if (node.iconOpen && node.iconClose) { + icoObj.attr("style", view.makeNodeIcoStyle(setting, node)); + } + + if (node.open) { + view.replaceSwitchClass(node, switchObj, consts.folder.OPEN); + view.replaceIcoClass(node, icoObj, consts.folder.OPEN); + if (animateFlag == false || setting.view.expandSpeed == "") { + ulObj.show(); + tools.apply(callback, []); + } else { + if (children && children.length > 0) { + ulObj.slideDown(setting.view.expandSpeed, callback); + } else { + ulObj.show(); + tools.apply(callback, []); + } + } + } else { + view.replaceSwitchClass(node, switchObj, consts.folder.CLOSE); + view.replaceIcoClass(node, icoObj, consts.folder.CLOSE); + if (animateFlag == false || setting.view.expandSpeed == "" || !(children && children.length > 0)) { + ulObj.hide(); + tools.apply(callback, []); + } else { + ulObj.slideUp(setting.view.expandSpeed, callback); + } + } + } else { + tools.apply(callback, []); + } + }, + expandCollapseParentNode: function (setting, node, expandFlag, animateFlag, callback) { + if (!node) return; + if (!node.parentTId) { + view.expandCollapseNode(setting, node, expandFlag, animateFlag, callback); + return; + } else { + view.expandCollapseNode(setting, node, expandFlag, animateFlag); + } + if (node.parentTId) { + view.expandCollapseParentNode(setting, node.getParentNode(), expandFlag, animateFlag, callback); + } + }, + expandCollapseSonNode: function (setting, node, expandFlag, animateFlag, callback) { + var root = data.getRoot(setting), + treeNodes = (node) ? data.nodeChildren(setting, node) : data.nodeChildren(setting, root), + selfAnimateSign = (node) ? false : animateFlag, + expandTriggerFlag = data.getRoot(setting).expandTriggerFlag; + data.getRoot(setting).expandTriggerFlag = false; + if (treeNodes) { + for (var i = 0, l = treeNodes.length; i < l; i++) { + if (treeNodes[i]) view.expandCollapseSonNode(setting, treeNodes[i], expandFlag, selfAnimateSign); + } + } + data.getRoot(setting).expandTriggerFlag = expandTriggerFlag; + view.expandCollapseNode(setting, node, expandFlag, animateFlag, callback); + }, + isSelectedNode: function (setting, node) { + if (!node) { + return false; + } + var list = data.getRoot(setting).curSelectedList, + i; + for (i = list.length - 1; i >= 0; i--) { + if (node === list[i]) { + return true; + } + } + return false; + }, + makeDOMNodeIcon: function (html, setting, node) { + var nameStr = data.nodeName(setting, node), + name = setting.view.nameIsHTML ? nameStr : nameStr.replace(/&/g, '&').replace(//g, '>'); + html.push("", name, ""); + }, + makeDOMNodeLine: function (html, setting, node) { + html.push(""); + }, + makeDOMNodeMainAfter: function (html, setting, node) { + html.push(""); + }, + makeDOMNodeMainBefore: function (html, setting, node) { + html.push("
                                • "); + }, + makeDOMNodeNameAfter: function (html, setting, node) { + html.push(""); + }, + makeDOMNodeNameBefore: function (html, setting, node) { + var title = data.nodeTitle(setting, node), + url = view.makeNodeUrl(setting, node), + fontcss = view.makeNodeFontCss(setting, node), + fontStyle = []; + for (var f in fontcss) { + fontStyle.push(f, ":", fontcss[f], ";"); + } + html.push(" 0) ? "href='" + url + "'" : ""), " target='", view.makeNodeTarget(node), "' style='", fontStyle.join(''), + "'"); + if (tools.apply(setting.view.showTitle, [setting.treeId, node], setting.view.showTitle) && title) { + html.push("title='", title.replace(/'/g, "'").replace(//g, '>'), "'"); + } + html.push(">"); + }, + makeNodeFontCss: function (setting, node) { + var fontCss = tools.apply(setting.view.fontCss, [setting.treeId, node], setting.view.fontCss); + return (fontCss && ((typeof fontCss) != "function")) ? fontCss : {}; + }, + makeNodeIcoClass: function (setting, node) { + var icoCss = ["ico"]; + if (!node.isAjaxing) { + var isParent = data.nodeIsParent(setting, node); + icoCss[0] = (node.iconSkin ? node.iconSkin + "_" : "") + icoCss[0]; + if (isParent) { + icoCss.push(node.open ? consts.folder.OPEN : consts.folder.CLOSE); + } else { + icoCss.push(consts.folder.DOCU); + } + } + return consts.className.BUTTON + " " + icoCss.join('_'); + }, + makeNodeIcoStyle: function (setting, node) { + var icoStyle = []; + if (!node.isAjaxing) { + var isParent = data.nodeIsParent(setting, node); + var icon = (isParent && node.iconOpen && node.iconClose) ? (node.open ? node.iconOpen : node.iconClose) : node[setting.data.key.icon]; + if (icon) icoStyle.push("background:url(", icon, ") 0 0 no-repeat;"); + if (setting.view.showIcon == false || !tools.apply(setting.view.showIcon, [setting.treeId, node], true)) { + icoStyle.push("width:0px;height:0px;"); + } + } + return icoStyle.join(''); + }, + makeNodeLineClass: function (setting, node) { + var lineClass = []; + if (setting.view.showLine) { + if (node.level == 0 && node.isFirstNode && node.isLastNode) { + lineClass.push(consts.line.ROOT); + } else if (node.level == 0 && node.isFirstNode) { + lineClass.push(consts.line.ROOTS); + } else if (node.isLastNode) { + lineClass.push(consts.line.BOTTOM); + } else { + lineClass.push(consts.line.CENTER); + } + } else { + lineClass.push(consts.line.NOLINE); + } + if (data.nodeIsParent(setting, node)) { + lineClass.push(node.open ? consts.folder.OPEN : consts.folder.CLOSE); + } else { + lineClass.push(consts.folder.DOCU); + } + return view.makeNodeLineClassEx(node) + lineClass.join('_'); + }, + makeNodeLineClassEx: function (node) { + return consts.className.BUTTON + " " + consts.className.LEVEL + node.level + " " + consts.className.SWITCH + " "; + }, + makeNodeTarget: function (node) { + return (node.target || "_blank"); + }, + makeNodeUrl: function (setting, node) { + var urlKey = setting.data.key.url; + return node[urlKey] ? node[urlKey] : null; + }, + makeUlHtml: function (setting, node, html, content) { + html.push("
                                    "); + html.push(content); + html.push("
                                  "); + }, + makeUlLineClass: function (setting, node) { + return ((setting.view.showLine && !node.isLastNode) ? consts.line.LINE : ""); + }, + removeChildNodes: function (setting, node) { + if (!node) return; + var nodes = data.nodeChildren(setting, node); + if (!nodes) return; + + for (var i = 0, l = nodes.length; i < l; i++) { + data.removeNodeCache(setting, nodes[i]); + } + data.removeSelectedNode(setting); + delete node[setting.data.key.children]; + + if (!setting.data.keep.parent) { + data.nodeIsParent(setting, node, false); + node.open = false; + var tmp_switchObj = $$(node, consts.id.SWITCH, setting), + tmp_icoObj = $$(node, consts.id.ICON, setting); + view.replaceSwitchClass(node, tmp_switchObj, consts.folder.DOCU); + view.replaceIcoClass(node, tmp_icoObj, consts.folder.DOCU); + $$(node, consts.id.UL, setting).remove(); + } else { + $$(node, consts.id.UL, setting).empty(); + } + }, + scrollIntoView: function (setting, dom) { + if (!dom) { + return; + } + // support IE 7 + if (typeof Element === 'undefined') { + var contRect = setting.treeObj.get(0).getBoundingClientRect(), + findMeRect = dom.getBoundingClientRect(); + if (findMeRect.top < contRect.top || findMeRect.bottom > contRect.bottom + || findMeRect.right > contRect.right || findMeRect.left < contRect.left) { + dom.scrollIntoView(); + } + return; + } + // CC-BY jocki84@googlemail.com, https://gist.github.com/jocki84/6ffafd003387179a988e + if (!Element.prototype.scrollIntoViewIfNeeded) { + Element.prototype.scrollIntoViewIfNeeded = function (centerIfNeeded) { + "use strict"; + + function makeRange(start, length) { + return {"start": start, "length": length, "end": start + length}; + } + + function coverRange(inner, outer) { + if ( + false === centerIfNeeded || + (outer.start < inner.end && inner.start < outer.end) + ) { + return Math.max( + inner.end - outer.length, + Math.min(outer.start, inner.start) + ); + } + return (inner.start + inner.end - outer.length) / 2; + } + + function makePoint(x, y) { + return { + "x": x, + "y": y, + "translate": function translate(dX, dY) { + return makePoint(x + dX, y + dY); + } + }; + } + + function absolute(elem, pt) { + while (elem) { + pt = pt.translate(elem.offsetLeft, elem.offsetTop); + elem = elem.offsetParent; + } + return pt; + } + + var target = absolute(this, makePoint(0, 0)), + extent = makePoint(this.offsetWidth, this.offsetHeight), + elem = this.parentNode, + origin; + + while (elem instanceof HTMLElement) { + // Apply desired scroll amount. + origin = absolute(elem, makePoint(elem.clientLeft, elem.clientTop)); + elem.scrollLeft = coverRange( + makeRange(target.x - origin.x, extent.x), + makeRange(elem.scrollLeft, elem.clientWidth) + ); + elem.scrollTop = coverRange( + makeRange(target.y - origin.y, extent.y), + makeRange(elem.scrollTop, elem.clientHeight) + ); + + // Determine actual scroll amount by reading back scroll properties. + target = target.translate(-elem.scrollLeft, -elem.scrollTop); + elem = elem.parentNode; + } + }; + } + dom.scrollIntoViewIfNeeded(); + }, + setFirstNode: function (setting, parentNode) { + var children = data.nodeChildren(setting, parentNode); + if (children.length > 0) { + children[0].isFirstNode = true; + } + }, + setLastNode: function (setting, parentNode) { + var children = data.nodeChildren(setting, parentNode); + if (children.length > 0) { + children[children.length - 1].isLastNode = true; + } + }, + removeNode: function (setting, node) { + var root = data.getRoot(setting), + parentNode = (node.parentTId) ? node.getParentNode() : root; + + node.isFirstNode = false; + node.isLastNode = false; + node.getPreNode = function () { + return null; + }; + node.getNextNode = function () { + return null; + }; + + if (!data.getNodeCache(setting, node.tId)) { + return; + } + + $$(node, setting).remove(); + data.removeNodeCache(setting, node); + data.removeSelectedNode(setting, node); + + var children = data.nodeChildren(setting, parentNode); + for (var i = 0, l = children.length; i < l; i++) { + if (children[i].tId == node.tId) { + children.splice(i, 1); + break; + } + } + view.setFirstNode(setting, parentNode); + view.setLastNode(setting, parentNode); + + var tmp_ulObj, tmp_switchObj, tmp_icoObj, + childLength = children.length; + + //repair nodes old parent + if (!setting.data.keep.parent && childLength == 0) { + //old parentNode has no child nodes + data.nodeIsParent(setting, parentNode, false); + parentNode.open = false; + delete parentNode[setting.data.key.children]; + tmp_ulObj = $$(parentNode, consts.id.UL, setting); + tmp_switchObj = $$(parentNode, consts.id.SWITCH, setting); + tmp_icoObj = $$(parentNode, consts.id.ICON, setting); + view.replaceSwitchClass(parentNode, tmp_switchObj, consts.folder.DOCU); + view.replaceIcoClass(parentNode, tmp_icoObj, consts.folder.DOCU); + tmp_ulObj.css("display", "none"); + + } else if (setting.view.showLine && childLength > 0) { + //old parentNode has child nodes + var newLast = children[childLength - 1]; + tmp_ulObj = $$(newLast, consts.id.UL, setting); + tmp_switchObj = $$(newLast, consts.id.SWITCH, setting); + tmp_icoObj = $$(newLast, consts.id.ICON, setting); + if (parentNode == root) { + if (children.length == 1) { + //node was root, and ztree has only one root after move node + view.replaceSwitchClass(newLast, tmp_switchObj, consts.line.ROOT); + } else { + var tmp_first_switchObj = $$(children[0], consts.id.SWITCH, setting); + view.replaceSwitchClass(children[0], tmp_first_switchObj, consts.line.ROOTS); + view.replaceSwitchClass(newLast, tmp_switchObj, consts.line.BOTTOM); + } + } else { + view.replaceSwitchClass(newLast, tmp_switchObj, consts.line.BOTTOM); + } + tmp_ulObj.removeClass(consts.line.LINE); + } + }, + replaceIcoClass: function (node, obj, newName) { + if (!obj || node.isAjaxing) return; + var tmpName = obj.attr("class"); + if (tmpName == undefined) return; + var tmpList = tmpName.split("_"); + switch (newName) { + case consts.folder.OPEN: + case consts.folder.CLOSE: + case consts.folder.DOCU: + tmpList[tmpList.length - 1] = newName; + break; + } + obj.attr("class", tmpList.join("_")); + }, + replaceSwitchClass: function (node, obj, newName) { + if (!obj) return; + var tmpName = obj.attr("class"); + if (tmpName == undefined) return; + var tmpList = tmpName.split("_"); + switch (newName) { + case consts.line.ROOT: + case consts.line.ROOTS: + case consts.line.CENTER: + case consts.line.BOTTOM: + case consts.line.NOLINE: + tmpList[0] = view.makeNodeLineClassEx(node) + newName; + break; + case consts.folder.OPEN: + case consts.folder.CLOSE: + case consts.folder.DOCU: + tmpList[1] = newName; + break; + } + obj.attr("class", tmpList.join("_")); + if (newName !== consts.folder.DOCU) { + obj.removeAttr("disabled"); + } else { + obj.attr("disabled", "disabled"); + } + }, + selectNode: function (setting, node, addFlag) { + if (!addFlag) { + view.cancelPreSelectedNode(setting, null, node); + } + $$(node, consts.id.A, setting).addClass(consts.node.CURSELECTED); + data.addSelectedNode(setting, node); + setting.treeObj.trigger(consts.event.SELECTED, [setting.treeId, node]); + }, + setNodeFontCss: function (setting, treeNode) { + var aObj = $$(treeNode, consts.id.A, setting), + fontCss = view.makeNodeFontCss(setting, treeNode); + if (fontCss) { + aObj.css(fontCss); + } + }, + setNodeLineIcos: function (setting, node) { + if (!node) return; + var switchObj = $$(node, consts.id.SWITCH, setting), + ulObj = $$(node, consts.id.UL, setting), + icoObj = $$(node, consts.id.ICON, setting), + ulLine = view.makeUlLineClass(setting, node); + if (ulLine.length == 0) { + ulObj.removeClass(consts.line.LINE); + } else { + ulObj.addClass(ulLine); + } + switchObj.attr("class", view.makeNodeLineClass(setting, node)); + if (data.nodeIsParent(setting, node)) { + switchObj.removeAttr("disabled"); + } else { + switchObj.attr("disabled", "disabled"); + } + icoObj.removeAttr("style"); + icoObj.attr("style", view.makeNodeIcoStyle(setting, node)); + icoObj.attr("class", view.makeNodeIcoClass(setting, node)); + }, + setNodeName: function (setting, node) { + var title = data.nodeTitle(setting, node), + nObj = $$(node, consts.id.SPAN, setting); + nObj.empty(); + if (setting.view.nameIsHTML) { + nObj.html(data.nodeName(setting, node)); + } else { + nObj.text(data.nodeName(setting, node)); + } + if (tools.apply(setting.view.showTitle, [setting.treeId, node], setting.view.showTitle)) { + var aObj = $$(node, consts.id.A, setting); + aObj.attr("title", !title ? "" : title); + } + }, + setNodeTarget: function (setting, node) { + var aObj = $$(node, consts.id.A, setting); + aObj.attr("target", view.makeNodeTarget(node)); + }, + setNodeUrl: function (setting, node) { + var aObj = $$(node, consts.id.A, setting), + url = view.makeNodeUrl(setting, node); + if (url == null || url.length == 0) { + aObj.removeAttr("href"); + } else { + aObj.attr("href", url); + } + }, + switchNode: function (setting, node) { + if (node.open || !tools.canAsync(setting, node)) { + view.expandCollapseNode(setting, node, !node.open); + } else if (setting.async.enable) { + if (!view.asyncNode(setting, node)) { + view.expandCollapseNode(setting, node, !node.open); + return; + } + } else if (node) { + view.expandCollapseNode(setting, node, !node.open); + } + } + }; + // zTree defind + $.fn.zTree = { + consts: _consts, + _z: { + tools: tools, + view: view, + event: event, + data: data + }, + getZTreeObj: function (treeId) { + var o = data.getZTreeTools(treeId); + return o ? o : null; + }, + destroy: function (treeId) { + if (!!treeId && treeId.length > 0) { + view.destroy(data.getSetting(treeId)); + } else { + for (var s in settings) { + view.destroy(settings[s]); + } + } + }, + init: function (obj, zSetting, zNodes) { + var setting = tools.clone(_setting); + $.extend(true, setting, zSetting); + setting.treeId = obj.attr("id"); + setting.treeObj = obj; + setting.treeObj.empty(); + settings[setting.treeId] = setting; + //For some older browser,(e.g., ie6) + if (typeof document.body.style.maxHeight === "undefined") { + setting.view.expandSpeed = ""; + } + data.initRoot(setting); + var root = data.getRoot(setting); + zNodes = zNodes ? tools.clone(tools.isArray(zNodes) ? zNodes : [zNodes]) : []; + if (setting.data.simpleData.enable) { + data.nodeChildren(setting, root, data.transformTozTreeFormat(setting, zNodes)); + } else { + data.nodeChildren(setting, root, zNodes); + } + + data.initCache(setting); + event.unbindTree(setting); + event.bindTree(setting); + event.unbindEvent(setting); + event.bindEvent(setting); + + var zTreeTools = { + setting: setting, + addNodes: function (parentNode, index, newNodes, isSilent) { + if (!parentNode) parentNode = null; + var isParent = data.nodeIsParent(setting, parentNode); + if (parentNode && !isParent && setting.data.keep.leaf) return null; + + var i = parseInt(index, 10); + if (isNaN(i)) { + isSilent = !!newNodes; + newNodes = index; + index = -1; + } else { + index = i; + } + if (!newNodes) return null; + + + var xNewNodes = tools.clone(tools.isArray(newNodes) ? newNodes : [newNodes]); + + function addCallback() { + view.addNodes(setting, parentNode, index, xNewNodes, (isSilent == true)); + } + + if (tools.canAsync(setting, parentNode)) { + view.asyncNode(setting, parentNode, isSilent, addCallback); + } else { + addCallback(); + } + return xNewNodes; + }, + cancelSelectedNode: function (node) { + view.cancelPreSelectedNode(setting, node); + }, + destroy: function () { + view.destroy(setting); + }, + expandAll: function (expandFlag) { + expandFlag = !!expandFlag; + view.expandCollapseSonNode(setting, null, expandFlag, true); + return expandFlag; + }, + expandNode: function (node, expandFlag, sonSign, focus, callbackFlag) { + if (!node || !data.nodeIsParent(setting, node)) return null; + if (expandFlag !== true && expandFlag !== false) { + expandFlag = !node.open; + } + callbackFlag = !!callbackFlag; + + if (callbackFlag && expandFlag && (tools.apply(setting.callback.beforeExpand, [setting.treeId, node], true) == false)) { + return null; + } else if (callbackFlag && !expandFlag && (tools.apply(setting.callback.beforeCollapse, [setting.treeId, node], true) == false)) { + return null; + } + if (expandFlag && node.parentTId) { + view.expandCollapseParentNode(setting, node.getParentNode(), expandFlag, false); + } + if (expandFlag === node.open && !sonSign) { + return null; + } + + data.getRoot(setting).expandTriggerFlag = callbackFlag; + if (!tools.canAsync(setting, node) && sonSign) { + view.expandCollapseSonNode(setting, node, expandFlag, true, showNodeFocus); + } else { + node.open = !expandFlag; + view.switchNode(this.setting, node); + showNodeFocus(); + } + return expandFlag; + + function showNodeFocus() { + var a = $$(node, setting).get(0); + if (a && focus !== false) { + view.scrollIntoView(setting, a); + } + } + }, + getNodes: function () { + return data.getNodes(setting); + }, + getNodeByParam: function (key, value, parentNode) { + if (!key) return null; + return data.getNodeByParam(setting, parentNode ? data.nodeChildren(setting, parentNode) : data.getNodes(setting), key, value); + }, + getNodeByTId: function (tId) { + return data.getNodeCache(setting, tId); + }, + getNodesByParam: function (key, value, parentNode) { + if (!key) return null; + return data.getNodesByParam(setting, parentNode ? data.nodeChildren(setting, parentNode) : data.getNodes(setting), key, value); + }, + getNodesByParamFuzzy: function (key, value, parentNode) { + if (!key) return null; + return data.getNodesByParamFuzzy(setting, parentNode ? data.nodeChildren(setting, parentNode) : data.getNodes(setting), key, value); + }, + getNodesByFilter: function (filter, isSingle, parentNode, invokeParam) { + isSingle = !!isSingle; + if (!filter || (typeof filter != "function")) return (isSingle ? null : []); + return data.getNodesByFilter(setting, parentNode ? data.nodeChildren(setting, parentNode) : data.getNodes(setting), filter, isSingle, invokeParam); + }, + getNodeIndex: function (node) { + if (!node) return null; + var parentNode = (node.parentTId) ? node.getParentNode() : data.getRoot(setting); + var children = data.nodeChildren(setting, parentNode); + for (var i = 0, l = children.length; i < l; i++) { + if (children[i] == node) return i; + } + return -1; + }, + getSelectedNodes: function () { + var r = [], list = data.getRoot(setting).curSelectedList; + for (var i = 0, l = list.length; i < l; i++) { + r.push(list[i]); + } + return r; + }, + isSelectedNode: function (node) { + return data.isSelectedNode(setting, node); + }, + reAsyncChildNodesPromise: function (parentNode, reloadType, isSilent) { + var promise = new Promise(function (resolve, reject) { + try { + zTreeTools.reAsyncChildNodes(parentNode, reloadType, isSilent, function () { + resolve(parentNode); + }); + } catch (e) { + reject(e); + } + }); + return promise; + }, + reAsyncChildNodes: function (parentNode, reloadType, isSilent, callback) { + if (!this.setting.async.enable) return; + var isRoot = !parentNode; + if (isRoot) { + parentNode = data.getRoot(setting); + } + if (reloadType == "refresh") { + var children = data.nodeChildren(setting, parentNode); + for (var i = 0, l = children ? children.length : 0; i < l; i++) { + data.removeNodeCache(setting, children[i]); + } + data.removeSelectedNode(setting); + data.nodeChildren(setting, parentNode, []); + if (isRoot) { + this.setting.treeObj.empty(); + } else { + var ulObj = $$(parentNode, consts.id.UL, setting); + ulObj.empty(); + } + } + view.asyncNode(this.setting, isRoot ? null : parentNode, !!isSilent, callback); + }, + refresh: function () { + this.setting.treeObj.empty(); + var root = data.getRoot(setting), + nodes = data.nodeChildren(setting, root); + data.initRoot(setting); + data.nodeChildren(setting, root, nodes); + data.initCache(setting); + view.createNodes(setting, 0, data.nodeChildren(setting, root), null, -1); + }, + removeChildNodes: function (node) { + if (!node) return null; + var nodes = data.nodeChildren(setting, node); + view.removeChildNodes(setting, node); + return nodes ? nodes : null; + }, + removeNode: function (node, callbackFlag) { + if (!node) return; + callbackFlag = !!callbackFlag; + if (callbackFlag && tools.apply(setting.callback.beforeRemove, [setting.treeId, node], true) == false) return; + view.removeNode(setting, node); + if (callbackFlag) { + this.setting.treeObj.trigger(consts.event.REMOVE, [setting.treeId, node]); + } + }, + selectNode: function (node, addFlag, isSilent) { + if (!node) return; + if (tools.uCanDo(setting)) { + addFlag = setting.view.selectedMulti && addFlag; + if (node.parentTId) { + view.expandCollapseParentNode(setting, node.getParentNode(), true, false, showNodeFocus); + } else if (!isSilent) { + try { + $$(node, setting).focus().blur(); + } catch (e) { + } + } + view.selectNode(setting, node, addFlag); + } + + function showNodeFocus() { + if (isSilent) { + return; + } + var a = $$(node, setting).get(0); + view.scrollIntoView(setting, a); + } + }, + transformTozTreeNodes: function (simpleNodes) { + return data.transformTozTreeFormat(setting, simpleNodes); + }, + transformToArray: function (nodes) { + return data.transformToArrayFormat(setting, nodes); + }, + updateNode: function (node, checkTypeFlag) { + if (!node) return; + var nObj = $$(node, setting); + if (nObj.get(0) && tools.uCanDo(setting)) { + view.setNodeName(setting, node); + view.setNodeTarget(setting, node); + view.setNodeUrl(setting, node); + view.setNodeLineIcos(setting, node); + view.setNodeFontCss(setting, node); + } + } + }; + root.treeTools = zTreeTools; + data.setZTreeTools(setting, zTreeTools); + var children = data.nodeChildren(setting, root); + if (children && children.length > 0) { + view.createNodes(setting, 0, children, null, -1); + } else if (setting.async.enable && setting.async.url && setting.async.url !== '') { + view.asyncNode(setting); + } + return zTreeTools; + } + }; + + var zt = $.fn.zTree, + $$ = tools.$, + consts = zt.consts; +})(jQuery); \ No newline at end of file diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/js/jquery.ztree.core.min.js b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/js/jquery.ztree.core.min.js new file mode 100644 index 0000000..0b01dc8 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/js/jquery.ztree.core.min.js @@ -0,0 +1,75 @@ +/* + * JQuery zTree core v3.5.40 + * http://treejs.cn/ + * + * Copyright (c) 2010 Hunter.z + * + * Licensed same as jquery - MIT License + * http://www.opensource.org/licenses/mit-license.php + * + * email: hunter.z@263.net + * Date: 2019-01-18 + */ +(function(r){var J,K,L,M,N,O,v,t={},w={},x={},P={treeId:"",treeObj:null,view:{addDiyDom:null,autoCancelSelected:!0,dblClickExpand:!0,expandSpeed:"fast",fontCss:{},nameIsHTML:!1,selectedMulti:!0,showIcon:!0,showLine:!0,showTitle:!0,txtSelectedEnable:!1},data:{key:{isParent:"isParent",children:"children",name:"name",title:"",url:"url",icon:"icon"},simpleData:{enable:!1,idKey:"id",pIdKey:"pId",rootPId:null},keep:{parent:!1,leaf:!1}},async:{enable:!1,contentType:"application/x-www-form-urlencoded",type:"post", +dataType:"text",headers:{},xhrFields:{},url:"",autoParam:[],otherParam:[],dataFilter:null},callback:{beforeAsync:null,beforeClick:null,beforeDblClick:null,beforeRightClick:null,beforeMouseDown:null,beforeMouseUp:null,beforeExpand:null,beforeCollapse:null,beforeRemove:null,onAsyncError:null,onAsyncSuccess:null,onNodeCreated:null,onClick:null,onDblClick:null,onRightClick:null,onMouseDown:null,onMouseUp:null,onExpand:null,onCollapse:null,onRemove:null}},y=[function(a){var b=a.treeObj,c=g.event;b.bind(c.NODECREATED, +function(b,c,i){h.apply(a.callback.onNodeCreated,[b,c,i])});b.bind(c.CLICK,function(b,c,i,e,k){h.apply(a.callback.onClick,[c,i,e,k])});b.bind(c.EXPAND,function(b,c,i){h.apply(a.callback.onExpand,[b,c,i])});b.bind(c.COLLAPSE,function(b,c,i){h.apply(a.callback.onCollapse,[b,c,i])});b.bind(c.ASYNC_SUCCESS,function(b,c,i,e){h.apply(a.callback.onAsyncSuccess,[b,c,i,e])});b.bind(c.ASYNC_ERROR,function(b,c,i,e,k,g){h.apply(a.callback.onAsyncError,[b,c,i,e,k,g])});b.bind(c.REMOVE,function(b,c,i){h.apply(a.callback.onRemove, +[b,c,i])});b.bind(c.SELECTED,function(b,c,i){h.apply(a.callback.onSelected,[c,i])});b.bind(c.UNSELECTED,function(b,c,i){h.apply(a.callback.onUnSelected,[c,i])})}],z=[function(a){var b=g.event;a.treeObj.unbind(b.NODECREATED).unbind(b.CLICK).unbind(b.EXPAND).unbind(b.COLLAPSE).unbind(b.ASYNC_SUCCESS).unbind(b.ASYNC_ERROR).unbind(b.REMOVE).unbind(b.SELECTED).unbind(b.UNSELECTED)}],A=[function(a){var b=e.getCache(a);b||(b={},e.setCache(a,b));b.nodes=[];b.doms=[]}],B=[function(a,b,c,d,f,i){if(c){var m= +e.getRoot(a),k=e.nodeChildren(a,c);c.level=b;c.tId=a.treeId+"_"+ ++m.zId;c.parentTId=d?d.tId:null;c.open=typeof c.open=="string"?h.eqs(c.open,"true"):!!c.open;b=e.nodeIsParent(a,c);h.isArray(k)?(e.nodeIsParent(a,c,!0),c.zAsync=!0):(b=e.nodeIsParent(a,c,b),c.open=b&&!a.async.enable?c.open:!1,c.zAsync=!b);c.isFirstNode=f;c.isLastNode=i;c.getParentNode=function(){return e.getNodeCache(a,c.parentTId)};c.getPreNode=function(){return e.getPreNode(a,c)};c.getNextNode=function(){return e.getNextNode(a,c)}; +c.getIndex=function(){return e.getNodeIndex(a,c)};c.getPath=function(){return e.getNodePath(a,c)};c.isAjaxing=!1;e.fixPIdKeyValue(a,c)}}],u=[function(a){var b=a.target,c=e.getSetting(a.data.treeId),d="",f=null,i="",m="",k=null,j=null,o=null;if(h.eqs(a.type,"mousedown"))m="mousedown";else if(h.eqs(a.type,"mouseup"))m="mouseup";else if(h.eqs(a.type,"contextmenu"))m="contextmenu";else if(h.eqs(a.type,"click"))if(h.eqs(b.tagName,"span")&&b.getAttribute("treeNode"+g.id.SWITCH)!==null)d=h.getNodeMainDom(b).id, +i="switchNode";else{if(o=h.getMDom(c,b,[{tagName:"a",attrName:"treeNode"+g.id.A}]))d=h.getNodeMainDom(o).id,i="clickNode"}else if(h.eqs(a.type,"dblclick")&&(m="dblclick",o=h.getMDom(c,b,[{tagName:"a",attrName:"treeNode"+g.id.A}])))d=h.getNodeMainDom(o).id,i="switchNode";if(m.length>0&&d.length==0&&(o=h.getMDom(c,b,[{tagName:"a",attrName:"treeNode"+g.id.A}])))d=h.getNodeMainDom(o).id;if(d.length>0)switch(f=e.getNodeCache(c,d),i){case "switchNode":e.nodeIsParent(c,f)?h.eqs(a.type,"click")||h.eqs(a.type, +"dblclick")&&h.apply(c.view.dblClickExpand,[c.treeId,f],c.view.dblClickExpand)?k=J:i="":i="";break;case "clickNode":k=K}switch(m){case "mousedown":j=L;break;case "mouseup":j=M;break;case "dblclick":j=N;break;case "contextmenu":j=O}return{stop:!1,node:f,nodeEventType:i,nodeEventCallback:k,treeEventType:m,treeEventCallback:j}}],C=[function(a){var b=e.getRoot(a);b||(b={},e.setRoot(a,b));e.nodeChildren(a,b,[]);b.expandTriggerFlag=!1;b.curSelectedList=[];b.noSelection=!0;b.createdNodes=[];b.zId=0;b._ver= +(new Date).getTime()}],D=[],E=[],F=[],G=[],H=[],e={addNodeCache:function(a,b){e.getCache(a).nodes[e.getNodeCacheId(b.tId)]=b},getNodeCacheId:function(a){return a.substring(a.lastIndexOf("_")+1)},addAfterA:function(a){E.push(a)},addBeforeA:function(a){D.push(a)},addInnerAfterA:function(a){G.push(a)},addInnerBeforeA:function(a){F.push(a)},addInitBind:function(a){y.push(a)},addInitUnBind:function(a){z.push(a)},addInitCache:function(a){A.push(a)},addInitNode:function(a){B.push(a)},addInitProxy:function(a, +b){b?u.splice(0,0,a):u.push(a)},addInitRoot:function(a){C.push(a)},addNodesData:function(a,b,c,d){var f=e.nodeChildren(a,b);f?c>=f.length&&(c=-1):(f=e.nodeChildren(a,b,[]),c=-1);if(f.length>0&&c===0)f[0].isFirstNode=!1,j.setNodeLineIcos(a,f[0]);else if(f.length>0&&c<0)f[f.length-1].isLastNode=!1,j.setNodeLineIcos(a,f[f.length-1]);e.nodeIsParent(a,b,!0);c<0?e.nodeChildren(a,b,f.concat(d)):(a=[c,0].concat(d),f.splice.apply(f,a))},addSelectedNode:function(a,b){var c=e.getRoot(a);e.isSelectedNode(a,b)|| +c.curSelectedList.push(b)},addCreatedNode:function(a,b){(a.callback.onNodeCreated||a.view.addDiyDom)&&e.getRoot(a).createdNodes.push(b)},addZTreeTools:function(a){H.push(a)},exSetting:function(a){r.extend(!0,P,a)},fixPIdKeyValue:function(a,b){a.data.simpleData.enable&&(b[a.data.simpleData.pIdKey]=b.parentTId?b.getParentNode()[a.data.simpleData.idKey]:a.data.simpleData.rootPId)},getAfterA:function(a,b,c){for(var d=0,e=E.length;d-1&&f.push(k);k=e.nodeChildren(a, +k);f=f.concat(e.getNodesByParamFuzzy(a,k,c,d))}return f},getNodesByFilter:function(a,b,c,d,f){if(!b)return d?null:[];for(var i=d?null:[],m=0,k=b.length;m0)},clone:function(a){if(a===null)return null;var b=h.isArray(a)?[]:{},c;for(c in a)b[c]=a[c]instanceof Date?new Date(a[c].getTime()):typeof a[c]==="object"?h.clone(a[c]):a[c];return b},eqs:function(a,b){return a.toLowerCase()===b.toLowerCase()},isArray:function(a){return Object.prototype.toString.apply(a)==="[object Array]"},isElement:function(a){return typeof HTMLElement==="object"?a instanceof HTMLElement:a&&typeof a==="object"&&a!==null&& +a.nodeType===1&&typeof a.nodeName==="string"},$:function(a,b,c){b&&typeof b!="string"&&(c=b,b="");return typeof a=="string"?r(a,c?c.treeObj.get(0).ownerDocument:null):r("#"+a.tId+b,c?c.treeObj:null)},getMDom:function(a,b,c){if(!b)return null;for(;b&&b.id!==a.treeId;){for(var d=0,e=c.length;b.tagName&&d0},uCanDo:function(){return!0}},j={addNodes:function(a,b,c,d,f){var i=e.nodeIsParent(a,b);if(!a.data.keep.leaf||!b||i)if(h.isArray(d)||(d=[d]),a.data.simpleData.enable&&(d=e.transformTozTreeFormat(a,d)),b){var i=l(b,g.id.SWITCH,a),m=l(b,g.id.ICON,a),k=l(b,g.id.UL,a);if(!b.open)j.replaceSwitchClass(b,i,g.folder.CLOSE),j.replaceIcoClass(b,m,g.folder.CLOSE),b.open=!1,k.css({display:"none"});e.addNodesData(a,b,c,d);j.createNodes(a,b.level+ +1,d,b,c);f||j.expandCollapseParentNode(a,b,!0)}else e.addNodesData(a,e.getRoot(a),c,d),j.createNodes(a,0,d,null,c)},appendNodes:function(a,b,c,d,f,i,g){if(!c)return[];var k=[],h=d?d:e.getRoot(a),h=e.nodeChildren(a,h),o,l;if(!h||f>=h.length-c.length)f=-1;for(var s=0,n=c.length;s0&&(l=j.appendNodes(a,b+1,I,p,-1, +i,g&&p.open));g&&(j.makeDOMNodeMainBefore(k,a,p),j.makeDOMNodeLine(k,a,p),e.getBeforeA(a,p,k),j.makeDOMNodeNameBefore(k,a,p),e.getInnerBeforeA(a,p,k),j.makeDOMNodeIcon(k,a,p),e.getInnerAfterA(a,p,k),j.makeDOMNodeNameAfter(k,a,p),e.getAfterA(a,p,k),o&&p.open&&j.makeUlHtml(a,p,k,l.join("")),j.makeDOMNodeMainAfter(k,a,p),e.addCreatedNode(a,p))}return k},appendParentULDom:function(a,b){var c=[],d=l(b,a);!d.get(0)&&b.parentTId&&(j.appendParentULDom(a,b.getParentNode()),d=l(b,a));var f=l(b,g.id.UL,a);f.get(0)&& +f.remove();f=e.nodeChildren(a,b);f=j.appendNodes(a,b.level+1,f,b,-1,!1,!0);j.makeUlHtml(a,b,c,f.join(""));d.append(c.join(""))},asyncNode:function(a,b,c,d){var f,i;f=e.nodeIsParent(a,b);if(b&&!f)return h.apply(d),!1;else if(b&&b.isAjaxing)return!1;else if(h.apply(a.callback.beforeAsync,[a.treeId,b],!0)==!1)return h.apply(d),!1;if(b)b.isAjaxing=!0,l(b,g.id.ICON,a).attr({style:"","class":g.className.BUTTON+" "+g.className.ICO_LOADING});var m={},k=h.apply(a.async.autoParam,[a.treeId,b],a.async.autoParam); +for(f=0,i=k.length;b&&f1&&(o=q[1],q=q[0]);m[o]=b[q]}k=h.apply(a.async.otherParam,[a.treeId,b],a.async.otherParam);if(h.isArray(k))for(f=0,i=k.length;f-1?JSON.stringify(m):m,dataType:a.async.dataType,headers:a.async.headers, +xhrFields:a.async.xhrFields,success:function(i){if(s==e.getRoot(a)._ver){var f=[];try{f=!i||i.length==0?[]:typeof i=="string"?eval("("+i+")"):i}catch(k){f=i}if(b)b.isAjaxing=null,b.zAsync=!0;j.setNodeLineIcos(a,b);f&&f!==""?(f=h.apply(a.async.dataFilter,[a.treeId,b,f],f),j.addNodes(a,b,-1,f?h.clone(f):[],!!c)):j.addNodes(a,b,-1,[],!!c);a.treeObj.trigger(g.event.ASYNC_SUCCESS,[a.treeId,b,i]);h.apply(d)}},error:function(c,d,i){if(s==e.getRoot(a)._ver){if(b)b.isAjaxing=null;j.setNodeLineIcos(a,b);a.treeObj.trigger(g.event.ASYNC_ERROR, +[a.treeId,b,c,d,i])}}});return!0},cancelPreSelectedNode:function(a,b,c){var d=e.getRoot(a).curSelectedList,f,i;for(f=d.length-1;f>=0;f--)if(i=d[f],b===i||!b&&(!c||c!==i))if(l(i,g.id.A,a).removeClass(g.node.CURSELECTED),b){e.removeSelectedNode(a,b);break}else d.splice(f,1),a.treeObj.trigger(g.event.UNSELECTED,[a.treeId,i])},createNodeCallback:function(a){if(a.callback.onNodeCreated||a.view.addDiyDom)for(var b=e.getRoot(a);b.createdNodes.length>0;){var c=b.createdNodes.shift();h.apply(a.view.addDiyDom, +[a.treeId,c]);a.callback.onNodeCreated&&a.treeObj.trigger(g.event.NODECREATED,[a.treeId,c])}},createNodes:function(a,b,c,d,f){if(c&&c.length!=0){var i=e.getRoot(a),m=!d||d.open||!!l(e.nodeChildren(a,d)[0],a).get(0);i.createdNodes=[];var b=j.appendNodes(a,b,c,d,f,!0,m),k,h;d?(d=l(d,g.id.UL,a),d.get(0)&&(k=d)):k=a.treeObj;k&&(f>=0&&(h=k.children()[f]),f>=0&&h?r(h).before(b.join("")):k.append(b.join("")));j.createNodeCallback(a)}},destroy:function(a){a&&(e.initCache(a),e.initRoot(a),n.unbindTree(a), +n.unbindEvent(a),a.treeObj.empty(),delete t[a.treeId])},expandCollapseNode:function(a,b,c,d,f){var i=e.getRoot(a),m;if(b){var k=e.nodeChildren(a,b),q=e.nodeIsParent(a,b);if(i.expandTriggerFlag)m=f,f=function(){m&&m();b.open?a.treeObj.trigger(g.event.EXPAND,[a.treeId,b]):a.treeObj.trigger(g.event.COLLAPSE,[a.treeId,b])},i.expandTriggerFlag=!1;if(!b.open&&q&&(!l(b,g.id.UL,a).get(0)||k&&k.length>0&&!l(k[0],a).get(0)))j.appendParentULDom(a,b),j.createNodeCallback(a);if(b.open==c)h.apply(f,[]);else{var c= +l(b,g.id.UL,a),i=l(b,g.id.SWITCH,a),o=l(b,g.id.ICON,a);q?(b.open=!b.open,b.iconOpen&&b.iconClose&&o.attr("style",j.makeNodeIcoStyle(a,b)),b.open?(j.replaceSwitchClass(b,i,g.folder.OPEN),j.replaceIcoClass(b,o,g.folder.OPEN),d==!1||a.view.expandSpeed==""?(c.show(),h.apply(f,[])):k&&k.length>0?c.slideDown(a.view.expandSpeed,f):(c.show(),h.apply(f,[]))):(j.replaceSwitchClass(b,i,g.folder.CLOSE),j.replaceIcoClass(b,o,g.folder.CLOSE),d==!1||a.view.expandSpeed==""||!(k&&k.length>0)?(c.hide(),h.apply(f,[])): +c.slideUp(a.view.expandSpeed,f))):h.apply(f,[])}}else h.apply(f,[])},expandCollapseParentNode:function(a,b,c,d,e){b&&(b.parentTId?(j.expandCollapseNode(a,b,c,d),b.parentTId&&j.expandCollapseParentNode(a,b.getParentNode(),c,d,e)):j.expandCollapseNode(a,b,c,d,e))},expandCollapseSonNode:function(a,b,c,d,f){var i=e.getRoot(a),i=b?e.nodeChildren(a,b):e.nodeChildren(a,i),g=b?!1:d,k=e.getRoot(a).expandTriggerFlag;e.getRoot(a).expandTriggerFlag=!1;if(i)for(var h=0,l=i.length;h=0;d--)if(b===c[d])return!0;return!1},makeDOMNodeIcon:function(a,b,c){var d=e.nodeName(b,c),d=b.view.nameIsHTML?d:d.replace(/&/g,"&").replace(//g,">");a.push("",d,"")},makeDOMNodeLine:function(a,b,c){a.push("")},makeDOMNodeMainAfter:function(a){a.push("
                                • ")},makeDOMNodeMainBefore:function(a,b,c){a.push("
                                • ")},makeDOMNodeNameAfter:function(a){a.push("")},makeDOMNodeNameBefore:function(a,b,c){var d= +e.nodeTitle(b,c),f=j.makeNodeUrl(b,c),i=j.makeNodeFontCss(b,c),m=[],k;for(k in i)m.push(k,":",i[k],";");a.push("0?"href='"+f+"'":""," target='",j.makeNodeTarget(c),"' style='",m.join(""),"'");h.apply(b.view.showTitle,[b.treeId,c],b.view.showTitle)&&d&&a.push("title='",d.replace(/'/g,"'").replace(//g,">"),"'");a.push(">")},makeNodeFontCss:function(a, +b){var c=h.apply(a.view.fontCss,[a.treeId,b],a.view.fontCss);return c&&typeof c!="function"?c:{}},makeNodeIcoClass:function(a,b){var c=["ico"];if(!b.isAjaxing){var d=e.nodeIsParent(a,b);c[0]=(b.iconSkin?b.iconSkin+"_":"")+c[0];d?c.push(b.open?g.folder.OPEN:g.folder.CLOSE):c.push(g.folder.DOCU)}return g.className.BUTTON+" "+c.join("_")},makeNodeIcoStyle:function(a,b){var c=[];if(!b.isAjaxing){var d=e.nodeIsParent(a,b)&&b.iconOpen&&b.iconClose?b.open?b.iconOpen:b.iconClose:b[a.data.key.icon];d&&c.push("background:url(", +d,") 0 0 no-repeat;");(a.view.showIcon==!1||!h.apply(a.view.showIcon,[a.treeId,b],!0))&&c.push("width:0px;height:0px;")}return c.join("")},makeNodeLineClass:function(a,b){var c=[];a.view.showLine?b.level==0&&b.isFirstNode&&b.isLastNode?c.push(g.line.ROOT):b.level==0&&b.isFirstNode?c.push(g.line.ROOTS):b.isLastNode?c.push(g.line.BOTTOM):c.push(g.line.CENTER):c.push(g.line.NOLINE);e.nodeIsParent(a,b)?c.push(b.open?g.folder.OPEN:g.folder.CLOSE):c.push(g.folder.DOCU);return j.makeNodeLineClassEx(b)+c.join("_")}, +makeNodeLineClassEx:function(a){return g.className.BUTTON+" "+g.className.LEVEL+a.level+" "+g.className.SWITCH+" "},makeNodeTarget:function(a){return a.target||"_blank"},makeNodeUrl:function(a,b){var c=a.data.key.url;return b[c]?b[c]:null},makeUlHtml:function(a,b,c,d){c.push("
                                    ");c.push(d);c.push("
                                  ")},makeUlLineClass:function(a,b){return a.view.showLine&&!b.isLastNode? +g.line.LINE:""},removeChildNodes:function(a,b){if(b){var c=e.nodeChildren(a,b);if(c){for(var d=0,f=c.length;dc.bottom||d.right>c.right||d.left0)c[0].isFirstNode= +!0},setLastNode:function(a,b){var c=e.nodeChildren(a,b);if(c.length>0)c[c.length-1].isLastNode=!0},removeNode:function(a,b){var c=e.getRoot(a),d=b.parentTId?b.getParentNode():c;b.isFirstNode=!1;b.isLastNode=!1;b.getPreNode=function(){return null};b.getNextNode=function(){return null};if(e.getNodeCache(a,b.tId)){l(b,a).remove();e.removeNodeCache(a,b);e.removeSelectedNode(a,b);for(var f=e.nodeChildren(a,d),i=0,h=f.length;i0){var q=f[i-1],i=l(q,g.id.UL,a),h=l(q,g.id.SWITCH,a);k=l(q,g.id.ICON,a);d==c?f.length==1?j.replaceSwitchClass(q,h,g.line.ROOT):(c=l(f[0],g.id.SWITCH,a),j.replaceSwitchClass(f[0],c,g.line.ROOTS),j.replaceSwitchClass(q, +h,g.line.BOTTOM)):j.replaceSwitchClass(q,h,g.line.BOTTOM);i.removeClass(g.line.LINE)}}},replaceIcoClass:function(a,b,c){if(b&&!a.isAjaxing&&(a=b.attr("class"),a!=void 0)){a=a.split("_");switch(c){case g.folder.OPEN:case g.folder.CLOSE:case g.folder.DOCU:a[a.length-1]=c}b.attr("class",a.join("_"))}},replaceSwitchClass:function(a,b,c){if(b){var d=b.attr("class");if(d!=void 0){d=d.split("_");switch(c){case g.line.ROOT:case g.line.ROOTS:case g.line.CENTER:case g.line.BOTTOM:case g.line.NOLINE:d[0]=j.makeNodeLineClassEx(a)+ +c;break;case g.folder.OPEN:case g.folder.CLOSE:case g.folder.DOCU:d[1]=c}b.attr("class",d.join("_"));c!==g.folder.DOCU?b.removeAttr("disabled"):b.attr("disabled","disabled")}}},selectNode:function(a,b,c){c||j.cancelPreSelectedNode(a,null,b);l(b,g.id.A,a).addClass(g.node.CURSELECTED);e.addSelectedNode(a,b);a.treeObj.trigger(g.event.SELECTED,[a.treeId,b])},setNodeFontCss:function(a,b){var c=l(b,g.id.A,a),d=j.makeNodeFontCss(a,b);d&&c.css(d)},setNodeLineIcos:function(a,b){if(b){var c=l(b,g.id.SWITCH, +a),d=l(b,g.id.UL,a),f=l(b,g.id.ICON,a),i=j.makeUlLineClass(a,b);i.length==0?d.removeClass(g.line.LINE):d.addClass(i);c.attr("class",j.makeNodeLineClass(a,b));e.nodeIsParent(a,b)?c.removeAttr("disabled"):c.attr("disabled","disabled");f.removeAttr("style");f.attr("style",j.makeNodeIcoStyle(a,b));f.attr("class",j.makeNodeIcoClass(a,b))}},setNodeName:function(a,b){var c=e.nodeTitle(a,b),d=l(b,g.id.SPAN,a);d.empty();a.view.nameIsHTML?d.html(e.nodeName(a,b)):d.text(e.nodeName(a,b));h.apply(a.view.showTitle, +[a.treeId,b],a.view.showTitle)&&l(b,g.id.A,a).attr("title",!c?"":c)},setNodeTarget:function(a,b){l(b,g.id.A,a).attr("target",j.makeNodeTarget(b))},setNodeUrl:function(a,b){var c=l(b,g.id.A,a),d=j.makeNodeUrl(a,b);d==null||d.length==0?c.removeAttr("href"):c.attr("href",d)},switchNode:function(a,b){b.open||!h.canAsync(a,b)?j.expandCollapseNode(a,b,!b.open):a.async.enable?j.asyncNode(a,b)||j.expandCollapseNode(a,b,!b.open):b&&j.expandCollapseNode(a,b,!b.open)}};r.fn.zTree={consts:{className:{BUTTON:"button", +LEVEL:"level",ICO_LOADING:"ico_loading",SWITCH:"switch",NAME:"node_name"},event:{NODECREATED:"ztree_nodeCreated",CLICK:"ztree_click",EXPAND:"ztree_expand",COLLAPSE:"ztree_collapse",ASYNC_SUCCESS:"ztree_async_success",ASYNC_ERROR:"ztree_async_error",REMOVE:"ztree_remove",SELECTED:"ztree_selected",UNSELECTED:"ztree_unselected"},id:{A:"_a",ICON:"_ico",SPAN:"_span",SWITCH:"_switch",UL:"_ul"},line:{ROOT:"root",ROOTS:"roots",CENTER:"center",BOTTOM:"bottom",NOLINE:"noline",LINE:"line"},folder:{OPEN:"open", +CLOSE:"close",DOCU:"docu"},node:{CURSELECTED:"curSelectedNode"}},_z:{tools:h,view:j,event:n,data:e},getZTreeObj:function(a){return(a=e.getZTreeTools(a))?a:null},destroy:function(a){if(a&&a.length>0)j.destroy(e.getSetting(a));else for(var b in t)j.destroy(t[b])},init:function(a,b,c){var d=h.clone(P);r.extend(!0,d,b);d.treeId=a.attr("id");d.treeObj=a;d.treeObj.empty();t[d.treeId]=d;if(typeof document.body.style.maxHeight==="undefined")d.view.expandSpeed="";e.initRoot(d);a=e.getRoot(d);c=c?h.clone(h.isArray(c)? +c:[c]):[];d.data.simpleData.enable?e.nodeChildren(d,a,e.transformTozTreeFormat(d,c)):e.nodeChildren(d,a,c);e.initCache(d);n.unbindTree(d);n.bindTree(d);n.unbindEvent(d);n.bindEvent(d);var f={setting:d,addNodes:function(a,b,c,f){function g(){j.addNodes(d,a,b,n,f==!0)}a||(a=null);var l=e.nodeIsParent(d,a);if(a&&!l&&d.data.keep.leaf)return null;l=parseInt(b,10);isNaN(l)?(f=!!c,c=b,b=-1):b=l;if(!c)return null;var n=h.clone(h.isArray(c)?c:[c]);h.canAsync(d,a)?j.asyncNode(d,a,f,g):g();return n},cancelSelectedNode:function(a){j.cancelPreSelectedNode(d, +a)},destroy:function(){j.destroy(d)},expandAll:function(a){a=!!a;j.expandCollapseSonNode(d,null,a,!0);return a},expandNode:function(a,b,c,f,g){function n(){var b=l(a,d).get(0);b&&f!==!1&&j.scrollIntoView(d,b)}if(!a||!e.nodeIsParent(d,a))return null;b!==!0&&b!==!1&&(b=!a.open);if((g=!!g)&&b&&h.apply(d.callback.beforeExpand,[d.treeId,a],!0)==!1)return null;else if(g&&!b&&h.apply(d.callback.beforeCollapse,[d.treeId,a],!0)==!1)return null;b&&a.parentTId&&j.expandCollapseParentNode(d,a.getParentNode(), +b,!1);if(b===a.open&&!c)return null;e.getRoot(d).expandTriggerFlag=g;!h.canAsync(d,a)&&c?j.expandCollapseSonNode(d,a,b,!0,n):(a.open=!b,j.switchNode(this.setting,a),n());return b},getNodes:function(){return e.getNodes(d)},getNodeByParam:function(a,b,c){return!a?null:e.getNodeByParam(d,c?e.nodeChildren(d,c):e.getNodes(d),a,b)},getNodeByTId:function(a){return e.getNodeCache(d,a)},getNodesByParam:function(a,b,c){return!a?null:e.getNodesByParam(d,c?e.nodeChildren(d,c):e.getNodes(d),a,b)},getNodesByParamFuzzy:function(a, +b,c){return!a?null:e.getNodesByParamFuzzy(d,c?e.nodeChildren(d,c):e.getNodes(d),a,b)},getNodesByFilter:function(a,b,c,f){b=!!b;return!a||typeof a!="function"?b?null:[]:e.getNodesByFilter(d,c?e.nodeChildren(d,c):e.getNodes(d),a,b,f)},getNodeIndex:function(a){if(!a)return null;for(var b=a.parentTId?a.getParentNode():e.getRoot(d),b=e.nodeChildren(d,b),c=0,f=b.length;c0?j.createNodes(d,0,c,null,-1):d.async.enable&&d.async.url&&d.async.url!==""&&j.asyncNode(d);return f}};var Q=r.fn.zTree,l=h.$,g=Q.consts})(jQuery); diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/js/jquery.ztree.excheck.js b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/js/jquery.ztree.excheck.js new file mode 100644 index 0000000..c4cfff6 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/js/jquery.ztree.excheck.js @@ -0,0 +1,651 @@ +/* + * JQuery zTree excheck v3.5.40 + * http://treejs.cn/ + * + * Copyright (c) 2010 Hunter.z + * + * Licensed same as jquery - MIT License + * http://www.opensource.org/licenses/mit-license.php + * + * email: hunter.z@263.net + * Date: 2019-01-18 + */ +(function ($) { + //default consts of excheck + var _consts = { + event: { + CHECK: "ztree_check" + }, + id: { + CHECK: "_check" + }, + checkbox: { + STYLE: "checkbox", + DEFAULT: "chk", + DISABLED: "disable", + FALSE: "false", + TRUE: "true", + FULL: "full", + PART: "part", + FOCUS: "focus" + }, + radio: { + STYLE: "radio", + TYPE_ALL: "all", + TYPE_LEVEL: "level" + } + }, + //default setting of excheck + _setting = { + check: { + enable: false, + autoCheckTrigger: false, + chkStyle: _consts.checkbox.STYLE, + nocheckInherit: false, + chkDisabledInherit: false, + radioType: _consts.radio.TYPE_LEVEL, + chkboxType: { + "Y": "ps", + "N": "ps" + } + }, + data: { + key: { + checked: "checked" + } + }, + callback: { + beforeCheck: null, + onCheck: null + } + }, + //default root of excheck + _initRoot = function (setting) { + var r = data.getRoot(setting); + r.radioCheckedList = []; + }, + //default cache of excheck + _initCache = function (treeId) { + }, + //default bind event of excheck + _bindEvent = function (setting) { + var o = setting.treeObj, + c = consts.event; + o.bind(c.CHECK, function (event, srcEvent, treeId, node) { + event.srcEvent = srcEvent; + tools.apply(setting.callback.onCheck, [event, treeId, node]); + }); + }, + _unbindEvent = function (setting) { + var o = setting.treeObj, + c = consts.event; + o.unbind(c.CHECK); + }, + //default event proxy of excheck + _eventProxy = function (e) { + var target = e.target, + setting = data.getSetting(e.data.treeId), + tId = "", node = null, + nodeEventType = "", treeEventType = "", + nodeEventCallback = null, treeEventCallback = null; + + if (tools.eqs(e.type, "mouseover")) { + if (setting.check.enable && tools.eqs(target.tagName, "span") && target.getAttribute("treeNode" + consts.id.CHECK) !== null) { + tId = tools.getNodeMainDom(target).id; + nodeEventType = "mouseoverCheck"; + } + } else if (tools.eqs(e.type, "mouseout")) { + if (setting.check.enable && tools.eqs(target.tagName, "span") && target.getAttribute("treeNode" + consts.id.CHECK) !== null) { + tId = tools.getNodeMainDom(target).id; + nodeEventType = "mouseoutCheck"; + } + } else if (tools.eqs(e.type, "click")) { + if (setting.check.enable && tools.eqs(target.tagName, "span") && target.getAttribute("treeNode" + consts.id.CHECK) !== null) { + tId = tools.getNodeMainDom(target).id; + nodeEventType = "checkNode"; + } + } + if (tId.length > 0) { + node = data.getNodeCache(setting, tId); + switch (nodeEventType) { + case "checkNode" : + nodeEventCallback = _handler.onCheckNode; + break; + case "mouseoverCheck" : + nodeEventCallback = _handler.onMouseoverCheck; + break; + case "mouseoutCheck" : + nodeEventCallback = _handler.onMouseoutCheck; + break; + } + } + var proxyResult = { + stop: nodeEventType === "checkNode", + node: node, + nodeEventType: nodeEventType, + nodeEventCallback: nodeEventCallback, + treeEventType: treeEventType, + treeEventCallback: treeEventCallback + }; + return proxyResult + }, + //default init node of excheck + _initNode = function (setting, level, n, parentNode, isFirstNode, isLastNode, openFlag) { + if (!n) return; + var checked = data.nodeChecked(setting, n); + n.checkedOld = checked; + if (typeof n.nocheck == "string") n.nocheck = tools.eqs(n.nocheck, "true"); + n.nocheck = !!n.nocheck || (setting.check.nocheckInherit && parentNode && !!parentNode.nocheck); + if (typeof n.chkDisabled == "string") n.chkDisabled = tools.eqs(n.chkDisabled, "true"); + n.chkDisabled = !!n.chkDisabled || (setting.check.chkDisabledInherit && parentNode && !!parentNode.chkDisabled); + if (typeof n.halfCheck == "string") n.halfCheck = tools.eqs(n.halfCheck, "true"); + n.halfCheck = !!n.halfCheck; + n.check_Child_State = -1; + n.check_Focus = false; + n.getCheckStatus = function () { + return data.getCheckStatus(setting, n); + }; + + if (setting.check.chkStyle == consts.radio.STYLE && setting.check.radioType == consts.radio.TYPE_ALL && checked) { + var r = data.getRoot(setting); + r.radioCheckedList.push(n); + } + }, + //add dom for check + _beforeA = function (setting, node, html) { + if (setting.check.enable) { + data.makeChkFlag(setting, node); + html.push(""); + } + }, + //update zTreeObj, add method of check + _zTreeTools = function (setting, zTreeTools) { + zTreeTools.checkNode = function (node, checked, checkTypeFlag, callbackFlag) { + var nodeChecked = data.nodeChecked(setting, node); + if (node.chkDisabled === true) return; + if (checked !== true && checked !== false) { + checked = !nodeChecked; + } + callbackFlag = !!callbackFlag; + + if (nodeChecked === checked && !checkTypeFlag) { + return; + } else if (callbackFlag && tools.apply(this.setting.callback.beforeCheck, [this.setting.treeId, node], true) == false) { + return; + } + if (tools.uCanDo(this.setting) && this.setting.check.enable && node.nocheck !== true) { + data.nodeChecked(setting, node, checked); + var checkObj = $$(node, consts.id.CHECK, this.setting); + if (checkTypeFlag || this.setting.check.chkStyle === consts.radio.STYLE) view.checkNodeRelation(this.setting, node); + view.setChkClass(this.setting, checkObj, node); + view.repairParentChkClassWithSelf(this.setting, node); + if (callbackFlag) { + this.setting.treeObj.trigger(consts.event.CHECK, [null, this.setting.treeId, node]); + } + } + } + + zTreeTools.checkAllNodes = function (checked) { + view.repairAllChk(this.setting, !!checked); + } + + zTreeTools.getCheckedNodes = function (checked) { + var checked = (checked !== false); + var children = data.nodeChildren(setting, data.getRoot(this.setting)); + return data.getTreeCheckedNodes(this.setting, children, checked); + } + + zTreeTools.getChangeCheckedNodes = function () { + var children = data.nodeChildren(setting, data.getRoot(this.setting)); + return data.getTreeChangeCheckedNodes(this.setting, children); + } + + zTreeTools.setChkDisabled = function (node, disabled, inheritParent, inheritChildren) { + disabled = !!disabled; + inheritParent = !!inheritParent; + inheritChildren = !!inheritChildren; + view.repairSonChkDisabled(this.setting, node, disabled, inheritChildren); + view.repairParentChkDisabled(this.setting, node.getParentNode(), disabled, inheritParent); + } + + var _updateNode = zTreeTools.updateNode; + zTreeTools.updateNode = function (node, checkTypeFlag) { + if (_updateNode) _updateNode.apply(zTreeTools, arguments); + if (!node || !this.setting.check.enable) return; + var nObj = $$(node, this.setting); + if (nObj.get(0) && tools.uCanDo(this.setting)) { + var checkObj = $$(node, consts.id.CHECK, this.setting); + if (checkTypeFlag == true || this.setting.check.chkStyle === consts.radio.STYLE) view.checkNodeRelation(this.setting, node); + view.setChkClass(this.setting, checkObj, node); + view.repairParentChkClassWithSelf(this.setting, node); + } + } + }, + //method of operate data + _data = { + getRadioCheckedList: function (setting) { + var checkedList = data.getRoot(setting).radioCheckedList; + for (var i = 0, j = checkedList.length; i < j; i++) { + if (!data.getNodeCache(setting, checkedList[i].tId)) { + checkedList.splice(i, 1); + i--; + j--; + } + } + return checkedList; + }, + getCheckStatus: function (setting, node) { + if (!setting.check.enable || node.nocheck || node.chkDisabled) return null; + var checked = data.nodeChecked(setting, node), + r = { + checked: checked, + half: node.halfCheck ? node.halfCheck : (setting.check.chkStyle == consts.radio.STYLE ? (node.check_Child_State === 2) : (checked ? (node.check_Child_State > -1 && node.check_Child_State < 2) : (node.check_Child_State > 0))) + }; + return r; + }, + getTreeCheckedNodes: function (setting, nodes, checked, results) { + if (!nodes) return []; + var onlyOne = (checked && setting.check.chkStyle == consts.radio.STYLE && setting.check.radioType == consts.radio.TYPE_ALL); + results = !results ? [] : results; + for (var i = 0, l = nodes.length; i < l; i++) { + var node = nodes[i]; + var children = data.nodeChildren(setting, node); + var nodeChecked = data.nodeChecked(setting, node); + if (node.nocheck !== true && node.chkDisabled !== true && nodeChecked == checked) { + results.push(node); + if (onlyOne) { + break; + } + } + data.getTreeCheckedNodes(setting, children, checked, results); + if (onlyOne && results.length > 0) { + break; + } + } + return results; + }, + getTreeChangeCheckedNodes: function (setting, nodes, results) { + if (!nodes) return []; + results = !results ? [] : results; + for (var i = 0, l = nodes.length; i < l; i++) { + var node = nodes[i]; + var children = data.nodeChildren(setting, node); + var nodeChecked = data.nodeChecked(setting, node); + if (node.nocheck !== true && node.chkDisabled !== true && nodeChecked != node.checkedOld) { + results.push(node); + } + data.getTreeChangeCheckedNodes(setting, children, results); + } + return results; + }, + makeChkFlag: function (setting, node) { + if (!node) return; + var chkFlag = -1; + var children = data.nodeChildren(setting, node); + if (children) { + for (var i = 0, l = children.length; i < l; i++) { + var cNode = children[i]; + var nodeChecked = data.nodeChecked(setting, cNode); + var tmp = -1; + if (setting.check.chkStyle == consts.radio.STYLE) { + if (cNode.nocheck === true || cNode.chkDisabled === true) { + tmp = cNode.check_Child_State; + } else if (cNode.halfCheck === true) { + tmp = 2; + } else if (nodeChecked) { + tmp = 2; + } else { + tmp = cNode.check_Child_State > 0 ? 2 : 0; + } + if (tmp == 2) { + chkFlag = 2; + break; + } else if (tmp == 0) { + chkFlag = 0; + } + } else if (setting.check.chkStyle == consts.checkbox.STYLE) { + if (cNode.nocheck === true || cNode.chkDisabled === true) { + tmp = cNode.check_Child_State; + } else if (cNode.halfCheck === true) { + tmp = 1; + } else if (nodeChecked) { + tmp = (cNode.check_Child_State === -1 || cNode.check_Child_State === 2) ? 2 : 1; + } else { + tmp = (cNode.check_Child_State > 0) ? 1 : 0; + } + if (tmp === 1) { + chkFlag = 1; + break; + } else if (tmp === 2 && chkFlag > -1 && i > 0 && tmp !== chkFlag) { + chkFlag = 1; + break; + } else if (chkFlag === 2 && tmp > -1 && tmp < 2) { + chkFlag = 1; + break; + } else if (tmp > -1) { + chkFlag = tmp; + } + } + } + } + node.check_Child_State = chkFlag; + } + }, + //method of event proxy + _event = {}, + //method of event handler + _handler = { + onCheckNode: function (event, node) { + if (node.chkDisabled === true) return false; + var setting = data.getSetting(event.data.treeId); + if (tools.apply(setting.callback.beforeCheck, [setting.treeId, node], true) == false) return true; + var nodeChecked = data.nodeChecked(setting, node); + data.nodeChecked(setting, node, !nodeChecked); + view.checkNodeRelation(setting, node); + var checkObj = $$(node, consts.id.CHECK, setting); + view.setChkClass(setting, checkObj, node); + view.repairParentChkClassWithSelf(setting, node); + setting.treeObj.trigger(consts.event.CHECK, [event, setting.treeId, node]); + return true; + }, + onMouseoverCheck: function (event, node) { + if (node.chkDisabled === true) return false; + var setting = data.getSetting(event.data.treeId), + checkObj = $$(node, consts.id.CHECK, setting); + node.check_Focus = true; + view.setChkClass(setting, checkObj, node); + return true; + }, + onMouseoutCheck: function (event, node) { + if (node.chkDisabled === true) return false; + var setting = data.getSetting(event.data.treeId), + checkObj = $$(node, consts.id.CHECK, setting); + node.check_Focus = false; + view.setChkClass(setting, checkObj, node); + return true; + } + }, + //method of tools for zTree + _tools = {}, + //method of operate ztree dom + _view = { + checkNodeRelation: function (setting, node) { + var pNode, i, l, + r = consts.radio; + var nodeChecked = data.nodeChecked(setting, node); + if (setting.check.chkStyle == r.STYLE) { + var checkedList = data.getRadioCheckedList(setting); + if (nodeChecked) { + if (setting.check.radioType == r.TYPE_ALL) { + for (i = checkedList.length - 1; i >= 0; i--) { + pNode = checkedList[i]; + var pNodeChecked = data.nodeChecked(setting, pNode); + if (pNodeChecked && pNode != node) { + data.nodeChecked(setting, pNode, false); + checkedList.splice(i, 1); + + view.setChkClass(setting, $$(pNode, consts.id.CHECK, setting), pNode); + if (pNode.parentTId != node.parentTId) { + view.repairParentChkClassWithSelf(setting, pNode); + } + } + } + checkedList.push(node); + } else { + var parentNode = (node.parentTId) ? node.getParentNode() : data.getRoot(setting); + var children = data.nodeChildren(setting, parentNode); + for (i = 0, l = children.length; i < l; i++) { + pNode = children[i]; + var pNodeChecked = data.nodeChecked(setting, pNode); + if (pNodeChecked && pNode != node) { + data.nodeChecked(setting, pNode, false); + view.setChkClass(setting, $$(pNode, consts.id.CHECK, setting), pNode); + } + } + } + } else if (setting.check.radioType == r.TYPE_ALL) { + for (i = 0, l = checkedList.length; i < l; i++) { + if (node == checkedList[i]) { + checkedList.splice(i, 1); + break; + } + } + } + + } else { + var children = data.nodeChildren(setting, node); + if (nodeChecked && (!children || children.length == 0 || setting.check.chkboxType.Y.indexOf("s") > -1)) { + view.setSonNodeCheckBox(setting, node, true); + } + if (!nodeChecked && (!children || children.length == 0 || setting.check.chkboxType.N.indexOf("s") > -1)) { + view.setSonNodeCheckBox(setting, node, false); + } + if (nodeChecked && setting.check.chkboxType.Y.indexOf("p") > -1) { + view.setParentNodeCheckBox(setting, node, true); + } + if (!nodeChecked && setting.check.chkboxType.N.indexOf("p") > -1) { + view.setParentNodeCheckBox(setting, node, false); + } + } + }, + makeChkClass: function (setting, node) { + var c = consts.checkbox, r = consts.radio, + fullStyle = ""; + var nodeChecked = data.nodeChecked(setting, node); + if (node.chkDisabled === true) { + fullStyle = c.DISABLED; + } else if (node.halfCheck) { + fullStyle = c.PART; + } else if (setting.check.chkStyle == r.STYLE) { + fullStyle = (node.check_Child_State < 1) ? c.FULL : c.PART; + } else { + fullStyle = nodeChecked ? ((node.check_Child_State === 2 || node.check_Child_State === -1) ? c.FULL : c.PART) : ((node.check_Child_State < 1) ? c.FULL : c.PART); + } + var chkName = setting.check.chkStyle + "_" + (nodeChecked ? c.TRUE : c.FALSE) + "_" + fullStyle; + chkName = (node.check_Focus && node.chkDisabled !== true) ? chkName + "_" + c.FOCUS : chkName; + return consts.className.BUTTON + " " + c.DEFAULT + " " + chkName; + }, + repairAllChk: function (setting, checked) { + if (setting.check.enable && setting.check.chkStyle === consts.checkbox.STYLE) { + var root = data.getRoot(setting); + var children = data.nodeChildren(setting, root); + for (var i = 0, l = children.length; i < l; i++) { + var node = children[i]; + if (node.nocheck !== true && node.chkDisabled !== true) { + data.nodeChecked(setting, node, checked); + } + view.setSonNodeCheckBox(setting, node, checked); + } + } + }, + repairChkClass: function (setting, node) { + if (!node) return; + data.makeChkFlag(setting, node); + if (node.nocheck !== true) { + var checkObj = $$(node, consts.id.CHECK, setting); + view.setChkClass(setting, checkObj, node); + } + }, + repairParentChkClass: function (setting, node) { + if (!node || !node.parentTId) return; + var pNode = node.getParentNode(); + view.repairChkClass(setting, pNode); + view.repairParentChkClass(setting, pNode); + }, + repairParentChkClassWithSelf: function (setting, node) { + if (!node) return; + var children = data.nodeChildren(setting, node); + if (children && children.length > 0) { + view.repairParentChkClass(setting, children[0]); + } else { + view.repairParentChkClass(setting, node); + } + }, + repairSonChkDisabled: function (setting, node, chkDisabled, inherit) { + if (!node) return; + if (node.chkDisabled != chkDisabled) { + node.chkDisabled = chkDisabled; + } + view.repairChkClass(setting, node); + var children = data.nodeChildren(setting, node); + if (children && inherit) { + for (var i = 0, l = children.length; i < l; i++) { + var sNode = children[i]; + view.repairSonChkDisabled(setting, sNode, chkDisabled, inherit); + } + } + }, + repairParentChkDisabled: function (setting, node, chkDisabled, inherit) { + if (!node) return; + if (node.chkDisabled != chkDisabled && inherit) { + node.chkDisabled = chkDisabled; + } + view.repairChkClass(setting, node); + view.repairParentChkDisabled(setting, node.getParentNode(), chkDisabled, inherit); + }, + setChkClass: function (setting, obj, node) { + if (!obj) return; + if (node.nocheck === true) { + obj.hide(); + } else { + obj.show(); + } + obj.attr('class', view.makeChkClass(setting, node)); + }, + setParentNodeCheckBox: function (setting, node, value, srcNode) { + var checkObj = $$(node, consts.id.CHECK, setting); + if (!srcNode) srcNode = node; + data.makeChkFlag(setting, node); + if (node.nocheck !== true && node.chkDisabled !== true) { + data.nodeChecked(setting, node, value); + view.setChkClass(setting, checkObj, node); + if (setting.check.autoCheckTrigger && node != srcNode) { + setting.treeObj.trigger(consts.event.CHECK, [null, setting.treeId, node]); + } + } + if (node.parentTId) { + var pSign = true; + if (!value) { + var pNodes = data.nodeChildren(setting, node.getParentNode()); + for (var i = 0, l = pNodes.length; i < l; i++) { + var pNode = pNodes[i]; + var nodeChecked = data.nodeChecked(setting, pNode); + if ((pNode.nocheck !== true && pNode.chkDisabled !== true && nodeChecked) + || ((pNode.nocheck === true || pNode.chkDisabled === true) && pNode.check_Child_State > 0)) { + pSign = false; + break; + } + } + } + if (pSign) { + view.setParentNodeCheckBox(setting, node.getParentNode(), value, srcNode); + } + } + }, + setSonNodeCheckBox: function (setting, node, value, srcNode) { + if (!node) return; + var checkObj = $$(node, consts.id.CHECK, setting); + if (!srcNode) srcNode = node; + + var hasDisable = false; + var children = data.nodeChildren(setting, node); + if (children) { + for (var i = 0, l = children.length; i < l; i++) { + var sNode = children[i]; + view.setSonNodeCheckBox(setting, sNode, value, srcNode); + if (sNode.chkDisabled === true) hasDisable = true; + } + } + + if (node != data.getRoot(setting) && node.chkDisabled !== true) { + if (hasDisable && node.nocheck !== true) { + data.makeChkFlag(setting, node); + } + if (node.nocheck !== true && node.chkDisabled !== true) { + data.nodeChecked(setting, node, value); + if (!hasDisable) node.check_Child_State = (children && children.length > 0) ? (value ? 2 : 0) : -1; + } else { + node.check_Child_State = -1; + } + view.setChkClass(setting, checkObj, node); + if (setting.check.autoCheckTrigger && node != srcNode && node.nocheck !== true && node.chkDisabled !== true) { + setting.treeObj.trigger(consts.event.CHECK, [null, setting.treeId, node]); + } + } + + } + }, + + _z = { + tools: _tools, + view: _view, + event: _event, + data: _data + }; + $.extend(true, $.fn.zTree.consts, _consts); + $.extend(true, $.fn.zTree._z, _z); + + var zt = $.fn.zTree, + tools = zt._z.tools, + consts = zt.consts, + view = zt._z.view, + data = zt._z.data, + event = zt._z.event, + $$ = tools.$; + + data.nodeChecked = function (setting, node, newChecked) { + if (!node) { + return false; + } + var key = setting.data.key.checked; + if (typeof newChecked !== 'undefined') { + if (typeof newChecked === "string") { + newChecked = tools.eqs(newChecked, "true"); + } + newChecked = !!newChecked; + node[key] = newChecked; + } else if (typeof node[key] == "string"){ + node[key] = tools.eqs(node[key], "true"); + } else { + node[key] = !!node[key]; + } + return node[key]; + }; + + data.exSetting(_setting); + data.addInitBind(_bindEvent); + data.addInitUnBind(_unbindEvent); + data.addInitCache(_initCache); + data.addInitNode(_initNode); + data.addInitProxy(_eventProxy, true); + data.addInitRoot(_initRoot); + data.addBeforeA(_beforeA); + data.addZTreeTools(_zTreeTools); + + var _createNodes = view.createNodes; + view.createNodes = function (setting, level, nodes, parentNode, index) { + if (_createNodes) _createNodes.apply(view, arguments); + if (!nodes) return; + view.repairParentChkClassWithSelf(setting, parentNode); + } + var _removeNode = view.removeNode; + view.removeNode = function (setting, node) { + var parentNode = node.getParentNode(); + if (_removeNode) _removeNode.apply(view, arguments); + if (!node || !parentNode) return; + view.repairChkClass(setting, parentNode); + view.repairParentChkClass(setting, parentNode); + } + + var _appendNodes = view.appendNodes; + view.appendNodes = function (setting, level, nodes, parentNode, index, initFlag, openFlag) { + var html = ""; + if (_appendNodes) { + html = _appendNodes.apply(view, arguments); + } + if (parentNode) { + data.makeChkFlag(setting, parentNode); + } + return html; + } +})(jQuery); \ No newline at end of file diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/js/jquery.ztree.excheck.min.js b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/js/jquery.ztree.excheck.min.js new file mode 100644 index 0000000..9089c77 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/js/jquery.ztree.excheck.min.js @@ -0,0 +1,34 @@ +/* + * JQuery zTree excheck v3.5.40 + * http://treejs.cn/ + * + * Copyright (c) 2010 Hunter.z + * + * Licensed same as jquery - MIT License + * http://www.opensource.org/licenses/mit-license.php + * + * email: hunter.z@263.net + * Date: 2019-01-18 + */ +(function(m){var p,q,r,o={event:{CHECK:"ztree_check"},id:{CHECK:"_check"},checkbox:{STYLE:"checkbox",DEFAULT:"chk",DISABLED:"disable",FALSE:"false",TRUE:"true",FULL:"full",PART:"part",FOCUS:"focus"},radio:{STYLE:"radio",TYPE_ALL:"all",TYPE_LEVEL:"level"}},v={check:{enable:!1,autoCheckTrigger:!1,chkStyle:o.checkbox.STYLE,nocheckInherit:!1,chkDisabledInherit:!1,radioType:o.radio.TYPE_LEVEL,chkboxType:{Y:"ps",N:"ps"}},data:{key:{checked:"checked"}},callback:{beforeCheck:null,onCheck:null}};p=function(c, +a){if(a.chkDisabled===!0)return!1;var b=f.getSetting(c.data.treeId);if(i.apply(b.callback.beforeCheck,[b.treeId,a],!0)==!1)return!0;var d=f.nodeChecked(b,a);f.nodeChecked(b,a,!d);e.checkNodeRelation(b,a);d=n(a,h.id.CHECK,b);e.setChkClass(b,d,a);e.repairParentChkClassWithSelf(b,a);b.treeObj.trigger(h.event.CHECK,[c,b.treeId,a]);return!0};q=function(c,a){if(a.chkDisabled===!0)return!1;var b=f.getSetting(c.data.treeId),d=n(a,h.id.CHECK,b);a.check_Focus=!0;e.setChkClass(b,d,a);return!0};r=function(c, +a){if(a.chkDisabled===!0)return!1;var b=f.getSetting(c.data.treeId),d=n(a,h.id.CHECK,b);a.check_Focus=!1;e.setChkClass(b,d,a);return!0};m.extend(!0,m.fn.zTree.consts,o);m.extend(!0,m.fn.zTree._z,{tools:{},view:{checkNodeRelation:function(c,a){var b,d,j;d=h.radio;b=f.nodeChecked(c,a);if(c.check.chkStyle==d.STYLE){var g=f.getRadioCheckedList(c);if(b)if(c.check.radioType==d.TYPE_ALL){for(d=g.length-1;d>=0;d--){b=g[d];var k=f.nodeChecked(c,b);k&&b!=a&&(f.nodeChecked(c,b,!1),g.splice(d,1),e.setChkClass(c, +n(b,h.id.CHECK,c),b),b.parentTId!=a.parentTId&&e.repairParentChkClassWithSelf(c,b))}g.push(a)}else{g=a.parentTId?a.getParentNode():f.getRoot(c);g=f.nodeChildren(c,g);for(d=0,j=g.length;d-1)&&e.setSonNodeCheckBox(c,a, +!0),!b&&(!g||g.length==0||c.check.chkboxType.N.indexOf("s")>-1)&&e.setSonNodeCheckBox(c,a,!1),b&&c.check.chkboxType.Y.indexOf("p")>-1&&e.setParentNodeCheckBox(c,a,!0),!b&&c.check.chkboxType.N.indexOf("p")>-1&&e.setParentNodeCheckBox(c,a,!1)},makeChkClass:function(c,a){var b=h.checkbox,d=h.radio,j="",g=f.nodeChecked(c,a),j=a.chkDisabled===!0?b.DISABLED:a.halfCheck?b.PART:c.check.chkStyle==d.STYLE?a.check_Child_State<1?b.FULL:b.PART:g?a.check_Child_State===2||a.check_Child_State===-1?b.FULL:b.PART: +a.check_Child_State<1?b.FULL:b.PART,d=c.check.chkStyle+"_"+(g?b.TRUE:b.FALSE)+"_"+j,d=a.check_Focus&&a.chkDisabled!==!0?d+"_"+b.FOCUS:d;return h.className.BUTTON+" "+b.DEFAULT+" "+d},repairAllChk:function(c,a){if(c.check.enable&&c.check.chkStyle===h.checkbox.STYLE)for(var b=f.getRoot(c),b=f.nodeChildren(c,b),d=0,j=b.length;d0?e.repairParentChkClass(c,b[0]):e.repairParentChkClass(c,a)}},repairSonChkDisabled:function(c,a,b,d){if(a){if(a.chkDisabled!=b)a.chkDisabled=b;e.repairChkClass(c,a);if((a=f.nodeChildren(c,a))&&d)for(var j=0,g=a.length;j0){j=!1;break}}j&&e.setParentNodeCheckBox(c,a.getParentNode(),b,d)}},setSonNodeCheckBox:function(c,a,b,d){if(a){var j=n(a,h.id.CHECK,c);d||(d=a);var g=!1,k=f.nodeChildren(c,a);if(k)for(var i=0,l=k.length;i0?b?2:0:-1}else a.check_Child_State=-1;e.setChkClass(c,j,a);c.check.autoCheckTrigger&&a!=d&&a.nocheck!==!0&&a.chkDisabled!==!0&&c.treeObj.trigger(h.event.CHECK,[null,c.treeId,a])}}}},event:{},data:{getRadioCheckedList:function(c){for(var a=f.getRoot(c).radioCheckedList,b=0,d=a.length;b-1&&a.check_Child_State<2:a.check_Child_State>0}},getTreeCheckedNodes:function(c,a,b,d){if(!a)return[];for(var j=b&&c.check.chkStyle==h.radio.STYLE&&c.check.radioType==h.radio.TYPE_ALL,d=!d?[]:d,g=0,e=a.length;g0)break}return d},getTreeChangeCheckedNodes:function(c,a,b){if(!a)return[];for(var b=!b?[]:b,d=0,j=a.length;d0?2:0,l==2){b=2;break}else l==0&&(b=0);else if(c.check.chkStyle==h.checkbox.STYLE)if(l=e.nocheck===!0||e.chkDisabled===!0?e.check_Child_State:e.halfCheck===!0?1:i?e.check_Child_State===-1||e.check_Child_State===2?2:1:e.check_Child_State>0?1:0,l===1){b=1;break}else if(l===2&&b>-1&&j>0&&l!== +b){b=1;break}else if(b===2&&l>-1&&l<2){b=1;break}else l>-1&&(b=l)}a.check_Child_State=b}}}});var m=m.fn.zTree,i=m._z.tools,h=m.consts,e=m._z.view,f=m._z.data,n=i.$;f.nodeChecked=function(c,a,b){if(!a)return!1;c=c.data.key.checked;typeof b!=="undefined"?(typeof b==="string"&&(b=i.eqs(b,"true")),a[c]=!!b):a[c]=typeof a[c]=="string"?i.eqs(a[c],"true"):!!a[c];return a[c]};f.exSetting(v);f.addInitBind(function(c){c.treeObj.bind(h.event.CHECK,function(a,b,d,e){a.srcEvent=b;i.apply(c.callback.onCheck,[a, +d,e])})});f.addInitUnBind(function(c){c.treeObj.unbind(h.event.CHECK)});f.addInitCache(function(){});f.addInitNode(function(c,a,b,d){if(b){a=f.nodeChecked(c,b);b.checkedOld=a;if(typeof b.nocheck=="string")b.nocheck=i.eqs(b.nocheck,"true");b.nocheck=!!b.nocheck||c.check.nocheckInherit&&d&&!!d.nocheck;if(typeof b.chkDisabled=="string")b.chkDisabled=i.eqs(b.chkDisabled,"true");b.chkDisabled=!!b.chkDisabled||c.check.chkDisabledInherit&&d&&!!d.chkDisabled;if(typeof b.halfCheck=="string")b.halfCheck=i.eqs(b.halfCheck, +"true");b.halfCheck=!!b.halfCheck;b.check_Child_State=-1;b.check_Focus=!1;b.getCheckStatus=function(){return f.getCheckStatus(c,b)};c.check.chkStyle==h.radio.STYLE&&c.check.radioType==h.radio.TYPE_ALL&&a&&f.getRoot(c).radioCheckedList.push(b)}});f.addInitProxy(function(c){var a=c.target,b=f.getSetting(c.data.treeId),d="",e=null,g="",k=null;if(i.eqs(c.type,"mouseover")){if(b.check.enable&&i.eqs(a.tagName,"span")&&a.getAttribute("treeNode"+h.id.CHECK)!==null)d=i.getNodeMainDom(a).id,g="mouseoverCheck"}else if(i.eqs(c.type, +"mouseout")){if(b.check.enable&&i.eqs(a.tagName,"span")&&a.getAttribute("treeNode"+h.id.CHECK)!==null)d=i.getNodeMainDom(a).id,g="mouseoutCheck"}else if(i.eqs(c.type,"click")&&b.check.enable&&i.eqs(a.tagName,"span")&&a.getAttribute("treeNode"+h.id.CHECK)!==null)d=i.getNodeMainDom(a).id,g="checkNode";if(d.length>0)switch(e=f.getNodeCache(b,d),g){case "checkNode":k=p;break;case "mouseoverCheck":k=q;break;case "mouseoutCheck":k=r}return{stop:g==="checkNode",node:e,nodeEventType:g,nodeEventCallback:k, +treeEventType:"",treeEventCallback:null}},!0);f.addInitRoot(function(c){f.getRoot(c).radioCheckedList=[]});f.addBeforeA(function(c,a,b){c.check.enable&&(f.makeChkFlag(c,a),b.push(""))});f.addZTreeTools(function(c,a){a.checkNode=function(a,b,g,k){var m=f.nodeChecked(c,a);if(a.chkDisabled!==!0&&(b!==!0&&b!==!1&&(b=!m),k=!!k,(m!==b||g)&&!(k&&i.apply(this.setting.callback.beforeCheck, +[this.setting.treeId,a],!0)==!1)&&i.uCanDo(this.setting)&&this.setting.check.enable&&a.nocheck!==!0))f.nodeChecked(c,a,b),b=n(a,h.id.CHECK,this.setting),(g||this.setting.check.chkStyle===h.radio.STYLE)&&e.checkNodeRelation(this.setting,a),e.setChkClass(this.setting,b,a),e.repairParentChkClassWithSelf(this.setting,a),k&&this.setting.treeObj.trigger(h.event.CHECK,[null,this.setting.treeId,a])};a.checkAllNodes=function(a){e.repairAllChk(this.setting,!!a)};a.getCheckedNodes=function(a){var a=a!==!1,b= +f.nodeChildren(c,f.getRoot(this.setting));return f.getTreeCheckedNodes(this.setting,b,a)};a.getChangeCheckedNodes=function(){var a=f.nodeChildren(c,f.getRoot(this.setting));return f.getTreeChangeCheckedNodes(this.setting,a)};a.setChkDisabled=function(a,b,c,f){b=!!b;c=!!c;e.repairSonChkDisabled(this.setting,a,b,!!f);e.repairParentChkDisabled(this.setting,a.getParentNode(),b,c)};var b=a.updateNode;a.updateNode=function(c,f){b&&b.apply(a,arguments);if(c&&this.setting.check.enable&&n(c,this.setting).get(0)&& +i.uCanDo(this.setting)){var g=n(c,h.id.CHECK,this.setting);(f==!0||this.setting.check.chkStyle===h.radio.STYLE)&&e.checkNodeRelation(this.setting,c);e.setChkClass(this.setting,g,c);e.repairParentChkClassWithSelf(this.setting,c)}}});var s=e.createNodes;e.createNodes=function(c,a,b,d,f){s&&s.apply(e,arguments);b&&e.repairParentChkClassWithSelf(c,d)};var t=e.removeNode;e.removeNode=function(c,a){var b=a.getParentNode();t&&t.apply(e,arguments);a&&b&&(e.repairChkClass(c,b),e.repairParentChkClass(c,b))}; +var u=e.appendNodes;e.appendNodes=function(c,a,b,d,h,g,i){var m="";u&&(m=u.apply(e,arguments));d&&f.makeChkFlag(c,d);return m}})(jQuery); diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/js/jquery.ztree.exedit.js b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/js/jquery.ztree.exedit.js new file mode 100644 index 0000000..57358d8 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/js/jquery.ztree.exedit.js @@ -0,0 +1,1203 @@ +/* + * JQuery zTree exedit v3.5.40 + * http://treejs.cn/ + * + * Copyright (c) 2010 Hunter.z + * + * Licensed same as jquery - MIT License + * http://www.opensource.org/licenses/mit-license.php + * + * email: hunter.z@263.net + * Date: 2019-01-18 + */ +(function ($) { + //default consts of exedit + var _consts = { + event: { + DRAG: "ztree_drag", + DROP: "ztree_drop", + RENAME: "ztree_rename", + DRAGMOVE: "ztree_dragmove" + }, + id: { + EDIT: "_edit", + INPUT: "_input", + REMOVE: "_remove" + }, + move: { + TYPE_INNER: "inner", + TYPE_PREV: "prev", + TYPE_NEXT: "next" + }, + node: { + CURSELECTED_EDIT: "curSelectedNode_Edit", + TMPTARGET_TREE: "tmpTargetzTree", + TMPTARGET_NODE: "tmpTargetNode" + } + }, + //default setting of exedit + _setting = { + edit: { + enable: false, + editNameSelectAll: false, + showRemoveBtn: true, + showRenameBtn: true, + removeTitle: "remove", + renameTitle: "rename", + drag: { + autoExpandTrigger: false, + isCopy: true, + isMove: true, + prev: true, + next: true, + inner: true, + minMoveSize: 5, + borderMax: 10, + borderMin: -5, + maxShowNodeNum: 5, + autoOpenTime: 500 + } + }, + view: { + addHoverDom: null, + removeHoverDom: null + }, + callback: { + beforeDrag: null, + beforeDragOpen: null, + beforeDrop: null, + beforeEditName: null, + beforeRename: null, + onDrag: null, + onDragMove: null, + onDrop: null, + onRename: null + } + }, + //default root of exedit + _initRoot = function (setting) { + var r = data.getRoot(setting), rs = data.getRoots(); + r.curEditNode = null; + r.curEditInput = null; + r.curHoverNode = null; + r.dragFlag = 0; + r.dragNodeShowBefore = []; + r.dragMaskList = new Array(); + rs.showHoverDom = true; + }, + //default cache of exedit + _initCache = function (treeId) { + }, + //default bind event of exedit + _bindEvent = function (setting) { + var o = setting.treeObj; + var c = consts.event; + o.bind(c.RENAME, function (event, treeId, treeNode, isCancel) { + tools.apply(setting.callback.onRename, [event, treeId, treeNode, isCancel]); + }); + + o.bind(c.DRAG, function (event, srcEvent, treeId, treeNodes) { + tools.apply(setting.callback.onDrag, [srcEvent, treeId, treeNodes]); + }); + + o.bind(c.DRAGMOVE, function (event, srcEvent, treeId, treeNodes) { + tools.apply(setting.callback.onDragMove, [srcEvent, treeId, treeNodes]); + }); + + o.bind(c.DROP, function (event, srcEvent, treeId, treeNodes, targetNode, moveType, isCopy) { + tools.apply(setting.callback.onDrop, [srcEvent, treeId, treeNodes, targetNode, moveType, isCopy]); + }); + }, + _unbindEvent = function (setting) { + var o = setting.treeObj; + var c = consts.event; + o.unbind(c.RENAME); + o.unbind(c.DRAG); + o.unbind(c.DRAGMOVE); + o.unbind(c.DROP); + }, + //default event proxy of exedit + _eventProxy = function (e) { + var target = e.target, + setting = data.getSetting(e.data.treeId), + relatedTarget = e.relatedTarget, + tId = "", node = null, + nodeEventType = "", treeEventType = "", + nodeEventCallback = null, treeEventCallback = null, + tmp = null; + + if (tools.eqs(e.type, "mouseover")) { + tmp = tools.getMDom(setting, target, [{tagName: "a", attrName: "treeNode" + consts.id.A}]); + if (tmp) { + tId = tools.getNodeMainDom(tmp).id; + nodeEventType = "hoverOverNode"; + } + } else if (tools.eqs(e.type, "mouseout")) { + tmp = tools.getMDom(setting, relatedTarget, [{tagName: "a", attrName: "treeNode" + consts.id.A}]); + if (!tmp) { + tId = "remove"; + nodeEventType = "hoverOutNode"; + } + } else if (tools.eqs(e.type, "mousedown")) { + tmp = tools.getMDom(setting, target, [{tagName: "a", attrName: "treeNode" + consts.id.A}]); + if (tmp) { + tId = tools.getNodeMainDom(tmp).id; + nodeEventType = "mousedownNode"; + } + } + if (tId.length > 0) { + node = data.getNodeCache(setting, tId); + switch (nodeEventType) { + case "mousedownNode" : + nodeEventCallback = _handler.onMousedownNode; + break; + case "hoverOverNode" : + nodeEventCallback = _handler.onHoverOverNode; + break; + case "hoverOutNode" : + nodeEventCallback = _handler.onHoverOutNode; + break; + } + } + var proxyResult = { + stop: false, + node: node, + nodeEventType: nodeEventType, + nodeEventCallback: nodeEventCallback, + treeEventType: treeEventType, + treeEventCallback: treeEventCallback + }; + return proxyResult + }, + //default init node of exedit + _initNode = function (setting, level, n, parentNode, isFirstNode, isLastNode, openFlag) { + if (!n) return; + n.isHover = false; + n.editNameFlag = false; + }, + //update zTreeObj, add method of edit + _zTreeTools = function (setting, zTreeTools) { + zTreeTools.cancelEditName = function (newName) { + var root = data.getRoot(this.setting); + if (!root.curEditNode) return; + view.cancelCurEditNode(this.setting, newName ? newName : null, true); + } + zTreeTools.copyNode = function (targetNode, node, moveType, isSilent) { + if (!node) return null; + var isParent = data.nodeIsParent(setting, targetNode); + if (targetNode && !isParent && this.setting.data.keep.leaf && moveType === consts.move.TYPE_INNER) return null; + var _this = this, + newNode = tools.clone(node); + if (!targetNode) { + targetNode = null; + moveType = consts.move.TYPE_INNER; + } + if (moveType == consts.move.TYPE_INNER) { + function copyCallback() { + view.addNodes(_this.setting, targetNode, -1, [newNode], isSilent); + } + + if (tools.canAsync(this.setting, targetNode)) { + view.asyncNode(this.setting, targetNode, isSilent, copyCallback); + } else { + copyCallback(); + } + } else { + view.addNodes(this.setting, targetNode.parentNode, -1, [newNode], isSilent); + view.moveNode(this.setting, targetNode, newNode, moveType, false, isSilent); + } + return newNode; + } + zTreeTools.editName = function (node) { + if (!node || !node.tId || node !== data.getNodeCache(this.setting, node.tId)) return; + if (node.parentTId) view.expandCollapseParentNode(this.setting, node.getParentNode(), true); + view.editNode(this.setting, node) + } + zTreeTools.moveNode = function (targetNode, node, moveType, isSilent) { + if (!node) return node; + var isParent = data.nodeIsParent(setting, targetNode); + if (targetNode && !isParent && this.setting.data.keep.leaf && moveType === consts.move.TYPE_INNER) { + return null; + } else if (targetNode && ((node.parentTId == targetNode.tId && moveType == consts.move.TYPE_INNER) || $$(node, this.setting).find("#" + targetNode.tId).length > 0)) { + return null; + } else if (!targetNode) { + targetNode = null; + } + var _this = this; + + function moveCallback() { + view.moveNode(_this.setting, targetNode, node, moveType, false, isSilent); + } + + if (tools.canAsync(this.setting, targetNode) && moveType === consts.move.TYPE_INNER) { + view.asyncNode(this.setting, targetNode, isSilent, moveCallback); + } else { + moveCallback(); + } + return node; + } + zTreeTools.setEditable = function (editable) { + this.setting.edit.enable = editable; + return this.refresh(); + } + }, + //method of operate data + _data = { + setSonNodeLevel: function (setting, parentNode, node) { + if (!node) return; + var children = data.nodeChildren(setting, node); + node.level = (parentNode) ? parentNode.level + 1 : 0; + if (!children) return; + for (var i = 0, l = children.length; i < l; i++) { + if (children[i]) data.setSonNodeLevel(setting, node, children[i]); + } + } + }, + //method of event proxy + _event = {}, + //method of event handler + _handler = { + onHoverOverNode: function (event, node) { + var setting = data.getSetting(event.data.treeId), + root = data.getRoot(setting); + if (root.curHoverNode != node) { + _handler.onHoverOutNode(event); + } + root.curHoverNode = node; + view.addHoverDom(setting, node); + }, + onHoverOutNode: function (event, node) { + var setting = data.getSetting(event.data.treeId), + root = data.getRoot(setting); + if (root.curHoverNode && !data.isSelectedNode(setting, root.curHoverNode)) { + view.removeTreeDom(setting, root.curHoverNode); + root.curHoverNode = null; + } + }, + onMousedownNode: function (eventMouseDown, _node) { + var i, l, + setting = data.getSetting(eventMouseDown.data.treeId), + root = data.getRoot(setting), roots = data.getRoots(); + //right click can't drag & drop + if (eventMouseDown.button == 2 || !setting.edit.enable || (!setting.edit.drag.isCopy && !setting.edit.drag.isMove)) return true; + + //input of edit node name can't drag & drop + var target = eventMouseDown.target, + _nodes = data.getRoot(setting).curSelectedList, + nodes = []; + if (!data.isSelectedNode(setting, _node)) { + nodes = [_node]; + } else { + for (i = 0, l = _nodes.length; i < l; i++) { + if (_nodes[i].editNameFlag && tools.eqs(target.tagName, "input") && target.getAttribute("treeNode" + consts.id.INPUT) !== null) { + return true; + } + nodes.push(_nodes[i]); + if (nodes[0].parentTId !== _nodes[i].parentTId) { + nodes = [_node]; + break; + } + } + } + + view.editNodeBlur = true; + view.cancelCurEditNode(setting); + + var doc = $(setting.treeObj.get(0).ownerDocument), + body = $(setting.treeObj.get(0).ownerDocument.body), curNode, tmpArrow, tmpTarget, + isOtherTree = false, + targetSetting = setting, + sourceSetting = setting, + preNode, nextNode, + preTmpTargetNodeId = null, + preTmpMoveType = null, + tmpTargetNodeId = null, + moveType = consts.move.TYPE_INNER, + mouseDownX = eventMouseDown.clientX, + mouseDownY = eventMouseDown.clientY, + startTime = (new Date()).getTime(); + + if (tools.uCanDo(setting)) { + doc.bind("mousemove", _docMouseMove); + } + + function _docMouseMove(event) { + //avoid start drag after click node + if (root.dragFlag == 0 && Math.abs(mouseDownX - event.clientX) < setting.edit.drag.minMoveSize + && Math.abs(mouseDownY - event.clientY) < setting.edit.drag.minMoveSize) { + return true; + } + var i, l, tmpNode, tmpDom, tmpNodes; + body.css("cursor", "pointer"); + + if (root.dragFlag == 0) { + if (tools.apply(setting.callback.beforeDrag, [setting.treeId, nodes], true) == false) { + _docMouseUp(event); + return true; + } + + for (i = 0, l = nodes.length; i < l; i++) { + if (i == 0) { + root.dragNodeShowBefore = []; + } + tmpNode = nodes[i]; + if (data.nodeIsParent(setting, tmpNode) && tmpNode.open) { + view.expandCollapseNode(setting, tmpNode, !tmpNode.open); + root.dragNodeShowBefore[tmpNode.tId] = true; + } else { + root.dragNodeShowBefore[tmpNode.tId] = false; + } + } + + root.dragFlag = 1; + roots.showHoverDom = false; + tools.showIfameMask(setting, true); + + //sort + var isOrder = true, lastIndex = -1; + if (nodes.length > 1) { + var pNodes = nodes[0].parentTId ? data.nodeChildren(setting, nodes[0].getParentNode()) : data.getNodes(setting); + tmpNodes = []; + for (i = 0, l = pNodes.length; i < l; i++) { + if (root.dragNodeShowBefore[pNodes[i].tId] !== undefined) { + if (isOrder && lastIndex > -1 && (lastIndex + 1) !== i) { + isOrder = false; + } + tmpNodes.push(pNodes[i]); + lastIndex = i; + } + if (nodes.length === tmpNodes.length) { + nodes = tmpNodes; + break; + } + } + } + if (isOrder) { + preNode = nodes[0].getPreNode(); + nextNode = nodes[nodes.length - 1].getNextNode(); + } + + //set node in selected + curNode = $$("
                                    ", setting); + for (i = 0, l = nodes.length; i < l; i++) { + tmpNode = nodes[i]; + tmpNode.editNameFlag = false; + view.selectNode(setting, tmpNode, i > 0); + view.removeTreeDom(setting, tmpNode); + + if (i > setting.edit.drag.maxShowNodeNum - 1) { + continue; + } + + tmpDom = $$("
                                  • ", setting); + tmpDom.append($$(tmpNode, consts.id.A, setting).clone()); + tmpDom.css("padding", "0"); + tmpDom.children("#" + tmpNode.tId + consts.id.A).removeClass(consts.node.CURSELECTED); + curNode.append(tmpDom); + if (i == setting.edit.drag.maxShowNodeNum - 1) { + tmpDom = $$("
                                  • ...
                                  • ", setting); + curNode.append(tmpDom); + } + } + curNode.attr("id", nodes[0].tId + consts.id.UL + "_tmp"); + curNode.addClass(setting.treeObj.attr("class")); + curNode.appendTo(body); + + tmpArrow = $$("", setting); + tmpArrow.attr("id", "zTreeMove_arrow_tmp"); + tmpArrow.appendTo(body); + + setting.treeObj.trigger(consts.event.DRAG, [event, setting.treeId, nodes]); + } + + if (root.dragFlag == 1) { + if (tmpTarget && tmpArrow.attr("id") == event.target.id && tmpTargetNodeId && (event.clientX + doc.scrollLeft() + 2) > ($("#" + tmpTargetNodeId + consts.id.A, tmpTarget).offset().left)) { + var xT = $("#" + tmpTargetNodeId + consts.id.A, tmpTarget); + event.target = (xT.length > 0) ? xT.get(0) : event.target; + } else if (tmpTarget) { + tmpTarget.removeClass(consts.node.TMPTARGET_TREE); + if (tmpTargetNodeId) $("#" + tmpTargetNodeId + consts.id.A, tmpTarget).removeClass(consts.node.TMPTARGET_NODE + "_" + consts.move.TYPE_PREV) + .removeClass(consts.node.TMPTARGET_NODE + "_" + _consts.move.TYPE_NEXT).removeClass(consts.node.TMPTARGET_NODE + "_" + _consts.move.TYPE_INNER); + } + tmpTarget = null; + tmpTargetNodeId = null; + + //judge drag & drop in multi ztree + isOtherTree = false; + targetSetting = setting; + var settings = data.getSettings(); + for (var s in settings) { + if (settings[s].treeId && settings[s].edit.enable && settings[s].treeId != setting.treeId + && (event.target.id == settings[s].treeId || $(event.target).parents("#" + settings[s].treeId).length > 0)) { + isOtherTree = true; + targetSetting = settings[s]; + } + } + + var docScrollTop = doc.scrollTop(), + docScrollLeft = doc.scrollLeft(), + treeOffset = targetSetting.treeObj.offset(), + scrollHeight = targetSetting.treeObj.get(0).scrollHeight, + scrollWidth = targetSetting.treeObj.get(0).scrollWidth, + dTop = (event.clientY + docScrollTop - treeOffset.top), + dBottom = (targetSetting.treeObj.height() + treeOffset.top - event.clientY - docScrollTop), + dLeft = (event.clientX + docScrollLeft - treeOffset.left), + dRight = (targetSetting.treeObj.width() + treeOffset.left - event.clientX - docScrollLeft), + isTop = (dTop < setting.edit.drag.borderMax && dTop > setting.edit.drag.borderMin), + isBottom = (dBottom < setting.edit.drag.borderMax && dBottom > setting.edit.drag.borderMin), + isLeft = (dLeft < setting.edit.drag.borderMax && dLeft > setting.edit.drag.borderMin), + isRight = (dRight < setting.edit.drag.borderMax && dRight > setting.edit.drag.borderMin), + isTreeInner = dTop > setting.edit.drag.borderMin && dBottom > setting.edit.drag.borderMin && dLeft > setting.edit.drag.borderMin && dRight > setting.edit.drag.borderMin, + isTreeTop = (isTop && targetSetting.treeObj.scrollTop() <= 0), + isTreeBottom = (isBottom && (targetSetting.treeObj.scrollTop() + targetSetting.treeObj.height() + 10) >= scrollHeight), + isTreeLeft = (isLeft && targetSetting.treeObj.scrollLeft() <= 0), + isTreeRight = (isRight && (targetSetting.treeObj.scrollLeft() + targetSetting.treeObj.width() + 10) >= scrollWidth); + + if (event.target && tools.isChildOrSelf(event.target, targetSetting.treeId)) { + //get node
                                  • dom + var targetObj = event.target; + while (targetObj && targetObj.tagName && !tools.eqs(targetObj.tagName, "li") && targetObj.id != targetSetting.treeId) { + targetObj = targetObj.parentNode; + } + + var canMove = true; + //don't move to self or children of self + for (i = 0, l = nodes.length; i < l; i++) { + tmpNode = nodes[i]; + if (targetObj.id === tmpNode.tId) { + canMove = false; + break; + } else if ($$(tmpNode, setting).find("#" + targetObj.id).length > 0) { + canMove = false; + break; + } + } + if (canMove && event.target && tools.isChildOrSelf(event.target, targetObj.id + consts.id.A)) { + tmpTarget = $(targetObj); + tmpTargetNodeId = targetObj.id; + } + } + + //the mouse must be in zTree + tmpNode = nodes[0]; + if (isTreeInner && tools.isChildOrSelf(event.target, targetSetting.treeId)) { + //judge mouse move in root of ztree + if (!tmpTarget && (event.target.id == targetSetting.treeId || isTreeTop || isTreeBottom || isTreeLeft || isTreeRight) && (isOtherTree || (!isOtherTree && tmpNode.parentTId))) { + tmpTarget = targetSetting.treeObj; + } + //auto scroll top + if (isTop) { + targetSetting.treeObj.scrollTop(targetSetting.treeObj.scrollTop() - 10); + } else if (isBottom) { + targetSetting.treeObj.scrollTop(targetSetting.treeObj.scrollTop() + 10); + } + if (isLeft) { + targetSetting.treeObj.scrollLeft(targetSetting.treeObj.scrollLeft() - 10); + } else if (isRight) { + targetSetting.treeObj.scrollLeft(targetSetting.treeObj.scrollLeft() + 10); + } + //auto scroll left + if (tmpTarget && tmpTarget != targetSetting.treeObj && tmpTarget.offset().left < targetSetting.treeObj.offset().left) { + targetSetting.treeObj.scrollLeft(targetSetting.treeObj.scrollLeft() + tmpTarget.offset().left - targetSetting.treeObj.offset().left); + } + } + + curNode.css({ + "top": (event.clientY + docScrollTop + 3) + "px", + "left": (event.clientX + docScrollLeft + 3) + "px" + }); + + var dX = 0; + var dY = 0; + if (tmpTarget && tmpTarget.attr("id") != targetSetting.treeId) { + var tmpTargetNode = tmpTargetNodeId == null ? null : data.getNodeCache(targetSetting, tmpTargetNodeId), + isCopy = ((event.ctrlKey || event.metaKey) && setting.edit.drag.isMove && setting.edit.drag.isCopy) || (!setting.edit.drag.isMove && setting.edit.drag.isCopy), + isPrev = !!(preNode && tmpTargetNodeId === preNode.tId), + isNext = !!(nextNode && tmpTargetNodeId === nextNode.tId), + isInner = (tmpNode.parentTId && tmpNode.parentTId == tmpTargetNodeId), + canPrev = (isCopy || !isNext) && tools.apply(targetSetting.edit.drag.prev, [targetSetting.treeId, nodes, tmpTargetNode], !!targetSetting.edit.drag.prev), + canNext = (isCopy || !isPrev) && tools.apply(targetSetting.edit.drag.next, [targetSetting.treeId, nodes, tmpTargetNode], !!targetSetting.edit.drag.next), + canInner = (isCopy || !isInner) && !(targetSetting.data.keep.leaf && !data.nodeIsParent(setting, tmpTargetNode)) && tools.apply(targetSetting.edit.drag.inner, [targetSetting.treeId, nodes, tmpTargetNode], !!targetSetting.edit.drag.inner); + + function clearMove() { + tmpTarget = null; + tmpTargetNodeId = ""; + moveType = consts.move.TYPE_INNER; + tmpArrow.css({ + "display": "none" + }); + if (window.zTreeMoveTimer) { + clearTimeout(window.zTreeMoveTimer); + window.zTreeMoveTargetNodeTId = null + } + } + + if (!canPrev && !canNext && !canInner) { + clearMove(); + } else { + var tmpTargetA = $("#" + tmpTargetNodeId + consts.id.A, tmpTarget), + tmpNextA = tmpTargetNode.isLastNode ? null : $("#" + tmpTargetNode.getNextNode().tId + consts.id.A, tmpTarget.next()), + tmpTop = tmpTargetA.offset().top, + tmpLeft = tmpTargetA.offset().left, + prevPercent = canPrev ? (canInner ? 0.25 : (canNext ? 0.5 : 1)) : -1, + nextPercent = canNext ? (canInner ? 0.75 : (canPrev ? 0.5 : 0)) : -1, + dY_percent = (event.clientY + docScrollTop - tmpTop) / tmpTargetA.height(); + + if ((prevPercent == 1 || dY_percent <= prevPercent && dY_percent >= -.2) && canPrev) { + dX = 1 - tmpArrow.width(); + dY = tmpTop - tmpArrow.height() / 2; + moveType = consts.move.TYPE_PREV; + } else if ((nextPercent == 0 || dY_percent >= nextPercent && dY_percent <= 1.2) && canNext) { + dX = 1 - tmpArrow.width(); + dY = (tmpNextA == null || (data.nodeIsParent(setting, tmpTargetNode) && tmpTargetNode.open)) ? (tmpTop + tmpTargetA.height() - tmpArrow.height() / 2) : (tmpNextA.offset().top - tmpArrow.height() / 2); + moveType = consts.move.TYPE_NEXT; + } else if (canInner) { + dX = 5 - tmpArrow.width(); + dY = tmpTop; + moveType = consts.move.TYPE_INNER; + } else { + clearMove(); + } + + if (tmpTarget) { + tmpArrow.css({ + "display": "block", + "top": dY + "px", + "left": (tmpLeft + dX) + "px" + }); + tmpTargetA.addClass(consts.node.TMPTARGET_NODE + "_" + moveType); + + if (preTmpTargetNodeId != tmpTargetNodeId || preTmpMoveType != moveType) { + startTime = (new Date()).getTime(); + } + if (tmpTargetNode && data.nodeIsParent(setting, tmpTargetNode) && moveType == consts.move.TYPE_INNER) { + var startTimer = true; + if (window.zTreeMoveTimer && window.zTreeMoveTargetNodeTId !== tmpTargetNode.tId) { + clearTimeout(window.zTreeMoveTimer); + window.zTreeMoveTargetNodeTId = null; + } else if (window.zTreeMoveTimer && window.zTreeMoveTargetNodeTId === tmpTargetNode.tId) { + startTimer = false; + } + if (startTimer) { + window.zTreeMoveTimer = setTimeout(function () { + if (moveType != consts.move.TYPE_INNER) return; + if (tmpTargetNode && data.nodeIsParent(setting, tmpTargetNode) && !tmpTargetNode.open && (new Date()).getTime() - startTime > targetSetting.edit.drag.autoOpenTime + && tools.apply(targetSetting.callback.beforeDragOpen, [targetSetting.treeId, tmpTargetNode], true)) { + view.switchNode(targetSetting, tmpTargetNode); + if (targetSetting.edit.drag.autoExpandTrigger) { + targetSetting.treeObj.trigger(consts.event.EXPAND, [targetSetting.treeId, tmpTargetNode]); + } + } + }, targetSetting.edit.drag.autoOpenTime + 50); + window.zTreeMoveTargetNodeTId = tmpTargetNode.tId; + } + } + } + } + } else { + moveType = consts.move.TYPE_INNER; + if (tmpTarget && tools.apply(targetSetting.edit.drag.inner, [targetSetting.treeId, nodes, null], !!targetSetting.edit.drag.inner)) { + tmpTarget.addClass(consts.node.TMPTARGET_TREE); + } else { + tmpTarget = null; + } + tmpArrow.css({ + "display": "none" + }); + if (window.zTreeMoveTimer) { + clearTimeout(window.zTreeMoveTimer); + window.zTreeMoveTargetNodeTId = null; + } + } + preTmpTargetNodeId = tmpTargetNodeId; + preTmpMoveType = moveType; + + setting.treeObj.trigger(consts.event.DRAGMOVE, [event, setting.treeId, nodes]); + } + return false; + } + + doc.bind("mouseup", _docMouseUp); + + function _docMouseUp(event) { + if (window.zTreeMoveTimer) { + clearTimeout(window.zTreeMoveTimer); + window.zTreeMoveTargetNodeTId = null; + } + preTmpTargetNodeId = null; + preTmpMoveType = null; + doc.unbind("mousemove", _docMouseMove); + doc.unbind("mouseup", _docMouseUp); + doc.unbind("selectstart", _docSelect); + body.css("cursor", ""); + if (tmpTarget) { + tmpTarget.removeClass(consts.node.TMPTARGET_TREE); + if (tmpTargetNodeId) $("#" + tmpTargetNodeId + consts.id.A, tmpTarget).removeClass(consts.node.TMPTARGET_NODE + "_" + consts.move.TYPE_PREV) + .removeClass(consts.node.TMPTARGET_NODE + "_" + _consts.move.TYPE_NEXT).removeClass(consts.node.TMPTARGET_NODE + "_" + _consts.move.TYPE_INNER); + } + tools.showIfameMask(setting, false); + + roots.showHoverDom = true; + if (root.dragFlag == 0) return; + root.dragFlag = 0; + + var i, l, tmpNode; + for (i = 0, l = nodes.length; i < l; i++) { + tmpNode = nodes[i]; + if (data.nodeIsParent(setting, tmpNode) && root.dragNodeShowBefore[tmpNode.tId] && !tmpNode.open) { + view.expandCollapseNode(setting, tmpNode, !tmpNode.open); + delete root.dragNodeShowBefore[tmpNode.tId]; + } + } + + if (curNode) curNode.remove(); + if (tmpArrow) tmpArrow.remove(); + + var isCopy = ((event.ctrlKey || event.metaKey) && setting.edit.drag.isMove && setting.edit.drag.isCopy) || (!setting.edit.drag.isMove && setting.edit.drag.isCopy); + if (!isCopy && tmpTarget && tmpTargetNodeId && nodes[0].parentTId && tmpTargetNodeId == nodes[0].parentTId && moveType == consts.move.TYPE_INNER) { + tmpTarget = null; + } + if (tmpTarget) { + var dragTargetNode = tmpTargetNodeId == null ? null : data.getNodeCache(targetSetting, tmpTargetNodeId); + if (tools.apply(setting.callback.beforeDrop, [targetSetting.treeId, nodes, dragTargetNode, moveType, isCopy], true) == false) { + view.selectNodes(sourceSetting, nodes); + return; + } + var newNodes = isCopy ? tools.clone(nodes) : nodes; + + function dropCallback() { + if (isOtherTree) { + if (!isCopy) { + for (var i = 0, l = nodes.length; i < l; i++) { + view.removeNode(setting, nodes[i]); + } + } + if (moveType == consts.move.TYPE_INNER) { + view.addNodes(targetSetting, dragTargetNode, -1, newNodes); + } else { + view.addNodes(targetSetting, dragTargetNode.getParentNode(), moveType == consts.move.TYPE_PREV ? dragTargetNode.getIndex() : dragTargetNode.getIndex() + 1, newNodes); + } + } else { + if (isCopy && moveType == consts.move.TYPE_INNER) { + view.addNodes(targetSetting, dragTargetNode, -1, newNodes); + } else if (isCopy) { + view.addNodes(targetSetting, dragTargetNode.getParentNode(), moveType == consts.move.TYPE_PREV ? dragTargetNode.getIndex() : dragTargetNode.getIndex() + 1, newNodes); + } else { + if (moveType != consts.move.TYPE_NEXT) { + for (i = 0, l = newNodes.length; i < l; i++) { + view.moveNode(targetSetting, dragTargetNode, newNodes[i], moveType, false); + } + } else { + for (i = -1, l = newNodes.length - 1; i < l; l--) { + view.moveNode(targetSetting, dragTargetNode, newNodes[l], moveType, false); + } + } + } + } + view.selectNodes(targetSetting, newNodes); + + var a = $$(newNodes[0], setting).get(0); + view.scrollIntoView(setting, a); + + setting.treeObj.trigger(consts.event.DROP, [event, targetSetting.treeId, newNodes, dragTargetNode, moveType, isCopy]); + } + + if (moveType == consts.move.TYPE_INNER && tools.canAsync(targetSetting, dragTargetNode)) { + view.asyncNode(targetSetting, dragTargetNode, false, dropCallback); + } else { + dropCallback(); + } + + } else { + view.selectNodes(sourceSetting, nodes); + setting.treeObj.trigger(consts.event.DROP, [event, setting.treeId, nodes, null, null, null]); + } + } + + doc.bind("selectstart", _docSelect); + + function _docSelect() { + return false; + } + + // 2018-03-30 FireFox has fixed this issue. + //Avoid FireFox's Bug + //If zTree Div CSS set 'overflow', so drag node outside of zTree, and event.target is error. + // if(eventMouseDown.preventDefault) { + // eventMouseDown.preventDefault(); + // } + return true; + } + }, + //method of tools for zTree + _tools = { + getAbs: function (obj) { + var oRect = obj.getBoundingClientRect(), + scrollTop = document.body.scrollTop + document.documentElement.scrollTop, + scrollLeft = document.body.scrollLeft + document.documentElement.scrollLeft; + return [oRect.left + scrollLeft, oRect.top + scrollTop]; + }, + inputFocus: function (inputObj) { + if (inputObj.get(0)) { + inputObj.focus(); + tools.setCursorPosition(inputObj.get(0), inputObj.val().length); + } + }, + inputSelect: function (inputObj) { + if (inputObj.get(0)) { + inputObj.focus(); + inputObj.select(); + } + }, + setCursorPosition: function (obj, pos) { + if (obj.setSelectionRange) { + obj.focus(); + obj.setSelectionRange(pos, pos); + } else if (obj.createTextRange) { + var range = obj.createTextRange(); + range.collapse(true); + range.moveEnd('character', pos); + range.moveStart('character', pos); + range.select(); + } + }, + showIfameMask: function (setting, showSign) { + var root = data.getRoot(setting); + //clear full mask + while (root.dragMaskList.length > 0) { + root.dragMaskList[0].remove(); + root.dragMaskList.shift(); + } + if (showSign) { + //show mask + var iframeList = $$("iframe", setting); + for (var i = 0, l = iframeList.length; i < l; i++) { + var obj = iframeList.get(i), + r = tools.getAbs(obj), + dragMask = $$("
                                    ", setting); + dragMask.appendTo($$("body", setting)); + root.dragMaskList.push(dragMask); + } + } + } + }, + //method of operate ztree dom + _view = { + addEditBtn: function (setting, node) { + if (node.editNameFlag || $$(node, consts.id.EDIT, setting).length > 0) { + return; + } + if (!tools.apply(setting.edit.showRenameBtn, [setting.treeId, node], setting.edit.showRenameBtn)) { + return; + } + var aObj = $$(node, consts.id.A, setting), + editStr = ""; + aObj.append(editStr); + + $$(node, consts.id.EDIT, setting).bind('click', + function () { + if (!tools.uCanDo(setting) || tools.apply(setting.callback.beforeEditName, [setting.treeId, node], true) == false) return false; + view.editNode(setting, node); + return false; + } + ).show(); + }, + addRemoveBtn: function (setting, node) { + if (node.editNameFlag || $$(node, consts.id.REMOVE, setting).length > 0) { + return; + } + if (!tools.apply(setting.edit.showRemoveBtn, [setting.treeId, node], setting.edit.showRemoveBtn)) { + return; + } + var aObj = $$(node, consts.id.A, setting), + removeStr = ""; + aObj.append(removeStr); + + $$(node, consts.id.REMOVE, setting).bind('click', + function () { + if (!tools.uCanDo(setting) || tools.apply(setting.callback.beforeRemove, [setting.treeId, node], true) == false) return false; + view.removeNode(setting, node); + setting.treeObj.trigger(consts.event.REMOVE, [setting.treeId, node]); + return false; + } + ).bind('mousedown', + function (eventMouseDown) { + return true; + } + ).show(); + }, + addHoverDom: function (setting, node) { + if (data.getRoots().showHoverDom) { + node.isHover = true; + if (setting.edit.enable) { + view.addEditBtn(setting, node); + view.addRemoveBtn(setting, node); + } + tools.apply(setting.view.addHoverDom, [setting.treeId, node]); + } + }, + cancelCurEditNode: function (setting, forceName, isCancel) { + var root = data.getRoot(setting), + node = root.curEditNode; + + if (node) { + var inputObj = root.curEditInput, + newName = forceName ? forceName : (isCancel ? data.nodeName(setting, node) : inputObj.val()); + if (tools.apply(setting.callback.beforeRename, [setting.treeId, node, newName, isCancel], true) === false) { + return false; + } + data.nodeName(setting, node, newName); + var aObj = $$(node, consts.id.A, setting); + aObj.removeClass(consts.node.CURSELECTED_EDIT); + inputObj.unbind(); + view.setNodeName(setting, node); + node.editNameFlag = false; + root.curEditNode = null; + root.curEditInput = null; + view.selectNode(setting, node, false); + setting.treeObj.trigger(consts.event.RENAME, [setting.treeId, node, isCancel]); + } + root.noSelection = true; + return true; + }, + editNode: function (setting, node) { + var root = data.getRoot(setting); + view.editNodeBlur = false; + if (data.isSelectedNode(setting, node) && root.curEditNode == node && node.editNameFlag) { + setTimeout(function () { + tools.inputFocus(root.curEditInput); + }, 0); + return; + } + node.editNameFlag = true; + view.removeTreeDom(setting, node); + view.cancelCurEditNode(setting); + view.selectNode(setting, node, false); + $$(node, consts.id.SPAN, setting).html(""); + var inputObj = $$(node, consts.id.INPUT, setting); + inputObj.attr("value", data.nodeName(setting, node)); + if (setting.edit.editNameSelectAll) { + tools.inputSelect(inputObj); + } else { + tools.inputFocus(inputObj); + } + + inputObj.bind('blur', function (event) { + if (!view.editNodeBlur) { + view.cancelCurEditNode(setting); + } + }).bind('keydown', function (event) { + if (event.keyCode == "13") { + view.editNodeBlur = true; + view.cancelCurEditNode(setting); + } else if (event.keyCode == "27") { + view.cancelCurEditNode(setting, null, true); + } + }).bind('click', function (event) { + return false; + }).bind('dblclick', function (event) { + return false; + }); + + $$(node, consts.id.A, setting).addClass(consts.node.CURSELECTED_EDIT); + root.curEditInput = inputObj; + root.noSelection = false; + root.curEditNode = node; + }, + moveNode: function (setting, targetNode, node, moveType, animateFlag, isSilent) { + var root = data.getRoot(setting); + if (targetNode == node) return; + if (setting.data.keep.leaf && targetNode && !data.nodeIsParent(setting, targetNode) && moveType == consts.move.TYPE_INNER) return; + var oldParentNode = (node.parentTId ? node.getParentNode() : root), + targetNodeIsRoot = (targetNode === null || targetNode == root); + if (targetNodeIsRoot && targetNode === null) targetNode = root; + if (targetNodeIsRoot) moveType = consts.move.TYPE_INNER; + var targetParentNode = (targetNode.parentTId ? targetNode.getParentNode() : root); + + if (moveType != consts.move.TYPE_PREV && moveType != consts.move.TYPE_NEXT) { + moveType = consts.move.TYPE_INNER; + } + + if (moveType == consts.move.TYPE_INNER) { + if (targetNodeIsRoot) { + //parentTId of root node is null + node.parentTId = null; + } else { + if (!data.nodeIsParent(setting, targetNode)) { + data.nodeIsParent(setting, targetNode, true); + targetNode.open = !!targetNode.open; + view.setNodeLineIcos(setting, targetNode); + } + node.parentTId = targetNode.tId; + } + } + + //move node Dom + var targetObj, target_ulObj; + if (targetNodeIsRoot) { + targetObj = setting.treeObj; + target_ulObj = targetObj; + } else { + if (!isSilent && moveType == consts.move.TYPE_INNER) { + view.expandCollapseNode(setting, targetNode, true, false); + } else if (!isSilent) { + view.expandCollapseNode(setting, targetNode.getParentNode(), true, false); + } + targetObj = $$(targetNode, setting); + target_ulObj = $$(targetNode, consts.id.UL, setting); + if (!!targetObj.get(0) && !target_ulObj.get(0)) { + var ulstr = []; + view.makeUlHtml(setting, targetNode, ulstr, ''); + targetObj.append(ulstr.join('')); + } + target_ulObj = $$(targetNode, consts.id.UL, setting); + } + var nodeDom = $$(node, setting); + if (!nodeDom.get(0)) { + nodeDom = view.appendNodes(setting, node.level, [node], null, -1, false, true).join(''); + } else if (!targetObj.get(0)) { + nodeDom.remove(); + } + if (target_ulObj.get(0) && moveType == consts.move.TYPE_INNER) { + target_ulObj.append(nodeDom); + } else if (targetObj.get(0) && moveType == consts.move.TYPE_PREV) { + targetObj.before(nodeDom); + } else if (targetObj.get(0) && moveType == consts.move.TYPE_NEXT) { + targetObj.after(nodeDom); + } + + //repair the data after move + var i, l, + tmpSrcIndex = -1, + tmpTargetIndex = 0, + oldNeighbor = null, + newNeighbor = null, + oldLevel = node.level; + var oldChildren = data.nodeChildren(setting, oldParentNode); + var targetParentChildren = data.nodeChildren(setting, targetParentNode); + var targetChildren = data.nodeChildren(setting, targetNode); + if (node.isFirstNode) { + tmpSrcIndex = 0; + if (oldChildren.length > 1) { + oldNeighbor = oldChildren[1]; + oldNeighbor.isFirstNode = true; + } + } else if (node.isLastNode) { + tmpSrcIndex = oldChildren.length - 1; + oldNeighbor = oldChildren[tmpSrcIndex - 1]; + oldNeighbor.isLastNode = true; + } else { + for (i = 0, l = oldChildren.length; i < l; i++) { + if (oldChildren[i].tId == node.tId) { + tmpSrcIndex = i; + break; + } + } + } + if (tmpSrcIndex >= 0) { + oldChildren.splice(tmpSrcIndex, 1); + } + if (moveType != consts.move.TYPE_INNER) { + for (i = 0, l = targetParentChildren.length; i < l; i++) { + if (targetParentChildren[i].tId == targetNode.tId) tmpTargetIndex = i; + } + } + if (moveType == consts.move.TYPE_INNER) { + if (!targetChildren) { + targetChildren = data.nodeChildren(setting, targetNode, []); + } + if (targetChildren.length > 0) { + newNeighbor = targetChildren[targetChildren.length - 1]; + newNeighbor.isLastNode = false; + } + targetChildren.splice(targetChildren.length, 0, node); + node.isLastNode = true; + node.isFirstNode = (targetChildren.length == 1); + } else if (targetNode.isFirstNode && moveType == consts.move.TYPE_PREV) { + targetParentChildren.splice(tmpTargetIndex, 0, node); + newNeighbor = targetNode; + newNeighbor.isFirstNode = false; + node.parentTId = targetNode.parentTId; + node.isFirstNode = true; + node.isLastNode = false; + + } else if (targetNode.isLastNode && moveType == consts.move.TYPE_NEXT) { + targetParentChildren.splice(tmpTargetIndex + 1, 0, node); + newNeighbor = targetNode; + newNeighbor.isLastNode = false; + node.parentTId = targetNode.parentTId; + node.isFirstNode = false; + node.isLastNode = true; + + } else { + if (moveType == consts.move.TYPE_PREV) { + targetParentChildren.splice(tmpTargetIndex, 0, node); + } else { + targetParentChildren.splice(tmpTargetIndex + 1, 0, node); + } + node.parentTId = targetNode.parentTId; + node.isFirstNode = false; + node.isLastNode = false; + } + data.fixPIdKeyValue(setting, node); + data.setSonNodeLevel(setting, node.getParentNode(), node); + + //repair node what been moved + view.setNodeLineIcos(setting, node); + view.repairNodeLevelClass(setting, node, oldLevel); + + //repair node's old parentNode dom + if (!setting.data.keep.parent && oldChildren.length < 1) { + //old parentNode has no child nodes + data.nodeIsParent(setting, oldParentNode, false); + oldParentNode.open = false; + var tmp_ulObj = $$(oldParentNode, consts.id.UL, setting), + tmp_switchObj = $$(oldParentNode, consts.id.SWITCH, setting), + tmp_icoObj = $$(oldParentNode, consts.id.ICON, setting); + view.replaceSwitchClass(oldParentNode, tmp_switchObj, consts.folder.DOCU); + view.replaceIcoClass(oldParentNode, tmp_icoObj, consts.folder.DOCU); + tmp_ulObj.css("display", "none"); + + } else if (oldNeighbor) { + //old neigbor node + view.setNodeLineIcos(setting, oldNeighbor); + } + + //new neigbor node + if (newNeighbor) { + view.setNodeLineIcos(setting, newNeighbor); + } + + //repair checkbox / radio + if (!!setting.check && setting.check.enable && view.repairChkClass) { + view.repairChkClass(setting, oldParentNode); + view.repairParentChkClassWithSelf(setting, oldParentNode); + if (oldParentNode != node.parent) + view.repairParentChkClassWithSelf(setting, node); + } + + //expand parents after move + if (!isSilent) { + view.expandCollapseParentNode(setting, node.getParentNode(), true, animateFlag); + } + }, + removeEditBtn: function (setting, node) { + $$(node, consts.id.EDIT, setting).unbind().remove(); + }, + removeRemoveBtn: function (setting, node) { + $$(node, consts.id.REMOVE, setting).unbind().remove(); + }, + removeTreeDom: function (setting, node) { + node.isHover = false; + view.removeEditBtn(setting, node); + view.removeRemoveBtn(setting, node); + tools.apply(setting.view.removeHoverDom, [setting.treeId, node]); + }, + repairNodeLevelClass: function (setting, node, oldLevel) { + if (oldLevel === node.level) return; + var liObj = $$(node, setting), + aObj = $$(node, consts.id.A, setting), + ulObj = $$(node, consts.id.UL, setting), + oldClass = consts.className.LEVEL + oldLevel, + newClass = consts.className.LEVEL + node.level; + liObj.removeClass(oldClass); + liObj.addClass(newClass); + aObj.removeClass(oldClass); + aObj.addClass(newClass); + ulObj.removeClass(oldClass); + ulObj.addClass(newClass); + }, + selectNodes: function (setting, nodes) { + for (var i = 0, l = nodes.length; i < l; i++) { + view.selectNode(setting, nodes[i], i > 0); + } + } + }, + + _z = { + tools: _tools, + view: _view, + event: _event, + data: _data + }; + $.extend(true, $.fn.zTree.consts, _consts); + $.extend(true, $.fn.zTree._z, _z); + + var zt = $.fn.zTree, + tools = zt._z.tools, + consts = zt.consts, + view = zt._z.view, + data = zt._z.data, + event = zt._z.event, + $$ = tools.$; + + data.exSetting(_setting); + data.addInitBind(_bindEvent); + data.addInitUnBind(_unbindEvent); + data.addInitCache(_initCache); + data.addInitNode(_initNode); + data.addInitProxy(_eventProxy); + data.addInitRoot(_initRoot); + data.addZTreeTools(_zTreeTools); + + var _cancelPreSelectedNode = view.cancelPreSelectedNode; + view.cancelPreSelectedNode = function (setting, node) { + var list = data.getRoot(setting).curSelectedList; + for (var i = 0, j = list.length; i < j; i++) { + if (!node || node === list[i]) { + view.removeTreeDom(setting, list[i]); + if (node) break; + } + } + if (_cancelPreSelectedNode) _cancelPreSelectedNode.apply(view, arguments); + } + + var _createNodes = view.createNodes; + view.createNodes = function (setting, level, nodes, parentNode, index) { + if (_createNodes) { + _createNodes.apply(view, arguments); + } + if (!nodes) return; + if (view.repairParentChkClassWithSelf) { + view.repairParentChkClassWithSelf(setting, parentNode); + } + } + + var _makeNodeUrl = view.makeNodeUrl; + view.makeNodeUrl = function (setting, node) { + return setting.edit.enable ? null : (_makeNodeUrl.apply(view, arguments)); + } + + var _removeNode = view.removeNode; + view.removeNode = function (setting, node) { + var root = data.getRoot(setting); + if (root.curEditNode === node) root.curEditNode = null; + if (_removeNode) { + _removeNode.apply(view, arguments); + } + } + + var _selectNode = view.selectNode; + view.selectNode = function (setting, node, addFlag) { + var root = data.getRoot(setting); + if (data.isSelectedNode(setting, node) && root.curEditNode == node && node.editNameFlag) { + return false; + } + if (_selectNode) _selectNode.apply(view, arguments); + view.addHoverDom(setting, node); + return true; + } + + var _uCanDo = tools.uCanDo; + tools.uCanDo = function (setting, e) { + var root = data.getRoot(setting); + if (e && (tools.eqs(e.type, "mouseover") || tools.eqs(e.type, "mouseout") || tools.eqs(e.type, "mousedown") || tools.eqs(e.type, "mouseup"))) { + return true; + } + if (root.curEditNode) { + view.editNodeBlur = false; + root.curEditInput.focus(); + } + return (!root.curEditNode) && (_uCanDo ? _uCanDo.apply(view, arguments) : true); + } +})(jQuery); \ No newline at end of file diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/js/jquery.ztree.exedit.min.js b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/js/jquery.ztree.exedit.min.js new file mode 100644 index 0000000..cd9b268 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/js/jquery.ztree.exedit.min.js @@ -0,0 +1,53 @@ +/* + * JQuery zTree exedit v3.5.40 + * http://treejs.cn/ + * + * Copyright (c) 2010 Hunter.z + * + * Licensed same as jquery - MIT License + * http://www.opensource.org/licenses/mit-license.php + * + * email: hunter.z@263.net + * Date: 2019-01-18 + */ +(function(B){var I={event:{DRAG:"ztree_drag",DROP:"ztree_drop",RENAME:"ztree_rename",DRAGMOVE:"ztree_dragmove"},id:{EDIT:"_edit",INPUT:"_input",REMOVE:"_remove"},move:{TYPE_INNER:"inner",TYPE_PREV:"prev",TYPE_NEXT:"next"},node:{CURSELECTED_EDIT:"curSelectedNode_Edit",TMPTARGET_TREE:"tmpTargetzTree",TMPTARGET_NODE:"tmpTargetNode"}},v={onHoverOverNode:function(a,b){var c=i.getSetting(a.data.treeId),d=i.getRoot(c);if(d.curHoverNode!=b)v.onHoverOutNode(a);d.curHoverNode=b;e.addHoverDom(c,b)},onHoverOutNode:function(a){var a= +i.getSetting(a.data.treeId),b=i.getRoot(a);if(b.curHoverNode&&!i.isSelectedNode(a,b.curHoverNode))e.removeTreeDom(a,b.curHoverNode),b.curHoverNode=null},onMousedownNode:function(a,b){function c(a){if(m.dragFlag==0&&Math.abs(N-a.clientX)1){var o=n[0].parentTId?i.nodeChildren(f,n[0].getParentNode()):i.getNodes(f);g=[];for(b=0,c=o.length;b-1&&p+1!==b&&(j=!1),g.push(o[b]),p=b),n.length===g.length){n=g;break}}j&&(H=n[0].getPreNode(),Q=n[n.length-1].getNextNode());C=q("
                                      ", +f);for(b=0,c=n.length;b0),e.removeTreeDom(f,g),b>f.edit.drag.maxShowNodeNum-1||(j=q("
                                    • ",f),j.append(q(g,d.id.A,f).clone()),j.css("padding","0"),j.children("#"+g.tId+d.id.A).removeClass(d.node.CURSELECTED),C.append(j),b==f.edit.drag.maxShowNodeNum-1&&(j=q("
                                    • ...
                                    • ",f),C.append(j)));C.attr("id",n[0].tId+d.id.UL+"_tmp");C.addClass(f.treeObj.attr("class"));C.appendTo(L);u=q("", +f);u.attr("id","zTreeMove_arrow_tmp");u.appendTo(L);f.treeObj.trigger(d.event.DRAG,[a,f.treeId,n])}if(m.dragFlag==1){t&&u.attr("id")==a.target.id&&w&&a.clientX+G.scrollLeft()+2>B("#"+w+d.id.A,t).offset().left?(g=B("#"+w+d.id.A,t),a.target=g.length>0?g.get(0):a.target):t&&(t.removeClass(d.node.TMPTARGET_TREE),w&&B("#"+w+d.id.A,t).removeClass(d.node.TMPTARGET_NODE+"_"+d.move.TYPE_PREV).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_NEXT).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_INNER)); +w=t=null;J=!1;h=f;g=i.getSettings();for(var z in g)if(g[z].treeId&&g[z].edit.enable&&g[z].treeId!=f.treeId&&(a.target.id==g[z].treeId||B(a.target).parents("#"+g[z].treeId).length>0))J=!0,h=g[z];z=G.scrollTop();j=G.scrollLeft();p=h.treeObj.offset();b=h.treeObj.get(0).scrollHeight;g=h.treeObj.get(0).scrollWidth;c=a.clientY+z-p.top;var E=h.treeObj.height()+p.top-a.clientY-z,r=a.clientX+j-p.left,s=h.treeObj.width()+p.left-a.clientX-j,p=cf.edit.drag.borderMin,o=Ef.edit.drag.borderMin,F=rf.edit.drag.borderMin,v=sf.edit.drag.borderMin,E=c>f.edit.drag.borderMin&&E>f.edit.drag.borderMin&&r>f.edit.drag.borderMin&&s>f.edit.drag.borderMin,r=p&&h.treeObj.scrollTop()<=0,s=o&&h.treeObj.scrollTop()+h.treeObj.height()+10>=b,M=F&&h.treeObj.scrollLeft()<=0,P=v&&h.treeObj.scrollLeft()+h.treeObj.width()+10>=g;if(a.target&&k.isChildOrSelf(a.target,h.treeId)){for(var D=a.target;D&&D.tagName&&!k.eqs(D.tagName,"li")&&D.id!= +h.treeId;)D=D.parentNode;var R=!0;for(b=0,c=n.length;b0){R=!1;break}if(R&&a.target&&k.isChildOrSelf(a.target,D.id+d.id.A))t=B(D),w=D.id}g=n[0];if(E&&k.isChildOrSelf(a.target,h.treeId)){if(!t&&(a.target.id==h.treeId||r||s||M||P)&&(J||!J&&g.parentTId))t=h.treeObj;p?h.treeObj.scrollTop(h.treeObj.scrollTop()-10):o&&h.treeObj.scrollTop(h.treeObj.scrollTop()+10);F?h.treeObj.scrollLeft(h.treeObj.scrollLeft()-10):v&&h.treeObj.scrollLeft(h.treeObj.scrollLeft()+ +10);t&&t!=h.treeObj&&t.offset().left=-0.2)&&g?(j=1-u.width(),b=E-u.height()/2,x=d.move.TYPE_PREV):(M==0||z>=M&&z<=1.2)&&c?(j=1-u.width(),b=v==null||i.nodeIsParent(f,A)&&A.open?E+F.height()-u.height()/2:v.offset().top-u.height()/2,x=d.move.TYPE_NEXT):p?(j=5-u.width(),b=E,x=d.move.TYPE_INNER):o(),t){u.css({display:"block",top:b+"px",left:r+j+"px"});F.addClass(d.node.TMPTARGET_NODE+"_"+x);if(S!=w||T!=x)K=(new Date).getTime();if(A&&i.nodeIsParent(f, +A)&&x==d.move.TYPE_INNER&&(z=!0,window.zTreeMoveTimer&&window.zTreeMoveTargetNodeTId!==A.tId?(clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId=null):window.zTreeMoveTimer&&window.zTreeMoveTargetNodeTId===A.tId&&(z=!1),z))window.zTreeMoveTimer=setTimeout(function(){x==d.move.TYPE_INNER&&A&&i.nodeIsParent(f,A)&&!A.open&&(new Date).getTime()-K>h.edit.drag.autoOpenTime&&k.apply(h.callback.beforeDragOpen,[h.treeId,A],!0)&&(e.switchNode(h,A),h.edit.drag.autoExpandTrigger&&h.treeObj.trigger(d.event.EXPAND, +[h.treeId,A]))},h.edit.drag.autoOpenTime+50),window.zTreeMoveTargetNodeTId=A.tId}}else if(x=d.move.TYPE_INNER,t&&k.apply(h.edit.drag.inner,[h.treeId,n,null],!!h.edit.drag.inner)?t.addClass(d.node.TMPTARGET_TREE):t=null,u.css({display:"none"}),window.zTreeMoveTimer)clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId=null;S=w;T=x;f.treeObj.trigger(d.event.DRAGMOVE,[a,f.treeId,n])}return!1}function l(a){if(window.zTreeMoveTimer)clearTimeout(window.zTreeMoveTimer),window.zTreeMoveTargetNodeTId= +null;T=S=null;G.unbind("mousemove",c);G.unbind("mouseup",l);G.unbind("selectstart",g);L.css("cursor","");t&&(t.removeClass(d.node.TMPTARGET_TREE),w&&B("#"+w+d.id.A,t).removeClass(d.node.TMPTARGET_NODE+"_"+d.move.TYPE_PREV).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_NEXT).removeClass(d.node.TMPTARGET_NODE+"_"+I.move.TYPE_INNER));k.showIfameMask(f,!1);y.showHoverDom=!0;if(m.dragFlag!=0){m.dragFlag=0;var b,j,o;for(b=0,j=n.length;b0;)c.dragMaskList[0].remove(),c.dragMaskList.shift();if(b)for(var d=q("iframe",a),g=0,e=d.length;g
                                      ",a);j.appendTo(q("body",a));c.dragMaskList.push(j)}}},view:{addEditBtn:function(a,b){if(!(b.editNameFlag|| +q(b,d.id.EDIT,a).length>0)&&k.apply(a.edit.showRenameBtn,[a.treeId,b],a.edit.showRenameBtn)){var c=q(b,d.id.A,a),l="";c.append(l);q(b,d.id.EDIT,a).bind("click",function(){if(!k.uCanDo(a)||k.apply(a.callback.beforeEditName,[a.treeId,b],!0)==!1)return!1;e.editNode(a,b);return!1}).show()}},addRemoveBtn:function(a, +b){if(!(b.editNameFlag||q(b,d.id.REMOVE,a).length>0)&&k.apply(a.edit.showRemoveBtn,[a.treeId,b],a.edit.showRemoveBtn)){var c=q(b,d.id.A,a),l="";c.append(l);q(b,d.id.REMOVE,a).bind("click",function(){if(!k.uCanDo(a)||k.apply(a.callback.beforeRemove,[a.treeId,b],!0)==!1)return!1;e.removeNode(a,b);a.treeObj.trigger(d.event.REMOVE, +[a.treeId,b]);return!1}).bind("mousedown",function(){return!0}).show()}},addHoverDom:function(a,b){if(i.getRoots().showHoverDom)b.isHover=!0,a.edit.enable&&(e.addEditBtn(a,b),e.addRemoveBtn(a,b)),k.apply(a.view.addHoverDom,[a.treeId,b])},cancelCurEditNode:function(a,b,c){var l=i.getRoot(a),g=l.curEditNode;if(g){var o=l.curEditInput,b=b?b:c?i.nodeName(a,g):o.val();if(k.apply(a.callback.beforeRename,[a.treeId,g,b,c],!0)===!1)return!1;i.nodeName(a,g,b);q(g,d.id.A,a).removeClass(d.node.CURSELECTED_EDIT); +o.unbind();e.setNodeName(a,g);g.editNameFlag=!1;l.curEditNode=null;l.curEditInput=null;e.selectNode(a,g,!1);a.treeObj.trigger(d.event.RENAME,[a.treeId,g,c])}return l.noSelection=!0},editNode:function(a,b){var c=i.getRoot(a);e.editNodeBlur=!1;if(i.isSelectedNode(a,b)&&c.curEditNode==b&&b.editNameFlag)setTimeout(function(){k.inputFocus(c.curEditInput)},0);else{b.editNameFlag=!0;e.removeTreeDom(a,b);e.cancelCurEditNode(a);e.selectNode(a,b,!1);q(b,d.id.SPAN,a).html("");var l=q(b,d.id.INPUT,a);l.attr("value",i.nodeName(a,b));a.edit.editNameSelectAll?k.inputSelect(l):k.inputFocus(l);l.bind("blur",function(){e.editNodeBlur||e.cancelCurEditNode(a)}).bind("keydown",function(b){b.keyCode=="13"?(e.editNodeBlur=!0,e.cancelCurEditNode(a)):b.keyCode=="27"&&e.cancelCurEditNode(a,null,!0)}).bind("click",function(){return!1}).bind("dblclick",function(){return!1});q(b,d.id.A,a).addClass(d.node.CURSELECTED_EDIT);c.curEditInput=l; +c.noSelection=!1;c.curEditNode=b}},moveNode:function(a,b,c,l,g,k){var j=i.getRoot(a);if(b!=c&&(!a.data.keep.leaf||!b||i.nodeIsParent(a,b)||l!=d.move.TYPE_INNER)){var f=c.parentTId?c.getParentNode():j,m=b===null||b==j;m&&b===null&&(b=j);if(m)l=d.move.TYPE_INNER;j=b.parentTId?b.getParentNode():j;if(l!=d.move.TYPE_PREV&&l!=d.move.TYPE_NEXT)l=d.move.TYPE_INNER;if(l==d.move.TYPE_INNER)if(m)c.parentTId=null;else{if(!i.nodeIsParent(a,b))i.nodeIsParent(a,b,!0),b.open=!!b.open,e.setNodeLineIcos(a,b);c.parentTId= +b.tId}var y;m?y=m=a.treeObj:(!k&&l==d.move.TYPE_INNER?e.expandCollapseNode(a,b,!0,!1):k||e.expandCollapseNode(a,b.getParentNode(),!0,!1),m=q(b,a),y=q(b,d.id.UL,a),m.get(0)&&!y.get(0)&&(y=[],e.makeUlHtml(a,b,y,""),m.append(y.join(""))),y=q(b,d.id.UL,a));var r=q(c,a);r.get(0)?m.get(0)||r.remove():r=e.appendNodes(a,c.level,[c],null,-1,!1,!0).join("");y.get(0)&&l==d.move.TYPE_INNER?y.append(r):m.get(0)&&l==d.move.TYPE_PREV?m.before(r):m.get(0)&&l==d.move.TYPE_NEXT&&m.after(r);var s;y=-1;var r=0,n=null, +m=null,B=c.level,v=i.nodeChildren(a,f),C=i.nodeChildren(a,j),u=i.nodeChildren(a,b);if(c.isFirstNode){if(y=0,v.length>1)n=v[1],n.isFirstNode=!0}else if(c.isLastNode)y=v.length-1,n=v[y-1],n.isLastNode=!0;else for(j=0,s=v.length;j=0&&v.splice(y,1);if(l!=d.move.TYPE_INNER)for(j=0,s=C.length;j0)m=u[u.length-1],m.isLastNode=!1;u.splice(u.length,0,c);c.isLastNode=!0;c.isFirstNode= +u.length==1}else b.isFirstNode&&l==d.move.TYPE_PREV?(C.splice(r,0,c),m=b,m.isFirstNode=!1,c.parentTId=b.parentTId,c.isFirstNode=!0,c.isLastNode=!1):b.isLastNode&&l==d.move.TYPE_NEXT?(C.splice(r+1,0,c),m=b,m.isLastNode=!1,c.parentTId=b.parentTId,c.isFirstNode=!1,c.isLastNode=!0):(l==d.move.TYPE_PREV?C.splice(r,0,c):C.splice(r+1,0,c),c.parentTId=b.parentTId,c.isFirstNode=!1,c.isLastNode=!1);i.fixPIdKeyValue(a,c);i.setSonNodeLevel(a,c.getParentNode(),c);e.setNodeLineIcos(a,c);e.repairNodeLevelClass(a, +c,B);!a.data.keep.parent&&v.length<1?(i.nodeIsParent(a,f,!1),f.open=!1,b=q(f,d.id.UL,a),l=q(f,d.id.SWITCH,a),j=q(f,d.id.ICON,a),e.replaceSwitchClass(f,l,d.folder.DOCU),e.replaceIcoClass(f,j,d.folder.DOCU),b.css("display","none")):n&&e.setNodeLineIcos(a,n);m&&e.setNodeLineIcos(a,m);a.check&&a.check.enable&&e.repairChkClass&&(e.repairChkClass(a,f),e.repairParentChkClassWithSelf(a,f),f!=c.parent&&e.repairParentChkClassWithSelf(a,c));k||e.expandCollapseParentNode(a,c.getParentNode(),!0,g)}},removeEditBtn:function(a, +b){q(b,d.id.EDIT,a).unbind().remove()},removeRemoveBtn:function(a,b){q(b,d.id.REMOVE,a).unbind().remove()},removeTreeDom:function(a,b){b.isHover=!1;e.removeEditBtn(a,b);e.removeRemoveBtn(a,b);k.apply(a.view.removeHoverDom,[a.treeId,b])},repairNodeLevelClass:function(a,b,c){if(c!==b.level){var e=q(b,a),g=q(b,d.id.A,a),a=q(b,d.id.UL,a),c=d.className.LEVEL+c,b=d.className.LEVEL+b.level;e.removeClass(c);e.addClass(b);g.removeClass(c);g.addClass(b);a.removeClass(c);a.addClass(b)}},selectNodes:function(a, +b){for(var c=0,d=b.length;c0)}},event:{},data:{setSonNodeLevel:function(a,b,c){if(c){var d=i.nodeChildren(a,c);c.level=b?b.level+1:0;if(d)for(var b=0,g=d.length;b0)switch(o=i.getNodeCache(c,g),j){case "mousedownNode":f=v.onMousedownNode;break;case "hoverOverNode":f=v.onHoverOverNode; +break;case "hoverOutNode":f=v.onHoverOutNode}return{stop:!1,node:o,nodeEventType:j,nodeEventCallback:f,treeEventType:"",treeEventCallback:null}});i.addInitRoot(function(a){var a=i.getRoot(a),b=i.getRoots();a.curEditNode=null;a.curEditInput=null;a.curHoverNode=null;a.dragFlag=0;a.dragNodeShowBefore=[];a.dragMaskList=[];b.showHoverDom=!0});i.addZTreeTools(function(a,b){b.cancelEditName=function(a){i.getRoot(this.setting).curEditNode&&e.cancelCurEditNode(this.setting,a?a:null,!0)};b.copyNode=function(b, +l,g,o){if(!l)return null;var j=i.nodeIsParent(a,b);if(b&&!j&&this.setting.data.keep.leaf&&g===d.move.TYPE_INNER)return null;var f=this,m=k.clone(l);if(!b)b=null,g=d.move.TYPE_INNER;g==d.move.TYPE_INNER?(l=function(){e.addNodes(f.setting,b,-1,[m],o)},k.canAsync(this.setting,b)?e.asyncNode(this.setting,b,o,l):l()):(e.addNodes(this.setting,b.parentNode,-1,[m],o),e.moveNode(this.setting,b,m,g,!1,o));return m};b.editName=function(a){a&&a.tId&&a===i.getNodeCache(this.setting,a.tId)&&(a.parentTId&&e.expandCollapseParentNode(this.setting, +a.getParentNode(),!0),e.editNode(this.setting,a))};b.moveNode=function(b,l,g,o){function j(){e.moveNode(m.setting,b,l,g,!1,o)}if(!l)return l;var f=i.nodeIsParent(a,b);if(b&&!f&&this.setting.data.keep.leaf&&g===d.move.TYPE_INNER)return null;else if(b&&(l.parentTId==b.tId&&g==d.move.TYPE_INNER||q(l,this.setting).find("#"+b.tId).length>0))return null;else b||(b=null);var m=this;k.canAsync(this.setting,b)&&g===d.move.TYPE_INNER?e.asyncNode(this.setting,b,o,j):j();return l};b.setEditable=function(a){this.setting.edit.enable= +a;return this.refresh()}});var N=e.cancelPreSelectedNode;e.cancelPreSelectedNode=function(a,b){for(var c=i.getRoot(a).curSelectedList,d=0,g=c.length;d"); + }, + showNode: function (setting, node, options) { + data.isHidden(setting, node, false); + data.initShowForExCheck(setting, node); + $$(node, setting).show(); + }, + showNodes: function (setting, nodes, options) { + if (!nodes || nodes.length == 0) { + return; + } + var pList = {}, i, j; + for (i = 0, j = nodes.length; i < j; i++) { + var n = nodes[i]; + if (!pList[n.parentTId]) { + var pn = n.getParentNode(); + pList[n.parentTId] = (pn === null) ? data.getRoot(setting) : n.getParentNode(); + } + view.showNode(setting, n, options); + } + for (var tId in pList) { + var children = data.nodeChildren(setting, pList[tId]); + view.setFirstNodeForShow(setting, children); + view.setLastNodeForShow(setting, children); + } + }, + hideNode: function (setting, node, options) { + data.isHidden(setting, node, true); + node.isFirstNode = false; + node.isLastNode = false; + data.initHideForExCheck(setting, node); + view.cancelPreSelectedNode(setting, node); + $$(node, setting).hide(); + }, + hideNodes: function (setting, nodes, options) { + if (!nodes || nodes.length == 0) { + return; + } + var pList = {}, i, j; + for (i = 0, j = nodes.length; i < j; i++) { + var n = nodes[i]; + if ((n.isFirstNode || n.isLastNode) && !pList[n.parentTId]) { + var pn = n.getParentNode(); + pList[n.parentTId] = (pn === null) ? data.getRoot(setting) : n.getParentNode(); + } + view.hideNode(setting, n, options); + } + for (var tId in pList) { + var children = data.nodeChildren(setting, pList[tId]); + view.setFirstNodeForHide(setting, children); + view.setLastNodeForHide(setting, children); + } + }, + setFirstNode: function (setting, parentNode) { + var children = data.nodeChildren(setting, parentNode); + var isHidden = data.isHidden(setting, children[0], false); + if (children.length > 0 && !isHidden) { + children[0].isFirstNode = true; + } else if (children.length > 0) { + view.setFirstNodeForHide(setting, children); + } + }, + setLastNode: function (setting, parentNode) { + var children = data.nodeChildren(setting, parentNode); + var isHidden = data.isHidden(setting, children[0]); + if (children.length > 0 && !isHidden) { + children[children.length - 1].isLastNode = true; + } else if (children.length > 0) { + view.setLastNodeForHide(setting, children); + } + }, + setFirstNodeForHide: function (setting, nodes) { + var n, i, j; + for (i = 0, j = nodes.length; i < j; i++) { + n = nodes[i]; + if (n.isFirstNode) { + break; + } + var isHidden = data.isHidden(setting, n); + if (!isHidden && !n.isFirstNode) { + n.isFirstNode = true; + view.setNodeLineIcos(setting, n); + break; + } else { + n = null; + } + } + return n; + }, + setFirstNodeForShow: function (setting, nodes) { + var n, i, j, first, old; + for (i = 0, j = nodes.length; i < j; i++) { + n = nodes[i]; + var isHidden = data.isHidden(setting, n); + if (!first && !isHidden && n.isFirstNode) { + first = n; + break; + } else if (!first && !isHidden && !n.isFirstNode) { + n.isFirstNode = true; + first = n; + view.setNodeLineIcos(setting, n); + } else if (first && n.isFirstNode) { + n.isFirstNode = false; + old = n; + view.setNodeLineIcos(setting, n); + break; + } else { + n = null; + } + } + return {"new": first, "old": old}; + }, + setLastNodeForHide: function (setting, nodes) { + var n, i; + for (i = nodes.length - 1; i >= 0; i--) { + n = nodes[i]; + if (n.isLastNode) { + break; + } + var isHidden = data.isHidden(setting, n); + if (!isHidden && !n.isLastNode) { + n.isLastNode = true; + view.setNodeLineIcos(setting, n); + break; + } else { + n = null; + } + } + return n; + }, + setLastNodeForShow: function (setting, nodes) { + var n, i, j, last, old; + for (i = nodes.length - 1; i >= 0; i--) { + n = nodes[i]; + var isHidden = data.isHidden(setting, n); + if (!last && !isHidden && n.isLastNode) { + last = n; + break; + } else if (!last && !isHidden && !n.isLastNode) { + n.isLastNode = true; + last = n; + view.setNodeLineIcos(setting, n); + } else if (last && n.isLastNode) { + n.isLastNode = false; + old = n; + view.setNodeLineIcos(setting, n); + break; + } else { + n = null; + } + } + return {"new": last, "old": old}; + } + }, + + _z = { + view: _view, + data: _data + }; + $.extend(true, $.fn.zTree._z, _z); + + var zt = $.fn.zTree, + tools = zt._z.tools, + consts = zt.consts, + view = zt._z.view, + data = zt._z.data, + event = zt._z.event, + $$ = tools.$; + + data.isHidden = function (setting, node, newIsHidden) { + if (!node) { + return false; + } + var key = setting.data.key.isHidden; + if (typeof newIsHidden !== 'undefined') { + if (typeof newIsHidden === "string") { + newIsHidden = tools.eqs(newIsHidden, "true"); + } + newIsHidden = !!newIsHidden; + node[key] = newIsHidden; + } else if (typeof node[key] == "string"){ + node[key] = tools.eqs(node[key], "true"); + } else { + node[key] = !!node[key]; + } + return node[key]; + }; + + data.exSetting(_setting); + data.addInitNode(_initNode); + data.addBeforeA(_beforeA); + data.addZTreeTools(_zTreeTools); + +// Override method in core + var _dInitNode = data.initNode; + data.initNode = function (setting, level, node, parentNode, isFirstNode, isLastNode, openFlag) { + var tmpPNode = (parentNode) ? parentNode : data.getRoot(setting), + children = tmpPNode[setting.data.key.children]; + data.tmpHideFirstNode = view.setFirstNodeForHide(setting, children); + data.tmpHideLastNode = view.setLastNodeForHide(setting, children); + if (openFlag) { + view.setNodeLineIcos(setting, data.tmpHideFirstNode); + view.setNodeLineIcos(setting, data.tmpHideLastNode); + } + isFirstNode = (data.tmpHideFirstNode === node); + isLastNode = (data.tmpHideLastNode === node); + if (_dInitNode) _dInitNode.apply(data, arguments); + if (openFlag && isLastNode) { + view.clearOldLastNode(setting, node, openFlag); + } + }; + + var _makeChkFlag = data.makeChkFlag; + if (!!_makeChkFlag) { + data.makeChkFlag = function (setting, node) { + if (!!node && !!data.isHidden(setting, node)) { + return; + } + _makeChkFlag.apply(data, arguments); + } + } + + var _getTreeCheckedNodes = data.getTreeCheckedNodes; + if (!!_getTreeCheckedNodes) { + data.getTreeCheckedNodes = function (setting, nodes, checked, results) { + if (!!nodes && nodes.length > 0) { + var p = nodes[0].getParentNode(); + if (!!p && !!data.isHidden(setting, p)) { + return []; + } + } + return _getTreeCheckedNodes.apply(data, arguments); + } + } + + var _getTreeChangeCheckedNodes = data.getTreeChangeCheckedNodes; + if (!!_getTreeChangeCheckedNodes) { + data.getTreeChangeCheckedNodes = function (setting, nodes, results) { + if (!!nodes && nodes.length > 0) { + var p = nodes[0].getParentNode(); + if (!!p && !!data.isHidden(setting, p)) { + return []; + } + } + return _getTreeChangeCheckedNodes.apply(data, arguments); + } + } + + var _expandCollapseSonNode = view.expandCollapseSonNode; + if (!!_expandCollapseSonNode) { + view.expandCollapseSonNode = function (setting, node, expandFlag, animateFlag, callback) { + if (!!node && !!data.isHidden(setting, node)) { + return; + } + _expandCollapseSonNode.apply(view, arguments); + } + } + + var _setSonNodeCheckBox = view.setSonNodeCheckBox; + if (!!_setSonNodeCheckBox) { + view.setSonNodeCheckBox = function (setting, node, value, srcNode) { + if (!!node && !!data.isHidden(setting, node)) { + return; + } + _setSonNodeCheckBox.apply(view, arguments); + } + } + + var _repairParentChkClassWithSelf = view.repairParentChkClassWithSelf; + if (!!_repairParentChkClassWithSelf) { + view.repairParentChkClassWithSelf = function (setting, node) { + if (!!node && !!data.isHidden(setting, node)) { + return; + } + _repairParentChkClassWithSelf.apply(view, arguments); + } + } +})(jQuery); \ No newline at end of file diff --git a/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/js/jquery.ztree.exhide.min.js b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/js/jquery.ztree.exhide.min.js new file mode 100644 index 0000000..85125ef --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/static/assets/magicalcoder/v103/ztree3/js/jquery.ztree.exhide.min.js @@ -0,0 +1,23 @@ +/* + * JQuery zTree exHideNodes v3.5.40 + * http://treejs.cn/ + * + * Copyright (c) 2010 Hunter.z + * + * Licensed same as jquery - MIT License + * http://www.opensource.org/licenses/mit-license.php + * + * email: hunter.z@263.net + * Date: 2019-01-18 + */ +(function(j){j.extend(!0,j.fn.zTree._z,{view:{clearOldFirstNode:function(c,a){for(var b=a.getNextNode();b;){if(b.isFirstNode){b.isFirstNode=!1;e.setNodeLineIcos(c,b);break}if(b.isLastNode)break;b=b.getNextNode()}},clearOldLastNode:function(c,a,b){for(a=a.getPreNode();a;){if(a.isLastNode){a.isLastNode=!1;b&&e.setNodeLineIcos(c,a);break}if(a.isFirstNode)break;a=a.getPreNode()}},makeDOMNodeMainBefore:function(c,a,b){a=d.isHidden(a,b);c.push("
                                    • ")},showNode:function(c,a){d.isHidden(c,a,!1);d.initShowForExCheck(c,a);k(a,c).show()},showNodes:function(c,a,b){if(a&&a.length!=0){var f={},g,i;for(g=0,i=a.length;g0&&!f?b[0].isFirstNode=!0:b.length>0&&e.setFirstNodeForHide(c,b)},setLastNode:function(c,a){var b=d.nodeChildren(c,a),f=d.isHidden(c,b[0]);b.length>0&&!f?b[b.length-1].isLastNode=!0:b.length>0&&e.setLastNodeForHide(c,b)},setFirstNodeForHide:function(c,a){var b,f,g;for(f=0,g=a.length;f=0;f--){b=a[f];if(b.isLastNode)break;if(!d.isHidden(c,b)&&!b.isLastNode){b.isLastNode=!0;e.setNodeLineIcos(c,b);break}else b=null}return b},setLastNodeForShow:function(c, +a){var b,f,g,i;for(f=a.length-1;f>=0;f--){b=a[f];var h=d.isHidden(c,b);if(!g&&!h&&b.isLastNode){g=b;break}else if(!g&&!h&&!b.isLastNode)b.isLastNode=!0,g=b,e.setNodeLineIcos(c,b);else if(g&&b.isLastNode){b.isLastNode=!1;i=b;e.setNodeLineIcos(c,b);break}}return{"new":g,old:i}}},data:{initHideForExCheck:function(c,a){if(d.isHidden(c,a)&&c.check&&c.check.enable){if(typeof a._nocheck=="undefined")a._nocheck=!!a.nocheck,a.nocheck=!0;a.check_Child_State=-1;e.repairParentChkClassWithSelf&&e.repairParentChkClassWithSelf(c, +a)}},initShowForExCheck:function(c,a){if(!d.isHidden(c,a)&&c.check&&c.check.enable){if(typeof a._nocheck!="undefined")a.nocheck=a._nocheck,delete a._nocheck;if(e.setChkClass){var b=k(a,m.id.CHECK,c);e.setChkClass(c,b,a)}e.repairParentChkClassWithSelf&&e.repairParentChkClassWithSelf(c,a)}}}});var j=j.fn.zTree,l=j._z.tools,m=j.consts,e=j._z.view,d=j._z.data,k=l.$;d.isHidden=function(c,a,b){if(!a)return!1;c=c.data.key.isHidden;typeof b!=="undefined"?(typeof b==="string"&&(b=l.eqs(b,"true")),a[c]=!!b): +a[c]=typeof a[c]=="string"?l.eqs(a[c],"true"):!!a[c];return a[c]};d.exSetting({data:{key:{isHidden:"isHidden"}}});d.addInitNode(function(c,a,b){a=d.isHidden(c,b);d.isHidden(c,b,a);d.initHideForExCheck(c,b)});d.addBeforeA(function(){});d.addZTreeTools(function(c,a){a.showNodes=function(a,b){e.showNodes(c,a,b)};a.showNode=function(a,b){a&&e.showNodes(c,[a],b)};a.hideNodes=function(a,b){e.hideNodes(c,a,b)};a.hideNode=function(a,b){a&&e.hideNodes(c,[a],b)};var b=a.checkNode;if(b)a.checkNode=function(f, +e,i,h){(!f||!d.isHidden(c,f))&&b.apply(a,arguments)}});var n=d.initNode;d.initNode=function(c,a,b,f,g,i,h){var j=(f?f:d.getRoot(c))[c.data.key.children];d.tmpHideFirstNode=e.setFirstNodeForHide(c,j);d.tmpHideLastNode=e.setLastNodeForHide(c,j);h&&(e.setNodeLineIcos(c,d.tmpHideFirstNode),e.setNodeLineIcos(c,d.tmpHideLastNode));g=d.tmpHideFirstNode===b;i=d.tmpHideLastNode===b;n&&n.apply(d,arguments);h&&i&&e.clearOldLastNode(c,b,h)};var o=d.makeChkFlag;if(o)d.makeChkFlag=function(c,a){(!a||!d.isHidden(c, +a))&&o.apply(d,arguments)};var p=d.getTreeCheckedNodes;if(p)d.getTreeCheckedNodes=function(c,a,b,f){if(a&&a.length>0){var e=a[0].getParentNode();if(e&&d.isHidden(c,e))return[]}return p.apply(d,arguments)};var q=d.getTreeChangeCheckedNodes;if(q)d.getTreeChangeCheckedNodes=function(c,a,b){if(a&&a.length>0){var e=a[0].getParentNode();if(e&&d.isHidden(c,e))return[]}return q.apply(d,arguments)};var r=e.expandCollapseSonNode;if(r)e.expandCollapseSonNode=function(c,a,b,f,g){(!a||!d.isHidden(c,a))&&r.apply(e, +arguments)};var s=e.setSonNodeCheckBox;if(s)e.setSonNodeCheckBox=function(c,a,b,f){(!a||!d.isHidden(c,a))&&s.apply(e,arguments)};var t=e.repairParentChkClassWithSelf;if(t)e.repairParentChkClassWithSelf=function(c,a){(!a||!d.isHidden(c,a))&&t.apply(e,arguments)}})(jQuery); diff --git a/us_passManage/us-admin/src/main/resources/static/favicon.ico b/us_passManage/us-admin/src/main/resources/static/favicon.ico new file mode 100644 index 0000000..f0c40c8 Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/static/favicon.ico differ diff --git a/us_passManage/us-admin/src/main/resources/templates/404.html b/us_passManage/us-admin/src/main/resources/templates/404.html new file mode 100644 index 0000000..200d191 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/templates/404.html @@ -0,0 +1,28 @@ + + + + + 404 + + + + + + + + + + +
                                      +
                                      + + +
                                      +
                                      + +

                                      我勒个去,页面被外星人挟持了!

                                      +
                                      +
                                      + + + diff --git a/us_passManage/us-admin/src/main/resources/templates/favicon.ico b/us_passManage/us-admin/src/main/resources/templates/favicon.ico new file mode 100644 index 0000000..bb801aa Binary files /dev/null and b/us_passManage/us-admin/src/main/resources/templates/favicon.ico differ diff --git a/us_passManage/us-admin/src/main/resources/templates/index.html b/us_passManage/us-admin/src/main/resources/templates/index.html new file mode 100644 index 0000000..be32f5f --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/templates/index.html @@ -0,0 +1,35 @@ + + + + + +
                                      + +
                                      + +
                                      + +
                                      + + + +
                                      + + +
                                      +
                                      +
                                      + + + diff --git a/us_passManage/us-admin/src/main/resources/templates/login.html b/us_passManage/us-admin/src/main/resources/templates/login.html new file mode 100644 index 0000000..b47f5f1 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/templates/login.html @@ -0,0 +1,34 @@ + + + + +
                                      + +
                                      + + +
                                      +
                                      + + +
                                      + +
                                      + + + +
                                      +
                                      + +
                                      +
                                      + + + +
                                      +
                                      + + + + + diff --git a/us_passManage/us-admin/src/main/resources/templates/magicalcoder/README.md b/us_passManage/us-admin/src/main/resources/templates/magicalcoder/README.md new file mode 100644 index 0000000..12bd1e1 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/templates/magicalcoder/README.md @@ -0,0 +1 @@ +使用v0xx来区分版本 避免因为升级导致以前生成的代码无法正常运行 diff --git a/us_passManage/us-admin/src/main/resources/templates/magicalcoder/v103/include/center.html b/us_passManage/us-admin/src/main/resources/templates/magicalcoder/v103/include/center.html new file mode 100644 index 0000000..ef1a241 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/templates/magicalcoder/v103/include/center.html @@ -0,0 +1,25 @@ + + +
                                      +
                                      +
                                        +
                                      • 后台首页
                                      • +
                                      + +
                                      +
                                      + +
                                      +
                                      +
                                      +
                                      + diff --git a/us_passManage/us-admin/src/main/resources/templates/magicalcoder/v103/include/common-js.html b/us_passManage/us-admin/src/main/resources/templates/magicalcoder/v103/include/common-js.html new file mode 100644 index 0000000..379d5b5 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/templates/magicalcoder/v103/include/common-js.html @@ -0,0 +1,9 @@ + + +
                                      + + + + +
                                      + diff --git a/us_passManage/us-admin/src/main/resources/templates/magicalcoder/v103/include/footer.html b/us_passManage/us-admin/src/main/resources/templates/magicalcoder/v103/include/footer.html new file mode 100644 index 0000000..4d39780 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/templates/magicalcoder/v103/include/footer.html @@ -0,0 +1,6 @@ + + + + diff --git a/us_passManage/us-admin/src/main/resources/templates/magicalcoder/v103/include/head-index.html b/us_passManage/us-admin/src/main/resources/templates/magicalcoder/v103/include/head-index.html new file mode 100644 index 0000000..52baee9 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/templates/magicalcoder/v103/include/head-index.html @@ -0,0 +1,22 @@ + + + + + + <!--兼容ie9之前写法 需要以http之类的开头--> + <base th:href="${#httpServletRequest.getScheme()+'://'+#httpServletRequest.getServerName()+':'+#httpServletRequest.getServerPort()+#httpServletRequest.getContextPath()+'/'}"/> + <meta name="renderer" content="webkit"/> + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/> + <meta http-equiv="Access-Control-Allow-Origin" content="*"/> + <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/> + <meta name="apple-mobile-web-app-status-bar-style" content="black"/> + <meta name="apple-mobile-web-app-capable" content="yes"/> + <meta name="format-detection" content="telephone=no"/> + <link rel="icon" href="favicon.ico"/> + <link rel="stylesheet" th:href="@{/assets/magicalcoder/v103/layui/css/layui.css}" media="all" /> + <link rel="stylesheet" th:href="@{/assets/magicalcoder/v103/css/public.css}" media="all" /> + + <!--这个是框架的样式 随便引入 会对其他页面 layui造成冲突 覆盖样式--> + <link rel="stylesheet" th:href="@{/assets/magicalcoder/v103/css/index.css}" media="all" /> +</head> +</html> diff --git a/us_passManage/us-admin/src/main/resources/templates/magicalcoder/v103/include/head.html b/us_passManage/us-admin/src/main/resources/templates/magicalcoder/v103/include/head.html new file mode 100644 index 0000000..5be9121 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/templates/magicalcoder/v103/include/head.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org"> +<head th:fragment="commonHead(title)"> + <meta charset="utf-8"/> + <title th:text="${title}"/> + <!--兼容ie9之前写法 需要以http之类的开头--> + <base th:href="${#httpServletRequest.getScheme()+'://'+#httpServletRequest.getServerName()+':'+#httpServletRequest.getServerPort()+#httpServletRequest.getContextPath()+'/'}"/> + <meta name="renderer" content="webkit"/> + <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"/> + <meta http-equiv="Access-Control-Allow-Origin" content="*"/> + <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/> + <meta name="apple-mobile-web-app-status-bar-style" content="black"/> + <meta name="apple-mobile-web-app-capable" content="yes"/> + <meta name="format-detection" content="telephone=no"/> + <link rel="icon" href="favicon.ico"/> + + <link rel="stylesheet" th:href="@{/assets/magicalcoder/v103/layui/css/layui.css}" media="all" /> +<!--非发布环境 采用分离的css--> + <link th:if="${!publish}" rel="stylesheet" th:href="@{/assets/magicalcoder/v103/css/public.css}" media="all" /> + <link th:if="${!publish}" rel="stylesheet" th:href="@{/assets/magicalcoder/v103/css/select2.min.css}" media="all" /> + <link th:if="${!publish}" rel="stylesheet" th:href="@{/assets/magicalcoder/v103/css/magicalcoder.css}" media="all" /> +<!--发布环境采用合并的css--> + <link th:if="${publish}" rel="stylesheet" th:href="@{/assets/magicalcoder/v103/css/youya-boot-all.min.css}" media="all" /> +</head> +</html> diff --git a/us_passManage/us-admin/src/main/resources/templates/magicalcoder/v103/include/header.html b/us_passManage/us-admin/src/main/resources/templates/magicalcoder/v103/include/header.html new file mode 100644 index 0000000..bc5b7b3 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/templates/magicalcoder/v103/include/header.html @@ -0,0 +1,49 @@ +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org"> +<div th:fragment="commonHeader" class="layui-header header"> + <div class="layui-main mag0"> + <a href="#" class="logo">密钥管理系统</a> + <!-- 显示/隐藏菜单 --> + <a href="javascript:;" class="seraph hideMenu icon-caidan"> + <i class="layui-icon layui-icon-shrink-right" ></i> + </a> + <ul class="layui-nav mobileTopLevelMenus" mobile="mobile"> + <li class="layui-nav-item" data-menu="contentManagement"> + <a href="javascript:;"><i class="seraph icon-caidan"></i><cite>YouyaBoot</cite></a> + <dl class="layui-nav-child" > + <dd th:each="item,itemStat : ${categoryList}" th:class="${itemStat.index==0}? 'layui-this' : ''" th:attr="data-menu=${item.id}"><a href="javascript:;"><i class="layui-icon" data-icon=""></i><cite th:text="${item.moduleCategoryName}"/></a></dd> + </dl> + </li> + </ul> + + <ul class="layui-nav topLevelMenus" pc="pc" > + <li th:each="item,itemStat : ${categoryList}" th:class="${itemStat.index==0}? 'layui-nav-item layui-this' : 'layui-nav-item '" th:attr="data-menu=${item.id}" class="layui-nav-item layui-this" pc="pc"> + <a href="javascript:;"><i class="layui-icon" data-icon=""></i><cite th:text="${item.moduleCategoryName}"/></a> + </li> + </ul> + <!-- 顶部右侧菜单 --> + <ul class="layui-nav top_menu"> + <!--<li class="layui-nav-item" pc="pc"> + <a href="javascript:;" class="clearCache"><i class="layui-icon" data-icon=""></i><cite>清除缓存</cite><span class="layui-badge-dot"></span></a> + </li>--> + <li class="layui-nav-item lockcms" pc="pc"> + <a href="javascript:;"><i class="seraph icon-lock"></i><cite>锁屏</cite></a> + </li> + <li class="layui-nav-item" id="userInfo"> + <a href="javascript:;"> + <img th:src="@{/assets/magicalcoder/v103/images/face.jpg}" class="layui-nav-img userAvatar" width="35" height="35"/> + <cite class="adminName"></cite> + </a> + <dl class="layui-nav-child"> + <dd><a href="javascript:;" data-url="page/user/userInfo.html"><i class="seraph icon-ziliao" data-icon="icon-ziliao"></i><cite>个人资料</cite></a></dd> + <dd><a href="javascript:;" data-url="page/user/changePwd.html"><i class="seraph icon-xiugai" data-icon="icon-xiugai"></i><cite>修改密码</cite></a></dd> + <dd><a href="javascript:;" class="showNotice"><i class="layui-icon"></i><cite>系统公告</cite><span class="layui-badge-dot"></span></a></dd> + <dd pc="pc"><a href="javascript:;" class="functionSetting"><i class="layui-icon"></i><cite>功能设定</cite><span class="layui-badge-dot"></span></a></dd> + <dd pc="pc"><a href="javascript:;" class="changeSkin"><i class="layui-icon"></i><cite>更换皮肤</cite></a></dd> + <dd><a href="logout" class="signOut"><i class="seraph icon-tuichu"></i><cite>退出</cite></a></dd> + </dl> + </li> + </ul> + </div> +</div> +</html> diff --git a/us_passManage/us-admin/src/main/resources/templates/magicalcoder/v103/include/left.html b/us_passManage/us-admin/src/main/resources/templates/magicalcoder/v103/include/left.html new file mode 100644 index 0000000..2682d59 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/templates/magicalcoder/v103/include/left.html @@ -0,0 +1,25 @@ +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org"> +<div th:fragment="commonLeft" class="layui-side layui-bg-black"> + <div class="user-photo"> + <a class="img" title="我的头像" ><img th:src="@{/assets/magicalcoder/v103/images/face.jpg}" class="userAvatar"/></a> + <p>你好!<span class="userName"></span>, 欢迎登录</p> + </div> + <!-- 搜索 --> +<!-- <div class="layui-form component hide"> + <select name="search" id="search" lay-search="lay-search" lay-filter="searchPage"> + <option value="">搜索页面或功能</option> + <option value="1">layer</option> + <option value="2">form</option> + </select> + <i class="layui-icon"></i> + </div>--> + <div class="navBar layui-side-scroll" id="navBar"> + <ul class="layui-nav layui-nav-tree"> + <li class="layui-nav-item layui-this"> + <a href="javascript:;" data-url="main"><i class="layui-icon" data-icon=""></i><cite>后台首页</cite></a> + </li> + </ul> + </div> +</div> +</html> diff --git a/us_passManage/us-admin/src/main/resources/templates/magicalcoder/v103/include/main-js.html b/us_passManage/us-admin/src/main/resources/templates/magicalcoder/v103/include/main-js.html new file mode 100644 index 0000000..06dde41 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/templates/magicalcoder/v103/include/main-js.html @@ -0,0 +1,31 @@ +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org"> +<div th:fragment="commonMain" > + + <script type="text/javascript" th:src="@{/assets/magicalcoder/v103/layui/layui.all.js}"></script> + <script type="text/javascript" th:inline="javascript"> + /*存储一些全局变量 可以后后端传过来的 在AdminRmpController.java*/ + var _CTX = /*[[@{/}]]*/ ; + var fileExtraAddPrefix = /*[[${fileExtraAddPrefix}]]*/ ; + var requestPrefix = /*[[${requestPrefix}]]*/ ; + var jQuery = layui.jquery; + _GLOBAL = {"ctx":_CTX,file:{fileExtraAddPrefix:fileExtraAddPrefix,requestPrefix:requestPrefix}} + youyaboot_all = {} + </script> + <!--这个文件不用合并 本身就是压缩过的--> + <script type="text/javascript" th:src="@{/assets/magicalcoder/v103/crud/lib/select2.js}"></script> + + <!--如果是开发方式 加载各种--> + <script th:if="${!publish}" type="text/javascript" th:src="@{/assets/magicalcoder/v103/crud/lib/authtree.js}"></script> + <script th:if="${!publish}" type="text/javascript" th:src="@{/assets/magicalcoder/v103/crud/core/mc-constant.js}"></script> + <script th:if="${!publish}" type="text/javascript" th:src="@{/assets/magicalcoder/v103/crud/core/mc-util.js}"></script> + <script th:if="${!publish}" type="text/javascript" th:src="@{/assets/magicalcoder/v103/crud/core/mc-verify.js}"></script> + <script th:if="${!publish}" type="text/javascript" th:src="@{/assets/magicalcoder/v103/crud/component/mc-select2.js}"></script> + <script th:if="${!publish}" type="text/javascript" th:src="@{/assets/magicalcoder/v103/crud/component/mc-rmp.js}"></script> + <script th:if="${!publish}" type="text/javascript" th:src="@{/assets/magicalcoder/v103/crud/component/mc-layui-component.js}"></script> + <script th:if="${!publish}" type="text/javascript" th:src="@{/assets/magicalcoder/v103/crud/component/mc-children.js}"></script> + + <!--如果线上环境 就加载1个单一的js 性能高 线上js 请使用打包工具自动运行即可 制作方法参考YouyabootAllJsCompressTest--> + <script th:if="${publish}" type="text/javascript" th:src="@{/assets/magicalcoder/v103/crud/youya-boot-all.min.js}"></script> +</div> +</html> diff --git a/us_passManage/us-admin/src/main/resources/templates/main.html b/us_passManage/us-admin/src/main/resources/templates/main.html new file mode 100644 index 0000000..b391a1e --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/templates/main.html @@ -0,0 +1,48 @@ +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org"> +<head th:include="magicalcoder/v103/include/head :: commonHead('首頁')"/> +<body class="childrenBody"> + <blockquote class="layui-elem-quote layui-bg-green"> + <div id="nowTime"></div><!--提示语在main.js--> + </blockquote> + <div class="layui-row layui-col-space10 panel_box"> + <!--<div class="panel layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg2"> + <a href="javascript:;" data-url="http://www.magicalcoder.com" target="_blank"> + <div class="panel_icon layui-bg-green"> + <i class="layui-anim seraph icon-good"></i> + </div> + <div class="panel_word"> + <span>MagicalCoder</span> + <cite>下载地址</cite> + </div> + </a> + </div>--> + <!--<div class="panel layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg2"> + <a href="javascript:;" data-url="https://gitee.com/adyuebanwan/youyaboot" target="_blank"> + <div class="panel_icon layui-bg-black"> + <i class="layui-anim seraph icon-github"></i> + </div> + <div class="panel_word"> + <span>Git</span> + <cite>youyaboot下载链接</cite> + </div> + </a> + </div> + <div class="panel layui-col-xs12 layui-col-sm6 layui-col-md4 layui-col-lg2"> + <a href="javascript:;" data-url="https://gitee.com/adyuebanwan/youyaboot" target="_blank"> + <div class="panel_icon layui-bg-red"> + <i class="layui-anim seraph icon-oschina"></i> + </div> + <div class="panel_word"> + <span>码云</span> + <cite>youyaboot模版下载链接</cite> + </div> + </a> + </div>--> + + </div> + + <div th:replace="magicalcoder/v103/include/main-js :: commonMain" /> + <script type="text/javascript" th:src="@{/assets/magicalcoder/v103/js/main.js}"></script> +</body> +</html> diff --git a/us_passManage/us-admin/src/main/resources/templates/p_pass_instant/edit.html b/us_passManage/us-admin/src/main/resources/templates/p_pass_instant/edit.html new file mode 100644 index 0000000..9f5735a --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/templates/p_pass_instant/edit.html @@ -0,0 +1,95 @@ +<!-- +代码为自动生成 Created by www.magicalcoder.com + 软件作者:何栋宇 qq:709876443 + 如果你改变了此类 read 请将此行删除 + 欢迎加入官方QQ群:648595928 +--> +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org"> +<head th:include="magicalcoder/v103/include/head :: commonHead('p_pass_instant编辑')"/> + +<body class="childrenBody layui-hide"> +<!--请不要删除magicaldrag注释标签,可以配合布局器进行联动布局--> +<!--magicaldrag--> + <div class="layui-fluid"> + <div class="layui-card"> + <div class="layui-card-header"> + + </div> + <div class="layui-card-body"> + <form class="layui-form"> + <div class="layui-form-item security_edit_form_param_passId"> + <label class="layui-form-label">密钥UUID</label> + <div class="layui-input-block"> + <input type="text" disabled="true" class="layui-input" name="passId" placeholder="主键自动生成,无需手动编辑,如果重置则变成增加数据"/> + </div> + </div> + <div class="layui-form-item security_edit_form_param_passName"> + <label class="layui-form-label">密钥名称</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="passName" placeholder="密钥名称" lay-verify="magicalCoderVerify" magicalcoder-verify="|minLength=0" value="" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_passLength"> + <label class="layui-form-label">密钥长度</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="passLength" placeholder="密钥长度" lay-verify="magicalCoderVerify" magicalcoder-verify="|minLength=0" value="" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_passType"> + <label class="layui-form-label">密钥类型</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="passType" placeholder="密钥类型" lay-verify="magicalCoderVerify" magicalcoder-verify="|minLength=0" value="" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_passChildfir"> + <label class="layui-form-label">第一子密钥</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="passChildfir" placeholder="第一子密钥" lay-verify="magicalCoderVerify" magicalcoder-verify="|minLength=0" value="" disabled="true"/> + </div> + </div> + <div class="layui-form-item security_edit_form_param_passChildsec"> + <label class="layui-form-label">第二子密钥</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="passChildsec" placeholder="第二子密钥" lay-verify="magicalCoderVerify" magicalcoder-verify="|minLength=0" value="" disabled="true"/> + </div> + </div> + <div class="layui-form-item security_edit_form_param_passChildthi"> + <label class="layui-form-label">第三子密钥</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="passChildthi" placeholder="第三子密钥" lay-verify="magicalCoderVerify" magicalcoder-verify="|minLength=0" value="" disabled="true"/> + </div> + </div> + <div class="layui-form-item security_edit_form_param_passExpiry"> + <label class="layui-form-label">密钥有效期</label> + <div class="layui-input-block"> + <input type="text" name="passExpiry" placeholder="密钥有效期" autocomplete="off" class="magicalcoder-laydate layui-input" lay-verify="magicalCoderVerify" magicalcoder-verify="|minLength=0" value="" mc-attr-calendar="false" mc-attr-format="yyyy-MM-dd HH:mm:ss" mc-attr-show="false" mc-attr-range="false" mc-attr-trigger="click" mc-attr-type="datetime" mc-attr-is-init-value="true" mc-attr-show-bottom="true" mc-attr-theme="default" mc-attr-position="absolute" mc-attr-lang="cn" mc-attr-z-index="66666666" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_passCreatetime"> + <label class="layui-form-label">密钥上传时间</label> + <div class="layui-input-block"> + <input type="text" name="passCreatetime" placeholder="密钥上传时间" autocomplete="off" class="magicalcoder-laydate layui-input" lay-verify="magicalCoderVerify" magicalcoder-verify="|minLength=0" value="" disabled="true" mc-attr-calendar="false" mc-attr-format="yyyy-MM-dd HH:mm:ss" mc-attr-show="false" mc-attr-range="false" mc-attr-trigger="click" mc-attr-type="datetime" mc-attr-is-init-value="true" mc-attr-show-bottom="true" mc-attr-theme="default" mc-attr-position="absolute" mc-attr-lang="cn" mc-attr-z-index="66666666" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_passUserid"> + <label class="layui-form-label">密钥使用者</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="passUserid" placeholder="密钥使用者" lay-verify="magicalCoderVerify" magicalcoder-verify="|minLength=0" value="" disabled="true"/> + </div> + </div> + <div class="layui-form-item "> + <div class="layui-input-block"> + <a class="layui-btn security_edit_form_operate_save" lay-submit="" lay-filter="save">立即提交</a> + <button type="reset" class="layui-hide layui-btn layui-btn-primary" >重置</button> + </div> + </div> + </form> + </div> + </div> + </div> +<!--/magicaldrag--> + <div th:replace="magicalcoder/v103/include/main-js :: commonMain" /> + <script type="text/javascript" th:src="@{/assets/admin/p_pass_instant/edit.js}"></script> +</body> +</html> diff --git a/us_passManage/us-admin/src/main/resources/templates/p_pass_instant/list.html b/us_passManage/us-admin/src/main/resources/templates/p_pass_instant/list.html new file mode 100644 index 0000000..fd39d6e --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/templates/p_pass_instant/list.html @@ -0,0 +1,93 @@ +<!-- +代码为自动生成 Created by www.magicalcoder.com + 软件作者:何栋宇 qq:709876443 + 如果你改变了此类 read 请将此行删除 + 欢迎加入官方QQ群:648595928 +--> +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org"> +<head th:include="magicalcoder/v103/include/head :: commonHead('p_pass_instant列表')"/> +<body class="childrenBody"> +<!--请不要删除magicaldrag注释标签,可以配合布局器进行联动布局--> +<!--magicaldrag--> + <div class="layui-fluid"> + <div class="layui-row layui-col-space10"> + <div class="layui-col-md12"> + <div class="layui-card"> + <div class="layui-card-header">查询条件</div> + <div class="layui-card-body"> + <form class="layui-form queryForm security_list_query_form"> + <div class="layui-form-item"> + <div class="layui-inline security_list_query_param_passId"> + <input type="text" class="layui-input" data-name="passId" name="passIdFirst" placeholder="密钥UUID" /> + </div> + <div class="layui-inline security_list_query_param_passName"> + <input type="text" class="layui-input" data-name="passName" name="passNameFirst" placeholder="密钥名称" /> + </div> + <div class="layui-inline security_list_query_param_passLength"> + <input type="text" class="layui-input" data-name="passLength" name="passLengthFirst" placeholder="密钥长度" /> + </div> + <div class="layui-inline security_list_query_param_passType"> + <input type="text" class="layui-input" data-name="passType" name="passTypeFirst" placeholder="密钥类型" /> + </div> + <div class="layui-inline security_list_query_param_passExpiry"> + <input type="text" data-name="passExpiry" name="passExpiryFirst" lay-verify="datetime" placeholder="起始密钥有效期" autocomplete="off" class="magicalcoder-laydate layui-input"/> + </div> + <div class="layui-inline security_list_query_param_passExpiry">-</div> + <div class="layui-inline security_list_query_param_passExpiry"> + <input type="text" data-name="passExpiry" name="passExpirySecond" lay-verify="datetime" placeholder="终止密钥有效期" autocomplete="off" class="magicalcoder-laydate layui-input"/> + </div> + <div class="layui-inline security_list_query_param_passCreatetime"> + <input type="text" data-name="passCreatetime" name="passCreatetimeFirst" lay-verify="datetime" placeholder="起始密钥上传时间" autocomplete="off" class="magicalcoder-laydate layui-input"/> + </div> + <div class="layui-inline security_list_query_param_passCreatetime">-</div> + <div class="layui-inline security_list_query_param_passCreatetime"> + <input type="text" data-name="passCreatetime" name="passCreatetimeSecond" lay-verify="datetime" placeholder="终止密钥上传时间" autocomplete="off" class="magicalcoder-laydate layui-input"/> + </div> + <div class="layui-inline security_list_query_param_passUserid"> + <input type="text" class="layui-input" data-name="passUserid" name="passUseridFirst" placeholder="密钥使用者" /> + </div> + <div class="layui-inline security_list_query_operate_search"> + <a class="layui-btn layui-btn-radius layui-btn-sm search_btn" data-type="reload"><i class="layui-icon layui-icon-search"></i>搜索</a> + <button type="reset" class="layui-btn layui-btn-radius layui-btn-warm layui-btn-sm"><i class="layui-icon layui-icon-refresh"></i>重置</button> + </div> + </div> + </form> + </div> + </div> + </div> + <div class="layui-col-md12"> + <div class="layui-card"> + <div class="layui-card-header" style="height: auto;"> + <div class="layui-inline security_list_query_operate_del_all"> + <a class="layui-btn layui-btn-danger layui-btn-sm delAll_btn"><i class="layui-icon layui-icon-delete"></i>批量删除</a> + </div> + <div class="layui-inline security_list_export_excel_all"> + <a class="layui-btn layui-btn-sm exportExcelAll_btn" title="数据量很多时谨慎使用,出于安全考虑最大导出20000条" data-max-export-count="20000"><i class="layui-icon layui-icon-export"></i>导出EXCEL</a> + </div> + <div class="layui-inline security_list_export_excel_all"> + <a class="layui-btn layui-btn-sm addNews_btn" data-max-export-count="20000"><i class="layui-icon layui-icon-export"></i>更新密钥</a> + </div> + </div> + <div class="layui-card-body"> + <form class="layui-form tableForm security_list_table_form"> + <table class="security_list_table" id="newsList" lay-filter="newsListFilter" data-primary-fields="passId"></table> + </form> + </div> + </div> + </div> + </div> + </div> +<!--/magicaldrag--> + <script type="text/html" id="passExpiryTemplate"> + <input type="text" id="_passExpiry_{{= d.passId }}" name="passExpiry" data-identify="{{= d.passId }}" autocomplete="off" class="magicalcoder-table-laydate layui-input security_list_table_form_passExpiry" value="{{= d.passExpiry}}" lay-verify="magicalCoderVerify" magicalcoder-verify="|minLength=0" placeholder="密钥有效期"/> + </script> + <!--操作--> + <script type="text/html" id="newsListOperateTemplate"> + <a class="layui-btn layui-btn-normal layui-btn-xs security_list_table_operate_edit" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a> + <a class="layui-btn layui-btn-danger layui-btn-xs security_list_table_operate_del" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a> + </script> + <div th:replace="magicalcoder/v103/include/main-js :: commonMain" /> + <script type="text/javascript" th:src="@{/assets/admin/p_pass_instant/list.js}"></script> +</body> +</html> diff --git a/us_passManage/us-admin/src/main/resources/templates/p_pass_old/edit.html b/us_passManage/us-admin/src/main/resources/templates/p_pass_old/edit.html new file mode 100644 index 0000000..7c50e1c --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/templates/p_pass_old/edit.html @@ -0,0 +1,95 @@ +<!-- +代码为自动生成 Created by www.magicalcoder.com + 软件作者:何栋宇 qq:709876443 + 如果你改变了此类 read 请将此行删除 + 欢迎加入官方QQ群:648595928 +--> +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org"> +<head th:include="magicalcoder/v103/include/head :: commonHead('p_pass_old编辑')"/> + +<body class="childrenBody layui-hide"> +<!--请不要删除magicaldrag注释标签,可以配合布局器进行联动布局--> +<!--magicaldrag--> + <div class="layui-fluid"> + <div class="layui-card"> + <div class="layui-card-header"> + + </div> + <div class="layui-card-body"> + <form class="layui-form"> + <div class="layui-form-item security_edit_form_param_passId"> + <label class="layui-form-label">密钥UUID</label> + <div class="layui-input-block"> + <input type="text" disabled="true" class="layui-input" name="passId" placeholder="主键自动生成,无需手动编辑,如果重置则变成增加数据"/> + </div> + </div> + <div class="layui-form-item security_edit_form_param_passName"> + <label class="layui-form-label">密钥名称</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="passName" placeholder="密钥名称" lay-verify="magicalCoderVerify" magicalcoder-verify="|minLength=0" value="" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_passLength"> + <label class="layui-form-label">密钥长度</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="passLength" placeholder="密钥长度" lay-verify="magicalCoderVerify" magicalcoder-verify="|minLength=0" value="" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_passType"> + <label class="layui-form-label">密钥类型</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="passType" placeholder="密钥类型" lay-verify="magicalCoderVerify" magicalcoder-verify="|minLength=0" value="" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_passChildfir"> + <label class="layui-form-label">第一子密钥</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="passChildfir" placeholder="第一子密钥" lay-verify="magicalCoderVerify" magicalcoder-verify="|minLength=0" value="" disabled="true"/> + </div> + </div> + <div class="layui-form-item security_edit_form_param_passChildsec"> + <label class="layui-form-label">第二子密钥</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="passChildsec" placeholder="第二子密钥" lay-verify="magicalCoderVerify" magicalcoder-verify="|minLength=0" value="" disabled="true"/> + </div> + </div> + <div class="layui-form-item security_edit_form_param_passChildthi"> + <label class="layui-form-label">第三子密钥</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="passChildthi" placeholder="第三子密钥" lay-verify="magicalCoderVerify" magicalcoder-verify="|minLength=0" value="" disabled="true"/> + </div> + </div> + <div class="layui-form-item security_edit_form_param_passExpiry"> + <label class="layui-form-label">密钥有效期</label> + <div class="layui-input-block"> + <input type="text" name="passExpiry" placeholder="密钥有效期" autocomplete="off" class="magicalcoder-laydate layui-input" lay-verify="magicalCoderVerify" magicalcoder-verify="|minLength=0" value="" mc-attr-calendar="false" mc-attr-format="yyyy-MM-dd HH:mm:ss" mc-attr-show="false" mc-attr-range="false" mc-attr-trigger="click" mc-attr-type="datetime" mc-attr-is-init-value="true" mc-attr-show-bottom="true" mc-attr-theme="default" mc-attr-position="absolute" mc-attr-lang="cn" mc-attr-z-index="66666666" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_passCreatetime"> + <label class="layui-form-label">密钥上传时间</label> + <div class="layui-input-block"> + <input type="text" name="passCreatetime" placeholder="密钥上传时间" autocomplete="off" class="magicalcoder-laydate layui-input" lay-verify="magicalCoderVerify" magicalcoder-verify="|minLength=0" value="" disabled="true" mc-attr-calendar="false" mc-attr-format="yyyy-MM-dd HH:mm:ss" mc-attr-show="false" mc-attr-range="false" mc-attr-trigger="click" mc-attr-type="datetime" mc-attr-is-init-value="true" mc-attr-show-bottom="true" mc-attr-theme="default" mc-attr-position="absolute" mc-attr-lang="cn" mc-attr-z-index="66666666" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_passUserid"> + <label class="layui-form-label">密钥使用者</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="passUserid" placeholder="密钥使用者" lay-verify="magicalCoderVerify" magicalcoder-verify="|minLength=0" value="" disabled="true"/> + </div> + </div> + <div class="layui-form-item "> + <div class="layui-input-block"> + <a class="layui-btn security_edit_form_operate_save" lay-submit="" lay-filter="save">立即提交</a> + <button type="reset" class="layui-hide layui-btn layui-btn-primary" >重置</button> + </div> + </div> + </form> + </div> + </div> + </div> +<!--/magicaldrag--> + <div th:replace="magicalcoder/v103/include/main-js :: commonMain" /> + <script type="text/javascript" th:src="@{/assets/admin/p_pass_old/edit.js}"></script> +</body> +</html> diff --git a/us_passManage/us-admin/src/main/resources/templates/p_pass_old/list.html b/us_passManage/us-admin/src/main/resources/templates/p_pass_old/list.html new file mode 100644 index 0000000..6065e76 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/templates/p_pass_old/list.html @@ -0,0 +1,93 @@ +<!-- +代码为自动生成 Created by www.magicalcoder.com + 软件作者:何栋宇 qq:709876443 + 如果你改变了此类 read 请将此行删除 + 欢迎加入官方QQ群:648595928 +--> +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org"> +<head th:include="magicalcoder/v103/include/head :: commonHead('p_pass_old列表')"/> +<body class="childrenBody"> +<!--请不要删除magicaldrag注释标签,可以配合布局器进行联动布局--> +<!--magicaldrag--> + <div class="layui-fluid"> + <div class="layui-row layui-col-space10"> + <div class="layui-col-md12"> + <div class="layui-card"> + <div class="layui-card-header">查询条件</div> + <div class="layui-card-body"> + <form class="layui-form queryForm security_list_query_form"> + <div class="layui-form-item"> + <div class="layui-inline security_list_query_param_passId"> + <input type="text" class="layui-input" data-name="passId" name="passIdFirst" placeholder="密钥UUID" /> + </div> + <div class="layui-inline security_list_query_param_passName"> + <input type="text" class="layui-input" data-name="passName" name="passNameFirst" placeholder="密钥名称" /> + </div> + <div class="layui-inline security_list_query_param_passLength"> + <input type="text" class="layui-input" data-name="passLength" name="passLengthFirst" placeholder="密钥长度" /> + </div> + <div class="layui-inline security_list_query_param_passType"> + <input type="text" class="layui-input" data-name="passType" name="passTypeFirst" placeholder="密钥类型" /> + </div> + <div class="layui-inline security_list_query_param_passExpiry"> + <input type="text" data-name="passExpiry" name="passExpiryFirst" lay-verify="datetime" placeholder="起始密钥有效期" autocomplete="off" class="magicalcoder-laydate layui-input"/> + </div> + <div class="layui-inline security_list_query_param_passExpiry">-</div> + <div class="layui-inline security_list_query_param_passExpiry"> + <input type="text" data-name="passExpiry" name="passExpirySecond" lay-verify="datetime" placeholder="终止密钥有效期" autocomplete="off" class="magicalcoder-laydate layui-input"/> + </div> + <div class="layui-inline security_list_query_param_passCreatetime"> + <input type="text" data-name="passCreatetime" name="passCreatetimeFirst" lay-verify="datetime" placeholder="起始密钥上传时间" autocomplete="off" class="magicalcoder-laydate layui-input"/> + </div> + <div class="layui-inline security_list_query_param_passCreatetime">-</div> + <div class="layui-inline security_list_query_param_passCreatetime"> + <input type="text" data-name="passCreatetime" name="passCreatetimeSecond" lay-verify="datetime" placeholder="终止密钥上传时间" autocomplete="off" class="magicalcoder-laydate layui-input"/> + </div> + <div class="layui-inline security_list_query_param_passUserid"> + <input type="text" class="layui-input" data-name="passUserid" name="passUseridFirst" placeholder="密钥使用者" /> + </div> + <div class="layui-inline security_list_query_operate_search"> + <a class="layui-btn layui-btn-radius layui-btn-sm search_btn" data-type="reload"><i class="layui-icon layui-icon-search"></i>搜索</a> + <button type="reset" class="layui-btn layui-btn-radius layui-btn-warm layui-btn-sm"><i class="layui-icon layui-icon-refresh"></i>重置</button> + </div> + </div> + </form> + </div> + </div> + </div> + <div class="layui-col-md12"> + <div class="layui-card"> + <div class="layui-card-header" style="height: auto;"> + <div class="layui-inline security_list_query_operate_del_all"> + <a class="layui-btn layui-btn-danger layui-btn-sm delAll_btn"><i class="layui-icon layui-icon-delete"></i>批量删除</a> + </div> + <div class="layui-inline security_list_export_excel_all"> + <a class="layui-btn layui-btn-sm exportExcelAll_btn" title="数据量很多时谨慎使用,出于安全考虑最大导出20000条" data-max-export-count="20000"><i class="layui-icon layui-icon-export"></i>导出EXCEL</a> + </div> + </div> + <div class="layui-card-body"> + <form class="layui-form tableForm security_list_table_form"> + <table class="security_list_table" id="newsList" lay-filter="newsListFilter" data-primary-fields="passId"></table> + </form> + </div> + </div> + </div> + </div> + </div> +<!--/magicaldrag--> + <script type="text/html" id="passExpiryTemplate"> + <input type="text" id="_passExpiry_{{= d.passId }}" name="passExpiry" data-identify="{{= d.passId }}" autocomplete="off" class="magicalcoder-table-laydate layui-input security_list_table_form_passExpiry" value="{{= d.passExpiry}}" lay-verify="magicalCoderVerify" magicalcoder-verify="|minLength=0" placeholder="密钥有效期"/> + </script> + <script type="text/html" id="passCreatetimeTemplate"> + <input type="text" id="_passCreatetime_{{= d.passId }}" name="passCreatetime" data-identify="{{= d.passId }}" autocomplete="off" class="magicalcoder-table-laydate layui-input security_list_table_form_passCreatetime" value="{{= d.passCreatetime}}" lay-verify="magicalCoderVerify" magicalcoder-verify="|minLength=0" disabled="true" placeholder="密钥上传时间"/> + </script> + <!--操作--> + <script type="text/html" id="newsListOperateTemplate"> + <a class="layui-btn layui-btn-normal layui-btn-xs security_list_table_operate_edit" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a> + <a class="layui-btn layui-btn-danger layui-btn-xs security_list_table_operate_del" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a> + </script> + <div th:replace="magicalcoder/v103/include/main-js :: commonMain" /> + <script type="text/javascript" th:src="@{/assets/admin/p_pass_old/list.js}"></script> +</body> +</html> diff --git a/us_passManage/us-admin/src/main/resources/templates/sys_admin_user/edit.html b/us_passManage/us-admin/src/main/resources/templates/sys_admin_user/edit.html new file mode 100644 index 0000000..41c606d --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/templates/sys_admin_user/edit.html @@ -0,0 +1,122 @@ +<!-- +代码为自动生成 Created by www.magicalcoder.com + 如果你改变了此类 read 请将此行删除 + 欢迎加入官方QQ群:323237052 +--> +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org"> +<head th:include="magicalcoder/v103/include/head :: commonHead('管理员编辑')"/> + +<body class="childrenBody layui-hide"> + <div class="layui-fluid"> + <div class="layui-card"> + <div class="layui-card-header"> + + </div> + <div class="layui-card-body"> + <form class="layui-form"> + <div class="layui-form-item security_edit_form_param_id"> + <label class="layui-form-label">主键</label> + <div class="layui-input-block"> + <input type="text" disabled="true" class="layui-input" name="id" placeholder="主键自动生成,无需手动编辑,如果重置则变成增加数据"/> + </div> + </div> + <div class="layui-form-item security_edit_form_param_username"> + <label class="layui-form-label">用户名</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="username" placeholder="请输入用户名" lay-verify="magicalCoderVerify|mc_required" magicalcoder-verify="|minLength=0" value="" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_password"> + <label class="layui-form-label">密码</label> + <div class="layui-input-block"> + <input type="password" class="layui-input" name="password" placeholder="请输入密码" lay-verify="magicalCoderVerify|mc_required" magicalcoder-verify="|minLength=0" value="" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_realName"> + <label class="layui-form-label">真名</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="realName" placeholder="请输入真名" lay-verify="magicalCoderVerify" magicalcoder-verify="|minLength=0" value="" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_email"> + <label class="layui-form-label">邮箱</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="email" placeholder="请输入邮箱" lay-verify="magicalCoderVerify" magicalcoder-verify="" value="" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_telephone"> + <label class="layui-form-label">座机号</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="telephone" placeholder="请输入座机号" lay-verify="magicalCoderVerify" magicalcoder-verify="" value="" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_mobilePhone"> + <label class="layui-form-label">手机号</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="mobilePhone" placeholder="请输入手机号" lay-verify="magicalCoderVerify" magicalcoder-verify="" value="" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_address"> + <label class="layui-form-label">地址</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="address" placeholder="请输入地址" lay-verify="magicalCoderVerify" magicalcoder-verify="|minLength=0" value="" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_createTime"> + <label class="layui-form-label">创建时间</label> + <div class="layui-input-block"> + <input type="text" name="createTime" placeholder="请选择创建时间" autocomplete="off" class="magicalcoder-laydate layui-input" lay-verify="magicalCoderVerify" magicalcoder-verify="" value="" mc-attr-calendar="false" mc-attr-format="yyyy-MM-dd HH:mm:ss" mc-attr-show="false" mc-attr-range="false" mc-attr-trigger="click" mc-attr-type="datetime" mc-attr-is-init-value="true" mc-attr-show-bottom="true" mc-attr-theme="default" mc-attr-position="absolute" mc-attr-lang="cn" mc-attr-z-index="66666666" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_updateTime"> + <label class="layui-form-label">更新时间</label> + <div class="layui-input-block"> + <input type="text" name="updateTime" placeholder="请选择更新时间" autocomplete="off" class="magicalcoder-laydate layui-input" lay-verify="magicalCoderVerify" magicalcoder-verify="|minLength=0" value="" mc-attr-calendar="false" mc-attr-format="yyyy-MM-dd HH:mm:ss" mc-attr-show="false" mc-attr-range="false" mc-attr-trigger="click" mc-attr-type="datetime" mc-attr-is-init-value="true" mc-attr-show-bottom="true" mc-attr-theme="default" mc-attr-position="absolute" mc-attr-lang="cn" mc-attr-z-index="66666666" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_roleId"> + <label class="layui-form-label">角色</label> + <div class="layui-input-block"> + <select name="roleId" data-url="admin/sys_role_rest/search" data-id="id" data-text-fields="roleName" class="magicalcoder-foreign-select2 layui-input" lay-ignore="true" lay-verify="magicalCoderVerify" magicalcoder-verify="|minLength=0" data-value="" placeholder="请输入角色" data-limit="20"><option value=""></option></select> + </div> + </div> + <div class="layui-form-item security_edit_form_param_accountNonExpired"> + <label class="layui-form-label">是否未失效</label> + <div class="layui-input-block"> + <input type="checkbox" name="accountNonExpired" lay-skin="switch" lay-text="" lay-verify="magicalCoderVerify" magicalcoder-verify="" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_accountNonLocked"> + <label class="layui-form-label">是否未锁定</label> + <div class="layui-input-block"> + <input type="checkbox" name="accountNonLocked" lay-skin="switch" lay-text="" lay-verify="magicalCoderVerify" magicalcoder-verify="" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_credentialsNonExpired"> + <label class="layui-form-label">是否未失效</label> + <div class="layui-input-block"> + <input type="checkbox" name="credentialsNonExpired" lay-skin="switch" lay-text="" lay-verify="magicalCoderVerify" magicalcoder-verify="" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_enabled"> + <label class="layui-form-label">是否可用</label> + <div class="layui-input-block"> + <input type="checkbox" name="enabled" lay-skin="switch" lay-text="" lay-verify="magicalCoderVerify|mc_required" magicalcoder-verify="|minLength=0" /> + </div> + </div> + <!--把下面的按钮移动到form外面 键盘回车事件就取消了 --> + <div class="layui-form-item "> + <div class="layui-input-block"> + <button class="layui-btn security_edit_form_operate_save" lay-submit="" lay-filter="save">立即提交</button> + <button type="reset" class="layui-hide layui-btn layui-btn-primary" >重置</button> + </div> + </div> + </form> + </div> + </div> + </div> + <div th:replace="magicalcoder/v103/include/main-js :: commonMain" /> + <script type="text/javascript" th:src="@{/assets/admin/sys_admin_user/edit.js}"></script> +</body> +</html> diff --git a/us_passManage/us-admin/src/main/resources/templates/sys_admin_user/list.html b/us_passManage/us-admin/src/main/resources/templates/sys_admin_user/list.html new file mode 100644 index 0000000..9e09f0e --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/templates/sys_admin_user/list.html @@ -0,0 +1,70 @@ +<!-- +代码为自动生成 Created by www.magicalcoder.com + 如果你改变了此类 read 请将此行删除 + 欢迎加入官方QQ群:323237052 +--> +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org"> +<head th:include="magicalcoder/v103/include/head :: commonHead('管理员列表')"/> +<body class="childrenBody <!-- layui-hide-->"> + <div class="layui-fluid"> + <div class="layui-row layui-col-space10"> + <div class="layui-col-md12"> + <div class="layui-card"> + <div class="layui-card-header">查询条件</div> + <div class="layui-card-body"> + <form class="layui-form queryForm security_list_query_form"> + <div class="layui-form-item"> + <div class="layui-inline security_list_query_param_username"> + <input type="text" class="layui-input" data-name="username" name="usernameFirst" placeholder="用户名" /> + </div> + <div class="layui-inline security_list_query_param_roleId"> + <select data-name="roleId" class="magicalcoder-foreign-select2 layui-input" lay-ignore="true" name="roleIdFirst" style="height:30px;width: 200px" data-url="admin/sys_role_rest/search" data-id="id" data-text-fields="roleName" placeholder="角色" data-limit="20"><option value=""></option></select> + </div> + <div class="layui-inline security_list_query_operate_search"> + <a class="layui-btn layui-btn-radius layui-btn-sm search_btn" data-type="reload"><i class="layui-icon layui-icon-search"></i>搜索</a> + <button type="reset" class="layui-btn layui-btn-radius layui-btn-warm layui-btn-sm"><i class="layui-icon layui-icon-refresh"></i>重置</button> + </div> + </div> + </form> + </div> + </div> + </div> + <div class="layui-col-md12"> + <div class="layui-card"> + <div class="layui-card-header" style="height: auto;"> + <div class="layui-inline security_list_query_operate_add_news"> + <a class="layui-btn layui-btn-normal layui-btn-sm addNews_btn"><i class="layui-icon layui-icon-add-1"></i>添加</a> + </div> + <div class="layui-inline security_list_query_operate_del_all"> + <a class="layui-btn layui-btn-danger layui-btn-sm delAll_btn"><i class="layui-icon layui-icon-delete"></i>批量删除</a> + </div> + <div class="layui-inline security_list_export_excel_all"> + <a class="layui-btn layui-btn-sm exportExcelAll_btn" title="数据量很多时谨慎使用,出于安全考虑最大导出20000条" data-max-export-count="20000"><i class="layui-icon layui-icon-export"></i>导出EXCEL</a> + </div> + </div> + <div class="layui-card-body"> + <form class="layui-form tableForm security_list_table_form"> + <table class="security_list_table" id="newsList" lay-filter="newsListFilter" data-primary-fields="id"></table> + </form> + </div> + </div> + </div> + </div> + </div> + <script type="text/html" id="createTimeTemplate"> + <input type="text" id="_createTime_{{= d.id }}" name="createTime" data-identify="{{= d.id }}" autocomplete="off" class="magicalcoder-table-laydate layui-input security_list_table_form_createTime" value="{{= d.createTime}}" lay-verify="magicalCoderVerify" magicalcoder-verify="" placeholder="请输入创建时间"/> + </script> + <script type="text/html" id="updateTimeTemplate"> + <input type="text" id="_updateTime_{{= d.id }}" name="updateTime" data-identify="{{= d.id }}" autocomplete="off" class="magicalcoder-table-laydate layui-input security_list_table_form_updateTime" value="{{= d.updateTime}}" lay-verify="magicalCoderVerify" magicalcoder-verify="|minLength=0" placeholder="请输入更新时间"/> + </script> + <!--操作--> + <script type="text/html" id="newsListOperateTemplate"> + <a class="layui-btn layui-btn-normal layui-btn-xs security_list_table_operate_edit" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a> + <a class="layui-btn layui-btn-danger layui-btn-xs security_list_table_operate_del" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a> + <a class="layui-btn layui-btn-xs security_list_table_operate_children" lay-event="children"><i class="layui-icon layui-icon-senior"></i>系统日志</a> + </script> + <div th:replace="magicalcoder/v103/include/main-js :: commonMain" /> + <script type="text/javascript" th:src="@{/assets/admin/sys_admin_user/list.js}"></script> +</body> +</html> diff --git a/us_passManage/us-admin/src/main/resources/templates/sys_global_permit_url/edit.html b/us_passManage/us-admin/src/main/resources/templates/sys_global_permit_url/edit.html new file mode 100644 index 0000000..a1da05d --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/templates/sys_global_permit_url/edit.html @@ -0,0 +1,56 @@ +<!-- +代码为自动生成 Created by www.magicalcoder.com + 如果你改变了此类 read 请将此行删除 + 欢迎加入官方QQ群:323237052 +--> +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org"> +<head th:include="magicalcoder/v103/include/head :: commonHead('后端请求地址全局允许过滤器,在此表的统一不用再去权限表匹配了编辑')"/> + +<body class="childrenBody layui-hide"> + <div class="layui-fluid"> + <div class="layui-card"> + <div class="layui-card-header"> + + </div> + <div class="layui-card-body"> + <form class="layui-form"> + <div class="layui-form-item security_edit_form_param_id"> + <label class="layui-form-label">主键</label> + <div class="layui-input-block"> + <input type="text" disabled="true" class="layui-input" name="id" placeholder="主键自动生成,无需手动编辑,如果重置则变成增加数据"/> + </div> + </div> + <div class="layui-form-item security_edit_form_param_permitName"> + <label class="layui-form-label">通过名称</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="permitName" placeholder="请输入通过名称" lay-verify="magicalCoderVerify|mc_required" magicalcoder-verify="|minLength=0" value="" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_backendUrlReg"> + <label class="layui-form-label">后端的地址正则</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="backendUrlReg" placeholder="请输入后端的地址正则" lay-verify="magicalCoderVerify|mc_required" magicalcoder-verify="|minLength=0" value="" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_moduleId"> + <label class="layui-form-label">所属模块</label> + <div class="layui-input-block"> + <select name="moduleId" data-url="admin/sys_module_rest/search" data-id="id" data-text-fields="moduleTitle" class="magicalcoder-foreign-select2 layui-input" lay-ignore="true" lay-verify="magicalCoderVerify" magicalcoder-verify="|minLength=0" data-value="" placeholder="请输入所属模块" data-limit="20"><option value=""></option></select> + </div> + </div> + <!--把下面的按钮移动到form外面 键盘回车事件就取消了 --> + <div class="layui-form-item "> + <div class="layui-input-block"> + <button class="layui-btn security_edit_form_operate_save" lay-submit="" lay-filter="save">立即提交</button> + <button type="reset" class="layui-hide layui-btn layui-btn-primary" >重置</button> + </div> + </div> + </form> + </div> + </div> + </div> + <div th:replace="magicalcoder/v103/include/main-js :: commonMain" /> + <script type="text/javascript" th:src="@{/assets/admin/sys_global_permit_url/edit.js}"></script> +</body> +</html> diff --git a/us_passManage/us-admin/src/main/resources/templates/sys_global_permit_url/list.html b/us_passManage/us-admin/src/main/resources/templates/sys_global_permit_url/list.html new file mode 100644 index 0000000..8104057 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/templates/sys_global_permit_url/list.html @@ -0,0 +1,63 @@ +<!-- +代码为自动生成 Created by www.magicalcoder.com + 如果你改变了此类 read 请将此行删除 + 欢迎加入官方QQ群:323237052 +--> +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org"> +<head th:include="magicalcoder/v103/include/head :: commonHead('后端请求地址全局允许过滤器,在此表的统一不用再去权限表匹配了列表')"/> +<body class="childrenBody <!-- layui-hide-->"> + <div class="layui-fluid"> + <div class="layui-row layui-col-space10"> + <div class="layui-col-md12"> + <div class="layui-card"> + <div class="layui-card-header">查询条件</div> + <div class="layui-card-body"> + <form class="layui-form queryForm security_list_query_form"> + <div class="layui-form-item"> + <div class="layui-inline security_list_query_param_permitName"> + <input type="text" class="layui-input" data-name="permitName" name="permitNameFirst" placeholder="通过名称" /> + </div> + <div class="layui-inline security_list_query_param_moduleId"> + <select data-name="moduleId" class="magicalcoder-foreign-select2 layui-input" lay-ignore="true" name="moduleIdFirst" style="height:30px;width: 200px" data-url="admin/sys_module_rest/search" data-id="id" data-text-fields="moduleTitle" placeholder="所属模块" data-limit="20"><option value=""></option></select> + </div> + <div class="layui-inline security_list_query_operate_search"> + <a class="layui-btn layui-btn-radius layui-btn-sm search_btn" data-type="reload"><i class="layui-icon layui-icon-search"></i>搜索</a> + <button type="reset" class="layui-btn layui-btn-radius layui-btn-warm layui-btn-sm"><i class="layui-icon layui-icon-refresh"></i>重置</button> + </div> + </div> + </form> + </div> + </div> + </div> + <div class="layui-col-md12"> + <div class="layui-card"> + <div class="layui-card-header" style="height: auto;"> + <div class="layui-inline security_list_query_operate_add_news"> + <a class="layui-btn layui-btn-normal layui-btn-sm addNews_btn"><i class="layui-icon layui-icon-add-1"></i>添加</a> + </div> + <div class="layui-inline security_list_query_operate_del_all"> + <a class="layui-btn layui-btn-danger layui-btn-sm delAll_btn"><i class="layui-icon layui-icon-delete"></i>批量删除</a> + </div> + <div class="layui-inline security_list_export_excel_all"> + <a class="layui-btn layui-btn-sm exportExcelAll_btn" title="数据量很多时谨慎使用,出于安全考虑最大导出20000条" data-max-export-count="20000"><i class="layui-icon layui-icon-export"></i>导出EXCEL</a> + </div> + </div> + <div class="layui-card-body"> + <form class="layui-form tableForm security_list_table_form"> + <table class="security_list_table" id="newsList" lay-filter="newsListFilter" data-primary-fields="id"></table> + </form> + </div> + </div> + </div> + </div> + </div> + <!--操作--> + <script type="text/html" id="newsListOperateTemplate"> + <a class="layui-btn layui-btn-normal layui-btn-xs security_list_table_operate_edit" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a> + <a class="layui-btn layui-btn-danger layui-btn-xs security_list_table_operate_del" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a> + </script> + <div th:replace="magicalcoder/v103/include/main-js :: commonMain" /> + <script type="text/javascript" th:src="@{/assets/admin/sys_global_permit_url/list.js}"></script> +</body> +</html> diff --git a/us_passManage/us-admin/src/main/resources/templates/sys_log_admin_operate/edit.html b/us_passManage/us-admin/src/main/resources/templates/sys_log_admin_operate/edit.html new file mode 100644 index 0000000..862d741 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/templates/sys_log_admin_operate/edit.html @@ -0,0 +1,86 @@ +<!-- +代码为自动生成 Created by www.magicalcoder.com + 如果你改变了此类 read 请将此行删除 + 欢迎加入官方QQ群:323237052 +--> +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org"> +<head th:include="magicalcoder/v103/include/head :: commonHead('系统日志编辑')"/> + +<body class="childrenBody layui-hide"> + <div class="layui-fluid"> + <div class="layui-card"> + <div class="layui-card-header"> + + </div> + <div class="layui-card-body"> + <form class="layui-form"> + <div class="layui-form-item security_edit_form_param_id"> + <label class="layui-form-label">主键</label> + <div class="layui-input-block"> + <input type="text" disabled="true" class="layui-input" name="id" placeholder="主键自动生成,无需手动编辑,如果重置则变成增加数据"/> + </div> + </div> + <div class="layui-form-item security_edit_form_param_adminUserId"> + <label class="layui-form-label">管理员</label> + <div class="layui-input-block"> + <select name="adminUserId" data-url="admin/sys_admin_user_rest/search" data-id="id" data-text-fields="username" class="magicalcoder-foreign-select2 layui-input" lay-ignore="true" lay-verify="magicalCoderVerify" magicalcoder-verify="" data-value="" placeholder="请输入管理员" data-limit="20"><option value=""></option></select> + </div> + </div> + <div class="layui-form-item security_edit_form_param_userName"> + <label class="layui-form-label">管理员名称</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="userName" placeholder="请输入管理员名称" lay-verify="magicalCoderVerify" magicalcoder-verify="" value="" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_tableName"> + <label class="layui-form-label">表名</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="tableName" placeholder="请输入表名" lay-verify="magicalCoderVerify" magicalcoder-verify="" value="" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_operateType"> + <label class="layui-form-label">操作类型</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="operateType" placeholder="请输入操作类型" lay-verify="magicalCoderVerify" magicalcoder-verify="|minLength=0" value="" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_url"> + <label class="layui-form-label">链接</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="url" placeholder="请输入链接" lay-verify="magicalCoderVerify" magicalcoder-verify="" value="" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_primaryIdValue"> + <label class="layui-form-label">主键值</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="primaryIdValue" placeholder="请输入主键值" lay-verify="magicalCoderVerify" magicalcoder-verify="" value="" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_formBody"> + <label class="layui-form-label">提交内容</label> + <div class="layui-input-block"> + <textarea name="formBody" placeholder="请输入提交内容" class="layui-textarea" lay-verify="magicalCoderVerify" magicalcoder-verify="|minLength=0" ></textarea> + </div> + </div> + <div class="layui-form-item security_edit_form_param_createTime"> + <label class="layui-form-label">创建时间</label> + <div class="layui-input-block"> + <input type="text" name="createTime" placeholder="请选择创建时间" autocomplete="off" class="magicalcoder-laydate layui-input" lay-verify="magicalCoderVerify" magicalcoder-verify="" value="" mc-attr-calendar="false" mc-attr-format="yyyy-MM-dd HH:mm:ss" mc-attr-show="false" mc-attr-range="false" mc-attr-trigger="click" mc-attr-type="datetime" mc-attr-is-init-value="true" mc-attr-show-bottom="true" mc-attr-theme="default" mc-attr-position="absolute" mc-attr-lang="cn" mc-attr-z-index="66666666" /> + </div> + </div> + <!--把下面的按钮移动到form外面 键盘回车事件就取消了 --> + <div class="layui-form-item "> + <div class="layui-input-block"> + <button class="layui-btn security_edit_form_operate_save" lay-submit="" lay-filter="save">立即提交</button> + <button type="reset" class="layui-hide layui-btn layui-btn-primary" >重置</button> + </div> + </div> + </form> + </div> + </div> + </div> + <div th:replace="magicalcoder/v103/include/main-js :: commonMain" /> + <script type="text/javascript" th:src="@{/assets/admin/sys_log_admin_operate/edit.js}"></script> +</body> +</html> diff --git a/us_passManage/us-admin/src/main/resources/templates/sys_log_admin_operate/list.html b/us_passManage/us-admin/src/main/resources/templates/sys_log_admin_operate/list.html new file mode 100644 index 0000000..0be75e8 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/templates/sys_log_admin_operate/list.html @@ -0,0 +1,79 @@ +<!-- +代码为自动生成 Created by www.magicalcoder.com + 如果你改变了此类 read 请将此行删除 + 欢迎加入官方QQ群:323237052 +--> +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org"> +<head th:include="magicalcoder/v103/include/head :: commonHead('系统日志列表')"/> +<body class="childrenBody <!-- layui-hide-->"> + <div class="layui-fluid"> + <div class="layui-row layui-col-space10"> + <div class="layui-col-md12"> + <div class="layui-card"> + <div class="layui-card-header">查询条件</div> + <div class="layui-card-body"> + <form class="layui-form queryForm security_list_query_form"> + <div class="layui-form-item"> + <div class="layui-inline security_list_query_param_adminUserId"> + <select data-name="adminUserId" class="magicalcoder-foreign-select2 layui-input" lay-ignore="true" name="adminUserIdFirst" style="height:30px;width: 200px" data-url="admin/sys_admin_user_rest/search" data-id="id" data-text-fields="username" placeholder="管理员" data-limit="20"><option value=""></option></select> + </div> + <div class="layui-inline security_list_query_param_userName"> + <input type="text" class="layui-input" data-name="userName" name="userNameFirst" placeholder="管理员名称" /> + </div> + <div class="layui-inline security_list_query_param_tableName"> + <input type="text" class="layui-input" data-name="tableName" name="tableNameFirst" placeholder="表名" /> + </div> + <div class="layui-inline security_list_query_param_formBody"> + <input type="text" class="layui-input" data-name="formBody" name="formBodyFirst" placeholder="提交内容" /> + </div> + <div class="layui-inline security_list_query_param_createTime"> + <input type="text" data-name="createTime" name="createTimeFirst" lay-verify="datetime" placeholder="起始创建时间" autocomplete="off" class="magicalcoder-laydate layui-input"/> + </div> + <div class="layui-inline security_list_query_param_createTime">-</div> + <div class="layui-inline security_list_query_param_createTime"> + <input type="text" data-name="createTime" name="createTimeSecond" lay-verify="datetime" placeholder="终止创建时间" autocomplete="off" class="magicalcoder-laydate layui-input"/> + </div> + <div class="layui-inline security_list_query_operate_search"> + <a class="layui-btn layui-btn-radius layui-btn-sm search_btn" data-type="reload"><i class="layui-icon layui-icon-search"></i>搜索</a> + <button type="reset" class="layui-btn layui-btn-radius layui-btn-warm layui-btn-sm"><i class="layui-icon layui-icon-refresh"></i>重置</button> + </div> + </div> + </form> + </div> + </div> + </div> + <div class="layui-col-md12"> + <div class="layui-card"> + <div class="layui-card-header" style="height: auto;"> + <div class="layui-inline security_list_query_operate_add_news"> + <a class="layui-btn layui-btn-normal layui-btn-sm addNews_btn"><i class="layui-icon layui-icon-add-1"></i>添加</a> + </div> + <div class="layui-inline security_list_query_operate_del_all"> + <a class="layui-btn layui-btn-danger layui-btn-sm delAll_btn"><i class="layui-icon layui-icon-delete"></i>批量删除</a> + </div> + <div class="layui-inline security_list_export_excel_all"> + <a class="layui-btn layui-btn-sm exportExcelAll_btn" title="数据量很多时谨慎使用,出于安全考虑最大导出20000条" data-max-export-count="20000"><i class="layui-icon layui-icon-export"></i>导出EXCEL</a> + </div> + </div> + <div class="layui-card-body"> + <form class="layui-form tableForm security_list_table_form"> + <table class="security_list_table" id="newsList" lay-filter="newsListFilter" data-primary-fields="id"></table> + </form> + </div> + </div> + </div> + </div> + </div> + <script type="text/html" id="createTimeTemplate"> + <input type="text" id="_createTime_{{= d.id }}" name="createTime" data-identify="{{= d.id }}" autocomplete="off" class="magicalcoder-table-laydate layui-input security_list_table_form_createTime" value="{{= d.createTime}}" lay-verify="magicalCoderVerify" magicalcoder-verify="" placeholder="请输入创建时间"/> + </script> + <!--操作--> + <script type="text/html" id="newsListOperateTemplate"> + <a class="layui-btn layui-btn-normal layui-btn-xs security_list_table_operate_edit" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a> + <a class="layui-btn layui-btn-danger layui-btn-xs security_list_table_operate_del" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a> + </script> + <div th:replace="magicalcoder/v103/include/main-js :: commonMain" /> + <script type="text/javascript" th:src="@{/assets/admin/sys_log_admin_operate/list.js}"></script> +</body> +</html> diff --git a/us_passManage/us-admin/src/main/resources/templates/sys_module/edit.html b/us_passManage/us-admin/src/main/resources/templates/sys_module/edit.html new file mode 100644 index 0000000..c93f54e --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/templates/sys_module/edit.html @@ -0,0 +1,80 @@ +<!-- +代码为自动生成 Created by www.magicalcoder.com + 如果你改变了此类 read 请将此行删除 + 欢迎加入官方QQ群:323237052 +--> +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org"> +<head th:include="magicalcoder/v103/include/head :: commonHead('模块编辑')"/> + +<body class="childrenBody layui-hide"> + <div class="layui-fluid"> + <div class="layui-card"> + <div class="layui-card-header"> + + </div> + <div class="layui-card-body"> + <form class="layui-form"> + <div class="layui-form-item security_edit_form_param_id"> + <label class="layui-form-label">主键</label> + <div class="layui-input-block"> + <input type="text" disabled="true" class="layui-input" name="id" placeholder="主键自动生成,无需手动编辑,如果重置则变成增加数据"/> + </div> + </div> + <div class="layui-form-item security_edit_form_param_moduleCategoryId"> + <label class="layui-form-label">一级菜单</label> + <div class="layui-input-block"> + <select name="moduleCategoryId" data-url="admin/sys_module_category_rest/search" data-id="id" data-text-fields="moduleCategoryName" class="magicalcoder-foreign-select2 layui-input" lay-ignore="true" lay-verify="magicalCoderVerify" magicalcoder-verify="" data-value="" placeholder="请选择一级菜单" data-limit="20"><option value=""></option></select> + </div> + </div> + <div class="layui-form-item security_edit_form_param_moduleTitle"> + <label class="layui-form-label">二级菜单标题</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="moduleTitle" placeholder="请输入二级菜单标题" lay-verify="magicalCoderVerify" magicalcoder-verify="" value="" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_moduleName"> + <label class="layui-form-label">二级菜单唯一值</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="moduleName" placeholder="建议使用全小写表名称" lay-verify="magicalCoderVerify" magicalcoder-verify="|minLength=0" value="" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_moduleUrl"> + <label class="layui-form-label">二级菜单地址</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="moduleUrl" placeholder="请输入二级菜单地址" lay-verify="magicalCoderVerify" magicalcoder-verify="" value="admin/page_v2/把我改成小写表名称/list" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_sortNum"> + <label class="layui-form-label">排序</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="sortNum" placeholder="请输入排序" lay-verify="magicalCoderVerify" magicalcoder-verify="" value="" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_ifShow"> + <label class="layui-form-label">是否显示</label> + <div class="layui-input-block"> + <input type="checkbox" name="ifShow" lay-skin="switch" lay-text="" lay-verify="magicalCoderVerify" magicalcoder-verify="" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_ifShow"> + <label class="layui-form-label">自动配置权限明细</label> + <div class="layui-input-block"> + <input type="checkbox" name="helpConfigPermit" lay-skin="switch" lay-text="" lay-verify="magicalCoderVerify" magicalcoder-verify="" /> + </div> + </div> + <!--把下面的按钮移动到form外面 键盘回车事件就取消了 --> + <div class="layui-form-item "> + <div class="layui-input-block"> + <button class="layui-btn security_edit_form_operate_save" lay-submit="" lay-filter="save">立即提交</button> + <button type="reset" class="layui-hide layui-btn layui-btn-primary" >重置</button> + </div> + </div> + </form> + </div> + </div> + </div> + <div th:replace="magicalcoder/v103/include/main-js :: commonMain" /> + <script type="text/javascript" th:src="@{/assets/admin/sys_module/edit.js}"></script> +</body> +</html> diff --git a/us_passManage/us-admin/src/main/resources/templates/sys_module/list.html b/us_passManage/us-admin/src/main/resources/templates/sys_module/list.html new file mode 100644 index 0000000..88bad81 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/templates/sys_module/list.html @@ -0,0 +1,67 @@ +<!-- +代码为自动生成 Created by www.magicalcoder.com + 如果你改变了此类 read 请将此行删除 + 欢迎加入官方QQ群:323237052 +--> +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org"> +<head th:include="magicalcoder/v103/include/head :: commonHead('模块列表')"/> +<body class="childrenBody <!-- layui-hide-->"> + <div class="layui-fluid"> + <div class="layui-row layui-col-space10"> + <div class="layui-col-md12"> + <div class="layui-card"> + <div class="layui-card-header">查询条件</div> + <div class="layui-card-body"> + <form class="layui-form queryForm security_list_query_form"> + <div class="layui-form-item"> + <div class="layui-inline security_list_query_param_moduleCategoryId"> + <select data-name="moduleCategoryId" class="magicalcoder-foreign-select2 layui-input" lay-ignore="true" name="moduleCategoryIdFirst" style="height:30px;width: 200px" data-url="admin/sys_module_category_rest/search" data-id="id" data-text-fields="moduleCategoryName" placeholder="一级菜单" data-limit="20"><option value=""></option></select> + </div> + <div class="layui-inline security_list_query_param_moduleName"> + <input type="text" class="layui-input" data-name="moduleName" name="moduleNameFirst" placeholder="二级菜单唯一值" /> + </div> + <div class="layui-inline security_list_query_param_moduleTitle"> + <input type="text" class="layui-input" data-name="moduleTitle" name="moduleTitleFirst" placeholder="二级菜单标题" /> + </div> + <div class="layui-inline security_list_query_operate_search"> + <a class="layui-btn layui-btn-radius layui-btn-sm search_btn" data-type="reload"><i class="layui-icon layui-icon-search"></i>搜索</a> + <button type="reset" class="layui-btn layui-btn-radius layui-btn-warm layui-btn-sm"><i class="layui-icon layui-icon-refresh"></i>重置</button> + </div> + </div> + </form> + </div> + </div> + </div> + <div class="layui-col-md12"> + <div class="layui-card"> + <div class="layui-card-header" style="height: auto;"> + <div class="layui-inline security_list_query_operate_add_news"> + <a class="layui-btn layui-btn-normal layui-btn-sm addNews_btn"><i class="layui-icon layui-icon-add-1"></i>添加</a> + </div> + <div class="layui-inline security_list_query_operate_del_all"> + <a class="layui-btn layui-btn-danger layui-btn-sm delAll_btn"><i class="layui-icon layui-icon-delete"></i>批量删除</a> + </div> + <div class="layui-inline security_list_export_excel_all"> + <a class="layui-btn layui-btn-sm exportExcelAll_btn" title="数据量很多时谨慎使用,出于安全考虑最大导出20000条" data-max-export-count="20000"><i class="layui-icon layui-icon-export"></i>导出EXCEL</a> + </div> + </div> + <div class="layui-card-body"> + <form class="layui-form tableForm security_list_table_form"> + <table class="security_list_table" id="newsList" lay-filter="newsListFilter" data-primary-fields="id"></table> + </form> + </div> + </div> + </div> + </div> + </div> + <!--操作--> + <script type="text/html" id="newsListOperateTemplate"> + <a class="layui-btn layui-btn-normal layui-btn-xs security_list_table_operate_edit" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a> + <a class="layui-btn layui-btn-danger layui-btn-xs security_list_table_operate_del" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a> + <a class="layui-btn layui-btn-xs security_list_table_operate_children" lay-event="children"><i class="layui-icon layui-icon-senior"></i>权限明细</a> + </script> + <div th:replace="magicalcoder/v103/include/main-js :: commonMain" /> + <script type="text/javascript" th:src="@{/assets/admin/sys_module/list.js}"></script> +</body> +</html> diff --git a/us_passManage/us-admin/src/main/resources/templates/sys_module_category/edit.html b/us_passManage/us-admin/src/main/resources/templates/sys_module_category/edit.html new file mode 100644 index 0000000..3e03f14 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/templates/sys_module_category/edit.html @@ -0,0 +1,50 @@ +<!-- +代码为自动生成 Created by www.magicalcoder.com + 如果你改变了此类 read 请将此行删除 + 欢迎加入官方QQ群:323237052 +--> +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org"> +<head th:include="magicalcoder/v103/include/head :: commonHead('一级菜单编辑')"/> + +<body class="childrenBody layui-hide"> + <div class="layui-fluid"> + <div class="layui-card"> + <div class="layui-card-header"> + + </div> + <div class="layui-card-body"> + <form class="layui-form"> + <div class="layui-form-item security_edit_form_param_id"> + <label class="layui-form-label">主键</label> + <div class="layui-input-block"> + <input type="text" disabled="true" class="layui-input" name="id" placeholder="主键自动生成,无需手动编辑,如果重置则变成增加数据"/> + </div> + </div> + <div class="layui-form-item security_edit_form_param_moduleCategoryName"> + <label class="layui-form-label">一级菜单名称</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="moduleCategoryName" placeholder="请输入一级菜单名称" lay-verify="magicalCoderVerify" magicalcoder-verify="" value="" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_sortNum"> + <label class="layui-form-label">排序</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="sortNum" placeholder="请输入排序" lay-verify="magicalCoderVerify|mc_number" magicalcoder-verify="" value="" /> + </div> + </div> + <!--把下面的按钮移动到form外面 键盘回车事件就取消了 --> + <div class="layui-form-item "> + <div class="layui-input-block"> + <button class="layui-btn security_edit_form_operate_save" lay-submit="" lay-filter="save">立即提交</button> + <button type="reset" class="layui-hide layui-btn layui-btn-primary" >重置</button> + </div> + </div> + </form> + </div> + </div> + </div> + <div th:replace="magicalcoder/v103/include/main-js :: commonMain" /> + <script type="text/javascript" th:src="@{/assets/admin/sys_module_category/edit.js}"></script> +</body> +</html> diff --git a/us_passManage/us-admin/src/main/resources/templates/sys_module_category/list.html b/us_passManage/us-admin/src/main/resources/templates/sys_module_category/list.html new file mode 100644 index 0000000..fce2ba4 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/templates/sys_module_category/list.html @@ -0,0 +1,61 @@ +<!-- +代码为自动生成 Created by www.magicalcoder.com + 如果你改变了此类 read 请将此行删除 + 欢迎加入官方QQ群:323237052 +--> +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org"> +<head th:include="magicalcoder/v103/include/head :: commonHead('一级菜单列表')"/> +<body class="childrenBody <!-- layui-hide-->"> + <div class="layui-fluid"> + <div class="layui-row layui-col-space10"> + <div class="layui-col-md12"> + <div class="layui-card"> + <div class="layui-card-header">查询条件</div> + <div class="layui-card-body"> + <form class="layui-form queryForm security_list_query_form"> + <div class="layui-form-item"> + <div class="layui-inline security_list_query_param_moduleCategoryName"> + <input type="text" class="layui-input" data-name="moduleCategoryName" name="moduleCategoryNameFirst" placeholder="一级菜单名称" /> + </div> + <div class="layui-inline security_list_query_operate_search"> + <a class="layui-btn layui-btn-radius layui-btn-sm search_btn" data-type="reload"><i class="layui-icon layui-icon-search"></i>搜索</a> + <button type="reset" class="layui-btn layui-btn-radius layui-btn-warm layui-btn-sm"><i class="layui-icon layui-icon-refresh"></i>重置</button> + </div> + </div> + </form> + </div> + </div> + </div> + <div class="layui-col-md12"> + <div class="layui-card"> + <div class="layui-card-header" style="height: auto;"> + <div class="layui-inline security_list_query_operate_add_news"> + <a class="layui-btn layui-btn-normal layui-btn-sm addNews_btn"><i class="layui-icon layui-icon-add-1"></i>添加</a> + </div> + <div class="layui-inline security_list_query_operate_del_all"> + <a class="layui-btn layui-btn-danger layui-btn-sm delAll_btn"><i class="layui-icon layui-icon-delete"></i>批量删除</a> + </div> + <div class="layui-inline security_list_export_excel_all"> + <a class="layui-btn layui-btn-sm exportExcelAll_btn" title="数据量很多时谨慎使用,出于安全考虑最大导出20000条" data-max-export-count="20000"><i class="layui-icon layui-icon-export"></i>导出EXCEL</a> + </div> + </div> + <div class="layui-card-body"> + <form class="layui-form tableForm security_list_table_form"> + <table class="security_list_table" id="newsList" lay-filter="newsListFilter" data-primary-fields="id"></table> + </form> + </div> + </div> + </div> + </div> + </div> + <!--操作--> + <script type="text/html" id="newsListOperateTemplate"> + <a class="layui-btn layui-btn-normal layui-btn-xs security_list_table_operate_edit" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a> + <a class="layui-btn layui-btn-danger layui-btn-xs security_list_table_operate_del" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a> + <a class="layui-btn layui-btn-xs security_list_table_operate_children" lay-event="children"><i class="layui-icon layui-icon-senior"></i>左侧二级菜单</a> + </script> + <div th:replace="magicalcoder/v103/include/main-js :: commonMain" /> + <script type="text/javascript" th:src="@{/assets/admin/sys_module_category/list.js}"></script> +</body> +</html> diff --git a/us_passManage/us-admin/src/main/resources/templates/sys_permission/edit.html b/us_passManage/us-admin/src/main/resources/templates/sys_permission/edit.html new file mode 100644 index 0000000..fefa7a0 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/templates/sys_permission/edit.html @@ -0,0 +1,83 @@ +<!-- +代码为自动生成 Created by www.magicalcoder.com + 如果你改变了此类 read 请将此行删除 + 欢迎加入官方QQ群:323237052 +--> +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org"> +<head th:include="magicalcoder/v103/include/head :: commonHead('权限明细配置编辑')"/> + +<body class="childrenBody layui-hide"> + <div class="layui-fluid"> + <div class="layui-card"> + <div class="layui-card-header"> + + </div> + <div class="layui-card-body"> + <form class="layui-form"> + <div class="layui-form-item security_edit_form_param_id"> + <label class="layui-form-label">主键</label> + <div class="layui-input-block"> + <input type="text" disabled="true" class="layui-input" name="id" placeholder="主键自动生成,无需手动编辑,如果重置则变成增加数据"/> + </div> + </div> + <div class="layui-form-item security_edit_form_param_permissionName"> + <label class="layui-form-label">权限名称</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="permissionName" placeholder="请输入权限名称" lay-verify="magicalCoderVerify" magicalcoder-verify="|minLength=0" value="全部权限" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_filterPlatform"> + <label class="layui-form-label">规则适用端</label> + <div class="layui-input-block"> + <select name="filterPlatform" class="layui-input" lay-verify="magicalCoderVerify" magicalcoder-verify="|minLength=0" placeholder="请选择规则适用端"> + <option value="" selected="selected">请选择</option> + <option value="front" >前端</option> + <option value="backend" >后端</option> + <option value="front_backend" >前后端</option> + </select> + </div> + </div> + <div class="layui-form-item security_edit_form_param_backendUrlReg"> + <label class="layui-form-label">后端正则地址</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="backendUrlReg" placeholder="/admin/把我改成小写表名称_rest/[\s\S]* 请输入后端的地址正则,校验当前请求url是否有权限,get|post统一会按照参数首字母排序" lay-verify="magicalCoderVerify" magicalcoder-verify="" value="/admin/把我改成小写表名称_rest/[\s\S]*" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_frontDom"> + <label class="layui-form-label">DOM前端Key</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="frontDom" placeholder="jquery选择器,可为空,逗号分隔多个,例如#id,[name=\'goodsName\']" lay-verify="magicalCoderVerify" magicalcoder-verify="" value="" /> + </div> + </div> + <div class="layui-form-item security_edit_form_param_frontAction"> + <label class="layui-form-label">前端处理方式</label> + <div class="layui-input-block"> + <select name="frontAction" class="layui-input" lay-verify="magicalCoderVerify" magicalcoder-verify="" placeholder="前端处理方式,可为空"> + <option value="" selected="selected">请选择</option> + <option value="show" >读写</option> + <option value="disabled" >只读</option> + </select> + </div> + </div> + <div class="layui-form-item security_edit_form_param_moduleId"> + <label class="layui-form-label">所属二级菜单</label> + <div class="layui-input-block"> + <select name="moduleId" data-url="admin/sys_module_rest/search" data-id="id" data-text-fields="moduleTitle" class="magicalcoder-foreign-select2 layui-input" lay-ignore="true" lay-verify="magicalCoderVerify" magicalcoder-verify="|minLength=0" data-value="" placeholder="请选择所属二级菜单" data-limit="20"><option value=""></option></select> + </div> + </div> + <!--把下面的按钮移动到form外面 键盘回车事件就取消了 --> + <div class="layui-form-item "> + <div class="layui-input-block"> + <button class="layui-btn security_edit_form_operate_save" lay-submit="" lay-filter="save">立即提交</button> + <button type="reset" class="layui-hide layui-btn layui-btn-primary" >重置</button> + </div> + </div> + </form> + </div> + </div> + </div> + <div th:replace="magicalcoder/v103/include/main-js :: commonMain" /> + <script type="text/javascript" th:src="@{/assets/admin/sys_permission/edit.js}"></script> +</body> +</html> diff --git a/us_passManage/us-admin/src/main/resources/templates/sys_permission/list.html b/us_passManage/us-admin/src/main/resources/templates/sys_permission/list.html new file mode 100644 index 0000000..f1bc4ac --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/templates/sys_permission/list.html @@ -0,0 +1,109 @@ +<!-- +代码为自动生成 Created by www.magicalcoder.com + 如果你改变了此类 read 请将此行删除 + 欢迎加入官方QQ群:323237052 +--> +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org"> +<head th:include="magicalcoder/v103/include/head :: commonHead('权限明细配置列表')"/> +<body class="childrenBody <!-- layui-hide-->"> + <div class="layui-fluid"> + <div class="layui-row layui-col-space10"> + <div class="layui-col-md12"> + <div class="layui-card"> + <div class="layui-card-header">查询条件</div> + <div class="layui-card-body"> + <form class="layui-form queryForm security_list_query_form"> + <div class="layui-form-item"> + <div class="layui-inline security_list_query_param_id"> + <input type="text" class="layui-input" data-name="id" name="idFirst" placeholder="主键" /> + </div> + <div class="layui-inline security_list_query_param_permissionName"> + <input type="text" class="layui-input" data-name="permissionName" name="permissionNameFirst" placeholder="权限名称" /> + </div> + <div class="layui-inline security_list_query_param_moduleId"> + <select data-name="moduleId" class="magicalcoder-foreign-select2 layui-input" lay-ignore="true" name="moduleIdFirst" style="height:30px;width: 200px" data-url="admin/sys_module_rest/search" data-id="id" data-text-fields="moduleTitle" placeholder="所属二级菜单" data-limit="20"><option value=""></option></select> + </div> + <div class="layui-inline security_list_query_operate_search"> + <a class="layui-btn layui-btn-radius layui-btn-sm search_btn" data-type="reload"><i class="layui-icon layui-icon-search"></i>搜索</a> + <button type="reset" class="layui-btn layui-btn-radius layui-btn-warm layui-btn-sm"><i class="layui-icon layui-icon-refresh"></i>重置</button> + </div> + </div> + </form> + </div> + </div> + </div> + <div class="layui-col-md12"> + <div class="layui-card"> + <div class="layui-card-header" style="height: auto;"> + <div class="layui-inline security_list_query_operate_add_news"> + <a class="layui-btn layui-btn-normal layui-btn-sm addNews_btn"><i class="layui-icon layui-icon-add-1"></i>添加</a> + </div> + <div class="layui-inline security_list_query_operate_del_all"> + <a class="layui-btn layui-btn-danger layui-btn-sm delAll_btn"><i class="layui-icon layui-icon-delete"></i>批量删除</a> + </div> + <div class="layui-inline security_list_export_excel_all"> + <a class="layui-btn layui-btn-sm exportExcelAll_btn" title="数据量很多时谨慎使用,出于安全考虑最大导出20000条" data-max-export-count="20000"><i class="layui-icon layui-icon-export"></i>导出EXCEL</a> + </div> + </div> + <div class="layui-card-body"> + <form class="layui-form tableForm security_list_table_form"> + <table class="security_list_table" id="newsList" lay-filter="newsListFilter" data-primary-fields="id"></table> + </form> + </div> + </div> + </div> + </div> + </div> + <script type="text/html" id="frontActionTemplate"> + <select class="magicalcoder-table-single-select2 security_list_table_form_frontAction" name="frontAction" lay-ignore="true" data-identify="{{= d.id }}" lay-verify="magicalCoderVerify" magicalcoder-verify="" placeholder="前端处理方式"> + {{# if(d.frontAction+"" == ""){ }} + <option value="" selected="selected">请选择</option> + {{# }else{ }} + <option value="">请选择</option> + {{# } }} + {{# if(d.frontAction+"" == "show"){ }} + <option value="show" selected="selected">读写</option> + {{# }else{ }} + <option value="show">读写</option> + {{# } }} + {{# if(d.frontAction+"" == "disabled"){ }} + <option value="disabled" selected="selected">只读</option> + {{# }else{ }} + <option value="disabled">只读</option> + {{# } }} + </select> + </script> + <script type="text/html" id="filterPlatformTemplate"> + <select class="magicalcoder-table-single-select2 security_list_table_form_filterPlatform" name="filterPlatform" lay-ignore="true" data-identify="{{= d.id }}" lay-verify="magicalCoderVerify" magicalcoder-verify="|minLength=0" placeholder="请选择规则适用端"> + {{# if(d.filterPlatform+"" == ""){ }} + <option value="" selected="selected">请选择</option> + {{# }else{ }} + <option value="">请选择</option> + {{# } }} + {{# if(d.filterPlatform+"" == "front"){ }} + <option value="front" selected="selected">前端</option> + {{# }else{ }} + <option value="front">前端</option> + {{# } }} + {{# if(d.filterPlatform+"" == "backend"){ }} + <option value="backend" selected="selected">后端</option> + {{# }else{ }} + <option value="backend">后端</option> + {{# } }} + {{# if(d.filterPlatform+"" == "front_backend"){ }} + <option value="front_backend" selected="selected">前后端</option> + {{# }else{ }} + <option value="front_backend">前后端</option> + {{# } }} + </select> + </script> + <!--操作--> + <script type="text/html" id="newsListOperateTemplate"> + <a class="layui-btn layui-btn-normal layui-btn-xs security_list_table_operate_edit" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a> + <a class="layui-btn layui-btn-danger layui-btn-xs security_list_table_operate_del" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a> + </script> + <div th:replace="magicalcoder/v103/include/main-js :: commonMain" /> + <script type="text/javascript" th:src="@{/assets/admin/sys_permission/list.js}"></script> +</body> +</html> diff --git a/us_passManage/us-admin/src/main/resources/templates/sys_role/edit.html b/us_passManage/us-admin/src/main/resources/templates/sys_role/edit.html new file mode 100644 index 0000000..7beb6a5 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/templates/sys_role/edit.html @@ -0,0 +1,44 @@ +<!-- +代码为自动生成 Created by www.magicalcoder.com + 如果你改变了此类 read 请将此行删除 + 欢迎加入官方QQ群:323237052 +--> +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org"> +<head th:include="magicalcoder/v103/include/head :: commonHead('角色编辑')"/> + +<body class="childrenBody layui-hide"> + <div class="layui-fluid"> + <div class="layui-card"> + <div class="layui-card-header"> + + </div> + <div class="layui-card-body"> + <form class="layui-form"> + <div class="layui-form-item security_edit_form_param_id"> + <label class="layui-form-label">主键</label> + <div class="layui-input-block"> + <input type="text" disabled="true" class="layui-input" name="id" placeholder="主键自动生成,无需手动编辑,如果重置则变成增加数据"/> + </div> + </div> + <div class="layui-form-item security_edit_form_param_roleName"> + <label class="layui-form-label">角色名</label> + <div class="layui-input-block"> + <input type="text" class="layui-input" name="roleName" placeholder="请输入角色名" lay-verify="magicalCoderVerify|mc_required" magicalcoder-verify="" value="" /> + </div> + </div> + <!--把下面的按钮移动到form外面 键盘回车事件就取消了 --> + <div class="layui-form-item "> + <div class="layui-input-block"> + <button class="layui-btn security_edit_form_operate_save" lay-submit="" lay-filter="save">立即提交</button> + <button type="reset" class="layui-hide layui-btn layui-btn-primary" >重置</button> + </div> + </div> + </form> + </div> + </div> + </div> + <div th:replace="magicalcoder/v103/include/main-js :: commonMain" /> + <script type="text/javascript" th:src="@{/assets/admin/sys_role/edit.js}"></script> +</body> +</html> diff --git a/us_passManage/us-admin/src/main/resources/templates/sys_role/list.html b/us_passManage/us-admin/src/main/resources/templates/sys_role/list.html new file mode 100644 index 0000000..1918686 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/templates/sys_role/list.html @@ -0,0 +1,61 @@ +<!-- +代码为自动生成 Created by www.magicalcoder.com + 如果你改变了此类 read 请将此行删除 + 欢迎加入官方QQ群:323237052 +--> +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org"> +<head th:include="magicalcoder/v103/include/head :: commonHead('角色列表')"/> +<body class="childrenBody <!-- layui-hide-->"> + <div class="layui-fluid"> + <div class="layui-row layui-col-space10"> + <div class="layui-col-md12"> + <div class="layui-card"> + <div class="layui-card-header">查询条件</div> + <div class="layui-card-body"> + <form class="layui-form queryForm security_list_query_form"> + <div class="layui-form-item"> + <div class="layui-inline security_list_query_param_roleName"> + <input type="text" class="layui-input" data-name="roleName" name="roleNameFirst" placeholder="角色名" /> + </div> + <div class="layui-inline security_list_query_operate_search"> + <a class="layui-btn layui-btn-radius layui-btn-sm search_btn" data-type="reload"><i class="layui-icon layui-icon-search"></i>搜索</a> + <button type="reset" class="layui-btn layui-btn-radius layui-btn-warm layui-btn-sm"><i class="layui-icon layui-icon-refresh"></i>重置</button> + </div> + </div> + </form> + </div> + </div> + </div> + <div class="layui-col-md12"> + <div class="layui-card"> + <div class="layui-card-header" style="height: auto;"> + <div class="layui-inline security_list_query_operate_add_news"> + <a class="layui-btn layui-btn-normal layui-btn-sm addNews_btn"><i class="layui-icon layui-icon-add-1"></i>添加</a> + </div> + <div class="layui-inline security_list_query_operate_del_all"> + <a class="layui-btn layui-btn-danger layui-btn-sm delAll_btn"><i class="layui-icon layui-icon-delete"></i>批量删除</a> + </div> + <div class="layui-inline security_list_export_excel_all"> + <a class="layui-btn layui-btn-sm exportExcelAll_btn" title="数据量很多时谨慎使用,出于安全考虑最大导出20000条" data-max-export-count="20000"><i class="layui-icon layui-icon-export"></i>导出EXCEL</a> + </div> + </div> + <div class="layui-card-body"> + <form class="layui-form tableForm security_list_table_form"> + <table class="security_list_table" id="newsList" lay-filter="newsListFilter" data-primary-fields="id"></table> + </form> + </div> + </div> + </div> + </div> + </div> + <!--操作--> + <script type="text/html" id="newsListOperateTemplate"> + <a class="layui-btn layui-btn-normal layui-btn-xs security_list_table_operate_edit" lay-event="edit"><i class="layui-icon layui-icon-edit"></i>编辑</a> + <a class="layui-btn layui-btn-danger layui-btn-xs security_list_table_operate_del" lay-event="del"><i class="layui-icon layui-icon-delete"></i>删除</a> + <a class="layui-btn layui-btn-xs security_list_table_operate_children" lay-event="priority"><i class="layui-icon layui-icon-senior"></i>分配权限</a> + </script> + <div th:replace="magicalcoder/v103/include/main-js :: commonMain" /> + <script type="text/javascript" th:src="@{/assets/admin/sys_role/list.js}"></script> +</body> +</html> diff --git a/us_passManage/us-admin/src/main/resources/templates/sys_role/permission.html b/us_passManage/us-admin/src/main/resources/templates/sys_role/permission.html new file mode 100644 index 0000000..cf0123e --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/templates/sys_role/permission.html @@ -0,0 +1,24 @@ +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org"> +<head th:include="magicalcoder/v103/include/head :: commonHead('分配权限')"/> + +<body class="childrenBody"> + <form class="layui-form" style="width:80%;"> + <!--权限树--> + <div class="layui-form-item"> + <div class="layui-input-block"> + <div id="auth-tree"></div> + </div> + </div> + <div class="layui-form-item layui-row layui-col-xs12 layui-hide"> + <div class="layui-input-block security_edit_form_operate_save"> + <button class="layui-btn" name="submit" lay-submit="" lay-filter="save">立即提交</button> + </div> + </div> + </form> + <button class="layui-btn layui-hide" name="reload">重新加载</button> + + <div th:replace="magicalcoder/v103/include/main-js :: commonMain" /> + <script type="text/javascript" th:src="@{/assets/admin/sys_role/permission.js}"></script> +</body> +</html> diff --git a/us_passManage/us-admin/src/main/resources/templates/sys_role_module_permission/edit.html b/us_passManage/us-admin/src/main/resources/templates/sys_role_module_permission/edit.html new file mode 100644 index 0000000..7212c39 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/templates/sys_role_module_permission/edit.html @@ -0,0 +1,49 @@ + +<!-- +代码为自动生成 Created by www.magicalcoder.com + 如果你改变了此类 read 请将此行删除 + 欢迎加入官方QQ群:323237052 +--> +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org"> +<head th:include="magicalcoder/v001/include/head :: commonHead('角色模块权限编辑')"/> + +<body class="childrenBody layui-hide"> +<form class="layui-form" style="width:80%;"> + + <div class="layui-form-item layui-row layui-col-xs12 security_edit_form_param_id"> + <label class="layui-form-label">主键</label> + <div class="layui-input-block"> + <input type="text" disabled="true" class="layui-input" name="id" placeholder="主键自动生成,无需手动编辑,如果重置则变成增加数据"/> + </div> + </div> + <div class="layui-form-item layui-row layui-col-xs12 security_edit_form_param_roleId"> + <label class="layui-form-label">角色</label> + <div class="layui-input-block"> + <select name="roleId" data-url="admin/sys_role_rest/search" data-id="id" data-text-fields="roleName" class="magicalcoder-foreign-select2 layui-input" lay-ignore="true" lay-verify="magicalCoderVerify" magicalcoder-verify="" data-value="" placeholder="请输入角色"><option value=""></option></select> + </div> + </div> + <div class="layui-form-item layui-row layui-col-xs12 security_edit_form_param_moduleId"> + <label class="layui-form-label">模块</label> + <div class="layui-input-block"> + <select name="moduleId" data-url="admin/sys_module_rest/search" data-id="id" data-text-fields="moduleTitle" class="magicalcoder-foreign-select2 layui-input" lay-ignore="true" lay-verify="magicalCoderVerify" magicalcoder-verify="" data-value="" placeholder="请输入模块"><option value=""></option></select> + </div> + </div> + <div class="layui-form-item layui-row layui-col-xs12 security_edit_form_param_permissionId"> + <label class="layui-form-label">权限</label> + <div class="layui-input-block"> + <select name="permissionId" data-url="admin/sys_permission_rest/search" data-id="id" data-text-fields="permissionName" class="magicalcoder-foreign-select2 layui-input" lay-ignore="true" lay-verify="magicalCoderVerify" magicalcoder-verify="" data-value="" placeholder="请输入权限"><option value=""></option></select> + </div> + </div> + + <div class="layui-form-item layui-row layui-col-xs12"> + <div class="layui-input-block"> + <button class="layui-btn security_edit_form_operate_save" lay-submit="" lay-filter="save">立即提交</button> + <button type="reset" class="layui-hide layui-btn layui-btn-primary" >重置</button> + </div> + </div> +</form> + <div th:replace="magicalcoder/v001/include/main-js :: commonMain" /> + <script type="text/javascript" th:src="@{/assets/admin/sys_role_module_permission/edit.js}"></script> +</body> +</html> diff --git a/us_passManage/us-admin/src/main/resources/templates/sys_role_module_permission/list.html b/us_passManage/us-admin/src/main/resources/templates/sys_role_module_permission/list.html new file mode 100644 index 0000000..a02ffe1 --- /dev/null +++ b/us_passManage/us-admin/src/main/resources/templates/sys_role_module_permission/list.html @@ -0,0 +1,50 @@ +<!-- +代码为自动生成 Created by www.magicalcoder.com + 如果你改变了此类 read 请将此行删除 + 欢迎加入官方QQ群:323237052 +--> +<!DOCTYPE html> +<html xmlns:th="http://www.thymeleaf.org"> +<head th:include="magicalcoder/v001/include/head :: commonHead('角色模块权限列表')"/> +<body class="childrenBody layui-hide"> + <form class="layui-form queryForm"> + <blockquote class="layui-elem-quote quoteBox"> + <form class="layui-form-item"> + <div class="layui-inline security_list_query_param_roleId"> + <div class="layui-input-inline"> + <select class="magicalcoder-foreign-select2 layui-input" lay-ignore="true" name="roleIdFirst" style="height:30px;width: 200px" data-url="admin/sys_role_rest/search" data-id="id" data-text-fields="roleName" placeholder="角色"><option value=""></option></select> + </div> + </div> + <div class="layui-inline security_list_query_param_moduleId"> + <div class="layui-input-inline"> + <select class="magicalcoder-foreign-select2 layui-input" lay-ignore="true" name="moduleIdFirst" style="height:30px;width: 200px" data-url="admin/sys_module_rest/search" data-id="id" data-text-fields="moduleTitle" placeholder="模块"><option value=""></option></select> + </div> + </div> + <div class="layui-inline security_list_query_param_permissionId"> + <div class="layui-input-inline"> + <select class="magicalcoder-foreign-select2 layui-input" lay-ignore="true" name="permissionIdFirst" style="height:30px;width: 200px" data-url="admin/sys_permission_rest/search" data-id="id" data-text-fields="permissionName" placeholder="权限"><option value=""></option></select> + </div> + </div> + <div class="layui-inline security_list_query_operate_search"> + <a class="layui-btn search_btn" data-type="reload">搜索</a> + <button type="reset" class="layui-btn layui-btn-primary">重置</button> + </div> + <div class="layui-inline security_list_query_operate_add_news"> + <a class="layui-btn layui-btn-normal addNews_btn">添加</a> + </div> + <div class="layui-inline security_list_query_operate_del_all"> + <a class="layui-btn layui-btn-danger layui-btn-normal delAll_btn">批量删除</a> + </div> + </form> + </blockquote> + <table class="security_list_table" id="newsList" lay-filter="newsListFilter" data-primary-fields="id"></table> + <!--操作--> + <script type="text/html" id="newsListOperateTemplate"> + <a class="layui-btn layui-btn-sm security_list_table_operate_edit" lay-event="edit">编辑</a> + <a class="layui-btn layui-btn-sm layui-btn-danger security_list_table_operate_del" lay-event="del">删除</a> + </script> + </form> + <div th:replace="magicalcoder/v001/include/main-js :: commonMain" /> + <script type="text/javascript" th:src="@{/assets/admin/sys_role_module_permission/list.js}"></script> +</body> +</html> diff --git a/us_passManage/us-core/pom.xml b/us_passManage/us-core/pom.xml new file mode 100644 index 0000000..c1140d3 --- /dev/null +++ b/us_passManage/us-core/pom.xml @@ -0,0 +1,245 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>com.passManage</groupId> + <artifactId>us</artifactId> + <version>0.0.1-SNAPSHOT</version> + </parent> + <name>us-core</name> + <artifactId>us-core</artifactId> + <dependencies> + <dependency> + <groupId>org.mybatis.spring.boot</groupId> + <artifactId>mybatis-spring-boot-starter</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-web</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-configuration-processor</artifactId> + <optional>true</optional> + </dependency> + <!-- spring-boot-freemarker组件 --> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-freemarker</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-data-redis</artifactId> + </dependency> + <dependency> + <groupId>redis.clients</groupId> + <artifactId>jedis</artifactId> + </dependency> + <!-- spring-boot-mail组件 --> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-mail</artifactId> + </dependency> + + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-activemq</artifactId> + </dependency> + <!-- lombok组件 --> + <dependency> + <groupId>org.projectlombok</groupId> + <artifactId>lombok</artifactId> + </dependency> + + <!-- <dependency> + <groupId>net.sf.json-lib</groupId> + <artifactId>json-lib</artifactId> + <classifier>jdk15</classifier> + </dependency>--> +<!-- <dependency> + <groupId>org.apache.httpcomponents</groupId> + <artifactId>httpclient</artifactId> + </dependency> + <dependency> + <groupId>org.apache.httpcomponents</groupId> + <artifactId>httpmime</artifactId> + </dependency>--> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-pool2</artifactId> + </dependency> + <dependency> + <groupId>com.alibaba</groupId> + <artifactId>fastjson</artifactId> + </dependency> + + <dependency> + <groupId>mysql</groupId> + <artifactId>mysql-connector-java</artifactId> + </dependency> + + <dependency> + <groupId>com.alibaba</groupId> + <artifactId>druid</artifactId> + </dependency> + <!--<dependency> + <groupId>dom4j</groupId> + <artifactId>dom4j</artifactId> + </dependency>--> + <dependency> + <groupId>org.apache.commons</groupId> + <artifactId>commons-io</artifactId> + </dependency> + <dependency> + <groupId>org.apache.tomcat.embed</groupId> + <artifactId>tomcat-embed-core</artifactId> + </dependency> + + <!--<dependency> + <groupId>com.fasterxml.jackson.core</groupId> + <artifactId>jackson-annotations</artifactId> + </dependency>--> + + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-aop</artifactId> + </dependency> + <!-- Protostuff 序列化 反序列化 --> + <dependency> + <groupId>com.dyuproject.protostuff</groupId> + <artifactId>protostuff-core</artifactId> + </dependency> + <dependency> + <groupId>com.dyuproject.protostuff</groupId> + <artifactId>protostuff-runtime</artifactId> + </dependency> + <!-- Objenesis --> + <dependency> + <groupId>org.objenesis</groupId> + <artifactId>objenesis</artifactId> + </dependency> + <dependency> + <groupId>javax.servlet.jsp</groupId> + <artifactId>jsp-api</artifactId> + </dependency> + + <dependency> + <groupId>com.squareup.okhttp3</groupId> + <artifactId>okhttp</artifactId> + </dependency> + <dependency> + <groupId>com.squareup.okio</groupId> + <artifactId>okio</artifactId> + </dependency> + <dependency> + <groupId>junit</groupId> + <artifactId>junit</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-test</artifactId> + <scope>test</scope> + </dependency> + <!--引入excel v1.0.1版本新增 2018/12/20 如不需要您也可以删除--> + <dependency> + <groupId>org.apache.poi</groupId> + <artifactId>poi</artifactId> + </dependency> + <dependency> + <groupId>org.apache.poi</groupId> + <artifactId>poi-ooxml</artifactId> + <exclusions> + <exclusion> + <artifactId>xml-apis</artifactId> + <groupId>xml-apis</groupId> + </exclusion> + </exclusions> + </dependency> + <dependency> + <groupId>org.apache.poi</groupId> + <artifactId>poi-ooxml-schemas</artifactId> + </dependency> + <dependency> + <groupId>org.apache.poi</groupId> + <artifactId>poi-excelant</artifactId> + </dependency> + <dependency> + <groupId>org.apache.poi</groupId> + <artifactId>poi-scratchpad</artifactId> + </dependency> + <!--end--> + <dependency> + <groupId>org.jsoup</groupId> + <artifactId>jsoup</artifactId> + </dependency> + + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-devtools</artifactId> + <optional>true</optional> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-test</artifactId> + <scope>test</scope> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-thymeleaf</artifactId> + </dependency> + <!--<dependency> + <groupId>org.springframework.cloud</groupId> + <artifactId>spring-cloud-starter-eureka</artifactId> + </dependency>--> + <dependency> + <groupId>org.springframework.session</groupId> + <artifactId>spring-session-data-redis</artifactId> + </dependency> + <dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-configuration-processor</artifactId> + <optional>true</optional> + </dependency> + <dependency> + <groupId>commons-lang</groupId> + <artifactId>commons-lang</artifactId> + </dependency> + <dependency> + <groupId>ch.qos.logback</groupId> + <artifactId>logback-classic</artifactId> + </dependency> + <dependency> + <groupId>org.slf4j</groupId> + <artifactId>slf4j-log4j12</artifactId> + </dependency> + <dependency> + <groupId>log4j</groupId> + <artifactId>log4j</artifactId> + <exclusions> + <exclusion> + <artifactId>jmxtools</artifactId> + <groupId>com.sun.jdmk</groupId> + </exclusion> + <exclusion> + <artifactId>jmxri</artifactId> + <groupId>com.sun.jmx</groupId> + </exclusion> + <exclusion> + <artifactId>jms</artifactId> + <groupId>javax.jms</groupId> + </exclusion> + <exclusion> + <artifactId>mail</artifactId> + <groupId>javax.mail</groupId> + </exclusion> + </exclusions> + </dependency> + <!--阿里云对象存储OOS 如果引入httpclient包 已经有okhttp 可以不用httpclient 了 如果使用 请使用最新版 否则会不兼容 oss--> + <dependency> + <groupId>com.aliyun.oss</groupId> + <artifactId>aliyun-sdk-oss</artifactId> + </dependency> + + </dependencies> + +</project> diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/cache/CacheAround.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/cache/CacheAround.java new file mode 100644 index 0000000..be36f44 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/cache/CacheAround.java @@ -0,0 +1,119 @@ +package com.passManage.us.core.cache; + +import com.alibaba.fastjson.JSON; +import com.passManage.us.core.cache.redis.RedisUtil; +import com.passManage.us.core.utils.StringUtil; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.lang.reflect.Method; + +/** + * 缓存切面 + * @author www.magicalcoder.com + * 2018-4-4 + */ +@Aspect +@Component +@Slf4j +public class CacheAround implements InitializingBean { + @Resource + private RedisUtil redisUtil; + + public static String buildKey(String targetClassName, String targetMethodName, Object ... args){ + StringBuilder cacheKey = new StringBuilder(); + if(StringUtil.isNotBlank(targetClassName)){ + cacheKey.append(targetClassName); + } + if(StringUtil.isNotBlank(targetMethodName)){ + cacheKey.append(".").append(targetMethodName); + } + cacheKey.append("("); + if(args!=null && args.length>0){ + cacheKey.append(JSON.toJSONString(args)); + } + cacheKey.append(")"); + return cacheKey.toString()+""; + } + + //凡是方法上有此注解的将被拦截 + @Around("@annotation(com.passManage.us.core.cache.CacheParam)") + public Object around(ProceedingJoinPoint pj) throws Throwable{ + //目标方法名称 + MethodSignature signature = (MethodSignature)pj.getSignature(); + String targetMethodName = signature.getName(); + //目标类名称 + Class clazz = pj.getTarget().getClass(); + String targetClassName = clazz.getName(); + //目标方法参数 + Object[] args=pj.getArgs(); + //获取实现类方法 + Method method = clazz.getMethod(signature.getName(),signature.getParameterTypes()); + Class<?> returnType = method.getReturnType(); + CacheParam cacheParam = method.getAnnotation(CacheParam.class); + int expireSecond = cacheParam.expireSecond(); + if(expireSecond<=0){//没有设置缓存 设置缓存错误 + return pj.proceed();//直接执行完方法返回 + }else{ + String cacheKey = cacheParam.prefix(); + if(StringUtil.isBlank(cacheKey)){ + cacheKey= buildKey(targetClassName, targetMethodName, args); + }else { + cacheKey = buildKey(cacheParam.prefix(),null,args); + } + return dealCache(pj, cacheKey, expireSecond,returnType); + } + } + + private Object dealCache(ProceedingJoinPoint pj, String cacheKey, int expireSecond,Class<?> clazz){ + Object cacheObj; + boolean cacheServerException=false; + try{ + cacheObj = redisUtil.getObj(cacheKey,clazz); + if(cacheObj!=null){ +// log.debug("get data from cache key="+cacheKey); + return cacheObj; + } + }catch(Exception e){ + e.printStackTrace(); +// log.error("缓存服务器异常..."); + cacheServerException=true; + } + Object returnObject=null; + //直接调用目标方法 + try { + if(!cacheServerException){ + //Integer 缓存范围 -128,127 则返回同一个对象 所以基于此特性 尽可能实现多锁 最大并发255 +// Integer lockObj = cacheKey.hashCode() % 128;//-127,127 hashcode可能为负数 +// synchronized(lockObj){// lockObj不能用 如果开源jar中随便锁一个int 这里就被锁了 忽略锁吧 加锁性能更差 +// log.debug(cacheKey+"进入锁" + lockObj); + /*cacheObj = redisUtil.getObj(cacheKey,clazz); + if(cacheObj!=null){ +// log.debug(cacheKey+"退出锁-取缓存"+lockObj); + return cacheObj; + }*/ + returnObject = pj.proceed(); + redisUtil.setexObj(cacheKey, expireSecond, returnObject); +// log.debug(cacheKey+"退出锁"+lockObj); +// } + }else { + returnObject=pj.proceed(); + } + } catch (Throwable e) { + e.printStackTrace(); + } + return returnObject; + } + + @Override + public void afterPropertiesSet() { + + } + +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/cache/CacheDeleteAround.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/cache/CacheDeleteAround.java new file mode 100644 index 0000000..7378fe6 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/cache/CacheDeleteAround.java @@ -0,0 +1,114 @@ +package com.passManage.us.core.cache; + +import com.passManage.us.core.cache.redis.RedisUtil; +import com.passManage.us.core.utils.StringUtil; +import lombok.extern.slf4j.Slf4j; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.aspectj.lang.reflect.MethodSignature; +import org.springframework.beans.factory.InitializingBean; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.lang.reflect.Method; +import java.util.UUID; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.Condition; +import java.util.concurrent.locks.ReentrantLock; + +/** + * 缓存删除切面 + * @author www.magicalcoder.com + * 2018-6-29 + */ +@Aspect +@Component +@Slf4j +public class CacheDeleteAround implements InitializingBean { + @Resource + private RedisUtil redisUtil; + + //凡是方法上有此注解的将被拦截 + @Around("@annotation(com.passManage.us.core.cache.CacheDeleteParam)") + public Object around(ProceedingJoinPoint pj) throws Throwable{ + //目标方法名称 + MethodSignature signature = (MethodSignature)pj.getSignature(); + String targetMethodName = signature.getName(); + //目标类名称 + Class clazz = pj.getTarget().getClass(); + String targetClassName = clazz.getName(); + //目标方法参数 + Object[] args=pj.getArgs(); + //得到被CacheParam注解的方法名称 + String[] arr = findCacheParamTargetMethodName(clazz,targetMethodName,signature.getParameterTypes()); + String cacheParamKey = CacheKeyUtil.buildKey(arr[0],targetClassName,arr[1],args); + + String uuid = UUID.randomUUID().toString(); + String lockCacheKey = CacheKeyUtil.buildLockCacheKey(cacheParamKey); + ReentrantLock lock = new ReentrantLock(); + Condition condition = lock.newCondition(); + try { + lock.lock(); + while (!redisUtil.tryDistributeLock(lockCacheKey,uuid,2000)){//不必担心cpu100% +// log.debug(Thread.currentThread().getName()+"获取锁失败等待200ms"); + condition.await(200, TimeUnit.MILLISECONDS); +// log.debug(Thread.currentThread().getName()+"继续重新获取锁"); + } +// log.debug(Thread.currentThread().getName()+"获取锁成功准备删除缓存"); + redisUtil.del(cacheParamKey); +// log.debug(Thread.currentThread().getName()+"准备退出锁"); + }finally { + redisUtil.releaseDistributeLock(lockCacheKey,uuid); + lock.unlock(); + } + + return null; + } + + private String[] findCacheParamTargetMethodName(Class<?> tClass,String targetMethodName,Class[] paramTypes){ + char[] methodNames = targetMethodName.toCharArray(); + int len = 0; + for(char m:methodNames){ + if(m >= 'A' && m <= 'Z'){//找到第一个驼峰式大写字母 + break; + } + len++; + } + String cacheParamTargetMethodName; + if(len == 0){ + throw new RuntimeException("CacheDeleteParam注解的方法名称不符合规范:方法首字母不能大写-参考xxxMethod"); + }else if(len == methodNames.length){ + throw new RuntimeException("CacheDeleteParam注解的方法名称不符合规范:未出现驼峰式大写字母-参考xxxMethod"); + }else { + char[] cacheParamTargetMethodNames = new char[methodNames.length-len]; + System.arraycopy(methodNames,len,cacheParamTargetMethodNames,0,cacheParamTargetMethodNames.length); + //首字母小写 + cacheParamTargetMethodNames[0] = (char)(cacheParamTargetMethodNames[0] + 32); + cacheParamTargetMethodName = new String(cacheParamTargetMethodNames); + } + if(StringUtil.isBlank(cacheParamTargetMethodName)){ + throw new RuntimeException("CacheDeleteParam注解的方法名称未找到对应CacheParam注解的方法:null"); + } + String prefix = null; + try { + Method method = tClass.getMethod(cacheParamTargetMethodName,paramTypes); + CacheParam cacheParam = method.getAnnotation(CacheParam.class); + if(cacheParam==null){ + log.info(cacheParamTargetMethodName+"未找到@CacheParam注解"); + }else { + prefix = cacheParam.prefix(); + } + } catch (NoSuchMethodException e) { + e.printStackTrace(); + throw new RuntimeException("CacheDeleteParam注解的方法名称未映射到对应CacheParam注解的方法:请检查"+tClass.getName()+"."+cacheParamTargetMethodName+"是否存在"); + } + return new String[]{prefix,cacheParamTargetMethodName}; + } + + @Override + public void afterPropertiesSet() { + + } + +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/cache/CacheDeleteParam.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/cache/CacheDeleteParam.java new file mode 100644 index 0000000..d4cd6c1 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/cache/CacheDeleteParam.java @@ -0,0 +1,17 @@ +package com.passManage.us.core.cache; + +import java.lang.annotation.*; + +/** + * author: www.magicalcoder.com + * date:2018/4/4 + * function: + * 缓存自动清理注解 + * 使用方法:在@service的方法前加入接口 + * 被注解的方法名称规则:xxx+必须是跟要清除的CacheParam同类下 CacheParam注解的方法首字母大写(入参一致) + */ +@Target(ElementType.METHOD)//放在方法前面的注解 也要 放在 类CLASS 属性FIELD上的 +@Retention(RetentionPolicy.RUNTIME)// 注解会在class字节码文件中存在,在运行时可以通过反射获取到 +@Documented//该注解将被保护在javadoc中 +public @interface CacheDeleteParam { +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/cache/CacheKeyUtil.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/cache/CacheKeyUtil.java new file mode 100644 index 0000000..7a511b6 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/cache/CacheKeyUtil.java @@ -0,0 +1,42 @@ +package com.passManage.us.core.cache; + +import com.alibaba.fastjson.JSON; +import com.passManage.us.core.utils.StringUtil; + +/** + * author: www.magicalcoder.com + * date:2018/6/29 + * function: + */ +class CacheKeyUtil { + + protected static String buildKey(String prefix,String targetClassName, String targetMethodName, Object ... args){ + String cacheKey = prefix; + if(StringUtil.isBlank(cacheKey)){ + cacheKey= CacheKeyUtil.buildKey(targetClassName, targetMethodName, args); + }else { + cacheKey = CacheKeyUtil.buildKey(prefix,null,args); + } + return cacheKey; + } + + private static String buildKey(String targetClassName, String targetMethodName, Object ... args){ + StringBuilder cacheKey = new StringBuilder(); + if(StringUtil.isNotBlank(targetClassName)){ + cacheKey.append(targetClassName); + } + if(StringUtil.isNotBlank(targetMethodName)){ + cacheKey.append(".").append(targetMethodName); + } + cacheKey.append("("); + if(args!=null && args.length>0){ + cacheKey.append(JSON.toJSONString(args)); + } + cacheKey.append(")"); + return cacheKey.toString()+""; + } + + protected static String buildLockCacheKey(String cacheKey){ + return "_lock"+ cacheKey; + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/cache/CacheParam.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/cache/CacheParam.java new file mode 100644 index 0000000..3415813 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/cache/CacheParam.java @@ -0,0 +1,21 @@ +package com.passManage.us.core.cache; + +import java.lang.annotation.*; + +/** + * author: www.magicalcoder.com + * date:2018/4/4 + * function: + * 缓存注解 + * 使用方法:在@service的方法前加入接口 + * 注意:1 仅支持普通类的返回 不支持方法Object Map类型返回 + */ +@Target(ElementType.METHOD)//放在方法前面的注解 也要 放在 类CLASS 属性FIELD上的 +@Retention(RetentionPolicy.RUNTIME)// 注解会在class字节码文件中存在,在运行时可以通过反射获取到 +@Documented//该注解将被保护在javadoc中 +public @interface CacheParam { + //缓存前缀 如果设置了前缀则缓存key由自定义前缀+参数 否则采取类路径+方法+参数 比较长 + String prefix() default ""; + //失效时间 秒单位 + int expireSecond(); +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/cache/redis/RedisClusterDefinedUtil.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/cache/redis/RedisClusterDefinedUtil.java new file mode 100644 index 0000000..7e62b49 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/cache/redis/RedisClusterDefinedUtil.java @@ -0,0 +1,372 @@ +package com.passManage.us.core.cache.redis; + +import com.passManage.us.core.protobuf.ProtostuffUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import redis.clients.jedis.JedisCluster; + +import java.io.UnsupportedEncodingException; +import java.util.*; + +/** + * 集群模式下的redis 默认是不开启的 + * + * @author dyhe2 + * @date 2018-8-28 + * 集群单机都支持 过度完将删除RedisDefinedUtil 统一使用集群模式 + */ +//@Component +public class RedisClusterDefinedUtil { + +// @Autowired + private JedisCluster jedisCluster; + + //包装key + private String wrapKey(String keyPrefix, String key) { + return new StringBuilder(keyPrefix).append(key).toString(); + } + + /** + * 设置key-value对 + * + * @param key + * @param value + */ + public boolean set(String keyPrefix, String key, String value) { + jedisCluster.set(wrapKey(keyPrefix, key), value); + return true; + } + + + /** + * 设置key-value对,并设置过期时间(单位:s) + * + * @param key + * @param value + * @param seconds + */ + public boolean setEx(String keyPrefix, String key, String value, int seconds) { + jedisCluster.setex(wrapKey(keyPrefix, key), seconds, value); + return true; + } + + /** + * 根据key查询value + * + * @param key + * @return + */ + public String get(String keyPrefix, String key) { + return jedisCluster.get(wrapKey(keyPrefix, key)); + } + + /** + * 删除key-value对 + * + * @param key + */ + public void del(String keyPrefix, String key) { + jedisCluster.del(wrapKey(keyPrefix, key)); + } + + /** + * 对key对应的值减一 + * + * @param key + * @return + */ + public long decr(String keyPrefix, String key) { + return jedisCluster.decr(wrapKey(keyPrefix, key)); + } + + /** + * 对key对应的值减num + * + * @param key + * @return + */ + public long decrBy(String keyPrefix, String key, long num) { + return jedisCluster.decrBy(wrapKey(keyPrefix, key), num); + } + + /** + * 对key对应的值加num + * + * @param key + * @return + */ + public long incrBy(String keyPrefix, String key, long num) { + return jedisCluster.incrBy(wrapKey(keyPrefix, key), num); + } + + /** + * @param key + * @return Map<String , String> + * @throws + * @Title: hGetAll + * @Description: 获取redis hash结构对应key的值 + */ + public Map<String, String> hgetAll(String keyPrefix, String key) { + return jedisCluster.hgetAll(wrapKey(keyPrefix, key)); + } + + /** + * @param key + * @param field + * @param value + * @return + * @throws + * @Title: hSet + * @Description: 存入redis hash结构 + */ + public void hset(String keyPrefix, String key, String field, String value) { + jedisCluster.hset(wrapKey(keyPrefix, key), field, value); + } + + /** + * @param key + * @param field + * @return String value + * @throws + * @Title: hGet + * @Description: 获取对应hash下key的数据 + */ + public String hget(String keyPrefix, String key, String field) { + String value = jedisCluster.hget(wrapKey(keyPrefix, key), field); + return value; + } + + /** + * @param key + * @param fields + * @return + * @throws + * @Title: hDel + * @Description: redis hash结构删除key下对应field的值 + */ + public void hdel(String keyPrefix, String key, String... fields) { + key = wrapKey(keyPrefix, key); + if (fields.length == 0) { + jedisCluster.hdel(key); + } else { + for (String field : fields) { + jedisCluster.hdel(key, field); + } + } + } + + /** + * @param key + * @param field + * @return boolean + * @throws + * @Title: HExists + * @Description: redis hash结构:查看哈希表 key 中,给定域 field 是否存在。 + */ + public boolean hexists(String keyPrefix, String key, String field) { + return jedisCluster.hexists(wrapKey(keyPrefix, key), field); + } + + /** + * @param key + * @return boolean + * @throws + * @Title: HExists + * @Description: redis hash结构:获取所有hash表的field + */ + public Set<String> hkeys(String keyPrefix, String key) { + return jedisCluster.hkeys(wrapKey(keyPrefix, key)); + } + + public Long hincrby(String keyPrefix, String key, String field, Long count) { + return jedisCluster.hincrBy(wrapKey(keyPrefix, key), field, count); + } + + /** + * Set集合添加数据 + * + * @param key + * @param val + */ + public void sadd(String keyPrefix, String key, String val) { + jedisCluster.sadd(wrapKey(keyPrefix, key), val); + } + + /** + * 设置 + * + * @param key + * @param val + * @return + */ + public Long setnx(String keyPrefix, String key, String val) { + try { + return jedisCluster.setnx(wrapKey(keyPrefix, key), val); + } catch (Exception e) { + return 0l; + } + } + + /** + * 设置过期时间 + * + * @param key + * @param sec + */ + public void expire(String keyPrefix, String key, int sec) { + jedisCluster.expire(wrapKey(keyPrefix, key), sec); + } + + /** + * 把java对象存入redis + * + * @param key + * @param obj + * @param expireSecond 过期时间 + * @param <T> + * @author hedy + */ + public <T> void setexObj(String keyPrefix, String key, int expireSecond, T obj) { + key = wrapKey(keyPrefix, key); + try { + if (obj == null) { + jedisCluster.del(key); + return; + } + byte[] bytes = ProtostuffUtil.serialize(obj);//序列化 + jedisCluster.setex(key.getBytes("UTF-8"), expireSecond, bytes); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + } + + /** + * 从redis获取java对象 + * + * @param key + * @param tClass + * @param <T> + * @return + */ + public <T> T getObj(String keyPrefix, String key, Class<T> tClass) { + try { + byte[] bytes = jedisCluster.get(wrapKey(keyPrefix, key).getBytes("UTF-8")); + if (bytes != null) { + return ProtostuffUtil.deserialize(bytes);//序列化 + } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + return null; + } + + /** + * 是否存在key + * + * @param key + * @return + */ + public boolean exist(String keyPrefix, String key) { + return jedisCluster.exists(wrapKey(keyPrefix, key)); + } + + /** + * redis简单分布式锁 最主要是一个命令执行 + * + * @param key + * @param uuid UUID.randomUUID().toString() 解锁使用 + * @param milliTime 毫秒 + * @return + */ + public boolean tryDistributeLock(String keyPrefix, String key, String uuid, int milliTime) { + String result = jedisCluster.set(wrapKey(keyPrefix, key), uuid, "NX", "PX", milliTime); + if ("OK".equals(result)) { + return true; + } + return false; + } + + /** + * 释放锁 + * + * @param key + * @param uuid + * @return + */ + public void releaseDistributeLock(String keyPrefix, String key, String uuid) { + String redisScript = "if redis.call('get', KEYS[1]) == ARGV[1] then redis.call('del', KEYS[1]) end"; + jedisCluster.eval(redisScript, Collections.singletonList(wrapKey(keyPrefix, key)), Collections.singletonList(uuid)); + } + + /** + * 获取指定键对应所有值的集合 + * + * @param key + * @return + */ + public Set getValSet(String keyPrefix, String key) { + Set<String> valueSet = jedisCluster.smembers(wrapKey(keyPrefix, key)); + return valueSet; + } + + /** + * 获取指定键及对应条数值的集合 + * + * @param key + * @param count + * @return + */ + public List<String> srandmber(String keyPrefix, String key, int count) { + List<String> valueSet = jedisCluster.srandmember(wrapKey(keyPrefix, key), count); + return valueSet; + } + + + /** + * 移除集合中的成员 + * + * @param key + * @param value + * @return + */ + public void removeMem(String keyPrefix, String key, String value) { + jedisCluster.srem(wrapKey(keyPrefix, key), value); + } + + /** + * 在制定expireSeconds时间内 key自增的最大 + * redis 执行lua脚本竟然不支持 >= <= 所以要改成> 或 == 或< 分开判断 + * + * @param key + * @param expireSeconds + * @param maxTime + * @return + */ + public boolean tryIncr(String keyPrefix, String key, int expireSeconds, int maxTime) { + StringBuilder redisScript = new StringBuilder("local current;"); + redisScript.append(" current = redis.call('incr',KEYS[1]); "); + redisScript.append(" local curNo = tonumber(current);"); + redisScript.append(" local maxTime = tonumber(ARGV[2]);"); + redisScript.append(" if curNo > 1 then "); + redisScript.append(" if curNo < maxTime then "); + redisScript.append(" return 2; "); + redisScript.append(" elseif curNo == maxTime then "); + redisScript.append(" return 3; "); + redisScript.append(" else "); + redisScript.append(" return -1; ");//超标 + redisScript.append(" end "); + redisScript.append(" else"); + redisScript.append(" redis.call('expire',KEYS[1],ARGV[1]); "); + redisScript.append(" return 1; "); + redisScript.append(" end "); + List<String> args = new ArrayList<>(2); + args.add(String.valueOf(expireSeconds)); + args.add(String.valueOf(maxTime)); + Object ret = jedisCluster.eval(redisScript.toString(), Collections.singletonList(wrapKey(keyPrefix, key)), args); + Integer value = Integer.valueOf(ret.toString()); + if (value < 0) { + return false; + } + return true; + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/cache/redis/RedisDefinedUtil.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/cache/redis/RedisDefinedUtil.java new file mode 100644 index 0000000..ccfe16c --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/cache/redis/RedisDefinedUtil.java @@ -0,0 +1,525 @@ +package com.passManage.us.core.cache.redis; + +import com.passManage.us.core.protobuf.ProtostuffUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import redis.clients.jedis.Jedis; +import redis.clients.jedis.JedisPool; + +import java.io.UnsupportedEncodingException; +import java.util.*; + +/** + * redis工具类 + * 单机模式下的redis + * @author www.magicalcoder.com + * @date 2017-12-21 + */ +@Component +public class RedisDefinedUtil { + + @Autowired + private JedisPool jedisPool; + + //包装key + private String wrapKey(String keyPrefix,String key){ + return new StringBuilder(keyPrefix).append(key).toString(); + } + + /** + * 设置key-value对 + * + * @param key + * @param value + */ + public boolean set(String keyPrefix,String key, String value) { + Jedis jedis = null; + try { + jedis = jedisPool.getResource(); + jedis.set(wrapKey(keyPrefix,key), value); + return true; + } finally { + // 返还到连接池 + closeJedis(jedis); + } + } + + + /** + * 设置key-value对,并设置过期时间(单位:s) + * + * @param key + * @param value + * @param seconds + */ + public boolean setEx(String keyPrefix,String key, String value, int seconds) { + Jedis jedis = null; + try { + jedis = jedisPool.getResource(); + jedis.setex(wrapKey(keyPrefix,key), seconds, value); + return true; + } finally { + // 返还到连接池 + closeJedis(jedis); + } + } + + /** + * 根据key查询value + * + * @param key + * @return + */ + public String get(String keyPrefix,String key) { + Jedis jedis = null; + try { + jedis = jedisPool.getResource(); + return jedis.get(wrapKey(keyPrefix,key)); + } finally { + // 返还到连接池 + closeJedis(jedis); + } + } + + /** + * 删除key-value对 + * + * @param key + */ + public void del(String keyPrefix,String key) { + Jedis jedis = null; + try { + jedis = jedisPool.getResource(); + jedis.del(wrapKey(keyPrefix,key)); + } finally { + // 返还到连接池 + closeJedis(jedis); + } + } + + /** + * 对key对应的值减一 + * + * @param key + * @return + */ + public long decr(String keyPrefix,String key) { + Jedis jedis = null; + try { + jedis = jedisPool.getResource(); + return jedis.decr(wrapKey(keyPrefix,key)); + } finally { + // 返还到连接池 + closeJedis(jedis); + } + } + + /** + * 对key对应的值减num + * + * @param key + * @return + */ + public long decrBy(String keyPrefix,String key, long num) { + Jedis jedis = null; + try { + jedis = jedisPool.getResource(); + return jedis.decrBy(wrapKey(keyPrefix,key), num); + } finally { + // 返还到连接池 + closeJedis(jedis); + } + } + + /** + * 对key对应的值加num + * + * @param key + * @return + */ + public long incrBy(String keyPrefix,String key, long num) { + Jedis jedis = null; + try { + jedis = jedisPool.getResource(); + return jedis.incrBy(wrapKey(keyPrefix,key), num); + } finally { + // 返还到连接池 + closeJedis(jedis); + } + } + /** + * @Title: hGetAll + * @Description: 获取redis hash结构对应key的值 + * @param key + * @return Map<String,String> + * @throws + */ + public Map<String,String> hgetAll(String keyPrefix,String key) { + Jedis jedis = null; + try { + jedis = jedisPool.getResource(); + return jedis.hgetAll(wrapKey(keyPrefix,key)); + } finally { + // 返还到连接池 + closeJedis(jedis); + } + } + /** + * @Title: hSet + * @Description: 存入redis hash结构 + * @param key + * @param field + * @param value + * @return + * @throws + */ + public void hset(String keyPrefix,String key, String field, String value) { + Jedis jedis = null; + try { + jedis = jedisPool.getResource(); + jedis.hset(wrapKey(keyPrefix,key), field, value); + } finally { + // 返还到连接池 + closeJedis(jedis); + } + } + + /** + * @Title: hGet + * @Description: 获取对应hash下key的数据 + * @param key + * @param field + * @return String value + * @throws + */ + public String hget(String keyPrefix,String key, String field){ + Jedis jedis = null; + try{ + jedis = jedisPool.getResource(); + String value = jedis.hget(wrapKey(keyPrefix,key), field); + return value; + }finally { + closeJedis(jedis); + } + } + + /** + * @Title: hDel + * @Description: redis hash结构删除key下对应field的值 + * @param key + * @param fields + * @return + * @throws + */ + public void hdel(String keyPrefix,String key, String... fields){ + Jedis jedis = null; + key = wrapKey(keyPrefix,key); + try{ + jedis = jedisPool.getResource(); + if(fields.length == 0){ + jedis.hdel(key); + }else { + for (String field : fields) { + jedis.hdel(key, field); + } + } + }finally { + closeJedis(jedis); + } + } + + /** + * @Title: HExists + * @Description: redis hash结构:查看哈希表 key 中,给定域 field 是否存在。 + * @param key + * @param field + * @return boolean + * @throws + */ + public boolean hexists(String keyPrefix,String key, String field){ + Jedis jedis = null; + try{ + jedis = jedisPool.getResource(); + return jedis.hexists(wrapKey(keyPrefix,key), field); + }finally { + closeJedis(jedis); + } + } + + /** + * @Title: HExists + * @Description: redis hash结构:获取所有hash表的field + * @param key + * @return boolean + * @throws + */ + public Set<String> hkeys(String keyPrefix,String key){ + Jedis jedis = null; + try{ + jedis = jedisPool.getResource(); + return jedis.hkeys(wrapKey(keyPrefix,key)); + }finally { + closeJedis(jedis); + } + } + + public Long hincrby(String keyPrefix,String key, String field, Long count){ + Jedis jedis = null; + try{ + jedis = jedisPool.getResource(); + return jedis.hincrBy(wrapKey(keyPrefix,key), field, count); + }finally { + closeJedis(jedis); + } + } + + /** + * Set集合添加数据 + * @param key + * @param val + */ + public void sadd(String keyPrefix,String key, String val) { + Jedis jedis = null; + try{ + jedis = jedisPool.getResource(); + jedis.sadd(wrapKey(keyPrefix,key), val); + }finally { + closeJedis(jedis); + } + } + + /** + * 设置 + * @param key + * @param val + * @return + */ + public Long setnx(String keyPrefix,String key, String val) { + Jedis jedis = null; + try{ + jedis = jedisPool.getResource(); + return jedis.setnx(wrapKey(keyPrefix,key), val); + } catch (Exception e) { + return 0L; + } finally { + closeJedis(jedis); + } + } + + /** + * 设置过期时间 + * @param key + * @param sec + */ + public void expire(String keyPrefix,String key, int sec) { + Jedis jedis = null; + try{ + jedis = jedisPool.getResource(); + jedis.expire(wrapKey(keyPrefix,key), sec); + }finally { + closeJedis(jedis); + } + } + private void closeJedis(Jedis jedis){ + if(jedis != null){ + jedis.close(); + } + } + + /** + * 把java对象存入redis + * @author www.magicalcoder.com + * @param key + * @param obj + * @param expireSecond 过期时间 + * @param <T> + */ + public <T> void setexObj(String keyPrefix,String key,int expireSecond,T obj){ + Jedis jedis = null; + key = wrapKey(keyPrefix,key); + try{ + jedis = jedisPool.getResource(); + if(obj == null){ + jedis.del(key); + return; + } + byte[] bytes = ProtostuffUtil.serialize(obj);//序列化 + jedis.setex(key.getBytes("UTF-8"),expireSecond,bytes); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } finally { + closeJedis(jedis); + } + } + + /** + * 从redis获取java对象 + * @param key + * @param tClass + * @param <T> + * @return + */ + public <T> T getObj(String keyPrefix,String key,Class<T> tClass){ + Jedis jedis = null; + try{ + jedis = jedisPool.getResource(); + byte[] bytes = jedis.get(wrapKey(keyPrefix,key).getBytes("UTF-8")); + if(bytes!=null){ + return ProtostuffUtil.deserialize(bytes);//序列化 + } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } finally { + closeJedis(jedis); + } + return null; + } + + /** + * 是否存在key + * @param key + * @return + */ + public boolean exist(String keyPrefix,String key){ + Jedis jedis = null; + try{ + jedis = jedisPool.getResource(); + return jedis.exists(wrapKey(keyPrefix,key)); + } finally { + closeJedis(jedis); + } + } + + /** + * redis简单分布式锁 最主要是一个命令执行 + * @param key + * @param uuid UUID.randomUUID().toString() 解锁使用 + * @param milliTime 毫秒 + * @return + */ + public boolean tryDistributeLock(String keyPrefix,String key, String uuid, int milliTime){ + Jedis jedis = null; + try{ + jedis = jedisPool.getResource(); + String result = jedis.set(wrapKey(keyPrefix,key),uuid,"NX","PX",milliTime); +// System.out.println(jedis.ttl(key)); +// jedis.expire(key,10); +// System.out.println(jedis.ttl(key)); + if ("OK".equals(result)) { + return true; + } + } finally { + closeJedis(jedis); + } + return false; + } + + /** + * 释放锁 + * @param key + * @param uuid + * @return + */ + public void releaseDistributeLock(String keyPrefix,String key,String uuid){ + Jedis jedis = null; + try{ + jedis = jedisPool.getResource(); + String redisScript = "if redis.call('get', KEYS[1]) == ARGV[1] then redis.call('del', KEYS[1]) end"; + jedis.eval(redisScript,Collections.singletonList(wrapKey(keyPrefix,key)),Collections.singletonList(uuid)); + } finally { + closeJedis(jedis); + } + } + + /** + * 获取指定键对应所有值的集合 + * @param key + * @return + */ + public Set getValSet(String keyPrefix,String key){ + Jedis jedis = null; + try { + jedis = jedisPool.getResource(); + Set<String> valueSet = jedis.smembers(wrapKey(keyPrefix,key)); + return valueSet; + }finally { + closeJedis(jedis); + } + } + /** + * 获取指定键及对应条数值的集合 + * @param key + * @param count + * @return + */ + public List<String> srandmber(String keyPrefix,String key,int count){ + Jedis jedis = null; + try { + jedis = jedisPool.getResource(); + List<String> valueSet = jedis.srandmember(wrapKey(keyPrefix,key),count); + return valueSet; + }finally { + closeJedis(jedis); + } + } + + + /** + * 移除集合中的成员 + * @param key + * @param value + * @return + */ + public void removeMem(String keyPrefix,String key,String value){ + Jedis jedis = null; + try { + jedis = jedisPool.getResource(); + jedis.srem(wrapKey(keyPrefix,key),value); + }finally { + closeJedis(jedis); + } + } + + /** + * 在制定expireSeconds时间内 key自增的最大 + * redis 执行lua脚本竟然不支持 >= <= 所以要改成> 或 == 或< 分开判断 + * @param key + * @param expireSeconds + * @param maxTime + * @return + */ + public boolean tryIncr(String keyPrefix,String key,int expireSeconds,int maxTime){ + Jedis jedis = null; + try{ + jedis = jedisPool.getResource(); + StringBuilder redisScript = new StringBuilder("local current;"); + redisScript.append(" current = redis.call('incr',KEYS[1]); "); + redisScript.append(" local curNo = tonumber(current);"); + redisScript.append(" local maxTime = tonumber(ARGV[2]);"); + redisScript.append( " if curNo > 1 then "); + redisScript.append( " if curNo < maxTime then "); + redisScript.append( " return 2; "); + redisScript.append( " elseif curNo == maxTime then "); + redisScript.append( " return 3; "); + redisScript.append( " else "); + redisScript.append( " return -1; ");//超标 + redisScript.append( " end "); + redisScript.append( " else"); + redisScript.append(" redis.call('expire',KEYS[1],ARGV[1]); "); + redisScript.append( " return 1; "); + redisScript.append( " end "); + List<String> args = new ArrayList<>(2); + args.add(String.valueOf(expireSeconds)); + args.add(String.valueOf(maxTime)); + Object ret = jedis.eval(redisScript.toString(),Collections.singletonList(wrapKey(keyPrefix,key)),args); + Integer value = Integer.valueOf(ret.toString()); + if(value<0){ + return false; + } + return true; + } finally { + closeJedis(jedis); + } + } + +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/cache/redis/RedisUtil.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/cache/redis/RedisUtil.java new file mode 100644 index 0000000..554040c --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/cache/redis/RedisUtil.java @@ -0,0 +1,289 @@ +package com.passManage.us.core.cache.redis; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * redis工具类 + * + * @author zlyan + * @date 2017-12-21 + */ +@Component +public class RedisUtil extends RedisDefinedUtil{ + + //为每个项目提供一个单独的前缀来区分 如果不填写默认给stentor. + @Value("${spring.redis.keyPrefix:us.}") + private String keyPrefix; + + /** + * 设置key-value对 + * + * @param key + * @param value + */ + public boolean set(String key, String value) { + return super.set(keyPrefix,key,value); + } + + + /** + * 设置key-value对,并设置过期时间(单位:s) + * + * @param key + * @param value + * @param seconds + */ + public boolean setEx(String key, String value, int seconds) { + return super.setEx(keyPrefix,key,value,seconds); + } + + /** + * 根据key查询value + * + * @param key + * @return + */ + public String get(String key) { + return super.get(keyPrefix,key); + } + + /** + * 删除key-value对 + * + * @param key + */ + public void del(String key) { + super.del(keyPrefix,key); + } + + /** + * 对key对应的值减一 + * + * @param key + * @return + */ + public long decr(String key) { + return super.decr(keyPrefix,key); + } + + /** + * 对key对应的值减num + * + * @param key + * @return + */ + public long decrBy(String key, long num) { + return super.decrBy(keyPrefix,key,num); + } + + /** + * 对key对应的值加num + * + * @param key + * @return + */ + public long incrBy(String key, long num) { + return super.incrBy(keyPrefix,key,num); + } + /** + * @Title: hGetAll + * @Description: 获取redis hash结构对应key的值 + * @param key + * @return Map<String,String> + * @throws + */ + public Map<String,String> hgetAll(String key) { + return super.hgetAll(keyPrefix,key); + } + /** + * @Title: hSet + * @Description: 存入redis hash结构 + * @param key + * @param field + * @param value + * @return + * @throws + */ + public void hset(String key, String field, String value) { + super.hset(keyPrefix,key,field,value); + } + + /** + * @Title: hGet + * @Description: 获取对应hash下key的数据 + * @param key + * @param field + * @return String value + * @throws + */ + public String hget(String key, String field){ + return super.hget(keyPrefix,key,field); + } + + /** + * @Title: hDel + * @Description: redis hash结构删除key下对应field的值 + * @param key + * @param fields + * @return + * @throws + */ + public void hdel(String key, String... fields){ + super.hdel(keyPrefix,key,fields); + } + + /** + * @Title: HExists + * @Description: redis hash结构:查看哈希表 key 中,给定域 field 是否存在。 + * @param key + * @param field + * @return boolean + * @throws + */ + public boolean hexists(String key, String field){ + return super.hexists(keyPrefix,key,field); + } + + /** + * @Title: HExists + * @Description: redis hash结构:获取所有hash表的field + * @param key + * @return boolean + * @throws + */ + public Set<String> hkeys(String key){ + return super.hkeys(keyPrefix,key); + } + + public Long hincrby(String key, String field, Long count){ + return super.hincrby(keyPrefix,key,field,count); + } + + /** + * Set集合添加数据 + * @param key + * @param val + */ + public void sadd(String key, String val) { + super.sadd(keyPrefix,key,val); + } + + /** + * 设置 + * @param key + * @param val + * @return + */ + public Long setnx(String key, String val) { + return super.setnx(keyPrefix,key,val); + } + + /** + * 设置过期时间 + * @param key + * @param sec + */ + public void expire(String key, int sec) { + super.expire(keyPrefix,key,sec); + } + + /** + * 把java对象存入redis + * @author hedy + * @param key + * @param obj + * @param expireSecond 过期时间 + * @param <T> + */ + public <T> void setexObj(String key,int expireSecond,T obj){ + super.setexObj(keyPrefix,key,expireSecond,obj); + } + + /** + * 从redis获取java对象 + * @param key + * @param tClass + * @param <T> + * @return + */ + public <T> T getObj(String key,Class<T> tClass){ + return super.getObj(keyPrefix,key,tClass); + } + + /** + * 是否存在key + * @param key + * @return + */ + public boolean exist(String key){ + return super.exist(keyPrefix,key); + } + + /** + * redis简单分布式锁 最主要是一个命令执行 + * @param key 太多人用userid作为key了 所以千万别用uid 可以加个前缀 + * @param uuid UUID.randomUUID().toString() 解锁使用 + * @param milliTime 毫秒 + * @return + */ + public boolean tryDistributeLock(String key, String uuid, int milliTime){ + return super.tryDistributeLock(keyPrefix,key,uuid,milliTime); + } + + /** + * 释放锁 + * @param key + * @param uuid + * @return + */ + public void releaseDistributeLock(String key,String uuid){ + super.releaseDistributeLock(keyPrefix,key,uuid); + } + + /** + * 获取指定键对应所有值的集合 + * @param key + * @return + */ + public Set getValSet(String key){ + return super.getValSet(keyPrefix,key); + } + /** + * 获取指定键及对应条数值的集合 + * @param key + * @param count + * @return + */ + public List<String> srandmber(String key,int count){ + return super.srandmber(keyPrefix,key,count); + } + + + /** + * 移除集合中的成员 + * @param key + * @param value + * @return + */ + public void removeMem(String key,String value){ + super.removeMem(keyPrefix,key,value); + } + + /** + * 在制定expireSeconds时间内 key自增的最大 + * redis 执行lua脚本竟然不支持 >= <= 所以要改成> 或 == 或< 分开判断 + * @param key + * @param expireSeconds + * @param maxTime + * @return + */ + public boolean tryIncr(String key,int expireSeconds,int maxTime){ + return super.tryIncr(keyPrefix,key,expireSeconds,maxTime); + } + +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/common/constant/PageConstant.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/common/constant/PageConstant.java new file mode 100644 index 0000000..933e85a --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/common/constant/PageConstant.java @@ -0,0 +1,11 @@ +package com.passManage.us.core.common.constant; + +/** + * author:www.magicalcoder.com + * date:2018/8/2 + * function: + */ +public interface PageConstant { + + int MAX_LIMIT = 100; +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/common/constant/SystemOperateEnum.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/common/constant/SystemOperateEnum.java new file mode 100644 index 0000000..ba1fc95 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/common/constant/SystemOperateEnum.java @@ -0,0 +1,6 @@ +package com.passManage.us.core.common.constant; + +public enum SystemOperateEnum { + + WINDOWS,MAC,LINUX +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/common/dto/AjaxData.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/common/dto/AjaxData.java new file mode 100644 index 0000000..ece4b65 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/common/dto/AjaxData.java @@ -0,0 +1,59 @@ +package com.passManage.us.core.common.dto; + +/** + * qq:799374340 + * + * @author hdy 2013-7-15下午5:18:58 + */ +public class AjaxData { + + private String code = "0";// 默认值 + private String message; + private Object result; + private String jsonp; + public AjaxData(String code, String message, Object result) { + this.code = code; + this.message = message; + setResult(result); + } + + public AjaxData(String message, Object result) { + this.message = message; + setResult(result); + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Object getResult() { + return result; + } + + public void setResult(Object result) { + if (result != null) + this.result = result; + } + + public String getJsonp() { + return jsonp; + } + + public void setJsonp(String jsonp) { + this.jsonp = jsonp; + } + + +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/common/dto/GeneratorParam.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/common/dto/GeneratorParam.java new file mode 100644 index 0000000..d0227a7 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/common/dto/GeneratorParam.java @@ -0,0 +1,24 @@ +package com.passManage.us.core.common.dto; + +import java.io.Serializable; + +/** + * qq:799374340 + * @author hdy + * 2013-7-16上午11:43:37 通用参数 + */ +public class GeneratorParam implements Serializable{ + + private static final long serialVersionUID = 1L; + + private String format;//返回值格式化成什么参数 json xml + + public String getFormat() { + return format; + } + + public void setFormat(String format) { + this.format = format; + } + +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/common/dto/InputSelectShowDto.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/common/dto/InputSelectShowDto.java new file mode 100644 index 0000000..d902225 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/common/dto/InputSelectShowDto.java @@ -0,0 +1,35 @@ +package com.passManage.us.core.common.dto; + +/** + * Created by magicalcoder.com.com on 2016/3/16. + */ +public class InputSelectShowDto { + private String selectValue;//下拉展示值 + private Object hiddenId;//隐藏设定值 + + public String getSelectValue() { + return selectValue; + } + + public void setSelectValue(String selectValue) { + this.selectValue = selectValue; + } + + public Object getHiddenId() { + return hiddenId; + } + + public void setHiddenId(Object hiddenId) { + this.hiddenId = hiddenId; + } + + public InputSelectShowDto(String selectValue, Object hiddenId) { + this.selectValue = selectValue; + this.hiddenId = hiddenId; + } + public InputSelectShowDto( Object hiddenId,String selectValue) { + this.selectValue = selectValue; + this.hiddenId = hiddenId; + } + +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/common/dto/JsonData.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/common/dto/JsonData.java new file mode 100644 index 0000000..187c141 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/common/dto/JsonData.java @@ -0,0 +1,128 @@ +package com.passManage.us.core.common.dto; + +/** + * qq:799374340 + * + * @author hdy 2013-7-15下午5:18:58 + */ +public class JsonData { + private Integer code = 0;// 默认值 + private String errorCode;//异常码 + private String message; + private Object info; + private String jsonp; + private String encode; + private boolean writeNull;//是否输出null + public static class Builder{ + private Integer code = 0;// 默认值 + private String errorCode; + private String message; + private Object info; + private String jsonp; + private String encode; + private boolean writeNull; + public Builder(Object info){ + this.info = info; + } + + public Builder code(Integer code){ + this.code = code; + return this; + } + public Builder errorCode(String errorCode){ + this.errorCode = errorCode; + return this; + } + public Builder message(String message){ + this.message = message; + return this; + } + public Builder jsoup(String jsonp){ + this.jsonp = jsonp; + return this; + } + + public Builder encode(String encode){ + this.encode = encode; + return this; + } + public Builder writeNull(boolean writeNull){ + this.writeNull = writeNull; + return this; + } + public JsonData build(){ + return new JsonData(this); + } + } + + public JsonData(Builder builder) { + this.code = builder.code; + this.jsonp = builder.jsonp; + this.errorCode = builder.errorCode; + this.message = builder.message; + this.info = builder.info; + this.encode = builder.encode; + this.writeNull = builder.writeNull; + } + + public String getErrorCode() { + return errorCode; + } + + public void setErrorCode(String errorCode) { + this.errorCode = errorCode; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public Object getInfo() { + return info; + } + + public void setInfo(Object info) { + this.info = info; + } + + public String getJsonp() { + if(jsonp!=null){ + if(jsonp.contains("<") || jsonp.contains(">") || jsonp.contains("&")){ + return jsonp.replace("<","<").replace(">",">").replace("&","&"); + } + } + return jsonp; + } + + public void setJsonp(String jsonp) { + this.jsonp = jsonp; + } + + public String getEncode() { + return encode; + } + + public void setEncode(String encode) { + this.encode = encode; + } + + public boolean isWriteNull() { + return writeNull; + } + + public void setWriteNull(boolean writeNull) { + this.writeNull = writeNull; + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/common/dto/KeyValue.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/common/dto/KeyValue.java new file mode 100644 index 0000000..6406087 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/common/dto/KeyValue.java @@ -0,0 +1,35 @@ +package com.passManage.us.core.common.dto; + +/** + * author: www.magicalcoder.com + * date:2018/4/2 + * function: + */ +public class KeyValue { + public KeyValue() { + } + + private String key; + private String value; + + public KeyValue(String key, String value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public String getValue() { + return value; + } + + public void setKey(String key) { + this.key = key; + } + + public void setValue(String value) { + this.value = value; + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/common/dto/MapDto.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/common/dto/MapDto.java new file mode 100644 index 0000000..17f7c45 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/common/dto/MapDto.java @@ -0,0 +1,30 @@ +package com.passManage.us.core.common.dto; + +/** + * Created by magicalcoder.com.com on 2016/8/4. + */ +public class MapDto { + private String key; + private Object value; + + public MapDto(String key, Object value) { + this.key = key; + this.value = value; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public Object getValue() { + return value; + } + + public void setValue(Object value) { + this.value = value; + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/common/dto/PageDto.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/common/dto/PageDto.java new file mode 100644 index 0000000..8b2c333 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/common/dto/PageDto.java @@ -0,0 +1,49 @@ +package com.passManage.us.core.common.dto; +/** + * qq:799374340 + * @author hdy + * 2013-9-6下午1:07:58 + */ +public class PageDto { + + private int pageSize;//每页大小 + private int pageNumber;//第几页 + private long totalSize;//总条数 + private String orderBy;//排序 + + public PageDto() { + } + + public PageDto(int pageSize, int pageNumber, long totalSize, String orderBy) { + this.pageSize = pageSize; + this.pageNumber = pageNumber; + this.totalSize = totalSize; + this.orderBy = orderBy; + } + + public int getPageSize() { + return pageSize; + } + public void setPageSize(int pageSize) { + this.pageSize = pageSize; + } + public long getTotalSize() { + return totalSize; + } + public void setTotalSize(long totalSize) { + this.totalSize = totalSize; + } + public int getPageNumber() { + return pageNumber; + } + public void setPageNumber(int pageNumber) { + this.pageNumber = pageNumber; + } + public String getOrderBy() { + return orderBy; + } + public void setOrderBy(String orderBy) { + this.orderBy = orderBy; + } + +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/common/dto/PageListDto.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/common/dto/PageListDto.java new file mode 100644 index 0000000..b62bca7 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/common/dto/PageListDto.java @@ -0,0 +1,31 @@ +package com.passManage.us.core.common.dto; + +import java.util.List; + +/** + * qq:799374340 + * @author hdy + * 2013-9-6下午2:26:24 + */ +public class PageListDto { + + private Long totalSize;//总记录数 + private List<?> records;//一页数据 + public PageListDto (Long totalSize,List<?> records){ + this.totalSize = totalSize; + this.records = records; + } + public Long getTotalSize() { + return totalSize; + } + public void setTotalSize(Long totalSize) { + this.totalSize = totalSize; + } + public List<?> getRecords() { + return records; + } + public void setRecords(List<?> records) { + this.records = records; + } + +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/common/dto/Select2ShowDto.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/common/dto/Select2ShowDto.java new file mode 100644 index 0000000..804c04d --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/common/dto/Select2ShowDto.java @@ -0,0 +1,33 @@ +package com.passManage.us.core.common.dto; + +/** + * Created by magicalcoder.com.com on 2017/2/26. + */ +public class Select2ShowDto { + private String text;//下拉展示值 + private Object id;//隐藏设定值 + + public Select2ShowDto() { + } + + public Select2ShowDto(Object id, String text) { + this.text = text; + this.id = id; + } + + public String getText() { + return text; + } + + public void setText(String text) { + this.text = text; + } + + public Object getId() { + return id; + } + + public void setId(Object id) { + this.id = id; + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/common/exception/BusinessException.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/common/exception/BusinessException.java new file mode 100644 index 0000000..56b1f4b --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/common/exception/BusinessException.java @@ -0,0 +1,58 @@ +package com.passManage.us.core.common.exception; + + +import com.passManage.us.core.serialize.KeyValuePair; +import com.passManage.us.core.utils.StringUtil; + +/** + * 业务异常 直接抛 + */ +public class BusinessException extends RuntimeException { + + private static final long serialVersionUID = 1L; + /** + * 错误代码 + */ + private int errorCode = -1; + private String desc; + + /** + * 业务异常 直接抛出 不用再一层层代码返回处理了 + * @param keyValuePair + */ + public BusinessException(KeyValuePair keyValuePair){ + super(""); + if(keyValuePair!=null){ + this.errorCode = keyValuePair.getKey(); + if(StringUtil.isBlank(keyValuePair.getDescr())){ + desc = keyValuePair.getValue(); + }else { + desc = keyValuePair.getDescr(); + } + } + } + + public int getErrorCode() { + return this.errorCode; + } + + public String getDesc() { + return desc; + } + + /** + * 异常堆栈增加错误代码和绑定变量 + */ + public String toString() { + StringBuffer sb = new StringBuffer(); + sb.append("业务异常[").append(this.errorCode).append("]"); + sb.append(this.desc); +// sb.append(super.toString()); + return sb.toString(); + } + + @Override + public String getMessage() { + return toString(); + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/common/file/FileHelper.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/common/file/FileHelper.java new file mode 100644 index 0000000..4037e8f --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/common/file/FileHelper.java @@ -0,0 +1,305 @@ +package com.passManage.us.core.common.file; + +import java.io.*; +import java.net.MalformedURLException; +import java.net.URL; +import java.util.ArrayList; +import java.util.List; + +/** + * Created by www.magicalcoder.com on 14-3-27. + * 799374340@qq.com + */ +public class FileHelper { + /*原样读取文件*/ + public static String fastReadAllLineFile(File file,String charType){ + try{ + if(file.exists()){ + FileInputStream fis = new FileInputStream(file); + InputStreamReader inr = new InputStreamReader(fis,charType); + BufferedReader br = new BufferedReader(inr); + //每行内容 + String lineStr=""; + StringBuilder sb = new StringBuilder(); + while((lineStr=br.readLine())!=null){ + sb.append(lineStr).append("\n"); + } + br.close(); + inr.close(); + fis.close(); + return sb.toString(); + } + }catch(Exception e){ + e.printStackTrace(); + } + return null; + } + /*精简读取文件*/ + public static String fastReadFile(File file,String charType){ + try{ + if(file.exists()){ + FileInputStream fis = new FileInputStream(file); + InputStreamReader inr = new InputStreamReader(fis,charType); + BufferedReader br = new BufferedReader(inr); + //每行内容 + String lineStr=""; + StringBuilder sb = new StringBuilder(); + while((lineStr=br.readLine())!=null){ + if(lineStr!=null && !"".equals(lineStr)){ + String str = lineStr.trim(); + sb.append(str); + } + } + br.close(); + inr.close(); + fis.close(); + return sb.toString(); + } + }catch(Exception e){ + e.printStackTrace(); + } + return null; + } + + public static String fastReadFileUTF8(InputStream fis){ + return fastReadFile(fis,"UTF-8"); + } + /*精简读取文件*/ + public static String fastReadFile(InputStream fis,String charType){ + try{ + InputStreamReader inr = new InputStreamReader(fis,charType); + BufferedReader br = new BufferedReader(inr); + //每行内容 + String lineStr=""; + StringBuilder sb = new StringBuilder(); + while((lineStr=br.readLine())!=null){ + if(lineStr!=null && !"".equals(lineStr)){ + String str = lineStr.trim(); + sb.append(str); + } + } + br.close(); + inr.close(); + fis.close(); + return sb.toString(); + }catch(Exception e){ + e.printStackTrace(); + } + return null; + } + + /** + * 快速读文件 + * @param fileSrc + * @param charType 编码 + * @return + */ + public static String fastReadFile(String fileSrc,String charType){ + File file = new File(fileSrc); + return fastReadFile(file,charType); + } + public static String fastReadFileUTF8(File file){ + return fastReadFile(file,"UTF-8"); + } + public static String fastReadFileUTF8(String fileUrl){ + return fastReadFile(fileUrl,"UTF-8"); + } + public static void fastWriteFile(String fileUrl,InputStream fileContent){ + fastWriteFile(new File(fileUrl),fileContent); + } + public static void fastWriteFile(File file,InputStream fileContent){ + //先创建目录 + if (!file.getParentFile().exists()) { + file.getParentFile().mkdirs(); + } + try { + if(!file.exists()){ + file.createNewFile(); + } + + FileOutputStream fos = new FileOutputStream(file); + int c; + while((c=fileContent.read())!=-1) + { + fos.write(c); + } + fos.flush(); + fileContent.close(); + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + public static void fastWriteFile(File file,String fileContent,String charType){ + //先创建目录 + if (!file.getParentFile().exists()) { + file.getParentFile().mkdirs(); + } + try { + if(!file.exists()){ + file.createNewFile(); + } + FileOutputStream fos = new FileOutputStream(file); + OutputStreamWriter osw = new OutputStreamWriter(fos, charType); + BufferedWriter bw = new BufferedWriter(osw); + bw.write(fileContent); + bw.flush(); + bw.close(); + osw.close(); + fos.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + /** + * 写文件 + * @param fileSrc + * @param fileContent + * @param charType 字符集 UTF-8 GBK + */ + public static void fastWriteFile(String fileSrc,String fileContent,String charType){ + File file = new File(fileSrc); + fastWriteFile(file,fileContent,charType); + } + public static void fastWriteFileUTF8(String fileSrc,String fileContent){ + fastWriteFile(fileSrc,fileContent,"UTF-8"); + } + public static void fastWriteFileUTF8(File file,String fileContent){ + fastWriteFile(file, fileContent, "UTF-8"); + } + + public static void main(String[] args) { + File f = new File("C:\\nginx-1.5.11\\html\\rankcache\\"); + File[] fs = f.listFiles(); + long a = System.currentTimeMillis(); + for(File ff:fs){ + String s = fastReadFile(ff,"UTF-8"); + long a1 = System.currentTimeMillis(); +// fastWrite(ff,s); + fastWriteFileUTF8(ff,s); + long a2 = System.currentTimeMillis(); + System.out.println((a2-a1)+"ms"); + } + long b=System.currentTimeMillis(); + System.out.println((b - a) + "ms"); + } + + public static void fastWrite(File f,String content){ + try { + FileWriter fileWriter = new FileWriter(f); + fileWriter.write(content); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + public static void copy(String source,String target){ + try { + copy(new File(source), new File(target)); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static void copy(File source, File target) throws IOException { + if(!source.exists()){ + return; + } + if(!target.exists()){ + if (!target.getParentFile().exists()) { + target.getParentFile().mkdirs(); + } + target.createNewFile(); + } + // 创建文件输入输出流对象 + FileInputStream is = new FileInputStream(source); + FileOutputStream os = new FileOutputStream(target); + // 设定读取的字节数 + int count, n = 512; + byte buffer[] = new byte[n]; + // 读取输入流 + count = is.read(buffer, 0, n); + while (count != -1) { + os.write(buffer, 0, count); + count = is.read(buffer, 0, n); + } + // 关闭输入输出流 + is.close(); + os.close(); + } + + //删除文件或者文件夹下面所有的文件 + public static void deleteAllFiles(File rootFile){ + if(!rootFile.exists()){ + return; + } + if(rootFile.isFile()){ + rootFile.delete(); + return; + } + File[] allFiles = rootFile.listFiles(); + if(allFiles!=null && allFiles.length>0){ + for(File f:allFiles){ + if(f.isDirectory()){ + deleteAllFiles(f); + }else { + f.delete(); + } + } + }else { + rootFile.delete(); + } + } + + /** + * 下载文件 默认按照文件名后缀保存 下载速度很快 比httpclient快很多 + * @param fileUrl 远程地址 + * @param savePath 保存目录 + */ + public static void download(String fileUrl,String savePath){ + try { + String[] parr = fileUrl.split("/"); + String fileName = parr[parr.length - 1]; + URL url = new URL(fileUrl); + DataInputStream dataInputStream = new DataInputStream(url.openStream()); + FileOutputStream fileOutputStream = new FileOutputStream(new File(savePath + fileName)); + byte[] buffer = new byte[1024]; + int length; + while ((length = dataInputStream.read(buffer)) > 0) { + fileOutputStream.write(buffer, 0, length); + } + dataInputStream.close(); + fileOutputStream.close(); + } catch (MalformedURLException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * 寻找该目录下所有文件 + * @param path + * @return + */ + public static List<File> listAllFile(String path){ + List<File> fileList = new ArrayList<>(); + File root = new File(path); + searchFile(fileList,root); + return fileList; + } + private static void searchFile(List<File> fileList,File dir){ + if(dir.isDirectory()){ + File[] files = dir.listFiles(); + if(files!=null && files.length>0){ + for(File file:files){ + searchFile(fileList,file); + } + } + }else { + + fileList.add(dir); + } + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/common/file/FileNioHelper.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/common/file/FileNioHelper.java new file mode 100644 index 0000000..14dd3f1 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/common/file/FileNioHelper.java @@ -0,0 +1,111 @@ +package com.passManage.us.core.common.file; + +import java.io.*; +import java.nio.ByteBuffer; +import java.nio.channels.FileChannel; + +/** + * Created by www.magicalcoder.com on 2015/6/25. + * 799374340@qq.com + * 遇到大文件 这个性能比较快 + */ +public class FileNioHelper { + public static String fastReadFile(String file){ + try { + StringBuffer sb = new StringBuffer(); + RandomAccessFile accessFile = new RandomAccessFile(file,"r"); + FileChannel fileChannel = accessFile.getChannel(); + ByteBuffer byteBuffer = ByteBuffer.allocate(1024*1024); + while (true){ + int readableSize = fileChannel.read(byteBuffer); + if(readableSize == -1){ + break; + } + byte[] contentByte = new byte[readableSize]; + //准备读 + byteBuffer.flip(); + byteBuffer.get(contentByte,0,readableSize); + String result = new String(contentByte); + sb.append(result); + //准备重写 + byteBuffer.clear(); + } + return sb.toString(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + public static String fastReadFile2(String file){ + try { + StringBuffer sb = new StringBuffer(); + FileInputStream fileInputStream = new FileInputStream(file); + FileChannel fileChannel = fileInputStream.getChannel(); + + ByteBuffer byteBuffer = ByteBuffer.allocate(1024*1024); + while (true){ + int readableSize = fileChannel.read(byteBuffer); + if(readableSize == -1){ + break; + } + byte[] contentByte = new byte[readableSize]; + //准备读 + byteBuffer.flip(); + byteBuffer.get(contentByte,0,readableSize); + String result = new String(contentByte); + sb.append(result); + //准备重写 + byteBuffer.clear(); + } + return sb.toString(); + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + return null; + } + public static void fastWrite(String file,String content){ + try { + FileOutputStream fileInputStream = new FileOutputStream(file); + FileChannel fileChannel = fileInputStream.getChannel(); + byte[] bytes = content.getBytes(); + int cacheSize = 1024*1024; + ByteBuffer byteBuffer = ByteBuffer.allocate(cacheSize); + for(int i=0;i<bytes.length;i=i+cacheSize){ + int length = Math.min(cacheSize,bytes.length-i); + byteBuffer.put(bytes,i,length); + byteBuffer.flip(); + fileChannel.write(byteBuffer); + byteBuffer.clear(); + } + } catch (FileNotFoundException e) { + e.printStackTrace(); + } catch (IOException e) { + e.printStackTrace(); + } + } + + public static void main(String[] args) { + String file = "C:\\cn\\nio.txt"; + FileNioHelper nio = new FileNioHelper(); + Long a = System.currentTimeMillis(); +// String content = nio.fastReadFile(file); +// for(int i=0;i<20;i++){ +// FileHelper.fastReadFile(file,"GBK"); +// nio.fastReadFile2(file);//5061 +// nio.fastReadFile(file);//5099 +// } + + StringBuffer sb = new StringBuffer(); + for(int i=0;i<1000000;i++){ + sb.append("1234567890"); + } +// nio.fastWrite(file,sb.toString()); + FileHelper.fastWriteFileUTF8(file,sb.toString()); + + System.out.println(System.currentTimeMillis() - a); + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/http/HttpTest.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/http/HttpTest.java new file mode 100644 index 0000000..5d53045 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/http/HttpTest.java @@ -0,0 +1,21 @@ +package com.passManage.us.core.http; + +import java.util.HashMap; +import java.util.Map; + +/** + * author: hedy + * date:2018/4/27 + * function: + */ +public class HttpTest { + public static void main(String[] args) { + Map<String,String[]> reqMap = new HashMap<>(); +// reqMap.put("hi",new String[]{"1","2"}); + reqMap.put("haha",new String[]{"1"}); + String reqUrl = "http://www?d=1&d=3&"; +// System.out.println(getUrl(reqUrl,reqMap)); + } + + +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/http/callback/OkNoSyncCallback.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/http/callback/OkNoSyncCallback.java new file mode 100644 index 0000000..19c11f0 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/http/callback/OkNoSyncCallback.java @@ -0,0 +1,16 @@ +package com.passManage.us.core.http.callback; + + +import com.passManage.us.core.http.dto.ReqReturn; + +/** + * author:hedy + * date:2019/1/22 + * function: + */ +public interface OkNoSyncCallback { + //请求成功 + void onResponse(ReqReturn reqReturn); + //请求失败 + void onFailure(); +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/http/constant/HttpClientConstant.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/http/constant/HttpClientConstant.java new file mode 100644 index 0000000..1f5122a --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/http/constant/HttpClientConstant.java @@ -0,0 +1,21 @@ +package com.passManage.us.core.http.constant; + + +/** + * Created by hzhedongyu on 2015/10/20. + */ +public interface HttpClientConstant { + String GET = "get"; + String POST = "post"; + String GET_OR_POST = "get_or_post"; + String MULTIPART_POST="multipart_post"; + + + String ENCODE_UTF8="UTF-8"; + String ENCODE_GBK="GBK"; + + String REQUEST_HEADER_NAME_COOKIE = "cookie"; + String RESPONSE_HEADER_NAME_SET_COOKIE="set-cookie"; + String RESPONSE_HEADER_NAME_TRANSFER_ENCODING="transfer-encoding"; + String RESPONSE_HEADER_NAME_CONTENT_TYPE="content-type"; +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/http/dto/ReqHeader.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/http/dto/ReqHeader.java new file mode 100644 index 0000000..c8bdfe2 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/http/dto/ReqHeader.java @@ -0,0 +1,38 @@ +package com.passManage.us.core.http.dto; + +import java.util.Map; + +/** + * Created by hzhedongyu on 2015/10/14. + */ +public class ReqHeader { + private Integer timeOut; + + private String encode; + + private Map<String,String> headerMap; + + public Integer getTimeOut() { + return timeOut; + } + + public void setTimeOut(Integer timeOut) { + this.timeOut = timeOut; + } + + public Map<String, String> getHeaderMap() { + return headerMap; + } + + public void setHeaderMap(Map<String, String> headerMap) { + this.headerMap = headerMap; + } + + public String getEncode() { + return encode; + } + + public void setEncode(String encode) { + this.encode = encode; + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/http/dto/ReqReturn.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/http/dto/ReqReturn.java new file mode 100644 index 0000000..699fbc0 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/http/dto/ReqReturn.java @@ -0,0 +1,48 @@ +package com.passManage.us.core.http.dto; + +import okhttp3.Headers; + +import java.io.Serializable; + +/** + * Created by hzhedongyu on 2015/10/14. + */ +public class ReqReturn implements Serializable{ + private boolean success; + private String status; + private String body; + private Headers headers; + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public String getBody() { + return body; + } + + public void setBody(String body) { + this.body = body; + } + + public Headers getHeaders() { + return headers; + } + + public void setHeaders(Headers headers) { + this.headers = headers; + } + + public boolean isSuccess() { + return success; + } + + public void setSuccess(boolean success) { + this.success = success; + } + +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/http/dto/ResHeader.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/http/dto/ResHeader.java new file mode 100644 index 0000000..8321570 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/http/dto/ResHeader.java @@ -0,0 +1,11 @@ +package com.passManage.us.core.http.dto; + +/** + * Created by hzhedongyu on 2015/10/14. + */ +public class ResHeader { + + private String contentType; + + +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/http/enums/HttpKey.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/http/enums/HttpKey.java new file mode 100644 index 0000000..91741f3 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/http/enums/HttpKey.java @@ -0,0 +1,8 @@ +package com.passManage.us.core.http.enums; + +/** + * Created by hzhedongyu on 2015/10/14. + */ +public enum HttpKey { + TIMEOUT +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/http/factory/OkHttpClientFacroty.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/http/factory/OkHttpClientFacroty.java new file mode 100644 index 0000000..5270dbd --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/http/factory/OkHttpClientFacroty.java @@ -0,0 +1,36 @@ +package com.passManage.us.core.http.factory; + +import com.passManage.us.core.http.constant.HttpClientConstant; +import com.passManage.us.core.http.utils.HttpClientGet; +import com.passManage.us.core.http.utils.HttpClientMultipartPost; +import com.passManage.us.core.http.utils.HttpClientPost; +import com.passManage.us.core.http.utils.IHttpClient; + +/** + * Created by hzhedongyu on 2015/10/14. + * 构造基础请求类 + * httpclient 会出现死锁问题 抛弃使用 改OKHttp + */ +public class OkHttpClientFacroty { + + public static IHttpClient create(String method){ + String lowerMethod = method.toLowerCase(); + if(HttpClientConstant.POST.equals(lowerMethod)){ + return HttpClientPost.get(); + }else if(HttpClientConstant.MULTIPART_POST.endsWith(lowerMethod)){ + return HttpClientMultipartPost.get(); + }else{ + return HttpClientGet.get(); + } + } + + public static IHttpClient createPost(){ + return create(HttpClientConstant.POST); + } + public static IHttpClient createGet(){ + return create(HttpClientConstant.GET); + } + public static IHttpClient createMultipartPost(){ + return create(HttpClientConstant.MULTIPART_POST); + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/http/utils/HttpClientGet.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/http/utils/HttpClientGet.java new file mode 100644 index 0000000..a8081e8 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/http/utils/HttpClientGet.java @@ -0,0 +1,197 @@ +package com.passManage.us.core.http.utils; + +import com.passManage.us.core.http.callback.OkNoSyncCallback; +import com.passManage.us.core.http.dto.ReqHeader; +import com.passManage.us.core.http.dto.ReqReturn; +import javafx.application.Platform; +import okhttp3.Call; +import okhttp3.Callback; +import okhttp3.Request; +import okhttp3.Response; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.util.Map; +import java.util.Set; + +/** + * Created by hzhedongyu on 2015/10/14. + */ +public class HttpClientGet implements IHttpClient { + + private static final HttpClientGet instance = new HttpClientGet(); + private HttpClientGet(){ + } + + public static void main(String[] args) { + + } + + public static HttpClientGet get(){ + return instance; + } + + + @Override + public ReqReturn requestByJson(String reqUrl, String jsonReq) { + throw new RuntimeException("get 不支持"); + } + + @Override + public ReqReturn requestByJson(String reqUrl, String jsonReq, ReqHeader reqHeader) { + throw new RuntimeException("get 不支持"); + } + + @Override + public ReqReturn request(String reqUrl) { + return request(reqUrl, null, null,null); + } + + @Override + public ReqReturn request(String reqUrl, Map<String, String[]> reqMap) { + return request(reqUrl, reqMap, null,null); + } + + @Override + public ReqReturn request(String reqUrl, Map<String, String[]> reqMap, ReqHeader reqHeader) { + return request(reqUrl,reqMap,null,reqHeader); + } + + private static String getUrl(String reqUrl, Map<String, String[]> reqMap){ + StringBuffer dataURL = new StringBuffer(reqUrl); + StringBuffer extraParam = new StringBuffer(); + String[] arr = reqUrl.split("\\?"); + if(arr.length==1){ + extraParam.append("?"); + }else if(arr.length == 2){ + if(!arr[1].endsWith("&")){ + extraParam.append("&"); + } + }else { + throw new RuntimeException("url格式不正确“?”分隔符超过2个"); + } + + if(reqMap!=null && !reqMap.isEmpty()){ + Set<String> keys = reqMap.keySet(); + for(String key:keys){ + String[] value = reqMap.get(key); + for (String v:value){ + extraParam.append(key).append("=").append(v).append("&"); + } + } + } + if(extraParam.toString().endsWith("&")){ + extraParam.deleteCharAt(extraParam.length()-1); + } + return dataURL.append(extraParam).toString(); + } + + @Override + public ReqReturn request(String reqUrl, Map<String, String[]> reqMap, Map<String, File> fileMap, ReqHeader reqHeader) { + ReqReturn reqReturn = new ReqReturn(); + Request.Builder builder = new Request.Builder() + .url(getUrl(reqUrl,reqMap)); + if(reqHeader!=null){ + Map<String,String> headerMap = reqHeader.getHeaderMap(); + if(headerMap!=null && !headerMap.isEmpty()){ + Set<String> keys = headerMap.keySet(); + for(String key:keys){ + builder.addHeader(key,headerMap.get(key)); + } + } + } + try { + Call call = InitUtil.getOkHttpClient().newCall(builder.build()); + Response response = call.execute();//执行 + reqReturn.setStatus(response.code()+""); + reqReturn.setSuccess(response.isSuccessful()); + reqReturn.setBody(response.body().string()); + reqReturn.setHeaders(response.headers()); + }catch (SocketTimeoutException e){ + e.printStackTrace(); + } + catch (Exception e) { + e.printStackTrace(); + } + return reqReturn; + } + + @Override + public void noSyncRequestByJson(String reqUrl, String jsonReq, OkNoSyncCallback callback) { + throw new RuntimeException("get 不支持"); + } + + @Override + public void noSyncRequestByJson(String reqUrl, String jsonReq, ReqHeader reqHeader, OkNoSyncCallback callback) { + throw new RuntimeException("get 不支持"); + } + + @Override + public void noSyncRequest(String reqUrl, OkNoSyncCallback callback) { + noSyncRequest(reqUrl, null, null,null, callback); + } + + @Override + public void noSyncRequest(String reqUrl, Map<String, String[]> reqMap, OkNoSyncCallback callback) { + noSyncRequest(reqUrl, reqMap, null,null, callback); + } + + @Override + public void noSyncRequest(String reqUrl, Map<String, String[]> reqMap, ReqHeader reqHeader, OkNoSyncCallback callback) { + noSyncRequest(reqUrl, reqMap, null,reqHeader, callback); + } + + @Override + public void noSyncRequest(String reqUrl, Map<String, String[]> reqMap, Map<String, File> fileMap, ReqHeader reqHeader, OkNoSyncCallback callback) { + Request.Builder builder = new Request.Builder() + .url(getUrl(reqUrl,reqMap)); + if(reqHeader!=null){ + Map<String,String> headerMap = reqHeader.getHeaderMap(); + if(headerMap!=null && !headerMap.isEmpty()){ + Set<String> keys = headerMap.keySet(); + for(String key:keys){ + builder.addHeader(key,headerMap.get(key)); + } + } + } + try { + Call call = InitUtil.getOkHttpClient().newCall(builder.build()); + call.enqueue(new Callback() { + @Override + public void onFailure(Call call, IOException e) { + callback.onFailure(); + e.printStackTrace(); + } + @Override + public void onResponse(Call call, Response response) throws IOException { + ReqReturn reqReturn = new ReqReturn(); + reqReturn.setStatus(response.code()+""); + reqReturn.setSuccess(response.isSuccessful()); + reqReturn.setBody(response.body().string()); + reqReturn.setHeaders(response.headers()); + Platform.runLater(() -> {//这里一般是更新主线程操作 必须用线程 否则会提示非主线程 + callback.onResponse(reqReturn); + }); + } + }); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void noSyncSimpleRequest(String reqUrl, Map<String, String> reqMap, OkNoSyncCallback callback) { + noSyncRequest(reqUrl,InitUtil.coverMap(reqMap),callback); + } + + @Override + public void noSyncSimpleRequest(String reqUrl, Map<String, String> reqMap, ReqHeader reqHeader, OkNoSyncCallback callback) { + noSyncRequest(reqUrl,InitUtil.coverMap(reqMap),reqHeader,callback); + } + + @Override + public void noSyncSimpleRequest(String reqUrl, Map<String, String> reqMap, Map<String, File> fileMap, ReqHeader reqHeader, OkNoSyncCallback callback) { + noSyncRequest(reqUrl,InitUtil.coverMap(reqMap),fileMap,reqHeader,callback); + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/http/utils/HttpClientMultipartPost.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/http/utils/HttpClientMultipartPost.java new file mode 100644 index 0000000..f0dc4d2 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/http/utils/HttpClientMultipartPost.java @@ -0,0 +1,108 @@ +package com.passManage.us.core.http.utils; + +import com.passManage.us.core.http.callback.OkNoSyncCallback; +import com.passManage.us.core.http.dto.ReqHeader; +import com.passManage.us.core.http.dto.ReqReturn; + +import java.io.File; +import java.util.Map; +import java.util.UUID; + +/** + * multipart post 有文件上传的表单 + * Created by hzhedongyu on 2015/10/14. + */ +public class HttpClientMultipartPost implements IHttpClient { + + private static final HttpClientMultipartPost instance = new HttpClientMultipartPost(); + private HttpClientMultipartPost(){ + + } + + public static HttpClientMultipartPost get(){ + return instance; + } + + public static void main(String[] args) { + System.out.println(UUID.randomUUID().toString()); + /* Map<String,File> fileMap = new HashMap<String, File>(); + fileMap.put("myfiles",new File("D:\\myfile\\signcheck-0.0.7.jar")); + ReqReturn reqReturn =HttpClientMultipartPost.get().request("http://localhost/tianyu/center/fileupload/business", null, fileMap, null); + System.out.println(reqReturn.getBody());*/ + } + + @Override + public ReqReturn requestByJson(String reqUrl, String jsonReq) { + return null; + } + + @Override + public ReqReturn requestByJson(String reqUrl, String jsonReq, ReqHeader reqHeader) { + return null; + } + + @Override + public ReqReturn request(String reqUrl) { + return null; + } + + @Override + public ReqReturn request(String reqUrl, Map<String, String[]> reqMap) { + return null; + } + + @Override + public ReqReturn request(String reqUrl, Map<String, String[]> reqMap, ReqHeader reqHeader) { + return null; + } + + @Override + public ReqReturn request(String reqUrl, Map<String, String[]> reqMap, Map<String, File> fileMap, ReqHeader reqHeader) { + + return null; + } + + @Override + public void noSyncRequestByJson(String reqUrl, String jsonReq, OkNoSyncCallback callback) { + + } + + @Override + public void noSyncRequestByJson(String reqUrl, String jsonReq, ReqHeader reqHeader, OkNoSyncCallback callback) { + + } + + @Override + public void noSyncRequest(String reqUrl, OkNoSyncCallback callback) { + + } + + @Override + public void noSyncRequest(String reqUrl, Map<String, String[]> reqMap, OkNoSyncCallback callback) { + + } + + @Override + public void noSyncRequest(String reqUrl, Map<String, String[]> reqMap, ReqHeader reqHeader, OkNoSyncCallback callback) { + + } + + @Override + public void noSyncRequest(String reqUrl, Map<String, String[]> reqMap, Map<String, File> fileMap, ReqHeader reqHeader, OkNoSyncCallback callback) { + + } + @Override + public void noSyncSimpleRequest(String reqUrl, Map<String, String> reqMap, OkNoSyncCallback callback) { + noSyncRequest(reqUrl,InitUtil.coverMap(reqMap),callback); + } + + @Override + public void noSyncSimpleRequest(String reqUrl, Map<String, String> reqMap, ReqHeader reqHeader, OkNoSyncCallback callback) { + noSyncRequest(reqUrl,InitUtil.coverMap(reqMap),reqHeader,callback); + } + + @Override + public void noSyncSimpleRequest(String reqUrl, Map<String, String> reqMap, Map<String, File> fileMap, ReqHeader reqHeader, OkNoSyncCallback callback) { + noSyncRequest(reqUrl,InitUtil.coverMap(reqMap),fileMap,reqHeader,callback); + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/http/utils/HttpClientPost.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/http/utils/HttpClientPost.java new file mode 100644 index 0000000..ef5b6cf --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/http/utils/HttpClientPost.java @@ -0,0 +1,238 @@ +package com.passManage.us.core.http.utils; + +import com.passManage.us.core.http.callback.OkNoSyncCallback; +import com.passManage.us.core.http.dto.ReqHeader; +import com.passManage.us.core.http.dto.ReqReturn; +import javafx.application.Platform; +import okhttp3.*; + +import java.io.File; +import java.io.IOException; +import java.net.SocketTimeoutException; +import java.util.Map; +import java.util.Set; + +/** + * Created by hzhedongyu on 2015/10/14. + */ +public class HttpClientPost implements IHttpClient { + public static final MediaType JSON + = MediaType.get("application/json; charset=utf-8"); + private static final HttpClientPost instance = new HttpClientPost(); + private HttpClientPost(){ + + } + + public static HttpClientPost get(){ + return instance; + } + + @Override + public ReqReturn requestByJson(String reqUrl, String jsonReq) { + return requestByJson(reqUrl,jsonReq,null); + } + @Override + public ReqReturn requestByJson(String reqUrl, String jsonReq, ReqHeader reqHeader) { + RequestBody body = RequestBody.create(JSON, jsonReq); + ReqReturn reqReturn = new ReqReturn(); + Request request = new Request.Builder() + .url(reqUrl) + .post(body) + .build(); + try { + Call call = InitUtil.getOkHttpClient().newCall(request); + Response response = call.execute();//执行 + reqReturn.setStatus(response.code()+""); + reqReturn.setSuccess(response.isSuccessful()); + reqReturn.setBody(response.body().string()); + reqReturn.setHeaders(response.headers()); + }catch (SocketTimeoutException e){ + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + return reqReturn; + } + + @Override + public ReqReturn request(String reqUrl) { + return request(reqUrl,null,null,null); + } + + @Override + public ReqReturn request(String reqUrl, Map<String, String[]> reqMap) { + return request(reqUrl,reqMap,null,null); + } + + @Override + public ReqReturn request(String reqUrl, Map<String, String[]> reqMap, ReqHeader reqHeader) { + return request(reqUrl,reqMap,null,reqHeader); + } + + @Override + public ReqReturn request(String reqUrl, Map<String, String[]> reqMap, Map<String, File> fileMap, ReqHeader reqHeader) { + ReqReturn reqReturn = new ReqReturn(); + FormBody.Builder bodyBuilder = new FormBody.Builder(); + if(reqMap!=null && !reqMap.isEmpty()){ + Set<String> keys = reqMap.keySet(); + for(String key:keys){ + String[] value = reqMap.get(key); + for (String v:value){ + bodyBuilder.add(key,v); + } + } + } + Request.Builder builder = new Request.Builder() + .url(reqUrl) + .post(bodyBuilder.build()); + if(reqHeader!=null){ + Map<String,String> headerMap = reqHeader.getHeaderMap(); + if(headerMap!=null && !headerMap.isEmpty()){ + Set<String> keys = headerMap.keySet(); + for(String key:keys){ + builder.addHeader(key,headerMap.get(key)); + } + } + } + try { + Call call = InitUtil.getOkHttpClient().newCall(builder.build()); + Response response = call.execute();//执行 + reqReturn.setStatus(response.code()+""); + reqReturn.setSuccess(response.isSuccessful()); + reqReturn.setBody(response.body().string()); + reqReturn.setHeaders(response.headers()); + }catch (SocketTimeoutException e){ + e.printStackTrace(); + } catch (Exception e) { + e.printStackTrace(); + } + return reqReturn; + } + + @Override + public void noSyncRequestByJson(String reqUrl, String jsonReq, OkNoSyncCallback callback) { + throw new RuntimeException("get 不支持"); + } + + @Override + public void noSyncRequestByJson(String reqUrl, String jsonReq, ReqHeader reqHeader, OkNoSyncCallback callback) { + RequestBody body = RequestBody.create(JSON, jsonReq); + ReqReturn reqReturn = new ReqReturn(); + Request.Builder builder = new Request.Builder() + .url(reqUrl) + .post(body); + if(reqHeader!=null){ + Map<String,String> headerMap = reqHeader.getHeaderMap(); + if(headerMap!=null && !headerMap.isEmpty()){ + Set<String> keys = headerMap.keySet(); + for(String key:keys){ + builder.addHeader(key,headerMap.get(key)); + } + } + } + try { + Call call = InitUtil.getOkHttpClient().newCall(builder.build()); + call.enqueue(new Callback() { + @Override + public void onFailure(Call call, IOException e) { + callback.onFailure(); + e.printStackTrace(); + } + + @Override + public void onResponse(Call call, Response response) throws IOException { + reqReturn.setStatus(response.code()+""); + reqReturn.setSuccess(response.isSuccessful()); + reqReturn.setBody(response.body().string()); + reqReturn.setHeaders(response.headers()); + Platform.runLater(() -> {//这里一般是更新主线程操作 必须用线程 否则会提示非主线程 + callback.onResponse(reqReturn); + }); + } + }); + + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void noSyncRequest(String reqUrl, OkNoSyncCallback callback) { + noSyncRequest(reqUrl, null, null,null, callback); + } + + @Override + public void noSyncRequest(String reqUrl, Map<String, String[]> reqMap, OkNoSyncCallback callback) { + noSyncRequest(reqUrl, reqMap, null,null, callback); + } + + @Override + public void noSyncRequest(String reqUrl, Map<String, String[]> reqMap, ReqHeader reqHeader, OkNoSyncCallback callback) { + noSyncRequest(reqUrl, reqMap, null,reqHeader, callback); + } + + @Override + public void noSyncRequest(String reqUrl, Map<String, String[]> reqMap, Map<String, File> fileMap, ReqHeader reqHeader, OkNoSyncCallback callback) { + FormBody.Builder bodyBuilder = new FormBody.Builder(); + if(reqMap!=null && !reqMap.isEmpty()){ + Set<String> keys = reqMap.keySet(); + for(String key:keys){ + String[] value = reqMap.get(key); + for (String v:value){ + bodyBuilder.add(key,v); + } + } + } + Request.Builder builder = new Request.Builder() + .url(reqUrl) + .post(bodyBuilder.build()); + if(reqHeader!=null){ + Map<String,String> headerMap = reqHeader.getHeaderMap(); + if(headerMap!=null && !headerMap.isEmpty()){ + Set<String> keys = headerMap.keySet(); + for(String key:keys){ + builder.addHeader(key,headerMap.get(key)); + } + } + } + try { + Call call = InitUtil.getOkHttpClient().newCall(builder.build()); + call.enqueue(new Callback() { + @Override + public void onFailure(Call call, IOException e) { + callback.onFailure(); + e.printStackTrace(); + } + + @Override + public void onResponse(Call call, Response response) throws IOException { + ReqReturn reqReturn = new ReqReturn(); + reqReturn.setStatus(response.code()+""); + reqReturn.setSuccess(response.isSuccessful()); + reqReturn.setBody(response.body().string()); + reqReturn.setHeaders(response.headers()); + Platform.runLater(() -> {//这里一般是更新主线程操作 必须用线程 否则会提示非主线程 + callback.onResponse(reqReturn); + }); + } + }); + } catch (Exception e) { + e.printStackTrace(); + } + } + + @Override + public void noSyncSimpleRequest(String reqUrl, Map<String, String> reqMap, OkNoSyncCallback callback) { + noSyncRequest(reqUrl,InitUtil.coverMap(reqMap),callback); + } + + @Override + public void noSyncSimpleRequest(String reqUrl, Map<String, String> reqMap, ReqHeader reqHeader, OkNoSyncCallback callback) { + noSyncRequest(reqUrl,InitUtil.coverMap(reqMap),reqHeader,callback); + } + + @Override + public void noSyncSimpleRequest(String reqUrl, Map<String, String> reqMap, Map<String, File> fileMap, ReqHeader reqHeader, OkNoSyncCallback callback) { + noSyncRequest(reqUrl,InitUtil.coverMap(reqMap),fileMap,reqHeader,callback); + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/http/utils/IHttpClient.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/http/utils/IHttpClient.java new file mode 100644 index 0000000..70572bb --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/http/utils/IHttpClient.java @@ -0,0 +1,35 @@ +package com.passManage.us.core.http.utils; + + +import com.passManage.us.core.http.callback.OkNoSyncCallback; +import com.passManage.us.core.http.dto.ReqHeader; +import com.passManage.us.core.http.dto.ReqReturn; + +import java.io.File; +import java.util.Map; + +/** + * Created by hzhedongyu on 2015/10/14. + */ +public interface IHttpClient { + //同步请求 + ReqReturn requestByJson(String reqUrl, String jsonReq); + ReqReturn requestByJson(String reqUrl, String jsonReq, ReqHeader reqHeader); + ReqReturn request(String reqUrl); + ReqReturn request(String reqUrl, Map<String, String[]> reqMap); + ReqReturn request(String reqUrl, Map<String, String[]> reqMap, ReqHeader reqHeader); + ReqReturn request(String reqUrl, Map<String, String[]> reqMap, Map<String, File> fileMap, ReqHeader reqHeader); + + //异步请求 + void noSyncRequestByJson(String reqUrl, String jsonReq, OkNoSyncCallback callback); + void noSyncRequestByJson(String reqUrl, String jsonReq, ReqHeader reqHeader, OkNoSyncCallback callback); + void noSyncRequest(String reqUrl, OkNoSyncCallback callback); + void noSyncRequest(String reqUrl, Map<String, String[]> reqMap, OkNoSyncCallback callback); + void noSyncRequest(String reqUrl, Map<String, String[]> reqMap, ReqHeader reqHeader, OkNoSyncCallback callback); + void noSyncRequest(String reqUrl, Map<String, String[]> reqMap, Map<String, File> fileMap, ReqHeader reqHeader, OkNoSyncCallback callback); + + //异步请求 + void noSyncSimpleRequest(String reqUrl, Map<String, String> reqMap, OkNoSyncCallback callback); + void noSyncSimpleRequest(String reqUrl, Map<String, String> reqMap, ReqHeader reqHeader, OkNoSyncCallback callback); + void noSyncSimpleRequest(String reqUrl, Map<String, String> reqMap, Map<String, File> fileMap, ReqHeader reqHeader, OkNoSyncCallback callback); +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/http/utils/InitUtil.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/http/utils/InitUtil.java new file mode 100644 index 0000000..8d24f18 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/http/utils/InitUtil.java @@ -0,0 +1,115 @@ +package com.passManage.us.core.http.utils; + +import com.passManage.us.core.http.dto.ReqHeader; +import com.passManage.us.core.http.dto.ReqReturn; +import com.passManage.us.core.utils.StringUtil; +import okhttp3.OkHttpClient; + +import javax.net.ssl.*; +import java.util.HashMap; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.TimeUnit; + +public class InitUtil { + private static volatile OkHttpClient okHttpClient; + + public static OkHttpClient getOkHttpClient(){ + if(okHttpClient == null){ + synchronized (InitUtil.class){ + if(okHttpClient == null){ + okHttpClient = getUnsafeOkHttpClient(); + } + } + } + return okHttpClient; + } + + /** + * 获取OkHttpClient + * + * @return OkHttpClient + */ + private static OkHttpClient getUnsafeOkHttpClient() { + long timeOut = 30; + try { + final TrustManager[] trustAllCerts = new TrustManager[]{ + new X509TrustManager() { + @Override + public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) { + } + + @Override + public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) { + } + + @Override + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + return new java.security.cert.X509Certificate[]{}; + } + } + }; + + final SSLContext sslContext = SSLContext.getInstance("SSL"); + sslContext.init(null, trustAllCerts, new java.security.SecureRandom()); + final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); + OkHttpClient.Builder builder = new OkHttpClient.Builder(); + builder.sslSocketFactory(sslSocketFactory); + + builder.hostnameVerifier(new HostnameVerifier() { + @Override + public boolean verify(String hostname, SSLSession session) { + return true; + } + }); + + return builder.connectTimeout(timeOut, TimeUnit.SECONDS).readTimeout(timeOut,TimeUnit.SECONDS).writeTimeout(timeOut,TimeUnit.SECONDS).build(); + } catch (Exception e) { + throw new RuntimeException(e); + } + + } + public static ReqHeader initReqHeader(ReqHeader reqHeader){ + if(reqHeader==null){ + reqHeader=new ReqHeader(); + } + if(reqHeader.getTimeOut()==null){ + reqHeader.setTimeOut(5000); + } + if(StringUtil.isBlank(reqHeader.getEncode())){ + reqHeader.setEncode("UTF-8"); + } + if(reqHeader.getHeaderMap()==null){ + reqHeader.setHeaderMap(new HashMap<String, String>()); + } + return reqHeader; + } + + public static boolean success200(ReqReturn reqReturn){ + return "200".equals(reqReturn.getStatus()); + } + + + public static Map<String, String[]> coverMap(Map<String, String> simpleQueryMap){ + Map<String, String[]> queryMap = new HashMap<>(); + if(simpleQueryMap!=null && !simpleQueryMap.isEmpty()){ + Set<String> keys = simpleQueryMap.keySet(); + for(String key:keys){ + queryMap.put(key,new String[]{simpleQueryMap.get(key)}); + } + } + return queryMap; + } + public static Map<String, String[]> coverObjMap(Map<String, Object> simpleQueryMap){ + Map<String, String[]> queryMap = new HashMap<>(); + if(simpleQueryMap!=null && !simpleQueryMap.isEmpty()){ + Set<String> keys = simpleQueryMap.keySet(); + for(String key:keys){ + if(simpleQueryMap.get(key)!=null){ + queryMap.put(key,new String[]{simpleQueryMap.get(key).toString()}); + } + } + } + return queryMap; + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/identifyingcode/CreateIdentifyingCode.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/identifyingcode/CreateIdentifyingCode.java new file mode 100644 index 0000000..3addaee --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/identifyingcode/CreateIdentifyingCode.java @@ -0,0 +1,157 @@ +package com.passManage.us.core.identifyingcode; + +import org.springframework.stereotype.Component; + +import javax.imageio.ImageIO; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.awt.*; +import java.awt.image.BufferedImage; +import java.io.IOException; +import java.util.Random; + +/** + * Created by www.magicalcoder.com on 2015/8/5. + * 799374340@qq.com + */ +@Component +public class CreateIdentifyingCode { + + public static final int WIDTH = 120;//生成的图片的宽度 + public static final int HEIGHT = 36;//生成的图片的高度 + + //接收客户端传递的createTypeFlag标识 + public String create( HttpServletResponse response) throws IOException { + //1.在内存中创建一张图片 + BufferedImage bi = new BufferedImage(WIDTH, HEIGHT,BufferedImage.TYPE_INT_RGB); + //2.得到图片 + Graphics g = bi.getGraphics(); + //3.设置图片的背影色 + setBackGround(g); + //4.设置图片的边框 + setBorder(g); + //5.在图片上画干扰线 + drawRandomLine(g); + //6.写在图片上随机数 + String random = drawRandomNum((Graphics2D) g,IdentifyingCodeConstant.NUMBER_ENGLISH);//根据客户端传递的createTypeFlag标识生成验证码图片 + //8.设置响应头通知浏览器以图片的形式打开 + response.setContentType("image/jpeg");//等同于response.setHeader("Content-Type", "image/jpeg"); + //9.设置响应头控制浏览器不要缓存 + response.setDateHeader("expries", -1); + response.setHeader("Cache-Control", "no-cache"); + response.setHeader("Pragma", "no-cache"); + //10.将图片写给浏览器 + ImageIO.write(bi, "jpg", response.getOutputStream()); + return random; + } + + /** + * 设置图片的背景色 + * @param g + */ + private void setBackGround(Graphics g) { + // 设置颜色 + g.setColor(Color.WHITE); + // 填充区域 + g.fillRect(0, 0, WIDTH, HEIGHT); + } + + /** + * 设置图片的边框 + * @param g + */ + private void setBorder(Graphics g) { + // 设置边框颜色 + g.setColor(Color.GRAY); + // 边框区域 + g.drawRect(1, 1, WIDTH - 2, HEIGHT - 2); + } + + /** + * 在图片上画随机线条 + * @param g + */ + private void drawRandomLine(Graphics g) { + // 设置颜色 + g.setColor(Color.GRAY); + // 设置线条个数并画线 + for (int i = 0; i < 5; i++) { + int x1 = new Random().nextInt(WIDTH); + int y1 = new Random().nextInt(HEIGHT); + int x2 = new Random().nextInt(WIDTH); + int y2 = new Random().nextInt(HEIGHT); + g.drawLine(x1, y1, x2, y2); + } + } + + /** + * 画随机字符 + * @param g + * @param createTypeFlag + * @return + * String... createTypeFlag是可变参数, + * Java1.5增加了新特性:可变参数:适用于参数个数不确定,类型确定的情况,java把可变参数当做数组处理。注意:可变参数必须位于最后一项 + */ + private String drawRandomNum(Graphics2D g,String... createTypeFlag) { + // 设置颜色 + g.setColor(Color.RED); + // 设置字体 + g.setFont(new Font("宋体", Font.BOLD, 20)); + //常用的中国汉字 + String baseChineseChar = "\u7684\u4e00\u4e86\u662f\u6211\u4e0d\u5728\u4eba\u4eec\u6709\u6765\u4ed6\u8fd9\u4e0a\u7740\u4e2a\u5730\u5230\u5927\u91cc\u8bf4\u5c31\u53bb\u5b50\u5f97\u4e5f\u548c\u90a3\u8981\u4e0b\u770b\u5929\u65f6\u8fc7\u51fa\u5c0f\u4e48\u8d77\u4f60\u90fd\u628a\u597d\u8fd8\u591a\u6ca1\u4e3a\u53c8\u53ef\u5bb6\u5b66\u53ea\u4ee5\u4e3b\u4f1a\u6837\u5e74\u60f3\u751f\u540c\u8001\u4e2d\u5341\u4ece\u81ea\u9762\u524d\u5934\u9053\u5b83\u540e\u7136\u8d70\u5f88\u50cf\u89c1\u4e24\u7528\u5979\u56fd\u52a8\u8fdb\u6210\u56de\u4ec0\u8fb9\u4f5c\u5bf9\u5f00\u800c\u5df1\u4e9b\u73b0\u5c71\u6c11\u5019\u7ecf\u53d1\u5de5\u5411\u4e8b\u547d\u7ed9\u957f\u6c34\u51e0\u4e49\u4e09\u58f0\u4e8e\u9ad8\u624b\u77e5\u7406\u773c\u5fd7\u70b9\u5fc3\u6218\u4e8c\u95ee\u4f46\u8eab\u65b9\u5b9e\u5403\u505a\u53eb\u5f53\u4f4f\u542c\u9769\u6253\u5462\u771f\u5168\u624d\u56db\u5df2\u6240\u654c\u4e4b\u6700\u5149\u4ea7\u60c5\u8def\u5206\u603b\u6761\u767d\u8bdd\u4e1c\u5e2d\u6b21\u4eb2\u5982\u88ab\u82b1\u53e3\u653e\u513f\u5e38\u6c14\u4e94\u7b2c\u4f7f\u5199\u519b\u5427\u6587\u8fd0\u518d\u679c\u600e\u5b9a\u8bb8\u5feb\u660e\u884c\u56e0\u522b\u98de\u5916\u6811\u7269\u6d3b\u90e8\u95e8\u65e0\u5f80\u8239\u671b\u65b0\u5e26\u961f\u5148\u529b\u5b8c\u5374\u7ad9\u4ee3\u5458\u673a\u66f4\u4e5d\u60a8\u6bcf\u98ce\u7ea7\u8ddf\u7b11\u554a\u5b69\u4e07\u5c11\u76f4\u610f\u591c\u6bd4\u9636\u8fde\u8f66\u91cd\u4fbf\u6597\u9a6c\u54ea\u5316\u592a\u6307\u53d8\u793e\u4f3c\u58eb\u8005\u5e72\u77f3\u6ee1\u65e5\u51b3\u767e\u539f\u62ff\u7fa4\u7a76\u5404\u516d\u672c\u601d\u89e3\u7acb\u6cb3\u6751\u516b\u96be\u65e9\u8bba\u5417\u6839\u5171\u8ba9\u76f8\u7814\u4eca\u5176\u4e66\u5750\u63a5\u5e94\u5173\u4fe1\u89c9\u6b65\u53cd\u5904\u8bb0\u5c06\u5343\u627e\u4e89\u9886\u6216\u5e08\u7ed3\u5757\u8dd1\u8c01\u8349\u8d8a\u5b57\u52a0\u811a\u7d27\u7231\u7b49\u4e60\u9635\u6015\u6708\u9752\u534a\u706b\u6cd5\u9898\u5efa\u8d76\u4f4d\u5531\u6d77\u4e03\u5973\u4efb\u4ef6\u611f\u51c6\u5f20\u56e2\u5c4b\u79bb\u8272\u8138\u7247\u79d1\u5012\u775b\u5229\u4e16\u521a\u4e14\u7531\u9001\u5207\u661f\u5bfc\u665a\u8868\u591f\u6574\u8ba4\u54cd\u96ea\u6d41\u672a\u573a\u8be5\u5e76\u5e95\u6df1\u523b\u5e73\u4f1f\u5fd9\u63d0\u786e\u8fd1\u4eae\u8f7b\u8bb2\u519c\u53e4\u9ed1\u544a\u754c\u62c9\u540d\u5440\u571f\u6e05\u9633\u7167\u529e\u53f2\u6539\u5386\u8f6c\u753b\u9020\u5634\u6b64\u6cbb\u5317\u5fc5\u670d\u96e8\u7a7f\u5185\u8bc6\u9a8c\u4f20\u4e1a\u83dc\u722c\u7761\u5174\u5f62\u91cf\u54b1\u89c2\u82e6\u4f53\u4f17\u901a\u51b2\u5408\u7834\u53cb\u5ea6\u672f\u996d\u516c\u65c1\u623f\u6781\u5357\u67aa\u8bfb\u6c99\u5c81\u7ebf\u91ce\u575a\u7a7a\u6536\u7b97\u81f3\u653f\u57ce\u52b3\u843d\u94b1\u7279\u56f4\u5f1f\u80dc\u6559\u70ed\u5c55\u5305\u6b4c\u7c7b\u6e10\u5f3a\u6570\u4e61\u547c\u6027\u97f3\u7b54\u54e5\u9645\u65e7\u795e\u5ea7\u7ae0\u5e2e\u5566\u53d7\u7cfb\u4ee4\u8df3\u975e\u4f55\u725b\u53d6\u5165\u5cb8\u6562\u6389\u5ffd\u79cd\u88c5\u9876\u6025\u6797\u505c\u606f\u53e5\u533a\u8863\u822c\u62a5\u53f6\u538b\u6162\u53d4\u80cc\u7ec6"; + //数字和字母的组合 + String baseNumLetter = "123456789ABCDEFGHJKLMNPQRSTUVWXYZ"; + //纯数字 + String baseNum = "123456789"; + //纯字母 + String baseLetter = "ABCDEFGHJKLMNPQRSTUVWXYZ"; + //createTypeFlag[0]==null表示没有传递参数 + if (createTypeFlag.length > 0 && null != createTypeFlag[0]) { + if (createTypeFlag[0].equals(IdentifyingCodeConstant.CHINA)) { + // 截取汉字 + return createRandomChar(g, baseChineseChar); + }else if (createTypeFlag[0].equals(IdentifyingCodeConstant.NUMBER_ENGLISH)) { + // 截取数字和字母的组合 + return createRandomChar(g, baseNumLetter); + }else if (createTypeFlag[0].equals(IdentifyingCodeConstant.NUMBER)) { + // 截取数字 + return createRandomChar(g, baseNum); + }else if (createTypeFlag[0].equals(IdentifyingCodeConstant.ENGLISH)) { + // 截取字母 + return createRandomChar(g, baseLetter); + } + }else { + // 默认截取数字和字母的组合 + return createRandomChar(g, baseNumLetter); + } + + return ""; + } + + /** + * 创建随机字符 + * @param g + * @param baseChar + * @return 随机字符 + */ + private String createRandomChar(Graphics2D g,String baseChar) { + StringBuffer sb = new StringBuffer(); + int x = 5; + String ch =""; + // 控制字数 + for (int i = 0; i < 4; i++) { + // 设置字体旋转角度 + int degree = new Random().nextInt() % 30; + ch = baseChar.charAt(new Random().nextInt(baseChar.length())) + ""; + sb.append(ch); + // 正向角度 + g.rotate(degree * Math.PI / 180, x, 20); + g.drawString(ch, x, 20); + // 反向角度 + g.rotate(-degree * Math.PI / 180, x, 20); + x += 30; + } + return sb.toString(); + } + +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/identifyingcode/IdentifyingCodeConstant.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/identifyingcode/IdentifyingCodeConstant.java new file mode 100644 index 0000000..b89730c --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/identifyingcode/IdentifyingCodeConstant.java @@ -0,0 +1,22 @@ +package com.passManage.us.core.identifyingcode; + +/** + * Created by www.magicalcoder.com on 2015/8/5. + * 799374340@qq.com + */ +public interface IdentifyingCodeConstant { + + String CHECK_CODE_SESSION_KEY = "CheckCodeKey"; + + + String CHINA = "ch"; + String NUMBER = "n"; + String ENGLISH = "l"; + String NUMBER_ENGLISH = "nl"; + + //使用类型 session memcache方式 + int STORE_TYPE_SESSION = 0;//session + int STORE_TYPE_CACHE_SERVER = 1;//系统默认缓存服务器 + + +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/okhttp/OkHttpsClientUtils.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/okhttp/OkHttpsClientUtils.java new file mode 100644 index 0000000..5feb8c2 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/okhttp/OkHttpsClientUtils.java @@ -0,0 +1,94 @@ +package com.passManage.us.core.okhttp; + +import okhttp3.Call; +import okhttp3.OkHttpClient; +import okhttp3.Request; +import okhttp3.Response; + +import javax.net.ssl.*; +import java.util.List; +import java.util.concurrent.TimeUnit; + +/** + * Created by magicalcoder.com on 2018/2/26. + */ +public class OkHttpsClientUtils { + + private static OkHttpClient okHttpClient = null; + + public static boolean success200(String status) { + return "200".equals(status); + } + + /** + * 获取OkHttpClient + * + * @return OkHttpClient + */ + private static OkHttpClient getUnsafeOkHttpClient() { + long timeOut = 30; + try { + final TrustManager[] trustAllCerts = new TrustManager[]{ + new X509TrustManager() { + @Override + public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) { + } + + @Override + public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) { + } + + @Override + public java.security.cert.X509Certificate[] getAcceptedIssuers() { + return new java.security.cert.X509Certificate[]{}; + } + } + }; + + final SSLContext sslContext = SSLContext.getInstance("SSL"); + sslContext.init(null, trustAllCerts, new java.security.SecureRandom()); + final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); + OkHttpClient.Builder builder = new OkHttpClient.Builder(); + builder.sslSocketFactory(sslSocketFactory); + + builder.hostnameVerifier(new HostnameVerifier() { + @Override + public boolean verify(String hostname, SSLSession session) { + return true; + } + }); + + return builder.connectTimeout(timeOut,TimeUnit.SECONDS).readTimeout(timeOut,TimeUnit.SECONDS).writeTimeout(timeOut,TimeUnit.SECONDS).build(); + } catch (Exception e) { + throw new RuntimeException(e); + } + + } + + public static String[] doGetNoCert(String httpUrl) { + String status = ""; + String returnResponse = ""; + if(okHttpClient == null){ + okHttpClient = getUnsafeOkHttpClient(); + } + Request request = new Request.Builder() + .url(httpUrl) + .build(); + //创建"调用" 对象 + Call call = okHttpClient.newCall(request); + try { + Response response = call.execute();//执行 + status = response.code()+""; +// if (response.isSuccessful()) { + returnResponse = response.body().string(); +// } + } catch (Exception e) { + e.printStackTrace(); + status = "Exception"; + } + return new String[]{status, returnResponse}; + } + + public static void main(String[] args) { + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/protobuf/ProtoDto.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/protobuf/ProtoDto.java new file mode 100644 index 0000000..f8e34fd --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/protobuf/ProtoDto.java @@ -0,0 +1,24 @@ +package com.passManage.us.core.protobuf; + +/** + * author: www.magicalcoder.com + * date:2018/5/23 + * function: + */ +public class ProtoDto { + + private Object obj; + + public ProtoDto(Object obj) { + this.obj = obj; + } + + public Object getObj() { + return obj; + } + + public void setObj(Object obj) { + this.obj = obj; + } + +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/protobuf/ProtostuffUtil.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/protobuf/ProtostuffUtil.java new file mode 100644 index 0000000..97589a5 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/protobuf/ProtostuffUtil.java @@ -0,0 +1,85 @@ +package com.passManage.us.core.protobuf; + +import com.alibaba.fastjson.JSON; +import com.dyuproject.protostuff.LinkedBuffer; +import com.dyuproject.protostuff.ProtostuffIOUtil; +import com.dyuproject.protostuff.Schema; +import com.dyuproject.protostuff.runtime.RuntimeSchema; +import org.objenesis.Objenesis; +import org.objenesis.ObjenesisStd; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + +/** + * Created by magicalcoder.com.com on 2017/5/22. + * 谷歌protobuf序列化反序列号工具类 + * 好处是 不用再单独创建.proto文件了 + */ +public class ProtostuffUtil { + private static Map<Class<?>, Schema<?>> cachedSchema = new ConcurrentHashMap<Class<?>, Schema<?>>(); + // objenesis是一个小型Java类库用来实例化一个特定class的对象 无需再提供默认构造器 + private static Objenesis objenesis = new ObjenesisStd(true); + + private ProtostuffUtil() { + } + + @SuppressWarnings("unchecked") + private static <T> Schema<T> getSchema(Class<T> cls) { + Schema<T> schema = (Schema<T>) cachedSchema.get(cls); + if (schema == null) { + schema = RuntimeSchema.createFrom(cls); + if (schema != null) { + cachedSchema.put(cls, schema); + } + } + return schema; + } + + /** + * 序列化(对象 -> 字节数组) + */ + @SuppressWarnings("unchecked") + public static <T> byte[] serialize(T obj) { + if(obj == null){ + return null; + } +// Class<T> cls = (Class<T>) obj.getClass(); + LinkedBuffer buffer = LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE); + try { + Schema<ProtoDto> schema = getSchema(ProtoDto.class); + ProtoDto protoDto = new ProtoDto(obj); + return ProtostuffIOUtil.toByteArray(protoDto, schema, buffer); + } catch (Exception e) { + throw new IllegalStateException(e.getMessage(), e); + } finally { + buffer.clear(); + } + } + + /** + * 反序列化(字节数组 -> 对象) + */ + public static <T> T deserialize(byte[] data) { + try { + if(data==null){ + return null; + } + ProtoDto message = objenesis.newInstance(ProtoDto.class); + Schema<ProtoDto> schema = getSchema(ProtoDto.class); + ProtostuffIOUtil.mergeFrom(data, message, schema); + return (T)message.getObj(); + } catch (Exception e) { + throw new IllegalStateException(e.getMessage(), e); + } + } + + public static void main(String[] args) { + List<String> list = new ArrayList<>(); + list.add("12发"); + List<String> obj = deserialize(serialize(list)); + System.out.println(JSON.toJSONString(obj)); + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/serialize/CommonReturnCode.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/serialize/CommonReturnCode.java new file mode 100644 index 0000000..b88b31c --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/serialize/CommonReturnCode.java @@ -0,0 +1,20 @@ +package com.passManage.us.core.serialize; + +/** + * 定义一些通用的错误码 + */ +public class CommonReturnCode { + +// private CommonReturnCode(){} + + public static final KeyValuePair SUCCESS = new KeyValuePair(0, "成功","成功"); + + public static final KeyValuePair EXCEPTION = new KeyValuePair(99991, "服务器异常","异常"); + + public static final KeyValuePair FILE_UPLOAD_ERROR = new KeyValuePair(98001, "文件上传失败","文件上传失败"); + public static final KeyValuePair FILE_UPLOAD_SIZE_TO_BIG = new KeyValuePair(98002, "文件上传大小超过限制","文件上传大小超过限制"); + public static final KeyValuePair FILE_UPLOAD_NO_FILE = new KeyValuePair(98404, "入参没有文件","入参没有文件"); + + + +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/serialize/JsonBuilder.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/serialize/JsonBuilder.java new file mode 100644 index 0000000..bcf9697 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/serialize/JsonBuilder.java @@ -0,0 +1,124 @@ +package com.passManage.us.core.serialize; + +public class JsonBuilder { + private Integer code = 0;// 默认值 + private String desc;//提示信息 + private Object data;//返回结果 + private String callback;// + private String encode;//编码 + private Boolean writeNull;//json是否输出null + private Boolean flag; + public static class Builder{ + private Integer code = 0;// 默认值 + private String desc; + private Object data; + private String callback; + private String encode; + private Boolean writeNull = true; + private Boolean flag; + public Builder(Object data){ + this.data = data; + } + + public Builder code(Integer code){ + this.code = code; + return this; + } + + public Builder desc(String desc){ + this.desc = desc; + return this; + } + public Builder callback(String callback){ + this.callback = callback; + return this; + } + + public Builder encode(String encode){ + this.encode = encode; + return this; + } + public Builder writeNull(Boolean writeNull){ + this.writeNull = writeNull; + return this; + } + public Builder flag(Boolean flag){ + this.flag = flag; + return this; + } + public JsonBuilder build(){ + return new JsonBuilder(this); + } + } + + public JsonBuilder(Builder builder) { + this.code = builder.code; + this.callback = builder.callback; + this.desc = builder.desc; + this.data = builder.data; + this.encode = builder.encode; + this.writeNull = builder.writeNull; + this.flag = builder.flag; + } + + public String getCallback() { + if(callback!=null){ + if(callback.contains("<") || callback.contains(">") || callback.contains("&")){ + return callback.replace("<","<").replace(">",">").replace("&","&"); + } + } + return callback; + } + + public Integer getCode() { + return code; + } + + public void setCode(Integer code) { + this.code = code; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public void setCallback(String callback) { + this.callback = callback; + } + + public String getEncode() { + return encode; + } + + public void setEncode(String encode) { + this.encode = encode; + } + + public Boolean getWriteNull() { + return writeNull; + } + + public void setWriteNull(Boolean writeNull) { + this.writeNull = writeNull; + } + + public Boolean getFlag() { + return flag; + } + + public void setFlag(Boolean flag) { + this.flag = flag; + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/serialize/JsonOutWriter.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/serialize/JsonOutWriter.java new file mode 100644 index 0000000..ef950bc --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/serialize/JsonOutWriter.java @@ -0,0 +1,185 @@ +package com.passManage.us.core.serialize; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.serializer.SerializeConfig; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.alibaba.fastjson.serializer.SimpleDateFormatSerializer; +import com.passManage.us.core.utils.ImgeUtil; +import com.passManage.us.core.utils.StringUtil; + +import javax.imageio.ImageIO; +import javax.servlet.http.HttpServletResponse; +import java.awt.image.BufferedImage; +import java.io.*; +import java.net.URLEncoder; +import java.util.Date; +public class JsonOutWriter { + static final int SUCCESS = CommonReturnCode.SUCCESS.getKey();//成功 + + static final SerializerFeature[] features = new SerializerFeature[]{SerializerFeature.WriteDateUseDateFormat, SerializerFeature.WriteMapNullValue, SerializerFeature.DisableCircularReferenceDetect}; + static final SerializerFeature[] simpleFeatures = new SerializerFeature[]{SerializerFeature.WriteDateUseDateFormat, SerializerFeature.DisableCircularReferenceDetect}; + static final SerializeConfig config = new SerializeConfig(); + static final SerializeConfig highChartsConfig = new SerializeConfig(); + static { + //普通数据使用的 日期 + config.put(Date.class, new SimpleDateFormatSerializer("yyyy-MM-dd HH:mm:ss")); + //统计图表使用的方法 自定义日期 + highChartsConfig.put(Date.class,new MyDateSerializer()); + } + + /** + * 正常情况时 + * 前端快速返回json + * @param response + */ + public void toWebSuccess(HttpServletResponse response){ + toJsonData(response,new JsonBuilder.Builder(null).flag(true).code(SUCCESS).build()); + } + public void toWebSuccess(HttpServletResponse response,Object data){ + toJsonData(response,new JsonBuilder.Builder(data).flag(true).code(SUCCESS).build()); + } + public void toWebShortSuccess(HttpServletResponse response,Object data){ + toJsonData(response,new JsonBuilder.Builder(data).flag(true).code(SUCCESS).writeNull(false).build()); + } + /** + * 验证错误返回 + * @param response + * @param keyValuePair + */ + public void toWebFail(HttpServletResponse response, KeyValuePair keyValuePair){ + String desc = keyValuePair.getDescr(); + if(StringUtil.isBlank(desc)){ + desc = keyValuePair.getValue(); + } + toJsonData(response,new JsonBuilder.Builder(null).code(keyValuePair.getKey()).flag(false).desc(desc).build()); + } + + /** + * 比较全的 + * @param response + * @param keyValuePair + */ + public void toWeb(HttpServletResponse response, KeyValuePair keyValuePair,Object data){ + if(keyValuePair == null){ + keyValuePair = new KeyValuePair(0,null,null); + } + String desc = keyValuePair.getDescr(); + if(StringUtil.isBlank(desc)){ + desc = keyValuePair.getValue(); + } + boolean flag = true; + if(keyValuePair.getKey() != SUCCESS){ + flag = false; + } + toJsonData(response,new JsonBuilder.Builder(data).code(keyValuePair.getKey()).flag(flag).desc(desc).build()); + } + /** + * 所有web版使用此方法 + * @param response + * @param jsonBuilder + */ + private void toJsonData(HttpServletResponse response, JsonBuilder jsonBuilder){ + String encode = "UTF-8"; + if(jsonBuilder.getEncode()!=null){ + encode = jsonBuilder.getEncode(); + } + resWrite(response, jsonBuilder, encode, config); + } + + private void resWrite(HttpServletResponse response, JsonBuilder jsonBuilder, String encode, SerializeConfig highChartsConfig) { + try { + byte[] bytes; + if (StringUtil.isBlank(jsonBuilder.getCallback())) { + if (jsonBuilder.getWriteNull() != null && jsonBuilder.getWriteNull()) { + bytes = JSON.toJSONString(jsonBuilder, highChartsConfig, features).getBytes(encode); + } else { + bytes = JSON.toJSONString(jsonBuilder, highChartsConfig, simpleFeatures).getBytes(encode); + } + } else { + if (jsonBuilder.getWriteNull() != null && jsonBuilder.getWriteNull()) { + bytes = ("/**/;" + jsonBuilder.getCallback() + "(" + JSON.toJSONString(jsonBuilder, highChartsConfig, features) + ")").getBytes(encode); + } else { + bytes = ("/**/;" + jsonBuilder.getCallback() + "(" + JSON.toJSONString(jsonBuilder, highChartsConfig, simpleFeatures) + ")").getBytes(encode); + } + } + response.setCharacterEncoding(encode); + response.setContentType("text/json;charset=" + encode); + response.setContentLength(bytes.length); + OutputStream writer = response.getOutputStream(); + writer.write(bytes); + writer.flush(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * 图片流输出 + * @param response + * @param imgUrl 图片url + */ + public void toImge(HttpServletResponse response,String imgUrl){ + if(StringUtil.isBlank(imgUrl)){ + return; + } + String sufix = ImgeUtil.suffix(imgUrl); + BufferedImage bi = ImgeUtil.requestRemoteImg(imgUrl); + //1.设置响应头通知浏览器以图片的形式打开 + response.setContentType("image/jpeg");//等同于response.setHeader("Content-Type", "image/jpeg"); + //2.设置响应头控制浏览器不要缓存 +/* response.setDateHeader("expries", -1); + response.setHeader("Cache-Control", "no-cache"); + response.setHeader("Pragma", "no-cache");*/ + //3.将图片写给浏览器 + try { + ImageIO.write(bi, sufix, response.getOutputStream()); + } catch (IOException e) { + e.printStackTrace(); + } + } + + + /** + * 文件流输出 + * @param response + * @param targetFilePath 文件地址 + */ + public void toFile(HttpServletResponse response,String targetFilePath){ + File file = new File(targetFilePath); + toFile(response,file); + } + /** + * 文件流输出 + * @param response + * @param file 文件 + */ + public void toFile(HttpServletResponse response, File file) { + try { + response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(file.getName(), "UTF-8")); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + InputStream in = null; + OutputStream out = null; + try { + in = new FileInputStream(file); + int len = 0; + byte[] buffer = new byte[256]; + out = response.getOutputStream(); + while((len = in.read(buffer)) > 0) { + out.write(buffer,0,len); + } + }catch(Exception e) { + throw new RuntimeException(e); + }finally { + if(in != null) { + try { + in.close(); + }catch(Exception e) { + throw new RuntimeException(e); + } + } + } + } + +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/serialize/KeyValuePair.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/serialize/KeyValuePair.java new file mode 100644 index 0000000..f88a239 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/serialize/KeyValuePair.java @@ -0,0 +1,49 @@ +package com.passManage.us.core.serialize; + +import org.apache.commons.lang.StringUtils; + +public class KeyValuePair implements Comparable<KeyValuePair>{ + private int key; + private String value; + private String descr; + + public KeyValuePair(int key, String value, String descr) { + this.key = key; + this.value = value; + this.descr = descr; + } + + public int getKey() { + return key; + } + + public void setKey(int key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + public String getDescr() { + return descr; + } + + public void setDescr(String descr) { + this.descr = descr; + } + + @Override + public int compareTo(KeyValuePair other){ + if (other.getKey() == this.getKey() && StringUtils.equals(this.getValue(), other.getValue())) { + return 0; + } else if(other.getKey()==this.getKey()){ + return 1; + } + return -1; + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/serialize/MyDateSerializer.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/serialize/MyDateSerializer.java new file mode 100644 index 0000000..5697cbd --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/serialize/MyDateSerializer.java @@ -0,0 +1,35 @@ +package com.passManage.us.core.serialize; + +import com.alibaba.fastjson.serializer.JSONSerializer; +import com.alibaba.fastjson.serializer.ObjectSerializer; +import com.alibaba.fastjson.serializer.SerializeWriter; +import com.passManage.us.core.utils.DateFormatUtil; + +import java.io.IOException; +import java.lang.reflect.Type; +import java.util.Date; + +public class MyDateSerializer implements ObjectSerializer { + public void write(JSONSerializer serializer, Object object, + Object fieldName, Type fieldType) throws IOException { + SerializeWriter out = serializer.getWriter(); + if (object == null) { + serializer.getWriter().writeNull(); + return; + } + String utc = "Date.UTC(%d,%d,%d)"; + if(object instanceof Date){ + Date value = (Date)object; + int year = DateFormatUtil.getIntYear(value); + int month = DateFormatUtil.getIntMonth(value); + int day = DateFormatUtil.getIntDay(value); + utc = String.format(utc,year,month-1,day); + } + out.write(utc); + } + + @Override + public void write(JSONSerializer jsonSerializer, Object o, Object o1, Type type, int i) throws IOException { + + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/serialize/Page.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/serialize/Page.java new file mode 100644 index 0000000..ef39d4b --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/serialize/Page.java @@ -0,0 +1,66 @@ +package com.passManage.us.core.serialize; + +import lombok.Data; +import org.apache.commons.lang.StringUtils; + +@Data +public class Page { + + private static final Integer DEFAULT_PAGE_CURRENT = 1; + private static final Integer DEFAULT_PAGE_SIZE = 10; + + /** + * 排序规则 desc ,asc + */ + private String sortOrder = "desc"; + + /** + * 排序字段 + */ + private String sortField = null; + + /** + * 查询的当前页 + */ + private Integer currPage ; + + /** + * 查询的数据条目 + */ + private Integer pageSize ; + + public String getSortOrder() { + if (StringUtils.equalsIgnoreCase(sortOrder, "desc") || StringUtils.equalsIgnoreCase(sortOrder, "asc")) { + return sortOrder; + } else { + return "desc"; + } + } + + public Integer getCurrPage(){ + if(currPage==null){ + this.currPage =DEFAULT_PAGE_CURRENT; + } + return this.currPage ; + } + + public Integer getPageSize(){ + if(pageSize==null){ + this.pageSize= DEFAULT_PAGE_SIZE; + } + if(pageSize>DEFAULT_PAGE_SIZE){ + this.pageSize= DEFAULT_PAGE_SIZE; + } + return this.pageSize ; + } + + /** + * 获取起始值 + * @return + */ + public Integer getStart(){ + return getPageSize()*(getCurrPage() -1) ; + } + + +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/serialize/PageData.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/serialize/PageData.java new file mode 100644 index 0000000..10e9345 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/serialize/PageData.java @@ -0,0 +1,27 @@ +package com.passManage.us.core.serialize; + +import lombok.Data; + +import java.util.List; + +@Data +public class PageData<T> { + private Long totalCount;//总记录数 + private List<T> pageData;//当前页需要的数据 + + public PageData() { + } + + public PageData(Long totalCount, List<T> pageData) { + this.totalCount = totalCount; + this.pageData = pageData; + } + public PageData(Integer totalCount, List<T> pageData) { + if(totalCount==null){ + totalCount = 0; + } + this.totalCount = Long.valueOf(totalCount); + this.pageData = pageData; + } + +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/serialize/ResponseMsg.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/serialize/ResponseMsg.java new file mode 100644 index 0000000..091b0bb --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/serialize/ResponseMsg.java @@ -0,0 +1,96 @@ +package com.passManage.us.core.serialize; + +import com.passManage.us.core.utils.StringUtil; + +public class ResponseMsg { + private static final int SUCCESS = 0; + private boolean flag; + private int code; + private String desc; + private Integer count; + private Object data; + + public ResponseMsg() { + this.flag = true; + this.code = SUCCESS; + this.desc = "成功"; + } + public ResponseMsg (Integer count,Object data){ + this.count = count; + this.flag = true; + this.code = SUCCESS; + this.desc = "成功"; + this.data = data; + } + public ResponseMsg (Object data){ + this.flag = true; + this.code = SUCCESS; + this.desc = "成功"; + this.data = data; + } + + public ResponseMsg(int code,String desc) { + this.code = code; + this.desc = desc; + if(code == SUCCESS){ + this.flag = true; + }else { + this.flag = false; + } + } + + public ResponseMsg(KeyValuePair keyValuePair) { + if (keyValuePair.getKey() == SUCCESS) { + this.flag = true; + } else { + this.flag = false; + } + this.code = keyValuePair.getKey(); + if (StringUtil.isBlank(keyValuePair.getDescr())) { + this.desc = keyValuePair.getValue(); + } else { + this.desc = keyValuePair.getDescr(); + } + } + + + public boolean isFlag() { + return flag; + } + + public void setFlag(boolean flag) { + this.flag = flag; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getDesc() { + return desc; + } + + public void setDesc(String desc) { + this.desc = desc; + } + + public Object getData() { + return data; + } + + public void setData(Object data) { + this.data = data; + } + + public Integer getCount() { + return count; + } + + public void setCount(Integer count) { + this.count = count; + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/serialize/Restrict.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/serialize/Restrict.java new file mode 100644 index 0000000..66d83bd --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/serialize/Restrict.java @@ -0,0 +1,62 @@ +package com.passManage.us.core.serialize; + +/** + * author: www.magicalcoder.com + * date:2018/5/14 + * function: + */ +public class Restrict { + private String servletPathReg;//url正则 + private String strategy;//策略 no ip user ip_user + private int ipMaxReqTimes;//ip最大请求次数 + private int ipExpireSeconds;//ip失效时间 + private int userMaxReqTimes;//user最大请求次数 + private int userExpireSeconds;//user失效时间 + public String getServletPathReg() { + return servletPathReg; + } + + public void setServletPathReg(String servletPathReg) { + this.servletPathReg = servletPathReg; + } + + public String getStrategy() { + return strategy; + } + + public void setStrategy(String strategy) { + this.strategy = strategy; + } + + public int getIpMaxReqTimes() { + return ipMaxReqTimes; + } + + public void setIpMaxReqTimes(int ipMaxReqTimes) { + this.ipMaxReqTimes = ipMaxReqTimes; + } + + public int getIpExpireSeconds() { + return ipExpireSeconds; + } + + public void setIpExpireSeconds(int ipExpireSeconds) { + this.ipExpireSeconds = ipExpireSeconds; + } + + public int getUserMaxReqTimes() { + return userMaxReqTimes; + } + + public void setUserMaxReqTimes(int userMaxReqTimes) { + this.userMaxReqTimes = userMaxReqTimes; + } + + public int getUserExpireSeconds() { + return userExpireSeconds; + } + + public void setUserExpireSeconds(int userExpireSeconds) { + this.userExpireSeconds = userExpireSeconds; + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/service/CommonRestController.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/service/CommonRestController.java new file mode 100644 index 0000000..d1a6757 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/service/CommonRestController.java @@ -0,0 +1,196 @@ +package com.passManage.us.core.service; + +import com.passManage.us.core.common.exception.BusinessException; +import com.passManage.us.core.serialize.ResponseMsg; +import com.passManage.us.core.utils.POIUtil; +import com.passManage.us.core.utils.ReflectUtil; +import com.passManage.us.core.utils.StringUtil; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.lang.reflect.ParameterizedType; +import java.net.URLEncoder; +import java.sql.Timestamp; +import java.util.List; +import java.util.Set; + +/** + * + * date:2018/9/7 + * function: 封装controller的一些通用方法 + */ +public class CommonRestController<E,P> { + public ICommonService<E,P> commonService; + //查询类型 + protected int QUERY_TYPE_SEARCH=0;//普通搜索 + protected int QUERY_TYPE_EXPORT_EXCEL=1;//导出excel + + public String primaryKey;//主键名称 + + //完全为了解决layui的where条件不支持动态改变值,会记住上一次的参数值 + public String coverBlankToNull(String input){ + if("".equals(input)){ + return null; + } + return input; + } + + /** + * 根据主键获取 + * @param id + * @return + */ + @RequestMapping(value="get/{id}", method={RequestMethod.GET}) + public ResponseMsg get(@PathVariable P id) { + return new ResponseMsg(this.commonService.getModel(id)); + } + /** + * 保存 + * @return + */ + @RequestMapping(value="save", method={RequestMethod.POST}) + public ResponseMsg save(@ModelAttribute E entity) { + ReflectUtil<P,E> util = new ReflectUtil<>(); + P id = util.getBeanValue(entity,primaryKey); + if(id instanceof String){ + if(StringUtil.isBlank((String)id)){ + id = null; + } + } + if(id==null){ + //如果您希望程序自动维护创建时间 更新时间 请取消下面的注释 + /*autoSetCreateTime(entity); + autoSetUpdateTime(entity);*/ + this.commonService.insertModel(entity); + }else{ + E dbEntity = this.commonService.getModelNotIgnore(id,primaryKey); + if(dbEntity==null){// + /*autoSetCreateTime(entity); + autoSetUpdateTime(entity);*/ + this.commonService.insertModel(entity); + }else { + /*autoSetUpdateTime(entity);*/ + this.commonService.updateModel(entity); + } + } + return new ResponseMsg(); + } + + private void autoSetCreateTime(E entity){ + ReflectUtil<Timestamp,E> timeReflect = new ReflectUtil<>(); + try {//尝试下更新创建时间 + timeReflect.setBeanValue(entity,Timestamp.class,"createTime",new Timestamp(System.currentTimeMillis())); + }catch (Exception e){ + //忽略日志 + } + } + private void autoSetUpdateTime(E entity){ + ReflectUtil<Timestamp,E> timeReflect = new ReflectUtil<>(); + try {//尝试下更新更改时间 + timeReflect.setBeanValue(entity,Timestamp.class,"updateTime",new Timestamp(System.currentTimeMillis())); + }catch (Exception e){ + //忽略异常 有些场景没有时间字段 没必要报错 + } + } + /** + * 更新记录 + * @param magicalCoderId + * @return + */ + //虽然id会智能赋值但是 + @RequestMapping(value="update/{magicalCoderId}", method={RequestMethod.POST}) + public ResponseMsg update(@PathVariable P magicalCoderId,@ModelAttribute E entity) { + if(magicalCoderId==null){ + throw new BusinessException(null); + } +//设置主键 + Class<P> clazz = (Class<P>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[1]; + ReflectUtil<P,E> util = new ReflectUtil<>(); + util.setBeanValue(entity,clazz,primaryKey,magicalCoderId); + this.commonService.updateModelWithoutNull(entity); + return new ResponseMsg(); + } + + /** + * 根据主键删除单条记录 + * @param id + * @return + */ + @RequestMapping(value="delete/{id}", method={RequestMethod.POST}) + public ResponseMsg delete(@PathVariable P id) { + this.commonService.deleteModel(id); + return new ResponseMsg(); + } + + /** + * 批量删除 + * @param ids + * @return + */ + @RequestMapping(value="batch_delete" ,method={RequestMethod.POST}) + public ResponseMsg batchDelete(@RequestParam(value = "ids[]") Set<P> ids) {//ids是前端写死的入参 请不要改动 + this.commonService.deleteModel(ids); + return new ResponseMsg(); + } + + /** + * 导出excel + * @param response + * @param dataList 数据集合 + * @param fileNamePrefix 导出文件前缀 + * @param titles 标题 + * @param mappingArr 如遇下拉 给出下拉映射值 + */ + protected void exportExcel(HttpServletResponse response,List<E> dataList,String fileNamePrefix,String[] titles, String[] mappingArr){ + try { + if(fileNamePrefix.length()<3){ + fileNamePrefix = fileNamePrefix+"magicalcoder"; + } + File tmpFile = File.createTempFile(fileNamePrefix,".xlsx"); + POIUtil<E> poiUtil = new POIUtil<E>(); + poiUtil.writeExcelToTempFile(dataList + ,titles + ,mappingArr + ,tmpFile); + toFile(response, tmpFile); + } catch (IOException e) { + e.printStackTrace(); + } + } + + /** + * 文件流输出 + * @param response + * @param file 文件 + */ + protected void toFile(HttpServletResponse response, File file) { + try { + response.setHeader("content-disposition", "attachment;filename=" + URLEncoder.encode(file.getName(), "UTF-8")); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + InputStream in = null; + OutputStream out = null; + try { + in = new FileInputStream(file); + int len = 0; + byte[] buffer = new byte[256]; + out = response.getOutputStream(); + while((len = in.read(buffer)) > 0) { + out.write(buffer,0,len); + } + }catch(Exception e) { + throw new RuntimeException(e); + }finally { + if(in != null) { + try { + in.close(); + }catch(Exception e) { + throw new RuntimeException(e); + } + } + } + } + +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/service/CommonServiceImpl.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/service/CommonServiceImpl.java new file mode 100644 index 0000000..db34e6c --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/service/CommonServiceImpl.java @@ -0,0 +1,213 @@ +package com.passManage.us.core.service; + +import com.passManage.us.core.utils.MapUtil; +import org.springframework.transaction.annotation.Transactional; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; + +public class CommonServiceImpl<E,P> { + + private static final String ignoreSuffix = "Ignore_"; + private static final String notIgnoreSuffix = "NotIgnore_"; + + private static final String magicalCoderPrimaryKeyName = "magicalCoderPrimaryKeyName";//注意这个是保留字段,不知道用户传的主键名称,所以单独一个名称 + + public ICommonMapper<E,P> commonMapper; + + public E getModel(P id) { + Map<String,Object> query = new HashMap<String,Object>(); + query.put(magicalCoderPrimaryKeyName, id); + return commonMapper.getModelByPk(query); + } + public E getModelIgnore(P id,String ... ignoreFields) { + Map<String,Object> query = new HashMap<String,Object>(); + query.put(magicalCoderPrimaryKeyName, id); + addIgnoreFields(query, ignoreFields); + return commonMapper.getModelByPk(query); + } + + public E getModelNotIgnore(P id,String ... notIgnoreFields) { + Map<String,Object> query = new HashMap<String,Object>(); + query.put(magicalCoderPrimaryKeyName, id); + addNotIgnoreFields(query, notIgnoreFields); + return commonMapper.getModelByPk(query); + } + + public E selectOneModelWillThrowException(Map<String, Object> query){ + return commonMapper.getModel(query); + } + public E selectOneModelWillThrowExceptionIgnore(Map<String, Object> query,String ... ignoreFields){ + if(query == null){query = new HashMap<>();} + addIgnoreFields(query,ignoreFields); + return commonMapper.getModel(query); + } + public E selectOneModelWillThrowExceptionNotIgnore(Map<String, Object> query,String ... notIgnoreFields){ + if(query == null){query = new HashMap<>();} + addNotIgnoreFields(query,notIgnoreFields); + return commonMapper.getModel(query); + } + + public E selectFirstModel(Map<String, Object> query){ + if(query == null){query = new HashMap<>();} + query.put("limit",1); + List<E> list = commonMapper.getModelList(query); + if(list!=null && list.size()>0){ + return list.get(0); + } + return null; + } + + public E selectFirstModelIgnore(Map<String, Object> query,String ... ignoreFields){ + if(query == null){query = new HashMap<>();} + query.put("limit",1); + addIgnoreFields(query,ignoreFields); + List<E> list = commonMapper.getModelList(query); + if(list!=null && list.size()>0){ + return list.get(0); + } + return null; + } + public E selectFirstModelNotIgnore(Map<String, Object> query,String ... notIgnoreFields){ + if(query == null){query = new HashMap<>();} + query.put("limit",1); + addNotIgnoreFields(query,notIgnoreFields); + List<E> list = commonMapper.getModelList(query); + if(list!=null && list.size()>0){ + return list.get(0); + } + return null; + } + public List<E> getModelList(Map<String, Object> query) { + return commonMapper.getModelList(query); + } + + public List<E> getModelListIgnore(Map<String, Object> query,String ... ignoreFields) { + if(query == null){query = new HashMap<>();} + addIgnoreFields(query,ignoreFields); + return commonMapper.getModelList(query); + } + public List<E> getModelListNotIgnore(Map<String, Object> query,String ... notIgnoreFields) { + if(query == null){query = new HashMap<>();} + addNotIgnoreFields(query,notIgnoreFields); + return commonMapper.getModelList(query); + } + public List<E> getModelInList(Set<P> idList) { + if(idList==null || idList.isEmpty()){ + return null; + } + return commonMapper.getModelInList(MapUtil.buildMap("idList",idList)); + } + public List<E> getModelInListIgnore(Set<P> idList,String ... ignoreFields) { + if(idList==null || idList.isEmpty()){ + return null; + } + Map<String,Object> query = new HashMap<>(); + addIgnoreFields(query,ignoreFields); + query.put("idList",idList); + return commonMapper.getModelInList(query); + } + public List<E> getModelInListNotIgnore(Set<P> idList,String ... notIgnoreFields) { + if(idList==null || idList.isEmpty()){ + return null; + } + Map<String,Object> query = new HashMap<>(); + addNotIgnoreFields(query,notIgnoreFields); + query.put("idList",idList); + return commonMapper.getModelInList(query); + } + + public int getModelListCount(Map<String, Object> query) { + Integer count = commonMapper.getModelListCount(query); + if(count == null){ + count = 0; + } + return count; + } + + public int insertModel(E model) { + return commonMapper.insertModel(model); + } + public int insertModelWithoutNull(E model) { + return commonMapper.insertModelWithoutNull(model); + } + + public int batchInsertModel(List<E> list) { + return commonMapper.batchInsertModel(list); + } + public int batchInsertModelWithoutNull(List<E> list) { + return commonMapper.batchInsertModelWithoutNull(list); + } + + public int replaceModel(E model) { + return commonMapper.replaceModel(model); + } + public int replaceModelWithoutNull(E model) { + return commonMapper.replaceModelWithoutNull(model); + } + public int batchReplaceModel(List<E> list) { + return commonMapper.batchReplaceModel(list); + } + public int batchReplaceModelWithoutNull(List<E> list) { + return commonMapper.batchReplaceModelWithoutNull(list); + } + + public int updateModel(E model) { + return commonMapper.updateModel(model); + } + public int updateModelWithoutNull(E model) { + return commonMapper.updateModelWithoutNull(model); + } + public int batchUpdateModel(List<E> list) { + return commonMapper.batchUpdateModel(list); + } + public int batchUpdateModelWithoutNull(List<E> list) { + return commonMapper.batchUpdateModelWithoutNull(list); + } + + public int truncateModel() { + return commonMapper.truncateModel(); + } + + public int deleteModel(P id) { + Map<String,Object> query = new HashMap<String,Object>(); + query.put(magicalCoderPrimaryKeyName, id); + return commonMapper.deleteModelByPk(query); + } + public int deleteModel(Map<String,Object> query){ + return commonMapper.deleteModelList(query); + } + public int deleteModel(Set<P> idList) { + return commonMapper.deleteModelByIds(idList); + } + + private void addIgnoreFields(Map<String, Object> query, String[] ignoreFields) { + if(ignoreFields!=null && ignoreFields.length>0){ + query.put(ignoreSuffix,true); + for(String field:ignoreFields){ + query.put(new StringBuilder(field).append(ignoreSuffix).toString(),true); + } + } + } + private void addNotIgnoreFields(Map<String, Object> query, String[] notIgnoreFields) { + if(notIgnoreFields!=null && notIgnoreFields.length>0){ + query.put(notIgnoreSuffix,true); + for(String field:notIgnoreFields){ + query.put(new StringBuilder(field).append(notIgnoreSuffix).toString(),true); + } + } + } + + @Deprecated + public int batchDeleteModel(Set<P> idList){ + return deleteModel(idList); + } + @Deprecated + public int deleteModelList(Map<String, Object> query){ + return deleteModel(query); + } + + +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/service/ICommonMapper.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/service/ICommonMapper.java new file mode 100644 index 0000000..a63bf95 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/service/ICommonMapper.java @@ -0,0 +1,34 @@ +package com.passManage.us.core.service; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +public interface ICommonMapper<E,P> { + E getModel(Map<String, Object> query); + E getModelByPk(Map<String, Object> query); + List<E> getModelList(Map<String, Object> query); + List<E> getModelInList(Map<String, Object> query); + Integer getModelListCount(Map<String, Object> query); + + int insertModel(E model); + int insertModelWithoutNull(E model); + int batchInsertModel(List<E> list); + int batchInsertModelWithoutNull(List<E> list); + + int replaceModel(E model); + int replaceModelWithoutNull(E model); + int batchReplaceModel(List<E> list); + int batchReplaceModelWithoutNull(List<E> list); + + int updateModel(E model); + int updateModelWithoutNull(E model); + int batchUpdateModel(List<E> list); + int batchUpdateModelWithoutNull(List<E> list); + + int truncateModel(); + + int deleteModelByPk(Map<String, Object> query); + int deleteModelList(Map<String, Object> query); + int deleteModelByIds(Set<P> idList); +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/service/ICommonService.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/service/ICommonService.java new file mode 100644 index 0000000..2d7a743 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/service/ICommonService.java @@ -0,0 +1,237 @@ +package com.passManage.us.core.service; + +import java.util.List; +import java.util.Map; +import java.util.Set; + +/** + * 这里提供了很多好用的单表增删改查接口,可以在子业务直接调用 + * @param <E> 实体类类型 + * @param <P> 主键类型 + */ +public interface ICommonService<E,P> { + /** + * 根据主键获取实体 + * @param id 主键 + * @return + */ + E getModel(P id); + + /** + * 根据主键获取实体,不查询ignoreFields字段 + * @param id + * @param ignoreFields 被忽略的字段 比如 id,goodsName,createTime + * @return + */ + E getModelIgnore(P id, String... ignoreFields); + + /** + * 根据主键获取实体,只查询notIgnoreFields字段 + * @param id + * @param notIgnoreFields 不被忽略的字段 比如 id,goodsName,createTime + * @return + */ + E getModelNotIgnore(P id, String... notIgnoreFields); + + /** + * 调用mybatis selectOne 如果查询返回超过1条 就会发生异常 请自行处理 + * @param query 入参 调用MapUtil构造 + * @return + */ + E selectOneModelWillThrowException(Map<String, Object> query); + + /** + * 调用mybatis selectOne 如果查询返回超过1条 就会发生异常 请自行处理 不查询ignoreFields字段 + * @param query query 入参 调用MapUtil构造 + * @param ignoreFields 被忽略的字段 比如 id,goodsName,createTime + * @return + */ + E selectOneModelWillThrowExceptionIgnore(Map<String, Object> query, String... ignoreFields); + + /** + * 调用mybatis selectOne 如果查询返回超过1条 就会发生异常 请自行处理 只查询ignoreFields字段 + * @param query 入参 调用MapUtil构造 + * @param notIgnoreFields + * @return + */ + E selectOneModelWillThrowExceptionNotIgnore(Map<String, Object> query, String... notIgnoreFields); + /** + * 获取满足条件的第一条数据 + * @param query 入参 调用MapUtil构造 + * @return + */ + E selectFirstModel(Map<String, Object> query); + + /** + * 获取满足条件的第一条数据 + * @param query + * @param ignoreFields 被忽略的字段 比如 id,goodsName,createTime + * @return + */ + E selectFirstModelIgnore(Map<String, Object> query, String... ignoreFields); + + /** + * 获取满足条件的第一条数据 + * @param query + * @param notIgnoreFields 不被忽略的字段 比如 id,goodsName,createTime + * @return + */ + E selectFirstModelNotIgnore(Map<String, Object> query, String... notIgnoreFields); + /** + * 查询实体集合 + * @param query :分页参数 start limit2个放入query + * @return + */ + List<E> getModelList(Map<String, Object> query); + + /** + * 查询实体集合 + * @param query :分页参数 start limit2个放入query + * @param ignoreFields 被忽略的字段 比如 id,goodsName,createTime + * @return + */ + List<E> getModelListIgnore(Map<String, Object> query, String... ignoreFields); + + /** + * 查询实体集合 + * @param query :分页参数 start limit2个放入query + * @param notIgnoreFields 不被忽略的字段 比如 id,goodsName,createTime + * @return + */ + List<E> getModelListNotIgnore(Map<String, Object> query, String... notIgnoreFields); + + /** + * 查询实体集合 + * @param idList 主键集合 + * @return + */ + List<E> getModelInList(Set<P> idList); + + /** + * 查询实体集合 + * @param idList 主键集合 + * @param ignoreFields 被忽略的字段 比如 id,goodsName,createTime + * @return + */ + List<E> getModelInListIgnore(Set<P> idList, String ... ignoreFields); + + /** + * 查询实体集合 + * @param idList 主键集合 + * @param notIgnoreFields 不被忽略的字段 比如 id,goodsName,createTime + * @return + */ + List<E> getModelInListNotIgnore(Set<P> idList, String ... notIgnoreFields); + + /** + * 查询实体集合的个数 + * @param query + * @return + */ + int getModelListCount(Map<String, Object> query); + + /** + * 保存实体 保证Model 主键为空 完全按照实体值进行插入 null也会插入数据库字段 + * @param model + * @return 成功执行的sql条数 + */ + int insertModel(E model); + /** + * 保存实体 保证Model 主键为空 如果属性为null则会插入数据库默认值 + * @param model + * @return null + */ + int insertModelWithoutNull(E model); + /** + * 批量插入实体,保证list中的实体 主键为空 完全按照实体值进行插入 null也会插入数据库字段 批量自动把实体主键设置 + * @param list + * return 成功执行的sql条数 + */ + int batchInsertModel(List<E> list); + /** + * 批量插入实体,保证list中的实体 主键为空 如果属性为null则会插入数据库默认值 批量自动把实体主键设置 + * @param list + * return 成功执行的sql条数 + */ + int batchInsertModelWithoutNull(List<E> list); + /** + * 智能保存实体 + * @param model + * @return 成功执行的sql条数 + */ + int replaceModel(E model); + /** + * 智能保存实体 + * @param model + * @return 成功执行的sql条数 + */ + int replaceModelWithoutNull(E model); + /** + * 智能批量保存实体,批量自动把实体主键设置 + * @param list + * @retrun 成功执行的sql条数 + */ + int batchReplaceModel(List<E> list); + /** + * 智能批量保存实体 批量自动把实体主键设置 + * @param list + * @retrun 成功执行的sql条数 + */ + int batchReplaceModelWithoutNull(List<E> list); + /** + * 更新实体 null值会字段设置数据库默认字段 + * 保证实体中的主键不为空 + * @param model + * @return 成功执行的sql条数 + */ + int updateModel(E model); + /** + * 更新实体 null字段忽略更新 + * 保证实体中的主键不为空 + * @param model + * @return 成功执行的sql条数 + */ + int updateModelWithoutNull(E model); + /** + * 批量更新实体 保证list中的实体 主键不为空 + * @param list + * @return 成功执行的sql条数 + */ + int batchUpdateModel(List<E> list); + /** + * 批量更新实体 保证list中的实体 主键不为空 + * @param list + * @return 成功执行的sql条数 + */ + int batchUpdateModelWithoutNull(List<E> list); + /** + * 根据主键删除实体 + * @param id + * @return 成功执行的sql条数 + */ + int deleteModel(P id); + /** + * 删除实体集合 使用不当 就会造成整个表清空,务必保证query的字段对应的值存在 + * @param query 如果字段值不为空 将作为查询条件 + * @return 成功执行的sql条数 + */ + int deleteModel(Map<String, Object> query); + /** + * 根据主键list 批量删除实体 + * @param idList + * @return 成功执行的sql条数 + */ + int deleteModel(Set<P> idList); + /** + * 清空实体表 + */ + int truncateModel(); + + + //已重构名称请不要再使用下面的方法 + @Deprecated + int batchDeleteModel(Set<P> idList); + @Deprecated + int deleteModelList(Map<String, Object> query); + +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/AesUtil.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/AesUtil.java new file mode 100644 index 0000000..50f9a9e --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/AesUtil.java @@ -0,0 +1,147 @@ +package com.passManage.us.core.utils; + +/** + * Created by hzwww.magicalcoder.com on 2015/10/16. + * http://outofmemory.cn/code-snippet/35524/AES-with-javascript-java-csharp-python-or-php + */ +import javax.crypto.*; +import javax.crypto.spec.IvParameterSpec; +import javax.crypto.spec.SecretKeySpec; +import java.io.IOException; +import java.io.UnsupportedEncodingException; +import java.security.InvalidKeyException; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; + +public class AesUtil { + + private static final int IV_LEN = 16; + public static String buildIvSub(String str){ + String template = "0000000000000000"; + if(str==null|| "".equals(str)){ + return template; + } + if(str.length()>=IV_LEN){ + return str.substring(0,IV_LEN); + } + return str+template.substring(0,IV_LEN-str.length()); + } + + + public static void main(String[] args) { + + } + + /** + * + * @param source 原始字符串 + * @param password 秘钥 16位 + * @param iv 随机约定的 16位 一般用用户id cookie前16位不足16位补0 等等双方都知道的 但是又会变化的最安全 + * @return + */ + public static String encrypt(String source,String password,String iv) { + try { + + Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); + int blockSize = cipher.getBlockSize(); + byte[] dataBytes = source.getBytes("UTF-8"); + int plaintextLength = dataBytes.length; + if (plaintextLength % blockSize != 0) { + plaintextLength = plaintextLength + (blockSize - (plaintextLength % blockSize)); + } + byte[] plaintext = new byte[plaintextLength]; + System.arraycopy(dataBytes, 0, plaintext, 0, dataBytes.length); + + SecretKeySpec keyspec = new SecretKeySpec(password.getBytes(), "AES"); + IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes()); + cipher.init(Cipher.ENCRYPT_MODE, keyspec, ivspec); + byte[] encrypted = cipher.doFinal(plaintext); + return new sun.misc.BASE64Encoder().encode(encrypted); + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("加密异常"); + } + } + + /** + * + * @param aesStr 加密串 + * @param password 秘钥 16位 + * @param iv 随机约定的 16位 一般用用户id cookie前16位不足16位补0 等等双方都知道的 但是又会变化的最安全 + * @return + */ + public static String desEncrypt(String aesStr,String password,String iv) { + try { + byte[] encrypted1 = new sun.misc.BASE64Decoder().decodeBuffer(aesStr); + + Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding"); + SecretKeySpec keyspec = new SecretKeySpec(password.getBytes(), "AES"); + IvParameterSpec ivspec = new IvParameterSpec(iv.getBytes()); + + cipher.init(Cipher.DECRYPT_MODE, keyspec, ivspec); + byte[] original = cipher.doFinal(encrypted1); + String originalString = new String(original); + return originalString; + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException("解密异常"); + } + } + // 抄抄抄, https://blog.csdn.net/hbcui1984/article/details/5201247 + /** + * 加密 + * + * @param content 需要加密的内容 + * @param password 加密密码 + * @return + */ + public static String encrypt(String content, String password) { + try { + KeyGenerator kgen = KeyGenerator.getInstance("AES"); + //防止linux下 随机生成key + SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG" ); + secureRandom.setSeed(password.getBytes("utf-8")); + kgen.init(128, secureRandom); + // kgen.init(128, new SecureRandom(password.getBytes())); + SecretKey secretKey = kgen.generateKey(); + byte[] enCodeFormat = secretKey.getEncoded(); + SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES"); + Cipher cipher = Cipher.getInstance("AES");// 创建密码器 + byte[] byteContent = content.getBytes("utf-8"); + cipher.init(Cipher.ENCRYPT_MODE, key);// 初始化 + byte[] result = cipher.doFinal(byteContent); + return new sun.misc.BASE64Encoder().encode(result); + //return result; // 加密 + } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | IllegalBlockSizeException | UnsupportedEncodingException | BadPaddingException e) { + e.printStackTrace(); + } + return null; + } + + /**解密 + * @param content 待解密内容 + * @param password 解密密钥 + * @return + */ + public static String decrypt(String content, String password) { + try { + byte[] encrypted = new sun.misc.BASE64Decoder().decodeBuffer(content); + KeyGenerator kgen = KeyGenerator.getInstance("AES"); + /***这段很关键,因为windows和linux这段random生成策略不一样,所有这里要指定一致***/ + SecureRandom random = SecureRandom.getInstance("SHA1PRNG"); + random.setSeed(password.getBytes("utf-8")); + /*****/ + kgen.init(128, random); + SecretKey secretKey = kgen.generateKey(); + byte[] enCodeFormat = secretKey.getEncoded(); + SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES"); + Cipher cipher = Cipher.getInstance("AES");// 创建密码器 + cipher.init(Cipher.DECRYPT_MODE, key);// 初始化 + byte[] result = cipher.doFinal(encrypted); + return new String(result); // 加密 + } catch (NoSuchAlgorithmException | NoSuchPaddingException | InvalidKeyException | BadPaddingException | IllegalBlockSizeException | IOException e) { + e.printStackTrace(); + } + return null; + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/BigDecimalUtil.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/BigDecimalUtil.java new file mode 100644 index 0000000..eb8abee --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/BigDecimalUtil.java @@ -0,0 +1,27 @@ +package com.passManage.us.core.utils; + +import java.math.BigDecimal; + +/** + * Created by magicalcoder.com.com on 2016/9/26. + */ +public class BigDecimalUtil { + + /** + * 保留2位小数 + * @param num + * @return + */ + public static BigDecimal setTwoScale(BigDecimal num){ + return num.setScale(2, BigDecimal.ROUND_HALF_UP); + } + /** + * 保留n位小数 + * @param num + * @param newScale 小数点位数 + * @return + */ + public static BigDecimal setScale(BigDecimal num,int newScale){ + return num.setScale(newScale, BigDecimal.ROUND_HALF_UP); + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/CollectionUtil.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/CollectionUtil.java new file mode 100644 index 0000000..7afca0f --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/CollectionUtil.java @@ -0,0 +1,88 @@ +package com.passManage.us.core.utils; + +import java.util.*; + +public class CollectionUtil { + + private CollectionUtil() { + super(); + } + + // 判断一个集合是否为空 + public static <T> boolean isEmpty(Collection<T> col) { + if (col == null || col.isEmpty()) { + return true; + } + + return false; + } + + // 判断一个集合是否不为空 + public static <T> boolean isNotEmpty(Collection<T> col) { + return !isEmpty(col); + } + + // 判断Map是否为空 + public static <K, V> boolean isEmpty(Map<K, V> map) { + if (map == null || map.isEmpty()) { + return true; + } + + return false; + } + + // 判断Map是否不为空为空 + public static <K, V> boolean isNotEmpty(Map<K, V> map) { + return !isEmpty(map); + } + + // 去除list中的重复数据 + public static <T> List<T> removeRepeat(List<T> list) { + if (isEmpty(list)) { + return list; + } + + List<T> result = new ArrayList<T>(); + for (T e : list) { + if (!result.contains(e)) { + result.add(e); + } + } + + return result; + } + + // 将集合转换为String数组 + public static <T> String[] toArray(List<T> list) { + if (isEmpty(list)) { + return null; + } + + String[] result = new String[list.size()]; + for (int i = 0; i < list.size(); i++) { + result[i] = String.valueOf(list.get(i)); + } + + return result; + } + + /** + * 使用 Map按key进行排序 + * + * @param map + * @return + */ + public static Map<String, String> sortMapByKey(Map<String, String> map) { + if (map == null || map.isEmpty()) { + return null; + } + Map<String, String> sortMap = new TreeMap<>(new Comparator<String>() { + @Override + public int compare(String str1, String str2) { + return str1.compareTo(str2); + } + }); + sortMap.putAll(map); + return sortMap; + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/CookieUtil.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/CookieUtil.java new file mode 100644 index 0000000..717d1bc --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/CookieUtil.java @@ -0,0 +1,118 @@ +package com.passManage.us.core.utils; + +import javax.servlet.http.Cookie; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.UnsupportedEncodingException; +import java.net.URLDecoder; +import java.net.URLEncoder; +import java.util.Map; +import java.util.TreeMap; + +/** + * Created by www.magicalcoder.com on 2018/3/23. + */ +public class CookieUtil { + /** + * 添加cookie + * @param res 目标httpResponse对象 + * @param key cookie名称 + * @param value cookie值 + */ + public static void addCookie(HttpServletResponse res, String key, String value) { + Cookie cookie = cookieBuild(key, value, 60*60*24*365, "/", false); + res.addCookie(cookie); + } + + /** + * + * @param key cookie名称 + * @param value cookie值 + * @param maxAge cookie有效期 + * @param path Specifies a path for the cookie to which the client should return the cookie. + * @param httpOnly Marks or unmarks this Cookie as HttpOnly. + * @return Cookie + */ + private static Cookie cookieBuild(String key, String value, Integer maxAge, String path, Boolean httpOnly){ + Cookie cookie; + try { + cookie = new Cookie(key, URLEncoder.encode(value,"UTF-8")); + } catch (UnsupportedEncodingException e) { + cookie = new Cookie(key, value); + } + //设置cookie过期时间为365天 + cookie.setMaxAge(maxAge); + cookie.setPath(path); + cookie.setHttpOnly(httpOnly); + return cookie; + } + + /** + * 删除cookie + * @param res 目标httpResponse对象 + * @param key cookie名称 + */ + public static void deleteCookie(HttpServletResponse res, String key) { + Cookie cookie = new Cookie(key, ""); + cookie.setPath("/"); + cookie.setMaxAge(0); + res.addCookie(cookie); + } + + /** + * 删除cookie + * @param res + * @param key + * @param domain + */ + public static void deleteCookie(HttpServletResponse res, String key, String domain) { + Cookie cookie = new Cookie(key, ""); + cookie.setPath("/"); + cookie.setMaxAge(0); + cookie.setDomain(domain); + res.addCookie(cookie); + } + + public static String getCookie(HttpServletRequest request, String key){ + Map<String, String> cookies = getCookies(request); + if(cookies == null){ + return null; + } + try { + return URLDecoder.decode(cookies.getOrDefault(key, ""), "UTF-8"); + } catch (UnsupportedEncodingException e) { + return cookies.get(key); + } + } + + /** + * 判断cookie是否存在 + * @param request + * @param key + * @return + */ + public static boolean isCookieExists(HttpServletRequest request, String key) { + Map<String, String> cookies = getCookies(request); + if ( cookies!=null ){ + return cookies.containsKey(key); + } + return false; + } + + /** + * 将cookies[]转为{cookieName: cookieValue} + * 使用TreeMap<>(String.CASE_INSENSITIVE_ORDER)忽略name的大小写 + * @param request 目标request对象上的cookie + * @return cookies + */ + private static Map<String, String> getCookies(HttpServletRequest request){ + Cookie[] cookies = request.getCookies(); + Map<String, String> cookieMap = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + if(null != cookies){ + for(Cookie cookie : cookies){ + cookieMap.put(cookie.getName(), cookie.getValue()); + } + } + return cookieMap; + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/CopyUtil.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/CopyUtil.java new file mode 100644 index 0000000..5e3b54d --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/CopyUtil.java @@ -0,0 +1,162 @@ +package com.passManage.us.core.utils; + + +import org.springframework.beans.BeanUtils; + +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; +import java.math.BigDecimal; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +public class CopyUtil { + private static String builtGetMethod(String javaZd){ + return "get"+javaZd.substring(0,1).toUpperCase()+javaZd.substring(1); + } + private static String builtSetMethod(String javaZd){ + return "set"+javaZd.substring(0,1).toUpperCase()+javaZd.substring(1); + } + + /** + * 为空直接不拷贝 + * @param cnField + * @param sourceObj + * @param targetObj + * @param zero 为0是否拷贝 + * @throws NoSuchMethodException + * @throws InvocationTargetException + * @throws IllegalAccessException + */ + private static void setValue(Field cnField,Object sourceObj,Object targetObj,boolean zero) { + try{ + String cnName = cnField.getName(); + Class<?> type = cnField.getType(); + String typeName = type.getName(); + String getMethodName = builtGetMethod(cnName); + String setMethodName = builtSetMethod(cnName); + Method cnMethod = sourceObj.getClass().getMethod(getMethodName); + Method enFieldMethod = targetObj.getClass().getMethod(getMethodName); + if(enFieldMethod==null) return; + Object v = cnMethod.invoke(sourceObj); + if(v==null) return; + if("java.lang.String".equals(typeName)){ + String value = (String)v; + if(StringUtil.isNotBlank(value)){ + Method enMethod = targetObj.getClass().getMethod(setMethodName, String.class); + enMethod.invoke(targetObj,value); + } + }else if("java.math.BigDecimal".equals(typeName)){ + BigDecimal value = (BigDecimal)v; + if(zero|| value.compareTo(BigDecimal.ZERO)!=0){ + Method enMethod = targetObj.getClass().getMethod(setMethodName, BigDecimal.class); + enMethod.invoke(targetObj,value); + } + }else if("java.lang.Integer".equals(typeName)){ + Integer value = (Integer)v; + if( zero|| value.intValue()!=0){ + Method enMethod = targetObj.getClass().getMethod(setMethodName, Integer.class); + enMethod.invoke(targetObj,value); + } + }else if("java.lang.Float".equals(typeName)){ + Float value = (Float)v; + if(zero|| value.floatValue()!=0){ + Method enMethod = targetObj.getClass().getMethod(setMethodName, Float.class); + enMethod.invoke(targetObj,value); + } + }else if("java.lang.Long".equals(typeName)){ + Long value = (Long)v; + if( zero ||value.longValue()!=0){ + Method enMethod = targetObj.getClass().getMethod(setMethodName, Long.class); + enMethod.invoke(targetObj,value); + } + }else if("java.util.Date".equals(typeName)){ + Date value = (Date)v; + Method enMethod = targetObj.getClass().getMethod(setMethodName, Date.class); + enMethod.invoke(targetObj,value); + }else if("java.lang.Double".equals(typeName)){ + Double value = (Double)v; + if( zero ||value.doubleValue()!=0){ + Method enMethod = targetObj.getClass().getMethod(setMethodName, Double.class); + enMethod.invoke(targetObj,value); + } + } + }catch (NoSuchMethodException e){ + + }catch (Exception e){ + e.printStackTrace(); + } + } + + /** 拷贝基础对象 0拷贝 null不拷贝 + * @param from + * @param to + * @return + */ + public static Object reflectCopyZeroNotNull(Object from, Object to){ + Field[] cnFields = from.getClass().getDeclaredFields(); + for(Field cnField : cnFields){ + setValue(cnField,from,to,true); + } + return to; + } + /** 拷贝基础对象 0不拷贝 null不拷贝 + * @param from + * @param to + * @return + */ + public static Object reflectCopyNotZeroNotNull(Object from, Object to){ + try{ + Field[] cnFields = from.getClass().getDeclaredFields(); + for(Field cnField : cnFields){ + setValue(cnField,from,to,false); + } + }catch (Exception e){ + e.printStackTrace(); + } + return to; + } + /** 拷贝基础对象 + * @param from + * @param to + * @return + */ + public static Object copy(Object from, Object to){ + BeanUtils.copyProperties(from,to); + return to; + } + + /** 拷贝list + * @param entitys 源数据 + * @param toClazz 返回的数据类型 + * @return + */ + public static <D,E> List<D> copy(List<E> entitys,Class toClazz){ + if(entitys == null || entitys.size()<=0){ + return null; + } + List<D> ls = new ArrayList<D>(); + D d = null; + try { + for(E entity:entitys){ + d = (D) toClazz.newInstance(); + copy(entity,d); + ls.add(d); + } + } catch (Exception e) { + e.printStackTrace(); + } + return ls; + } + + public static Object copy(Object source,Object target,Class<?> tClass){ + BeanUtils.copyProperties(source,target,tClass); + return target; + } + + public static Object copy(Object source,Object target,String ... ignoreFields) { + BeanUtils.copyProperties(source, target, ignoreFields); + return target; + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/DateCalcUtil.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/DateCalcUtil.java new file mode 100644 index 0000000..cc7a9f6 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/DateCalcUtil.java @@ -0,0 +1,189 @@ +package com.passManage.us.core.utils; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +/** + * qq:799374340 + * @author hdy + * 2013-6-19下午2:25:12 + */ +public class DateCalcUtil { + static ThreadLocal<GregorianCalendar> local = new ThreadLocal<GregorianCalendar>() { + protected GregorianCalendar initialValue() { + return new GregorianCalendar(); + }; + }; + static final int[] d = new int[] { 1, 3, 5, 7, 8, 10, 12 }; + + // 获取前一天 date:20101212 就会返回20101211 + public static int getBeforeOneDay(int date) { + return getBeforeDay(date - 1); + } + + //获得一天后的数据 + public static int getAfterOneDay(int v) { + int day = v % 100; + if (day <= 27) {// 快速算 27号以前直接返回+1 + return v + 1; + } + if (v % 10000 == 1231) { + return v + 8870; + } + int f = (v % 10000) / 100; + int dd = Arrays.binarySearch(d, f); + if (dd < 0) {// 2 4 6 9 11 + if (f == 2) { + return getVfrom2Month(v, day); + } else {// 4 6 9 11月 + if (day < 30) { + return v + 1; + } else {// 30号20120430 + return v + 71; + } + } + } else {// 1,3,5,7,8,10,12月 + if (day < 31) { + return v + 1; + } else {// 31号20120431 + return v + 70; + } + } + } + // 格式化数据 + private static int getBeforeDay(int v) { + if (v % 100 == 0) { + int f = (v % 10000) / 100; + int dd = Arrays.binarySearch(d, f); + if (dd < 0) { + return v - 69; + } + if (dd >= 0) { + if (f == 3) { + int y = v / 10000; + if (local.get().isLeapYear(y)) {// 闰年 + return v - 71; + } + return v - 72; + } else if (f == 1) { + return v - 8869; + } else if (f == 8) {// 重构了下 如果是79960801前一天就不行了79960800 + return v - 69; + } + return v - 70; + } + } + return v; + } + //获取2月的时间 + private static int getVfrom2Month(int v, int day) { + // 2月 + if (day < 28) { + return v + 1; + } else { + int y = v / 10000; + if (local.get().isLeapYear(y)) {// 闰年20120229 20120301 + if (day == 29) { + return v + 72; + } else {// 28号 + return v + 1; + } + } else {// 28号 + if (day == 28) {// 平年 + return v + 73; + } + } + } + return v + 1; + } + // 日期字符串转成long型返回 + public static long parseDateStrToLong(String date, String format) { + SimpleDateFormat sf = new SimpleDateFormat(format); + try { + return sf.parse(date).getTime(); + } catch (ParseException e) { + e.printStackTrace(); + return 0L; + } + } + //日期 + public static Date changeDay(Date d, int offset) { + if (d == null) + return null; + Calendar calendar = Calendar.getInstance(); + calendar.setTime(d); + calendar.set(Calendar.DAY_OF_YEAR, + (calendar.get(Calendar.DAY_OF_YEAR) + offset)); + return calendar.getTime(); + } + + public static Date changeHour(Date d, int offset) { + if (d == null) + return null; + Calendar calendar = Calendar.getInstance(); + calendar.setTime(d); + calendar.set(Calendar.HOUR_OF_DAY, + (calendar.get(Calendar.HOUR_OF_DAY) + offset)); + return calendar.getTime(); + } + + public static Date changeMinute(Date d, int offset) { + if (d == null) + return null; + Calendar calendar = Calendar.getInstance(); + calendar.setTime(d); + calendar.set(Calendar.MINUTE, (calendar.get(Calendar.MINUTE) + offset)); + return calendar.getTime(); + } + + public static Date changeSecond(Date d, int offset) { + if (d == null) + return null; + Calendar calendar = Calendar.getInstance(); + calendar.setTime(d); + calendar.set(Calendar.SECOND, (calendar.get(Calendar.SECOND) + offset)); + return calendar.getTime(); + } + + // 获得两日期之间相距天数 + public static long compareWithDay(Date maxDate1, Date minDate2) { + long quot = 0; + quot = maxDate1.getTime() - minDate2.getTime(); + quot = quot / 1000 / 60 / 60 / 24; + return quot; + } + + // 获得两日期之间相距小时 + public static long compareWithHour(Date maxDate1, Date minDate2) { + long quot = 0; + quot = maxDate1.getTime() - minDate2.getTime(); + quot = quot / 1000 / 60 / 60; + return quot; + } + + // 获得两日期之间相距分钟 + public static long compareWithMinute(Date maxDate1, Date minDate2) { + long quot = 0; + quot = maxDate1.getTime() - minDate2.getTime(); + quot = quot / 1000 / 60; + return quot; + } + + // 获得两日期之间相距秒钟 + public static long compareWithSecond(Date maxDate1, Date minDate2) { + long quot = 0; + quot = maxDate1.getTime() - minDate2.getTime(); + quot = quot / 1000; + return quot; + } + //获取现在到今天23:59:59间距多少秒 + public static int nowToTodayEndSeconds(){ + Date now = new Date(); + long between = compareWithSecond(DateFormatUtil.getDateEnd(now),now); + return Integer.valueOf(between+""); + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/DateFormatUtil.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/DateFormatUtil.java new file mode 100644 index 0000000..65e7e4a --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/DateFormatUtil.java @@ -0,0 +1,298 @@ +package com.passManage.us.core.utils; + +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +/** + * qq:799374340 hdy 2013-4-17上午11:47:47 + */ +public class DateFormatUtil { + +/* public static final SimpleDateFormat df = new SimpleDateFormat( + "yyyy-MM-dd HH:mm:ss"); + + public static SimpleDateFormat getDateFormat() { + return df; + }*/ + public static Date getDate(Date date, String format) { + SimpleDateFormat df = new SimpleDateFormat(format); + try { + return df.parse(getStringDate(date,format)); + } catch (ParseException e) { + e.printStackTrace(); + } + return null; + } + public static Date getDate(String dateStr, String format) { + SimpleDateFormat df = new SimpleDateFormat(format); + try { + return df.parse(dateStr); + } catch (ParseException e) { + e.printStackTrace(); + return null; + } + } + /** + * @param year + * @param month 1-12 + * @param day 1-31 + * @return + */ + public static Date getDateDefined(int year, int month, int day) { + month = month-1; + Calendar calendar = Calendar.getInstance(); + // month,day格式不正确,默认取当天时间 + if (month >= 0 && month <= 11 && day >= 1 && day <= 31) { + calendar.set(Calendar.YEAR, year); + calendar.set(Calendar.MONTH, month); + calendar.set(Calendar.DATE, day); + } + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + // calendar.set(Calendar.MILLISECOND, 0); + return calendar.getTime(); + } + /** 获取自定义日期 + * @param year + * @param month + * @param day + * @param hour + * @param minute + * @param second + * @return + */ + public static Date getDateDefined(int year, int month, int day,int hour,int minute,int second) { + month = month-1; + Calendar calendar = Calendar.getInstance(); + // month,day格式不正确,默认取当天时间 + if (month >= 0 && month <= 11 && day >= 1 && day <= 31) { + calendar.set(Calendar.YEAR, year); + calendar.set(Calendar.MONTH, month); + calendar.set(Calendar.DATE, day); + } + calendar.set(Calendar.HOUR_OF_DAY, hour); + calendar.set(Calendar.MINUTE, minute); + calendar.set(Calendar.SECOND, second); + return calendar.getTime(); + } + /** + * 返回当天 自定义时分秒 + * @return + */ + public static Date getDateDefined(Date date, int hour, int minute, + int second) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.set(Calendar.HOUR_OF_DAY, hour); + calendar.set(Calendar.MINUTE, minute); + calendar.set(Calendar.SECOND, second); + return calendar.getTime(); + } + /** + * 以当天零点零分零秒零毫秒格式返回date + * @param date + * @return + */ + public static Date getDateBegin(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + // calendar.set(Calendar.MILLISECOND, 0); + return calendar.getTime(); + } + /** + * 以当天23点59分59秒格式返回date + * @param date + * @return + */ + public static Date getDateEnd(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.set(Calendar.HOUR_OF_DAY, 23); + calendar.set(Calendar.MINUTE, 59); + calendar.set(Calendar.SECOND, 59); + return calendar.getTime(); + } + //int返回日期 + public static Date getDateEnd(int dateYmd){ + String dateStr = dateYmd+"235959"; + return getDate(dateStr,"yyyyMMddHHmmss"); + } + //int返回日期 + public static Date getDateBegin(int dateYmd ){ + String dateStr = dateYmd+"000000"; + return getDate(dateStr,"yyyyMMddHHmmss"); + } + public static String getStringDate(Date date, String format) { + SimpleDateFormat df = new SimpleDateFormat(format); + return df.format(date); + } + /** yyyy-MM-dd HH:mm:ss格式 + * @param date + * @return + */ + public static String getStringDefaultDate(Date date) { + if (date != null) { + SimpleDateFormat df = new SimpleDateFormat( + "yyyy-MM-dd HH:mm:ss"); + return df.format(date); + } + return ""; + } + + /**获取年月日整形返回 + * @param date + * @return + */ + public static int getIntDateYmd(Date date){ + if(date==null){ + date = new Date(); + } + String dateStr = getStringDate(date, "yyyyMMdd"); + return Integer.valueOf(dateStr); + } + + /**获取时分秒整形返回 + * @param date + * @return + */ + public static int getIntDateHms(Date date){ + if(date==null){ + date = new Date(); + } + String dateStr = getStringDate(date, "HHmmss"); + return Integer.valueOf(dateStr); + } + /** + * 获取日期年份 + * @param date + * @return + * @throws ParseException + */ + public static int getIntYear(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + return calendar.get(Calendar.YEAR); + } + + /** + * 获取日期月份 + * @param date + * @return + * @throws ParseException + */ + public static int getIntMonth(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + return (calendar.get(Calendar.MONTH) + 1); + } + /** + * 获取日期天 + * @param date + * @return + * @throws ParseException + */ + public static int getIntDay(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + return (calendar.get(Calendar.DAY_OF_MONTH)); + } + /** + * 返回格式化的字符串 + * @param date 11 + * @param format 000000 + * @return 000011 + */ + public static String getFormatStr(int date,String format){ + DecimalFormat df = new DecimalFormat(format); + return df.format(date); + } + /** + * 获取月份起始日期 + * @param date + * @return + * @throws ParseException + */ + public static Date getMonthDateBegin(Date date){ + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMinimum(Calendar.DAY_OF_MONTH)); + return calendar.getTime(); + } + + /** + * 获取月份最后日期 + * @param date + * @return + * @throws ParseException + */ + public static Date getMonthDateEnd(Date date){ + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); + return calendar.getTime(); + } + + /** + * 获取本周周一 + * @param now + * @return + */ + public static Date getMonday(Date now){ + Calendar calendar = Calendar.getInstance(); + calendar.setTime(now); + calendar.setFirstDayOfWeek(Calendar.MONDAY); + calendar.set(Calendar.DAY_OF_WEEK,Calendar.MONDAY); + return calendar.getTime(); + } + + /** + * 获取本周某天 + * @param now + * @param calendayDay Calendar.MONDAY ... + * @return + */ + public static Date getCalendayDay(Date now,int calendayDay){ + Calendar calendar = Calendar.getInstance(); + calendar.setTime(now); + calendar.setFirstDayOfWeek(Calendar.MONDAY); + calendar.set(Calendar.DAY_OF_WEEK,calendayDay); + return calendar.getTime(); + } + /** + * 获取本周周日 + * @param now + * @return + */ + public static Date getSunday(Date now){ + Calendar calendar = Calendar.getInstance(); + calendar.setTime(now); + calendar.setFirstDayOfWeek(Calendar.MONDAY); + calendar.set(Calendar.DAY_OF_WEEK,Calendar.SUNDAY); + return calendar.getTime(); + } + + /** + * 获取当前时间 + * + * @return + */ + public static String getCurrentDateTimeStr() { + return (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(System.currentTimeMillis()); + } + +/* public static void main(String[] args) { + Date now = + DateFormatUtils.getMonday(DateFormatUtils.getDateBegin(20140320)); + Date monday = getMonday(now); + Date sunday = getSunday(now); + System.out.println(getIntDateYmd(monday)); + System.out.println(getIntDateYmd(sunday)); + }*/ +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/HttpRequestBuildUrlUtil.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/HttpRequestBuildUrlUtil.java new file mode 100644 index 0000000..de174c3 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/HttpRequestBuildUrlUtil.java @@ -0,0 +1,36 @@ +package com.passManage.us.core.utils; + +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletRequest; +import java.util.Map; + +@Component +public class HttpRequestBuildUrlUtil { + + public static String buildUrl(String baseUrl, Map<String, String> param) { + StringBuilder sb = new StringBuilder(baseUrl + "?"); + for (String key : param.keySet()) { + sb.append(key + "=" + param.get(key) + "&"); + } + sb.deleteCharAt(sb.length() - 1); + return sb.toString(); + } + + + public static String buildCCXSign(Map<String, String> param) { + StringBuilder sb = new StringBuilder(); + for (Map.Entry<String, String> entry : param.entrySet()) { + sb.append(entry.getKey() + entry.getValue()); + } + return sb.toString(); + } + + public static String getCtx(HttpServletRequest request){ + String path = request.getContextPath(); + String CTX = request.getScheme() + "://" + + request.getServerName() + ":" + request.getServerPort() + + path + "/"; + return CTX; + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/ImgeUtil.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/ImgeUtil.java new file mode 100644 index 0000000..1c86185 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/ImgeUtil.java @@ -0,0 +1,49 @@ +package com.passManage.us.core.utils; + +import java.awt.image.BufferedImage; + +/** + * Created by magicalcoder.com.com on 2016/2/23. + */ +public class ImgeUtil { + + //文件后缀 + public static String suffix(String imgUrl){ + if(StringUtil.isNotBlank(imgUrl)){ + int lidx = imgUrl.lastIndexOf("."); + return imgUrl.substring(lidx+1); + } + return null; + } + + public static BufferedImage requestRemoteImg(String imgUrl) { + if(StringUtil.isBlank(imgUrl)){ + return null; + } + /*InputStream returnResponse; + HttpClient httpClient = HttpClientBuilder.create().build(); + HttpGet get = new HttpGet(imgUrl); + //针对一般服务器Circular redirect 可以加上.setCircularRedirectsAllowed(true) + RequestConfig requestConfig = RequestConfig.custom() + .setSocketTimeout(4000).setConnectTimeout(4000).setCircularRedirectsAllowed(true).build();//设置请求和传输超时时间 + get.setConfig(requestConfig); + get.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.1; rv:25.0) Gecko/20100101 Firefox/25.0"); + get.addHeader("Content-type", "text/html;charset=UTF-8"); + //创建HttpGet实例 + HttpResponse response; + try { + response = httpClient.execute(get); + HttpEntity entity = response.getEntity(); + returnResponse = entity.getContent(); + BufferedImage sourceImg = ImageIO.read(returnResponse); + EntityUtils.consume(entity); + return sourceImg; + } catch (Exception e) { + e.printStackTrace(); + }finally { + get.releaseConnection(); + get.abort(); + }*/ + return null; + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/IpUtil.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/IpUtil.java new file mode 100644 index 0000000..67366ca --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/IpUtil.java @@ -0,0 +1,32 @@ +package com.passManage.us.core.utils; + +import javax.servlet.http.HttpServletRequest; + +/** + * author: www.magicalcoder.com + * date:2018/5/14 + * function: 获取请求用户ip 前提nginx等中间件必须把ip代理到服务器 + */ +public class IpUtil { + + public static String getIp(HttpServletRequest request){ + String ip = request.getHeader("x-forwarded-for"); + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("WL-Proxy-Client-IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_CLIENT_IP"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getHeader("HTTP_X_FORWARDED_FOR"); + } + if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { + ip = request.getRemoteAddr(); + } + return ip; + } + +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/JsonUtil.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/JsonUtil.java new file mode 100644 index 0000000..514a08f --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/JsonUtil.java @@ -0,0 +1,45 @@ +package com.passManage.us.core.utils; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.serializer.SerializeConfig; +import com.alibaba.fastjson.serializer.SerializerFeature; +import com.alibaba.fastjson.serializer.SimpleDateFormatSerializer; + +import java.sql.Date; +import java.util.List; + + +public class JsonUtil { + + /** + * 递归设置子对象类 不支持数组 + * @param jsonString + * @param pojoClass + * @param <T> + * @return + */ + public static <T> T getObjectFromJSONString(String jsonString, Class<T> pojoClass) { + return JSON.parseObject(jsonString,pojoClass); + } + + public static String toJSONString(Object o){ + SerializeConfig config = new SerializeConfig(); + config.put(Date.class, new SimpleDateFormatSerializer("yyyy-MM-dd HH:mm:ss")); + SerializerFeature[] features = new SerializerFeature[]{SerializerFeature.WriteDateUseDateFormat,SerializerFeature.WriteMapNullValue}; + return JSON.toJSONString(o,config,features); + } + + /** + * 不支持递归设置子对象类 + * @param json + * @param beanClazz + * @param <T> + * @return + */ + public <T> List<T> getListFromJSONString(String json, Class<T> beanClazz){ + if(StringUtil.isBlank(json)){ + return null; + } + return JSON.parseArray(json, beanClazz); + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/ListUtil.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/ListUtil.java new file mode 100644 index 0000000..ce313cc --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/ListUtil.java @@ -0,0 +1,27 @@ +package com.passManage.us.core.utils; + +import java.util.List; + +/** + * qq:799374340 + * @author hdy + * 2013-6-17上午9:48:59 + */ +public class ListUtil { + public static boolean isBlank(List ls){ + return ls==null || ls.isEmpty(); + } + public static boolean isNotBlank(List ls){ + return !isBlank(ls); + } + public static String join(List ls,String split){ + if(isNotBlank(ls)){ + StringBuffer sb = new StringBuffer(); + for(Object item:ls){ + sb.append(item).append(split); + } + return StringUtil.deleteLastChar(sb.toString()); + } + return null; + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/MapUtil.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/MapUtil.java new file mode 100644 index 0000000..6da8cb1 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/MapUtil.java @@ -0,0 +1,99 @@ +package com.passManage.us.core.utils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * Created by www.magicalcoder.com on 2015/5/26. + * 799374340@qq.com + */ +public class MapUtil { + public static Map<String,Object> buildMap(String key,Object value ,Object... args){ + Map<String,Object> query = new HashMap<String, Object>(); + query.put(key, value); + if(args!=null && args.length>0){ + if(args.length%2 != 0 ){ + throw new RuntimeException("key value要成对"); + } + for(int i=0;i<args.length;){ + query.put((String)args[i],args[i+1]); + i=i+2; + } + } + return query; + } + public static Map<String,String> buildStringMap(String key,String value ,String... args){ + Map<String,String> query = new HashMap<String, String>(); + query.put(key, value); + if(args!=null && args.length>0){ + if(args.length%2 != 0 ){ + throw new RuntimeException("key value要成对"); + } + for(int i=0;i<args.length;){ + query.put((String)args[i],args[i+1]); + i=i+2; + } + } + return query; + } + + public static <T> Map<T,T> buildTMap(T key,T value ,T... args){ + Map<T,T> query = new HashMap<T, T>(); + query.put(key, value); + if(args!=null && args.length>0){ + if(args.length%2 != 0 ){ + throw new RuntimeException("key value要成对"); + } + for(int i=0;i<args.length;){ + query.put((T)args[i],args[i+1]); + i=i+2; + } + } + return query; + } + + /** + * 相同key会被覆盖 + * @param field + * @param entityList + * @return + */ + public static <K, E> Map<K, E> listToItemMap(String field,List<E> entityList){ + Map<K, E> map = new HashMap<K, E>(); + if(ListUtil.isNotBlank(entityList)){ + ReflectUtil<K, E> reflectUtil = new ReflectUtil<K, E>(); + for(E item:entityList){ + K beanValue = reflectUtil.getBeanValue(item,field); + map.put(beanValue,item); + } + } + return map; + } + /** + * 相同key会被合并成数组 + * @param field + * @param entityList + * @return + */ + public static <K, E> Map<K, List<E>> listToListMap(String field,List<E> entityList){ + Map<K, List<E>> map = new HashMap<K, List<E>>(); + if(ListUtil.isNotBlank(entityList)){ + ReflectUtil<K, E> reflectUtil = new ReflectUtil<K, E>(); + for(E item:entityList){ + K beanValue = reflectUtil.getBeanValue(item,field); + List<E> itemList = map.get(beanValue); + if(itemList==null){ + itemList = new ArrayList<E>(); + map.put(beanValue,itemList); + } + itemList.add(item); + } + } + return map; + } + public static void main(String[] args) { + + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/MathUtil.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/MathUtil.java new file mode 100644 index 0000000..b5f1871 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/MathUtil.java @@ -0,0 +1,44 @@ +package com.passManage.us.core.utils; + +import java.util.ArrayList; +import java.util.List; + +/** + * author: www.magicalcoder.com + * date:2018/3/26 + * function: + */ +public class MathUtil { + /** + * + * 笛卡尔积 + * @param cutList + * @param result + * @param layer 首次传 0 + * @param curList + * @param <T> + */ + public static <T> void dicar(List<List<T>> cutList, List<List<T>> result, int layer, List<T> curList) { + if (layer < cutList.size() - 1) { + if (cutList.get(layer).size() == 0) { + dicar(cutList, result, layer + 1, curList); + } else { + for (int i = 0; i < cutList.get(layer).size(); i++) { + List<T> list = new ArrayList<T>(curList); + list.add(cutList.get(layer).get(i)); + dicar(cutList, result, layer + 1, list); + } + } + } else if (layer == cutList.size() - 1) { + if (cutList.get(layer).size() == 0) { + result.add(curList); + } else { + for (int i = 0; i < cutList.get(layer).size(); i++) { + List<T> list = new ArrayList<T>(curList); + list.add(cutList.get(layer).get(i)); + result.add(list); + } + } + } + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/Md5Util.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/Md5Util.java new file mode 100644 index 0000000..6121b26 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/Md5Util.java @@ -0,0 +1,93 @@ +/** + * + */ +package com.passManage.us.core.utils; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.UnsupportedEncodingException; +import java.security.MessageDigest; + +/** + * + * @author www.magicalcoder.com + * @time 2017年5月27日-下午1:19:44 + */ +public class Md5Util { + + private Md5Util() {} + + private static Logger logger = LoggerFactory.getLogger(Md5Util.class); + + /** 16进制的字符数组 */ + private final static String[] hexDigits = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", + "e", "f" }; + + public static void main(String[] args) { + System.out.println(md5Encode("12345678he 单独9012345678901234567890")); + } + + /** + * + * + * @param source + * 需要加密的原字符串 + * @return + */ + public static String md5Encode(String source) { + try { + return md5Encode(source.getBytes("utf-8")); + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + return md5Encode(source.getBytes()); + } + } + public static String md5Encode(byte[] source) { + String result = null; + try { + // 获得MD5摘要对象 + MessageDigest messageDigest = MessageDigest.getInstance("MD5"); + // 使用指定的字节数组更新摘要信息 + messageDigest.update(source); + // messageDigest.digest()获得16位长度 + result = byteArrayToHexString(messageDigest.digest()); + } catch (Exception e) { + logger.error("Md5Utils Exception!", e); + } + return result; + } + + /** + * 转换字节数组为16进制字符串 + * + * @param bytes + * 字节数组 + * @return + */ + private static String byteArrayToHexString(byte[] bytes) { + StringBuilder stringBuilder = new StringBuilder(); + for (byte tem : bytes) { + stringBuilder.append(byteToHexString(tem)); + } + return stringBuilder.toString(); + } + + /** + * 转换byte到16进制 + * + * @param b + * 要转换的byte + * @return 16进制对应的字符 + */ + private static String byteToHexString(byte b) { + int n = b; + if (n < 0) { + n = 256 + n; + } + int d1 = n / 16; + int d2 = n % 16; + return hexDigits[d1] + hexDigits[d2]; + } + +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/OpenBrowserUtil.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/OpenBrowserUtil.java new file mode 100644 index 0000000..ee37404 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/OpenBrowserUtil.java @@ -0,0 +1,96 @@ +package com.passManage.us.core.utils; + +import com.passManage.us.core.common.constant.SystemOperateEnum; +import org.springframework.boot.system.ApplicationHome; + +import java.io.File; +import java.lang.reflect.Method; + +/** + * Created by hedongyu on 2018/7/23. + * 打开浏览器 + */ +public class OpenBrowserUtil { + + public static void main(String[] args) { +// openURL("C:\\Program Files (x86)\\Google\\Chrome\\Application\\chrome.exe","http://www.baidu.com"); + } + + public static void openURL(String explorerPath,String url){ + if(StringUtil.isBlank(explorerPath)){ + if(openURL(url)){ + return; + } + }else { + File file = new File(explorerPath); + if(!file.exists()){ + openURL(url); + return; + } + SystemOperateEnum systemOperateEnum = SystemOperateUtil.system(); + switch (systemOperateEnum){ + case WINDOWS: + try { + ProcessBuilder proc = new ProcessBuilder(explorerPath,url); + ApplicationHome home = new ApplicationHome(OpenBrowserUtil.class); + /*很有必要 不然会占用target*/ + File jarPath = home.getDir(); + File workPath = jarPath; + for(int i=0;i<2;i++){//往上级目录 + if(workPath.getParentFile().exists()){ + workPath = workPath.getParentFile(); + }else { + break; + } + } + proc.directory(workPath);//非常重要 否则不关闭浏览器 无法maven编译 提示target占用 + proc.start(); + }catch (Exception e){ + e.printStackTrace(); + openURL(url); + } + break; + default: + openURL(url); + } + } + } + + public static boolean openURL(String url) { + try { + browse(url); + return true; + } catch (Exception e) { + e.printStackTrace(); + } + return false; + } + + private static void browse(String url) throws Exception { + //获取操作系统的名字 + String osName = System.getProperty("os.name", ""); + if (osName.startsWith("Mac OS")) { + //苹果的打开方式 + Class fileMgr = Class.forName("com.apple.eio.FileManager"); + Method openURL = fileMgr.getDeclaredMethod("openURL", new Class[] { String.class }); + openURL.invoke(null, new Object[] { url }); + } else if (osName.startsWith("Windows")) { + //windows的打开方式。 + Runtime.getRuntime().exec("rundll32 url.dll,FileProtocolHandler " + url); + } else { + // Unix or Linux的打开方式 + String[] browsers = { "firefox", "opera", "konqueror", "epiphany", "mozilla", "netscape" }; + String browser = null; + for (int count = 0; count < browsers.length && browser == null; count++) + //执行代码,在brower有值后跳出, + //这里是如果进程创建成功了,==0是表示正常结束。 + if (Runtime.getRuntime().exec(new String[] { "which", browsers[count] }).waitFor() == 0) + browser = browsers[count]; + if (browser == null) + throw new Exception("Could not find web browser"); + else + //这个值在上面已经成功的得到了一个进程。 + Runtime.getRuntime().exec(new String[] { browser, url }); + } + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/OpenDiskUtil.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/OpenDiskUtil.java new file mode 100644 index 0000000..e5bd5b8 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/OpenDiskUtil.java @@ -0,0 +1,40 @@ +package com.passManage.us.core.utils; + +import java.io.File; + +/** + * Created by hedongyu on 2018/7/23. + * 打开文件夹 + */ +public class OpenDiskUtil { + public static void openURL(String url) { + try { + browse(url); + } catch (Exception e) { + e.printStackTrace(); + } + } + + public static void openFileDir(File file) { + try { + browse(file.getParentFile().getAbsolutePath()+File.separator); + } catch (Exception e) { + e.printStackTrace(); + } + } + + private static void browse(String url) throws Exception { + //获取操作系统的名字 + String osName = System.getProperty("os.name", ""); + if (osName.startsWith("Mac OS")) { + //苹果的打开方式 + Runtime.getRuntime().exec(" " + url); + } else if (osName.startsWith("Windows")) { + //windows的打开方式。 + Runtime.getRuntime().exec("explorer " + url); + } else { + // Unix or Linux的打开方式 + Runtime.getRuntime().exec("nautilus " + url); + } + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/OssUtils.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/OssUtils.java new file mode 100644 index 0000000..52ac223 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/OssUtils.java @@ -0,0 +1,114 @@ +package com.passManage.us.core.utils; + +import com.alibaba.fastjson.JSON; +import com.aliyun.oss.OSSClient; +import com.aliyun.oss.model.PutObjectResult; + +import java.io.File; +import java.io.InputStream; +import java.net.URL; +import java.util.Date; + +/** + * Created by asus on 2019/6/26. + * oos 工具类 用于初始化连接oos 以及关闭oos连接 + */ +public class OssUtils { + + /**Region请按实际情况填写 */ + private static String endpoint = "http://oss-cn-beijing.aliyuncs.com"; + /**oos存储账号*/ + private static String accessKeyId = ""; + /**oos存储密码*/ + private static String accessKeySecret = ""; + /**oos存储桶*/ + private static String bucketName = "us"; + + public static void main(String[] args) { + initOos(); + upload(initOos(),System.currentTimeMillis()+"","E:\\timg.jpg"); + } + + /**初始化oos连接 返回一个连接对象*/ + public static OSSClient initOos(){ + /**创建一个ossClient实例*/ + OSSClient ossClient =null; + /** 使用异常用于处理 : 连接失败、连接异常等原因*/ + try { + ossClient = new OSSClient(endpoint, accessKeyId, accessKeySecret); + }catch (Exception e){ + /**用于接受连接异常*/ + System.out.println("创建oos实例失败"); + } + return ossClient; + } + + /**上传本地文件*/ + public static boolean upload(OSSClient ossClient,String objectName,String path){ + + try{ + /**需要判断本地文件是否存在 如果不存在上传失败 + 并且需要加上异常 由于网速或者其他原因导致上传失败 需要异常处理*/ + PutObjectResult result = ossClient.putObject(bucketName, objectName, new File(path)); + System.out.println(JSON.toJSONString(result)); + } + catch (Exception e){ + /**如果出现异常 返回上传失败*/ + return false; + } + /**上传成功*/ + return true; + } + + /**上传网络文件*/ + public static boolean upload1(OSSClient ossClient,String objectName,String fileUrl){ + + try{ + /**上传网络流 需要加上异常 由于网速或者其他原因导致上传失败 需要异常处理*/ + InputStream inputStream = new URL(fileUrl).openStream(); + ossClient.putObject(bucketName, objectName, inputStream); + } + catch (Exception e){ + /**如果出现异常 返回上传失败*/ + return false; + } + /**上传成功*/ + return true; + } + + + /**获取文件url*/ + public static URL getFileUrl(OSSClient ossClient,String objectName) { + // 设置URL过期时间为10年 3600l* 1000*24*365*10 + Date expiration = new Date(new Date().getTime() + 3600l * 1000 * 24 * 365 * 10); + //这个地方需要判断 URL是否可用 如果可用 表示 OOS中存在文件 否则不存在文件 + URL url = ossClient.generatePresignedUrl(bucketName, objectName, expiration); + return url; + } + + /**关闭连接oos对象 释放资源 防止占用连接*/ + public static void destroy( OSSClient ossClient){ + /** 使用异常用于处理 :关闭oos连接*/ + try { + ossClient.shutdown(); + }catch (Exception e){ + /**用于接受连接异常*/ + System.out.println("关闭oos实例失败"); + } + } + + /**判断url是否可用*/ + public static boolean handleUrl(String fileUrl){ + URL url; + try { + url = new URL(fileUrl); + InputStream in = url.openStream(); + return true; + } catch (Exception e1) { + url = null; + return false; + } + } + + +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/POIUtil.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/POIUtil.java new file mode 100644 index 0000000..29ce42a --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/POIUtil.java @@ -0,0 +1,203 @@ +package com.passManage.us.core.utils; + +import com.alibaba.fastjson.JSON; +import com.passManage.us.core.common.dto.KeyValue; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddressList; +import org.apache.poi.xssf.streaming.SXSSFWorkbook; +import org.apache.poi.xssf.usermodel.XSSFDataValidation; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +import java.io.*; +import java.lang.reflect.Field; +import java.math.BigDecimal; +import java.util.*; + +/** + * Created by magicalcoder.com + * 引入excel v1.0.1版本新增此工具类 2018/12/20 如不需要您也可以删除 + */ +public class POIUtil<T>{ + + /** + * 导出excel到临时文件 + * @param pageList 集合对象 + * @param titles 第一行标题 + * @param mappingArr 映射:[{"key":"0","value":"类型0"},{"key":"1","value":"类型1"}],.... + * @param tmpFile 导出的excel文件 + */ + public void writeExcelToTempFile(List<T> pageList, String[] titles, String[] mappingArr, File tmpFile) { + FileOutputStream out = null; + SXSSFWorkbook wb = new SXSSFWorkbook(1000); // keep 100 rows in memory, exceeding rows will be flushed to disk + Sheet sh = wb.createSheet(); + try { + setValidation(pageList, mappingArr,sh); + //头部 第1行 + Row headRow = sh.createRow(0); + for(int i=0;i<titles.length;i++){ + Cell cell = headRow.createCell(i); + cell.setCellValue(titles[i]); + } + Map<Integer,Map<String,String>> mappingMap = buildMappingMergeMap(mappingArr); + //数据 + for(int i=0;i<pageList.size();i++){ + Object obj = pageList.get(i); + Row row = sh.createRow(i+1); + Field[] fields=obj.getClass().getDeclaredFields(); + for(int j=0;j<fields.length;j++){ + Map<String,String> map = mappingMap.get(j); + Field field = fields[j]; + Cell cell = row.createCell(j); + field.setAccessible(true); + Object dbValue = field.get(obj); + if(dbValue != null){ + String magicalValue = map!=null?map.get(String.valueOf(dbValue)):null;//比较友好的值 比如下拉文本 + if(magicalValue!=null){ + cell.setCellValue(magicalValue); + cell.setCellType(Cell.CELL_TYPE_STRING); + continue; + } + String type = field.getType().getSimpleName(); + if(type.equals("Date")){ + cell.setCellType(Cell.CELL_TYPE_STRING); + magicalValue = DateFormatUtil.getStringDate((Date)dbValue,"yyyy-MM-dd HH:mm:ss"); + cell.setCellValue(magicalValue); + }else if(type.equals("Boolean") || type.equals("boolean")){ + if(magicalValue==null){ + magicalValue = map!=null?map.get(String.valueOf((Boolean) dbValue ? 1 : 0)):null; + } + if(magicalValue!=null){ + cell.setCellValue(magicalValue); + }else { + cell.setCellValue(String.valueOf(dbValue)); + } + cell.setCellType(Cell.CELL_TYPE_STRING); + }else if(type.equals("Long")|| type.equals("long")){ + cell.setCellValue((Long)(dbValue)); + cell.setCellType(Cell.CELL_TYPE_NUMERIC); + }else if(type.equals("Integer")|| type.equals("int")){ + cell.setCellValue((Integer)dbValue); + cell.setCellType(Cell.CELL_TYPE_NUMERIC); + }else if(type.equals("Byte")|| type.equals("byte")){ + cell.setCellValue((Byte)dbValue); + cell.setCellType(Cell.CELL_TYPE_NUMERIC); + }else if(type.equals("byte[]")){ + cell.setCellValue(new String((byte[]) dbValue,"UTF-8")); + cell.setCellType(Cell.CELL_TYPE_STRING); + }else if(type.equals("Double")|| type.equals("double")){ + cell.setCellValue((Double)dbValue); + cell.setCellType(Cell.CELL_TYPE_NUMERIC); + }else if(type.equals("Float")|| type.equals("float")){ + cell.setCellValue((Float)dbValue); + cell.setCellType(Cell.CELL_TYPE_NUMERIC); + }else if(type.equals("BigDecimal")){ + cell.setCellValue(((BigDecimal)dbValue).floatValue()); + cell.setCellType(Cell.CELL_TYPE_NUMERIC); + }else { + cell.setCellValue(String.valueOf(dbValue)); + cell.setCellType(Cell.CELL_TYPE_STRING); + } + } + } + } + out = new FileOutputStream(tmpFile); + wb.write(out); + }catch (Exception e){ + e.printStackTrace(); + }finally { + try { + if(out!=null){ + out.close(); + } + } catch (IOException e) { + e.printStackTrace(); + } + if(wb!=null){ + wb.dispose(); + } + } + } + //转化成表头定制的下拉约束 + private static String[] mappingToSelectList(String mapping){ + if(StringUtil.isBlank(mapping)){ + return null; + } + List<KeyValue> list = null; + try { + list = JSON.parseArray(mapping,KeyValue.class); + }catch (Exception e){ + e.printStackTrace(); + } + if(ListUtil.isBlank(list)){ + return null; + } + String[] selectList = new String[list.size()]; + for(int i=0;i<list.size();i++){ + KeyValue itemMap = list.get(i); + selectList[i]=itemMap.getValue(); + } + return selectList; + } + /** + * 设置某些列的值只能输入预制的数据,显示下拉框. + * @param sheet 要设置的sheet. + * @return 设置好的sheet. + */ + public static <T> Sheet setValidation(List<T> pageList, String[] mappingArr, Sheet sheet) { + DataValidationHelper helper = sheet.getDataValidationHelper(); + int size = pageList.size(); + for(int i=0;i<mappingArr.length;i++){ + if(StringUtil.isNotBlank(mappingArr[i])){ + String[] selectList = mappingToSelectList(mappingArr[i]); + if(selectList!=null && selectList.length>0){ + CellRangeAddressList addressList = new CellRangeAddressList(); + addressList.addCellRangeAddress(1, i,size, i); + //设置下拉框数据 + DataValidationConstraint constraint = helper.createExplicitListConstraint(selectList); + DataValidation dataValidation = helper.createValidation(constraint, addressList); + //处理Excel兼容性问题 + if(dataValidation instanceof XSSFDataValidation) { + dataValidation.setSuppressDropDownArrow(true); + dataValidation.setShowErrorBox(true); + }else { + dataValidation.setSuppressDropDownArrow(false); + } + sheet.addValidationData(dataValidation); + } + } + } + return sheet; + } + + /** + * key 行 value 需要构造的下拉源数据 + * @param mappingArr + * @return + */ + private Map<Integer,Map<String,String>> buildMappingMergeMap(String[] mappingArr){ + Map<Integer,Map<String,String>> mappingMap = new HashMap<Integer,Map<String,String>>(); + for(int i=0;i<mappingArr.length;i++){ + mappingMap.put(i,mappingMergeToMap(mappingArr[i])); + } + return mappingMap; + } + //合并成map [{key:"a",value:"1"],{key:"b",value:"2"]} -> {"a":"1","b":"2"} + private Map<String,String> mappingMergeToMap(String mapping){ + Map<String,String> map = new HashMap<String,String>(); + if(StringUtil.isBlank(mapping)){ + return map; + } + try{ + List<KeyValue> list = JSON.parseArray(mapping,KeyValue.class); + if(ListUtil.isNotBlank(list)){ + for(int i=0;i<list.size();i++){ + KeyValue keyValue = list.get(i); + map.putAll(MapUtil.buildStringMap(keyValue.getKey(),keyValue.getValue())); + } + } + }catch (Exception e){ + e.printStackTrace(); + } + return map; + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/RandomUtil.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/RandomUtil.java new file mode 100644 index 0000000..0038959 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/RandomUtil.java @@ -0,0 +1,85 @@ +package com.passManage.us.core.utils; + +import java.util.Random; + +/** + * 创建时间:2016年5月13日 下午2:48:48 + * + * 随机字符串 + * + * @author www.magicalcoder.com + * @version 2.2 + */ + +public class RandomUtil { + + public static final String ALL_CHAR = "-_#&$@+-*/%()[]0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + public static final String LETTER_CHAR = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + + public static final String NUMBER_CHAR = "0123456789"; + + public static final String SPECIAL_CHAR = "-_#&$@+-*/%()[]"; + + public static final String LETTER_NUMBER_CHAR = LETTER_CHAR + NUMBER_CHAR; + + /** + * 返回一个定长的随机字符串 + * + * @param chars + * 模型串 + * @param length + * 随机长度 + * @return + */ + public static String randomString(String chars, int length) { + StringBuffer sb = new StringBuffer(); + Random random = new Random(); + for (int i = 0; i < length; i++) { + sb.append(chars.charAt(random.nextInt(chars.length()))); + } + return sb.toString(); + } + + /** + * 返回一个定长的随机字符串字母全部大写 + * + * @param chars + * 模型串 + * @param length + * 随机字符串长度 + * @return 随机字符串 + */ + public static String randomLowerString(String chars, int length) { + return randomString(chars, length).toLowerCase(); + } + + /** + * 返回一个定长的随机字符串字母全部小写 + * + * @param chars + * 模型串 + * @param length + * 随机字符串长度 + * @return 随机字符串 + */ + public static String randomUpperString(String chars, int length) { + return randomString(chars, length).toLowerCase(); + } + + /** + * 生成一个定长的纯0字符串 + * + * @param length + * 字符串长度 + * @return 纯0字符串 + */ + public static String randomZeroString(int length) { + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < length; i++) { + sb.append("0"); + } + return sb.toString(); + } + +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/ReflectUtil.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/ReflectUtil.java new file mode 100644 index 0000000..07f0d85 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/ReflectUtil.java @@ -0,0 +1,57 @@ +package com.passManage.us.core.utils; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +/** + * Created by magicalcoder.com.com on 2016/9/30. + * E 对象类型 + * K 属性类型 + */ +public class ReflectUtil<K, E> { + + + public void setBeanValue(E obj, Class<K> clazz, String field, K newValue){ + try { + String name = "set"+firstCharUp(field); + Method method = obj.getClass().getMethod(name,clazz); + method.setAccessible(true);//提供速度 由于JDK的安全检查耗时较多.所以通过setAccessible(true)的方式关闭安全检查就可以达到提升反射速度的目的 + method.invoke(obj,newValue); + method.setAccessible(false); + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + } + + + public K getBeanValue(E obj, String field){ + try { + String name = "get"+firstCharUp(field); + Method method = obj.getClass().getMethod(name); + method.setAccessible(true);//提供速度 由于JDK的安全检查耗时较多.所以通过setAccessible(true)的方式关闭安全检查就可以达到提升反射速度的目的 + Object value = method.invoke(obj); + method.setAccessible(false); + return (K)value; + } catch (NoSuchMethodException e) { + e.printStackTrace(); + } catch (IllegalAccessException e) { + e.printStackTrace(); + } catch (InvocationTargetException e) { + e.printStackTrace(); + } + return null; + } + + public static void main(String[] args) { + + } + + private static String firstCharUp(String str){ + return str.substring(0,1).toUpperCase()+str.substring(1); + } + +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/RequestUtil.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/RequestUtil.java new file mode 100644 index 0000000..a2d6c8a --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/RequestUtil.java @@ -0,0 +1,32 @@ +package com.passManage.us.core.utils; + +import javax.servlet.http.HttpServletRequest; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + +public class RequestUtil { + /** + * 将request所有参数都存放到map中 + * + * @param request + * @return + */ + public static Map<String, String> getRequestParamsMap(HttpServletRequest request) { + Map<String, String> params = new HashMap<String, String>(); + @SuppressWarnings("rawtypes") + Map requestParams = request.getParameterMap(); + for (@SuppressWarnings("rawtypes") + Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) { + String name = (String) iter.next(); + String[] values = (String[]) requestParams.get(name); + String valueStr = ""; + for (int i = 0; i < values.length; i++) { + valueStr = (i == values.length - 1) ? valueStr + values[i] : valueStr + values[i] + ","; + } + params.put(name, valueStr); + } + return params; + } + +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/StringUtil.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/StringUtil.java new file mode 100644 index 0000000..e7c6fe4 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/StringUtil.java @@ -0,0 +1,75 @@ +package com.passManage.us.core.utils; + + +import org.apache.commons.lang.StringUtils; + +import java.util.Random; + +/** + * qq:799374340 + * @author hdy + * 2013-6-25下午1:39:28 + */ +public class StringUtil { + + public static final String ASCII_LETTERS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; + public static final String DIGITS = "0123456789"; + + public static boolean isBlank(String str){ + if(str==null || "".equals(str.trim())){ + return true; + } + return false; + } + public static boolean isNotBlank(String str){ + if(str!=null && !"".equals(str.trim())){ + return true; + } + return false; + } + public static String deleteLastChar(String str){ + if(isBlank(str)) return str; + return str.substring(0,str.length()-1); + } + + public static String deleteLastChar(String str,int len){ + if(isBlank(str)) return str; + return str.substring(0,str.length()-len); + } + public static String deleteBeforeChar(String str,int len){ + if(isBlank(str)) return str; + return str.substring(len); + } + + /** + * 生成指定长度的随机字符串 + * @param length 目标长度 + * @return 产物 + */ + public static String getRandomString(int length) { + return StringUtil.getRandomString(length, StringUtil.ASCII_LETTERS+StringUtil.DIGITS); + } + + /** + * 从给定的范围里生成指定长度的随机字符串 + * @param length 目标长度 + * @param population 候选字符 + * @return 产物 + */ + public static String getRandomString(int length, String population){ + Random random = new Random(); + StringBuffer sb = new StringBuffer(); + for (int i = 0; i < length; ++i) { + int number = random.nextInt(population.length()); + sb.append(population.substring(number, number+1)); + } + return sb.toString(); + } + + public static Integer getUnicodeStringLength(String content) { + if (StringUtils.isBlank(content)) { + return 0; + } + return content.codePointCount(0, content.length()); + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/SystemOperateUtil.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/SystemOperateUtil.java new file mode 100644 index 0000000..b0d89d0 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/SystemOperateUtil.java @@ -0,0 +1,18 @@ +package com.passManage.us.core.utils; + +import com.passManage.us.core.common.constant.SystemOperateEnum; + +public class SystemOperateUtil { + + /*操作系统*/ + public static SystemOperateEnum system(){ + String osName = System.getProperty("os.name", ""); + if (osName.startsWith("Mac OS")) { + return SystemOperateEnum.MAC; + } else if (osName.startsWith("Windows")) { + return SystemOperateEnum.WINDOWS; + } else { + return SystemOperateEnum.LINUX; + } + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/TimeUtil.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/TimeUtil.java new file mode 100644 index 0000000..f0dec7c --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/TimeUtil.java @@ -0,0 +1,1321 @@ +package com.passManage.us.core.utils; + +import org.apache.commons.lang.StringUtils; + +import java.text.DateFormat; +import java.text.ParseException; +import java.text.ParsePosition; +import java.text.SimpleDateFormat; +import java.util.*; + +/** + * 时间相关转换类 + * + * @author + * + */ +public class TimeUtil { + public static final int SECOND = 0; + public static final int MINUTE = 1; + public static final int HOUR = 2; + public static final int DAY = 3; + public static final int MONTH = 4; + + /** + * 计算两个Date时刻的时间差,用指定格式(~天~小时~分钟 )字符串表示 + * + * @param beginDate + * @param endDate + * @return + */ + public static String getDateTimeDelta(Date beginDate, Date endDate) { + long delta = getDateTimeMillisDelta(beginDate, endDate); + return convertMillisToTargetFormat(delta); + } + + /** + * 计算两个时刻的时间差的毫秒数 + * + * @param beginDate + * @param endDate + * @return + */ + public static long getDateTimeMillisDelta(Date beginDate, Date endDate) { + Calendar _begin = Calendar.getInstance(); + _begin.setTime(beginDate); + Calendar _end = Calendar.getInstance(); + _end.setTime(endDate); + long delta = (_end.getTimeInMillis() - _begin.getTimeInMillis()); + return delta; + } + + /** + * 计算两个时刻的时间差的毫秒数 + * + * @param begin + * @param end + * @return + */ + public static long getDateTimeMillisDelta(String begin, String end) { + Date beginDate = convertStringToDate(begin, "yyyy-MM-dd HH:mm:ss"); + Date endDate = convertStringToDate(end, "yyyy-MM-dd HH:mm:ss"); + return getDateTimeMillisDelta(beginDate, endDate); + } + + /** + * 将时间差(毫秒)转化为指定格式(e.g.~天~时~分 DD:HH:MM)字符串表示 + * + * @param millseconds + * @return + */ + public static String convertMillisToTargetFormat(Long millseconds) { + if (millseconds == null) { + return ""; + } + + String showtime = ""; + long days = (long) millseconds.longValue() / 1000 / 60 / 60 / 24; + if (days >= 0) { + showtime = showtime + days + "天"; + } + long hourMillseconds = millseconds.longValue() - days * 1000 * 60 * 60 * 24; + long hours = (long) hourMillseconds / 1000 / 60 / 60; + if (hours >= 0) { + showtime = showtime + hours + "小时"; + } + long minuteMillseconds = millseconds.longValue() - days * 1000 * 60 * 60 * 24 - hours * 1000 * 60 * 60; + long minutes = (long) minuteMillseconds / 1000 / 60; + if (minutes >= 0) { + showtime = showtime + minutes + "分钟"; + } + return showtime; + } + + /** + * 根据类型将String转换为Date + * + * @param value + * @param format + * 样式:yyyy-MM-dd HH:mm:ss / yyyyMMdd 等等。。。 + * @return + */ + public static Date convertString(String value, String format) { + SimpleDateFormat sdf = new SimpleDateFormat(format); + if (value == null) + return null; + try { + return sdf.parse(value); + } catch (Exception e) { + } + return null; + } + + public static String convertDate(Date date, String format) { + SimpleDateFormat sdf = new SimpleDateFormat(format); + if (date == null) + return ""; + try { + return sdf.format(date); + } catch (Exception e) { + } + return ""; + } + + /* + * public static Date toLocalDate(Date oldDate){ //String + * dateStr=oldDate.toString(); return + * convertString(TimeUtil.getDateString(oldDate)+" 00:00:00"); } + */ + + /** + * 获取现在时间 + * + * @throws ParseException + * + * @return返回短时间格式 yyyy-MM-dd + */ + public static Date getNowDateShort() throws ParseException { + Date currentTime = new Date(); + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd", Locale.CHINESE); + String dateString = formatter.format(currentTime); + ParsePosition pos = new ParsePosition(8); + Date currentTime_2 = formatter.parse(dateString, pos); + return currentTime_2; + } + + /** + * 转换为yyyy-MM-dd HH:mm:ss样式的时间 + * + * @param value + * @return + */ + public static Date convertString(String value) { + return convertString(value, "yyyy-MM-dd HH:mm:ss"); + } + + /** + * 获得当前时间(格式:yyyy-MM-dd HH:mm:ss) + * + * @return + */ + public static String getCurrentTime() { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Date date = new Date(); + return formatter.format(date); + } + + /** + * 秒转换成"yyyy-MM-dd HH:mm:ss"的格式 + * + * @param millseconds + * @return + */ + public static String getDateTimeString(long millseconds) { + return getDate(millseconds, "yyyy-MM-dd HH:mm:ss"); + } + + /** + * 秒转换成自定义formateStr的格式 + * + * @param millseconds + * @return + */ + public static String getDateTimeString(long millseconds,String formateStr) { + return getDate(millseconds, formateStr); + } + + /** + * 秒转换成特定格式的yyyyMMdd的字符串 + * + * @param time + * @return + */ + public static String getDayDate(long time) { + return getDate(time, "yyyyMMdd"); + } + + /** + * 秒转换为时间 + * + * @param time + * @param format + * @return + */ + public static String getDate(long time, String format) { + SimpleDateFormat formater = new SimpleDateFormat(format); + return formater.format(new Date(time)); + } + + /** + * 根据Date得到yyyy-MM-dd HH:mm:ss格式的字符串时间 + * + * @param date + * @return + */ + public static String getDateTimeString(Date date) { + return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date); + } + + /** + * 根据Date获得当前时间时间字符串 + * + * @param date + * @param format + * @return + */ + public static String getDateTimeString(Date date, String format) { + return new SimpleDateFormat(format).format(date); + } + + /** + * 判断endTime大于startTime + * + * @param startTime + * @param endTime + * @return + */ + public static boolean isTimeLarge(String startTime, String endTime) { + try { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + ParsePosition pos = new ParsePosition(0); + ParsePosition pos1 = new ParsePosition(0); + Date dt1 = formatter.parse(startTime, pos); + Date dt2 = formatter.parse(endTime, pos1); + long lDiff = dt2.getTime() - dt1.getTime(); + return lDiff > 0L; + } catch (Exception e) { + } + return false; + } + + /** + * 比较date2 是否大于date1 是返回true + * + */ + public static Boolean isDateLarge(Date date1, Date date2) { + String startTime = getDateTimeString(date1); + String endTime = getDateTimeString(date2); + return isTimeLarge(startTime, endTime); + } + + /** + * 获得两个时间的时间差(秒) + * + * @param startTime + * @param endTime + * @return + */ + public static long getTime(Date startTime, Date endTime) { + return endTime.getTime() - startTime.getTime(); + } + + /** + * 获得两个时间的标准时间差(天,小时,分钟) + * + * @param startTime + * @param endTime + * @return + */ + public static String getTimeDiff(String startTime, String endTime) { + try { + String tmp = ""; + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + ParsePosition pos = new ParsePosition(0); + ParsePosition pos1 = new ParsePosition(0); + Date dt1 = formatter.parse(startTime, pos); + Date dt2 = formatter.parse(endTime, pos1); + long lDiff = dt2.getTime() - dt1.getTime(); + int days = (int) (lDiff / 86400000L); + if (days > 0) { + lDiff -= days * 1000 * 60 * 60 * 24; + tmp = tmp + days + "天"; + } + int hours = (int) (lDiff / 3600000L); + if (hours > 0) + lDiff -= hours * 1000 * 60 * 60; + tmp = tmp + hours + "小时"; + int minute = (int) (lDiff / 60000L); + tmp = tmp + minute + "分钟"; + return tmp; + } catch (Exception e) { + e.printStackTrace(); + } + return "-1"; + } + + /** + * 根据秒获得,天,小时,分钟的格式串 + * + * @param millseconds + * @return + */ + public static String getTime(Long millseconds) { + String time = ""; + if (millseconds == null) { + return ""; + } + int days = (int) millseconds.longValue() / 1000 / 60 / 60 / 24; + if (days > 0) { + time = time + days + "天"; + } + long hourMillseconds = millseconds.longValue() - days * 1000 * 60 * 60 * 24; + int hours = (int) hourMillseconds / 1000 / 60 / 60; + if (hours > 0) { + time = time + hours + "小时"; + } + long minuteMillseconds = millseconds.longValue() - days * 1000 * 60 * 60 * 24 - hours * 1000 * 60 * 60; + int minutes = (int) minuteMillseconds / 1000 / 60; + if (minutes > 0) { + time = time + minutes + "分钟"; + } + return time; + } + + /** + * 获得yyyy-MM-dd格式的字符串 + * + * @param date + * @return + */ + public static String getDateString(Date date) { + if (date != null) { + return new SimpleDateFormat("yyyy-MM-dd").format(date); + } + return ""; + } + + /** + * 获得当前时间yyyy-MM-dd + * + * @return + */ + public static String getCurrentDate() { + SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); + Date date = new Date(); + return formatter.format(date); + } + + /** + * 根据秒获得yyyy-MM-dd的时间串 + * + * @param millseconds + * @return + */ + public static String getDateString(long millseconds) { + return new SimpleDateFormat("yyyy-MM-dd").format(new Date(millseconds)); + } + + public static String getDateString(String formater) { + return new SimpleDateFormat(formater).format(new Date()); + } + + /** + * 根据当前时间,获得秒的数值 + * + * @return + */ + public static long getMillsByToday() { + String str = getDateString("yyyy-MM-dd"); + str = String.valueOf(getMillsByDateString(str)); + return Long.parseLong(str.substring(0, str.length() - 3) + "000"); + } + + /** + * 获得当前下一天秒的数值 + * + * @param days + * @return + */ + public static long getNextDays(int days) { + Calendar cal = Calendar.getInstance(); + cal.add(5, days); + String str = String.valueOf(cal.getTimeInMillis()); + return Long.parseLong(str.substring(0, str.length() - 3) + "000"); + } + + /** + * 获得下 days天的long型秒的数值 + * + * @param date + * @param days + * @return + */ + public static Date getNextDays(Date date, int days) { + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + cal.add(5, days); + return cal.getTime(); + } + + /** + * 根据标准的日期串获得秒的值(yyyymmdd) + * + * @param strDate + * @return + */ + public static long getMillsByDateString(String strDate) { + Calendar cal = Calendar.getInstance(); + if ((strDate != null) && (strDate.trim().length() == 8)) { + strDate = strDate.trim(); + try { + int year = Integer.parseInt(strDate.substring(0, 4)); + int month = Integer.parseInt(strDate.substring(5, 6)); + int date = Integer.parseInt(strDate.substring(7, 8)); + cal.set(year, month, date, 0, 0, 0); + String str = String.valueOf(cal.getTimeInMillis()); + return Long.parseLong(str.substring(0, str.length() - 3) + "000"); + } catch (Exception e) { + } + + } + + return 0L; + } + + /** + * 根据标准的时间串获得秒的值(yyyymmddhhmmss) + * + * @param strDate + * @return + */ + public static long getMillsByDateTimeString(String strDateTime) { + Calendar cal = Calendar.getInstance(); + if ((strDateTime != null) && (strDateTime.trim().length() > 18)) { + strDateTime = strDateTime.trim(); + try { + int year = Integer.parseInt(strDateTime.substring(0, 4)); + int month = Integer.parseInt(strDateTime.substring(5, 7)) - 1; + int date = Integer.parseInt(strDateTime.substring(8, 10)); + int hour = Integer.parseInt(strDateTime.substring(11, 13)); + int minute = Integer.parseInt(strDateTime.substring(14, 16)); + int second = Integer.parseInt(strDateTime.substring(17, 19)); + cal.set(year, month, date, hour, minute, second); + return cal.getTimeInMillis(); + } catch (Exception e) { + } + } + return 0L; + } + + /** + * 根据秒的数值获得特定格式的串 + * + * @param millseconds + * @param format + * @return + */ + public static String getFormatString(long millseconds, String format) { + if ((format == null) || (format.trim().length() == 0)) { + format = "yyyy-MM-dd"; + } + format = format.trim(); + return new SimpleDateFormat(format).format(new Date(millseconds)); + } + + /** + * 获得当前时间的秒值 + * + * @return + */ + public static long getCurrentTimeMillis() { + Calendar c = Calendar.getInstance(); + return c.getTimeInMillis(); + } + + /** + * 根据秒数值得到时间字符串 + * + * @param mills + * @return + * @throws Exception + */ + public static String getTimeByMills(long mills) throws Exception { + try { + if (mills == 0L) + return "-"; + Date date = null; + Calendar ca = Calendar.getInstance(); + ca.setTimeInMillis(mills); + date = ca.getTime(); + SimpleDateFormat myformat; + + if ((ca.get(11) == 0) && (ca.get(12) == 0) && (ca.get(13) == 0)) { + myformat = new SimpleDateFormat("yyyy-MM-dd"); + } else + myformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + return myformat.format(date); + } catch (Exception e) { + } + return "-"; + } + + /** + * 格式化时间yyyy-MM-dd + * + * @param mills + * @return + * @throws Exception + */ + public static String formatDate(long mills) throws Exception { + try { + if (mills == 0L) + return "-"; + Date date = null; + Calendar ca = Calendar.getInstance(); + ca.setTimeInMillis(mills); + date = ca.getTime(); + + SimpleDateFormat myformat = new SimpleDateFormat("yyyy-MM-dd"); + + return myformat.format(date); + } catch (Exception e) { + } + return "-"; + } + + /** + * 格式化时间yyyy-MM-dd HH:mm:ss + * + * @param mills + * @return + * @throws Exception + */ + public static String formatTime(long mills) throws Exception { + try { + if (mills == 0L) + return "-"; + Date date = null; + Calendar ca = Calendar.getInstance(); + ca.setTimeInMillis(mills); + date = ca.getTime(); + + SimpleDateFormat myformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + + return myformat.format(date); + } catch (Exception e) { + } + return "-"; + } + + /** + * 标准的格式化时间(优先考虑此方法) + * + * @param strTime + * @return + * @throws Exception + */ + public static long getMillsByTime(String strTime) throws Exception { + try { + if ((strTime.length() != 19) && (strTime.length() != 10)) { + throw new Exception("the time string is wrong."); + } + + int year = Integer.parseInt(strTime.substring(0, 4)); + int month = Integer.parseInt(strTime.substring(5, 7)) - 1; + int day = Integer.parseInt(strTime.substring(8, 10)); + + if ((year < 1000) || (year > 3000)) { + throw new Exception("the year is wrong."); + } + + if ((month < 0) || (month > 12)) { + throw new Exception("the month is wrong."); + } + + if ((day < 1) || (day > 31)) { + throw new Exception("the day is wrong"); + } + + Calendar ca = Calendar.getInstance(); + if (strTime.length() == 19) { + int hour = Integer.parseInt(strTime.substring(11, 13)); + int minute = Integer.parseInt(strTime.substring(14, 16)); + int second = Integer.parseInt(strTime.substring(17, 19)); + + if ((hour < 0) || (hour > 24)) { + throw new Exception("the hour is wrong."); + } + + if ((minute < 0) || (minute > 60)) { + throw new Exception("the minute is wrong."); + } + + if ((second < 0) || (second > 60)) { + throw new Exception("the second is wrong."); + } + + ca.set(year, month, day, hour, minute, second); + } else if (strTime.length() == 10) { + ca.set(year, month, day, 0, 0, 0); + } + return ca.getTimeInMillis(); + } catch (Exception e) { + e.printStackTrace(); + } + return -1L; + } + + public static long getNextTime(int timeUnit, int interval, long timeMill) { + Calendar ca = Calendar.getInstance(); + ca.setTimeInMillis(timeMill); + switch (timeUnit) { + case 0: + ca.add(13, interval); + break; + case 1: + ca.add(12, interval); + break; + case 2: + ca.add(10, interval); + break; + case 3: + ca.add(5, interval); + break; + case 4: + ca.add(2, interval); + break; + default: + return 0L; + } + return ca.getTimeInMillis(); + } + + /** + * 根据字符串获得Date类型yy-MM-dd HH:mm:ss + * + * @param timeString + * @return + */ + public static Date getDateTimeByTimeString(String timeString) { + DateFormat f = new SimpleDateFormat("yy-MM-dd HH:mm:ss"); + Date date = new Date(); + try { + date = f.parse(timeString); + } catch (ParseException e) { + e.printStackTrace(); + } + return date; + } + + /** + * 根据字符串获得Date类型yy-MM-dd + * + * @param timeString + * @return + */ + public static Date getDateByDateString(String timeString) { + DateFormat f = new SimpleDateFormat("yy-MM-dd"); + Date date = new Date(); + try { + date = f.parse(timeString); + } catch (ParseException e) { + e.printStackTrace(); + } + return date; + } + + /** + * 根据年月日获得当前时间 + * + * @param year + * @param month + * @param day + * @return + */ + public static Date getDate(int year, int month, int day) { + //year -= 1900; + month -= 1; + + Calendar c = Calendar.getInstance(); + c.set(year, month, day); + + //Date d = new Date(year, month, day); + Date d = c.getTime(); + return d; + } + + /** + * 获得时间Date(年,月,日,小时,分钟) + * + * @param year + * @param month + * @param day + * @param hour + * @param minute + * @return + */ + public static Date getDate(int year, int month, int day, int hour, int minute) { + //year -= 1900; + month -= 1; + Calendar c = Calendar.getInstance(); + c.set(year, month, day, hour, minute); + //Date d = new Date(year, month, day, hour, minute); + Date d = c.getTime(); + return d; + } + + /** + * 获得时间差的Int值 + * + * @param endTime + * @param startTime + * @return + */ + public static int getSecondDiff(Date endTime, Date startTime) { + long start = startTime.getTime(); + long end = endTime.getTime(); + return (int) ((end - start) / 1000L); + } + + /** + * 获得指定月的天数 + * + * @param year + * @param mon + * @return + */ + public static int getDaysOfMonth(int year, int mon) { + Calendar cal = Calendar.getInstance(); + cal.set(1, year); + cal.set(2, mon - 1); + return cal.getActualMaximum(5); + } + + /** + * 获得指定月的星期个数 + * + * @param year + * @param mon + * @return + */ + public static int getWeekDayOfMonth(int year, int mon) { + Calendar cal = Calendar.getInstance(); + cal.set(year, mon - 1, 1); + return cal.get(7); + } + + /** + * 计算两个日期相差的天数 + * + * @param small + * @param big + * @return正数表示前者更早,负数表示前者更晚 + * @throws ParseException + */ + public static int getDifferDay(Date small, Date big) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Calendar cal = Calendar.getInstance(); + try { + cal.setTime(sdf.parse(sdf.format(small))); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + long time1 = cal.getTimeInMillis(); + try { + cal.setTime(sdf.parse(sdf.format(big))); + } catch (ParseException e) { + // TODO Auto-generated catch block + e.printStackTrace(); + } + long time2 = cal.getTimeInMillis(); + long differ = (long) ((time2 - time1) / (1000 * 3600 * 24)); + + return Integer.parseInt(String.valueOf(differ)); + + } + + /** + * 比较2个日期相差的月份数 + * + * @param small较小的日期 + * @param big较大的日期 + * @return正数表示前者早于后者,负数表示前者晚于后者。 不足一月按1月算 + */ + public static int getDifferMonth(Date small, Date big) { + + Calendar c_s = Calendar.getInstance(); + c_s.setTime(small); + + Calendar c_b = Calendar.getInstance(); + c_b.setTime(big); + + /* + int dy1 = small.getYear(); + int dy2 = big.getYear(); + + int dm1 = small.getMonth(); + int dm2 = big.getMonth(); + + int dd1 = small.getDate(); + int dd2 = big.getDate(); + */ + + int dy1 = c_s.get(Calendar.YEAR); + int dy2 = c_b.get(Calendar.YEAR); + + int dm1 = c_s.get(Calendar.MONTH); + int dm2 = c_b.get(Calendar.MONTH); + + int dd1 = c_s.get(Calendar.DATE); + int dd2 = c_b.get(Calendar.DATE); + + + int differ = 0; + if (small.before(big)) { + differ = dm2 - dm1 + (dy2 - dy1) * 12; + if (dd1 < dd2) { + differ++; + } + } else { + differ = dm1 - dm2 + (dy1 - dy2) * 12; + if (dd2 < dd1) { + differ++; + } + differ = -differ; + } + + return differ; + } + + /** + * 根据今天日期,获取n天前的日期 + * + * @param num + * 几天前 + * @return + */ + public static String beforeNDay(int num) { + Date today = new Date(); + Calendar cal = Calendar.getInstance(); + cal.setTime(today); + cal.add(Calendar.DAY_OF_MONTH, -num); + Date dayNBefore = cal.getTime(); + String beforeNDay = TimeUtil.getDateString(dayNBefore); + return beforeNDay; + } + + /** + * 根据传入日期,其n天前日期 + * + * @param theDay + * @param num + * @return + */ + public static Date TodayBeforDay(Date theDay, int num) { + Date today = theDay; + Calendar cal = Calendar.getInstance(); + cal.setTime(today); + cal.add(Calendar.DAY_OF_MONTH, -num); + Date dayNBefore = cal.getTime(); + return dayNBefore; + } + + /** + * 根据传入日期,其n天后日期 + * + * @param theDay + * @param num + * @return + */ + public static Date TodayAfterDay(Date theDay, int num) { + Date today = theDay; + Calendar cal = Calendar.getInstance(); + cal.setTime(today); + cal.add(Calendar.DAY_OF_MONTH, num); + Date dayNBefore = cal.getTime(); + return dayNBefore; + } + + /** + * 根据起始结束时间,获取之间每一天组成的集合 + * + * @param startDay + * @param endDay + * @return + */ + public static List<String> makeaDayListBySE(String startDay, String endDay) { + List<String> dayList = new ArrayList<String>(); + Date start = convertString(startDay, "yyyy-MM-dd"); + Date end = convertString(endDay, "yyyy-MM-dd"); + Date temp = start; + dayList.add(startDay); + int times = getDifferDay(start, end); + if (times == 0) { + return dayList; + } + for (int i = 0; i < times; i++) { + temp = TodayAfterDay(temp, 1); + if (!getDateString(temp).trim().equals(endDay.trim())) { + dayList.add(getDateString(temp)); + } + } + // while(!getDateString(temp).trim().equals(endDay.trim())){ + // dayList.add(getDateString(temp)); + // temp = TodayAfterDay(temp,1); + // } + dayList.add(endDay); + return dayList; + } + + /** + * 根据传入日期获取所属周的星期一的日期 + * + * @param theDay + * @return + */ + public static Date getMondayByWeek(Date theDay) { + Calendar cal = Calendar.getInstance(); + cal.setTime(theDay); + cal.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY); + Date monday = cal.getTime(); + return monday; + } + + /** + * 根据传入日期获取所属月的第一天日期(i,是几月前后的;当前月i为0,,上个月为-1,下个月为1) + * + * @param theDay + * @return + */ + public static Date getFistDayOfMonth(Date theDay, int i) { + Calendar cal = Calendar.getInstance(); + cal.setTime(theDay); + cal.add(MONTH, i); + cal.set(Calendar.DAY_OF_MONTH, 1); + Date fistDay = cal.getTime(); + return fistDay; + } + + /** + * 根据传入日期获取所属月的最后一天日期(i,是几月前后的;当前月i为0,,上个月为-1,下个月为1) + * + * @param theDay + * @return + */ + public static Date getLastDayofMonth(Date theDay, int i) { + Calendar cal = Calendar.getInstance(); + cal.setTime(theDay); + cal.add(MONTH, i); + cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH)); + Date lastDay = cal.getTime(); + return lastDay; + } + + /** + * 根据日期和希望获得的日期格式获取字符串时间 + * + * @param date + * 有效日期格式 + * @param type + * @return + */ + public static String changeDateStringByTpye(Date date, String type) { + if (date == null) { + return ""; + } + if (StringUtils.isBlank(type)) { + getDateTimeString(date); + } + return new SimpleDateFormat(type).format(date); + } + + /** + * 根据日期和希望获得的日期格式获取字符串时间 + * + * @param String + * 有效日期格式 + * @param type + * @return + */ + public static String changeDateStringByType_2(String date, String type) { + if (StringUtils.isBlank(date)) { + return ""; + } + DateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + try { + Date thdate = format.parse(date); + if (StringUtils.isBlank(type)) { + getDateTimeString(thdate); + } + return changeDateStringByTpye(thdate, type); + } catch (ParseException e) { + e.printStackTrace(); + } + return ""; + } + + /** + * + * @param startDate + * @param endDate + * @return + */ + public static List<String> getAllMonthBewteenTime(String startDate, String endDate) { + try { + List<String> list = new ArrayList<String>(); + Date d1 = new SimpleDateFormat("yyyy-MM").parse(startDate);// 定义起始日期 + Date d2 = new SimpleDateFormat("yyyy-MM").parse(endDate);// 定义结束日期 + Calendar dd = Calendar.getInstance();// 定义日期实例 + dd.setTime(d1);// 设置日期起始时间 + while (dd.getTime().before(d2)) {// 判断是否到结束日期 + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM"); + String time = sdf.format(dd.getTime());// 获取格式化日期字符串 + list.add(time); + dd.add(Calendar.MONTH, 1);// 进行当前日期月份加1 + } + list.add(new SimpleDateFormat("yyyy-MM").format(d2.getTime())); + return list; + } catch (ParseException e) { + e.printStackTrace(); + } + return null; + } + + /** + * 获取日期的年、月、日、时分秒,周几(外国),返回的都是int值的map + * + * @param date + * @return + */ + public static Map<String, Integer> getYearMonthDayFromDate(Date date) { + Map<String, Integer> map = new HashMap<String, Integer>(); + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + int year = cal.get(Calendar.YEAR);// 获取年份 + int month = cal.get(Calendar.MONTH);// 获取月份 + int day = cal.get(Calendar.DATE);// 获取日 + int hour = cal.get(Calendar.HOUR);// 小时 + int minute = cal.get(Calendar.MINUTE);// 分 + int second = cal.get(Calendar.SECOND);// 秒 + int WeekOfYear = cal.get(Calendar.DAY_OF_WEEK);// 一周的第几天 + + map.put("year", year); + map.put("month", month + 1);// 月份0开始 + map.put("day", day); + map.put("hour", hour); + map.put("minute", minute); + map.put("second", second); + map.put("WeekOfYear", WeekOfYear); + + return map; + } + + /** + * 根据日期时间获取其时间错,去除后三位 + * + * @param tempDate + * @return + */ + public static long getMillsByDate(String tempDate) { + DateFormat df = new SimpleDateFormat("yyyy-MM-dd"); + Date date; + try { + date = df.parse(tempDate); + } catch (ParseException e) { + return 0; + } + Calendar cal = Calendar.getInstance(); + cal.setTime(date); + long timestamp = cal.getTimeInMillis(); + return Long.valueOf(String.valueOf(timestamp).substring(0, String.valueOf(timestamp).length() - 3)); + } + + /** + * 将字符串日期转换成Calendar,需要日期格式yyyy-MM-dd + * + * @param time + * @return + */ + public static Calendar changeStringToCalendar(String time) { + try { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Date date = sdf.parse(time); + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + return calendar; + } catch (ParseException e) { + return null; + } + } + + /** + * 根据起始结束日期获取之间全部日期 + * + * @param startDate + * @param endDate + * @return + */ + public static List<String> getListDateBewteenDays(String startDate, String endDate) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + List<String> result = new ArrayList<String>(); + Calendar start = Calendar.getInstance(); + Calendar end = Calendar.getInstance(); + + start.setTime(changeStringToDateNoTime(startDate)); + end.setTime(changeStringToDateNoTime(endDate)); + // 起始时间添加 + result.add(sdf.format(start.getTime())); + // 中间时间添加 + Calendar temp = (Calendar) start.clone(); + temp.add(Calendar.DAY_OF_YEAR, 1); + while (temp.before(end)) { + result.add(sdf.format(temp.getTime())); + temp.add(Calendar.DAY_OF_YEAR, 1); + } + // 结束时间添加 + if(!endDate.equals(startDate)){ + result.add(sdf.format(end.getTime())); + } + return result; + } + + /** + * 获取该月份的第一天数据 + * + * @param date + * @return + */ + public static String getMonthFirstDay(Date date) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Calendar time = Calendar.getInstance(); + time.setTime(date); + time.set(Calendar.DAY_OF_MONTH, 1); + return sdf.format(time.getTime()); + } + + /** + * 获取当前年的第一天 + * @param date + * @return + */ + public static String getYearFirstDay(Date date){ + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Calendar time = Calendar.getInstance(); + time.setTime(date); + time.set(Calendar.DAY_OF_YEAR, 1); + return sdf.format(time.getTime()); + } + + /** + * 根据数字获取前后月份 + * + * @param MonthDate + * @param num + * @return + */ + public static String getMonthCalculateNum(String MonthDate, int num) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Calendar time = Calendar.getInstance(); + time.setTime(changeStringToDateNoTime(MonthDate)); + time.add(Calendar.MONTH, num); + return sdf.format(time.getTime()); + } + + /** + * 根据数字获取前后年对应的这天 + * + * @param YearDate + * @param num + * @return + */ + public static String getYearCalculateNum(String YearDate, int num) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Calendar time = Calendar.getInstance(); + time.setTime(changeStringToDateNoTime(YearDate)); + time.add(Calendar.YEAR, num); + return sdf.format(time.getTime()); + } + + /** + * 根据起始时间、结束时间获取期间的月份 + * + * @param startMonth + * @param endMonth + * @return + */ + public static List<String> getListDateByMonth(String startMonth, String endMonth) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + List<String> result = new ArrayList<String>(); + Calendar start = Calendar.getInstance(); + Calendar end = Calendar.getInstance(); + + start.setTime(changeStringToDateNoTime(startMonth)); + end.setTime(changeStringToDateNoTime(endMonth)); + // 起始时间添加 + result.add(sdf.format(start.getTime())); + // 中间时间添加 + Calendar temp = (Calendar) start.clone(); + temp.add(Calendar.MONTH, 1); + while (temp.before(end)) { + result.add(sdf.format(temp.getTime())); + temp.add(Calendar.MONTH, 1); + } + // 结束时间添加 + result.add(sdf.format(end.getTime())); + return result; + } + + /** + * 根据起始时间、结束时间获取期间的年对应的天 + * + * @param startYear + * @param endYear + * @return + */ + public static List<String> getListDateByYear(String startYear, String endYear) { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + List<String> result = new ArrayList<String>(); + Calendar start = Calendar.getInstance(); + Calendar end = Calendar.getInstance(); + + start.setTime(changeStringToDateNoTime(startYear)); + end.setTime(changeStringToDateNoTime(endYear)); + // 起始时间添加 + result.add(sdf.format(start.getTime())); + // 中间时间添加 + Calendar temp = (Calendar) start.clone(); + temp.add(Calendar.YEAR, 1); + while (temp.before(end)) { + result.add(sdf.format(temp.getTime())); + temp.add(Calendar.YEAR, 1); + } + // 结束时间添加 + result.add(sdf.format(end.getTime())); + return result; + } + + public static Date changeStringToDateNoTime(String str) { + Date date = null; + try { + date = new SimpleDateFormat("yyyy-MM-dd").parse(str); + } catch (ParseException e) { + e.printStackTrace(); + } + return date; + } + + /** + * 获取某月的前一个月的第一天 + * + * @param date + * @return + */ + public static Date getFirstDayOfLastMonth(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.add(Calendar.MONTH, -1); // 上一个月 + calendar.set(Calendar.DATE, 1); // 设置为该月第一天 + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + return calendar.getTime(); + } + + /** + * 将字符串转换为指定format的Date + * + * @param value + * @param format + * e.g. yyyy-MM-dd HH:mm:ss + * @return + */ + public static Date convertStringToDate(String value, String format) { + SimpleDateFormat sdf = new SimpleDateFormat(format); + if (value == null) + return null; + try { + return sdf.parse(value); + } catch (Exception e) { + } + return null; + } + + /** + * 根据Date,转化为时间戳 + * @param date + * @return + */ + public static Long convertDateToTimestamp(Date date){ + String dateValue = changeDateStringByTpye(date,"yyyy-MM-dd"); + return getMillsByDate(dateValue); + } + + /** + * 两个时间点是不是在同一天内 + * + * @param date1 + * @param date2 + * @return + */ + public static Boolean isInOneDay(Date date1, Date date2) { + return Math.abs(date1.getTime() - date2.getTime()) < (1000 * 60 * 60 * 24); + } + + public static void main(String[] args) { + System.out.println(getYearFirstDay(new Date())); + } + +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/XssUtil.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/XssUtil.java new file mode 100644 index 0000000..6b127fc --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/XssUtil.java @@ -0,0 +1,25 @@ +package com.passManage.us.core.utils; + +import org.jsoup.Jsoup; +import org.jsoup.safety.Whitelist; + +public class XssUtil { + private static String from = "src=\"//"; + private static String to = "src=\"http://"; + + /** + * 过滤富文本中可能包含的脚本攻击 + * @return + */ + public static String filterFWBXssScript(String mayBeContainXssHtml){ + if(StringUtil.isBlank(mayBeContainXssHtml)){ + return mayBeContainXssHtml; + } + //图片上传的地址是//开头 不支持指定协议,jsoup要求必须指定协议 + mayBeContainXssHtml = mayBeContainXssHtml.replaceAll(from,to); + Whitelist whitelist = Whitelist.relaxed().addTags("img").addAttributes("img", "align", "alt", "height", "src", "title", "width","style").addProtocols("img","src","http","https"); + + String cleanHtml = Jsoup.clean(mayBeContainXssHtml,whitelist); + return cleanHtml.replaceAll(to,from); + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/date/DateCalcUtils.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/date/DateCalcUtils.java new file mode 100644 index 0000000..e19db94 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/date/DateCalcUtils.java @@ -0,0 +1,189 @@ +package com.passManage.us.core.utils.date; + +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Arrays; +import java.util.Calendar; +import java.util.Date; +import java.util.GregorianCalendar; + +/** + * qq:799374340 + * @author hdy + * 2013-6-19下午2:25:12 + */ +public class DateCalcUtils { + static ThreadLocal<GregorianCalendar> local = new ThreadLocal<GregorianCalendar>() { + protected GregorianCalendar initialValue() { + return new GregorianCalendar(); + }; + }; + static final int[] d = new int[] { 1, 3, 5, 7, 8, 10, 12 }; + + // 获取前一天 date:20101212 就会返回20101211 + public static int getBeforeOneDay(int date) { + return getBeforeDay(date - 1); + } + + //获得一天后的数据 + public static int getAfterOneDay(int v) { + int day = v % 100; + if (day <= 27) {// 快速算 27号以前直接返回+1 + return v + 1; + } + if (v % 10000 == 1231) { + return v + 8870; + } + int f = (v % 10000) / 100; + int dd = Arrays.binarySearch(d, f); + if (dd < 0) {// 2 4 6 9 11 + if (f == 2) { + return getVfrom2Month(v, day); + } else {// 4 6 9 11月 + if (day < 30) { + return v + 1; + } else {// 30号20120430 + return v + 71; + } + } + } else {// 1,3,5,7,8,10,12月 + if (day < 31) { + return v + 1; + } else {// 31号20120431 + return v + 70; + } + } + } + // 格式化数据 + private static int getBeforeDay(int v) { + if (v % 100 == 0) { + int f = (v % 10000) / 100; + int dd = Arrays.binarySearch(d, f); + if (dd < 0) { + return v - 69; + } + if (dd >= 0) { + if (f == 3) { + int y = v / 10000; + if (local.get().isLeapYear(y)) {// 闰年 + return v - 71; + } + return v - 72; + } else if (f == 1) { + return v - 8869; + } else if (f == 8) {// 重构了下 如果是79960801前一天就不行了79960800 + return v - 69; + } + return v - 70; + } + } + return v; + } + //获取2月的时间 + private static int getVfrom2Month(int v, int day) { + // 2月 + if (day < 28) { + return v + 1; + } else { + int y = v / 10000; + if (local.get().isLeapYear(y)) {// 闰年20120229 20120301 + if (day == 29) { + return v + 72; + } else {// 28号 + return v + 1; + } + } else {// 28号 + if (day == 28) {// 平年 + return v + 73; + } + } + } + return v + 1; + } + // 日期字符串转成long型返回 + public static long parseDateStrToLong(String date, String format) { + SimpleDateFormat sf = new SimpleDateFormat(format); + try { + return sf.parse(date).getTime(); + } catch (ParseException e) { + e.printStackTrace(); + return 0L; + } + } + //日期 + public static Date changeDay(Date d, int offset) { + if (d == null) + return null; + Calendar calendar = Calendar.getInstance(); + calendar.setTime(d); + calendar.set(Calendar.DAY_OF_YEAR, + (calendar.get(Calendar.DAY_OF_YEAR) + offset)); + return calendar.getTime(); + } + + public static Date changeHour(Date d, int offset) { + if (d == null) + return null; + Calendar calendar = Calendar.getInstance(); + calendar.setTime(d); + calendar.set(Calendar.HOUR_OF_DAY, + (calendar.get(Calendar.HOUR_OF_DAY) + offset)); + return calendar.getTime(); + } + + public static Date changeMinute(Date d, int offset) { + if (d == null) + return null; + Calendar calendar = Calendar.getInstance(); + calendar.setTime(d); + calendar.set(Calendar.MINUTE, (calendar.get(Calendar.MINUTE) + offset)); + return calendar.getTime(); + } + + public static Date changeSecond(Date d, int offset) { + if (d == null) + return null; + Calendar calendar = Calendar.getInstance(); + calendar.setTime(d); + calendar.set(Calendar.SECOND, (calendar.get(Calendar.SECOND) + offset)); + return calendar.getTime(); + } + + // 获得两日期之间相距天数 + public static long compareWithDay(Date maxDate1, Date minDate2) { + long quot = 0; + quot = maxDate1.getTime() - minDate2.getTime(); + quot = quot / 1000 / 60 / 60 / 24; + return quot; + } + + // 获得两日期之间相距小时 + public static long compareWithHour(Date maxDate1, Date minDate2) { + long quot = 0; + quot = maxDate1.getTime() - minDate2.getTime(); + quot = quot / 1000 / 60 / 60; + return quot; + } + + // 获得两日期之间相距分钟 + public static long compareWithMinute(Date maxDate1, Date minDate2) { + long quot = 0; + quot = maxDate1.getTime() - minDate2.getTime(); + quot = quot / 1000 / 60; + return quot; + } + + // 获得两日期之间相距秒钟 + public static long compareWithSecond(Date maxDate1, Date minDate2) { + long quot = 0; + quot = maxDate1.getTime() - minDate2.getTime(); + quot = quot / 1000; + return quot; + } + //获取现在到今天23:59:59间距多少秒 + public static int nowToTodayEndSeconds(){ + Date now = new Date(); + long between = compareWithSecond(DateFormatUtils.getDateEnd(now),now); + return Integer.valueOf(between+""); + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/date/DateCalculate.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/date/DateCalculate.java new file mode 100644 index 0000000..72196c5 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/date/DateCalculate.java @@ -0,0 +1,352 @@ +package com.passManage.us.core.utils.date; + +import java.text.DecimalFormat; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * Created by www.magicalcoder.com on 14-3-31. + * 799374340@qq.com + */ +public class DateCalculate { + private static DateCalculate instance = new DateCalculate(); + public static DateCalculate get(){ + return instance; + } + /** 注意格里历和儒略历交接时的日期差别 */ + private static transient int gregorianCutoverYear = 1582; + + /** 闰年中每月天数 */ + private static final int[] DAYS_P_MONTH_LY= + {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; + /** 平年中每月天数 */ + private static final int[] DAYS_P_MONTH_CY= + {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; + /** 代表数组里的年、月、日 */ + private static final int Y = 0, M = 1, D = 2; + + /** 参与运算用 */ + private int[] ymd = null; + + /** + * 检查传入的参数是否合法的日期 + * @param date + * @throws IllegalArgumentException + */ + public static void validate(String date)throws IllegalArgumentException{ + + int[] ymd = splitYMD( date ); + + if( ymd[M] == 0 || ymd[M] > 12 ){ + throw new IllegalArgumentException("月份数值错误"); + } + + if( true == isLeapYear( ymd[0] ) ){ + if( ymd[D] == 0 || ymd[D] > DAYS_P_MONTH_LY[ymd[M] -1 ] ){ + throw new IllegalArgumentException("日期数值错误"); + } + }else{ + if( ymd[D] == 0 || ymd[D] > DAYS_P_MONTH_CY[ymd[M] -1 ] ){ + throw new IllegalArgumentException("日期数值错误"); + } + } + } + + /** + * 检查传入的参数代表的年份是否为闰年 + * @param year + * @return + */ + public static boolean isLeapYear(int year) { + return year >= gregorianCutoverYear ? + ((year%4 == 0) && ((year%100 != 0) || + (year%400 == 0))) : // Gregorian + (year%4 == 0); // Julian + } + + /** + * 日期加1天,注意这里没有考虑儒略历和格里历交接时相差的10天 + * @param year + * @param month + * @param day + * @return + */ + private int[] addOneDay(int year, int month, int day){ + if(isLeapYear( year )){ + day++; + if( day > DAYS_P_MONTH_LY[month -1 ] ){ + month++; + if(month > 12){ + year++; + month = 1; + } + day = 1; + } + }else{ + day++; + if( day > DAYS_P_MONTH_CY[month -1 ] ){ + month++; + if(month > 12){ + year++; + month = 1; + } + day = 1; + } + } + int[] ymd = {year, month, day}; + return ymd; + } + + /** + * 以循环的方式计算日期加法 + * @param date + * @param days + * @return + */ + public String addDaysByLoop(String date, int days){ + validate(date); + int[] ymd = splitYMD( date ); + for(int i = 0; i < days; i++){ + ymd = addOneDay(ymd[Y], ymd[M], ymd[D]); + } + return formatYear(ymd[Y])+ + formatMonthDay(ymd[M])+ + formatMonthDay(ymd[D]); + } + + /** + * 日期减1天,注意这里没有考虑儒略历和格里历交接时相差的10天 + * @param year + * @param month + * @param day + * @return + */ + private int[] reduceOneDay(int year, int month, int day){ + if(isLeapYear( year )){ + day--; + if( day <= 0 ){ + month--; + if(month < 1){ + year--; + month = 12; + } + day = DAYS_P_MONTH_LY[month -1 ]; + } + }else{ + day--; + if( day <= 0 ){ + month--; + if(month < 1){ + year--; + month = 12; + } + day = DAYS_P_MONTH_CY[month -1 ]; + } + } + int[] ymd = {year, month, day}; + return ymd; + } + + /** + * 以循环的方式计算日期减法 + * @param date + * @param days + * @return + */ + public String reduceDaysByLoop(String date, int days){ + validate(date); + int[] ymd = splitYMD( date ); + for(int i = 0; i < days; i++){ + ymd = reduceOneDay(ymd[Y], ymd[M], ymd[D]); + } + return formatYear(ymd[Y])+ + formatMonthDay(ymd[M])+ + formatMonthDay(ymd[D]); + } + + /** + * 指定日期加上指定的天数的操作 + * @param date + * @param days + * @return + * @throws IllegalArgumentException + */ + public Integer addDays(Date date, int days) + throws IllegalArgumentException{ + return addDays(formatDate(date), days); + } + + /** + * 指定日期加上指定的天数的操作 + * @param date + * @param days + * @return + * @throws IllegalArgumentException + */ + public Integer addDays(String date, int days) + throws IllegalArgumentException{ + + validate(date); + ymd = splitYMD( date ); + + if( isLeapYear( ymd[Y] ) ){ + ymd[D] += days; + if( ymd[D] > DAYS_P_MONTH_LY[ymd[M] -1 ] ){ + ymd[M] ++; + ymd[D] = ymd[D] - DAYS_P_MONTH_LY[ymd[M] -1-1 ]; + if(ymd[M] > 12){ + ymd[M] -= 12; + ymd[Y]++; + } + if( ymd[D] > DAYS_P_MONTH_LY[ymd[M] -1 ] ){ + addDays(formatYear(ymd[Y])+ + formatMonthDay(ymd[M])+ + formatMonthDay(DAYS_P_MONTH_LY[ymd[M] -1 ]), + ymd[D] - DAYS_P_MONTH_LY[ymd[M] -1 ]); + } + } + }else{ + ymd[D] += days; + if( ymd[D] > DAYS_P_MONTH_CY[ymd[M] -1 ] ){ + ymd[M] ++; + ymd[D] = ymd[D] - DAYS_P_MONTH_CY[ymd[M] -1-1 ]; + if(ymd[M] > 12){ + ymd[M] -= 12; + ymd[Y]++; + } + if( ymd[D] > DAYS_P_MONTH_CY[ymd[M] -1 ] ){ + addDays(formatYear(ymd[Y])+ + formatMonthDay(ymd[M])+ + formatMonthDay(DAYS_P_MONTH_CY[ymd[M] -1 ]), + ymd[D] - DAYS_P_MONTH_CY[ymd[M] -1 ]); + } + } + } + return Integer.parseInt(formatYear(ymd[Y])+ + formatMonthDay(ymd[M])+ + formatMonthDay(ymd[D])); + } + + /** + * 指定日期减去指定的天数的操作 + * @param date + * @param days + * @return + * @throws IllegalArgumentException + */ + public Integer reduceDays(Date date, int days) + throws IllegalArgumentException{ + return reduceDays(formatDate(date), days); + } + + /** + * 指定日期减去指定的天数的操作 + * @param date + * @param days + * @return + * @throws IllegalArgumentException + */ + public Integer reduceDays(String date, int days) + throws IllegalArgumentException{ + + validate(date); + ymd = splitYMD( date ); + + if( isLeapYear( ymd[Y] ) ){ + ymd[D] -= days; + if( ymd[D] <= 0 ){ + ymd[M] --; + if(ymd[M] < 1){ + ymd[M] += 12; + ymd[Y]--; + } + ymd[D] = ymd[D] + DAYS_P_MONTH_LY[ ymd[M]-1 ]; + if( ymd[D] <= 0 ){ + reduceDays(formatYear(ymd[Y])+ + formatMonthDay(ymd[M])+ + formatMonthDay( 1 ), + abs( ymd[D] - 1 )); + } + } + }else{ + ymd[D] -= days; + if( ymd[D] <= 0 ){ + ymd[M] --; + if(ymd[M] < 1){ + ymd[M] += 12; + ymd[Y]--; + } + ymd[D] = ymd[D] + DAYS_P_MONTH_CY[ ymd[M]-1 ]; + if( ymd[D] <= 0 ){ + reduceDays(formatYear(ymd[Y])+ + formatMonthDay(ymd[M])+ + formatMonthDay(1), + abs( ymd[D] - 1 )); + } + } + } + return Integer.valueOf(formatYear(ymd[Y])+ + formatMonthDay(ymd[M])+ + formatMonthDay(ymd[D])); + } + + /** + * 格式化一个日期字符串 + * @param date + * @return + */ + public static String formatDate(Date date){ + SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); + return sdf.format( date ); + } + + /** + * 将代表日期的字符串分割为代表年月日的整形数组 + * @param date + * @return + */ + public static int[] splitYMD(String date){ + int[] ymd = {0, 0, 0}; + ymd[Y] = Integer.parseInt(date.substring(0, 4)); + ymd[M] = Integer.parseInt(date.substring(4, 6)); + ymd[D] = Integer.parseInt(date.substring(6, 8)); + return ymd; + } + + /** + * 将不足两位的月份或日期补足为两位 + * @param decimal + * @return + */ + public static String formatMonthDay(int decimal){ + DecimalFormat df = new DecimalFormat("00"); + return df.format( decimal ); + } + + /** + * 将不足四位的年份补足为四位 + * @param decimal + * @return + */ + public static String formatYear(int decimal){ + DecimalFormat df = new DecimalFormat("0000"); + return df.format( decimal ); + } + + /** + * 取绝对值操作 + * @param num + * @return + */ + public static int abs(int num){ + return (num > 0) ? num : -num; + } + + /** + * 测试用main函数 + * @param args + */ + public static void main( String[] args ) throws Exception{ + System.out.println(("20121112-20121212").substring(13,17));; + } +} diff --git a/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/date/DateFormatUtils.java b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/date/DateFormatUtils.java new file mode 100644 index 0000000..97d1df6 --- /dev/null +++ b/us_passManage/us-core/src/main/java/com/passManage/us/core/utils/date/DateFormatUtils.java @@ -0,0 +1,289 @@ +package com.passManage.us.core.utils.date; + +import java.text.DecimalFormat; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; + +/** + * qq:799374340 hdy 2013-4-17上午11:47:47 + */ +public class DateFormatUtils { + +/* public static final SimpleDateFormat df = new SimpleDateFormat( + "yyyy-MM-dd HH:mm:ss"); + + public static SimpleDateFormat getDateFormat() { + return df; + }*/ + public static Date getDate(Date date, String format) { + SimpleDateFormat df = new SimpleDateFormat(format); + try { + return df.parse(getStringDate(date,format)); + } catch (ParseException e) { + e.printStackTrace(); + } + return null; + } + public static Date getDate(String dateStr, String format) { + SimpleDateFormat df = new SimpleDateFormat(format); + try { + return df.parse(dateStr); + } catch (ParseException e) { + e.printStackTrace(); + return null; + } + } + /** + * @param year + * @param month 1-12 + * @param day 1-31 + * @return + */ + public static Date getDateDefined(int year, int month, int day) { + month = month-1; + Calendar calendar = Calendar.getInstance(); + // month,day格式不正确,默认取当天时间 + if (month >= 0 && month <= 11 && day >= 1 && day <= 31) { + calendar.set(Calendar.YEAR, year); + calendar.set(Calendar.MONTH, month); + calendar.set(Calendar.DATE, day); + } + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + // calendar.set(Calendar.MILLISECOND, 0); + return calendar.getTime(); + } + /** 获取自定义日期 + * @param year + * @param month + * @param day + * @param hour + * @param minute + * @param second + * @return + */ + public static Date getDateDefined(int year, int month, int day,int hour,int minute,int second) { + month = month-1; + Calendar calendar = Calendar.getInstance(); + // month,day格式不正确,默认取当天时间 + if (month >= 0 && month <= 11 && day >= 1 && day <= 31) { + calendar.set(Calendar.YEAR, year); + calendar.set(Calendar.MONTH, month); + calendar.set(Calendar.DATE, day); + } + calendar.set(Calendar.HOUR_OF_DAY, hour); + calendar.set(Calendar.MINUTE, minute); + calendar.set(Calendar.SECOND, second); + return calendar.getTime(); + } + /** + * 返回当天 自定义时分秒 + * @return + */ + public static Date getDateDefined(Date date, int hour, int minute, + int second) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.set(Calendar.HOUR_OF_DAY, hour); + calendar.set(Calendar.MINUTE, minute); + calendar.set(Calendar.SECOND, second); + return calendar.getTime(); + } + /** + * 以当天零点零分零秒零毫秒格式返回date + * @param date + * @return + */ + public static Date getDateBegin(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + // calendar.set(Calendar.MILLISECOND, 0); + return calendar.getTime(); + } + /** + * 以当天23点59分59秒格式返回date + * @param date + * @return + */ + public static Date getDateEnd(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.set(Calendar.HOUR_OF_DAY, 23); + calendar.set(Calendar.MINUTE, 59); + calendar.set(Calendar.SECOND, 59); + return calendar.getTime(); + } + //int返回日期 + public static Date getDateEnd(int dateYmd){ + String dateStr = dateYmd+"235959"; + return getDate(dateStr,"yyyyMMddHHmmss"); + } + //int返回日期 + public static Date getDateBegin(int dateYmd ){ + String dateStr = dateYmd+"000000"; + return getDate(dateStr,"yyyyMMddHHmmss"); + } + public static String getStringDate(Date date, String format) { + SimpleDateFormat df = new SimpleDateFormat(format); + return df.format(date); + } + /** yyyy-MM-dd HH:mm:ss格式 + * @param date + * @return + */ + public static String getStringDefaultDate(Date date) { + if (date != null) { + SimpleDateFormat df = new SimpleDateFormat( + "yyyy-MM-dd HH:mm:ss"); + return df.format(date); + } + return ""; + } + + /**获取年月日整形返回 + * @param date + * @return + */ + public static int getIntDateYmd(Date date){ + if(date==null){ + date = new Date(); + } + String dateStr = getStringDate(date, "yyyyMMdd"); + return Integer.valueOf(dateStr); + } + + /**获取时分秒整形返回 + * @param date + * @return + */ + public static int getIntDateHms(Date date){ + if(date==null){ + date = new Date(); + } + String dateStr = getStringDate(date, "HHmmss"); + return Integer.valueOf(dateStr); + } + /** + * 获取日期年份 + * @param date + * @return + * @throws ParseException + */ + public static int getIntYear(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + return calendar.get(Calendar.YEAR); + } + + /** + * 获取日期月份 + * @param date + * @return + * @throws ParseException + */ + public static int getIntMonth(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + return (calendar.get(Calendar.MONTH) + 1); + } + /** + * 获取日期天 + * @param date + * @return + * @throws ParseException + */ + public static int getIntDay(Date date) { + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + return (calendar.get(Calendar.DAY_OF_MONTH)); + } + /** + * 返回格式化的字符串 + * @param date 11 + * @param format 000000 + * @return 000011 + */ + public static String getFormatStr(int date,String format){ + DecimalFormat df = new DecimalFormat(format); + return df.format(date); + } + /** + * 获取月份起始日期 + * @param date + * @return + * @throws ParseException + */ + public static Date getMonthDateBegin(Date date){ + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMinimum(Calendar.DAY_OF_MONTH)); + return calendar.getTime(); + } + + /** + * 获取月份最后日期 + * @param date + * @return + * @throws ParseException + */ + public static Date getMonthDateEnd(Date date){ + Calendar calendar = Calendar.getInstance(); + calendar.setTime(date); + calendar.set(Calendar.DAY_OF_MONTH, calendar.getActualMaximum(Calendar.DAY_OF_MONTH)); + return calendar.getTime(); + } + + /** + * 获取本周周一 + * @param now + * @return + */ + public static Date getMonday(Date now){ + Calendar calendar = Calendar.getInstance(); + calendar.setTime(now); + calendar.setFirstDayOfWeek(Calendar.MONDAY); + calendar.set(Calendar.DAY_OF_WEEK,Calendar.MONDAY); + return calendar.getTime(); + } + + /** + * 获取本周某天 + * @param now + * @param calendayDay Calendar.MONDAY ... + * @return + */ + public static Date getCalendayDay(Date now,int calendayDay){ + Calendar calendar = Calendar.getInstance(); + calendar.setTime(now); + calendar.setFirstDayOfWeek(Calendar.MONDAY); + calendar.set(Calendar.DAY_OF_WEEK,calendayDay); + return calendar.getTime(); + } + /** + * 获取本周周日 + * @param now + * @return + */ + public static Date getSunday(Date now){ + Calendar calendar = Calendar.getInstance(); + calendar.setTime(now); + calendar.setFirstDayOfWeek(Calendar.MONDAY); + calendar.set(Calendar.DAY_OF_WEEK,Calendar.SUNDAY); + return calendar.getTime(); + } + +/* public static void main(String[] args) { + Date now = + DateFormatUtils.getMonday(DateFormatUtils.getDateBegin(20140320)); + Date monday = getMonday(now); + Date sunday = getSunday(now); + System.out.println(getIntDateYmd(monday)); + System.out.println(getIntDateYmd(sunday)); + }*/ +} diff --git a/us_passManage/us-service/pom.xml b/us_passManage/us-service/pom.xml new file mode 100644 index 0000000..0fe95f8 --- /dev/null +++ b/us_passManage/us-service/pom.xml @@ -0,0 +1,19 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>com.passManage</groupId> + <artifactId>us</artifactId> + <version>0.0.1-SNAPSHOT</version> + </parent> + <name>us-service</name> + <artifactId>us-service</artifactId> + + <dependencies> + <dependency> + <groupId>com.passManage</groupId> + <artifactId>us-core</artifactId> + <version>0.0.1-SNAPSHOT</version> + </dependency> + </dependencies> + +</project> diff --git a/us_passManage/us-service/src/main/java/com/passManage/us/model/PpassInstant.java b/us_passManage/us-service/src/main/java/com/passManage/us/model/PpassInstant.java new file mode 100644 index 0000000..fc4b03c --- /dev/null +++ b/us_passManage/us-service/src/main/java/com/passManage/us/model/PpassInstant.java @@ -0,0 +1,105 @@ +package com.passManage.us.model; + +import org.springframework.format.annotation.DateTimeFormat; +import com.fasterxml.jackson.annotation.JsonFormat; +import java.util.Date; +import java.sql.Time; +import java.sql.Timestamp; +import java.math.*; +import java.io.Serializable; +import lombok.Data; +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 软件作者:何栋宇 qq:709876443 +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:648595928 +*/ +@Data +public class PpassInstant implements Serializable{ + + private Integer passId;//密钥UUID + private String passName;//密钥名称 + private Integer passLength;//密钥长度 + private String passType;//密钥类型 + private String passChildfir;//第一子密钥 + private String passChildsec;//第二子密钥 + private String passChildthi;//第三子密钥 + @DateTimeFormat( pattern = "yyyy-MM-dd" ) + @JsonFormat(pattern = "yyyy-MM-dd", timezone="GMT+8") + private Date passExpiry;//密钥有效期 + @DateTimeFormat( pattern = "yyyy-MM-dd HH:mm:ss" ) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8") + private Date passCreatetime;//密钥上传时间 + private Integer passUserid;//密钥使用者 + + + public Integer getPassId(){ + return passId; + } + public void setPassId(Integer passId){ + this.passId = passId; + } + + public String getPassName(){ + return passName; + } + public void setPassName(String passName){ + this.passName = passName; + } + + public Integer getPassLength(){ + return passLength; + } + public void setPassLength(Integer passLength){ + this.passLength = passLength; + } + + public String getPassType(){ + return passType; + } + public void setPassType(String passType){ + this.passType = passType; + } + + public String getPassChildfir(){ + return passChildfir; + } + public void setPassChildfir(String passChildfir){ + this.passChildfir = passChildfir; + } + + public String getPassChildsec(){ + return passChildsec; + } + public void setPassChildsec(String passChildsec){ + this.passChildsec = passChildsec; + } + + public String getPassChildthi(){ + return passChildthi; + } + public void setPassChildthi(String passChildthi){ + this.passChildthi = passChildthi; + } + + public Date getPassExpiry(){ + return passExpiry; + } + public void setPassExpiry(Date passExpiry){ + this.passExpiry = passExpiry; + } + + public Date getPassCreatetime(){ + return passCreatetime; + } + public void setPassCreatetime(Date passCreatetime){ + this.passCreatetime = passCreatetime; + } + + public Integer getPassUserid(){ + return passUserid; + } + public void setPassUserid(Integer passUserid){ + this.passUserid = passUserid; + } +} diff --git a/us_passManage/us-service/src/main/java/com/passManage/us/model/PpassOld.java b/us_passManage/us-service/src/main/java/com/passManage/us/model/PpassOld.java new file mode 100644 index 0000000..6779289 --- /dev/null +++ b/us_passManage/us-service/src/main/java/com/passManage/us/model/PpassOld.java @@ -0,0 +1,105 @@ +package com.passManage.us.model; + +import org.springframework.format.annotation.DateTimeFormat; +import com.fasterxml.jackson.annotation.JsonFormat; +import java.util.Date; +import java.sql.Time; +import java.sql.Timestamp; +import java.math.*; +import java.io.Serializable; +import lombok.Data; +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 软件作者:何栋宇 qq:709876443 +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:648595928 +*/ +@Data +public class PpassOld implements Serializable{ + + private Integer passId;//密钥UUID + private String passName;//密钥名称 + private Integer passLength;//密钥长度 + private String passType;//密钥类型 + private String passChildfir;//第一子密钥 + private String passChildsec;//第二子密钥 + private String passChildthi;//第三子密钥 + @DateTimeFormat( pattern = "yyyy-MM-dd HH:mm:ss" ) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8") + private Date passExpiry;//密钥有效期 + @DateTimeFormat( pattern = "yyyy-MM-dd HH:mm:ss" ) + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone="GMT+8") + private Date passCreatetime;//密钥上传时间 + private Integer passUserid;//密钥使用者 + + + public Integer getPassId(){ + return passId; + } + public void setPassId(Integer passId){ + this.passId = passId; + } + + public String getPassName(){ + return passName; + } + public void setPassName(String passName){ + this.passName = passName; + } + + public Integer getPassLength(){ + return passLength; + } + public void setPassLength(Integer passLength){ + this.passLength = passLength; + } + + public String getPassType(){ + return passType; + } + public void setPassType(String passType){ + this.passType = passType; + } + + public String getPassChildfir(){ + return passChildfir; + } + public void setPassChildfir(String passChildfir){ + this.passChildfir = passChildfir; + } + + public String getPassChildsec(){ + return passChildsec; + } + public void setPassChildsec(String passChildsec){ + this.passChildsec = passChildsec; + } + + public String getPassChildthi(){ + return passChildthi; + } + public void setPassChildthi(String passChildthi){ + this.passChildthi = passChildthi; + } + + public Date getPassExpiry(){ + return passExpiry; + } + public void setPassExpiry(Date passExpiry){ + this.passExpiry = passExpiry; + } + + public Date getPassCreatetime(){ + return passCreatetime; + } + public void setPassCreatetime(Date passCreatetime){ + this.passCreatetime = passCreatetime; + } + + public Integer getPassUserid(){ + return passUserid; + } + public void setPassUserid(Integer passUserid){ + this.passUserid = passUserid; + } +} diff --git a/us_passManage/us-service/src/main/java/com/passManage/us/service/ppassinstant/constant/PpassInstantConstant.java b/us_passManage/us-service/src/main/java/com/passManage/us/service/ppassinstant/constant/PpassInstantConstant.java new file mode 100644 index 0000000..aaf48cf --- /dev/null +++ b/us_passManage/us-service/src/main/java/com/passManage/us/service/ppassinstant/constant/PpassInstantConstant.java @@ -0,0 +1,12 @@ +package com.passManage.us.service.ppassinstant.constant; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 软件作者:何栋宇 qq:709876443 +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:648595928 +*/ + +public interface PpassInstantConstant{ + +} diff --git a/us_passManage/us-service/src/main/java/com/passManage/us/service/ppassinstant/dto/PpassInstantDto.java b/us_passManage/us-service/src/main/java/com/passManage/us/service/ppassinstant/dto/PpassInstantDto.java new file mode 100644 index 0000000..402f69d --- /dev/null +++ b/us_passManage/us-service/src/main/java/com/passManage/us/service/ppassinstant/dto/PpassInstantDto.java @@ -0,0 +1,15 @@ +package com.passManage.us.service.ppassinstant.dto; + +import com.passManage.us.model.PpassInstant; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 软件作者:何栋宇 qq:709876443 +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:648595928 +*/ + +public class PpassInstantDto extends PpassInstant { + + +} diff --git a/us_passManage/us-service/src/main/java/com/passManage/us/service/ppassinstant/mapper/PpassInstantMapper.java b/us_passManage/us-service/src/main/java/com/passManage/us/service/ppassinstant/mapper/PpassInstantMapper.java new file mode 100644 index 0000000..f090306 --- /dev/null +++ b/us_passManage/us-service/src/main/java/com/passManage/us/service/ppassinstant/mapper/PpassInstantMapper.java @@ -0,0 +1,38 @@ +package com.passManage.us.service.ppassinstant.mapper; + +import com.passManage.us.core.service.ICommonMapper; +import com.passManage.us.model.PpassInstant; +import org.apache.ibatis.annotations.*; + +import java.util.List; +import java.util.Map; +import java.util.Date; +import java.sql.Time; +import java.sql.Timestamp; +import java.math.*; +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 软件作者:何栋宇 qq:709876443 +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:648595928 +*/ + +public interface PpassInstantMapper extends ICommonMapper<PpassInstant,Integer>{ + + @Update("SELECT * FROM p_pass_instant where pass_expiry < NOW()") + Integer sendUpdateMsgToUser(@Param("ppassInstat")PpassInstant ppassInstant); + + @Select("SELECT * FROM p_pass_instant where pass_expiry < NOW()") + @Results({ @Result(id = true, column = "pass_id", property = "passId"), + @Result(column = "pass_name", property = "passName"), + @Result(column = "pass_length", property = "passLength") , + @Result(column = "pass_type", property = "passType"), + @Result(column = "pass_childfir", property = "passChildfir") , + @Result(column = "pass_childsec", property = "passChildsec") , + @Result(column = "pass_expiry", property = "passExpiry") , + @Result(column = "pass_createtime", property = "passCreatetime") , + @Result(column = "pass_userid", property = "passUserid") , + }) + List<PpassInstant> getOldestDatePassKey(); + +} diff --git a/us_passManage/us-service/src/main/java/com/passManage/us/service/ppassinstant/service/PpassInstantService.java b/us_passManage/us-service/src/main/java/com/passManage/us/service/ppassinstant/service/PpassInstantService.java new file mode 100644 index 0000000..80c4f90 --- /dev/null +++ b/us_passManage/us-service/src/main/java/com/passManage/us/service/ppassinstant/service/PpassInstantService.java @@ -0,0 +1,25 @@ +package com.passManage.us.service.ppassinstant.service; + +import com.passManage.us.core.service.ICommonService; +import com.passManage.us.model.PpassInstant; +import java.util.List; +import java.util.Map; +import java.util.Date; +import java.sql.Time; +import java.sql.Timestamp; +import java.math.*; +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 软件作者:何栋宇 qq:709876443 +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:648595928 +*/ + +public interface PpassInstantService extends ICommonService<PpassInstant,Integer>{ + + String updateKeyAlert(String id); + + List<PpassInstant> getOldestDatePassKey(); + + Integer updateKeyAlertByPassKeyList(List<PpassInstant> oldestDatePassKey); +} diff --git a/us_passManage/us-service/src/main/java/com/passManage/us/service/ppassinstant/service/impl/PpassInstantServiceImpl.java b/us_passManage/us-service/src/main/java/com/passManage/us/service/ppassinstant/service/impl/PpassInstantServiceImpl.java new file mode 100644 index 0000000..d79e149 --- /dev/null +++ b/us_passManage/us-service/src/main/java/com/passManage/us/service/ppassinstant/service/impl/PpassInstantServiceImpl.java @@ -0,0 +1,86 @@ +package com.passManage.us.service.ppassinstant.service.impl; + +import com.passManage.us.core.utils.CollectionUtil; +import com.passManage.us.core.utils.ListUtil; +import com.passManage.us.model.PpassOld; +import com.passManage.us.service.ppassinstant.mapper.PpassInstantMapper; +import com.passManage.us.service.ppassinstant.service.PpassInstantService; +import com.passManage.us.model.PpassInstant; +import com.passManage.us.core.service.CommonServiceImpl; +import com.passManage.us.core.utils.StringUtil; + +import com.passManage.us.service.ppassold.mapper.PpassOldMapper; +import org.springframework.beans.BeanUtils; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.stereotype.Service; +import com.passManage.us.core.utils.CopyUtil; +import org.springframework.beans.factory.InitializingBean; + +import javax.annotation.Resource; +import java.util.*; +import java.sql.Time; +import java.sql.Timestamp; +import java.math.*; +import java.util.stream.Collectors; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 软件作者:何栋宇 qq:709876443 +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:648595928 +*/ + +@Service +@Transactional +public class PpassInstantServiceImpl extends CommonServiceImpl<PpassInstant,Integer> implements PpassInstantService,InitializingBean{ + @Resource + private PpassInstantMapper ppassInstantMapper; + + @Resource + private PpassOldMapper ppassOldMapper; + + @Override + public void afterPropertiesSet() { + super.commonMapper = ppassInstantMapper; + } + + @Override + public String updateKeyAlert(String id) { + PpassInstant model = this.getModel(Integer.parseInt(id)); + Integer count = ppassInstantMapper.sendUpdateMsgToUser(model); + String msg = ""; + if(count == 1){ + msg = "提醒更新密钥成功"; + }else{ + msg = "提醒更新密钥失败"; + } + return msg; + } + + @Override + public List<PpassInstant> getOldestDatePassKey() { + List<PpassInstant> oldPpassList= ppassInstantMapper.getOldestDatePassKey(); + return oldPpassList; + } + + @Override + public Integer updateKeyAlertByPassKeyList(List<PpassInstant> oldestDatePassKey) { + Integer count = 0; + for (PpassInstant ppassInstant : oldestDatePassKey) { + PpassOld ppassOld = new PpassOld(); + ppassOld.setPassChildfir(ppassInstant.getPassChildfir()); + ppassOld.setPassChildsec(ppassInstant.getPassChildsec()); + ppassOld.setPassCreatetime(ppassInstant.getPassCreatetime()); + ppassOld.setPassExpiry(ppassInstant.getPassExpiry()); + ppassOld.setPassLength(ppassInstant.getPassLength()); + ppassOld.setPassName(ppassInstant.getPassName()); + ppassOld.setPassUserid(ppassInstant.getPassUserid()); + ppassOld.setPassType(ppassInstant.getPassType()); + ppassOldMapper.insertModel(ppassOld); + } + Set<Integer> passOldSet = oldestDatePassKey.stream().map(PpassInstant::getPassId).collect(Collectors.toSet()); + if(!CollectionUtil.isEmpty(passOldSet)){ + count = ppassInstantMapper.deleteModelByIds(passOldSet);} + return count; + } +} diff --git a/us_passManage/us-service/src/main/java/com/passManage/us/service/ppassinstant/util/PpassInstantUtil.java b/us_passManage/us-service/src/main/java/com/passManage/us/service/ppassinstant/util/PpassInstantUtil.java new file mode 100644 index 0000000..5d06568 --- /dev/null +++ b/us_passManage/us-service/src/main/java/com/passManage/us/service/ppassinstant/util/PpassInstantUtil.java @@ -0,0 +1,11 @@ +package com.passManage.us.service.ppassinstant.util; +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 软件作者:何栋宇 qq:709876443 +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:648595928 +*/ + +public class PpassInstantUtil { + +} diff --git a/us_passManage/us-service/src/main/java/com/passManage/us/service/ppassold/constant/PpassOldConstant.java b/us_passManage/us-service/src/main/java/com/passManage/us/service/ppassold/constant/PpassOldConstant.java new file mode 100644 index 0000000..d9b675a --- /dev/null +++ b/us_passManage/us-service/src/main/java/com/passManage/us/service/ppassold/constant/PpassOldConstant.java @@ -0,0 +1,12 @@ +package com.passManage.us.service.ppassold.constant; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 软件作者:何栋宇 qq:709876443 +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:648595928 +*/ + +public interface PpassOldConstant{ + +} diff --git a/us_passManage/us-service/src/main/java/com/passManage/us/service/ppassold/dto/PpassOldDto.java b/us_passManage/us-service/src/main/java/com/passManage/us/service/ppassold/dto/PpassOldDto.java new file mode 100644 index 0000000..c651612 --- /dev/null +++ b/us_passManage/us-service/src/main/java/com/passManage/us/service/ppassold/dto/PpassOldDto.java @@ -0,0 +1,15 @@ +package com.passManage.us.service.ppassold.dto; + +import com.passManage.us.model.PpassOld; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 软件作者:何栋宇 qq:709876443 +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:648595928 +*/ + +public class PpassOldDto extends PpassOld { + + +} diff --git a/us_passManage/us-service/src/main/java/com/passManage/us/service/ppassold/mapper/PpassOldMapper.java b/us_passManage/us-service/src/main/java/com/passManage/us/service/ppassold/mapper/PpassOldMapper.java new file mode 100644 index 0000000..b93317f --- /dev/null +++ b/us_passManage/us-service/src/main/java/com/passManage/us/service/ppassold/mapper/PpassOldMapper.java @@ -0,0 +1,20 @@ +package com.passManage.us.service.ppassold.mapper; + +import com.passManage.us.core.service.ICommonMapper; +import com.passManage.us.model.PpassOld; +import java.util.List; +import java.util.Map; +import java.util.Date; +import java.sql.Time; +import java.sql.Timestamp; +import java.math.*; +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 软件作者:何栋宇 qq:709876443 +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:648595928 +*/ + +public interface PpassOldMapper extends ICommonMapper<PpassOld,Integer>{ + +} diff --git a/us_passManage/us-service/src/main/java/com/passManage/us/service/ppassold/service/PpassOldService.java b/us_passManage/us-service/src/main/java/com/passManage/us/service/ppassold/service/PpassOldService.java new file mode 100644 index 0000000..e50cdb1 --- /dev/null +++ b/us_passManage/us-service/src/main/java/com/passManage/us/service/ppassold/service/PpassOldService.java @@ -0,0 +1,21 @@ +package com.passManage.us.service.ppassold.service; + +import com.passManage.us.core.service.ICommonService; +import com.passManage.us.model.PpassOld; +import java.util.List; +import java.util.Map; +import java.util.Date; +import java.sql.Time; +import java.sql.Timestamp; +import java.math.*; +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 软件作者:何栋宇 qq:709876443 +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:648595928 +*/ + +public interface PpassOldService extends ICommonService<PpassOld,Integer>{ + + +} diff --git a/us_passManage/us-service/src/main/java/com/passManage/us/service/ppassold/service/impl/PpassOldServiceImpl.java b/us_passManage/us-service/src/main/java/com/passManage/us/service/ppassold/service/impl/PpassOldServiceImpl.java new file mode 100644 index 0000000..067b548 --- /dev/null +++ b/us_passManage/us-service/src/main/java/com/passManage/us/service/ppassold/service/impl/PpassOldServiceImpl.java @@ -0,0 +1,38 @@ +package com.passManage.us.service.ppassold.service.impl; + +import com.passManage.us.service.ppassold.mapper.PpassOldMapper; +import com.passManage.us.service.ppassold.service.PpassOldService; +import com.passManage.us.model.PpassOld; +import com.passManage.us.core.service.CommonServiceImpl; +import com.passManage.us.core.utils.StringUtil; + +import org.springframework.transaction.annotation.Transactional; +import org.springframework.stereotype.Service; +import com.passManage.us.core.utils.CopyUtil; +import org.springframework.beans.factory.InitializingBean; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Date; +import java.sql.Time; +import java.sql.Timestamp; +import java.math.*; +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 软件作者:何栋宇 qq:709876443 +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:648595928 +*/ + +@Service +public class PpassOldServiceImpl extends CommonServiceImpl<PpassOld,Integer> implements PpassOldService,InitializingBean{ + @Resource + private PpassOldMapper ppassOldMapper; + + @Override + public void afterPropertiesSet() { + super.commonMapper = ppassOldMapper; + } +} diff --git a/us_passManage/us-service/src/main/java/com/passManage/us/service/ppassold/util/PpassOldUtil.java b/us_passManage/us-service/src/main/java/com/passManage/us/service/ppassold/util/PpassOldUtil.java new file mode 100644 index 0000000..de2bec2 --- /dev/null +++ b/us_passManage/us-service/src/main/java/com/passManage/us/service/ppassold/util/PpassOldUtil.java @@ -0,0 +1,11 @@ +package com.passManage.us.service.ppassold.util; +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 软件作者:何栋宇 qq:709876443 +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:648595928 +*/ + +public class PpassOldUtil { + +} diff --git a/us_passManage/us-service/src/main/resources/sqlmap/PpassInstantMapper.xml b/us_passManage/us-service/src/main/resources/sqlmap/PpassInstantMapper.xml new file mode 100644 index 0000000..fd8aea0 --- /dev/null +++ b/us_passManage/us-service/src/main/resources/sqlmap/PpassInstantMapper.xml @@ -0,0 +1,414 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<!-- +* 代码为自动生成 Created by www.magicalcoder.com +* 软件作者:何栋宇 qq:709876443 +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:648595928 +--> +<mapper namespace="com.passManage.us.service.ppassinstant.mapper.PpassInstantMapper"> + <!-- PpassInstant --> + <resultMap id="resultMap" type="PpassInstant"> + <id column="pass_id" property="passId"/> + <result column="pass_name" property="passName" /> + <result column="pass_length" property="passLength" /> + <result column="pass_type" property="passType" /> + <result column="pass_childfir" property="passChildfir" /> + <result column="pass_childsec" property="passChildsec" /> + <result column="pass_childthi" property="passChildthi" /> + <result column="pass_expiry" property="passExpiry" /> + <result column="pass_createtime" property="passCreatetime" /> + <result column="pass_userid" property="passUserid" /> + </resultMap> + <!-- 查询单个实体 --> + <select id="getModel" parameterType="hashmap" resultMap="resultMap"> + select <choose><when test="NotIgnore_!=null and NotIgnore_"><include refid="selectSqlNotIgnoreModel"/> </when><otherwise><include refid="selectSqlIgnoreModel"/></otherwise></choose> + from <include refid="tableSql"/> where 1=1 <include refid="whereSqlModel"/> <include refid="orderGroupLimit"/> + </select> + <!--根据主键 查询单个实体 --> + <select id="getModelByPk" parameterType="hashmap" resultMap="resultMap"> + select <choose><when test="NotIgnore_!=null and NotIgnore_"><include refid="selectSqlNotIgnoreModel"/> </when><otherwise><include refid="selectSqlIgnoreModel"/></otherwise></choose> + from <include refid="tableSql"/> <include refid="magicalcoderPkWhereSql"/> + </select> + <!-- 查询一组实体 --> + <select id="getModelList" parameterType="hashmap" resultMap="resultMap"> + select <choose><when test="NotIgnore_!=null and NotIgnore_"><include refid="selectSqlNotIgnoreModel"/> </when><otherwise><include refid="selectSqlIgnoreModel"/></otherwise></choose> + from <include refid="tableSql"/> where 1=1 <include refid="whereSqlModel"/> <include refid="orderGroupLimit"/> + </select> + <!-- 查询一组实体 in 语句--> + <select id="getModelInList" parameterType="hashmap" resultMap="resultMap"> + select <choose><when test="NotIgnore_!=null and NotIgnore_"><include refid="selectSqlNotIgnoreModel"/> </when><otherwise><include refid="selectSqlIgnoreModel"/></otherwise></choose> + from <include refid="tableSql"/> where `pass_id` in + <foreach item="id" index="index" collection="idList" open="(" separator="," close=")">#{id}</foreach> + <include refid="orderGroupLimit"/> + </select> + <!-- 查询一组实体的数量 --> + <select id="getModelListCount" parameterType="hashmap" resultType="int"> + select count(1) from <include refid="tableSql"/> where 1=1 <include refid="whereSqlModel"/> <include refid="orderGroupLimit"/> + </select> + <!-- 插入单个实体 遇到入参null转换成数据库NULL--> + <insert id="insertModel" parameterType="PpassInstant" useGeneratedKeys="true" keyProperty="passId" > + insert into <include refid="tableSql"/> (<include refid="douFieldSql"/>) values(<include refid="douValueSql"/>) + </insert> + <!-- 替换单个实体 如果没有则插入 遇到入参null转换成数据库NULL--> + <insert id="replaceModel" parameterType="PpassInstant" useGeneratedKeys="true" keyProperty="passId" > + replace into <include refid="tableSql"/> (<include refid="douFieldSql"/>) values(<include refid="douValueSql"/>) + </insert> + <!-- 插入单个实体 遇到入参null转换成数据库默认值--> + <insert id="insertModelWithoutNull" parameterType="PpassInstant" useGeneratedKeys="true" keyProperty="passId" > + insert into <include refid="tableSql"/> (<include refid="douFieldWithoutNullSql"/>) values(<include refid="douValueWithoutNullSql"/>) + </insert> + <!-- 替换单个实体 如果没有则插入 遇到入参null转换成数据库默认值--> + <insert id="replaceModelWithoutNull" parameterType="PpassInstant" useGeneratedKeys="true" keyProperty="passId" > + replace into <include refid="tableSql"/> (<include refid="douFieldWithoutNullSql"/>) values(<include refid="douValueWithoutNullSql"/>) + </insert> + <!-- 批量插入一组实体 --> + <insert id="batchInsertModel" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="passId" > + <foreach collection="list" item="item" index="index" open="" close="" separator=";"> + insert into <include refid="tableSql"/> (<include refid="batchDouFieldSql"/>) values (<include refid="batchDouValueSql"/>) + </foreach> + </insert> + <!-- 批量替换一组实体 --> + <insert id="batchReplaceModel" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="passId" > + <foreach collection="list" item="item" index="index" open="" close="" separator=";"> + replace into <include refid="tableSql"/> (<include refid="batchDouFieldSql"/>) values (<include refid="batchDouValueSql"/>) + </foreach> + </insert> + <insert id="batchInsertModelWithoutNull" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="passId" > + <foreach collection="list" item="item" index="index" open="" close="" separator=";"> + insert into <include refid="tableSql"/> (<include refid="batchDouFieldWithoutNullSql"/>) values (<include refid="batchDouValueWithoutNullSql"/>) + </foreach> + </insert> + <insert id="batchReplaceModelWithoutNull" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="passId" > + <foreach collection="list" item="item" index="index" open="" close="" separator=";"> + replace into <include refid="tableSql"/> (<include refid="batchDouFieldWithoutNullSql"/>) values (<include refid="batchDouValueWithoutNullSql"/>) + </foreach> + </insert> + + <!-- 清空表 操作危险 慎用,暂时注销掉--> + <delete id="truncateModel"> + -- truncate table <include refid="tableSql"/> + </delete> + + <!-- 根据主键删除一个实体 magicalCoderPrimaryKeyName 框架封装--> + <delete id="deleteModelByPk" parameterType="hashmap"> + delete from <include refid="tableSql"/> <include refid="magicalcoderPkWhereSql"/> + </delete> + + <delete id="deleteModelList" parameterType="hashmap"> + delete from <include refid="tableSql"/> where 1=1 <include refid="whereSqlModel"/> + </delete> + + <!-- 批量删除实体 in 根据主键--> + <delete id="deleteModelByIds" parameterType="java.util.Set"> + delete from <include refid="tableSql"/> where `pass_id` in <foreach item="id" index="index" collection="collection" open="(" separator="," close=")">#{id}</foreach> + </delete> + <!-- 更新一个实体 --> + <update id="updateModel" parameterType="PpassInstant"> + update <include refid="tableSql"/> <include refid="updateSetSql"/> <include refid="updatePkWhereSql"/> + </update> + <!-- 更新一个实体 仅仅当被更新的字段不为空的时候才更新,否则忽略更新--> + <update id="updateModelWithoutNull" parameterType="PpassInstant"> + update <include refid="tableSql"/> <include refid="updateSetWithoutNullSql"/> <include refid="updatePkWhereSql"/> + </update> + <!-- 批量更新实体 传入一组实体,分别根据主键作为查询条件--> + <update id="batchUpdateModel" parameterType="java.util.List"> + <foreach collection="list" item="item" index="index" open="" close="" separator=";"> + update <include refid="tableSql"/> <include refid="batchUpdateSetSql"/> <include refid="batchUpdatePkWhereSql"/> + </foreach> + </update> + <update id="batchUpdateModelWithoutNull" parameterType="java.util.List"> + <foreach collection="list" item="item" index="index" open="" close="" separator=";"> + update <include refid="tableSql"/> <include refid="batchUpdateWithoutNullSetSql"/> <include refid="batchUpdatePkWhereSql"/> + </foreach> + </update> + <!-- sql 片段 --> + <sql id="selectSqlIgnoreModel"> + <trim suffixOverrides=","> + <if test="passIdIgnore_ == null or !passIdIgnore_">`pass_id`,</if> + <if test="passNameIgnore_ == null or !passNameIgnore_">`pass_name`,</if> + <if test="passLengthIgnore_ == null or !passLengthIgnore_">`pass_length`,</if> + <if test="passTypeIgnore_ == null or !passTypeIgnore_">`pass_type`,</if> + <if test="passChildfirIgnore_ == null or !passChildfirIgnore_">`pass_childfir`,</if> + <if test="passChildsecIgnore_ == null or !passChildsecIgnore_">`pass_childsec`,</if> + <if test="passChildthiIgnore_ == null or !passChildthiIgnore_">`pass_childthi`,</if> + <if test="passExpiryIgnore_ == null or !passExpiryIgnore_">`pass_expiry`,</if> + <if test="passCreatetimeIgnore_ == null or !passCreatetimeIgnore_">`pass_createtime`,</if> + <if test="passUseridIgnore_ == null or !passUseridIgnore_">`pass_userid`</if> + </trim> + </sql> + <sql id="selectSqlNotIgnoreModel"> + <trim suffixOverrides=","> + <if test="passIdNotIgnore_ != null and passIdNotIgnore_">`pass_id`,</if> + <if test="passNameNotIgnore_ != null and passNameNotIgnore_">`pass_name`,</if> + <if test="passLengthNotIgnore_ != null and passLengthNotIgnore_">`pass_length`,</if> + <if test="passTypeNotIgnore_ != null and passTypeNotIgnore_">`pass_type`,</if> + <if test="passChildfirNotIgnore_ != null and passChildfirNotIgnore_">`pass_childfir`,</if> + <if test="passChildsecNotIgnore_ != null and passChildsecNotIgnore_">`pass_childsec`,</if> + <if test="passChildthiNotIgnore_ != null and passChildthiNotIgnore_">`pass_childthi`,</if> + <if test="passExpiryNotIgnore_ != null and passExpiryNotIgnore_">`pass_expiry`,</if> + <if test="passCreatetimeNotIgnore_ != null and passCreatetimeNotIgnore_">`pass_createtime`,</if> + <if test="passUseridNotIgnore_ != null and passUseridNotIgnore_">`pass_userid`</if> + </trim> + </sql> + <sql id="douFieldSql"> + <trim suffixOverrides=","> + <if test="passId!=null">`pass_id`,</if> `pass_name`,`pass_length`,`pass_type`,`pass_childfir`,`pass_childsec`,`pass_childthi`,`pass_expiry`,`pass_createtime`,`pass_userid`, + </trim> + </sql> + <sql id="douValueSql"> + <trim suffixOverrides=","> + <choose><when test="passId!=null">#{passId},</when></choose> + <choose><when test="passName!=null">#{passName},</when><otherwise>NULL,</otherwise></choose> + <choose><when test="passLength!=null">#{passLength},</when><otherwise>NULL,</otherwise></choose> + <choose><when test="passType!=null">#{passType},</when><otherwise>NULL,</otherwise></choose> + <choose><when test="passChildfir!=null">#{passChildfir},</when><otherwise>NULL,</otherwise></choose> + <choose><when test="passChildsec!=null">#{passChildsec},</when><otherwise>NULL,</otherwise></choose> + <choose><when test="passChildthi!=null">#{passChildthi},</when><otherwise>NULL,</otherwise></choose> + <choose><when test="passExpiry!=null">#{passExpiry,jdbcType=TIMESTAMP},</when><otherwise>NULL,</otherwise></choose> + <choose><when test="passCreatetime!=null">#{passCreatetime,jdbcType=TIMESTAMP},</when><otherwise>NULL,</otherwise></choose> + <choose><when test="passUserid!=null">#{passUserid},</when><otherwise>NULL,</otherwise></choose> + </trim> + </sql> + + <sql id="douFieldWithoutNullSql"> + <trim suffixOverrides=","> + <if test="passId!=null">`pass_id`,</if> + <if test="passName!=null">`pass_name`,</if> + <if test="passLength!=null">`pass_length`,</if> + <if test="passType!=null">`pass_type`,</if> + <if test="passChildfir!=null">`pass_childfir`,</if> + <if test="passChildsec!=null">`pass_childsec`,</if> + <if test="passChildthi!=null">`pass_childthi`,</if> + <if test="passExpiry!=null">`pass_expiry`,</if> + <if test="passCreatetime!=null">`pass_createtime`,</if> + <if test="passUserid!=null">`pass_userid`,</if> + + </trim> + </sql> + <sql id="douValueWithoutNullSql"> + <trim suffixOverrides=","> + <choose><when test="passId!=null">#{passId},</when></choose> + <choose><when test="passName!=null">#{passName},</when></choose> + <choose><when test="passLength!=null">#{passLength},</when></choose> + <choose><when test="passType!=null">#{passType},</when></choose> + <choose><when test="passChildfir!=null">#{passChildfir},</when></choose> + <choose><when test="passChildsec!=null">#{passChildsec},</when></choose> + <choose><when test="passChildthi!=null">#{passChildthi},</when></choose> + <choose><when test="passExpiry!=null">#{passExpiry,jdbcType=TIMESTAMP},</when></choose> + <choose><when test="passCreatetime!=null">#{passCreatetime,jdbcType=TIMESTAMP},</when></choose> + <choose><when test="passUserid!=null">#{passUserid},</when></choose> + </trim> + </sql> + <sql id="batchDouFieldSql"> + <trim suffixOverrides=","> + <if test="item.passId!=null">`pass_id`,</if> `pass_name`,`pass_length`,`pass_type`,`pass_childfir`,`pass_childsec`,`pass_childthi`,`pass_expiry`,`pass_createtime`,`pass_userid`, + </trim> + </sql> + <sql id="batchDouValueSql"> + <trim suffixOverrides=","> + <choose><when test="item.passId!=null">#{item.passId},</when></choose> + <choose><when test="item.passName!=null">#{item.passName},</when><otherwise>NULL,</otherwise></choose> + <choose><when test="item.passLength!=null">#{item.passLength},</when><otherwise>NULL,</otherwise></choose> + <choose><when test="item.passType!=null">#{item.passType},</when><otherwise>NULL,</otherwise></choose> + <choose><when test="item.passChildfir!=null">#{item.passChildfir},</when><otherwise>NULL,</otherwise></choose> + <choose><when test="item.passChildsec!=null">#{item.passChildsec},</when><otherwise>NULL,</otherwise></choose> + <choose><when test="item.passChildthi!=null">#{item.passChildthi},</when><otherwise>NULL,</otherwise></choose> + <choose><when test="item.passExpiry!=null">#{item.passExpiry,jdbcType=TIMESTAMP},</when><otherwise>NULL,</otherwise></choose> + <choose><when test="item.passCreatetime!=null">#{item.passCreatetime,jdbcType=TIMESTAMP},</when><otherwise>NULL,</otherwise></choose> + <choose><when test="item.passUserid!=null">#{item.passUserid},</when><otherwise>NULL,</otherwise></choose> + </trim> + </sql> + <sql id="batchDouFieldWithoutNullSql"> + <trim suffixOverrides=","> + <if test="item.passId!=null">`pass_id`,</if> + <if test="item.passName!=null">`pass_name`,</if> + <if test="item.passLength!=null">`pass_length`,</if> + <if test="item.passType!=null">`pass_type`,</if> + <if test="item.passChildfir!=null">`pass_childfir`,</if> + <if test="item.passChildsec!=null">`pass_childsec`,</if> + <if test="item.passChildthi!=null">`pass_childthi`,</if> + <if test="item.passExpiry!=null">`pass_expiry`,</if> + <if test="item.passCreatetime!=null">`pass_createtime`,</if> + <if test="item.passUserid!=null">`pass_userid`,</if> + + </trim> + </sql> + <sql id="batchDouValueWithoutNullSql"> + <trim suffixOverrides=","> + <choose><when test="item.passId!=null">#{item.passId},</when></choose> + <choose><when test="item.passName!=null">#{item.passName},</when></choose> + <choose><when test="item.passLength!=null">#{item.passLength},</when></choose> + <choose><when test="item.passType!=null">#{item.passType},</when></choose> + <choose><when test="item.passChildfir!=null">#{item.passChildfir},</when></choose> + <choose><when test="item.passChildsec!=null">#{item.passChildsec},</when></choose> + <choose><when test="item.passChildthi!=null">#{item.passChildthi},</when></choose> + <choose><when test="item.passExpiry!=null">#{item.passExpiry,jdbcType=TIMESTAMP},</when></choose> + <choose><when test="item.passCreatetime!=null">#{item.passCreatetime,jdbcType=TIMESTAMP},</when></choose> + <choose><when test="item.passUserid!=null">#{item.passUserid},</when></choose> + </trim> + </sql> + <sql id="updateSetSql"> + <set> + <choose> <when test="passName!=null">`pass_name`=#{passName}</when> <otherwise> `pass_name`=NULL</otherwise> </choose>, + <choose> <when test="passLength!=null">`pass_length`=#{passLength}</when> <otherwise> `pass_length`=NULL</otherwise> </choose>, + <choose> <when test="passType!=null">`pass_type`=#{passType}</when> <otherwise> `pass_type`=NULL</otherwise> </choose>, + <choose> <when test="passChildfir!=null">`pass_childfir`=#{passChildfir}</when> <otherwise> `pass_childfir`=NULL</otherwise> </choose>, + <choose> <when test="passChildsec!=null">`pass_childsec`=#{passChildsec}</when> <otherwise> `pass_childsec`=NULL</otherwise> </choose>, + <choose> <when test="passChildthi!=null">`pass_childthi`=#{passChildthi}</when> <otherwise> `pass_childthi`=NULL</otherwise> </choose>, + <choose> <when test="passExpiry!=null">`pass_expiry`=#{passExpiry,jdbcType=TIMESTAMP}</when> <otherwise> `pass_expiry`=NULL</otherwise> </choose>, + <choose> <when test="passCreatetime!=null">`pass_createtime`=#{passCreatetime,jdbcType=TIMESTAMP}</when> <otherwise> `pass_createtime`=NULL</otherwise> </choose>, + <choose> <when test="passUserid!=null">`pass_userid`=#{passUserid}</when> <otherwise> `pass_userid`=NULL</otherwise> </choose>, + </set> + </sql> + <sql id="updateSetWithoutNullSql"> + <set> + <choose><when test="passName!=null">`pass_name`=#{passName},</when></choose> + <choose><when test="passLength!=null">`pass_length`=#{passLength},</when></choose> + <choose><when test="passType!=null">`pass_type`=#{passType},</when></choose> + <choose><when test="passChildfir!=null">`pass_childfir`=#{passChildfir},</when></choose> + <choose><when test="passChildsec!=null">`pass_childsec`=#{passChildsec},</when></choose> + <choose><when test="passChildthi!=null">`pass_childthi`=#{passChildthi},</when></choose> + <choose><when test="passExpiry!=null">`pass_expiry`=#{passExpiry,jdbcType=TIMESTAMP},</when></choose> + <choose><when test="passCreatetime!=null">`pass_createtime`=#{passCreatetime,jdbcType=TIMESTAMP},</when></choose> + <choose><when test="passUserid!=null">`pass_userid`=#{passUserid},</when></choose> + </set> + </sql> + <sql id="magicalcoderPkWhereSql"> + where 1=1 + and `pass_id` = #{magicalCoderPrimaryKeyName} + </sql> + <sql id="updatePkWhereSql"> + where 1=1 + and `pass_id` = #{passId} + </sql> + <sql id="batchUpdateSetSql"> + <set> + <choose> <when test="item.passName!=null">`pass_name`=#{item.passName}</when> <otherwise> `pass_name`=NULL</otherwise> </choose>, + <choose> <when test="item.passLength!=null">`pass_length`=#{item.passLength}</when> <otherwise> `pass_length`=NULL</otherwise> </choose>, + <choose> <when test="item.passType!=null">`pass_type`=#{item.passType}</when> <otherwise> `pass_type`=NULL</otherwise> </choose>, + <choose> <when test="item.passChildfir!=null">`pass_childfir`=#{item.passChildfir}</when> <otherwise> `pass_childfir`=NULL</otherwise> </choose>, + <choose> <when test="item.passChildsec!=null">`pass_childsec`=#{item.passChildsec}</when> <otherwise> `pass_childsec`=NULL</otherwise> </choose>, + <choose> <when test="item.passChildthi!=null">`pass_childthi`=#{item.passChildthi}</when> <otherwise> `pass_childthi`=NULL</otherwise> </choose>, + <choose> <when test="item.passExpiry!=null">`pass_expiry`=#{item.passExpiry,jdbcType=TIMESTAMP}</when> <otherwise> `pass_expiry`=NULL</otherwise> </choose>, + <choose> <when test="item.passCreatetime!=null">`pass_createtime`=#{item.passCreatetime,jdbcType=TIMESTAMP}</when> <otherwise> `pass_createtime`=NULL</otherwise> </choose>, + <choose> <when test="item.passUserid!=null">`pass_userid`=#{item.passUserid}</when> <otherwise> `pass_userid`=NULL</otherwise> </choose>, + </set> + </sql> + <sql id="batchUpdateWithoutNullSetSql"> + <set> + <choose> <when test="item.passName!=null">`pass_name`=#{item.passName},</when></choose> + <choose> <when test="item.passLength!=null">`pass_length`=#{item.passLength},</when></choose> + <choose> <when test="item.passType!=null">`pass_type`=#{item.passType},</when></choose> + <choose> <when test="item.passChildfir!=null">`pass_childfir`=#{item.passChildfir},</when></choose> + <choose> <when test="item.passChildsec!=null">`pass_childsec`=#{item.passChildsec},</when></choose> + <choose> <when test="item.passChildthi!=null">`pass_childthi`=#{item.passChildthi},</when></choose> + <choose> <when test="item.passExpiry!=null">`pass_expiry`=#{item.passExpiry,jdbcType=TIMESTAMP},</when></choose> + <choose> <when test="item.passCreatetime!=null">`pass_createtime`=#{item.passCreatetime,jdbcType=TIMESTAMP},</when></choose> + <choose> <when test="item.passUserid!=null">`pass_userid`=#{item.passUserid},</when></choose> + </set> + </sql> + <sql id="batchUpdatePkWhereSql"> + where 1=1 + and `pass_id` = #{item.passId} + </sql> + <!-- 这里可以加上数据库名称 方便的切换数据库--> + <sql id="tableSql"> + us.p_pass_instant + </sql> + + <sql id="whereSqlModel"> + <if test="passId!=null "> and `pass_id` = #{passId}</if> + <if test="passName!=null "> and `pass_name` = #{passName}</if> + <if test="passLength!=null "> and `pass_length` = #{passLength}</if> + <if test="passType!=null "> and `pass_type` = #{passType}</if> + <if test="passChildfir!=null "> and `pass_childfir` = #{passChildfir}</if> + <if test="passChildsec!=null "> and `pass_childsec` = #{passChildsec}</if> + <if test="passChildthi!=null "> and `pass_childthi` = #{passChildthi}</if> + <if test="passExpiry!=null "> and `pass_expiry` = #{passExpiry,jdbcType=TIMESTAMP}</if> + <if test="passCreatetime!=null "> and `pass_createtime` = #{passCreatetime,jdbcType=TIMESTAMP}</if> + <if test="passUserid!=null "> and `pass_userid` = #{passUserid}</if> + <if test="passIdFirst!=null "> and `pass_id` <![CDATA[=]]> + #{passIdFirst} + </if> + <if test="passNameFirst!=null "> and `pass_name` <![CDATA[=]]> + #{passNameFirst} + </if> + <if test="passLengthFirst!=null "> and `pass_length` <![CDATA[=]]> + #{passLengthFirst} + </if> + <if test="passTypeFirst!=null "> and `pass_type` <![CDATA[=]]> + #{passTypeFirst} + </if> + <if test="passExpiryFirst!=null "> and `pass_expiry` <![CDATA[>=]]> + #{passExpiryFirst,jdbcType=TIMESTAMP} + </if> + <if test="passExpirySecond!=null "> and `pass_expiry` <![CDATA[<=]]> + #{passExpirySecond,jdbcType=TIMESTAMP} + </if> + <if test="passCreatetimeFirst!=null "> and `pass_createtime` <![CDATA[>=]]> + #{passCreatetimeFirst,jdbcType=TIMESTAMP} + </if> + <if test="passCreatetimeSecond!=null "> and `pass_createtime` <![CDATA[<=]]> + #{passCreatetimeSecond,jdbcType=TIMESTAMP} + </if> + <if test="passUseridFirst!=null "> and `pass_userid` <![CDATA[=]]> + #{passUseridFirst} + </if> + <!--<if test="whereSql!=null"> ${whereSql}</if>--> + </sql> + + <sql id="safeGroupBy"> + <if test="safeGroupBy!=null and safeGroupBy!=''"> + group by + <choose> + <when test="safeGroupBy != null and safeGroupBy == 'pass_id'"> `pass_id` </when> + <when test="safeGroupBy != null and safeGroupBy == 'pass_name'"> `pass_name` </when> + <when test="safeGroupBy != null and safeGroupBy == 'pass_length'"> `pass_length` </when> + <when test="safeGroupBy != null and safeGroupBy == 'pass_type'"> `pass_type` </when> + <when test="safeGroupBy != null and safeGroupBy == 'pass_childfir'"> `pass_childfir` </when> + <when test="safeGroupBy != null and safeGroupBy == 'pass_childsec'"> `pass_childsec` </when> + <when test="safeGroupBy != null and safeGroupBy == 'pass_childthi'"> `pass_childthi` </when> + <when test="safeGroupBy != null and safeGroupBy == 'pass_expiry'"> `pass_expiry` </when> + <when test="safeGroupBy != null and safeGroupBy == 'pass_createtime'"> `pass_createtime` </when> + <when test="safeGroupBy != null and safeGroupBy == 'pass_userid'"> `pass_userid` </when> + </choose> + </if> + </sql> + <sql id="safeOrderBy"> + <if test="safeOrderBy!=null and safeOrderBy!=''"> + <choose> + <when test="safeOrderBy != null and safeOrderBy == 'pass_id desc'"> order by `pass_id` desc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_id asc'"> order by `pass_id` asc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_name desc'"> order by `pass_name` desc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_name asc'"> order by `pass_name` asc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_length desc'"> order by `pass_length` desc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_length asc'"> order by `pass_length` asc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_type desc'"> order by `pass_type` desc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_type asc'"> order by `pass_type` asc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_childfir desc'"> order by `pass_childfir` desc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_childfir asc'"> order by `pass_childfir` asc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_childsec desc'"> order by `pass_childsec` desc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_childsec asc'"> order by `pass_childsec` asc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_childthi desc'"> order by `pass_childthi` desc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_childthi asc'"> order by `pass_childthi` asc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_expiry desc'"> order by `pass_expiry` desc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_expiry asc'"> order by `pass_expiry` asc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_createtime desc'"> order by `pass_createtime` desc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_createtime asc'"> order by `pass_createtime` asc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_userid desc'"> order by `pass_userid` desc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_userid asc'"> order by `pass_userid` asc </when> + </choose> + </if> + </sql> + + <sql id="orderGroupLimit"> + <include refid="safeGroupBy"/> + <if test="notSafeGroupBy != null and notSafeGroupBy != ''"> group by ${notSafeGroupBy}</if> + <include refid="safeOrderBy"/> + <if test="notSafeOrderBy != null and notSafeOrderBy != ''"> order by ${notSafeOrderBy}</if> + <if test="limit != null"> LIMIT <if test="start != null">#{start},</if>#{limit} </if> + </sql> + +</mapper> diff --git a/us_passManage/us-service/src/main/resources/sqlmap/PpassOldMapper.xml b/us_passManage/us-service/src/main/resources/sqlmap/PpassOldMapper.xml new file mode 100644 index 0000000..f8c3c0a --- /dev/null +++ b/us_passManage/us-service/src/main/resources/sqlmap/PpassOldMapper.xml @@ -0,0 +1,414 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<!-- +* 代码为自动生成 Created by www.magicalcoder.com +* 软件作者:何栋宇 qq:709876443 +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:648595928 +--> +<mapper namespace="com.passManage.us.service.ppassold.mapper.PpassOldMapper"> + <!-- PpassOld --> + <resultMap id="resultMap" type="PpassOld"> + <id column="pass_id" property="passId"/> + <result column="pass_name" property="passName" /> + <result column="pass_length" property="passLength" /> + <result column="pass_type" property="passType" /> + <result column="pass_childfir" property="passChildfir" /> + <result column="pass_childsec" property="passChildsec" /> + <result column="pass_childthi" property="passChildthi" /> + <result column="pass_expiry" property="passExpiry" /> + <result column="pass_createtime" property="passCreatetime" /> + <result column="pass_userid" property="passUserid" /> + </resultMap> + <!-- 查询单个实体 --> + <select id="getModel" parameterType="hashmap" resultMap="resultMap"> + select <choose><when test="NotIgnore_!=null and NotIgnore_"><include refid="selectSqlNotIgnoreModel"/> </when><otherwise><include refid="selectSqlIgnoreModel"/></otherwise></choose> + from <include refid="tableSql"/> where 1=1 <include refid="whereSqlModel"/> <include refid="orderGroupLimit"/> + </select> + <!--根据主键 查询单个实体 --> + <select id="getModelByPk" parameterType="hashmap" resultMap="resultMap"> + select <choose><when test="NotIgnore_!=null and NotIgnore_"><include refid="selectSqlNotIgnoreModel"/> </when><otherwise><include refid="selectSqlIgnoreModel"/></otherwise></choose> + from <include refid="tableSql"/> <include refid="magicalcoderPkWhereSql"/> + </select> + <!-- 查询一组实体 --> + <select id="getModelList" parameterType="hashmap" resultMap="resultMap"> + select <choose><when test="NotIgnore_!=null and NotIgnore_"><include refid="selectSqlNotIgnoreModel"/> </when><otherwise><include refid="selectSqlIgnoreModel"/></otherwise></choose> + from <include refid="tableSql"/> where 1=1 <include refid="whereSqlModel"/> <include refid="orderGroupLimit"/> + </select> + <!-- 查询一组实体 in 语句--> + <select id="getModelInList" parameterType="hashmap" resultMap="resultMap"> + select <choose><when test="NotIgnore_!=null and NotIgnore_"><include refid="selectSqlNotIgnoreModel"/> </when><otherwise><include refid="selectSqlIgnoreModel"/></otherwise></choose> + from <include refid="tableSql"/> where `pass_id` in + <foreach item="id" index="index" collection="idList" open="(" separator="," close=")">#{id}</foreach> + <include refid="orderGroupLimit"/> + </select> + <!-- 查询一组实体的数量 --> + <select id="getModelListCount" parameterType="hashmap" resultType="int"> + select count(1) from <include refid="tableSql"/> where 1=1 <include refid="whereSqlModel"/> <include refid="orderGroupLimit"/> + </select> + <!-- 插入单个实体 遇到入参null转换成数据库NULL--> + <insert id="insertModel" parameterType="PpassOld" useGeneratedKeys="true" keyProperty="passId" > + insert into <include refid="tableSql"/> (<include refid="douFieldSql"/>) values(<include refid="douValueSql"/>) + </insert> + <!-- 替换单个实体 如果没有则插入 遇到入参null转换成数据库NULL--> + <insert id="replaceModel" parameterType="PpassOld" useGeneratedKeys="true" keyProperty="passId" > + replace into <include refid="tableSql"/> (<include refid="douFieldSql"/>) values(<include refid="douValueSql"/>) + </insert> + <!-- 插入单个实体 遇到入参null转换成数据库默认值--> + <insert id="insertModelWithoutNull" parameterType="PpassOld" useGeneratedKeys="true" keyProperty="passId" > + insert into <include refid="tableSql"/> (<include refid="douFieldWithoutNullSql"/>) values(<include refid="douValueWithoutNullSql"/>) + </insert> + <!-- 替换单个实体 如果没有则插入 遇到入参null转换成数据库默认值--> + <insert id="replaceModelWithoutNull" parameterType="PpassOld" useGeneratedKeys="true" keyProperty="passId" > + replace into <include refid="tableSql"/> (<include refid="douFieldWithoutNullSql"/>) values(<include refid="douValueWithoutNullSql"/>) + </insert> + <!-- 批量插入一组实体 --> + <insert id="batchInsertModel" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="passId" > + <foreach collection="list" item="item" index="index" open="" close="" separator=";"> + insert into <include refid="tableSql"/> (<include refid="batchDouFieldSql"/>) values (<include refid="batchDouValueSql"/>) + </foreach> + </insert> + <!-- 批量替换一组实体 --> + <insert id="batchReplaceModel" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="passId" > + <foreach collection="list" item="item" index="index" open="" close="" separator=";"> + replace into <include refid="tableSql"/> (<include refid="batchDouFieldSql"/>) values (<include refid="batchDouValueSql"/>) + </foreach> + </insert> + <insert id="batchInsertModelWithoutNull" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="passId" > + <foreach collection="list" item="item" index="index" open="" close="" separator=";"> + insert into <include refid="tableSql"/> (<include refid="batchDouFieldWithoutNullSql"/>) values (<include refid="batchDouValueWithoutNullSql"/>) + </foreach> + </insert> + <insert id="batchReplaceModelWithoutNull" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="passId" > + <foreach collection="list" item="item" index="index" open="" close="" separator=";"> + replace into <include refid="tableSql"/> (<include refid="batchDouFieldWithoutNullSql"/>) values (<include refid="batchDouValueWithoutNullSql"/>) + </foreach> + </insert> + + <!-- 清空表 操作危险 慎用,暂时注销掉--> + <delete id="truncateModel"> + -- truncate table <include refid="tableSql"/> + </delete> + + <!-- 根据主键删除一个实体 magicalCoderPrimaryKeyName 框架封装--> + <delete id="deleteModelByPk" parameterType="hashmap"> + delete from <include refid="tableSql"/> <include refid="magicalcoderPkWhereSql"/> + </delete> + + <delete id="deleteModelList" parameterType="hashmap"> + delete from <include refid="tableSql"/> where 1=1 <include refid="whereSqlModel"/> + </delete> + + <!-- 批量删除实体 in 根据主键--> + <delete id="deleteModelByIds" parameterType="java.util.Set"> + delete from <include refid="tableSql"/> where `pass_id` in <foreach item="id" index="index" collection="collection" open="(" separator="," close=")">#{id}</foreach> + </delete> + <!-- 更新一个实体 --> + <update id="updateModel" parameterType="PpassOld"> + update <include refid="tableSql"/> <include refid="updateSetSql"/> <include refid="updatePkWhereSql"/> + </update> + <!-- 更新一个实体 仅仅当被更新的字段不为空的时候才更新,否则忽略更新--> + <update id="updateModelWithoutNull" parameterType="PpassOld"> + update <include refid="tableSql"/> <include refid="updateSetWithoutNullSql"/> <include refid="updatePkWhereSql"/> + </update> + <!-- 批量更新实体 传入一组实体,分别根据主键作为查询条件--> + <update id="batchUpdateModel" parameterType="java.util.List"> + <foreach collection="list" item="item" index="index" open="" close="" separator=";"> + update <include refid="tableSql"/> <include refid="batchUpdateSetSql"/> <include refid="batchUpdatePkWhereSql"/> + </foreach> + </update> + <update id="batchUpdateModelWithoutNull" parameterType="java.util.List"> + <foreach collection="list" item="item" index="index" open="" close="" separator=";"> + update <include refid="tableSql"/> <include refid="batchUpdateWithoutNullSetSql"/> <include refid="batchUpdatePkWhereSql"/> + </foreach> + </update> + <!-- sql 片段 --> + <sql id="selectSqlIgnoreModel"> + <trim suffixOverrides=","> + <if test="passIdIgnore_ == null or !passIdIgnore_">`pass_id`,</if> + <if test="passNameIgnore_ == null or !passNameIgnore_">`pass_name`,</if> + <if test="passLengthIgnore_ == null or !passLengthIgnore_">`pass_length`,</if> + <if test="passTypeIgnore_ == null or !passTypeIgnore_">`pass_type`,</if> + <if test="passChildfirIgnore_ == null or !passChildfirIgnore_">`pass_childfir`,</if> + <if test="passChildsecIgnore_ == null or !passChildsecIgnore_">`pass_childsec`,</if> + <if test="passChildthiIgnore_ == null or !passChildthiIgnore_">`pass_childthi`,</if> + <if test="passExpiryIgnore_ == null or !passExpiryIgnore_">`pass_expiry`,</if> + <if test="passCreatetimeIgnore_ == null or !passCreatetimeIgnore_">`pass_createtime`,</if> + <if test="passUseridIgnore_ == null or !passUseridIgnore_">`pass_userid`</if> + </trim> + </sql> + <sql id="selectSqlNotIgnoreModel"> + <trim suffixOverrides=","> + <if test="passIdNotIgnore_ != null and passIdNotIgnore_">`pass_id`,</if> + <if test="passNameNotIgnore_ != null and passNameNotIgnore_">`pass_name`,</if> + <if test="passLengthNotIgnore_ != null and passLengthNotIgnore_">`pass_length`,</if> + <if test="passTypeNotIgnore_ != null and passTypeNotIgnore_">`pass_type`,</if> + <if test="passChildfirNotIgnore_ != null and passChildfirNotIgnore_">`pass_childfir`,</if> + <if test="passChildsecNotIgnore_ != null and passChildsecNotIgnore_">`pass_childsec`,</if> + <if test="passChildthiNotIgnore_ != null and passChildthiNotIgnore_">`pass_childthi`,</if> + <if test="passExpiryNotIgnore_ != null and passExpiryNotIgnore_">`pass_expiry`,</if> + <if test="passCreatetimeNotIgnore_ != null and passCreatetimeNotIgnore_">`pass_createtime`,</if> + <if test="passUseridNotIgnore_ != null and passUseridNotIgnore_">`pass_userid`</if> + </trim> + </sql> + <sql id="douFieldSql"> + <trim suffixOverrides=","> + <if test="passId!=null">`pass_id`,</if> `pass_name`,`pass_length`,`pass_type`,`pass_childfir`,`pass_childsec`,`pass_childthi`,`pass_expiry`,`pass_createtime`,`pass_userid`, + </trim> + </sql> + <sql id="douValueSql"> + <trim suffixOverrides=","> + <choose><when test="passId!=null">#{passId},</when></choose> + <choose><when test="passName!=null">#{passName},</when><otherwise>NULL,</otherwise></choose> + <choose><when test="passLength!=null">#{passLength},</when><otherwise>NULL,</otherwise></choose> + <choose><when test="passType!=null">#{passType},</when><otherwise>NULL,</otherwise></choose> + <choose><when test="passChildfir!=null">#{passChildfir},</when><otherwise>NULL,</otherwise></choose> + <choose><when test="passChildsec!=null">#{passChildsec},</when><otherwise>NULL,</otherwise></choose> + <choose><when test="passChildthi!=null">#{passChildthi},</when><otherwise>NULL,</otherwise></choose> + <choose><when test="passExpiry!=null">#{passExpiry,jdbcType=TIMESTAMP},</when><otherwise>NULL,</otherwise></choose> + <choose><when test="passCreatetime!=null">#{passCreatetime,jdbcType=TIMESTAMP},</when><otherwise>NULL,</otherwise></choose> + <choose><when test="passUserid!=null">#{passUserid},</when><otherwise>NULL,</otherwise></choose> + </trim> + </sql> + + <sql id="douFieldWithoutNullSql"> + <trim suffixOverrides=","> + <if test="passId!=null">`pass_id`,</if> + <if test="passName!=null">`pass_name`,</if> + <if test="passLength!=null">`pass_length`,</if> + <if test="passType!=null">`pass_type`,</if> + <if test="passChildfir!=null">`pass_childfir`,</if> + <if test="passChildsec!=null">`pass_childsec`,</if> + <if test="passChildthi!=null">`pass_childthi`,</if> + <if test="passExpiry!=null">`pass_expiry`,</if> + <if test="passCreatetime!=null">`pass_createtime`,</if> + <if test="passUserid!=null">`pass_userid`,</if> + + </trim> + </sql> + <sql id="douValueWithoutNullSql"> + <trim suffixOverrides=","> + <choose><when test="passId!=null">#{passId},</when></choose> + <choose><when test="passName!=null">#{passName},</when></choose> + <choose><when test="passLength!=null">#{passLength},</when></choose> + <choose><when test="passType!=null">#{passType},</when></choose> + <choose><when test="passChildfir!=null">#{passChildfir},</when></choose> + <choose><when test="passChildsec!=null">#{passChildsec},</when></choose> + <choose><when test="passChildthi!=null">#{passChildthi},</when></choose> + <choose><when test="passExpiry!=null">#{passExpiry,jdbcType=TIMESTAMP},</when></choose> + <choose><when test="passCreatetime!=null">#{passCreatetime,jdbcType=TIMESTAMP},</when></choose> + <choose><when test="passUserid!=null">#{passUserid},</when></choose> + </trim> + </sql> + <sql id="batchDouFieldSql"> + <trim suffixOverrides=","> + <if test="item.passId!=null">`pass_id`,</if> `pass_name`,`pass_length`,`pass_type`,`pass_childfir`,`pass_childsec`,`pass_childthi`,`pass_expiry`,`pass_createtime`,`pass_userid`, + </trim> + </sql> + <sql id="batchDouValueSql"> + <trim suffixOverrides=","> + <choose><when test="item.passId!=null">#{item.passId},</when></choose> + <choose><when test="item.passName!=null">#{item.passName},</when><otherwise>NULL,</otherwise></choose> + <choose><when test="item.passLength!=null">#{item.passLength},</when><otherwise>NULL,</otherwise></choose> + <choose><when test="item.passType!=null">#{item.passType},</when><otherwise>NULL,</otherwise></choose> + <choose><when test="item.passChildfir!=null">#{item.passChildfir},</when><otherwise>NULL,</otherwise></choose> + <choose><when test="item.passChildsec!=null">#{item.passChildsec},</when><otherwise>NULL,</otherwise></choose> + <choose><when test="item.passChildthi!=null">#{item.passChildthi},</when><otherwise>NULL,</otherwise></choose> + <choose><when test="item.passExpiry!=null">#{item.passExpiry,jdbcType=TIMESTAMP},</when><otherwise>NULL,</otherwise></choose> + <choose><when test="item.passCreatetime!=null">#{item.passCreatetime,jdbcType=TIMESTAMP},</when><otherwise>NULL,</otherwise></choose> + <choose><when test="item.passUserid!=null">#{item.passUserid},</when><otherwise>NULL,</otherwise></choose> + </trim> + </sql> + <sql id="batchDouFieldWithoutNullSql"> + <trim suffixOverrides=","> + <if test="item.passId!=null">`pass_id`,</if> + <if test="item.passName!=null">`pass_name`,</if> + <if test="item.passLength!=null">`pass_length`,</if> + <if test="item.passType!=null">`pass_type`,</if> + <if test="item.passChildfir!=null">`pass_childfir`,</if> + <if test="item.passChildsec!=null">`pass_childsec`,</if> + <if test="item.passChildthi!=null">`pass_childthi`,</if> + <if test="item.passExpiry!=null">`pass_expiry`,</if> + <if test="item.passCreatetime!=null">`pass_createtime`,</if> + <if test="item.passUserid!=null">`pass_userid`,</if> + + </trim> + </sql> + <sql id="batchDouValueWithoutNullSql"> + <trim suffixOverrides=","> + <choose><when test="item.passId!=null">#{item.passId},</when></choose> + <choose><when test="item.passName!=null">#{item.passName},</when></choose> + <choose><when test="item.passLength!=null">#{item.passLength},</when></choose> + <choose><when test="item.passType!=null">#{item.passType},</when></choose> + <choose><when test="item.passChildfir!=null">#{item.passChildfir},</when></choose> + <choose><when test="item.passChildsec!=null">#{item.passChildsec},</when></choose> + <choose><when test="item.passChildthi!=null">#{item.passChildthi},</when></choose> + <choose><when test="item.passExpiry!=null">#{item.passExpiry,jdbcType=TIMESTAMP},</when></choose> + <choose><when test="item.passCreatetime!=null">#{item.passCreatetime,jdbcType=TIMESTAMP},</when></choose> + <choose><when test="item.passUserid!=null">#{item.passUserid},</when></choose> + </trim> + </sql> + <sql id="updateSetSql"> + <set> + <choose> <when test="passName!=null">`pass_name`=#{passName}</when> <otherwise> `pass_name`=NULL</otherwise> </choose>, + <choose> <when test="passLength!=null">`pass_length`=#{passLength}</when> <otherwise> `pass_length`=NULL</otherwise> </choose>, + <choose> <when test="passType!=null">`pass_type`=#{passType}</when> <otherwise> `pass_type`=NULL</otherwise> </choose>, + <choose> <when test="passChildfir!=null">`pass_childfir`=#{passChildfir}</when> <otherwise> `pass_childfir`=NULL</otherwise> </choose>, + <choose> <when test="passChildsec!=null">`pass_childsec`=#{passChildsec}</when> <otherwise> `pass_childsec`=NULL</otherwise> </choose>, + <choose> <when test="passChildthi!=null">`pass_childthi`=#{passChildthi}</when> <otherwise> `pass_childthi`=NULL</otherwise> </choose>, + <choose> <when test="passExpiry!=null">`pass_expiry`=#{passExpiry,jdbcType=TIMESTAMP}</when> <otherwise> `pass_expiry`=NULL</otherwise> </choose>, + <choose> <when test="passCreatetime!=null">`pass_createtime`=#{passCreatetime,jdbcType=TIMESTAMP}</when> <otherwise> `pass_createtime`=NULL</otherwise> </choose>, + <choose> <when test="passUserid!=null">`pass_userid`=#{passUserid}</when> <otherwise> `pass_userid`=NULL</otherwise> </choose>, + </set> + </sql> + <sql id="updateSetWithoutNullSql"> + <set> + <choose><when test="passName!=null">`pass_name`=#{passName},</when></choose> + <choose><when test="passLength!=null">`pass_length`=#{passLength},</when></choose> + <choose><when test="passType!=null">`pass_type`=#{passType},</when></choose> + <choose><when test="passChildfir!=null">`pass_childfir`=#{passChildfir},</when></choose> + <choose><when test="passChildsec!=null">`pass_childsec`=#{passChildsec},</when></choose> + <choose><when test="passChildthi!=null">`pass_childthi`=#{passChildthi},</when></choose> + <choose><when test="passExpiry!=null">`pass_expiry`=#{passExpiry,jdbcType=TIMESTAMP},</when></choose> + <choose><when test="passCreatetime!=null">`pass_createtime`=#{passCreatetime,jdbcType=TIMESTAMP},</when></choose> + <choose><when test="passUserid!=null">`pass_userid`=#{passUserid},</when></choose> + </set> + </sql> + <sql id="magicalcoderPkWhereSql"> + where 1=1 + and `pass_id` = #{magicalCoderPrimaryKeyName} + </sql> + <sql id="updatePkWhereSql"> + where 1=1 + and `pass_id` = #{passId} + </sql> + <sql id="batchUpdateSetSql"> + <set> + <choose> <when test="item.passName!=null">`pass_name`=#{item.passName}</when> <otherwise> `pass_name`=NULL</otherwise> </choose>, + <choose> <when test="item.passLength!=null">`pass_length`=#{item.passLength}</when> <otherwise> `pass_length`=NULL</otherwise> </choose>, + <choose> <when test="item.passType!=null">`pass_type`=#{item.passType}</when> <otherwise> `pass_type`=NULL</otherwise> </choose>, + <choose> <when test="item.passChildfir!=null">`pass_childfir`=#{item.passChildfir}</when> <otherwise> `pass_childfir`=NULL</otherwise> </choose>, + <choose> <when test="item.passChildsec!=null">`pass_childsec`=#{item.passChildsec}</when> <otherwise> `pass_childsec`=NULL</otherwise> </choose>, + <choose> <when test="item.passChildthi!=null">`pass_childthi`=#{item.passChildthi}</when> <otherwise> `pass_childthi`=NULL</otherwise> </choose>, + <choose> <when test="item.passExpiry!=null">`pass_expiry`=#{item.passExpiry,jdbcType=TIMESTAMP}</when> <otherwise> `pass_expiry`=NULL</otherwise> </choose>, + <choose> <when test="item.passCreatetime!=null">`pass_createtime`=#{item.passCreatetime,jdbcType=TIMESTAMP}</when> <otherwise> `pass_createtime`=NULL</otherwise> </choose>, + <choose> <when test="item.passUserid!=null">`pass_userid`=#{item.passUserid}</when> <otherwise> `pass_userid`=NULL</otherwise> </choose>, + </set> + </sql> + <sql id="batchUpdateWithoutNullSetSql"> + <set> + <choose> <when test="item.passName!=null">`pass_name`=#{item.passName},</when></choose> + <choose> <when test="item.passLength!=null">`pass_length`=#{item.passLength},</when></choose> + <choose> <when test="item.passType!=null">`pass_type`=#{item.passType},</when></choose> + <choose> <when test="item.passChildfir!=null">`pass_childfir`=#{item.passChildfir},</when></choose> + <choose> <when test="item.passChildsec!=null">`pass_childsec`=#{item.passChildsec},</when></choose> + <choose> <when test="item.passChildthi!=null">`pass_childthi`=#{item.passChildthi},</when></choose> + <choose> <when test="item.passExpiry!=null">`pass_expiry`=#{item.passExpiry,jdbcType=TIMESTAMP},</when></choose> + <choose> <when test="item.passCreatetime!=null">`pass_createtime`=#{item.passCreatetime,jdbcType=TIMESTAMP},</when></choose> + <choose> <when test="item.passUserid!=null">`pass_userid`=#{item.passUserid},</when></choose> + </set> + </sql> + <sql id="batchUpdatePkWhereSql"> + where 1=1 + and `pass_id` = #{item.passId} + </sql> + <!-- 这里可以加上数据库名称 方便的切换数据库--> + <sql id="tableSql"> + us.p_pass_old + </sql> + + <sql id="whereSqlModel"> + <if test="passId!=null "> and `pass_id` = #{passId}</if> + <if test="passName!=null "> and `pass_name` = #{passName}</if> + <if test="passLength!=null "> and `pass_length` = #{passLength}</if> + <if test="passType!=null "> and `pass_type` = #{passType}</if> + <if test="passChildfir!=null "> and `pass_childfir` = #{passChildfir}</if> + <if test="passChildsec!=null "> and `pass_childsec` = #{passChildsec}</if> + <if test="passChildthi!=null "> and `pass_childthi` = #{passChildthi}</if> + <if test="passExpiry!=null "> and `pass_expiry` = #{passExpiry,jdbcType=TIMESTAMP}</if> + <if test="passCreatetime!=null "> and `pass_createtime` = #{passCreatetime,jdbcType=TIMESTAMP}</if> + <if test="passUserid!=null "> and `pass_userid` = #{passUserid}</if> + <if test="passIdFirst!=null "> and `pass_id` <![CDATA[=]]> + #{passIdFirst} + </if> + <if test="passNameFirst!=null "> and `pass_name` <![CDATA[=]]> + #{passNameFirst} + </if> + <if test="passLengthFirst!=null "> and `pass_length` <![CDATA[=]]> + #{passLengthFirst} + </if> + <if test="passTypeFirst!=null "> and `pass_type` <![CDATA[=]]> + #{passTypeFirst} + </if> + <if test="passExpiryFirst!=null "> and `pass_expiry` <![CDATA[>=]]> + #{passExpiryFirst,jdbcType=TIMESTAMP} + </if> + <if test="passExpirySecond!=null "> and `pass_expiry` <![CDATA[<=]]> + #{passExpirySecond,jdbcType=TIMESTAMP} + </if> + <if test="passCreatetimeFirst!=null "> and `pass_createtime` <![CDATA[>=]]> + #{passCreatetimeFirst,jdbcType=TIMESTAMP} + </if> + <if test="passCreatetimeSecond!=null "> and `pass_createtime` <![CDATA[<=]]> + #{passCreatetimeSecond,jdbcType=TIMESTAMP} + </if> + <if test="passUseridFirst!=null "> and `pass_userid` <![CDATA[=]]> + #{passUseridFirst} + </if> + <!--<if test="whereSql!=null"> ${whereSql}</if>--> + </sql> + + <sql id="safeGroupBy"> + <if test="safeGroupBy!=null and safeGroupBy!=''"> + group by + <choose> + <when test="safeGroupBy != null and safeGroupBy == 'pass_id'"> `pass_id` </when> + <when test="safeGroupBy != null and safeGroupBy == 'pass_name'"> `pass_name` </when> + <when test="safeGroupBy != null and safeGroupBy == 'pass_length'"> `pass_length` </when> + <when test="safeGroupBy != null and safeGroupBy == 'pass_type'"> `pass_type` </when> + <when test="safeGroupBy != null and safeGroupBy == 'pass_childfir'"> `pass_childfir` </when> + <when test="safeGroupBy != null and safeGroupBy == 'pass_childsec'"> `pass_childsec` </when> + <when test="safeGroupBy != null and safeGroupBy == 'pass_childthi'"> `pass_childthi` </when> + <when test="safeGroupBy != null and safeGroupBy == 'pass_expiry'"> `pass_expiry` </when> + <when test="safeGroupBy != null and safeGroupBy == 'pass_createtime'"> `pass_createtime` </when> + <when test="safeGroupBy != null and safeGroupBy == 'pass_userid'"> `pass_userid` </when> + </choose> + </if> + </sql> + <sql id="safeOrderBy"> + <if test="safeOrderBy!=null and safeOrderBy!=''"> + <choose> + <when test="safeOrderBy != null and safeOrderBy == 'pass_id desc'"> order by `pass_id` desc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_id asc'"> order by `pass_id` asc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_name desc'"> order by `pass_name` desc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_name asc'"> order by `pass_name` asc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_length desc'"> order by `pass_length` desc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_length asc'"> order by `pass_length` asc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_type desc'"> order by `pass_type` desc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_type asc'"> order by `pass_type` asc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_childfir desc'"> order by `pass_childfir` desc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_childfir asc'"> order by `pass_childfir` asc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_childsec desc'"> order by `pass_childsec` desc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_childsec asc'"> order by `pass_childsec` asc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_childthi desc'"> order by `pass_childthi` desc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_childthi asc'"> order by `pass_childthi` asc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_expiry desc'"> order by `pass_expiry` desc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_expiry asc'"> order by `pass_expiry` asc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_createtime desc'"> order by `pass_createtime` desc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_createtime asc'"> order by `pass_createtime` asc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_userid desc'"> order by `pass_userid` desc </when> + <when test="safeOrderBy != null and safeOrderBy == 'pass_userid asc'"> order by `pass_userid` asc </when> + </choose> + </if> + </sql> + + <sql id="orderGroupLimit"> + <include refid="safeGroupBy"/> + <if test="notSafeGroupBy != null and notSafeGroupBy != ''"> group by ${notSafeGroupBy}</if> + <include refid="safeOrderBy"/> + <if test="notSafeOrderBy != null and notSafeOrderBy != ''"> order by ${notSafeOrderBy}</if> + <if test="limit != null"> LIMIT <if test="start != null">#{start},</if>#{limit} </if> + </sql> + +</mapper> diff --git a/us_passManage/us-web-service/pom.xml b/us_passManage/us-web-service/pom.xml new file mode 100644 index 0000000..1d8d8c7 --- /dev/null +++ b/us_passManage/us-web-service/pom.xml @@ -0,0 +1,20 @@ +<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>com.passManage</groupId> + <artifactId>us</artifactId> + <version>0.0.1-SNAPSHOT</version> + </parent> + <name>us-web-service</name> + <artifactId>us-web-service</artifactId> + + <dependencies> + + <dependency> + <groupId>com.passManage</groupId> + <artifactId>us-service</artifactId> + <version>0.0.1-SNAPSHOT</version> + </dependency> + </dependencies> + +</project> diff --git a/us_passManage/us-web-service/src/main/java/com/passManage/us/web/model/WebGoods.java b/us_passManage/us-web-service/src/main/java/com/passManage/us/web/model/WebGoods.java new file mode 100644 index 0000000..4a93149 --- /dev/null +++ b/us_passManage/us-web-service/src/main/java/com/passManage/us/web/model/WebGoods.java @@ -0,0 +1,18 @@ +package com.passManage.us.web.model; + +import java.io.Serializable; +/** +自由的实体 会映射到WebGoodsMapper.xml中 +*/ +public class WebGoods implements Serializable{ + + private Long id;//主键 + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } +} diff --git a/us_passManage/us-web-service/src/main/java/com/passManage/us/web/webservice/goods/mapper/WebGoodsMapper.java b/us_passManage/us-web-service/src/main/java/com/passManage/us/web/webservice/goods/mapper/WebGoodsMapper.java new file mode 100644 index 0000000..cc26dc5 --- /dev/null +++ b/us_passManage/us-web-service/src/main/java/com/passManage/us/web/webservice/goods/mapper/WebGoodsMapper.java @@ -0,0 +1,17 @@ +package com.passManage.us.web.webservice.goods.mapper; + +import com.passManage.us.web.model.WebGoods; + +import java.util.Map; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +public interface WebGoodsMapper{ + + WebGoods getWebGoods(Map<String,Object> query); + +} diff --git a/us_passManage/us-web-service/src/main/java/com/passManage/us/web/webservice/goods/service/WebGoodsService.java b/us_passManage/us-web-service/src/main/java/com/passManage/us/web/webservice/goods/service/WebGoodsService.java new file mode 100644 index 0000000..9c063a8 --- /dev/null +++ b/us_passManage/us-web-service/src/main/java/com/passManage/us/web/webservice/goods/service/WebGoodsService.java @@ -0,0 +1,12 @@ +package com.passManage.us.web.webservice.goods.service; + +/** +* 代码为自动生成 Created by www.magicalcoder.com +* 如果你改变了此类 read 请将此行删除 +* 欢迎加入官方QQ群:323237052 +*/ + +public interface WebGoodsService{ + + void getWebGoods(Long id); +} diff --git a/us_passManage/us-web-service/src/main/java/com/passManage/us/web/webservice/goods/service/impl/WebGoodsServiceImpl.java b/us_passManage/us-web-service/src/main/java/com/passManage/us/web/webservice/goods/service/impl/WebGoodsServiceImpl.java new file mode 100644 index 0000000..8a45624 --- /dev/null +++ b/us_passManage/us-web-service/src/main/java/com/passManage/us/web/webservice/goods/service/impl/WebGoodsServiceImpl.java @@ -0,0 +1,32 @@ + +package com.passManage.us.web.webservice.goods.service.impl; + +import com.passManage.us.web.model.WebGoods; +import com.passManage.us.web.webservice.goods.mapper.WebGoodsMapper; +import com.passManage.us.web.webservice.goods.service.WebGoodsService; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; + +/** + * 我这一层存在的意义在于 + * 1 us-service是代码自动生成,我不希望改动它,方便后续重复生成 + * 2 我为了解耦而存在,您的一些个性化业务都可以在我这个层完成 因为us-service + * 不仅被我依赖 还被admin-service依赖 不能硬把我的代码让admin强制接受 + * 所以admin-service 跟web-service的目的相同 + */ +@Service +public class WebGoodsServiceImpl implements WebGoodsService { + //这个是我自定义的 非工具生成的mapper + @Resource + private WebGoodsMapper webGoodsMapper; + //这个是工具生成的 我可以复用 + + + @Override + public void getWebGoods(Long id) { + WebGoods webGoods = webGoodsMapper.getWebGoods(null); + + System.out.println("上面2个我都能使用"); + } +} diff --git a/us_passManage/us-web-service/src/main/resources/sqlmap/WebGoodsMapper.xml b/us_passManage/us-web-service/src/main/resources/sqlmap/WebGoodsMapper.xml new file mode 100644 index 0000000..e9acf4c --- /dev/null +++ b/us_passManage/us-web-service/src/main/resources/sqlmap/WebGoodsMapper.xml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> +<!-- +这里是我自定义新查询的地方 +--> + +<mapper namespace="com.passManage.us.web.webservice.goods.mapper.WebGoodsMapper"> + <!-- 查询单个实体 --> + <select id="getWebGoods" parameterType="hashmap" resultType="WebGoods"> + select id + from goods limit 1 + </select> + + +</mapper> diff --git a/us_passManage/us-web/pom.xml b/us_passManage/us-web/pom.xml new file mode 100644 index 0000000..5b4d5b7 --- /dev/null +++ b/us_passManage/us-web/pom.xml @@ -0,0 +1,46 @@ +<?xml version="1.0"?> +<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0" + xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> + <modelVersion>4.0.0</modelVersion> + <parent> + <groupId>com.passManage</groupId> + <artifactId>us</artifactId> + <version>0.0.1-SNAPSHOT</version> + </parent> + <artifactId>us-web</artifactId> + <packaging>jar</packaging> + <name>us-web</name> + <url>http://maven.apache.org</url> + + <build> + <finalName>us-web</finalName> + <plugins> + <plugin> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-maven-plugin</artifactId> + <executions> + <execution> + <goals> + <goal>repackage</goal> + </goals> + </execution> + </executions> + </plugin> + <plugin> + <groupId>org.apache.maven.plugins</groupId> + <artifactId>maven-compiler-plugin</artifactId> + <configuration> + <source>${java.version}</source> + <target>${java.version}</target> + </configuration> + </plugin> + </plugins> + </build> + <dependencies> + <dependency> + <groupId>com.passManage</groupId> + <artifactId>us-web-service</artifactId> + <version>0.0.1-SNAPSHOT</version> + </dependency> + </dependencies> +</project> diff --git a/us_passManage/us-web/src/main/java/com/passManage/us/web/YouyabootWebApplication.java b/us_passManage/us-web/src/main/java/com/passManage/us/web/YouyabootWebApplication.java new file mode 100644 index 0000000..6100942 --- /dev/null +++ b/us_passManage/us-web/src/main/java/com/passManage/us/web/YouyabootWebApplication.java @@ -0,0 +1,44 @@ +package com.passManage.us.web; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.web.cors.CorsConfiguration; +import org.springframework.web.cors.UrlBasedCorsConfigurationSource; +import org.springframework.web.filter.CorsFilter; + +/** + * + * @author www.magicalcoder.com + * @date 2017-12-21 + */ +@SpringBootApplication +@ComponentScan(basePackages = { + "com.passManage.us.core", + "com.passManage.us.service", + "com.passManage.us.web" +}) +public class YouyabootWebApplication { + + public static void main(String[] args) { + SpringApplication.run(YouyabootWebApplication.class, args); + } + + + /** + * 跨域过滤器 + * @return + */ + @Bean + public CorsFilter corsFilter() { + UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); + CorsConfiguration corsConfiguration = new CorsConfiguration(); + corsConfiguration.addAllowedOrigin("*"); + corsConfiguration.addAllowedHeader("*"); + corsConfiguration.addAllowedMethod("*"); + source.registerCorsConfiguration("/**", corsConfiguration); + return new CorsFilter(source); + } + +} diff --git a/us_passManage/us-web/src/main/java/com/passManage/us/web/api/web/WebGoodsController.java b/us_passManage/us-web/src/main/java/com/passManage/us/web/api/web/WebGoodsController.java new file mode 100644 index 0000000..f78204b --- /dev/null +++ b/us_passManage/us-web/src/main/java/com/passManage/us/web/api/web/WebGoodsController.java @@ -0,0 +1,31 @@ +package com.passManage.us.web.api.web; + +import com.passManage.us.core.serialize.ResponseMsg; +import com.passManage.us.web.webservice.goods.service.WebGoodsService; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import redis.clients.jedis.Jedis; + +import javax.annotation.Resource; + +/** + * author:www.magicalcoder.com + * date:2018/8/23 + * function: + */ +@RestController +@RequestMapping("/web/goods/") +public class WebGoodsController { + + @Resource + private WebGoodsService webGoodsService; + + + @RequestMapping("info") + public ResponseMsg info(){ + Jedis jedis; + webGoodsService.getWebGoods(1L); + return new ResponseMsg("ok"); + } + +} diff --git a/us_passManage/us-web/src/main/java/com/passManage/us/web/common/config/DataSourceConfig.java b/us_passManage/us-web/src/main/java/com/passManage/us/web/common/config/DataSourceConfig.java new file mode 100644 index 0000000..e095ae0 --- /dev/null +++ b/us_passManage/us-web/src/main/java/com/passManage/us/web/common/config/DataSourceConfig.java @@ -0,0 +1,92 @@ +package com.passManage.us.web.common.config; + +import com.alibaba.druid.pool.DruidDataSource; +import com.passManage.us.core.utils.StringUtil; +import org.apache.ibatis.io.VFS; +import org.apache.ibatis.session.SqlSessionFactory; +import org.mybatis.spring.SqlSessionFactoryBean; +import org.mybatis.spring.annotation.MapperScan; +import org.mybatis.spring.boot.autoconfigure.SpringBootVFS; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Primary; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.jdbc.datasource.DataSourceTransactionManager; + +import javax.annotation.Resource; +import javax.sql.DataSource; +import java.sql.SQLException; +import java.util.Arrays; + +/** + * 数据源配置 + * @author www.magicalcoder.com + * @date 2018-7-9 + */ +@Configuration +@MapperScan(basePackages = + {"com.passManage.us.web.**.mapper" + ,"com.passManage.us.service.**.mapper" + } + , sqlSessionFactoryRef = "commonSqlSessionFactory" ) +public class DataSourceConfig { + + private static final String MAPPER_LOCATION = "classpath*:sqlmap/**/*Mapper.xml"; + private static final String TYPE_ALIASES_PACKAGE = + "com.passManage.us.web.model," + + "com.passManage.us.model";//逗号分隔多个 + + @Value("${common.datasource.url}") + private String url; + + @Value("${common.datasource.username}") + private String user; + + @Value("${common.datasource.password}") + private String password; + + @Value("${common.datasource.driverClassName}") + private String driverClass; + + @Resource + private MonitorConfig monitorConfig; + + @Bean(name = "commonDataSource") + @Primary + public DataSource masterDataSource() { + DruidDataSource dataSource = new DruidDataSource(); + dataSource.setDriverClassName(driverClass); + dataSource.setUrl(url); + dataSource.setUsername(user); + dataSource.setPassword(password); + dataSource.setConnectionInitSqls(Arrays.asList("set names utf8mb4")); + if(StringUtil.isNotBlank(monitorConfig.getDruidFilters())){ + try { + dataSource.setFilters(monitorConfig.getDruidFilters()); + } catch (SQLException e) { + e.printStackTrace(); + } + } + return dataSource; + } + + @Bean(name = "commonTransactionManager") + @Primary + public DataSourceTransactionManager commonTransactionManager() { + return new DataSourceTransactionManager(masterDataSource()); + } + + @Bean(name = "commonSqlSessionFactory") + @Primary + public SqlSessionFactory commonSqlSessionFactory(@Qualifier("commonDataSource") DataSource commonDataSource)throws Exception { + //DefaultVFS在获取jar上存在问题,使用springboot只能修改 ,否则setTypeAliasesPackage 在生产环境报错 + VFS.addImplClass(SpringBootVFS.class); + final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); + sessionFactory.setDataSource(commonDataSource); + sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(DataSourceConfig.MAPPER_LOCATION)); + sessionFactory.setTypeAliasesPackage(TYPE_ALIASES_PACKAGE); + return sessionFactory.getObject(); + } +} diff --git a/us_passManage/us-web/src/main/java/com/passManage/us/web/common/config/DistributedSessionConfig.java b/us_passManage/us-web/src/main/java/com/passManage/us/web/common/config/DistributedSessionConfig.java new file mode 100644 index 0000000..84d9593 --- /dev/null +++ b/us_passManage/us-web/src/main/java/com/passManage/us/web/common/config/DistributedSessionConfig.java @@ -0,0 +1,22 @@ +package com.passManage.us.web.common.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.session.data.redis.config.ConfigureRedisAction; +import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession; + +/** + * 分布式session配置 + * @author www.magicalcoder.com + * @date + */ +@Configuration +@EnableRedisHttpSession(maxInactiveIntervalInSeconds = 86400, redisNamespace="us_web_session") +public class DistributedSessionConfig { + + @Bean + public static ConfigureRedisAction configureRedisAction() { + return ConfigureRedisAction.NO_OP; + } + +} diff --git a/us_passManage/us-web/src/main/java/com/passManage/us/web/common/config/MonitorConfig.java b/us_passManage/us-web/src/main/java/com/passManage/us/web/common/config/MonitorConfig.java new file mode 100644 index 0000000..00be49d --- /dev/null +++ b/us_passManage/us-web/src/main/java/com/passManage/us/web/common/config/MonitorConfig.java @@ -0,0 +1,43 @@ +package com.passManage.us.web.common.config; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; + +/** + * author: www.magicalcoder.com + * date:2018/5/12 + * function:监控配置 + */ +@Configuration +public class MonitorConfig { + @Value("${spring.monitor.druid.userName}") + private String druidUserName; + @Value("${spring.monitor.druid.password}") + private String druidPassword; + @Value("${spring.monitor.druid.allowIps}") + private String druidAllowIps; + @Value("${spring.monitor.druid.denyIps}") + private String druidDenyIps; + @Value("${spring.monitor.druid.filters}") + private String druidFilters; + + public String getDruidUserName() { + return druidUserName; + } + + public String getDruidPassword() { + return druidPassword; + } + + public String getDruidAllowIps() { + return druidAllowIps; + } + + public String getDruidDenyIps() { + return druidDenyIps; + } + + public String getDruidFilters() { + return druidFilters; + } +} diff --git a/us_passManage/us-web/src/main/java/com/passManage/us/web/common/config/MvcConfig.java b/us_passManage/us-web/src/main/java/com/passManage/us/web/common/config/MvcConfig.java new file mode 100644 index 0000000..0254b62 --- /dev/null +++ b/us_passManage/us-web/src/main/java/com/passManage/us/web/common/config/MvcConfig.java @@ -0,0 +1,113 @@ +package com.passManage.us.web.common.config; + +import com.passManage.us.core.utils.StringUtil; +import com.passManage.us.web.common.interceptor.WebInterceptor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Bean; +import org.springframework.core.convert.converter.Converter; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.config.annotation.CorsRegistry; +import org.springframework.web.servlet.config.annotation.InterceptorRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +import java.sql.Time; +import java.sql.Timestamp; +import java.text.SimpleDateFormat; +import java.util.Date; + +/** + * @author www.magicalcoder.com + */ +@Component +@Slf4j +public class MvcConfig extends WebMvcConfigurerAdapter { + + @Autowired + private WebInterceptor webInterceptor; + + /** + * 拦截器配置 + * @param registry + */ + @Override + public void addInterceptors(InterceptorRegistry registry) { + // 注册监控拦截器 + registry.addInterceptor(webInterceptor).addPathPatterns("/**"); + } + + /* @Override + public void addCorsMappings(CorsRegistry registry) { + registry.addMapping("/**") + .allowedOrigins("*") + .allowedMethods("POST", "GET", "PUT", "OPTIONS", "DELETE"); + }*/ + + //下面的方法是转换日期的 否则日期转换出问题 不支持timestemp + @Bean + public Converter<String, Date> stringToDateConvert() { + return new Converter<String, Date>() { + @Override + public Date convert(String source) { + if(StringUtil.isBlank(source)){ + return null; + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Date date = null; + try { + date = sdf.parse(source); + } catch (Exception e) { + log.error("日期转换异常",e); + } + return date; + } + }; + } + + /** + *str转timestamp + * @retun + */ + @Bean + public Converter<String, Timestamp> stringToTimeStampConvert() { + return new Converter<String, Timestamp>() { + @Override + public Timestamp convert(String source) { + if(StringUtil.isBlank(source)){ + return null; + } +// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); + Timestamp date = null; + try { + date = Timestamp.valueOf(source); + } catch (Exception e) { + log.error("日期转换异常",e); + } + return date; + } + }; + } + + + + @Bean + public Converter<String, Time> stringToTimeConvert() { + return new Converter<String, Time>() { + @Override + public Time convert(String source) { + if(StringUtil.isBlank(source)){ + return null; + } +// SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss"); + Time date = null; + try { + String[] arr = source.trim().split("\\s+"); + date = Time.valueOf(arr[1]); + } catch (Exception e) { + log.error("日期转换异常",e); + } + return date; + } + }; + } +} diff --git a/us_passManage/us-web/src/main/java/com/passManage/us/web/common/config/RedisConfig.java b/us_passManage/us-web/src/main/java/com/passManage/us/web/common/config/RedisConfig.java new file mode 100644 index 0000000..bdefebb --- /dev/null +++ b/us_passManage/us-web/src/main/java/com/passManage/us/web/common/config/RedisConfig.java @@ -0,0 +1,82 @@ +package com.passManage.us.web.common.config; + +import com.passManage.us.core.utils.StringUtil; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.cache.annotation.CachingConfigurerSupport; +import org.springframework.cache.annotation.EnableCaching; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import redis.clients.jedis.JedisPool; +import redis.clients.jedis.JedisPoolConfig; + +/** + * redis配置 + * 集群模式 支持1到多个redis服务 + */ + +@Configuration +@EnableCaching +public class RedisConfig extends CachingConfigurerSupport { + + @Value("${spring.redis.host}") + private String host; + + @Value("${spring.redis.port}") + private Integer port; + + @Value("${spring.redis.password}") + private String password; + + + //默认不开启集群模式 因为集群模式部署比较麻烦 但是支持 注释打开后 让RedisUtil继承 RedisClusterDefinedUtil +/* @Value("${spring.redis.cluster.nodes}") + private String clusterNodes; + + @Value("${spring.redis.cluster.connectionTimeout}") + private int connectionTimeout; + + @Value("${spring.redis.cluster.soTimeout}") + private int soTimeout; + + @Value("${spring.redis.cluster.maxAttempts}") + private int maxAttempts; + + + @Bean + public JedisCluster jedisCluster(){ + Set<HostAndPort> jedisClusterNode = null; + if(StringUtil.isNotBlank(clusterNodes)){ + jedisClusterNode = new HashSet<>(); + String[] arr = clusterNodes.split(","); + for(String hostAndPot : arr){ + String[] hp = hostAndPot.split(":"); + jedisClusterNode.add(new HostAndPort(hp[0].trim(),Integer.valueOf(hp[1].trim()))); + } + }else { + return null; + } + if(StringUtil.isBlank(password)){ + return new JedisCluster(jedisClusterNode,connectionTimeout,soTimeout,maxAttempts,new GenericObjectPoolConfig()); + }else { + return new JedisCluster(jedisClusterNode,connectionTimeout,soTimeout,maxAttempts,password,new GenericObjectPoolConfig()); + } + }*/ + +//单机模式 + @Bean + public JedisPool redisPoolFactory() { + JedisPoolConfig jedisPoolConfig = new JedisPoolConfig(); + jedisPoolConfig.setMaxIdle(8); + jedisPoolConfig.setMaxWaitMillis(10000); + jedisPoolConfig.setMinIdle(0); + JedisPool jedisPool; + + if(StringUtil.isNotBlank(password)){ + jedisPool = new JedisPool(jedisPoolConfig, host,port, 10000, password); + }else { + jedisPool = new JedisPool(jedisPoolConfig, host,port, 10000); + } + return jedisPool; + } + +} diff --git a/us_passManage/us-web/src/main/java/com/passManage/us/web/common/config/RestTemplateConfig.java b/us_passManage/us-web/src/main/java/com/passManage/us/web/common/config/RestTemplateConfig.java new file mode 100644 index 0000000..fe2d7dd --- /dev/null +++ b/us_passManage/us-web/src/main/java/com/passManage/us/web/common/config/RestTemplateConfig.java @@ -0,0 +1,56 @@ +package com.passManage.us.web.common.config; + +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.ssl.TrustStrategy; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.http.client.ClientHttpRequestFactory; +import org.springframework.http.client.HttpComponentsClientHttpRequestFactory; +import org.springframework.web.client.RestTemplate; + +import javax.net.ssl.SSLContext; +import java.security.KeyManagementException; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; + +/** + * author: www.magicalcoder.com + * date:2018/4/28 + * function: + */ +@Configuration +public class RestTemplateConfig { + @Bean + public RestTemplate restTemplate(ClientHttpRequestFactory simpleClientHttpRequestFactory){ + return new RestTemplate(simpleClientHttpRequestFactory); + } + + @Bean + public ClientHttpRequestFactory simpleClientHttpRequestFactory() throws KeyStoreException, NoSuchAlgorithmException, KeyManagementException { + TrustStrategy acceptingTrustStrategy = new TrustStrategy(){ + @Override + public boolean isTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { + return true; + } + }; + SSLContext sslContext = org.apache.http.ssl.SSLContexts.custom() + .loadTrustMaterial(null, acceptingTrustStrategy) + .build(); + SSLConnectionSocketFactory csf = new SSLConnectionSocketFactory(sslContext); + CloseableHttpClient httpClient = HttpClients.custom() + .setSSLSocketFactory(csf) + .build(); + HttpComponentsClientHttpRequestFactory requestFactory = + new HttpComponentsClientHttpRequestFactory(); + requestFactory.setHttpClient(httpClient); +// SimpleClientHttpRequestFactory simpleClientHttpRequestFactory = new SimpleClientHttpRequestFactory(); + requestFactory.setReadTimeout(10000);//单位为ms + requestFactory.setConnectTimeout(10000);//单位为ms + requestFactory.setConnectionRequestTimeout(10000); + return requestFactory; + } +} diff --git a/us_passManage/us-web/src/main/java/com/passManage/us/web/common/config/UploadFilePathConfig.java b/us_passManage/us-web/src/main/java/com/passManage/us/web/common/config/UploadFilePathConfig.java new file mode 100644 index 0000000..366fa9c --- /dev/null +++ b/us_passManage/us-web/src/main/java/com/passManage/us/web/common/config/UploadFilePathConfig.java @@ -0,0 +1,44 @@ +package com.passManage.us.web.common.config; + +import com.passManage.us.core.utils.StringUtil; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; + +/** + * Created by magicalcoder.com on 2018/8/5. + * 文件上传 虚拟路径映射 因为springboot默认不支持文件上传 慎重选择 + */ +@Configuration +public class UploadFilePathConfig extends WebMvcConfigurerAdapter { + + @Value("${magicalcoder.file.upload.mapping.uploadDiskFolder:}") + private String uploadDiskFolder; + @Value("${magicalcoder.file.upload.mapping.requestPrefix:}") + private String requestPrefix; + + @Override + public void addResourceHandlers(ResourceHandlerRegistry registry) { + uploadDiskFolder = lastUploadPath(uploadDiskFolder); + if(!requestPrefix.endsWith("/")){ + requestPrefix = requestPrefix+"/"; + } + registry.addResourceHandler(requestPrefix+"**").addResourceLocations("file:" + uploadDiskFolder); + } + + private String lastUploadPath(String uploadDiskFolder){ + if(StringUtil.isBlank(uploadDiskFolder)){ + uploadDiskFolder = UploadFilePathConfig.class.getResource("/").getPath()+"/upload/"; + } + return uploadDiskFolder; + } + + public String getUploadDiskFolder() { + return uploadDiskFolder; + } + + public String getRequestPrefix() { + return requestPrefix; + } +} diff --git a/us_passManage/us-web/src/main/java/com/passManage/us/web/common/handler/ExceptionHandlerAdvice.java b/us_passManage/us-web/src/main/java/com/passManage/us/web/common/handler/ExceptionHandlerAdvice.java new file mode 100644 index 0000000..928f9a6 --- /dev/null +++ b/us_passManage/us-web/src/main/java/com/passManage/us/web/common/handler/ExceptionHandlerAdvice.java @@ -0,0 +1,54 @@ +package com.passManage.us.web.common.handler; + +import com.passManage.us.core.common.exception.BusinessException; +import com.passManage.us.core.serialize.CommonReturnCode; +import com.passManage.us.core.serialize.ResponseMsg; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.web.bind.annotation.ExceptionHandler; +import org.springframework.web.bind.annotation.RestControllerAdvice; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.PrintWriter; +import java.io.StringWriter; + +@RestControllerAdvice +public class ExceptionHandlerAdvice { + private final static Logger logger = LoggerFactory.getLogger(ExceptionHandlerAdvice.class); + @Value("${spring.profiles.active}") + private String active; + + /** + * 获取异常的堆栈信息 + * + * @param t + * @return + */ + private static String getStackTrace(Throwable t) + { + StringWriter sw = new StringWriter(); + PrintWriter pw = new PrintWriter(sw); + try + { + t.printStackTrace(pw); + return sw.toString(); + } + finally + { + pw.close(); + } + } + + @ExceptionHandler + public ResponseMsg handler(HttpServletRequest req, HttpServletResponse res, Exception e) { + if(e instanceof BusinessException) { + logger.error("BusinessException:" + e.getMessage(), e); + return new ResponseMsg(((BusinessException) e).getErrorCode(),((BusinessException) e).getDesc()); + }else { + logger.error("Exception:" + e.getMessage(), e); + return new ResponseMsg(CommonReturnCode.EXCEPTION); + } + } +} diff --git a/us_passManage/us-web/src/main/java/com/passManage/us/web/common/interceptor/AllInterceptor.java b/us_passManage/us-web/src/main/java/com/passManage/us/web/common/interceptor/AllInterceptor.java new file mode 100644 index 0000000..29c2c76 --- /dev/null +++ b/us_passManage/us-web/src/main/java/com/passManage/us/web/common/interceptor/AllInterceptor.java @@ -0,0 +1,33 @@ +/** + * + */ +package com.passManage.us.web.common.interceptor; + +import com.passManage.us.web.common.interceptor.limit.RequestRateLimiter; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * 所有请求拦截器 + * @author www.magicalcoder.com + * @time 2017年6月26日-下午4:50:06 + */ +@Component +@Slf4j +public class AllInterceptor extends HandlerInterceptorAdapter { + @Resource + private RequestRateLimiter requestRateLimiter; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + request.setCharacterEncoding("utf-8"); + //限流判断 +// requestRateLimiter.aquire(request); + return true; + } +} diff --git a/us_passManage/us-web/src/main/java/com/passManage/us/web/common/interceptor/WebInterceptor.java b/us_passManage/us-web/src/main/java/com/passManage/us/web/common/interceptor/WebInterceptor.java new file mode 100644 index 0000000..d832d13 --- /dev/null +++ b/us_passManage/us-web/src/main/java/com/passManage/us/web/common/interceptor/WebInterceptor.java @@ -0,0 +1,34 @@ +/** + * + */ +package com.passManage.us.web.common.interceptor; + +import com.passManage.us.core.cache.redis.RedisUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * 后端判断拦截器 + * @author www.magicalcoder.com + * @time 2017年6月26日-下午4:50:06 + */ +@Component +@Slf4j +public class WebInterceptor extends HandlerInterceptorAdapter { + + @Resource + private RedisUtil redisUtil; + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + request.setCharacterEncoding("utf-8"); + //做一些登录验证 + return true; + } + +} diff --git a/us_passManage/us-web/src/main/java/com/passManage/us/web/common/interceptor/limit/RequestRateLimiter.java b/us_passManage/us-web/src/main/java/com/passManage/us/web/common/interceptor/limit/RequestRateLimiter.java new file mode 100644 index 0000000..3aad02e --- /dev/null +++ b/us_passManage/us-web/src/main/java/com/passManage/us/web/common/interceptor/limit/RequestRateLimiter.java @@ -0,0 +1,81 @@ +package com.passManage.us.web.common.interceptor.limit; + +import com.passManage.us.core.cache.redis.RedisUtil; +import com.passManage.us.core.common.exception.BusinessException; +import com.passManage.us.core.serialize.Restrict; +import com.passManage.us.core.utils.IpUtil; +import com.passManage.us.core.utils.JsonUtil; +import com.passManage.us.core.utils.StringUtil; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; + +/** + * author: www.magicalcoder.com + * date:2018/5/14 + * function: + * 访问限制 配置在数据库中 code=REQ_RATE name为配置内容 + */ +@Slf4j +@Component +public class RequestRateLimiter { + + private String reqRateCode = "REQ_RATE"; + private String redisPrefix = "request_rate_"; + //@Resource + //private DictService dictService; + @Resource + private RedisUtil redisUtil; + + public void aquire(HttpServletRequest request){ + String json = "";//dictService.getDictNameCache(reqRateCode); + if(StringUtil.isNotBlank(json)){ + Restrict restrict = JsonUtil.getObjectFromJSONString(json,Restrict.class); + if(restrict!=null){ + // + String path = request.getServletPath(); + if(!path.matches(restrict.getServletPathReg())){ + return; + } + String strategy = restrict.getStrategy(); + if(StringUtil.isBlank(strategy) || "no".equals(strategy)){ + return; + } + if("ip".equals(strategy)){ + ipCheck(path,restrict,request); + }else if("user".equals(strategy)){ + userCheck(path,restrict,request); + }else if("ip_user".equals(strategy)){ + ipCheck(path,restrict,request); + userCheck(path,restrict,request); + } + } + } + } + + private void ipCheck(String path,Restrict restrict, HttpServletRequest request){ + String ip = IpUtil.getIp(request); + if(!redisUtil.tryIncr(redisPrefix+ip,restrict.getIpExpireSeconds(),restrict.getIpMaxReqTimes())){ + log.info(String.format("ip=[%s]请求[%s]过于频繁,已超过系统拒绝请求边界每[%s]秒请求[%s]次",ip,path,restrict.getIpExpireSeconds(),restrict.getIpMaxReqTimes())); +// throw new BusinessException(CommonReturnCode.REQUEST_IP_ATTACK); + } + } + private void userCheck(String path,Restrict restrict, HttpServletRequest request){ + Long uid = null; + try { +// uid = UserInfoUtil.getUid(request); + }catch (BusinessException e){ + + } + if(uid==null){ + return; + } + if(!redisUtil.tryIncr(redisPrefix+uid,restrict.getUserExpireSeconds(),restrict.getUserMaxReqTimes())){ + log.info(String.format("uid=[%s]请求[%s]过于频繁,已超过系统拒绝请求边界每[%s]秒请求[%s]次",uid,path,restrict.getUserExpireSeconds(),restrict.getUserMaxReqTimes())); +// throw new BusinessException(CommonReturnCode.REQUEST_IP_ATTACK); + } + } + +} diff --git a/us_passManage/us-web/src/main/java/com/passManage/us/web/common/monitor/DruidMonitorConfig.java b/us_passManage/us-web/src/main/java/com/passManage/us/web/common/monitor/DruidMonitorConfig.java new file mode 100644 index 0000000..ded8ff4 --- /dev/null +++ b/us_passManage/us-web/src/main/java/com/passManage/us/web/common/monitor/DruidMonitorConfig.java @@ -0,0 +1,59 @@ +package com.passManage.us.web.common.monitor; + +import com.alibaba.druid.support.http.StatViewServlet; +import com.alibaba.druid.support.http.WebStatFilter; +import com.passManage.us.web.common.config.MonitorConfig; +import org.springframework.boot.web.servlet.FilterRegistrationBean; +import org.springframework.boot.web.servlet.ServletRegistrationBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +import javax.annotation.Resource; + +/** + * author: www.magicalcoder.com + * date:2018/5/12 + * function: 后台监控druid连接池 + * http://127.0.0.1:8080/us-web/druid/ admin/123456 + */ +@Configuration +public class DruidMonitorConfig { + + @Resource + private MonitorConfig monitorConfig; + + /** + * 注册一个StatViewServlet + * @return + */ + @Bean + public ServletRegistrationBean druidStatViewServle(){ + //org.springframework.boot.context.embedded.ServletRegistrationBean提供类的进行注册. + ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(),"/druid/*"); + //添加初始化参数:initParams + //白名单: + servletRegistrationBean.addInitParameter("allow",monitorConfig.getDruidAllowIps()); + //IP黑名单 (存在共同时,deny优先于allow) : 如果满足deny的话提示:Sorry, you are not permitted to view this page. + servletRegistrationBean.addInitParameter("deny",monitorConfig.getDruidDenyIps()); + //登录查看信息的账号密码. + servletRegistrationBean.addInitParameter("loginUsername",monitorConfig.getDruidUserName()); + servletRegistrationBean.addInitParameter("loginPassword",monitorConfig.getDruidPassword()); + //是否能够重置数据. + servletRegistrationBean.addInitParameter("resetEnable","false"); + return servletRegistrationBean; + } + + /** + * 注册一个:filterRegistrationBean + * @return + */ + @Bean + public FilterRegistrationBean druidStatFilter(){ + FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter()); + //添加过滤规则. + filterRegistrationBean.addUrlPatterns("/*"); + //添加不需要忽略的格式信息. + filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); + return filterRegistrationBean; + } +} diff --git a/us_passManage/us-web/src/main/java/com/passManage/us/web/common/spring/SpringBeanAllInitFinished.java b/us_passManage/us-web/src/main/java/com/passManage/us/web/common/spring/SpringBeanAllInitFinished.java new file mode 100644 index 0000000..b99fd58 --- /dev/null +++ b/us_passManage/us-web/src/main/java/com/passManage/us/web/common/spring/SpringBeanAllInitFinished.java @@ -0,0 +1,21 @@ +package com.passManage.us.web.common.spring; + +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.context.ApplicationListener; +import org.springframework.stereotype.Component; + +/** + * Created by magicalcoder.com on + * 当spring bean 启动完毕 就会执行此类方法 + */ +@Component +@Slf4j +public class SpringBeanAllInitFinished implements ApplicationListener<ApplicationReadyEvent> { + + @Override + public void onApplicationEvent(ApplicationReadyEvent contextRefreshedEvent) { + //需要执行的逻辑代码,当spring容器初始化完成后就会执行该方法。 + log.info("spring bean 加载完毕"); + } + } diff --git a/us_passManage/us-web/src/main/resources/application-localhost.yml b/us_passManage/us-web/src/main/resources/application-localhost.yml new file mode 100644 index 0000000..2d3ce5b --- /dev/null +++ b/us_passManage/us-web/src/main/resources/application-localhost.yml @@ -0,0 +1,48 @@ +##笔记本的环境设置 +server: + #tomcat端口 比如http://{ip}:{port}{/context-path}中的{port} 纯数字 + port: 18088 +common: + datasource: + #mysql url连接信息 + url: jdbc:mysql://localhost:3306/us?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&userSSL=true&serverTimezone=Hongkong&zeroDateTimeBehavior=CONVERT_TO_NULL + #数据库用户名 + username: root + #数据库密码 + password: 123456 + #mysql8新驱动名称 + driverClassName: com.mysql.cj.jdbc.Driver + +spring: + thymeleaf: + cache: false + redis: + #所有的redis 缓存都会加入下面的前缀 方便管理 + keyPrefix: us-admin. + # redis地址 单机模式 参见RedisConfig + host: localhost + #redis端口 单机模式 + port: 6379 + #不允许redis密码为空字符串 可以不设置 您也可以使用"1234" + password: 123456 + #集群模式 默认不开启 因为集群模式redis配置复杂,演示版只有一个redis + # cluster: + #redis支持集群模式(需要参考文档自行打开) 也支持单机(配置一个即可) 配置规则:节点的ip:port,ip:port 逗号分隔多个 + # nodes: localhost:6379 + #最大连接时间 具体参考JedisCluster官方文档 + # connectionTimeout: 5000 + # soTimeout: 5000 + # maxAttempts: 3 + + #druid管理后台 http://localhost:18088/us-web/druid/ 可以查看数据源的状态 账号/密码:web/123456 + monitor: + druid: + userName: web + password: 123456 + allowIps: 127.0.0.1 + denyIps: 10.1.1.1 + filters: stat,log4j + devtools: + restart: + #是否开启热部署 另外需要配置ide的配置一同生效 + enabled: false diff --git a/us_passManage/us-web/src/main/resources/application-publish.yml b/us_passManage/us-web/src/main/resources/application-publish.yml new file mode 100644 index 0000000..3794990 --- /dev/null +++ b/us_passManage/us-web/src/main/resources/application-publish.yml @@ -0,0 +1,48 @@ +##笔记本的环境设置 +server: + #tomcat端口 比如http://{ip}:{port}{/context-path}中的{port} 纯数字 + port: 18088 +common: + datasource: + #mysql url连接信息 + url: jdbc:mysql://localhost:3306/us?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true&userSSL=true&serverTimezone=Hongkong&zeroDateTimeBehavior=CONVERT_TO_NULL + #数据库用户名 + username: root + #数据库密码 + password: root123 + #mysql8新驱动名称 + driverClassName: com.mysql.cj.jdbc.Driver + +spring: + thymeleaf: + cache: false + redis: + #所有的redis 缓存都会加入下面的前缀 方便管理 + keyPrefix: us-admin. + # redis地址 单机模式 参见RedisConfig + host: localhost + #redis端口 单机模式 + port: 6379 + #不允许redis密码为空字符串 可以不设置 您也可以使用"1234" + password: + #集群模式 默认不开启 因为集群模式redis配置复杂,演示版只有一个redis + # cluster: + #redis支持集群模式(需要参考文档自行打开) 也支持单机(配置一个即可) 配置规则:节点的ip:port,ip:port 逗号分隔多个 + # nodes: localhost:6379 + #最大连接时间 具体参考JedisCluster官方文档 + # connectionTimeout: 5000 + # soTimeout: 5000 + # maxAttempts: 3 + + #druid管理后台 http://localhost:18088/us-web/druid/ 可以查看数据源的状态 账号/密码:web/123456 + monitor: + druid: + userName: web + password: 123456 + allowIps: 127.0.0.1 + denyIps: 10.1.1.1 + filters: stat,log4j + devtools: + restart: + #是否开启热部署 另外需要配置ide的配置一同生效 + enabled: false diff --git a/us_passManage/us-web/src/main/resources/application.yml b/us_passManage/us-web/src/main/resources/application.yml new file mode 100644 index 0000000..2eea68e --- /dev/null +++ b/us_passManage/us-web/src/main/resources/application.yml @@ -0,0 +1,34 @@ +#全局配置 +# tomcat配置 +server: + #当前环境上下文 比如http://{ip}:{port}{/context-path}中的{/context-path} 以/开头配置 + servlet: + context-path: /us-web +#log +logging: + config: + #日志配置:读取当前环境下的logback.xml + classpath: logback.xml + +spring: + # thymeleaf: + # prefix: classpath:/templates + profiles: + # publish localhost 就可以切换不同环境application-xxx的配置 + active: localhost + messages: + encoding: UTF-8 + http: + encoding: + charset: UTF-8 + enabled: true + force: true + application: + #service-name + name: us-web + jackson: + time-zone: GMT+8 + mvc: + #这样浏览器小图标就可以加载你自己的favicon.ico了 + favicon: + enabled: false diff --git a/us_passManage/us-web/src/main/resources/banner.txt b/us_passManage/us-web/src/main/resources/banner.txt new file mode 100644 index 0000000..48fbc4f --- /dev/null +++ b/us_passManage/us-web/src/main/resources/banner.txt @@ -0,0 +1,28 @@ +/** + *        ┏┓  ┏┓+ + + *       ┏┛┻━━━┛┻┓ + + + *       ┃      ┃   + *       ┃   ━   ┃ ++ + + + + *       ████━████ ┃+ + *       ┃       ┃ + + *       ┃   ┻   ┃ + *       ┃      ┃ + + + *       ┗━┓   ┏━┛ + *         ┃   ┃            + *         ┃   ┃ + + + + + *         ┃   ┃          + *         ┃   ┃ +      + *         ┃   ┃ + *         ┃   ┃  +          + *         ┃    ┗━━━┓ + + + *         ┃      ┣┓ + *         ┃       ┏┛ + *         ┗┓┓┏━┳┓┏┛ + + + + + *         ┃┫┫ ┃┫┫ + *         ┗┻┛ ┗┻┛+ + + + + * + * 神兽保佑 永无BUG + */ + #我是前台项目 专门为前端提供接口 前后端分离 + 测试:http://localhost:18088/us-web/web/goods/info + druid数据库连接池信息查看:http://localhost:18088/us-web/druid web/123456 diff --git a/us_passManage/us-web/src/main/resources/logback.xml b/us_passManage/us-web/src/main/resources/logback.xml new file mode 100644 index 0000000..d3a24b1 --- /dev/null +++ b/us_passManage/us-web/src/main/resources/logback.xml @@ -0,0 +1,30 @@ +<!-- Logback configuration. See http://logback.qos.ch/manual/index.html --> +<configuration scan="true" scanPeriod="3 seconds"> + <include resource="org/springframework/boot/logging/logback/base.xml" /> + + <appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> + <File>~/data/us-servicelog.log</File> + <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> + <fileNamePattern>~/data/us-%d{yyyyMMdd}.log.%i</fileNamePattern> + <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP"> + <maxFileSize>500MB</maxFileSize> + </timeBasedFileNamingAndTriggeringPolicy> + <maxHistory>100</maxHistory> + </rollingPolicy> + <layout class="ch.qos.logback.classic.PatternLayout"> + <Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} -%msg%n + </Pattern> + </layout> + </appender> + <!--additivity 是否向上传递 true就会打印多次 false只打印1次--> + <logger name="com.passManage" level="DEBUG" additivity="false"> + <!--也可以选择其他的ref 来增加新的日志文件--> + <appender-ref ref="INFO_FILE" /> + <!--控制台是否打印--> + <appender-ref ref="CONSOLE" /> + </logger> + + <root level="INFO"> + <appender-ref ref="INFO_FILE" /> + </root> +</configuration> diff --git a/us_passManage/us.sql b/us_passManage/us.sql new file mode 100644 index 0000000..8058035 --- /dev/null +++ b/us_passManage/us.sql @@ -0,0 +1,313 @@ +/* +SQLyog Ultimate v12.09 (64 bit) +MySQL - 5.7.20-log : Database - us +********************************************************************* +*/ + + +/*!40101 SET NAMES utf8 */; + +/*!40101 SET SQL_MODE=''*/; + +/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */; +/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */; +/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */; +/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */; +CREATE DATABASE /*!32312 IF NOT EXISTS*/`us` /*!40100 DEFAULT CHARACTER SET utf8mb4 */; + +USE `us`; + +/*Table structure for table `all_type` */ + +DROP TABLE IF EXISTS `all_type`; + +CREATE TABLE `all_type` ( + `long_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', + `bytes_binary` binary(1) DEFAULT NULL, + `bytes_blob` blob, + `bytes_mediumblob` mediumblob, + `bytes_varbinary` varbinary(200) DEFAULT NULL, + `bytes_tinyblob` tinyblob, + `bytes_longblob` longblob, + `boolean_bit` bit(1) DEFAULT NULL, + `boolean_bool` tinyint(1) DEFAULT NULL, + `boolean_boolean` tinyint(1) DEFAULT NULL, + `string_enum` enum('1','2') DEFAULT NULL, + `string_char` char(1) DEFAULT NULL, + `string_longtext` longtext, + `string_mediumtext` mediumtext, + `string_varchar` varchar(200) DEFAULT NULL, + `string_set` set('a','b') DEFAULT NULL, + `string_tinytext` tinytext, + `string_text` text, + `byte_tinyint` tinyint(4) DEFAULT NULL, + `short_smallint` smallint(6) DEFAULT NULL, + `integer_int` int(11) DEFAULT NULL, + `integer_mediumint` mediumint(9) DEFAULT NULL, + `float_float` float DEFAULT NULL, + `double_double` double DEFAULT NULL, + `double_real` double DEFAULT NULL, + `bigdecimal_decimal` decimal(10,0) DEFAULT NULL, + `bigdecimal_numeric` decimal(10,0) DEFAULT NULL, + `date_date` date DEFAULT NULL, + `date_year` year(4) DEFAULT NULL, + `time_time` time DEFAULT NULL, + `timestemp_datetime` datetime DEFAULT NULL, + `timestemp_timestemp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + PRIMARY KEY (`long_id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4; + +/*Data for the table `all_type` */ + +insert into `all_type`(`long_id`,`bytes_binary`,`bytes_blob`,`bytes_mediumblob`,`bytes_varbinary`,`bytes_tinyblob`,`bytes_longblob`,`boolean_bit`,`boolean_bool`,`boolean_boolean`,`string_enum`,`string_char`,`string_longtext`,`string_mediumtext`,`string_varchar`,`string_set`,`string_tinytext`,`string_text`,`byte_tinyint`,`short_smallint`,`integer_int`,`integer_mediumint`,`float_float`,`double_double`,`double_real`,`bigdecimal_decimal`,`bigdecimal_numeric`,`date_date`,`date_year`,`time_time`,`timestemp_datetime`,`timestemp_timestemp`) values (1,'','','','','','','',1,1,'1','1','1','1','1','a','1','1',1,1,1,1,1,1,1,'1','1','2018-08-30',2018,'09:59:26','2018-08-29 09:42:48','2018-08-29 09:59:28'); + +/*Table structure for table `dict` */ + +DROP TABLE IF EXISTS `dict`; + +CREATE TABLE `dict` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', + `dict_category` varchar(50) NOT NULL DEFAULT '0' COMMENT '字典大类', + `code` varchar(50) NOT NULL DEFAULT '' COMMENT '编码', + `name` varchar(300) NOT NULL DEFAULT '' COMMENT '名称', + `dict_description` longtext COMMENT '描述', + `parent_id` bigint(20) DEFAULT NULL COMMENT '所属父类', + `create_time` datetime NOT NULL COMMENT '创建时间', + `update_time` datetime NOT NULL COMMENT '更新时间', + `order_no` tinyint(3) DEFAULT '0' COMMENT '序号', + PRIMARY KEY (`id`), + UNIQUE KEY `UK_CODE` (`code`) +) ENGINE=InnoDB AUTO_INCREMENT=337 DEFAULT CHARSET=utf8mb4 COMMENT='字典'; + +/*Data for the table `dict` */ + +insert into `dict`(`id`,`dict_category`,`code`,`name`,`dict_description`,`parent_id`,`create_time`,`update_time`,`order_no`) values (331,'类目列表','1-cloth','衣服','一级类目衣服',NULL,'2018-09-10 09:21:25','2018-09-10 09:21:27',2),(332,'类目列表','1-food','食品','1级食品类目',NULL,'2018-09-10 09:23:15','2018-09-10 09:23:17',1),(333,'系统配置','a-sys_config','系统配置','',NULL,'2018-09-10 09:24:42','2018-09-10 09:24:44',1),(334,'类目列表','2-coat','上衣','二级类目',331,'2018-09-10 09:25:17','2018-09-10 09:25:19',1),(335,'类目列表','2-hat','帽子','',331,'2018-09-10 09:25:41','2018-09-10 09:25:44',2),(336,'类目列表','2-apple','苹果','二级类目',332,'2018-09-10 09:26:27','2018-09-10 09:26:29',1); + +/*Table structure for table `goods` */ + +DROP TABLE IF EXISTS `goods`; + +CREATE TABLE `goods` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', + `goods_name` varchar(200) DEFAULT '' COMMENT '商品名', + `publish_status` char(1) DEFAULT NULL COMMENT '是否发布', + `goods_status` tinyint(2) DEFAULT '0' COMMENT '商品状态', + `price` decimal(12,2) DEFAULT NULL COMMENT '价格', + `store_count` int(4) DEFAULT '0' COMMENT '库存', + `short_brief` text COMMENT '简介', + `goods_description` longtext COMMENT '商品描述', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `img_src` varchar(200) DEFAULT '' COMMENT '图片', + `goods_category_id` bigint(20) DEFAULT NULL COMMENT '所属类目', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=102 DEFAULT CHARSET=utf8; + +/*Data for the table `goods` */ + +insert into `goods`(`id`,`goods_name`,`publish_status`,`goods_status`,`price`,`store_count`,`short_brief`,`goods_description`,`create_time`,`update_time`,`img_src`,`goods_category_id`) values (46,'上衣','0',2,'111.00',0,'111','<img src=\"upload/20180903153250_674545.jpg\" alt=\"657544268260012985.jpg\">33gg','2018-08-03 00:00:00','2018-08-30 15:07:36','upload/20180903153310_699995.jpg',2),(90,'鞋子','0',2,'99.00',100,'简介','描述','2018-09-03 11:24:00','2018-09-03 11:07:00','',2),(92,'帽子','0',2,'99.00',100,'简介','描述','2018-09-06 00:00:00','2018-09-03 11:07:00','1',1),(93,'大衣','0',2,'99.00',100,'简介','描述','2018-09-08 20:26:56','2018-09-03 11:07:00','1',1),(100,'电脑','0',2,'99.00',100,'简介','描述','2018-09-08 00:00:00','2018-09-03 11:07:00','1',1),(101,'苹果','0',2,'99.00',100,'简介','描述',NULL,'2018-09-03 11:07:00','1',1); + +/*Table structure for table `goods_category` */ + +DROP TABLE IF EXISTS `goods_category`; + +CREATE TABLE `goods_category` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID', + `name` varchar(50) DEFAULT '' COMMENT '分类名称', + `keyword` varchar(50) DEFAULT '' COMMENT '关键词', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; + +/*Data for the table `goods_category` */ + +insert into `goods_category`(`id`,`name`,`keyword`) values (1,'服装类目','搜索fz'),(2,'鞋子类目','xiezi'),(3,'饮食类目','yinshi'); + +/*Table structure for table `goods_file` */ + +DROP TABLE IF EXISTS `goods_file`; + +CREATE TABLE `goods_file` ( + `file_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', + `file_src` varchar(100) DEFAULT '' COMMENT '文件地址', + `goods_id` bigint(20) DEFAULT NULL COMMENT '所属商品', + PRIMARY KEY (`file_id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='商品附件'; + +/*Data for the table `goods_file` */ + +insert into `goods_file`(`file_id`,`file_src`,`goods_id`) values (1,'upload/20180910090629_408275.jpg',92); + +/*Table structure for table `goods_img` */ + +DROP TABLE IF EXISTS `goods_img`; + +CREATE TABLE `goods_img` ( + `img_id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', + `img_src` varchar(100) DEFAULT '' COMMENT '图片地址', + `goods_id` bigint(20) DEFAULT NULL COMMENT '所属商品', + PRIMARY KEY (`img_id`) +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8mb4 COMMENT='商品图集'; + +/*Data for the table `goods_img` */ + +insert into `goods_img`(`img_id`,`img_src`,`goods_id`) values (1,'',92); + +/*Table structure for table `sys_admin_user` */ + +DROP TABLE IF EXISTS `sys_admin_user`; + +CREATE TABLE `sys_admin_user` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', + `username` varchar(20) DEFAULT '' COMMENT '用户名', + `password` varchar(50) DEFAULT '' COMMENT '密码', + `real_name` varchar(25) DEFAULT '' COMMENT '真名', + `email` varchar(30) DEFAULT '' COMMENT '邮箱', + `telephone` varchar(20) DEFAULT '' COMMENT '座机号', + `mobile_phone` varchar(20) DEFAULT '' COMMENT '手机号', + `address` varchar(100) DEFAULT '' COMMENT '地址', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + `update_time` datetime DEFAULT NULL COMMENT '更新时间', + `role_id` bigint(20) DEFAULT '0' COMMENT '角色', + `account_non_expired` tinyint(1) DEFAULT '0' COMMENT '是否未失效', + `account_non_locked` tinyint(1) DEFAULT '0' COMMENT '是否未锁定', + `credentials_non_expired` tinyint(1) DEFAULT NULL COMMENT '是否未失效', + `enabled` tinyint(1) DEFAULT NULL COMMENT '是否可用', + PRIMARY KEY (`id`), + UNIQUE KEY `uk_user_name` (`username`), + KEY `s_a_r_id` (`role_id`) +) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8; + +/*Data for the table `sys_admin_user` */ + +insert into `sys_admin_user`(`id`,`username`,`password`,`real_name`,`email`,`telephone`,`mobile_phone`,`address`,`create_time`,`update_time`,`role_id`,`account_non_expired`,`account_non_locked`,`credentials_non_expired`,`enabled`) values (3,'admin','21232f297a57a5a743894a0e4a801fc3','管理员','','','','','2018-07-30 00:00:00','2018-07-30 00:00:00',1,0,0,0,1),(4,'test','098f6bcd4621d373cade4e832627b4f6','测试人员','','','','','2018-09-03 00:00:00','2018-09-03 00:00:00',2,0,0,0,1),(7,'magicalcoder','6860c37b00ed4e444a7d2c6e8fb66886','系统默认超级管理员账号','','','','','2018-09-06 00:00:00','2018-09-06 00:00:00',1,0,0,0,1); + +/*Table structure for table `sys_global_permit_url` */ + +DROP TABLE IF EXISTS `sys_global_permit_url`; + +CREATE TABLE `sys_global_permit_url` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', + `permit_name` varchar(200) DEFAULT '' COMMENT '通过名称', + `backend_url_reg` varchar(500) DEFAULT '' COMMENT '后端的地址正则,校验当前请求url是否有权限,get|post统一会按照参数首字母排序', + `module_id` bigint(20) DEFAULT NULL COMMENT '所属模块', + PRIMARY KEY (`id`), + KEY `sy_m_id` (`module_id`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='后端请求地址全局允许过滤器,在此表的统一不用再去权限表匹配了'; + +/*Data for the table `sys_global_permit_url` */ + +insert into `sys_global_permit_url`(`id`,`permit_name`,`backend_url_reg`,`module_id`) values (2,'允许进入后台,使用有些通用接口(请勿删除)','/admin/(rmp|page|page_v2|common_file_rest).*',NULL),(3,'通用获取权限相关接口(请勿删除)','/admin/rest_rmp/(get_permission_list|get_module_list|user_info).*',NULL); + +/*Table structure for table `sys_log_admin_operate` */ + +DROP TABLE IF EXISTS `sys_log_admin_operate`; + +CREATE TABLE `sys_log_admin_operate` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', + `admin_user_id` bigint(20) DEFAULT '0' COMMENT '管理员', + `user_name` varchar(200) DEFAULT '0' COMMENT '管理员名称', + `table_name` varchar(100) DEFAULT '' COMMENT '表名', + `operate_type` varchar(50) DEFAULT '' COMMENT '操作类型', + `url` varchar(100) DEFAULT '' COMMENT '链接', + `primary_id_value` varchar(100) DEFAULT '' COMMENT '主键值', + `form_body` text COMMENT '提交内容', + `create_time` datetime DEFAULT NULL COMMENT '创建时间', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=309 DEFAULT CHARSET=utf8; + +/*Data for the table `sys_log_admin_operate` */ + +insert into `sys_log_admin_operate`(`id`,`admin_user_id`,`user_name`,`table_name`,`operate_type`,`url`,`primary_id_value`,`form_body`,`create_time`) values (308,3,'管理员','sys_log_admin_operate_rest','delete','/admin/sys_log_admin_operate_rest/delete/307','','{}','2018-09-10 17:00:43'); + +/*Table structure for table `sys_module` */ + +DROP TABLE IF EXISTS `sys_module`; + +CREATE TABLE `sys_module` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', + `module_name` varchar(200) DEFAULT '' COMMENT '模块唯一键', + `module_url` varchar(200) DEFAULT '' COMMENT '模块URL', + `module_category_id` bigint(20) DEFAULT '0' COMMENT '模块分类', + `sort_num` int(2) DEFAULT '0' COMMENT '排序', + `module_title` varchar(50) DEFAULT '' COMMENT '模块标题', + `if_show` tinyint(1) DEFAULT '1' COMMENT '是否显示', + PRIMARY KEY (`id`), + KEY `FK_module` (`module_category_id`) +) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8 COMMENT='模块'; + +/*Data for the table `sys_module` */ + +insert into `sys_module`(`id`,`module_name`,`module_url`,`module_category_id`,`sort_num`,`module_title`,`if_show`) values (1,'goods','admin/page_v2/goods/list',1,1,'商品管理',1),(2,'goods_category','admin/page_v2/goods_category/list',1,2,'商品类别',1),(4,'sys_log_admin_operate','admin/page_v2/sys_log_admin_operate/list',3,7,'系统日志',1),(5,'sys_module_category','admin/page_v2/sys_module_category/list',3,1,'菜单管理',1),(7,'sys_admin_user','admin/page_v2/sys_admin_user/list',3,3,'管理员',1),(8,'sys_global_permit_url','admin/page_v2/sys_global_permit_url/list',3,6,'全局地址过滤',1),(11,'sys_role','admin/page_v2/sys_role/list',3,2,'角色管理',1),(14,'all_type','admin/page_v2/all_type/list',1,3,'全类型测试',0),(17,'sys','',3,-1,'系统表权限载体(请勿删除)',0),(18,'goods_img','admin/page_v2/goods_img/list',1,4,'商品图集',1),(19,'goods_file','admin/page_v2/goods_file/list',1,5,'商品附件',1),(20,'dict','admin/page_v2/dict/list',3,10,'字典配置',1); + +/*Table structure for table `sys_module_category` */ + +DROP TABLE IF EXISTS `sys_module_category`; + +CREATE TABLE `sys_module_category` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', + `module_category_name` varchar(20) DEFAULT '' COMMENT '模块名称', + `sort_num` int(2) DEFAULT '0' COMMENT '排序', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COMMENT='模块分类'; + +/*Data for the table `sys_module_category` */ + +insert into `sys_module_category`(`id`,`module_category_name`,`sort_num`) values (1,'商品模块',1),(3,'系统模块',2); + +/*Table structure for table `sys_permission` */ + +DROP TABLE IF EXISTS `sys_permission`; + +CREATE TABLE `sys_permission` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', + `permission_name` varchar(50) DEFAULT '' COMMENT '过滤器名称:审核通过', + `filter_platform` varchar(50) DEFAULT '' COMMENT '过滤端:front|backend|front_backend', + `backend_url_reg` varchar(200) DEFAULT '' COMMENT '后端的地址正则,校验当前请求url是否有权限,get|post统一会按照参数首字母排序', + `front_dom` varchar(1024) DEFAULT '' COMMENT '前端Key,多个逗号分割', + `front_action` varchar(50) DEFAULT '' COMMENT '前端处理方式show|disabled', + `module_id` bigint(20) DEFAULT NULL COMMENT '所属模块', + PRIMARY KEY (`id`), + KEY `sy_m_id` (`module_id`) +) ENGINE=InnoDB AUTO_INCREMENT=26 DEFAULT CHARSET=utf8 COMMENT='后端请求地址允许过滤器,不在过滤器的统一拒绝'; + +/*Data for the table `sys_permission` */ + +insert into `sys_permission`(`id`,`permission_name`,`filter_platform`,`backend_url_reg`,`front_dom`,`front_action`,`module_id`) values (2,'查询权限','backend','/admin/goods_category_rest/.*','','',2),(13,'全类型测试','backend','/admin/all_type_rest/.*',NULL,'',14),(15,'商品模块保存权限','front_backend','/admin/goods_rest/(update|save).*','.security_edit_form_operate_save','show',1),(17,'商品模块添加按钮','front','','.security_list_query_operate_add_news','show',1),(18,'商品模块(批量)删除权限','front_backend','/admin/goods_rest/(delete|batch_delete).*','.security_list_table_operate_del,.security_list_query_operate_del_all','show',1),(19,'商品模块查询权限','backend','/admin/goods_rest/(search|page|get).*','','',1),(21,'所有系统表的所有权限(请勿删除)','backend','/admin/(rest_rmp|sys_[a-z_]+_rest)/.*','','show',17),(22,'测试商品模块disabled','front','','.security_edit_form_param_goodsName,.security_edit_form_param_imgSrc,.security_edit_form_param_publishStatus,.security_edit_form_param_goodsStatus,.security_edit_form_param_price,.security_edit_form_param_shortBrief,.security_edit_form_param_goodsDescription,.security_edit_form_param_createTime,.security_edit_form_param_goodsCategoryId','show',1),(23,'商品图集全部权限','front_backend','/admin/goods_img_rest/.*','','show',18),(24,'商品附件全部权限','front_backend','/admin/goods_file_rest/.*','','show',19),(25,'字典全部权限','front_backend','/admin/dict_rest/.*','','show',20); + +/*Table structure for table `sys_role` */ + +DROP TABLE IF EXISTS `sys_role`; + +CREATE TABLE `sys_role` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', + `role_name` varchar(20) DEFAULT '' COMMENT '角色名', + PRIMARY KEY (`id`) +) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 CHECKSUM=1 DELAY_KEY_WRITE=1 ROW_FORMAT=DYNAMIC COMMENT='角色'; + +/*Data for the table `sys_role` */ + +insert into `sys_role`(`id`,`role_name`) values (1,'超级管理员'),(2,'测试账号'); + +/*Table structure for table `sys_role_module_permission` */ + +DROP TABLE IF EXISTS `sys_role_module_permission`; + +CREATE TABLE `sys_role_module_permission` ( + `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '主键', + `role_id` bigint(20) DEFAULT NULL COMMENT '角色', + `module_id` bigint(20) DEFAULT NULL COMMENT '模块', + `permission_id` bigint(20) DEFAULT NULL COMMENT '权限', + PRIMARY KEY (`id`), + KEY `s_r_id` (`role_id`), + KEY `s_m_id` (`module_id`), + KEY `s_pid` (`permission_id`) +) ENGINE=InnoDB AUTO_INCREMENT=433 DEFAULT CHARSET=utf8 COMMENT='角色模块权限'; + +/*Data for the table `sys_role_module_permission` */ + +insert into `sys_role_module_permission`(`id`,`role_id`,`module_id`,`permission_id`) values (407,1,1,15),(408,1,1,17),(409,1,1,18),(410,1,1,19),(411,1,1,22),(412,1,2,2),(413,1,14,13),(414,1,18,23),(415,1,19,24),(416,1,4,NULL),(417,1,5,NULL),(418,1,6,NULL),(419,1,7,NULL),(420,1,8,NULL),(421,1,9,NULL),(422,1,10,NULL),(423,1,11,NULL),(424,1,17,21),(425,1,20,25),(426,2,1,15),(427,2,1,17),(428,2,1,18),(429,2,1,19),(430,2,1,22),(431,2,18,NULL),(432,2,19,NULL); + +/*!40101 SET SQL_MODE=@OLD_SQL_MODE */; +/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */; +/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */; +/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; diff --git a/us_passManage/windows-clean.bat b/us_passManage/windows-clean.bat new file mode 100644 index 0000000..a17a085 --- /dev/null +++ b/us_passManage/windows-clean.bat @@ -0,0 +1,8 @@ +set JAVA_HOME=%CD%\..\..\jdk\jdk1.8.0_45 + +set M2_HOME=%CD%\..\apache-maven-3.3.9 + +set PATH=%JAVA_HOME%\bin;%M2_HOME%\bin; + + +mvn clean diff --git a/us_passManage/windows-restart.bat b/us_passManage/windows-restart.bat new file mode 100644 index 0000000..ce84d5b --- /dev/null +++ b/us_passManage/windows-restart.bat @@ -0,0 +1,8 @@ +title ڶ us̨ ҪصѾʵ + +@call redis.bat + +@call windows-stop.bat + +@call windows-us-package.bat + diff --git a/us_passManage/windows-start.bat b/us_passManage/windows-start.bat new file mode 100644 index 0000000..0358cab --- /dev/null +++ b/us_passManage/windows-start.bat @@ -0,0 +1,6 @@ +title ڶ us̨ ҪصѾʵ + +@call redis.bat + +@call windows-us-package.bat + diff --git a/us_passManage/windows-stop.bat b/us_passManage/windows-stop.bat new file mode 100644 index 0000000..e9063c3 --- /dev/null +++ b/us_passManage/windows-stop.bat @@ -0,0 +1,8 @@ +@echo off +setlocal enabledelayedexpansion +for /f "delims= tokens=1" %%i in ('netstat -aon ^| findstr "18080"') do ( +set a=%%i +goto js +) +:js +taskkill /f /pid "!a:~71,5!" diff --git a/us_passManage/windows-us-package.bat b/us_passManage/windows-us-package.bat new file mode 100644 index 0000000..19efacc --- /dev/null +++ b/us_passManage/windows-us-package.bat @@ -0,0 +1,10 @@ + +set JAVA_HOME=%CD%\..\..\jdk\jdk1.8.0_45 + +set M2_HOME=%CD%\..\apache-maven-3.3.9 + +set PATH=%JAVA_HOME%\bin;%M2_HOME%\bin; + + +mvn -Pus-admin test +