├── .gitignore ├── .mvn └── wrapper │ ├── maven-wrapper.jar │ └── maven-wrapper.properties ├── LICENSE ├── README.md ├── mvnw ├── mvnw.cmd ├── pom.xml └── src ├── main ├── java │ └── com │ │ └── chaimm │ │ └── ai │ │ ├── AiApplication.java │ │ ├── Controller.java │ │ ├── entity │ │ ├── Parameter.java │ │ └── Result.java │ │ ├── exception │ │ └── CommonExp.java │ │ ├── init │ │ └── InitToken.java │ │ └── utils │ │ ├── AESDecode.java │ │ ├── HttpRequest.java │ │ └── ImageTool.java └── resources │ ├── application.properties │ └── static │ ├── MP_verify_zX653yqGo8weD6jY.txt │ ├── css │ ├── common.css │ ├── demo.css │ ├── dialog-jim.css │ ├── dialog-wilma.css │ ├── dialog.css │ ├── htmleaf-demo.css │ ├── normalize.css │ └── swiper.min.css │ ├── fonts │ ├── icomoon.eot │ ├── icomoon.svg │ ├── icomoon.ttf │ └── icomoon.woff │ ├── html │ ├── data.json │ ├── finish.html │ ├── index.html │ ├── result.html │ └── result2.html │ ├── images │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── Asleep.png │ ├── Awake.png │ ├── arrow.png │ ├── bk1.png │ ├── bk2.jpg │ ├── bk3.jpg │ ├── bk4.jpg │ ├── bk5.jpg │ ├── chakanjieguo.png │ ├── demo.png │ ├── desc.png │ ├── desc1.png │ ├── desc2.png │ ├── desc3.png │ ├── desc_old.png │ ├── free.png │ ├── free_old.png │ ├── man.png │ ├── photo.png │ ├── photo_old.png │ ├── plus.png │ ├── qrcode.jpg │ ├── reco.jpg │ ├── result14.png │ ├── result15.png │ ├── save.png │ ├── startAnalysis.png │ ├── startAnalysis_old.png │ ├── takePhoto.png │ ├── takePhoto_old.png │ ├── title.png │ ├── title2.png │ ├── title3.png │ ├── title4.png │ └── title5.png │ └── js │ ├── canvas.js │ ├── classie.js │ ├── common.js │ ├── dialogFx.js │ ├── modernizr.custom.js │ ├── parameter.js │ ├── sha1.js │ ├── snap.svg-min.js │ ├── swiper.jquery.min.js │ └── swiper.min.js └── test └── java └── com └── chaimm └── ai └── AiApplicationTests.java /.gitignore: -------------------------------------------------------------------------------- 1 | target/ 2 | !.mvn/wrapper/maven-wrapper.jar 3 | 4 | ### STS ### 5 | .apt_generated 6 | .classpath 7 | .factorypath 8 | .project 9 | .settings 10 | .springBeans 11 | 12 | ### IntelliJ IDEA ### 13 | .idea 14 | *.iws 15 | *.iml 16 | *.ipr 17 | 18 | ### NetBeans ### 19 | nbproject/private/ 20 | build/ 21 | nbbuild/ 22 | dist/ 23 | nbdist/ 24 | .nb-gradle/ -------------------------------------------------------------------------------- /.mvn/wrapper/maven-wrapper.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/.mvn/wrapper/maven-wrapper.jar -------------------------------------------------------------------------------- /.mvn/wrapper/maven-wrapper.properties: -------------------------------------------------------------------------------- 1 | distributionUrl=https://repo1.maven.org/maven2/org/apache/maven/apache-maven/3.5.2/apache-maven-3.5.2-bin.zip 2 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## 首页 4 | ![](src/main/resources/static/images/1.png) 5 | 6 | ## 上传图片 7 | ![](src/main/resources/static/images/2.png) 8 | 9 | ## 特征点识别 10 | ![](src/main/resources/static/images/3.png) 11 | 12 | ## 面相分析 13 | ![](src/main/resources/static/images/4.png) -------------------------------------------------------------------------------- /mvnw: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | # ---------------------------------------------------------------------------- 3 | # Licensed to the Apache Software Foundation (ASF) under one 4 | # or more contributor license agreements. See the NOTICE file 5 | # distributed with this work for additional information 6 | # regarding copyright ownership. The ASF licenses this file 7 | # to you under the Apache License, Version 2.0 (the 8 | # "License"); you may not use this file except in compliance 9 | # with the License. You may obtain a copy of the License at 10 | # 11 | # http://www.apache.org/licenses/LICENSE-2.0 12 | # 13 | # Unless required by applicable law or agreed to in writing, 14 | # software distributed under the License is distributed on an 15 | # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 | # KIND, either express or implied. See the License for the 17 | # specific language governing permissions and limitations 18 | # under the License. 19 | # ---------------------------------------------------------------------------- 20 | 21 | # ---------------------------------------------------------------------------- 22 | # Maven2 Start Up Batch script 23 | # 24 | # Required ENV vars: 25 | # ------------------ 26 | # JAVA_HOME - location of a JDK home dir 27 | # 28 | # Optional ENV vars 29 | # ----------------- 30 | # M2_HOME - location of maven2's installed home dir 31 | # MAVEN_OPTS - parameters passed to the Java VM when running Maven 32 | # e.g. to debug Maven itself, use 33 | # set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 34 | # MAVEN_SKIP_RC - flag to disable loading of mavenrc files 35 | # ---------------------------------------------------------------------------- 36 | 37 | if [ -z "$MAVEN_SKIP_RC" ] ; then 38 | 39 | if [ -f /etc/mavenrc ] ; then 40 | . /etc/mavenrc 41 | fi 42 | 43 | if [ -f "$HOME/.mavenrc" ] ; then 44 | . "$HOME/.mavenrc" 45 | fi 46 | 47 | fi 48 | 49 | # OS specific support. $var _must_ be set to either true or false. 50 | cygwin=false; 51 | darwin=false; 52 | mingw=false 53 | case "`uname`" in 54 | CYGWIN*) cygwin=true ;; 55 | MINGW*) mingw=true;; 56 | Darwin*) darwin=true 57 | # Use /usr/libexec/java_home if available, otherwise fall back to /Library/Java/Home 58 | # See https://developer.apple.com/library/mac/qa/qa1170/_index.html 59 | if [ -z "$JAVA_HOME" ]; then 60 | if [ -x "/usr/libexec/java_home" ]; then 61 | export JAVA_HOME="`/usr/libexec/java_home`" 62 | else 63 | export JAVA_HOME="/Library/Java/Home" 64 | fi 65 | fi 66 | ;; 67 | esac 68 | 69 | if [ -z "$JAVA_HOME" ] ; then 70 | if [ -r /etc/gentoo-release ] ; then 71 | JAVA_HOME=`java-config --jre-home` 72 | fi 73 | fi 74 | 75 | if [ -z "$M2_HOME" ] ; then 76 | ## resolve links - $0 may be a link to maven's home 77 | PRG="$0" 78 | 79 | # need this for relative symlinks 80 | while [ -h "$PRG" ] ; do 81 | ls=`ls -ld "$PRG"` 82 | link=`expr "$ls" : '.*-> \(.*\)$'` 83 | if expr "$link" : '/.*' > /dev/null; then 84 | PRG="$link" 85 | else 86 | PRG="`dirname "$PRG"`/$link" 87 | fi 88 | done 89 | 90 | saveddir=`pwd` 91 | 92 | M2_HOME=`dirname "$PRG"`/.. 93 | 94 | # make it fully qualified 95 | M2_HOME=`cd "$M2_HOME" && pwd` 96 | 97 | cd "$saveddir" 98 | # echo Using m2 at $M2_HOME 99 | fi 100 | 101 | # For Cygwin, ensure paths are in UNIX format before anything is touched 102 | if $cygwin ; then 103 | [ -n "$M2_HOME" ] && 104 | M2_HOME=`cygpath --unix "$M2_HOME"` 105 | [ -n "$JAVA_HOME" ] && 106 | JAVA_HOME=`cygpath --unix "$JAVA_HOME"` 107 | [ -n "$CLASSPATH" ] && 108 | CLASSPATH=`cygpath --path --unix "$CLASSPATH"` 109 | fi 110 | 111 | # For Migwn, ensure paths are in UNIX format before anything is touched 112 | if $mingw ; then 113 | [ -n "$M2_HOME" ] && 114 | M2_HOME="`(cd "$M2_HOME"; pwd)`" 115 | [ -n "$JAVA_HOME" ] && 116 | JAVA_HOME="`(cd "$JAVA_HOME"; pwd)`" 117 | # TODO classpath? 118 | fi 119 | 120 | if [ -z "$JAVA_HOME" ]; then 121 | javaExecutable="`which javac`" 122 | if [ -n "$javaExecutable" ] && ! [ "`expr \"$javaExecutable\" : '\([^ ]*\)'`" = "no" ]; then 123 | # readlink(1) is not available as standard on Solaris 10. 124 | readLink=`which readlink` 125 | if [ ! `expr "$readLink" : '\([^ ]*\)'` = "no" ]; then 126 | if $darwin ; then 127 | javaHome="`dirname \"$javaExecutable\"`" 128 | javaExecutable="`cd \"$javaHome\" && pwd -P`/javac" 129 | else 130 | javaExecutable="`readlink -f \"$javaExecutable\"`" 131 | fi 132 | javaHome="`dirname \"$javaExecutable\"`" 133 | javaHome=`expr "$javaHome" : '\(.*\)/bin'` 134 | JAVA_HOME="$javaHome" 135 | export JAVA_HOME 136 | fi 137 | fi 138 | fi 139 | 140 | if [ -z "$JAVACMD" ] ; then 141 | if [ -n "$JAVA_HOME" ] ; then 142 | if [ -x "$JAVA_HOME/jre/sh/java" ] ; then 143 | # IBM's JDK on AIX uses strange locations for the executables 144 | JAVACMD="$JAVA_HOME/jre/sh/java" 145 | else 146 | JAVACMD="$JAVA_HOME/bin/java" 147 | fi 148 | else 149 | JAVACMD="`which java`" 150 | fi 151 | fi 152 | 153 | if [ ! -x "$JAVACMD" ] ; then 154 | echo "Error: JAVA_HOME is not defined correctly." >&2 155 | echo " We cannot execute $JAVACMD" >&2 156 | exit 1 157 | fi 158 | 159 | if [ -z "$JAVA_HOME" ] ; then 160 | echo "Warning: JAVA_HOME environment variable is not set." 161 | fi 162 | 163 | CLASSWORLDS_LAUNCHER=org.codehaus.plexus.classworlds.launcher.Launcher 164 | 165 | # traverses directory structure from process work directory to filesystem root 166 | # first directory with .mvn subdirectory is considered project base directory 167 | find_maven_basedir() { 168 | 169 | if [ -z "$1" ] 170 | then 171 | echo "Path not specified to find_maven_basedir" 172 | return 1 173 | fi 174 | 175 | basedir="$1" 176 | wdir="$1" 177 | while [ "$wdir" != '/' ] ; do 178 | if [ -d "$wdir"/.mvn ] ; then 179 | basedir=$wdir 180 | break 181 | fi 182 | # workaround for JBEAP-8937 (on Solaris 10/Sparc) 183 | if [ -d "${wdir}" ]; then 184 | wdir=`cd "$wdir/.."; pwd` 185 | fi 186 | # end of workaround 187 | done 188 | echo "${basedir}" 189 | } 190 | 191 | # concatenates all lines of a file 192 | concat_lines() { 193 | if [ -f "$1" ]; then 194 | echo "$(tr -s '\n' ' ' < "$1")" 195 | fi 196 | } 197 | 198 | BASE_DIR=`find_maven_basedir "$(pwd)"` 199 | if [ -z "$BASE_DIR" ]; then 200 | exit 1; 201 | fi 202 | 203 | export MAVEN_PROJECTBASEDIR=${MAVEN_BASEDIR:-"$BASE_DIR"} 204 | echo $MAVEN_PROJECTBASEDIR 205 | MAVEN_OPTS="$(concat_lines "$MAVEN_PROJECTBASEDIR/.mvn/jvm.config") $MAVEN_OPTS" 206 | 207 | # For Cygwin, switch paths to Windows format before running java 208 | if $cygwin; then 209 | [ -n "$M2_HOME" ] && 210 | M2_HOME=`cygpath --path --windows "$M2_HOME"` 211 | [ -n "$JAVA_HOME" ] && 212 | JAVA_HOME=`cygpath --path --windows "$JAVA_HOME"` 213 | [ -n "$CLASSPATH" ] && 214 | CLASSPATH=`cygpath --path --windows "$CLASSPATH"` 215 | [ -n "$MAVEN_PROJECTBASEDIR" ] && 216 | MAVEN_PROJECTBASEDIR=`cygpath --path --windows "$MAVEN_PROJECTBASEDIR"` 217 | fi 218 | 219 | WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain 220 | 221 | exec "$JAVACMD" \ 222 | $MAVEN_OPTS \ 223 | -classpath "$MAVEN_PROJECTBASEDIR/.mvn/wrapper/maven-wrapper.jar" \ 224 | "-Dmaven.home=${M2_HOME}" "-Dmaven.multiModuleProjectDirectory=${MAVEN_PROJECTBASEDIR}" \ 225 | ${WRAPPER_LAUNCHER} $MAVEN_CONFIG "$@" 226 | -------------------------------------------------------------------------------- /mvnw.cmd: -------------------------------------------------------------------------------- 1 | @REM ---------------------------------------------------------------------------- 2 | @REM Licensed to the Apache Software Foundation (ASF) under one 3 | @REM or more contributor license agreements. See the NOTICE file 4 | @REM distributed with this work for additional information 5 | @REM regarding copyright ownership. The ASF licenses this file 6 | @REM to you under the Apache License, Version 2.0 (the 7 | @REM "License"); you may not use this file except in compliance 8 | @REM with the License. You may obtain a copy of the License at 9 | @REM 10 | @REM http://www.apache.org/licenses/LICENSE-2.0 11 | @REM 12 | @REM Unless required by applicable law or agreed to in writing, 13 | @REM software distributed under the License is distributed on an 14 | @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 15 | @REM KIND, either express or implied. See the License for the 16 | @REM specific language governing permissions and limitations 17 | @REM under the License. 18 | @REM ---------------------------------------------------------------------------- 19 | 20 | @REM ---------------------------------------------------------------------------- 21 | @REM Maven2 Start Up Batch script 22 | @REM 23 | @REM Required ENV vars: 24 | @REM JAVA_HOME - location of a JDK home dir 25 | @REM 26 | @REM Optional ENV vars 27 | @REM M2_HOME - location of maven2's installed home dir 28 | @REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands 29 | @REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a key stroke before ending 30 | @REM MAVEN_OPTS - parameters passed to the Java VM when running Maven 31 | @REM e.g. to debug Maven itself, use 32 | @REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 33 | @REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files 34 | @REM ---------------------------------------------------------------------------- 35 | 36 | @REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' 37 | @echo off 38 | @REM enable echoing my setting MAVEN_BATCH_ECHO to 'on' 39 | @if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% 40 | 41 | @REM set %HOME% to equivalent of $HOME 42 | if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") 43 | 44 | @REM Execute a user defined script before this one 45 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre 46 | @REM check for pre script, once with legacy .bat ending and once with .cmd ending 47 | if exist "%HOME%\mavenrc_pre.bat" call "%HOME%\mavenrc_pre.bat" 48 | if exist "%HOME%\mavenrc_pre.cmd" call "%HOME%\mavenrc_pre.cmd" 49 | :skipRcPre 50 | 51 | @setlocal 52 | 53 | set ERROR_CODE=0 54 | 55 | @REM To isolate internal variables from possible post scripts, we use another setlocal 56 | @setlocal 57 | 58 | @REM ==== START VALIDATION ==== 59 | if not "%JAVA_HOME%" == "" goto OkJHome 60 | 61 | echo. 62 | echo Error: JAVA_HOME not found in your environment. >&2 63 | echo Please set the JAVA_HOME variable in your environment to match the >&2 64 | echo location of your Java installation. >&2 65 | echo. 66 | goto error 67 | 68 | :OkJHome 69 | if exist "%JAVA_HOME%\bin\java.exe" goto init 70 | 71 | echo. 72 | echo Error: JAVA_HOME is set to an invalid directory. >&2 73 | echo JAVA_HOME = "%JAVA_HOME%" >&2 74 | echo Please set the JAVA_HOME variable in your environment to match the >&2 75 | echo location of your Java installation. >&2 76 | echo. 77 | goto error 78 | 79 | @REM ==== END VALIDATION ==== 80 | 81 | :init 82 | 83 | @REM Find the project base dir, i.e. the directory that contains the folder ".mvn". 84 | @REM Fallback to current working directory if not found. 85 | 86 | set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% 87 | IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir 88 | 89 | set EXEC_DIR=%CD% 90 | set WDIR=%EXEC_DIR% 91 | :findBaseDir 92 | IF EXIST "%WDIR%"\.mvn goto baseDirFound 93 | cd .. 94 | IF "%WDIR%"=="%CD%" goto baseDirNotFound 95 | set WDIR=%CD% 96 | goto findBaseDir 97 | 98 | :baseDirFound 99 | set MAVEN_PROJECTBASEDIR=%WDIR% 100 | cd "%EXEC_DIR%" 101 | goto endDetectBaseDir 102 | 103 | :baseDirNotFound 104 | set MAVEN_PROJECTBASEDIR=%EXEC_DIR% 105 | cd "%EXEC_DIR%" 106 | 107 | :endDetectBaseDir 108 | 109 | IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig 110 | 111 | @setlocal EnableExtensions EnableDelayedExpansion 112 | for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a 113 | @endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% 114 | 115 | :endReadAdditionalConfig 116 | 117 | SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" 118 | 119 | set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" 120 | set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain 121 | 122 | %MAVEN_JAVA_EXE% %JVM_CONFIG_MAVEN_PROPS% %MAVEN_OPTS% %MAVEN_DEBUG_OPTS% -classpath %WRAPPER_JAR% "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* 123 | if ERRORLEVEL 1 goto error 124 | goto end 125 | 126 | :error 127 | set ERROR_CODE=1 128 | 129 | :end 130 | @endlocal & set ERROR_CODE=%ERROR_CODE% 131 | 132 | if not "%MAVEN_SKIP_RC%" == "" goto skipRcPost 133 | @REM check for post script, once with legacy .bat ending and once with .cmd ending 134 | if exist "%HOME%\mavenrc_post.bat" call "%HOME%\mavenrc_post.bat" 135 | if exist "%HOME%\mavenrc_post.cmd" call "%HOME%\mavenrc_post.cmd" 136 | :skipRcPost 137 | 138 | @REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' 139 | if "%MAVEN_BATCH_PAUSE%" == "on" pause 140 | 141 | if "%MAVEN_TERMINATE_CMD%" == "on" exit %ERROR_CODE% 142 | 143 | exit /B %ERROR_CODE% 144 | -------------------------------------------------------------------------------- /pom.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 4.0.0 5 | 6 | com.chaimm 7 | ai 8 | 0.0.1-SNAPSHOT 9 | war 10 | 11 | ai 12 | Demo project for Spring Boot 13 | 14 | 15 | org.springframework.boot 16 | spring-boot-starter-parent 17 | 1.5.9.RELEASE 18 | 19 | 20 | 21 | 22 | UTF-8 23 | UTF-8 24 | 1.8 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | org.springframework.boot 34 | spring-boot-starter-web 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | org.springframework.boot 44 | spring-boot-starter-test 45 | test 46 | 47 | 48 | 49 | com.alibaba 50 | fastjson 51 | 1.2.44 52 | 53 | 54 | 55 | org.springframework.boot 56 | spring-boot-starter-tomcat 57 | provided 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | org.springframework.boot 66 | spring-boot-maven-plugin 67 | 68 | 69 | 70 | 71 | 72 | 73 | -------------------------------------------------------------------------------- /src/main/java/com/chaimm/ai/AiApplication.java: -------------------------------------------------------------------------------- 1 | package com.chaimm.ai; 2 | 3 | import org.springframework.boot.SpringApplication; 4 | import org.springframework.boot.autoconfigure.SpringBootApplication; 5 | import org.springframework.boot.builder.SpringApplicationBuilder; 6 | import org.springframework.boot.web.support.SpringBootServletInitializer; 7 | 8 | @SpringBootApplication 9 | public class AiApplication extends SpringBootServletInitializer { 10 | 11 | @Override 12 | protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) { 13 | return builder.sources(AiApplication.class); 14 | } 15 | 16 | public static void main(String[] args) { 17 | SpringApplication.run(AiApplication.class, args); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /src/main/java/com/chaimm/ai/Controller.java: -------------------------------------------------------------------------------- 1 | package com.chaimm.ai; 2 | 3 | import com.alibaba.fastjson.JSONException; 4 | import com.alibaba.fastjson.JSONObject; 5 | import com.chaimm.ai.entity.Parameter; 6 | import com.chaimm.ai.entity.Result; 7 | import com.chaimm.ai.exception.CommonExp; 8 | import com.chaimm.ai.utils.HttpRequest; 9 | import com.chaimm.ai.utils.ImageTool; 10 | import org.springframework.web.bind.annotation.GetMapping; 11 | import org.springframework.web.bind.annotation.RestController; 12 | 13 | import java.io.*; 14 | import java.math.BigDecimal; 15 | import java.util.List; 16 | import java.util.Properties; 17 | import java.util.Random; 18 | 19 | import static com.chaimm.ai.entity.Parameter.*; 20 | 21 | /** 22 | * @author 大闲人柴毛毛 23 | * @date 2017/12/31 上午11:37 24 | * @description 25 | */ 26 | @RestController 27 | public class Controller { 28 | 29 | // @GetMapping("/") 30 | public String wxVerify(String signature, String timestamp, String nonce, String echostr){ 31 | return echostr; 32 | } 33 | 34 | @GetMapping("getJSTicket") 35 | public String getJSTicket(){ 36 | getAccessToken(); 37 | getTicket(); 38 | return Parameter.Ticket_Parameter; 39 | } 40 | 41 | private void getTicket() { 42 | //获取ticket 43 | String param = "access_token="+ Parameter.AccessToken_Parameters+"&type=jsapi"; 44 | String ticket_result = HttpRequest.sendGet("https://api.weixin.qq.com/cgi-bin/ticket/getticket", param); 45 | String ticket = ""; 46 | try { 47 | ticket = JSONObject.parseObject(ticket_result).getString("ticket"); 48 | } catch (JSONException e) { 49 | e.printStackTrace(); 50 | } 51 | Parameter.Ticket_Parameter = ticket; 52 | System.out.println("获取到的ticket="+ticket); 53 | // System.out.println("Parameter中的ticket="+Parameter.Ticket_Parameter); 54 | } 55 | 56 | // @GetMapping("getAccessToken") 57 | public String getAccessToken(){ 58 | //获取access_token 59 | String param = "grant_type=client_credential&appid="+APPID+"&secret="+SECRET; 60 | String access_token_result = HttpRequest.sendGet("https://api.weixin.qq.com/cgi-bin/token", param); 61 | String access_token = ""; 62 | try { 63 | access_token = JSONObject.parseObject(access_token_result).getString("access_token"); 64 | } catch (JSONException e) { 65 | e.printStackTrace(); 66 | } 67 | Parameter.AccessToken_Parameters = access_token; 68 | System.out.println("access_token="+access_token); 69 | return Parameter.AccessToken_Parameters; 70 | } 71 | 72 | 73 | @GetMapping("recognizeFace") 74 | public Result recognizeFace(String picId, String userToken){ 75 | 76 | // String accessToken = getAccessToken(); 77 | 78 | String fileName = HttpRequest.downloadByGet("http://file.api.weixin.qq.com/cgi-bin/media/get", "access_token="+Parameter.AccessToken_Parameters+"&media_id="+picId); 79 | System.out.println(fileName); 80 | 81 | //图片下载失败时:1.提示管理员,2.将pic_id保存至数据库,让管理员手动下载 82 | if(fileName==null){ 83 | return Result.newFailResult("文件上传失败!"); 84 | } 85 | 86 | try { 87 | // 识别图片 88 | JSONObject jsonObject = ImageTool.recognizeFace(URL_PATH+fileName); 89 | 90 | // 绘图 91 | String paintedFileName = ImageTool.paintImage(jsonObject, new File(Parameter.ABS_PATH+fileName)); 92 | 93 | // 老用户直接返回结果 94 | // System.out.println("userToken="+userToken); 95 | // String resultURL = Parameter.userResultMap.get(userToken); 96 | // System.out.println("resultURL="+resultURL); 97 | // if (resultURL != null && !resultURL.equals("")) { 98 | // return buildResult(jsonObject, paintedFileName, resultURL); 99 | // } 100 | 101 | // TODO 生成分析结果 102 | String resultURL = createResultURL(userToken, jsonObject); 103 | 104 | // 构造返回结果 105 | return buildResult(jsonObject, paintedFileName, resultURL); 106 | } catch (CommonExp e) { 107 | e.printStackTrace(); 108 | System.out.println(Result.newFailResult(e.getMessage()).toString()); 109 | return Result.newFailResult(e.getMessage()); 110 | } catch (Exception e) { 111 | e.printStackTrace(); 112 | System.out.println(Result.newFailResult("服务器被挤爆了!请稍后重试").toString()); 113 | return Result.newFailResult("服务器被挤爆了!请稍后重试"); 114 | } 115 | 116 | 117 | } 118 | 119 | private String createResultURL(String userToken, JSONObject jsonObject) throws IOException { 120 | 121 | String dirName = buildDirName(jsonObject); 122 | List fileNameList_nengli = Parameter.resultMap_nengli.get(dirName); 123 | List fileNameList_yanzhi = Parameter.resultMap_yanzhi.get(dirName); 124 | 125 | String fileName_yanzhi = fileNameList_yanzhi.get(new Random().nextInt(fileNameList_yanzhi.size())); 126 | String fileName_nengli = fileNameList_nengli.get(new Random().nextInt(fileNameList_nengli.size())); 127 | 128 | // TODO 对dirName要进行编码 129 | String resultURL = Parameter.URL_PATH+"result/yanzhi/"+dirName+"/"+fileName_yanzhi + "," + 130 | Parameter.URL_PATH+"result/nengli/"+dirName+"/"+fileName_nengli; 131 | 132 | // Parameter.userResultMap.put(userToken, resultURL); 133 | // BufferedWriter buf_w = new BufferedWriter(new FileWriter(new File(Parameter.userFilePath),true)); 134 | // buf_w.write(userToken+"#"+resultURL); 135 | // buf_w.newLine(); 136 | // buf_w.close(); 137 | 138 | return resultURL; 139 | } 140 | 141 | private String buildDirName(JSONObject jsonObject) { 142 | StringBuilder dirName = new StringBuilder(); 143 | 144 | Integer gender = (Integer) jsonObject.getJSONArray("gender").get(0); 145 | Integer age = (Integer) jsonObject.getJSONArray("age").get(0); 146 | 147 | if (gender == 0) { 148 | dirName.append("nv_"); 149 | } else { 150 | dirName.append("na_"); 151 | } 152 | 153 | if (age<=15) { 154 | dirName.append("0_15"); 155 | } else if (age>15 && age<=20) { 156 | dirName.append("15_20"); 157 | } else if (age>20 && age<=30) { 158 | dirName.append("20_30"); 159 | } else if (age>30 && age<=40) { 160 | dirName.append("30_40"); 161 | } else if (age>40) { 162 | dirName.append("40_"); 163 | } 164 | 165 | return dirName.toString(); 166 | } 167 | 168 | private Result buildResult(JSONObject jsonObject, String paintedFileName, String resultURL) { 169 | Integer gender = (Integer) jsonObject.getJSONArray("gender").get(0); 170 | Integer age = (Integer) jsonObject.getJSONArray("age").get(0); 171 | Integer expression = (Integer) jsonObject.getJSONArray("expression").get(0); 172 | Integer glass = (Integer) jsonObject.getJSONArray("glass").get(0); 173 | 174 | Result result = new Result(); 175 | result.setSuccess(true); 176 | 177 | if (gender.intValue() == 0) { 178 | result.setGender("女生"); 179 | } else { 180 | result.setGender("男生"); 181 | } 182 | 183 | if (glass.intValue() == 0) { 184 | result.setGlass("未戴眼镜"); 185 | } else { 186 | result.setGlass("有眼镜"); 187 | } 188 | 189 | result.setAge(age.intValue()); 190 | 191 | if (expression.intValue() == 1) { 192 | result.setExpression("微笑"); 193 | } else { 194 | result.setExpression("没有微笑"); 195 | } 196 | 197 | result.setFaceUrl(Parameter.URL_PATH +"ai/"+ paintedFileName); 198 | result.setResultUrl(resultURL); 199 | System.out.println(result.toString()); 200 | return result; 201 | } 202 | 203 | public static void main(String[] args) { 204 | try { 205 | // 识别图片 206 | JSONObject jsonObject = ImageTool.recognizeFace("http://www.chaimm.com:8080/upload/1515062968"); 207 | 208 | // 绘图 209 | File file = new File("/Users/chibozhou/Downloads/WechatIMG4.jpeg"); 210 | String paintedFileName = ImageTool.paintImage(jsonObject, file); 211 | 212 | } catch (Exception e) { 213 | e.printStackTrace(); 214 | } 215 | } 216 | } 217 | -------------------------------------------------------------------------------- /src/main/java/com/chaimm/ai/entity/Parameter.java: -------------------------------------------------------------------------------- 1 | package com.chaimm.ai.entity; 2 | 3 | import java.util.HashMap; 4 | import java.util.List; 5 | import java.util.Map; 6 | 7 | /** 8 | * @author 大闲人柴毛毛 9 | * @date 2017/12/31 下午1:56 10 | * @description 11 | */ 12 | public class Parameter { 13 | /** access_token */ 14 | public static String AccessToken_Parameters = null; 15 | /** ticket */ 16 | public static String Ticket_Parameter = null; 17 | 18 | public static final String ABS_PATH = "/usr/web/tomcat/webapps/upload/"; 19 | // public static final String ABS_PATH = "/Users/chibozhou/Downloads/"; 20 | public static final String URL_PATH = "http://www.chaimm.com/upload/"; 21 | 22 | // public static final String APPID = "wxf2f80142a242f384"; 23 | // public static final String SECRET = "5f4307f21a18bdfe74bea682627bfd53"; 24 | public static final String APPID = "wx82de919618ed3240"; 25 | public static final String SECRET = "43e3037e403c0d267e2d190aa3953cbd"; 26 | 27 | public static final Map userResultMap = new HashMap<>(); 28 | 29 | public static final String userFilePath = "/usr/web/userFile"; 30 | 31 | public static final Map> resultMap_yanzhi = new HashMap<>(); 32 | public static final Map> resultMap_nengli = new HashMap<>(); 33 | 34 | public static final String resultPath_yanzhi = "/usr/web/tomcat/webapps/upload/result/yanzhi/"; 35 | public static final String resultPath_nengli = "/usr/web/tomcat/webapps/upload/result/nengli/"; 36 | // public static final String resultPath_yanzhi = "/Users/chibozhou/百度云同步盘/project\\(1\\)/柴毛毛公众号/result/yanzhi/"; 37 | // public static final String resultPath_nengli = "/Users/chibozhou/百度云同步盘/project\\(1\\)/柴毛毛公众号/result/nengli/"; 38 | } 39 | -------------------------------------------------------------------------------- /src/main/java/com/chaimm/ai/entity/Result.java: -------------------------------------------------------------------------------- 1 | package com.chaimm.ai.entity; 2 | 3 | /** 4 | * @author 大闲人柴毛毛 5 | * @date 2017/12/31 上午10:03 6 | * @description 7 | */ 8 | public class Result { 9 | private boolean isSuccess; 10 | private String message; 11 | private String faceUrl; 12 | private String resultUrl; 13 | private int age; 14 | private String gender; 15 | private String glass; 16 | private String expression; 17 | 18 | public static Result newFailResult(String errorMsg){ 19 | Result result = new Result(); 20 | result.isSuccess = false; 21 | result.setMessage(errorMsg); 22 | return result; 23 | } 24 | 25 | public boolean isSuccess() { 26 | return isSuccess; 27 | } 28 | 29 | public void setSuccess(boolean success) { 30 | isSuccess = success; 31 | } 32 | 33 | public String getMessage() { 34 | return message; 35 | } 36 | 37 | public void setMessage(String message) { 38 | this.message = message; 39 | } 40 | 41 | public String getFaceUrl() { 42 | return faceUrl; 43 | } 44 | 45 | public void setFaceUrl(String faceUrl) { 46 | this.faceUrl = faceUrl; 47 | } 48 | 49 | public String getResultUrl() { 50 | return resultUrl; 51 | } 52 | 53 | public void setResultUrl(String resultUrl) { 54 | this.resultUrl = resultUrl; 55 | } 56 | 57 | public int getAge() { 58 | return age; 59 | } 60 | 61 | public void setAge(int age) { 62 | this.age = age; 63 | } 64 | 65 | public String getGender() { 66 | return gender; 67 | } 68 | 69 | public void setGender(String gender) { 70 | this.gender = gender; 71 | } 72 | 73 | public String getGlass() { 74 | return glass; 75 | } 76 | 77 | public void setGlass(String glass) { 78 | this.glass = glass; 79 | } 80 | 81 | public String getExpression() { 82 | return expression; 83 | } 84 | 85 | public void setExpression(String expression) { 86 | this.expression = expression; 87 | } 88 | 89 | @Override 90 | public String toString() { 91 | return "Result{" + 92 | "isSuccess=" + isSuccess + 93 | ", message='" + message + '\'' + 94 | ", faceUrl='" + faceUrl + '\'' + 95 | ", resultUrl='" + resultUrl + '\'' + 96 | ", age=" + age + 97 | ", gender='" + gender + '\'' + 98 | ", glass='" + glass + '\'' + 99 | ", expression='" + expression + '\'' + 100 | '}'; 101 | } 102 | } 103 | -------------------------------------------------------------------------------- /src/main/java/com/chaimm/ai/exception/CommonExp.java: -------------------------------------------------------------------------------- 1 | package com.chaimm.ai.exception; 2 | 3 | import org.springframework.web.bind.annotation.ExceptionHandler; 4 | 5 | /** 6 | * @author 大闲人柴毛毛 7 | * @date 2017/12/31 上午10:07 8 | * @description 9 | */ 10 | public class CommonExp extends Exception { 11 | 12 | public CommonExp(String message) { 13 | super(message); 14 | } 15 | 16 | } 17 | -------------------------------------------------------------------------------- /src/main/java/com/chaimm/ai/init/InitToken.java: -------------------------------------------------------------------------------- 1 | package com.chaimm.ai.init; 2 | 3 | import com.alibaba.fastjson.JSONException; 4 | import com.alibaba.fastjson.JSONObject; 5 | import com.chaimm.ai.entity.Parameter; 6 | import com.chaimm.ai.utils.AESDecode; 7 | import com.chaimm.ai.utils.HttpRequest; 8 | import org.springframework.boot.CommandLineRunner; 9 | import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; 10 | import org.springframework.stereotype.Component; 11 | import org.springframework.util.StringUtils; 12 | 13 | import java.io.*; 14 | import java.util.*; 15 | 16 | import static com.chaimm.ai.entity.Parameter.APPID; 17 | import static com.chaimm.ai.entity.Parameter.SECRET; 18 | import static com.chaimm.ai.entity.Parameter.userResultMap; 19 | 20 | /** 21 | * @author 大闲人柴毛毛 22 | * @date 2017/12/31 下午1:49 23 | * @description 24 | */ 25 | @Component 26 | public class InitToken implements CommandLineRunner { 27 | 28 | @Override 29 | public void run(String... strings) throws Exception { 30 | //定时线程1:每隔1.5时获取一次access_token5400000 31 | // getAccess_token(300000); 32 | 33 | //定时线程1:每隔1.5时获取一次ticket 34 | // getTicket(5400000); 35 | 36 | // 加载用户信息 37 | // loadUser(); 38 | 39 | // 加载分析结果 40 | loadResults(); 41 | } 42 | 43 | private void loadResults() { 44 | // 加载"颜值"的分析结果 45 | loadYanzhiResults(); 46 | // 加载"能力"的分析结果 47 | loadNengliResults(); 48 | 49 | System.out.println(JSONObject.toJSON(Parameter.resultMap_yanzhi).toString()); 50 | System.out.println(JSONObject.toJSON(Parameter.resultMap_nengli).toString()); 51 | } 52 | 53 | private void loadNengliResults() { 54 | Map> results = loadFiles(Parameter.resultPath_nengli); 55 | Parameter.resultMap_nengli.putAll(results); 56 | } 57 | 58 | private void loadYanzhiResults() { 59 | Map> results = loadFiles(Parameter.resultPath_yanzhi); 60 | Parameter.resultMap_yanzhi.putAll(results); 61 | } 62 | 63 | private Map> loadFiles(String resultMap_yanzhi) { 64 | Map> results = new HashMap<>(); 65 | 66 | File dir = new File(resultMap_yanzhi); 67 | File[] fileDirs = dir.listFiles(); 68 | if (fileDirs!=null && fileDirs.length>0) { 69 | for (File fileDir : fileDirs) { 70 | String[] fileNames = fileDir.list(); 71 | if (fileNames!=null && fileNames.length>0) { 72 | List fileNameList = Arrays.asList(fileNames); 73 | results.put(fileDir.getName(), fileNameList); 74 | } 75 | } 76 | } 77 | return results; 78 | } 79 | 80 | private void loadUser() throws IOException { 81 | BufferedReader buf_r = new BufferedReader(new FileReader(new File(Parameter.userFilePath))); 82 | String line = null; 83 | userResultMap.clear(); 84 | while ((line=buf_r.readLine()) != null) { 85 | String[] results = line.split("#"); 86 | Parameter.userResultMap.put(results[0],results[1]); 87 | } 88 | buf_r.close(); 89 | 90 | System.out.println(JSONObject.toJSON(Parameter.userResultMap).toString()); 91 | } 92 | 93 | 94 | /** 95 | * 定时线程:获取access_token 96 | */ 97 | private boolean getAccess_token(long time){ 98 | if(time<=0) { 99 | return false; 100 | } 101 | 102 | Timer timer = new Timer(); 103 | TimerTask task =new TimerTask(){ 104 | public void run(){ 105 | //获取access_token 106 | String param = "grant_type=client_credential&appid="+APPID+"&secret="+SECRET; 107 | String access_token_result = HttpRequest.sendGet("https://api.weixin.qq.com/cgi-bin/token", param); 108 | String access_token = ""; 109 | try { 110 | access_token = JSONObject.parseObject(access_token_result).getString("access_token"); 111 | } catch (JSONException e) { 112 | e.printStackTrace(); 113 | } 114 | Parameter.AccessToken_Parameters = access_token; 115 | System.out.println("获取到的access_token="+access_token); 116 | // System.out.println("Parameter中的access_token="+Parameter.AccessToken_Parameters); 117 | 118 | getTicket(); 119 | } 120 | }; 121 | timer.scheduleAtFixedRate(task, new Date(),time);//当前时间开始起动 每次间隔n秒再启动 122 | return true; 123 | } 124 | 125 | private void getTicket() { 126 | //获取ticket 127 | String param = "access_token="+ Parameter.AccessToken_Parameters+"&type=jsapi"; 128 | String ticket_result = HttpRequest.sendGet("https://api.weixin.qq.com/cgi-bin/ticket/getticket", param); 129 | String ticket = ""; 130 | try { 131 | ticket = JSONObject.parseObject(ticket_result).getString("ticket"); 132 | } catch (JSONException e) { 133 | e.printStackTrace(); 134 | } 135 | Parameter.Ticket_Parameter = ticket; 136 | System.out.println("获取到的ticket="+ticket); 137 | // System.out.println("Parameter中的ticket="+Parameter.Ticket_Parameter); 138 | } 139 | 140 | 141 | /** 142 | * 定时线程:获取ticket 143 | */ 144 | private boolean getTicket(long time){ 145 | if(time<=0) { 146 | return false; 147 | } 148 | 149 | Timer timer = new Timer(); 150 | TimerTask task =new TimerTask(){ 151 | public void run(){ 152 | //获取ticket 153 | String param = "access_token="+ Parameter.AccessToken_Parameters+"&type=jsapi"; 154 | String ticket_result = HttpRequest.sendGet("https://api.weixin.qq.com/cgi-bin/ticket/getticket", param); 155 | String ticket = ""; 156 | try { 157 | ticket = JSONObject.parseObject(ticket_result).getString("ticket"); 158 | } catch (JSONException e) { 159 | e.printStackTrace(); 160 | } 161 | Parameter.Ticket_Parameter = ticket; 162 | System.out.println("获取到的ticket="+ticket); 163 | // System.out.println("Parameter中的ticket="+Parameter.Ticket_Parameter); 164 | } 165 | }; 166 | timer.scheduleAtFixedRate(task, 10000,time);//当前时间开始起动 每次间隔n秒再启动 167 | return true; 168 | } 169 | 170 | } 171 | -------------------------------------------------------------------------------- /src/main/java/com/chaimm/ai/utils/AESDecode.java: -------------------------------------------------------------------------------- 1 | package com.chaimm.ai.utils; 2 | 3 | /** 4 | * @author 大闲人柴毛毛 5 | * @date 2017/12/31 上午11:22 6 | * @description 7 | */ 8 | import java.io.BufferedReader; 9 | import java.io.IOException; 10 | import java.io.InputStreamReader; 11 | import java.io.PrintWriter; 12 | import java.net.HttpURLConnection; 13 | import java.net.URL; 14 | import java.net.URLConnection; 15 | import java.security.MessageDigest; 16 | import java.text.SimpleDateFormat; 17 | import java.util.Date; 18 | import java.util.Locale; 19 | import javax.crypto.spec.SecretKeySpec; 20 | import sun.misc.BASE64Encoder; 21 | import javax.crypto.Mac; 22 | 23 | 24 | @SuppressWarnings("restriction") 25 | public class AESDecode { 26 | 27 | private static final String ak_id = "LTAIeoZJzkulyq53"; 28 | private static final String ak_secret = "UwLQoJ5f0twzqFsar2SjKrvgbQMueT"; 29 | 30 | /* 31 | * 计算MD5+BASE64 32 | */ 33 | public static String MD5Base64(String s) { 34 | if (s == null) { 35 | return null; 36 | } 37 | 38 | String encodeStr = ""; 39 | byte[] utfBytes = s.getBytes(); 40 | MessageDigest mdTemp; 41 | try { 42 | mdTemp = MessageDigest.getInstance("MD5"); 43 | mdTemp.update(utfBytes); 44 | byte[] md5Bytes = mdTemp.digest(); 45 | BASE64Encoder b64Encoder = new BASE64Encoder(); 46 | encodeStr = b64Encoder.encode(md5Bytes); 47 | } catch (Exception e) { 48 | throw new Error("Failed to generate MD5 : " + e.getMessage()); 49 | } 50 | return encodeStr; 51 | } 52 | 53 | 54 | /* 55 | * 计算 HMAC-SHA1 56 | */ 57 | public static String HMACSha1(String data, String key) { 58 | String result; 59 | try { 60 | SecretKeySpec signingKey = new SecretKeySpec(key.getBytes(), "HmacSHA1"); 61 | Mac mac = Mac.getInstance("HmacSHA1"); 62 | mac.init(signingKey); 63 | byte[] rawHmac = mac.doFinal(data.getBytes()); 64 | result = (new BASE64Encoder()).encode(rawHmac); 65 | } catch (Exception e) { 66 | throw new Error("Failed to generate HMAC : " + e.getMessage()); 67 | } 68 | return result; 69 | } 70 | 71 | 72 | /* 73 | * 等同于javaScript中的 new Date().toUTCString(); 74 | */ 75 | public static String toGMTString(Date date) { 76 | SimpleDateFormat df = new SimpleDateFormat("E, dd MMM yyyy HH:mm:ss z", Locale.UK); 77 | df.setTimeZone(new java.util.SimpleTimeZone(0, "GMT")); 78 | return df.format(date); 79 | } 80 | 81 | 82 | /* 83 | * 发送POST请求 84 | */ 85 | public static String sendPost(String url, String body) throws Exception { 86 | PrintWriter out = null; 87 | BufferedReader in = null; 88 | String result = ""; 89 | int statusCode = 200; 90 | try { 91 | URL realUrl = new URL(url); 92 | /* 93 | * http header 参数 94 | */ 95 | String method = "POST"; 96 | String accept = "application/json"; 97 | String content_type = "application/json"; 98 | String path = realUrl.getFile(); 99 | String date = toGMTString(new Date()); 100 | // 1.对body做MD5+BASE64加密 101 | String bodyMd5 = MD5Base64(body); 102 | String stringToSign = method + "\n" + accept + "\n" + bodyMd5 + "\n" + content_type + "\n" + date + "\n" 103 | + path; 104 | // 2.计算 HMAC-SHA1 105 | String signature = HMACSha1(stringToSign, ak_secret); 106 | // 3.得到 authorization header 107 | String authHeader = "Dataplus " + ak_id + ":" + signature; 108 | // 打开和URL之间的连接 109 | URLConnection conn = realUrl.openConnection(); 110 | // 设置通用的请求属性 111 | conn.setRequestProperty("accept", accept); 112 | conn.setRequestProperty("content-type", content_type); 113 | conn.setRequestProperty("date", date); 114 | conn.setRequestProperty("Authorization", authHeader); 115 | // 发送POST请求必须设置如下两行 116 | conn.setDoOutput(true); 117 | conn.setDoInput(true); 118 | // 获取URLConnection对象对应的输出流 119 | out = new PrintWriter(conn.getOutputStream()); 120 | // 发送请求参数 121 | out.print(body); 122 | // flush输出流的缓冲 123 | out.flush(); 124 | // 定义BufferedReader输入流来读取URL的响应 125 | statusCode = ((HttpURLConnection)conn).getResponseCode(); 126 | if(statusCode != 200) { 127 | in = new BufferedReader(new InputStreamReader(((HttpURLConnection)conn).getErrorStream())); 128 | } else { 129 | in = new BufferedReader(new InputStreamReader(conn.getInputStream())); 130 | } 131 | String line; 132 | while ((line = in.readLine()) != null) { 133 | result += line; 134 | } 135 | } catch (Exception e) { 136 | e.printStackTrace(); 137 | } finally { 138 | try { 139 | if (out != null) { 140 | out.close(); 141 | } 142 | if (in != null) { 143 | in.close(); 144 | } 145 | } catch (IOException ex) { 146 | ex.printStackTrace(); 147 | } 148 | } 149 | if (statusCode != 200) { 150 | throw new IOException("\nHttp StatusCode: "+ statusCode + "\nErrorMessage: " + result); 151 | } 152 | return result; 153 | } 154 | 155 | 156 | /* 157 | * GET请求 158 | */ 159 | public static String sendGet(String url) throws Exception { 160 | String result = ""; 161 | BufferedReader in = null; 162 | int statusCode = 200; 163 | try { 164 | URL realUrl = new URL(url); 165 | /* 166 | * http header 参数 167 | */ 168 | String method = "GET"; 169 | String accept = "application/json"; 170 | String content_type = "application/json"; 171 | String path = realUrl.getFile(); 172 | String date = toGMTString(new Date()); 173 | // 1.对body做MD5+BASE64加密 174 | // String bodyMd5 = MD5Base64(body); 175 | String stringToSign = method + "\n" + accept + "\n" + "" + "\n" + content_type + "\n" + date + "\n" + path; 176 | // 2.计算 HMAC-SHA1 177 | String signature = HMACSha1(stringToSign, ak_secret); 178 | // 3.得到 authorization header 179 | String authHeader = "Dataplus " + ak_id + ":" + signature; 180 | // 打开和URL之间的连接 181 | URLConnection connection = realUrl.openConnection(); 182 | // 设置通用的请求属性 183 | connection.setRequestProperty("accept", accept); 184 | connection.setRequestProperty("content-type", content_type); 185 | connection.setRequestProperty("date", date); 186 | connection.setRequestProperty("Authorization", authHeader); 187 | connection.setRequestProperty("Connection", "keep-alive"); 188 | // 建立实际的连接 189 | connection.connect(); 190 | // 定义 BufferedReader输入流来读取URL的响应 191 | statusCode = ((HttpURLConnection)connection).getResponseCode(); 192 | if(statusCode != 200) { 193 | in = new BufferedReader(new InputStreamReader(((HttpURLConnection)connection).getErrorStream())); 194 | } else { 195 | in = new BufferedReader(new InputStreamReader(connection.getInputStream())); 196 | } 197 | String line; 198 | while ((line = in.readLine()) != null) { 199 | result += line; 200 | } 201 | } catch (Exception e) { 202 | e.printStackTrace(); 203 | } finally { 204 | try { 205 | if (in != null) { 206 | in.close(); 207 | } 208 | } catch (Exception e) { 209 | e.printStackTrace(); 210 | } 211 | } 212 | if (statusCode != 200) { 213 | throw new IOException("\nHttp StatusCode: "+ statusCode + "\nErrorMessage: " + result); 214 | } 215 | return result; 216 | } 217 | 218 | 219 | public static void main(String[] args) throws Exception { 220 | // 发送POST请求示例 221 | // String ak_id1 = "NMV.............5jv"; //用户ak 222 | // String ak_secret1 = "Fgs...............3zu"; // 用户ak_secret 223 | // String url = "https://shujuapi.aliyun.com/org_code/service_code/api_name"; 224 | // String body = "{\"param1\": \"xxx\", \"param2\":\"xxx\"}"; 225 | // System.out.println("response body:" + sendPost(url, body, ak_id, ak_secret)); 226 | // // 发送GET请求 227 | // String ak_id1 = "NMV.............5jv"; //用户ak 228 | // String ak_secret1 = "Fgs...............3zu"; // 用户ak_secret 229 | // String url1 = "https://shujuapi.aliyun.com/org_code/service_code/api_name?param1=xxx¶m2=xxx"; 230 | // System.out.println("response body:" + sendGet(url1, ak_id1, ak_secret1)); 231 | } 232 | } 233 | -------------------------------------------------------------------------------- /src/main/java/com/chaimm/ai/utils/HttpRequest.java: -------------------------------------------------------------------------------- 1 | package com.chaimm.ai.utils; 2 | 3 | import com.chaimm.ai.entity.Parameter; 4 | 5 | import java.io.BufferedReader; 6 | import java.io.File; 7 | import java.io.FileNotFoundException; 8 | import java.io.FileOutputStream; 9 | import java.io.IOException; 10 | import java.io.InputStream; 11 | import java.io.InputStreamReader; 12 | import java.io.PrintWriter; 13 | import java.net.URL; 14 | import java.net.URLConnection; 15 | import java.util.List; 16 | import java.util.Map; 17 | 18 | 19 | public class HttpRequest { 20 | /** 21 | * 向指定URL发送GET方法的请求 22 | * 23 | * @param url 24 | * 发送请求的URL 25 | * @param param 26 | * 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 27 | * @return URL 所代表远程资源的响应结果 28 | */ 29 | public static String sendGet(String url, String param) { 30 | String result = ""; 31 | BufferedReader in = null; 32 | try { 33 | String urlNameString = url + "?" + param; 34 | URL realUrl = new URL(urlNameString); 35 | // 打开和URL之间的连接 36 | URLConnection connection = realUrl.openConnection(); 37 | // 设置通用的请求属性 38 | connection.setRequestProperty("accept", "*/*"); 39 | connection.setRequestProperty("connection", "Keep-Alive"); 40 | connection.setRequestProperty("user-agent", 41 | "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); 42 | // 建立实际的连接 43 | connection.connect(); 44 | // 获取所有响应头字段 45 | Map> map = connection.getHeaderFields(); 46 | // 遍历所有的响应头字段 47 | // for (String key : map.keySet()) { 48 | // System.out.println(key + "--->" + map.get(key)); 49 | // } 50 | // 定义 BufferedReader输入流来读取URL的响应 51 | in = new BufferedReader(new InputStreamReader( 52 | connection.getInputStream())); 53 | String line; 54 | while ((line = in.readLine()) != null) { 55 | result += line; 56 | } 57 | } catch (Exception e) { 58 | System.out.println("发送GET请求出现异常!" + e); 59 | e.printStackTrace(); 60 | } 61 | // 使用finally块来关闭输入流 62 | finally { 63 | try { 64 | if (in != null) { 65 | in.close(); 66 | } 67 | } catch (Exception e2) { 68 | e2.printStackTrace(); 69 | } 70 | } 71 | return result; 72 | } 73 | 74 | 75 | /** 76 | * 向指定 URL 发送POST方法的请求 77 | * 78 | * @param url 79 | * 发送请求的 URL 80 | * @param param 81 | * 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。 82 | * @return 所代表远程资源的响应结果 83 | */ 84 | public static String sendPost(String url, String param) { 85 | PrintWriter out = null; 86 | BufferedReader in = null; 87 | String result = ""; 88 | try { 89 | URL realUrl = new URL(url); 90 | // 打开和URL之间的连接 91 | URLConnection conn = realUrl.openConnection(); 92 | // 设置通用的请求属性 93 | conn.setRequestProperty("accept", "*/*"); 94 | conn.setRequestProperty("connection", "Keep-Alive"); 95 | conn.setRequestProperty("user-agent", 96 | "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); 97 | // 发送POST请求必须设置如下两行 98 | conn.setDoOutput(true); 99 | conn.setDoInput(true); 100 | // 获取URLConnection对象对应的输出流 101 | out = new PrintWriter(conn.getOutputStream()); 102 | // 发送请求参数 103 | out.print(param); 104 | // flush输出流的缓冲 105 | out.flush(); 106 | // 定义BufferedReader输入流来读取URL的响应 107 | in = new BufferedReader( 108 | new InputStreamReader(conn.getInputStream())); 109 | String line; 110 | while ((line = in.readLine()) != null) { 111 | result += line; 112 | } 113 | } catch (Exception e) { 114 | System.out.println("发送 POST 请求出现异常!"+e); 115 | e.printStackTrace(); 116 | } 117 | //使用finally块来关闭输出流、输入流 118 | finally{ 119 | try{ 120 | if(out!=null){ 121 | out.close(); 122 | } 123 | if(in!=null){ 124 | in.close(); 125 | } 126 | } 127 | catch(IOException ex){ 128 | ex.printStackTrace(); 129 | } 130 | } 131 | return result; 132 | } 133 | 134 | 135 | /** 136 | * 下载图片 137 | * @return文件名 138 | */ 139 | public static String downloadByGet(String url, String param){ 140 | // 设置上传文件目录 141 | String uploadPath = Parameter.ABS_PATH; 142 | // String uploadPath = ServletActionContext.getServletContext().getRealPath("/upload"); 143 | File uploadPathDir = new File(uploadPath); 144 | if(!uploadPathDir.exists()){ 145 | uploadPathDir.mkdirs(); 146 | } 147 | // 设置目标文件 148 | String fileName = System.currentTimeMillis()/1000+""; 149 | File toFile = new File(uploadPath, fileName); 150 | if(!toFile.exists()){ 151 | try { 152 | toFile.createNewFile(); 153 | } catch (IOException e) { 154 | e.printStackTrace(); 155 | return null; 156 | } 157 | } 158 | //创建输出流 159 | FileOutputStream out = null; 160 | try { 161 | out = new FileOutputStream(toFile); 162 | } catch (FileNotFoundException e1) { 163 | e1.printStackTrace(); 164 | return null; 165 | } 166 | 167 | String result = ""; 168 | InputStream in = null; 169 | try { 170 | String urlNameString = url + "?" + param; 171 | URL realUrl = new URL(urlNameString); 172 | // 打开和URL之间的连接 173 | URLConnection connection = realUrl.openConnection(); 174 | // 设置通用的请求属性 175 | connection.setRequestProperty("accept", "*/*"); 176 | connection.setRequestProperty("connection", "Keep-Alive"); 177 | connection.setRequestProperty("user-agent", 178 | "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); 179 | // 建立实际的连接 180 | connection.connect(); 181 | // 获取所有响应头字段 182 | Map> map = connection.getHeaderFields(); 183 | // 遍历所有的响应头字段 184 | // for (String key : map.keySet()) { 185 | // System.out.println(key + "--->" + map.get(key)); 186 | // } 187 | // 定义 BufferedReader输入流来读取URL的响应 188 | //设置缓存 189 | byte[] buffer = new byte[1024]; 190 | int length = 0; 191 | in = connection.getInputStream(); 192 | while ((length = in.read(buffer)) > 0) { 193 | out.write(buffer, 0, length); 194 | } 195 | } catch (Exception e) { 196 | System.out.println("发送GET请求出现异常!" + e); 197 | e.printStackTrace(); 198 | return null; 199 | } 200 | // 使用finally块来关闭输入流 201 | finally { 202 | try { 203 | if (in != null) { 204 | in.close(); 205 | out.close(); 206 | } 207 | } catch (Exception e2) { 208 | e2.printStackTrace(); 209 | return null; 210 | } 211 | } 212 | 213 | return fileName; 214 | } 215 | } 216 | -------------------------------------------------------------------------------- /src/main/java/com/chaimm/ai/utils/ImageTool.java: -------------------------------------------------------------------------------- 1 | package com.chaimm.ai.utils; 2 | 3 | import com.alibaba.fastjson.JSONArray; 4 | import com.alibaba.fastjson.JSONObject; 5 | import com.chaimm.ai.entity.Parameter; 6 | import com.chaimm.ai.exception.CommonExp; 7 | 8 | import javax.imageio.ImageIO; 9 | import java.awt.*; 10 | import java.awt.image.BufferedImage; 11 | import java.io.*; 12 | import java.math.BigDecimal; 13 | 14 | /** 15 | * @author 大闲人柴毛毛 16 | * @date 2017/12/30 下午10:31 17 | * @description 18 | */ 19 | public class ImageTool { 20 | 21 | public static void main(String[] args) throws Exception { 22 | // //读取图片文件,得到BufferedImage对象 23 | // BufferedImage bimg= ImageIO.read(new FileInputStream("/Users/chibozhou/Downloads/WechatIMG4.jpeg")); 24 | // //得到Graphics2D 对象 25 | // Graphics2D g2d=(Graphics2D)bimg.getGraphics(); 26 | // //设置颜色和画笔粗细 27 | // g2d.setColor(Color.RED); 28 | // //绘制图案或文字 29 | // g2d.drawString("文本", 0, 0); 30 | // g2d.drawRect(215, 420, 330, 510); 31 | // //保存新图片 32 | // ImageIO.write(bimg, "JPG",new FileOutputStream("/Users/chibozhou/Downloads/aaa.jpg.jpeg")); 33 | 34 | ImageTool.recognizeFace("http://101.132.66.131:8080/upload/aaa.jpg.jpeg"); 35 | } 36 | 37 | /** 38 | * 解析人脸图片 39 | * @param url 人脸图片URL 40 | * @return 解析结果 41 | */ 42 | public static JSONObject recognizeFace(String url) throws Exception { 43 | // 请求人脸识别接口 44 | String result = AESDecode.sendPost("http://dtplus-cn-shanghai.data.aliyuncs.com/face/attribute","{\"type\":0,\"image_url\":\""+url+"\"}"); 45 | 46 | // 解析结果 47 | JSONObject json = JSONObject.parseObject(result); 48 | 49 | // System.out.println(json.toJSONString()); 50 | // 判断是否存在人脸 51 | Integer face_num = json.getInteger("face_num"); 52 | if (face_num == 0) { 53 | throw new CommonExp("未监测到人脸"); 54 | } 55 | 56 | 57 | // 返回结果 58 | return json; 59 | } 60 | 61 | /** 62 | * 图像上绘点 63 | * @param json 64 | * @param file 65 | * @return 文件名 66 | */ 67 | public static String paintImage(JSONObject json, File file) throws IOException { 68 | JSONArray faceRectArray = json.getJSONArray("face_rect"); 69 | JSONArray landmarkArray = json.getJSONArray("landmark"); 70 | 71 | // 读取图片文件,得到BufferedImage对象 72 | BufferedImage bimg= ImageIO.read(new FileInputStream(file)); 73 | //得到Graphics2D 对象 74 | Graphics2D g2d=(Graphics2D)bimg.getGraphics(); 75 | //设置颜色和画笔粗细 76 | g2d.setColor(Color.WHITE); 77 | g2d.setStroke(new BasicStroke( 2.0f )); 78 | 79 | //绘制 人脸框 80 | Integer x = (Integer) faceRectArray.get(0); 81 | Integer y = (Integer) faceRectArray.get(1); 82 | Integer width = (Integer) faceRectArray.get(2); 83 | Integer height = (Integer) faceRectArray.get(3); 84 | g2d.drawRect(x.intValue(), y.intValue(), width.intValue(), height.intValue()); 85 | 86 | // 绘制 特征点 87 | for (int i=0; i<105; i++) { 88 | BigDecimal pointX = (BigDecimal) landmarkArray.get(i*2); 89 | BigDecimal pointY = (BigDecimal) landmarkArray.get(i*2+1); 90 | g2d.drawString(".", pointX.intValue(), pointY.intValue()); 91 | g2d.drawRect(pointX.intValue(), pointY.intValue(), 3,3); 92 | } 93 | 94 | //保存新图片 95 | File resultFile = new File(Parameter.ABS_PATH+"ai/"+System.currentTimeMillis()/1000); 96 | ImageIO.write(bimg, "JPG",new FileOutputStream(resultFile)); 97 | return resultFile.getName(); 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /src/main/resources/application.properties: -------------------------------------------------------------------------------- 1 | #spring.datasource.driverClassName = com.mysql.jdbc.Driver 2 | #spring.datasource.url = jdbc:mysql://180.209.64.38:3307/mysql?useUnicode=true&characterEncoding=utf-8 3 | #spring.datasource.username = root 4 | #spring.datasource.password = jishimen.2018 5 | 6 | server.port=8080 7 | server.context-path=/ -------------------------------------------------------------------------------- /src/main/resources/static/MP_verify_zX653yqGo8weD6jY.txt: -------------------------------------------------------------------------------- 1 | zX653yqGo8weD6jY -------------------------------------------------------------------------------- /src/main/resources/static/css/common.css: -------------------------------------------------------------------------------- 1 | body { 2 | background-color: #F6F6F6; 3 | } 4 | 5 | .main-box{ 6 | margin: 0 auto; 7 | width: 230px; 8 | height: 370px; 9 | background-color: #FFFFFF; 10 | border-radius:20px; 11 | box-shadow: 0px 3px 20px #eae8e8; 12 | text-align: center; 13 | } 14 | 15 | .main-box-result { 16 | overflow: hidden; 17 | width: 300px; 18 | height: 480px; 19 | box-shadow: 0px 3px 20px #cac7c7; 20 | position: absolute; 21 | top: 48%; 22 | left: 50%; 23 | transform:translate(-50%,-50%); 24 | -ms-transform:translate(-50%,-50%); /* IE 9 */ 25 | -moz-transform:translate(-50%,-50%);/* Firefox */ 26 | -webkit-transform:translate(-50%,-50%);/* Safari 和 Chrome */ 27 | -o-transform:translate(-50%,-50%);/* Opera */ 28 | } 29 | 30 | .page { 31 | width: 100%; 32 | position: relative; 33 | } 34 | 35 | .titleBox{ 36 | margin: 0 auto; 37 | margin-top: 30px; 38 | margin-bottom: 20px; 39 | width: 230px; 40 | text-align: center; 41 | font-family: 微软雅黑; 42 | font-size: 20px; 43 | color: #696868; 44 | font-weight: lighter; 45 | } 46 | 47 | .button{ 48 | margin: 0 auto; 49 | margin-top: 30px; 50 | width: 230px; 51 | height: 60px; 52 | text-align: center; 53 | line-height: 60px; 54 | border-radius: 100px; 55 | box-shadow: 0px 3px 20px #297ee4; 56 | font-weight: 200; 57 | font-size: 17px; 58 | background-color: #679ae4; 59 | color: white; 60 | } 61 | 62 | .button:hover{ 63 | box-shadow: 0px 3px 50px #297ee4; 64 | background-color: #4282e0; 65 | } 66 | 67 | .button img{ 68 | width: 90px; 69 | margin-top: 17px; 70 | } 71 | 72 | #cas { 73 | position: absolute; 74 | left:0; 75 | top:0; 76 | bottom:0; 77 | right:0; 78 | margin:auto; 79 | z-index: -100; 80 | } 81 | 82 | .breathe-btn{ 83 | background-image: -webkit-gradient(linear, left top, left bottom, from(#1ebef9), to(#2f84ea)); 84 | -webkit-animation-timing-function: ease-in-out; 85 | -webkit-animation-name: breathe; 86 | -webkit-animation-duration: 1000ms; 87 | -webkit-animation-iteration-count: infinite; 88 | -webkit-animation-direction: alternate; 89 | } 90 | @-webkit-keyframes breathe { 91 | 0% { 92 | /*box-shadow: 0px 3px 20px #2f84ea;*/ 93 | opacity: .8; 94 | } 95 | 100% { 96 | box-shadow: 0px 3px 80px #2f84ea; 97 | opacity: 1; 98 | } 99 | } 100 | 101 | .arrowDown { 102 | position: fixed; left: 50%; bottom: 10px; 103 | transform: translate(-50%, -50%); /* 50%为自身尺寸的一半 */ 104 | } 105 | 106 | .swiper-slide { 107 | /*background: #f1f1f1;*/ 108 | /*color: #000;*/ 109 | /*text-align: center;*/ 110 | /*overflow: auto;*/ 111 | -webkit-overflow-scrolling: touch; 112 | } -------------------------------------------------------------------------------- /src/main/resources/static/css/demo.css: -------------------------------------------------------------------------------- 1 | @import url(http://fonts.googleapis.com/css?family=Raleway:200,600,700,400); 2 | 3 | @font-face { 4 | font-weight: normal; 5 | font-style: normal; 6 | font-family: 'codropsicons'; 7 | src:url('../fonts/codropsicons/codropsicons.eot'); 8 | src:url('../fonts/codropsicons/codropsicons.eot?#iefix') format('embedded-opentype'), 9 | url('../fonts/codropsicons/codropsicons.woff') format('woff'), 10 | url('../fonts/codropsicons/codropsicons.ttf') format('truetype'), 11 | url('../fonts/codropsicons/codropsicons.svg#codropsicons') format('svg'); 12 | } 13 | 14 | *, *:after, *:before { -webkit-box-sizing: border-box; box-sizing: border-box; } 15 | .clearfix:before, .clearfix:after { content: ''; display: table; } 16 | .clearfix:after { clear: both; } 17 | 18 | body { 19 | background: #cae4b6; 20 | color: white; 21 | font-weight: 400; 22 | font-size: 1em; 23 | font-family: 'Raleway', Arial, sans-serif; 24 | } 25 | 26 | a, button { 27 | color: #74716D; 28 | text-decoration: none; 29 | outline: none; 30 | } 31 | 32 | a:hover, a:focus { 33 | color: #c94e50; 34 | outline: none; 35 | } 36 | 37 | button { 38 | padding: 1em 2em; 39 | outline: none; 40 | font-weight: 600; 41 | border: none; 42 | color: #fff; 43 | background: #c94e50; 44 | } 45 | 46 | .content { 47 | max-width: 1000px; 48 | padding: 0 1em; 49 | margin: 0 auto; 50 | text-align: center; 51 | -webkit-touch-callout: none; 52 | -webkit-user-select: none; 53 | -khtml-user-select: none; 54 | -moz-user-select: none; 55 | -ms-user-select: none; 56 | user-select: none; 57 | } 58 | 59 | .button-wrap { 60 | padding: 2.5em 0 0; 61 | font-size: 1.25em; 62 | } 63 | 64 | button.trigger { 65 | background: #c94e50; 66 | color: #fff; 67 | border: none; 68 | } 69 | 70 | .menu { 71 | display: -webkit-flex; 72 | display: flex; 73 | -webkit-flex-wrap: wrap; 74 | flex-wrap: wrap; 75 | } 76 | 77 | .menu:before, .menu:after { content: ''; display: table; } 78 | .menu:after { clear: both; } 79 | 80 | .menu > div { 81 | flex: auto; 82 | text-align: left; 83 | margin: 0.25em; 84 | padding: 2em 3em; 85 | background: rgba(255,255,255,0.2); 86 | } 87 | 88 | .menu h2 { 89 | margin: 0 0 0.25em; 90 | padding: 0 0 0.25em; 91 | letter-spacing: 1px; 92 | text-transform: uppercase; 93 | font-size: 72.25%; 94 | color: #9BA890; 95 | } 96 | 97 | .menu ul { 98 | padding: 0; 99 | margin: 0; 100 | list-style: none; 101 | } 102 | 103 | .menu ul:not(:last-of-type) { 104 | padding-bottom: 2em; 105 | } 106 | 107 | .menu ul li a { 108 | display: block; 109 | font-weight: bold; 110 | padding: 0.25em 0; 111 | font-size: 145%; 112 | } 113 | 114 | .menu ul li a.current-demo { 115 | color: #fff; 116 | } 117 | 118 | /* Header */ 119 | .codrops-header { 120 | padding: 2.75em 0 3em; 121 | letter-spacing: -1px; 122 | } 123 | 124 | .codrops-header h1 { 125 | font-size: 3.65em; 126 | line-height: 1; 127 | margin: 0; 128 | } 129 | 130 | .codrops-header h1 span { 131 | display: block; 132 | width: 15em; 133 | font-size: 21%; 134 | padding: 1em 0; 135 | margin: 0 auto; 136 | text-transform: uppercase; 137 | letter-spacing: 2px; 138 | position: relative; 139 | } 140 | 141 | .codrops-header h1 span::before, 142 | .codrops-header h1 span::after { 143 | content: ''; 144 | position: absolute; 145 | width: 25%; 146 | height: 2px; 147 | top: 50%; 148 | margin-top: -1px; 149 | background: #c94e50; 150 | } 151 | 152 | .codrops-header h1 span::before { 153 | right: 100%; 154 | } 155 | 156 | .codrops-header h1 span::after { 157 | left: 100%; 158 | } 159 | 160 | /* To Navigation Style */ 161 | .codrops-links { 162 | text-transform: uppercase; 163 | font-size: 1.25em; 164 | font-weight: 200; 165 | } 166 | 167 | .codrops-links a { 168 | display: inline-block; 169 | padding: 0.5em 0; 170 | margin: 0.5em; 171 | text-decoration: none; 172 | letter-spacing: 1px; 173 | } 174 | 175 | .codrops-icon span { 176 | display: none; 177 | } 178 | 179 | .codrops-icon:before { 180 | margin: 0 4px; 181 | text-transform: none; 182 | font-weight: normal; 183 | font-style: normal; 184 | font-variant: normal; 185 | font-family: 'codropsicons'; 186 | line-height: 1; 187 | speak: none; 188 | -webkit-font-smoothing: antialiased; 189 | } 190 | 191 | .codrops-icon-drop:before { 192 | content: "\e001"; 193 | } 194 | 195 | .codrops-icon-prev:before { 196 | content: "\e004"; 197 | } 198 | 199 | /* Related demos */ 200 | .related { 201 | margin-top: 8em; 202 | clear: both; 203 | padding: 1em 0 20em; 204 | font-weight: bold; 205 | } 206 | 207 | .related > a { 208 | display: inline-block; 209 | } 210 | -------------------------------------------------------------------------------- /src/main/resources/static/css/dialog-jim.css: -------------------------------------------------------------------------------- 1 | .dialog__overlay { 2 | -webkit-transition-duration: 0.6s; 3 | transition-duration: 0.6s; 4 | } 5 | 6 | .dialog__content { 7 | background: transparent; 8 | } 9 | 10 | .morph-shape { 11 | position: absolute; 12 | width: 100%; 13 | height: 170%; 14 | top: -45%; 15 | left: 0; 16 | z-index: -1; 17 | } 18 | 19 | .morph-shape svg { 20 | fill: #03a9f4; 21 | } 22 | 23 | .dialog--open .morph-shape { 24 | -webkit-animation: anim-shape 0.6s forwards; 25 | animation: anim-shape 0.6s forwards; 26 | } 27 | 28 | .dialog-inner { 29 | opacity: 0; 30 | } 31 | 32 | .dialog--open .dialog-inner { 33 | opacity: 1; 34 | -webkit-transition: opacity 0.5s 0.3s; 35 | transition: opacity 0.5s 0.3s; 36 | } 37 | 38 | .dialog.dialog--open .dialog__content, 39 | .dialog.dialog--close .dialog__content { 40 | opacity: 1; 41 | -webkit-animation-fill-mode: forwards; 42 | animation-fill-mode: forwards; 43 | } 44 | 45 | .dialog.dialog--open .dialog__content { 46 | -webkit-animation-duration: 0.6s; 47 | animation-duration: 0.6s; 48 | -webkit-animation-timing-function: cubic-bezier(0.250, 0.460, 0.450, 0.940); 49 | animation-timing-function: cubic-bezier(0.250, 0.460, 0.450, 0.940); 50 | -webkit-animation-name: anim-open; 51 | animation-name: anim-open; 52 | } 53 | 54 | .dialog.dialog--close .dialog__content { 55 | -webkit-animation-name: anim-close; 56 | animation-name: anim-close; 57 | -webkit-animation-duration: 0.3s; 58 | animation-duration: 0.3s; 59 | -webkit-animation-timing-function: cubic-bezier(0.895, 0.030, 0.685, 0.220); 60 | animation-timing-function: cubic-bezier(0.895, 0.030, 0.685, 0.220); 61 | } 62 | 63 | .dialog.dialog--open h2, 64 | .dialog.dialog--open button { 65 | -webkit-animation: anim-elem 0.5s both; 66 | animation: anim-elem 0.5s both; 67 | } 68 | 69 | .dialog.dialog--open h2 { 70 | -webkit-animation-delay: 0.5s; 71 | animation-delay: 0.5s; 72 | } 73 | 74 | .dialog.dialog--open button { 75 | -webkit-animation-delay: 0.4s; 76 | animation-delay: 0.4s; 77 | } 78 | 79 | @-webkit-keyframes anim-open { 80 | 0% { -webkit-transform: translate3d(0, -50vh, 0); } 81 | 50% { -webkit-transform: translate3d(0, -50vh, 0); } 82 | 100% { -webkit-transform: translate3d(0, 0, 0); } 83 | } 84 | 85 | @keyframes anim-open { 86 | 0% { -webkit-transform: translate3d(0, -50vh, 0); transform: translate3d(0, -50vh, 0); } 87 | 50% { -webkit-transform: translate3d(0, -50vh, 0); transform: translate3d(0, -50vh, 0); } 88 | 100% { -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } 89 | } 90 | 91 | @-webkit-keyframes anim-close { 92 | 100% { opacity: 0; -webkit-transform: translate3d(0, 50vh, 0); } 93 | } 94 | 95 | @keyframes anim-close { 96 | 100% { opacity: 0; -webkit-transform: translate3d(0, 50vh, 0); transform: translate3d(0, 50vh, 0); } 97 | } 98 | 99 | /* Inner elements animations */ 100 | 101 | @-webkit-keyframes anim-elem { 102 | 0% { opacity: 0; -webkit-transform: translate3d(0, -100px, 0); } 103 | 100% { opacity: 1; -webkit-transform: translate3d(0, 0, 0); } 104 | } 105 | 106 | @keyframes anim-elem { 107 | 0% { opacity: 0; -webkit-transform: translate3d(0, -100px, 0); transform: translate3d(0, -100px, 0); } 108 | 100% { opacity: 1; -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } 109 | } 110 | 111 | @-webkit-keyframes anim-shape { 112 | 50% { -webkit-transform: scale3d(0.8,1.2,1); } 113 | } 114 | 115 | @keyframes anim-shape { 116 | 50% { -webkit-transform: scale3d(0.8,1.2,1); transform: scale3d(0.8,1.2,1); } 117 | } 118 | 119 | @media screen and (max-width: 32em) { 120 | .dialog h2 { 121 | padding-bottom: 1em; 122 | } 123 | } -------------------------------------------------------------------------------- /src/main/resources/static/css/dialog-wilma.css: -------------------------------------------------------------------------------- 1 | .dialog--open .dialog__overlay { 2 | -webkit-transition-duration: 0.8s; 3 | transition-duration: 0.8s; 4 | } 5 | 6 | .dialog--close .dialog__overlay { 7 | -webkit-transition-duration: 0.5s; 8 | transition-duration: 0.5s; 9 | } 10 | 11 | .dialog__content { 12 | padding: 0; 13 | background: transparent; 14 | } 15 | 16 | .dialog.dialog--open .dialog__content { 17 | opacity: 1; 18 | } 19 | 20 | .morph-shape { 21 | position: absolute; 22 | width: calc(100% + 4px); 23 | height: calc(100% + 4px); 24 | top: -2px; 25 | left: -2px; 26 | z-index: -1; 27 | } 28 | 29 | .morph-shape svg rect { 30 | stroke: #fff; 31 | stroke-width: 2px; 32 | stroke-dasharray: 1680; 33 | } 34 | 35 | .dialog--open .morph-shape svg rect { 36 | -webkit-animation: anim-dash 0.6s forwards; 37 | animation: anim-dash 0.6s forwards; 38 | } 39 | 40 | .dialog-inner { 41 | opacity: 0; 42 | background: #fff; 43 | } 44 | 45 | .dialog--open .dialog-inner { 46 | padding: 4em; 47 | opacity: 1; 48 | -webkit-transition: opacity 0.85s 0.35s; 49 | transition: opacity 0.85s 0.35s; 50 | } 51 | 52 | .dialog.dialog--open h2 { 53 | -webkit-animation: anim-elem-1 0.7s ease-out both; 54 | animation: anim-elem-1 0.7s ease-out both; 55 | } 56 | 57 | .dialog.dialog--open button { 58 | -webkit-animation: anim-elem-2 0.7s ease-out both; 59 | animation: anim-elem-2 0.7s ease-out both; 60 | } 61 | 62 | @keyframes anim-dash { 63 | 0% { 64 | stroke-dashoffset: 1680; 65 | } 66 | 100% { 67 | stroke-dashoffset: 0; 68 | } 69 | } 70 | 71 | @-webkit-keyframes anim-dash { 72 | 0% { 73 | stroke-dashoffset: 1680; 74 | } 75 | 100% { 76 | stroke-dashoffset: 0; 77 | } 78 | } 79 | 80 | /* Inner elements animations */ 81 | 82 | @-webkit-keyframes anim-elem-1 { 83 | 0% { opacity: 0; -webkit-transform: translate3d(-150px, 0, 0); } 84 | 100% { opacity: 1; -webkit-transform: translate3d(0, 0, 0); } 85 | } 86 | 87 | @keyframes anim-elem-1 { 88 | 0% { opacity: 0; -webkit-transform: translate3d(-150px, 0, 0); transform: translate3d(-150px, 0, 0); } 89 | 100% { opacity: 1; -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } 90 | } 91 | 92 | @-webkit-keyframes anim-elem-2 { 93 | 0% { opacity: 0; -webkit-transform: translate3d(150px, 0, 0); } 94 | 100% { opacity: 1; -webkit-transform: translate3d(0, 0, 0); } 95 | } 96 | 97 | @keyframes anim-elem-2 { 98 | 0% { opacity: 0; -webkit-transform: translate3d(150px, 0, 0); transform: translate3d(150px, 0, 0); } 99 | 100% { opacity: 1; -webkit-transform: translate3d(0, 0, 0); transform: translate3d(0, 0, 0); } 100 | } 101 | -------------------------------------------------------------------------------- /src/main/resources/static/css/dialog.css: -------------------------------------------------------------------------------- 1 | .dialog, 2 | .dialog__overlay { 3 | width: 100%; 4 | height: 100%; 5 | top: 0; 6 | left: 0; 7 | } 8 | 9 | .dialog { 10 | position: fixed; 11 | display: -webkit-flex; 12 | display: flex; 13 | -webkit-align-items: center; 14 | align-items: center; 15 | -webkit-justify-content: center; 16 | justify-content: center; 17 | pointer-events: none; 18 | z-index: 99; 19 | } 20 | 21 | .dialog__overlay { 22 | position: absolute; 23 | z-index: 1; 24 | background: rgba(55, 58, 71, 0.9); 25 | opacity: 0; 26 | -webkit-transition: opacity 0.3s; 27 | transition: opacity 0.3s; 28 | -webkit-backface-visibility: hidden; 29 | } 30 | 31 | .dialog--open .dialog__overlay { 32 | opacity: 1; 33 | pointer-events: auto; 34 | } 35 | 36 | .dialog__content { 37 | width: 50%; 38 | max-width: 560px; 39 | min-width: 290px; 40 | background: #fff; 41 | padding: 4em; 42 | text-align: center; 43 | position: relative; 44 | z-index: 5; 45 | opacity: 0; 46 | } 47 | 48 | .dialog--open .dialog__content { 49 | pointer-events: auto; 50 | } 51 | 52 | /* Content */ 53 | .dialog h2 { 54 | margin: 0; 55 | font-weight: 400; 56 | font-size: 2em; 57 | padding: 0 0 2em; 58 | margin: 0; 59 | } -------------------------------------------------------------------------------- /src/main/resources/static/css/htmleaf-demo.css: -------------------------------------------------------------------------------- 1 | @font-face { 2 | font-family: 'icomoon'; 3 | src:url('../fonts/icomoon.eot?rretjt'); 4 | src:url('../fonts/icomoon.eot?#iefixrretjt') format('embedded-opentype'), 5 | url('../fonts/icomoon.woff?rretjt') format('woff'), 6 | url('../fonts/icomoon.ttf?rretjt') format('truetype'), 7 | url('../fonts/icomoon.svg?rretjt#icomoon') format('svg'); 8 | font-weight: normal; 9 | font-style: normal; 10 | } 11 | 12 | [class^="icon-"], [class*=" icon-"] { 13 | font-family: 'icomoon'; 14 | speak: none; 15 | font-style: normal; 16 | font-weight: normal; 17 | font-variant: normal; 18 | text-transform: none; 19 | line-height: 1; 20 | 21 | /* Better Font Rendering =========== */ 22 | -webkit-font-smoothing: antialiased; 23 | -moz-osx-font-smoothing: grayscale; 24 | } 25 | 26 | /*body, html { font-size: 100%; padding: 0; margin: 0;}*/ 27 | 28 | /* Reset */ 29 | *, 30 | *:after, 31 | *:before { 32 | -webkit-box-sizing: border-box; 33 | -moz-box-sizing: border-box; 34 | box-sizing: border-box; 35 | } 36 | 37 | /* Clearfix hack by Nicolas Gallagher: http://nicolasgallagher.com/micro-clearfix-hack/ */ 38 | .clearfix:before, 39 | .clearfix:after { 40 | content: " "; 41 | display: table; 42 | } 43 | 44 | .clearfix:after { 45 | clear: both; 46 | } 47 | 48 | /*body{*/ 49 | /*background: #494A5F;*/ 50 | /*color: #D5D6E2;*/ 51 | /*font-weight: 500;*/ 52 | /*font-size: 1.05em;*/ 53 | /*font-family: "Microsoft YaHei","宋体","Segoe UI", "Lucida Grande", Helvetica, Arial,sans-serif, FreeSans, Arimo;*/ 54 | /*}*/ 55 | /*a{ color: rgba(255, 255, 255, 0.6);outline: none;text-decoration: none;-webkit-transition: 0.2s;transition: 0.2s;}*/ 56 | /*a:hover,a:focus{color:#74777b;text-decoration: none;}*/ 57 | .htmleaf-container{ 58 | margin: 0 auto; 59 | } 60 | 61 | .bgcolor-1 { background: #f0efee; } 62 | .bgcolor-2 { background: #f9f9f9; } 63 | .bgcolor-3 { background: #e8e8e8; }/*light grey*/ 64 | .bgcolor-4 { background: #2f3238; color: #fff; }/*Dark grey*/ 65 | .bgcolor-5 { background: #df6659; color: #521e18; }/*pink1*/ 66 | .bgcolor-6 { background: #2fa8ec; }/*sky blue*/ 67 | .bgcolor-7 { background: #d0d6d6; }/*White tea*/ 68 | .bgcolor-8 { background: #3d4444; color: #fff; }/*Dark grey2*/ 69 | .bgcolor-9 { background: #ef3f52; color: #fff;}/*pink2*/ 70 | .bgcolor-10{ background: #64448f; color: #fff;}/*Violet*/ 71 | .bgcolor-11{ background: #3755ad; color: #fff;}/*dark blue*/ 72 | .bgcolor-12{ background: #3498DB; color: #fff;}/*light blue*/ 73 | .bgcolor-20{ background: #494A5F;color: #D5D6E2;} 74 | /* Header */ 75 | .htmleaf-header{ 76 | padding: 1em 190px 1em; 77 | letter-spacing: -1px; 78 | text-align: center; 79 | background: #66677c; 80 | } 81 | .htmleaf-header h1 { 82 | color: #D5D6E2; 83 | font-weight: 600; 84 | font-size: 2em; 85 | line-height: 1; 86 | margin-bottom: 0; 87 | font-family: "Microsoft YaHei","宋体","Segoe UI", "Lucida Grande", Helvetica, Arial,sans-serif, FreeSans, Arimo; 88 | } 89 | .htmleaf-header h1 span { 90 | font-family: "Microsoft YaHei","宋体","Segoe UI", "Lucida Grande", Helvetica, Arial,sans-serif, FreeSans, Arimo; 91 | display: block; 92 | font-size: 60%; 93 | font-weight: 400; 94 | padding: 0.8em 0 0.5em 0; 95 | color: #c3c8cd; 96 | } 97 | /*nav*/ 98 | .htmleaf-demo a{color: #fff;text-decoration: none;} 99 | .htmleaf-demo{width: 100%;padding-bottom: 1.2em;} 100 | .htmleaf-demo a{display: inline-block;margin: 0.5em;padding: 0.6em 1em;border: 3px solid #fff;font-weight: 700;} 101 | .htmleaf-demo a:hover{opacity: 0.6;} 102 | .htmleaf-demo a.current{background:#1d7db1;color: #fff; } 103 | /* Top Navigation Style */ 104 | .htmleaf-links { 105 | position: relative; 106 | display: inline-block; 107 | white-space: nowrap; 108 | font-size: 1.5em; 109 | text-align: center; 110 | } 111 | 112 | .htmleaf-links::after { 113 | position: absolute; 114 | top: 0; 115 | left: 50%; 116 | margin-left: -1px; 117 | width: 2px; 118 | height: 100%; 119 | background: #dbdbdb; 120 | content: ''; 121 | -webkit-transform: rotate3d(0,0,1,22.5deg); 122 | transform: rotate3d(0,0,1,22.5deg); 123 | } 124 | 125 | .htmleaf-icon { 126 | display: inline-block; 127 | margin: 0.5em; 128 | padding: 0em 0; 129 | width: 1.5em; 130 | text-decoration: none; 131 | } 132 | 133 | .htmleaf-icon span { 134 | display: none; 135 | } 136 | 137 | .htmleaf-icon:before { 138 | margin: 0 5px; 139 | text-transform: none; 140 | font-weight: normal; 141 | font-style: normal; 142 | font-variant: normal; 143 | font-family: 'icomoon'; 144 | line-height: 1; 145 | speak: none; 146 | -webkit-font-smoothing: antialiased; 147 | } 148 | /* footer */ 149 | .htmleaf-footer{width: 100%;padding-top: 10px;} 150 | .htmleaf-small{font-size: 0.8em;} 151 | .center{text-align: center;} 152 | /****/ 153 | .related { 154 | position: absolute; 155 | left: 0; 156 | bottom: 0; 157 | width: 100%; 158 | color: #fff; 159 | background: transparent; 160 | text-align: center; 161 | font-size: 1.25em; 162 | padding: 0.5em 0; 163 | overflow: hidden; 164 | } 165 | 166 | .related > a { 167 | vertical-align: top; 168 | width: calc(100% - 20px); 169 | max-width: 340px; 170 | display: inline-block; 171 | text-align: center; 172 | margin: 20px 10px; 173 | padding: 25px; 174 | font-family: "Microsoft YaHei","宋体","Segoe UI", "Lucida Grande", Helvetica, Arial,sans-serif, FreeSans, Arimo; 175 | } 176 | .related a { 177 | display: inline-block; 178 | text-align: left; 179 | margin: 20px auto; 180 | padding: 10px 20px; 181 | opacity: 0.8; 182 | -webkit-transition: opacity 0.3s; 183 | transition: opacity 0.3s; 184 | -webkit-backface-visibility: hidden; 185 | } 186 | 187 | .related a:hover, 188 | .related a:active { 189 | opacity: 1; 190 | } 191 | 192 | .related a img { 193 | max-width: 100%; 194 | opacity: 0.8; 195 | border-radius: 4px; 196 | } 197 | .related a:hover img, 198 | .related a:active img { 199 | opacity: 1; 200 | } 201 | .related h3{font-family: "Microsoft YaHei", sans-serif;font-size: 1.2em} 202 | .related a h3 { 203 | font-size: 0.85em; 204 | font-weight: 300; 205 | margin-top: 0.15em; 206 | color: #fff; 207 | } 208 | /* icomoon */ 209 | .icon-htmleaf-home-outline:before { 210 | content: "\e5000"; 211 | } 212 | 213 | .icon-htmleaf-arrow-forward-outline:before { 214 | content: "\e5001"; 215 | } 216 | 217 | @media screen and (max-width: 1024px) { 218 | .htmleaf-header { 219 | padding: 2em 10% 2em; 220 | } 221 | .htmleaf-header h1 { 222 | font-size:1.4em; 223 | } 224 | .htmleaf-links{font-size: 1.4em} 225 | } 226 | 227 | @media screen and (max-width: 960px) { 228 | .htmleaf-header { 229 | padding: 2em 10% 2em; 230 | } 231 | .htmleaf-header h1 { 232 | font-size:1.2em; 233 | } 234 | .htmleaf-links{font-size: 1.2em} 235 | .related h3{font-size: 1em;} 236 | .related a h3 { 237 | font-size: 0.8em; 238 | } 239 | } 240 | 241 | @media screen and (max-width: 766px) { 242 | .htmleaf-header h1 { 243 | font-size:1.3em; 244 | } 245 | .htmleaf-links{font-size: 1.3em} 246 | } 247 | 248 | @media screen and (max-width: 640px) { 249 | .htmleaf-header { 250 | padding: 2em 10% 2em; 251 | } 252 | .htmleaf-header h1 { 253 | font-size:1em; 254 | } 255 | .htmleaf-links{font-size: 1em} 256 | .related h3{font-size: 0.8em;} 257 | .related a h3 { 258 | font-size: 0.6em; 259 | } 260 | } -------------------------------------------------------------------------------- /src/main/resources/static/css/normalize.css: -------------------------------------------------------------------------------- 1 | article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block;}audio,canvas,video{display:inline-block;}audio:not([controls]){display:none;height:0;}[hidden]{display:none;}html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%;}body{margin:0;}a:focus{outline:thin dotted;}a:active,a:hover{outline:0;}h1{font-size:2em;margin:0.67em 0;}abbr[title]{border-bottom:1px dotted;}b,strong{font-weight:bold;}dfn{font-style:italic;}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0;}mark{background:#ff0;color:#000;}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em;}pre{white-space:pre-wrap;}q{quotes:"\201C" "\201D" "\2018" "\2019";}small{font-size:80%;}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline;}sup{top:-0.5em;}sub{bottom:-0.25em;}img{border:0;}svg:not(:root){overflow:hidden;}figure{margin:0;}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em;}legend{border:0;padding:0;}button,input,select,textarea{font-family:inherit;font-size:100%;margin:0;}button,input{line-height:normal;}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;}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0;}input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box;}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none;}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0;}textarea{overflow:auto;vertical-align:top;}table{border-collapse:collapse;border-spacing:0;} -------------------------------------------------------------------------------- /src/main/resources/static/css/swiper.min.css: -------------------------------------------------------------------------------- 1 | /** 2 | * Swiper 3.4.2 3 | * Most modern mobile touch slider and framework with hardware accelerated transitions 4 | * 5 | * http://www.idangero.us/swiper/ 6 | * 7 | * Copyright 2017, Vladimir Kharlampidi 8 | * The iDangero.us 9 | * http://www.idangero.us/ 10 | * 11 | * Licensed under MIT 12 | * 13 | * Released on: March 10, 2017 14 | */ 15 | .swiper-container{margin-left:auto;margin-right:auto;position:relative;overflow:hidden;z-index:1}.swiper-container-no-flexbox .swiper-slide{float:left}.swiper-container-vertical>.swiper-wrapper{-webkit-box-orient:vertical;-moz-box-orient:vertical;-ms-flex-direction:column;-webkit-flex-direction:column;flex-direction:column}.swiper-wrapper{position:relative;width:100%;height:100%;z-index:1;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.swiper-container-android .swiper-slide,.swiper-wrapper{-webkit-transform:translate3d(0,0,0);-moz-transform:translate3d(0,0,0);-o-transform:translate(0,0);-ms-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.swiper-container-multirow>.swiper-wrapper{-webkit-box-lines:multiple;-moz-box-lines:multiple;-ms-flex-wrap:wrap;-webkit-flex-wrap:wrap;flex-wrap:wrap}.swiper-container-free-mode>.swiper-wrapper{-webkit-transition-timing-function:ease-out;-moz-transition-timing-function:ease-out;-ms-transition-timing-function:ease-out;-o-transition-timing-function:ease-out;transition-timing-function:ease-out;margin:0 auto}.swiper-slide{-webkit-flex-shrink:0;-ms-flex:0 0 auto;flex-shrink:0;width:100%;height:100%;position:relative}.swiper-container-autoheight,.swiper-container-autoheight .swiper-slide{height:auto}.swiper-container-autoheight .swiper-wrapper{-webkit-box-align:start;-ms-flex-align:start;-webkit-align-items:flex-start;align-items:flex-start;-webkit-transition-property:-webkit-transform,height;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform,height}.swiper-container .swiper-notification{position:absolute;left:0;top:0;pointer-events:none;opacity:0;z-index:-1000}.swiper-wp8-horizontal{-ms-touch-action:pan-y;touch-action:pan-y}.swiper-wp8-vertical{-ms-touch-action:pan-x;touch-action:pan-x}.swiper-button-next,.swiper-button-prev{position:absolute;left:50%;bottom:10px;width:27px;height:44px;margin-top:0px;z-index:10;cursor:pointer;-moz-background-size:27px 44px;-webkit-background-size:27px 44px;background-size:27px 44px;background-position:center;background-repeat:no-repeat}.swiper-button-next.swiper-button-disabled,.swiper-button-prev.swiper-button-disabled{display:none}.swiper-button-prev,.swiper-container-rtl .swiper-button-next{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");-webkit-transform:rotate(90deg);}.swiper-button-prev.swiper-button-black,.swiper-container-rtl .swiper-button-next.swiper-button-black{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E")}.swiper-button-prev.swiper-button-white,.swiper-container-rtl .swiper-button-next.swiper-button-white{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M0%2C22L22%2C0l2.1%2C2.1L4.2%2C22l19.9%2C19.9L22%2C44L0%2C22L0%2C22L0%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E")}.swiper-button-next,.swiper-container-rtl .swiper-button-prev{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23007aff'%2F%3E%3C%2Fsvg%3E");-webkit-transform: rotate(90deg);}.swiper-button-next.swiper-button-black,.swiper-container-rtl .swiper-button-prev.swiper-button-black{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23000000'%2F%3E%3C%2Fsvg%3E")}.swiper-button-next.swiper-button-white,.swiper-container-rtl .swiper-button-prev.swiper-button-white{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20viewBox%3D'0%200%2027%2044'%3E%3Cpath%20d%3D'M27%2C22L27%2C22L5%2C44l-2.1-2.1L22.8%2C22L2.9%2C2.1L5%2C0L27%2C22L27%2C22z'%20fill%3D'%23ffffff'%2F%3E%3C%2Fsvg%3E")}.swiper-pagination{position:absolute;text-align:center;-webkit-transition:.3s;-moz-transition:.3s;-o-transition:.3s;transition:.3s;-webkit-transform:translate3d(0,0,0);-ms-transform:translate3d(0,0,0);-o-transform:translate3d(0,0,0);transform:translate3d(0,0,0);z-index:10}.swiper-pagination.swiper-pagination-hidden{opacity:0}.swiper-container-horizontal>.swiper-pagination-bullets,.swiper-pagination-custom,.swiper-pagination-fraction{bottom:10px;left:0;width:100%}.swiper-pagination-bullet{width:8px;height:8px;display:inline-block;border-radius:100%;background:#000;opacity:.2}button.swiper-pagination-bullet{border:none;margin:0;padding:0;box-shadow:none;-moz-appearance:none;-ms-appearance:none;-webkit-appearance:none;appearance:none}.swiper-pagination-clickable .swiper-pagination-bullet{cursor:pointer}.swiper-pagination-white .swiper-pagination-bullet{background:#fff}.swiper-pagination-bullet-active{opacity:1;background:#007aff}.swiper-pagination-white .swiper-pagination-bullet-active{background:#fff}.swiper-pagination-black .swiper-pagination-bullet-active{background:#000}.swiper-container-vertical>.swiper-pagination-bullets{right:10px;top:50%;-webkit-transform:translate3d(0,-50%,0);-moz-transform:translate3d(0,-50%,0);-o-transform:translate(0,-50%);-ms-transform:translate3d(0,-50%,0);transform:translate3d(0,-50%,0)}.swiper-container-vertical>.swiper-pagination-bullets .swiper-pagination-bullet{margin:5px 0;display:block}.swiper-container-horizontal>.swiper-pagination-bullets .swiper-pagination-bullet{margin:0 5px}.swiper-pagination-progress{background:rgba(0,0,0,.25);position:absolute}.swiper-pagination-progress .swiper-pagination-progressbar{background:#007aff;position:absolute;left:0;top:0;width:100%;height:100%;-webkit-transform:scale(0);-ms-transform:scale(0);-o-transform:scale(0);transform:scale(0);-webkit-transform-origin:left top;-moz-transform-origin:left top;-ms-transform-origin:left top;-o-transform-origin:left top;transform-origin:left top}.swiper-container-rtl .swiper-pagination-progress .swiper-pagination-progressbar{-webkit-transform-origin:right top;-moz-transform-origin:right top;-ms-transform-origin:right top;-o-transform-origin:right top;transform-origin:right top}.swiper-container-horizontal>.swiper-pagination-progress{width:100%;height:4px;left:0;top:0}.swiper-container-vertical>.swiper-pagination-progress{width:4px;height:100%;left:0;top:0}.swiper-pagination-progress.swiper-pagination-white{background:rgba(255,255,255,.5)}.swiper-pagination-progress.swiper-pagination-white .swiper-pagination-progressbar{background:#fff}.swiper-pagination-progress.swiper-pagination-black .swiper-pagination-progressbar{background:#000}.swiper-container-3d{-webkit-perspective:1200px;-moz-perspective:1200px;-o-perspective:1200px;perspective:1200px}.swiper-container-3d .swiper-cube-shadow,.swiper-container-3d .swiper-slide,.swiper-container-3d .swiper-slide-shadow-bottom,.swiper-container-3d .swiper-slide-shadow-left,.swiper-container-3d .swiper-slide-shadow-right,.swiper-container-3d .swiper-slide-shadow-top,.swiper-container-3d .swiper-wrapper{-webkit-transform-style:preserve-3d;-moz-transform-style:preserve-3d;-ms-transform-style:preserve-3d;transform-style:preserve-3d}.swiper-container-3d .swiper-slide-shadow-bottom,.swiper-container-3d .swiper-slide-shadow-left,.swiper-container-3d .swiper-slide-shadow-right,.swiper-container-3d .swiper-slide-shadow-top{position:absolute;left:0;top:0;width:100%;height:100%;pointer-events:none;z-index:10}.swiper-container-3d .swiper-slide-shadow-left{background-image:-webkit-gradient(linear,left top,right top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,0)));background-image:-webkit-linear-gradient(right,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-moz-linear-gradient(right,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-o-linear-gradient(right,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:linear-gradient(to left,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-3d .swiper-slide-shadow-right{background-image:-webkit-gradient(linear,right top,left top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,0)));background-image:-webkit-linear-gradient(left,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-moz-linear-gradient(left,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-o-linear-gradient(left,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:linear-gradient(to right,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-3d .swiper-slide-shadow-top{background-image:-webkit-gradient(linear,left top,left bottom,from(rgba(0,0,0,.5)),to(rgba(0,0,0,0)));background-image:-webkit-linear-gradient(bottom,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-moz-linear-gradient(bottom,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-o-linear-gradient(bottom,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:linear-gradient(to top,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-3d .swiper-slide-shadow-bottom{background-image:-webkit-gradient(linear,left bottom,left top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,0)));background-image:-webkit-linear-gradient(top,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-moz-linear-gradient(top,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:-o-linear-gradient(top,rgba(0,0,0,.5),rgba(0,0,0,0));background-image:linear-gradient(to bottom,rgba(0,0,0,.5),rgba(0,0,0,0))}.swiper-container-coverflow .swiper-wrapper,.swiper-container-flip .swiper-wrapper{-ms-perspective:1200px}.swiper-container-cube,.swiper-container-flip{overflow:visible}.swiper-container-cube .swiper-slide,.swiper-container-flip .swiper-slide{pointer-events:none;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden;z-index:1}.swiper-container-cube .swiper-slide .swiper-slide,.swiper-container-flip .swiper-slide .swiper-slide{pointer-events:none}.swiper-container-cube .swiper-slide-active,.swiper-container-cube .swiper-slide-active .swiper-slide-active,.swiper-container-flip .swiper-slide-active,.swiper-container-flip .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-container-cube .swiper-slide-shadow-bottom,.swiper-container-cube .swiper-slide-shadow-left,.swiper-container-cube .swiper-slide-shadow-right,.swiper-container-cube .swiper-slide-shadow-top,.swiper-container-flip .swiper-slide-shadow-bottom,.swiper-container-flip .swiper-slide-shadow-left,.swiper-container-flip .swiper-slide-shadow-right,.swiper-container-flip .swiper-slide-shadow-top{z-index:0;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;-ms-backface-visibility:hidden;backface-visibility:hidden}.swiper-container-cube .swiper-slide{visibility:hidden;-webkit-transform-origin:0 0;-moz-transform-origin:0 0;-ms-transform-origin:0 0;transform-origin:0 0;width:100%;height:100%}.swiper-container-cube.swiper-container-rtl .swiper-slide{-webkit-transform-origin:100% 0;-moz-transform-origin:100% 0;-ms-transform-origin:100% 0;transform-origin:100% 0}.swiper-container-cube .swiper-slide-active,.swiper-container-cube .swiper-slide-next,.swiper-container-cube .swiper-slide-next+.swiper-slide,.swiper-container-cube .swiper-slide-prev{pointer-events:auto;visibility:visible}.swiper-container-cube .swiper-cube-shadow{position:absolute;left:0;bottom:0;width:100%;height:100%;background:#000;opacity:.6;-webkit-filter:blur(50px);filter:blur(50px);z-index:0}.swiper-container-fade.swiper-container-free-mode .swiper-slide{-webkit-transition-timing-function:ease-out;-moz-transition-timing-function:ease-out;-ms-transition-timing-function:ease-out;-o-transition-timing-function:ease-out;transition-timing-function:ease-out}.swiper-container-fade .swiper-slide{pointer-events:none;-webkit-transition-property:opacity;-moz-transition-property:opacity;-o-transition-property:opacity;transition-property:opacity}.swiper-container-fade .swiper-slide .swiper-slide{pointer-events:none}.swiper-container-fade .swiper-slide-active,.swiper-container-fade .swiper-slide-active .swiper-slide-active{pointer-events:auto}.swiper-zoom-container{width:100%;height:100%;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-webkit-flex;display:flex;-webkit-box-pack:center;-moz-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;-webkit-box-align:center;-moz-box-align:center;-ms-flex-align:center;-webkit-align-items:center;align-items:center;text-align:center}.swiper-zoom-container>canvas,.swiper-zoom-container>img,.swiper-zoom-container>svg{max-width:100%;max-height:100%;object-fit:contain}.swiper-scrollbar{border-radius:10px;position:relative;-ms-touch-action:none;background:rgba(0,0,0,.1)}.swiper-container-horizontal>.swiper-scrollbar{position:absolute;left:1%;bottom:3px;z-index:50;height:5px;width:98%}.swiper-container-vertical>.swiper-scrollbar{position:absolute;right:3px;top:1%;z-index:50;width:5px;height:98%}.swiper-scrollbar-drag{height:100%;width:100%;position:relative;background:rgba(0,0,0,.5);border-radius:10px;left:0;top:0}.swiper-scrollbar-cursor-drag{cursor:move}.swiper-lazy-preloader{width:42px;height:42px;position:absolute;left:50%;top:50%;margin-left:-21px;margin-top:-21px;z-index:10;-webkit-transform-origin:50%;-moz-transform-origin:50%;transform-origin:50%;-webkit-animation:swiper-preloader-spin 1s steps(12,end) infinite;-moz-animation:swiper-preloader-spin 1s steps(12,end) infinite;animation:swiper-preloader-spin 1s steps(12,end) infinite}.swiper-lazy-preloader:after{display:block;content:"";width:100%;height:100%;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%236c6c6c'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");background-position:50%;-webkit-background-size:100%;background-size:100%;background-repeat:no-repeat}.swiper-lazy-preloader-white:after{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg%20viewBox%3D'0%200%20120%20120'%20xmlns%3D'http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg'%20xmlns%3Axlink%3D'http%3A%2F%2Fwww.w3.org%2F1999%2Fxlink'%3E%3Cdefs%3E%3Cline%20id%3D'l'%20x1%3D'60'%20x2%3D'60'%20y1%3D'7'%20y2%3D'27'%20stroke%3D'%23fff'%20stroke-width%3D'11'%20stroke-linecap%3D'round'%2F%3E%3C%2Fdefs%3E%3Cg%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(30%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(60%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(90%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(120%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.27'%20transform%3D'rotate(150%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.37'%20transform%3D'rotate(180%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.46'%20transform%3D'rotate(210%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.56'%20transform%3D'rotate(240%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.66'%20transform%3D'rotate(270%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.75'%20transform%3D'rotate(300%2060%2C60)'%2F%3E%3Cuse%20xlink%3Ahref%3D'%23l'%20opacity%3D'.85'%20transform%3D'rotate(330%2060%2C60)'%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E")}@-webkit-keyframes swiper-preloader-spin{100%{-webkit-transform:rotate(360deg)}}@keyframes swiper-preloader-spin{100%{transform:rotate(360deg)}} -------------------------------------------------------------------------------- /src/main/resources/static/fonts/icomoon.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/fonts/icomoon.eot -------------------------------------------------------------------------------- /src/main/resources/static/fonts/icomoon.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Generated by IcoMoon 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /src/main/resources/static/fonts/icomoon.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/fonts/icomoon.ttf -------------------------------------------------------------------------------- /src/main/resources/static/fonts/icomoon.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/fonts/icomoon.woff -------------------------------------------------------------------------------- /src/main/resources/static/html/data.json: -------------------------------------------------------------------------------- 1 | { 2 | "face_num": 1, 3 | "face_rect": [ 4 | 215, 5 | 420, 6 | 330, 7 | 510 8 | ], 9 | "face_prob": [ 10 | 1 11 | ], 12 | "pose": [ 13 | 5.385122776031494, 14 | -6.234319686889648, 15 | -8.6544771194458 16 | ], 17 | "landmark_num": 105, 18 | "landmark": [ 19 | 223.09906005859375, 20 | 568.60693359375, 21 | 368.46807861328125, 22 | 563.9793090820312, 23 | 290.83917236328125, 24 | 526.0083618164062, 25 | 295.7440185546875, 26 | 564.23095703125, 27 | 236.68592834472656, 28 | 542.7091064453125, 29 | 261.58319091796875, 30 | 527.4334716796875, 31 | 318.98065185546875, 32 | 534.1685791015625, 33 | 346.1228942871094, 34 | 545.1912231445312, 35 | 247.41775512695312, 36 | 569.7203369140625, 37 | 271.4346618652344, 38 | 565.6989135742188, 39 | 320.05596923828125, 40 | 565.699462890625, 41 | 344.3499755859375, 42 | 567.3773193359375, 43 | 435.9345397949219, 44 | 557.5026245117188, 45 | 538.899658203125, 46 | 534.0765380859375, 47 | 479.19964599609375, 48 | 507.05169677734375, 49 | 486.789306640625, 50 | 543.16552734375, 51 | 441.849365234375, 52 | 534.5571899414062, 53 | 458.04931640625, 54 | 517.5439453125, 55 | 502.7838439941406, 56 | 505.56890869140625, 57 | 524.3512573242188, 58 | 515.373046875, 59 | 453.27850341796875, 60 | 554.1956787109375, 61 | 469.7330627441406, 62 | 547.7730102539062, 63 | 504.11328125, 64 | 539.7132568359375, 65 | 521.714111328125, 66 | 538.1807861328125, 67 | 267.1368103027344, 68 | 613.9739990234375, 69 | 338.56103515625, 70 | 608.7686767578125, 71 | 274.87188720703125, 72 | 607.8763427734375, 73 | 283.567138671875, 74 | 603.27001953125, 75 | 292.8009033203125, 76 | 599.8602905273438, 77 | 302.42266845703125, 78 | 597.7860107421875, 79 | 312.2459411621094, 80 | 597.1671142578125, 81 | 321.9738464355469, 82 | 598.666259765625, 83 | 331.1184997558594, 84 | 602.3172607421875, 85 | 275.9271240234375, 86 | 616.8050537109375, 87 | 285.071044921875, 88 | 618.0850830078125, 89 | 294.2882995605469, 90 | 618.6539306640625, 91 | 303.5225830078125, 92 | 618.5546264648438, 93 | 312.72259521484375, 94 | 617.7544555664062, 95 | 321.8138427734375, 96 | 616.13134765625, 97 | 330.6938781738281, 98 | 613.5987548828125, 99 | 439.0953063964844, 100 | 596.673828125, 101 | 510.33233642578125, 102 | 582.1712646484375, 103 | 445.93829345703125, 104 | 589.4288330078125, 105 | 454.066162109375, 106 | 583.6622924804688, 107 | 462.93988037109375, 108 | 579.1253662109375, 109 | 472.2335510253906, 110 | 575.5262451171875, 111 | 482.09405517578125, 112 | 574.08251953125, 113 | 492.0478515625, 114 | 574.5523681640625, 115 | 501.6099548339844, 116 | 577.3496704101562, 117 | 448.18359375, 118 | 599.4817504882812, 119 | 457.6839599609375, 120 | 599.9622802734375, 121 | 467.1629943847656, 122 | 599.1675415039062, 123 | 476.6271057128906, 124 | 598.2098999023438, 125 | 485.94366455078125, 126 | 596.2929077148438, 127 | 494.86090087890625, 128 | 592.9861450195312, 129 | 503.26226806640625, 130 | 588.5275268554688, 131 | 399.6906433105469, 132 | 604.6993408203125, 133 | 426.3941955566406, 134 | 704.26806640625, 135 | 413.033935546875, 136 | 654.495849609375, 137 | 424.31158447265625, 138 | 723.6285400390625, 139 | 366.4136047363281, 140 | 726.0325317382812, 141 | 470.31591796875, 142 | 706.3028564453125, 143 | 351.27911376953125, 144 | 799.9676513671875, 145 | 497.71954345703125, 146 | 767.0852661132812, 147 | 361.4605407714844, 148 | 798.7942504882812, 149 | 487.7479248046875, 150 | 768.6436767578125, 151 | 433.7376403808594, 152 | 761.34716796875, 153 | 416.8026123046875, 154 | 762.2481079101562, 155 | 447.1158752441406, 156 | 754.004150390625, 157 | 383.3445739746094, 158 | 779.90673828125, 159 | 473.9256896972656, 160 | 755.7813110351562, 161 | 366.6749572753906, 162 | 788.9202880859375, 163 | 399.5523681640625, 164 | 770.0875244140625, 165 | 460.5859375, 166 | 753.9365234375, 167 | 486.97674560546875, 168 | 759.09814453125, 169 | 446.3305358886719, 170 | 846.7415771484375, 171 | 391.69342041015625, 172 | 838.616455078125, 173 | 483.5704650878906, 174 | 815.1014404296875, 175 | 368.8216552734375, 176 | 822.0794067382812, 177 | 418.149658203125, 178 | 848.41796875, 179 | 468.5687255859375, 180 | 835.154541015625, 181 | 491.8998107910156, 182 | 791.475341796875, 183 | 433.52001953125, 184 | 776.8171997070312, 185 | 435.92498779296875, 186 | 819.8248291015625, 187 | 396.8529052734375, 188 | 785.7368774414062, 189 | 396.5549621582031, 190 | 817.24462890625, 191 | 460.38494873046875, 192 | 770.392578125, 193 | 467.77435302734375, 194 | 800.3748779296875, 195 | 378.8700256347656, 196 | 791.483642578125, 197 | 378.2281188964844, 198 | 809.50634765625, 199 | 415.0164489746094, 200 | 780.577880859375, 201 | 416.0748596191406, 202 | 821.07080078125, 203 | 446.90521240234375, 204 | 773.4071044921875, 205 | 453.2034912109375, 206 | 812.3220825195312, 207 | 473.97113037109375, 208 | 767.90234375, 209 | 479.3009033203125, 210 | 785.4796142578125, 211 | 187.84092712402344, 212 | 612.252685546875, 213 | 557.78564453125, 214 | 559.6723022460938, 215 | 447.35455322265625, 216 | 918.4585571289062, 217 | 254.6355743408203, 218 | 803.96044921875, 219 | 556.8931274414062, 220 | 746.6246337890625, 221 | 213.5446014404297, 222 | 709.877685546875, 223 | 565.3955078125, 224 | 651.6939697265625, 225 | 342.1781311035156, 226 | 885.3983764648438, 227 | 519.74462890625, 228 | 845.4401245117188 229 | ], 230 | "iris": [ 231 | 302.29193115234375, 232 | 606.5498657226562, 233 | 13.759982109069824, 234 | 469.5264587402344, 235 | 592.0059204101562, 236 | 13.759982109069824 237 | ], 238 | "gender": [ 239 | 1 240 | ], 241 | "age": [ 242 | 24 243 | ], 244 | "expression": [ 245 | 1 246 | ], 247 | "glass": [ 248 | 1 249 | ], 250 | "dense_fea_len": 1024, 251 | "dense_fea": [ 252 | 0.010369737632572651, 253 | -0.018359350040555, 254 | -0.0010855661239475012, 255 | -0.01648411527276039, 256 | -0.018084494397044182, 257 | 0.03468078747391701, 258 | -0.055928029119968414, 259 | -0.013484334573149681, 260 | -0.018119266256690025, 261 | 0.008475595153868198, 262 | 0.009095434099435806, 263 | -0.0412028543651104, 264 | 0.019056903198361397, 265 | 0.005071473307907581, 266 | -0.0076396288350224495, 267 | 0.014117667451500893, 268 | 0.01980503648519516, 269 | 0.04111408442258835, 270 | 0.04130648449063301, 271 | -0.0010031223064288497, 272 | 0.00934503972530365, 273 | -0.010067004710435867, 274 | -0.00015163287753239274, 275 | -0.005996390711516142, 276 | 0.018245281651616096, 277 | 0.0230939332395792, 278 | -0.008818180300295353, 279 | 0.012825235724449158, 280 | 0.0005517868557944894, 281 | -0.007891741581261158, 282 | -0.08493317663669586, 283 | 0.03770921751856804, 284 | 0.020771123468875885, 285 | 0.08037567138671875, 286 | 0.005490007810294628, 287 | 0.035569388419389725, 288 | -0.004873041529208422, 289 | -0.0015727381687611341, 290 | 0.0030227182433009148, 291 | -0.03962742164731026, 292 | -0.008161269128322601, 293 | -0.025349117815494537, 294 | -0.02348075620830059, 295 | -0.02029898762702942, 296 | -0.0750977024435997, 297 | 0.044896163046360016, 298 | 0.02871132828295231, 299 | -0.0642780065536499, 300 | 0.023338213562965393, 301 | 0.08397815376520157, 302 | 0.0018952287500724196, 303 | 0.014343787916004658, 304 | 0.01615811511874199, 305 | 0.010354127734899521, 306 | 0.013292298652231693, 307 | 0.010936840437352657, 308 | 0.04625578224658966, 309 | 0.02452217973768711, 310 | 0.031112493947148323, 311 | 0.015432741492986679, 312 | -0.013910877518355846, 313 | -0.024357791990041733, 314 | 0.008820190094411373, 315 | -0.016554158180952072, 316 | -0.008995488286018372, 317 | -0.02374074049293995, 318 | 0.012969774194061756, 319 | 0.031501419842243195, 320 | -0.02389894239604473, 321 | 0.012185955420136452, 322 | 0.016849331557750702, 323 | 0.030953800305724144, 324 | 0.012121397070586681, 325 | 0.036060333251953125, 326 | 0.023158283904194832, 327 | -0.0679500475525856, 328 | -0.027326958253979683, 329 | 0.014195538125932217, 330 | -0.055002178996801376, 331 | 0.017073459923267365, 332 | 0.006685986183583736, 333 | 0.02260267175734043, 334 | -0.025281362235546112, 335 | -0.011441247537732124, 336 | -0.023094478994607925, 337 | -0.04941049590706825, 338 | -0.008790111169219017, 339 | 0.01257971953600645, 340 | -0.009183527901768684, 341 | 0.009756364859640598, 342 | 0.021495811641216278, 343 | 0.004678162280470133, 344 | -0.04006993770599365, 345 | 0.007246925961226225, 346 | -0.04164816066622734, 347 | 0.02073383517563343, 348 | -0.05360955372452736, 349 | -0.01459471881389618, 350 | -0.005788316018879414, 351 | 0.011016757227480412, 352 | 0.00042348093120381236, 353 | 0.010235469788312912, 354 | 0.0007076626643538475, 355 | -0.054129283875226974, 356 | 0.011578692123293877, 357 | -0.007293116766959429, 358 | 0.01605393923819065, 359 | -0.04159999638795853, 360 | -0.030473608523607254, 361 | -0.02027255669236183, 362 | -0.049475789070129395, 363 | 0.08152244985103607, 364 | 0.026406217366456985, 365 | 0.019158050417900085, 366 | -0.01661570928990841, 367 | 0.010894732549786568, 368 | -0.002663981169462204, 369 | 0.021853232756257057, 370 | -0.0025878269225358963, 371 | -0.024683155119419098, 372 | -0.010096126236021519, 373 | -0.026257099583745003, 374 | 0.007461183704435825, 375 | -0.002649569883942604, 376 | 0.015624676831066608, 377 | -0.02822081930935383, 378 | -0.049233049154281616, 379 | 0.02691059559583664, 380 | -0.003622292773798108, 381 | -0.027262292802333832, 382 | -0.0014559084083884954, 383 | 0.048088233917951584, 384 | -0.0087125264108181, 385 | 0.027489908039569855, 386 | -0.006138358730822802, 387 | 0.008564750663936138, 388 | 0.003074375679716468, 389 | -0.043678369373083115, 390 | -0.01800353080034256, 391 | 0.009086651727557182, 392 | 0.015409518964588642, 393 | 0.04357375577092171, 394 | -0.025110485032200813, 395 | -0.036304447799921036, 396 | 0.050798360258340836, 397 | -0.0038929106667637825, 398 | 0.014635118655860424, 399 | -0.032213494181632996, 400 | 0.03510585054755211, 401 | -0.03956246003508568, 402 | -0.016675248742103577, 403 | 0.018986232578754425, 404 | -0.03488076478242874, 405 | -0.00031744324951432645, 406 | 0.0012698532082140446, 407 | 0.021841445937752724, 408 | -0.001469672191888094, 409 | 0.05941088870167732, 410 | 0.022502416744828224, 411 | -0.06138426437973976, 412 | -0.03261585906147957, 413 | 0.07885823398828506, 414 | 0.04370800405740738, 415 | 0.056481245905160904, 416 | -0.05108068883419037, 417 | 0.031755231320858, 418 | -0.019404802471399307, 419 | -0.026448126882314682, 420 | -0.004306877963244915, 421 | -0.038171976804733276, 422 | 0.06254837661981583, 423 | -0.02151418663561344, 424 | 0.0020353891886770725, 425 | -0.013385073281824589, 426 | -0.02676783688366413, 427 | 0.005193979945033789, 428 | 0.0031208444852381945, 429 | -0.023788457736372948, 430 | 0.0037792171351611614, 431 | -0.019156619906425476, 432 | 0.0027115135453641415, 433 | -0.01155094988644123, 434 | 0.010481908917427063, 435 | -0.017189428210258484, 436 | 0.02357681840658188, 437 | -0.002054622396826744, 438 | 0.04750498756766319, 439 | 0.052042488008737564, 440 | -0.056637633591890335, 441 | 0.02234027162194252, 442 | -0.04068493843078613, 443 | 0.00011689581879181787, 444 | -0.036929141730070114, 445 | -0.003430031007155776, 446 | -0.07885448634624481, 447 | 0.04042983800172806, 448 | -0.0162883922457695, 449 | 0.035372279584407806, 450 | -0.02753296308219433, 451 | -0.02311326563358307, 452 | -0.006512257270514965, 453 | 0.016186583787202835, 454 | 0.01560154277831316, 455 | 0.002836551982909441, 456 | -0.016713973134756088, 457 | 0.019116563722491264, 458 | -0.06972987949848175, 459 | 0.036488864570856094, 460 | -0.0245983824133873, 461 | -0.019874364137649536, 462 | -0.03134375438094139, 463 | 0.027148324996232986, 464 | -0.07160863280296326, 465 | 0.0046309614554047585, 466 | 0.02310345135629177, 467 | 0.0226873978972435, 468 | -0.0034231962636113167, 469 | 0.016177082434296608, 470 | 0.035097673535346985, 471 | 0.029701583087444305, 472 | -0.03452666476368904, 473 | 0.03536909073591232, 474 | -0.001959154848009348, 475 | 0.029489019885659218, 476 | -0.06998833268880844, 477 | 0.05028172954916954, 478 | -0.0015496285632252693, 479 | 0.04841488227248192, 480 | 0.025700336322188377, 481 | 0.01842997968196869, 482 | -0.026342716068029404, 483 | 0.006891599856317043, 484 | 0.00325338589027524, 485 | 0.027321821078658104, 486 | 0.017933852970600128, 487 | -0.002817865926772356, 488 | 0.007964158430695534, 489 | -0.023398643359541893, 490 | 0.04045417532324791, 491 | -0.028158871456980705, 492 | 0.04370640218257904, 493 | -0.04316529259085655, 494 | 0.028639547526836395, 495 | 0.04202255606651306, 496 | -0.0338396355509758, 497 | -0.02815432846546173, 498 | -0.05404694378376007, 499 | -0.008066454902291298, 500 | -0.0018402081914246082, 501 | 0.03500097990036011, 502 | -0.015849528834223747, 503 | -0.0018480430589988828, 504 | -0.04355975240468979, 505 | -0.007433389779180288, 506 | 0.03143387660384178, 507 | 0.05952907353639603, 508 | -0.04214317351579666, 509 | -0.02146715112030506, 510 | 0.01727001555263996, 511 | 0.010812553577125072, 512 | 0.027466656640172005, 513 | -0.021945513784885406, 514 | -0.047368329018354416, 515 | 0.0005555613315664232, 516 | 0.013843100517988205, 517 | -0.03657034412026405, 518 | 0.011452822014689445, 519 | 0.0017314086435362697, 520 | 0.015260571613907814, 521 | -0.012789171189069748, 522 | 0.06584221869707108, 523 | -0.05670920014381409, 524 | 0.01652001030743122, 525 | 0.1067478209733963, 526 | -0.03243376314640045, 527 | -0.003910419065505266, 528 | -0.0021248285192996264, 529 | -0.006310167256742716, 530 | -0.040759406983852386, 531 | -0.03337711840867996, 532 | -0.03455077484250069, 533 | 0.01719922386109829, 534 | -0.014941098168492317, 535 | 0.06602355092763901, 536 | -0.024906573817133904, 537 | -0.014168884605169296, 538 | -0.09099312126636505, 539 | -0.03311137855052948, 540 | 0.0075114015489816666, 541 | -0.012011758983135223, 542 | 0.025773756206035614, 543 | 0.02447417378425598, 544 | 0.016607388854026794, 545 | -0.00970899686217308, 546 | -0.002149315783753991, 547 | 0.0708361566066742, 548 | 0.06658202409744263, 549 | -0.006027321796864271, 550 | 0.004575924016535282, 551 | -0.014048563316464424, 552 | 0.010381098836660385, 553 | -0.035123348236083984, 554 | -0.05494828522205353, 555 | 0.01624884083867073, 556 | -0.026502275839447975, 557 | 0.009479745291173458, 558 | 0.0364941731095314, 559 | -0.028178030624985695, 560 | 0.03680587187409401, 561 | -0.025552542880177498, 562 | 0.046079784631729126, 563 | 0.01007598452270031, 564 | 0.0030942726880311966, 565 | 0.0614464208483696, 566 | 0.007707572542130947, 567 | -0.010453050956130028, 568 | 0.0035903030075132847, 569 | -0.04633137583732605, 570 | 0.0647653341293335, 571 | 0.06684880703687668, 572 | -0.018252326175570488, 573 | -0.04403097555041313, 574 | -0.0429631769657135, 575 | -0.001027340767905116, 576 | 0.03569710999727249, 577 | -0.030453918501734734, 578 | -0.035418637096881866, 579 | 0.006798841059207916, 580 | 0.0016505027888342738, 581 | 0.0029755509458482265, 582 | -0.041366562247276306, 583 | 0.023221101611852646, 584 | -0.03720426186919212, 585 | 0.039681222289800644, 586 | 0.011602729558944702, 587 | -0.03163926303386688, 588 | -0.03143879026174545, 589 | -0.0006309629534371197, 590 | 0.017772218212485313, 591 | -0.00713598495349288, 592 | 0.039461176842451096, 593 | 0.049200788140296936, 594 | -0.015540740452706814, 595 | -0.023323029279708862, 596 | -0.009461590088903904, 597 | 0.003345044329762459, 598 | -0.04722202941775322, 599 | 0.04069007560610771, 600 | -0.03197406977415085, 601 | -0.012457874603569508, 602 | -0.01905646361410618, 603 | 0.04056745767593384, 604 | -0.00351954298093915, 605 | 0.028277423232793808, 606 | 0.025323033332824707, 607 | -0.04819904640316963, 608 | 0.01868453621864319, 609 | -0.03035888820886612, 610 | 0.041540998965501785, 611 | 0.005958175286650658, 612 | -0.047008924186229706, 613 | -0.028165986761450768, 614 | 0.06593748927116394, 615 | 0.010422827675938606, 616 | 0.022228725254535675, 617 | 0.024426938965916634, 618 | -0.03996716067194939, 619 | -0.012544251047074795, 620 | -0.059356559067964554, 621 | -0.014910442754626274, 622 | 0.025715088471770287, 623 | 0.08139055222272873, 624 | -0.008080855943262577, 625 | 0.008954869583249092, 626 | 0.03645089268684387, 627 | 0.012458139099180698, 628 | -0.0016917478060349822, 629 | 0.022906998172402382, 630 | 0.05067349597811699, 631 | 0.008894983679056168, 632 | -0.0044798175804317, 633 | 0.017013657838106155, 634 | -0.03232460841536522, 635 | -0.0031705053988844156, 636 | 0.009100865572690964, 637 | 0.03764967620372772, 638 | -0.013297781348228455, 639 | 0.02722596563398838, 640 | 0.02643824927508831, 641 | -0.044249095022678375, 642 | 0.0072669838555157185, 643 | 0.008305934257805347, 644 | -0.04159625247120857, 645 | 0.026406707242131233, 646 | 0.005698720458894968, 647 | -0.024003783240914345, 648 | -0.03430547937750816, 649 | -0.008887657895684242, 650 | -0.006954590789973736, 651 | 0.012839237228035927, 652 | -0.00972551666200161, 653 | -0.008242296054959297, 654 | 0.01826106570661068, 655 | 0.003156147198751569, 656 | -0.02012823335826397, 657 | -0.03096602112054825, 658 | -0.010322796180844307, 659 | -0.007071236614137888, 660 | -0.03771224990487099, 661 | -0.02878347411751747, 662 | -0.01221448089927435, 663 | -0.0040504843927919865, 664 | -0.003920343238860369, 665 | -0.05610354617238045, 666 | -0.033306580036878586, 667 | -0.03789141774177551, 668 | 0.007754690479487181, 669 | -0.0296036284416914, 670 | -0.006082005333155394, 671 | 0.06301572173833847, 672 | -0.008418909274041653, 673 | 0.01750602386891842, 674 | 0.02593628503382206, 675 | -0.0600513331592083, 676 | -0.016575904563069344, 677 | -0.028445834293961525, 678 | -0.032795101404190063, 679 | -0.007455987390130758, 680 | 0.01599166728556156, 681 | -0.0418185219168663, 682 | -0.04083171486854553, 683 | 0.01213398203253746, 684 | -0.019280150532722473, 685 | 0.0027729615103453398, 686 | 0.042430199682712555, 687 | -0.03474767133593559, 688 | 0.020577915012836456, 689 | -0.011269987560808659, 690 | 0.040807463228702545, 691 | 0.04989771544933319, 692 | -0.00827331468462944, 693 | -0.0037274977657943964, 694 | -0.024772528558969498, 695 | -0.01919776014983654, 696 | 0.017125660553574562, 697 | -0.00914284959435463, 698 | -0.024521179497241974, 699 | -0.02001309022307396, 700 | 0.01645750179886818, 701 | 0.0527377650141716, 702 | 0.005807411391288042, 703 | -0.02835759148001671, 704 | -0.005777358543127775, 705 | 0.0008535488741472363, 706 | 0.009464477188885212, 707 | 0.031877513974905014, 708 | -0.026373688131570816, 709 | -0.01056781504303217, 710 | -0.01869719661772251, 711 | 0.000943330000154674, 712 | -0.003941403701901436, 713 | -0.032736875116825104, 714 | 0.009978268295526505, 715 | -0.027463026344776154, 716 | -0.08444606512784958, 717 | -0.02550932765007019, 718 | 0.022602107375860214, 719 | 0.022097062319517136, 720 | 0.09831186383962631, 721 | -0.04357988014817238, 722 | -0.05226161703467369, 723 | -0.03171364217996597, 724 | 0.060916464775800705, 725 | -0.007391121704131365, 726 | -0.031116101890802383, 727 | -0.020502202212810516, 728 | -0.008036580868065357, 729 | -0.04073021188378334, 730 | -0.016207054257392883, 731 | -0.0613236241042614, 732 | 0.008791747502982616, 733 | 0.02728603035211563, 734 | 0.017935536801815033, 735 | 0.0175916850566864, 736 | -0.008348607458174229, 737 | 0.0053017656318843365, 738 | 0.004358892794698477, 739 | 0.015219591557979584, 740 | -0.013552549295127392, 741 | 0.030963357537984848, 742 | -0.015458708629012108, 743 | -0.011455608531832695, 744 | 0.005516557954251766, 745 | -0.0364602655172348, 746 | -0.023690741509199142, 747 | -0.03303877264261246, 748 | 0.008555506356060505, 749 | 0.0314280204474926, 750 | 0.008657990954816341, 751 | 0.04434804990887642, 752 | 0.007684125564992428, 753 | -0.016980808228254318, 754 | -0.03423907607793808, 755 | -0.08686468750238419, 756 | 0.007402138318866491, 757 | -0.024491148069500923, 758 | -0.015983998775482178, 759 | 0.00897216610610485, 760 | -0.0010416695149615407, 761 | 0.02406795509159565, 762 | 0.02532903663814068, 763 | 0.023073995485901833, 764 | 0.013831413350999355, 765 | 0.01604616641998291, 766 | 0.0035144868306815624, 767 | -0.04696264863014221, 768 | 0.03734925389289856, 769 | 0.023712486028671265, 770 | -0.04120257496833801, 771 | -0.031737279146909714, 772 | 0.0028689024038612843, 773 | -0.015357358381152153, 774 | -0.000784349103923887, 775 | -0.013380911201238632, 776 | 0.03205317258834839, 777 | 0.021603574976325035, 778 | -0.026625117287039757, 779 | 0.021816790103912354, 780 | 0.0055961343459784985, 781 | 0.03356127813458443, 782 | -0.0014312531566247344, 783 | -0.006940939463675022, 784 | -0.008112752810120583, 785 | 0.011172834783792496, 786 | 0.0033084687311202288, 787 | -0.04686489328742027, 788 | 0.02956368587911129, 789 | -0.019879646599292755, 790 | -0.007504994049668312, 791 | 0.003058134810999036, 792 | 0.04803495109081268, 793 | -0.011998122557997704, 794 | -0.07033601403236389, 795 | 0.046991460025310516, 796 | 0.04608531668782234, 797 | 0.10034149140119553, 798 | 0.01400294154882431, 799 | 0.028253115713596344, 800 | -0.023367663845419884, 801 | 0.03895584121346474, 802 | 0.02980007790029049, 803 | 0.0009624123922549188, 804 | -0.004206955898553133, 805 | -0.01406593807041645, 806 | 0.01070201676338911, 807 | -0.016713615506887436, 808 | -0.04070541262626648, 809 | 0.013720203191041946, 810 | 0.023280348628759384, 811 | 0.0008951826021075249, 812 | -0.05671229958534241, 813 | 0.05538153648376465, 814 | 0.0020299023017287254, 815 | 0.030135806649923325, 816 | 0.022841624915599823, 817 | 0.01207700651139021, 818 | -0.027283702045679092, 819 | -0.03795225918292999, 820 | 0.031777385622262955, 821 | 0.03995214402675629, 822 | 0.023514121770858765, 823 | 0.035231444984674454, 824 | 0.009438632987439632, 825 | -0.06184502691030502, 826 | 0.029282119125127792, 827 | -0.006372655276209116, 828 | -0.04060773551464081, 829 | -0.029725831001996994, 830 | 0.01286657527089119, 831 | 0.03965448960661888, 832 | 0.0013511670986190438, 833 | 0.014095823280513287, 834 | -0.008109182119369507, 835 | -0.015465290285646915, 836 | 0.04417947679758072, 837 | 0.015605579130351543, 838 | 0.01711166836321354, 839 | -0.033721767365932465, 840 | -0.0054610916413366795, 841 | 0.019009478390216827, 842 | 0.0066606430336833, 843 | -0.009129971265792847, 844 | -0.025538917630910873, 845 | 0.059856679290533066, 846 | -0.015516654588282108, 847 | 0.010501325130462646, 848 | -0.032512079924345016, 849 | -0.06639694422483444, 850 | 0.03819119557738304, 851 | 0.03710247576236725, 852 | -0.048515792936086655, 853 | 0.060361817479133606, 854 | 0.02304978482425213, 855 | -0.006840345449745655, 856 | 0.030197566375136375, 857 | 0.04420598968863487, 858 | -0.05227664113044739, 859 | 0.05760578066110611, 860 | -0.0013046660460531712, 861 | -0.06709874421358109, 862 | 0.002354817232117057, 863 | 0.006711214315146208, 864 | -0.030980225652456284, 865 | -0.008008968085050583, 866 | 0.024804770946502686, 867 | -0.006755850277841091, 868 | 0.01992088183760643, 869 | 0.015417098067700863, 870 | -0.00353544601239264, 871 | -0.07168493419885635, 872 | 0.0038562819827347994, 873 | -0.0018147568916901946, 874 | 0.012820585630834103, 875 | -0.005723044741898775, 876 | -0.0030269413255155087, 877 | -0.021559221670031548, 878 | 0.023088645190000534, 879 | 0.044883646070957184, 880 | -0.0015520090237259865, 881 | 0.0266138706356287, 882 | 0.021561015397310257, 883 | -0.0710233822464943, 884 | 0.02425670064985752, 885 | -0.006567861884832382, 886 | 0.02443915791809559, 887 | -0.02994173765182495, 888 | 0.03410451486706734, 889 | 0.028768979012966156, 890 | -0.006065495777875185, 891 | 0.012170159257948399, 892 | 0.03890615701675415, 893 | 0.01218863483518362, 894 | 0.02131110243499279, 895 | 0.06498575210571289, 896 | 0.03402872011065483, 897 | -0.006836988031864166, 898 | -0.02302553504705429, 899 | 0.01821540668606758, 900 | 0.009166719391942024, 901 | -0.02879411354660988, 902 | -0.06322001665830612, 903 | 0.012572470121085644, 904 | 0.047521866858005524, 905 | 0.018490903079509735, 906 | 0.015593128278851509, 907 | -0.00934317521750927, 908 | -0.003443855093792081, 909 | 0.009257246740162373, 910 | 0.0003716413048096001, 911 | -0.002084351610392332, 912 | 0.02410927787423134, 913 | 0.023154444992542267, 914 | 0.0022932759020477533, 915 | 0.006358525715768337, 916 | -0.017136311158537865, 917 | -0.006345989648252726, 918 | -0.018690427765250206, 919 | -0.0017018014332279563, 920 | -0.04766950011253357, 921 | -0.020117243751883507, 922 | 0.033139266073703766, 923 | -0.003619966795668006, 924 | 0.042094115167856216, 925 | -0.0023478884249925613, 926 | 0.09483738243579865, 927 | 0.016351735219359398, 928 | -0.01946905069053173, 929 | -0.01768735982477665, 930 | -0.006126597989350557, 931 | -0.005248998291790485, 932 | -0.03409816324710846, 933 | 0.06580764055252075, 934 | 0.06116033345460892, 935 | -0.011341225355863571, 936 | -0.017267223447561264, 937 | 0.004612516146153212, 938 | 0.02040739916265011, 939 | -0.04630746319890022, 940 | 0.04425081983208656, 941 | -0.024970300495624542, 942 | -0.019898412749171257, 943 | -0.007064693607389927, 944 | 0.045184873044490814, 945 | 0.011897753924131393, 946 | -0.04232151806354523, 947 | 0.019234856590628624, 948 | 0.0035640429705381393, 949 | -0.003753779688850045, 950 | -0.003191612660884857, 951 | 0.06927173584699631, 952 | 0.01017800997942686, 953 | -0.0011015833588317037, 954 | 0.0027263243682682514, 955 | 0.013740455731749535, 956 | 0.022218266502022743, 957 | 0.05881507322192192, 958 | -0.08093671500682831, 959 | -0.02593536674976349, 960 | -0.04785292595624924, 961 | 0.0234855767339468, 962 | -0.06506112962961197, 963 | 0.014685692265629768, 964 | 0.043304335325956345, 965 | -0.04482579231262207, 966 | 0.005224392283707857, 967 | 0.005733697675168514, 968 | -0.03183584660291672, 969 | 0.0467492900788784, 970 | -0.028499243780970573, 971 | 0.04641760513186455, 972 | 0.04784184694290161, 973 | -0.007938547059893608, 974 | -0.030349725857377052, 975 | 0.00690878601744771, 976 | -0.033920370042324066, 977 | 0.022110875695943832, 978 | 0.007714502047747374, 979 | 0.028601763769984245, 980 | -0.038527101278305054, 981 | 0.03212019428610802, 982 | 0.0050634839572012424, 983 | 0.053048375993967056, 984 | -0.019157517701387405, 985 | 0.05121256783604622, 986 | 0.024720940738916397, 987 | 0.00765758054330945, 988 | -0.07104900479316711, 989 | 0.023844998329877853, 990 | -0.004541719797998667, 991 | -0.032509978860616684, 992 | -0.04668011888861656, 993 | 0.04224593937397003, 994 | 0.016616830602288246, 995 | -0.003852599998936057, 996 | 0.0033459786791354418, 997 | 0.0045876288786530495, 998 | -0.012392206117510796, 999 | 0.004311623517423868, 1000 | -0.013701732270419598, 1001 | 0.03248421475291252, 1002 | -0.01306107547134161, 1003 | -0.009103194810450077, 1004 | 0.03860118240118027, 1005 | -0.024170435965061188, 1006 | 0.01163218542933464, 1007 | -0.0024142346810549498, 1008 | -0.00031764490995556116, 1009 | 0.0054822745732963085, 1010 | -0.006708032917231321, 1011 | -0.0028675405774265528, 1012 | 0.010580302216112614, 1013 | 0.04084283113479614, 1014 | 0.004928136244416237, 1015 | 0.020055163651704788, 1016 | -0.018178554251790047, 1017 | -0.03338776156306267, 1018 | -0.014681240543723106, 1019 | 0.03514324501156807, 1020 | -0.00445611122995615, 1021 | 0.0174818467348814, 1022 | 0.0074042570777237415, 1023 | -0.04309770092368126, 1024 | -0.01056754495948553, 1025 | 0.026755625382065773, 1026 | -0.018003137782216072, 1027 | -0.007759736850857735, 1028 | 0.04051350802183151, 1029 | -0.08060251176357269, 1030 | 0.026464227586984634, 1031 | 0.03577281907200813, 1032 | 0.0265726950019598, 1033 | -0.030302604660391808, 1034 | -0.010387744754552841, 1035 | -0.0038518940564244986, 1036 | 0.010771953500807285, 1037 | 0.021576594561338425, 1038 | -0.03654320165514946, 1039 | 0.021910913288593292, 1040 | -0.016464198008179665, 1041 | 0.00002477536691003479, 1042 | -0.05793359875679016, 1043 | -0.018207615241408348, 1044 | -0.011609618552029133, 1045 | 0.03460685908794403, 1046 | -0.03938853740692139, 1047 | 0.03882979974150658, 1048 | 0.03920603170990944, 1049 | 0.04181601107120514, 1050 | -0.02085883542895317, 1051 | -0.013887736015021801, 1052 | 0.005755772814154625, 1053 | 0.008466222323477268, 1054 | 0.00934943649917841, 1055 | 0.03703910484910011, 1056 | 0.02387581579387188, 1057 | 0.023882867768406868, 1058 | -0.004808999598026276, 1059 | 0.029627839103341103, 1060 | 0.02080645225942135, 1061 | -0.0786491334438324, 1062 | 0.0017685246421024203, 1063 | -0.002365980762988329, 1064 | -0.02747323550283909, 1065 | -0.003465049434453249, 1066 | -0.0298933032900095, 1067 | 0.037898436188697815, 1068 | -0.005244098603725433, 1069 | -0.012673421762883663, 1070 | 0.024413883686065674, 1071 | 0.026735499501228333, 1072 | 0.04923264682292938, 1073 | -0.012619285844266415, 1074 | 0.07730822265148163, 1075 | 0.01301938109099865, 1076 | -0.03524712100625038, 1077 | 0.04345472529530525, 1078 | 0.04546684771776199, 1079 | -0.03359607979655266, 1080 | 0.020261012017726898, 1081 | 0.006250206846743822, 1082 | -0.020164214074611664, 1083 | 0.01765625737607479, 1084 | -0.013649155385792255, 1085 | -0.02729724906384945, 1086 | 0.00838346965610981, 1087 | -0.048873595893383026, 1088 | 0.034283947199583054, 1089 | -0.05206168442964554, 1090 | -0.009654776193201542, 1091 | -0.02412988431751728, 1092 | -0.0301681999117136, 1093 | 0.031419068574905396, 1094 | -0.0011876216158270836, 1095 | 0.023012081161141396, 1096 | -0.01824779063463211, 1097 | 0.013783717527985573, 1098 | -0.018572881817817688, 1099 | -0.003794423770159483, 1100 | -0.009493599645793438, 1101 | -0.004022304434329271, 1102 | -0.0020170866046100855, 1103 | 0.022895488888025284, 1104 | 0.0036880853585898876, 1105 | 0.0062835025601089, 1106 | -0.03536725416779518, 1107 | -0.08046938478946686, 1108 | -0.014558871276676655, 1109 | 0.0014634146355092525, 1110 | -0.03891449794173241, 1111 | -0.018706107512116432, 1112 | -0.001772774849087, 1113 | -0.055530816316604614, 1114 | -0.011321849189698696, 1115 | -0.007901863195002079, 1116 | 0.02676454372704029, 1117 | -0.0015101624885573983, 1118 | -0.018843621015548706, 1119 | -0.004854913335293531, 1120 | 0.030428865924477577, 1121 | 0.00752382492646575, 1122 | 0.05765553191304207, 1123 | -0.011062818579375744, 1124 | 0.0032088945154100657, 1125 | 0.033822327852249146, 1126 | 0.015853388234972954, 1127 | 0.015329153276979923, 1128 | -0.004718965385109186, 1129 | 0.005517640151083469, 1130 | -0.06339147686958313, 1131 | -0.008104012347757816, 1132 | -0.03387967497110367, 1133 | 0.006955438293516636, 1134 | 0.06852255761623383, 1135 | 0.006249603349715471, 1136 | -0.03383012115955353, 1137 | -0.02842674031853676, 1138 | 0.0024496125988662243, 1139 | -0.013500294648110867, 1140 | 0.024460701271891594, 1141 | -0.01968991942703724, 1142 | 0.019266614690423012, 1143 | 0.008962108753621578, 1144 | 0.012144058011472225, 1145 | 0.057943351566791534, 1146 | -0.041081637144088745, 1147 | -0.03646403178572655, 1148 | 0.0016942935762926936, 1149 | 0.041024621576070786, 1150 | -0.01002003438770771, 1151 | 0.009052231907844543, 1152 | -0.020688144490122795, 1153 | -0.022461526095867157, 1154 | -0.02060692012310028, 1155 | 0.036591023206710815, 1156 | -0.03630656749010086, 1157 | 0.0041379546746611595, 1158 | -0.025636274367570877, 1159 | -0.04827702045440674, 1160 | 0.0006700247176922858, 1161 | -0.07139536738395691, 1162 | 0.01233162172138691, 1163 | 0.005530840251594782, 1164 | -0.04159719496965408, 1165 | -0.03121950849890709, 1166 | -0.03850753232836723, 1167 | 0.019120384007692337, 1168 | 0.001201034290716052, 1169 | -0.013943075202405453, 1170 | -0.037504155188798904, 1171 | 0.004742304794490337, 1172 | -0.05847293511033058, 1173 | -0.012825793586671352, 1174 | 0.01025218516588211, 1175 | -0.02052108570933342, 1176 | -0.044101204723119736, 1177 | -0.053069233894348145, 1178 | 0.0115785151720047, 1179 | -0.022000903263688087, 1180 | 0.018844304606318474, 1181 | -0.017648469656705856, 1182 | 0.05118422955274582, 1183 | 0.036368075758218765, 1184 | -0.03114856220781803, 1185 | -0.01078412588685751, 1186 | 0.01484397891908884, 1187 | -0.0503004789352417, 1188 | -0.03932851180434227, 1189 | -0.036065276712179184, 1190 | -0.03258390352129936, 1191 | -0.029931863769888878, 1192 | -0.004410754423588514, 1193 | -0.020454859361052513, 1194 | -0.032061364501714706, 1195 | 0.06541398167610168, 1196 | -0.04773079976439476, 1197 | -0.010130354203283787, 1198 | 0.0301600843667984, 1199 | -0.00579746812582016, 1200 | 0.02249440737068653, 1201 | 0.017386017367243767, 1202 | 0.0348648764193058, 1203 | 0.021175682544708252, 1204 | -0.0015710723819211125, 1205 | 0.01742665097117424, 1206 | 0.0015204264782369137, 1207 | -0.0642550140619278, 1208 | -0.04584803804755211, 1209 | -0.05578513815999031, 1210 | -0.003531461814418435, 1211 | -0.02597183734178543, 1212 | -0.016038736328482628, 1213 | -0.03395417332649231, 1214 | 0.011072931811213493, 1215 | -0.05411068722605705, 1216 | -0.0047948420979082584, 1217 | 0.03585442900657654, 1218 | 0.002336811972782016, 1219 | -0.00005560136924032122, 1220 | 0.00992259755730629, 1221 | -0.03551313281059265, 1222 | -0.010763482190668583, 1223 | 0.016201846301555634, 1224 | 0.059916410595178604, 1225 | -0.004319059196859598, 1226 | -0.028503134846687317, 1227 | -0.0462869331240654, 1228 | -0.03568681702017784, 1229 | -0.04969386011362076, 1230 | -0.018543042242527008, 1231 | 0.06484539806842804, 1232 | 0.04455933719873428, 1233 | -0.03548261523246765, 1234 | 0.006563343107700348, 1235 | -0.0014365245588123798, 1236 | 0.00975851621478796, 1237 | -0.037953443825244904, 1238 | 0.0099526671692729, 1239 | -0.021168440580368042, 1240 | -0.02887938730418682, 1241 | -0.007048686966300011, 1242 | 0.014641661196947098, 1243 | -0.0016501935897395015, 1244 | -0.009829320013523102, 1245 | 0.016413697972893715, 1246 | 0.02062092162668705, 1247 | 0.01848277822136879, 1248 | -0.01970694586634636, 1249 | 0.032749783247709274, 1250 | 0.005349508486688137, 1251 | -0.014921982772648335, 1252 | -0.015863077715039253, 1253 | -0.02551533468067646, 1254 | -0.005984398536384106, 1255 | -0.03213050588965416, 1256 | 0.022663533687591553, 1257 | -0.07036059349775314, 1258 | 0.06467537581920624, 1259 | 0.0460866279900074, 1260 | 0.013704109936952591, 1261 | 0.03835226967930794, 1262 | -0.021044038236141205, 1263 | 0.08406193554401398, 1264 | 0.009271081537008286, 1265 | -0.07066450268030167, 1266 | -0.030268767848610878, 1267 | -0.022473962977528572, 1268 | 0.020336948335170746, 1269 | -0.02243119664490223, 1270 | -0.048099976032972336, 1271 | 0.025066552683711052, 1272 | -0.08288319408893585, 1273 | 0.005993732251226902, 1274 | 0.033556342124938965, 1275 | -0.004570336546748877 1276 | ], 1277 | "errno": 0, 1278 | "request_id": "aee83553-a9d9-4137-8d9d-6edf692c0ee4" 1279 | } -------------------------------------------------------------------------------- /src/main/resources/static/html/finish.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Step1:上传照片 8 | 9 | 51 | 52 | 53 | 70 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 |
88 | 89 |
90 |
91 | 92 | 93 | 94 | 95 |
96 | 97 | 117 |
118 | 119 |
120 | 121 |
122 | 123 | 126 | 127 | 130 | 131 | 132 | 142 | 143 | 144 | 145 | 146 | 176 | 177 | 178 | 179 | 180 | 181 | 182 | 183 | 184 | 185 | -------------------------------------------------------------------------------- /src/main/resources/static/html/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 人工智能帮您看面相-基于深度学习技术 8 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 |
28 | 29 | 30 | 31 | 32 | 33 | 34 |
35 |
36 | 37 |
38 | 39 |
40 | 41 | 42 | 61 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /src/main/resources/static/html/result.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Step2:查看结果 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 50 | 51 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 |
68 |
69 | 70 |
71 | 72 | 73 |
74 | 75 |
76 |
77 | 78 |
79 |
80 |
81 |
82 | 83 | 84 | 85 | 86 | 87 | 88 |
89 | 90 |
91 |
92 |
93 | 94 | 95 |
96 |
97 |
98 |
100 | 101 | 102 | 103 |
104 |
105 |

长按图片可保存分享

106 |
107 |
108 |
109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 159 | 160 | 161 | 162 | -------------------------------------------------------------------------------- /src/main/resources/static/html/result2.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Title 8 | 9 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 |
46 | 47 |
48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 |
65 | 66 | 67 | 68 | 69 | 70 | -------------------------------------------------------------------------------- /src/main/resources/static/images/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/1.png -------------------------------------------------------------------------------- /src/main/resources/static/images/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/2.png -------------------------------------------------------------------------------- /src/main/resources/static/images/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/3.png -------------------------------------------------------------------------------- /src/main/resources/static/images/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/4.png -------------------------------------------------------------------------------- /src/main/resources/static/images/Asleep.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/Asleep.png -------------------------------------------------------------------------------- /src/main/resources/static/images/Awake.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/Awake.png -------------------------------------------------------------------------------- /src/main/resources/static/images/arrow.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/arrow.png -------------------------------------------------------------------------------- /src/main/resources/static/images/bk1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/bk1.png -------------------------------------------------------------------------------- /src/main/resources/static/images/bk2.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/bk2.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/bk3.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/bk3.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/bk4.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/bk4.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/bk5.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/bk5.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/chakanjieguo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/chakanjieguo.png -------------------------------------------------------------------------------- /src/main/resources/static/images/demo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/demo.png -------------------------------------------------------------------------------- /src/main/resources/static/images/desc.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/desc.png -------------------------------------------------------------------------------- /src/main/resources/static/images/desc1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/desc1.png -------------------------------------------------------------------------------- /src/main/resources/static/images/desc2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/desc2.png -------------------------------------------------------------------------------- /src/main/resources/static/images/desc3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/desc3.png -------------------------------------------------------------------------------- /src/main/resources/static/images/desc_old.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/desc_old.png -------------------------------------------------------------------------------- /src/main/resources/static/images/free.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/free.png -------------------------------------------------------------------------------- /src/main/resources/static/images/free_old.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/free_old.png -------------------------------------------------------------------------------- /src/main/resources/static/images/man.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/man.png -------------------------------------------------------------------------------- /src/main/resources/static/images/photo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/photo.png -------------------------------------------------------------------------------- /src/main/resources/static/images/photo_old.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/photo_old.png -------------------------------------------------------------------------------- /src/main/resources/static/images/plus.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/plus.png -------------------------------------------------------------------------------- /src/main/resources/static/images/qrcode.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/qrcode.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/reco.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/reco.jpg -------------------------------------------------------------------------------- /src/main/resources/static/images/result14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/result14.png -------------------------------------------------------------------------------- /src/main/resources/static/images/result15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/result15.png -------------------------------------------------------------------------------- /src/main/resources/static/images/save.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/save.png -------------------------------------------------------------------------------- /src/main/resources/static/images/startAnalysis.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/startAnalysis.png -------------------------------------------------------------------------------- /src/main/resources/static/images/startAnalysis_old.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/startAnalysis_old.png -------------------------------------------------------------------------------- /src/main/resources/static/images/takePhoto.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/takePhoto.png -------------------------------------------------------------------------------- /src/main/resources/static/images/takePhoto_old.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/takePhoto_old.png -------------------------------------------------------------------------------- /src/main/resources/static/images/title.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/title.png -------------------------------------------------------------------------------- /src/main/resources/static/images/title2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/title2.png -------------------------------------------------------------------------------- /src/main/resources/static/images/title3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/title3.png -------------------------------------------------------------------------------- /src/main/resources/static/images/title4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/title4.png -------------------------------------------------------------------------------- /src/main/resources/static/images/title5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/bz51/AIFace/bd09c79594144ac25984ebf4dcafd92472a651db/src/main/resources/static/images/title5.png -------------------------------------------------------------------------------- /src/main/resources/static/js/canvas.js: -------------------------------------------------------------------------------- 1 | var canvas = document.getElementById("cas"); 2 | var ctx = canvas.getContext("2d"); 3 | resize(); 4 | window.onresize = resize; 5 | function resize() { 6 | canvas.width = window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth; 7 | canvas.height = window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight; 8 | } 9 | var RAF = (function() { 10 | return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(callback) { 11 | window.setTimeout(callback, 1000 / 120); 12 | }; 13 | })(); 14 | // 鼠标活动时,获取鼠标坐标 15 | var warea = {x: null, y: null, max: 20000}; 16 | window.onmousemove = function(e) { 17 | e = e || window.event; 18 | warea.x = e.clientX; 19 | warea.y = e.clientY; 20 | }; 21 | window.onmouseout = function(e) { 22 | warea.x = null; 23 | warea.y = null; 24 | }; 25 | // 添加粒子 26 | // x,y为粒子坐标,xa, ya为粒子xy轴加速度,max为连线的最大距离 27 | var dots = []; 28 | for (var i = 0; i < 40; i++) { 29 | var x = Math.random() * canvas.width; 30 | var y = Math.random() * canvas.height; 31 | var xa = Math.random() * 2 - 1; 32 | var ya = Math.random() * 2 - 1; 33 | dots.push({ 34 | x: x, 35 | y: y, 36 | xa: xa, 37 | ya: ya, 38 | max: 6000 39 | }) 40 | } 41 | // 延迟100秒开始执行动画,如果立即执行有时位置计算会出错 42 | setTimeout(function() { 43 | animate(); 44 | }, 100); 45 | // 每一帧循环的逻辑 46 | function animate() { 47 | ctx.clearRect(0, 0, canvas.width, canvas.height); 48 | // 将鼠标坐标添加进去,产生一个用于比对距离的点数组 49 | var ndots = [warea].concat(dots); 50 | dots.forEach(function(dot) { 51 | // 粒子位移 52 | dot.x += dot.xa; 53 | dot.y += dot.ya; 54 | // 遇到边界将加速度反向 55 | dot.xa *= (dot.x > canvas.width || dot.x < 0) ? -1 : 1; 56 | dot.ya *= (dot.y > canvas.height || dot.y < 0) ? -1 : 1; 57 | // 绘制点 58 | ctx.fillRect(dot.x - 0.5, dot.y - 0.5, 1, 1); 59 | // 循环比对粒子间的距离 60 | for (var i = 0; i < ndots.length; i++) { 61 | var d2 = ndots[i]; 62 | if (dot === d2 || d2.x === null || d2.y === null) continue; 63 | var xc = dot.x - d2.x; 64 | var yc = dot.y - d2.y; 65 | // 两个粒子之间的距离 66 | var dis = xc * xc + yc * yc; 67 | // 距离比 68 | var ratio; 69 | // 如果两个粒子之间的距离小于粒子对象的max值,则在两个粒子间画线 70 | if (dis < d2.max) { 71 | // 如果是鼠标,则让粒子向鼠标的位置移动 72 | // if (d2 === warea && dis > (d2.max / 2)) { 73 | // dot.x -= xc * 0.03; 74 | // dot.y -= yc * 0.03; 75 | // } 76 | // 计算距离比 77 | ratio = (d2.max - dis) / d2.max; 78 | // 画线 79 | ctx.beginPath(); 80 | ctx.lineWidth = ratio / 2; 81 | ctx.strokeStyle = 'rgba(201,203,206,' + (ratio + 0.2) + ')'; 82 | ctx.moveTo(dot.x, dot.y); 83 | ctx.lineTo(d2.x, d2.y); 84 | ctx.stroke(); 85 | } 86 | } 87 | // 将已经计算过的粒子从数组中删除 88 | ndots.splice(ndots.indexOf(dot), 1); 89 | }); 90 | RAF(animate); 91 | } 92 | -------------------------------------------------------------------------------- /src/main/resources/static/js/classie.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * classie - class helper functions 3 | * from bonzo https://github.com/ded/bonzo 4 | * 5 | * classie.has( elem, 'my-class' ) -> true/false 6 | * classie.add( elem, 'my-new-class' ) 7 | * classie.remove( elem, 'my-unwanted-class' ) 8 | * classie.toggle( elem, 'my-class' ) 9 | */ 10 | 11 | /*jshint browser: true, strict: true, undef: true */ 12 | /*global define: false */ 13 | 14 | ( function( window ) { 15 | 16 | 'use strict'; 17 | 18 | // class helper functions from bonzo https://github.com/ded/bonzo 19 | 20 | function classReg( className ) { 21 | return new RegExp("(^|\\s+)" + className + "(\\s+|$)"); 22 | } 23 | 24 | // classList support for class management 25 | // altho to be fair, the api sucks because it won't accept multiple classes at once 26 | var hasClass, addClass, removeClass; 27 | 28 | if ( 'classList' in document.documentElement ) { 29 | hasClass = function( elem, c ) { 30 | return elem.classList.contains( c ); 31 | }; 32 | addClass = function( elem, c ) { 33 | elem.classList.add( c ); 34 | }; 35 | removeClass = function( elem, c ) { 36 | elem.classList.remove( c ); 37 | }; 38 | } 39 | else { 40 | hasClass = function( elem, c ) { 41 | return classReg( c ).test( elem.className ); 42 | }; 43 | addClass = function( elem, c ) { 44 | if ( !hasClass( elem, c ) ) { 45 | elem.className = elem.className + ' ' + c; 46 | } 47 | }; 48 | removeClass = function( elem, c ) { 49 | elem.className = elem.className.replace( classReg( c ), ' ' ); 50 | }; 51 | } 52 | 53 | function toggleClass( elem, c ) { 54 | var fn = hasClass( elem, c ) ? removeClass : addClass; 55 | fn( elem, c ); 56 | } 57 | 58 | var classie = { 59 | // full names 60 | hasClass: hasClass, 61 | addClass: addClass, 62 | removeClass: removeClass, 63 | toggleClass: toggleClass, 64 | // short names 65 | has: hasClass, 66 | add: addClass, 67 | remove: removeClass, 68 | toggle: toggleClass 69 | }; 70 | 71 | // transport 72 | if ( typeof define === 'function' && define.amd ) { 73 | // AMD 74 | define( classie ); 75 | } else { 76 | // browser global 77 | window.classie = classie; 78 | } 79 | 80 | })( window ); 81 | -------------------------------------------------------------------------------- /src/main/resources/static/js/common.js: -------------------------------------------------------------------------------- 1 | var finishURL = "http://www.chaimm.com/html/finish.html"; 2 | var appID = "wx82de919618ed3240"; 3 | 4 | /* 5 | * A JavaScript implementation of the Secure Hash Algorithm, SHA-1, as defined 6 | * in FIPS PUB 180-1 7 | * Version 2.1a Copyright Paul Johnston 2000 - 2002. 8 | * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet 9 | * Distributed under the BSD License 10 | * See http://pajhome.org.uk/crypt/md5 for details. 11 | */ 12 | 13 | /* 14 | * Configurable variables. You may need to tweak these to be compatible with 15 | * the server-side, but the defaults work in most cases. 16 | */ 17 | var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase */ 18 | var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance */ 19 | var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode */ 20 | 21 | /* 22 | * These are the functions you'll usually want to call 23 | * They take string arguments and return either hex or base-64 encoded strings 24 | */ 25 | function hex_sha1(s){return binb2hex(core_sha1(str2binb(s),s.length * chrsz));} 26 | function b64_sha1(s){return binb2b64(core_sha1(str2binb(s),s.length * chrsz));} 27 | function str_sha1(s){return binb2str(core_sha1(str2binb(s),s.length * chrsz));} 28 | function hex_hmac_sha1(key, data){ return binb2hex(core_hmac_sha1(key, data));} 29 | function b64_hmac_sha1(key, data){ return binb2b64(core_hmac_sha1(key, data));} 30 | function str_hmac_sha1(key, data){ return binb2str(core_hmac_sha1(key, data));} 31 | 32 | /* 33 | * Perform a simple self-test to see if the VM is working 34 | */ 35 | function sha1_vm_test() 36 | { 37 | return hex_sha1("abc") == "a9993e364706816aba3e25717850c26c9cd0d89d"; 38 | } 39 | 40 | /* 41 | * Calculate the SHA-1 of an array of big-endian words, and a bit length 42 | */ 43 | function core_sha1(x, len) 44 | { 45 | /* append padding */ 46 | x[len >> 5] |= 0x80 << (24 - len % 32); 47 | x[((len + 64 >> 9) << 4) + 15] = len; 48 | 49 | var w = Array(80); 50 | var a = 1732584193; 51 | var b = -271733879; 52 | var c = -1732584194; 53 | var d = 271733878; 54 | var e = -1009589776; 55 | 56 | for(var i = 0; i < x.length; i += 16) 57 | { 58 | var olda = a; 59 | var oldb = b; 60 | var oldc = c; 61 | var oldd = d; 62 | var olde = e; 63 | 64 | for(var j = 0; j < 80; j++) 65 | { 66 | if(j < 16) w[j] = x[i + j]; 67 | else w[j] = rol(w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16], 1); 68 | var t = safe_add(safe_add(rol(a, 5), sha1_ft(j, b, c, d)), 69 | safe_add(safe_add(e, w[j]), sha1_kt(j))); 70 | e = d; 71 | d = c; 72 | c = rol(b, 30); 73 | b = a; 74 | a = t; 75 | } 76 | 77 | a = safe_add(a, olda); 78 | b = safe_add(b, oldb); 79 | c = safe_add(c, oldc); 80 | d = safe_add(d, oldd); 81 | e = safe_add(e, olde); 82 | } 83 | return Array(a, b, c, d, e); 84 | 85 | } 86 | 87 | /* 88 | * Perform the appropriate triplet combination function for the current 89 | * iteration 90 | */ 91 | function sha1_ft(t, b, c, d) 92 | { 93 | if(t < 20) return (b & c) | ((~b) & d); 94 | if(t < 40) return b ^ c ^ d; 95 | if(t < 60) return (b & c) | (b & d) | (c & d); 96 | return b ^ c ^ d; 97 | } 98 | 99 | /* 100 | * Determine the appropriate additive constant for the current iteration 101 | */ 102 | function sha1_kt(t) 103 | { 104 | return (t < 20) ? 1518500249 : (t < 40) ? 1859775393 : 105 | (t < 60) ? -1894007588 : -899497514; 106 | } 107 | 108 | /* 109 | * Calculate the HMAC-SHA1 of a key and some data 110 | */ 111 | function core_hmac_sha1(key, data) 112 | { 113 | var bkey = str2binb(key); 114 | if(bkey.length > 16) bkey = core_sha1(bkey, key.length * chrsz); 115 | 116 | var ipad = Array(16), opad = Array(16); 117 | for(var i = 0; i < 16; i++) 118 | { 119 | ipad[i] = bkey[i] ^ 0x36363636; 120 | opad[i] = bkey[i] ^ 0x5C5C5C5C; 121 | } 122 | 123 | var hash = core_sha1(ipad.concat(str2binb(data)), 512 + data.length * chrsz); 124 | return core_sha1(opad.concat(hash), 512 + 160); 125 | } 126 | 127 | /* 128 | * Add integers, wrapping at 2^32. This uses 16-bit operations internally 129 | * to work around bugs in some JS interpreters. 130 | */ 131 | function safe_add(x, y) 132 | { 133 | var lsw = (x & 0xFFFF) + (y & 0xFFFF); 134 | var msw = (x >> 16) + (y >> 16) + (lsw >> 16); 135 | return (msw << 16) | (lsw & 0xFFFF); 136 | } 137 | 138 | /* 139 | * Bitwise rotate a 32-bit number to the left. 140 | */ 141 | function rol(num, cnt) 142 | { 143 | return (num << cnt) | (num >>> (32 - cnt)); 144 | } 145 | 146 | /* 147 | * Convert an 8-bit or 16-bit string to an array of big-endian words 148 | * In 8-bit function, characters >255 have their hi-byte silently ignored. 149 | */ 150 | function str2binb(str) 151 | { 152 | var bin = Array(); 153 | var mask = (1 << chrsz) - 1; 154 | for(var i = 0; i < str.length * chrsz; i += chrsz) 155 | bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (32 - chrsz - i%32); 156 | return bin; 157 | } 158 | 159 | /* 160 | * Convert an array of big-endian words to a string 161 | */ 162 | function binb2str(bin) 163 | { 164 | var str = ""; 165 | var mask = (1 << chrsz) - 1; 166 | for(var i = 0; i < bin.length * 32; i += chrsz) 167 | str += String.fromCharCode((bin[i>>5] >>> (32 - chrsz - i%32)) & mask); 168 | return str; 169 | } 170 | 171 | /* 172 | * Convert an array of big-endian words to a hex string. 173 | */ 174 | function binb2hex(binarray) 175 | { 176 | var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef"; 177 | var str = ""; 178 | for(var i = 0; i < binarray.length * 4; i++) 179 | { 180 | str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) + 181 | hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8 )) & 0xF); 182 | } 183 | return str; 184 | } 185 | 186 | /* 187 | * Convert an array of big-endian words to a base-64 string 188 | */ 189 | function binb2b64(binarray) 190 | { 191 | var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; 192 | var str = ""; 193 | for(var i = 0; i < binarray.length * 4; i += 3) 194 | { 195 | var triplet = (((binarray[i >> 2] >> 8 * (3 - i %4)) & 0xFF) << 16) 196 | | (((binarray[i+1 >> 2] >> 8 * (3 - (i+1)%4)) & 0xFF) << 8 ) 197 | | ((binarray[i+2 >> 2] >> 8 * (3 - (i+2)%4)) & 0xFF); 198 | for(var j = 0; j < 4; j++) 199 | { 200 | if(i * 8 + j * 6 > binarray.length * 32) str += b64pad; 201 | else str += tab.charAt((triplet >> 6*(3-j)) & 0x3F); 202 | } 203 | } 204 | return str; 205 | } 206 | 207 | /** 208 | * 生成指定长度随机字符串 209 | */ 210 | function randomString(len) { 211 | len = len || 32; 212 | var $chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678'; /****默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1****/ 213 | var maxPos = $chars.length; 214 | var pwd = ''; 215 | for (i = 0; i < len; i++) { 216 | pwd += $chars.charAt(Math.floor(Math.random() * maxPos)); 217 | } 218 | return pwd; 219 | } 220 | 221 | function chooseImage(){ 222 | wx.chooseImage({ 223 | count: 1, // 默认9 224 | sizeType: ['original', 'compressed'], // 可以指定是原图还是压缩图,默认二者都有 225 | sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有 226 | success: function (res) { 227 | var localIds = res.localIds; // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片 228 | debugger; 229 | } 230 | }); 231 | } 232 | 233 | 234 | function upload() { 235 | // var xmlhttp; 236 | // if (window.XMLHttpRequest) 237 | // {// code for IE7+, Firefox, Chrome, Opera, Safari 238 | // xmlhttp=new XMLHttpRequest(); 239 | // } 240 | // else 241 | // {// code for IE6, IE5 242 | // xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 243 | // } 244 | // xmlhttp.onreadystatechange=function() 245 | // { 246 | // if (xmlhttp.readyState==4 && xmlhttp.status==200) 247 | // { 248 | // var data = xmlhttp.responseText; 249 | // 250 | // var nonceStr = randomString(16); 251 | // var timestamp = Math.round(new Date().getTime() / 1000); 252 | // var url = finishURL; 253 | // var string1 = "jsapi_ticket=" + data + "&noncestr=" + nonceStr + "×tamp=" + timestamp + "&url=" + url; 254 | // var signature = hex_sha1(string1); 255 | // 256 | // wx.config({ 257 | // debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 258 | // appId: appID, // 必填,公众号的唯一标识 259 | // timestamp: timestamp, // 必填,生成签名的时间戳 260 | // nonceStr: nonceStr, // 必填,生成签名的随机串 261 | // signature: signature,// 必填,签名,见附录1 262 | // jsApiList: ['chooseImage', 'uploadImage', 'downloadImage', 'previewImage'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 263 | // }); 264 | // 265 | // wx.ready(function(){ 266 | // 267 | // }); 268 | // } 269 | // } 270 | // xmlhttp.open("GET","/getJSTicket",true); 271 | // xmlhttp.send(); 272 | 273 | // var userToken = localStorage.getItem("userToken"); 274 | // if ( userToken != null && userToken != "" && userToken != undefined) { 275 | // alert("每人仅限体验一次哦~"); 276 | // window.location.href = "result.html"; 277 | // } 278 | 279 | 280 | wx.chooseImage({ 281 | count: 1, // 默认9 282 | sizeType: ['compressed'], // 可以指定是原图还是压缩图,默认二者都有'original', 283 | sourceType: ['album','camera'], // 可以指定来源是相册还是相机,默认二者都有 284 | success: function (res) { 285 | var localIds = res.localIds.toString(); // 返回选定照片的本地ID列表,localId可以作为img标签的src属性显示图片 286 | 287 | wx.uploadImage({ 288 | localId: localIds, // 需要上传的图片的本地ID,由chooseImage接口获得 289 | isShowProgressTips: 1, // 默认为1,显示进度提示 290 | success: function (res) { 291 | var userToken = localStorage.getItem("userToken"); 292 | if ( userToken == null || userToken == "" || userToken == undefined) { 293 | userToken = randomString(10); 294 | localStorage.setItem("userToken",userToken); 295 | } 296 | var serverId = res.serverId; // 返回图片的服务器端ID 297 | var url = "/recognizeFace?picId="+serverId+"&userToken="+userToken; 298 | 299 | var xmlhttp; 300 | if (window.XMLHttpRequest) 301 | {// code for IE7+, Firefox, Chrome, Opera, Safari 302 | xmlhttp=new XMLHttpRequest(); 303 | } 304 | else 305 | {// code for IE6, IE5 306 | xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 307 | } 308 | xmlhttp.onreadystatechange=function() 309 | { 310 | if (xmlhttp.readyState==4 && xmlhttp.status==200) 311 | { 312 | var data = JSON.parse(xmlhttp.responseText); 313 | //若返回no 314 | if(data.success==false){ 315 | alert(data.message); 316 | } 317 | 318 | //若返回yes 319 | else{ 320 | var facePic = document.getElementById("facePic"); 321 | var uploadPic = document.getElementById("uploadPic"); 322 | var uploadPicTxt = document.getElementById("uploadPicTxt"); 323 | facePic.style.display = "block"; 324 | facePic.style.backgroundImage = "url("+data.faceUrl+")"; 325 | facePic.style.backgroundRepeat = "no-repeat"; 326 | facePic.style.backgroundSize = "cover"; 327 | facePic.style.backgroundPosition = "center center"; 328 | facePic.style.width = "100%"; 329 | facePic.style.height = "100%"; 330 | 331 | uploadPic.style.display = "none"; 332 | uploadPicTxt.style.display = "none"; 333 | 334 | // facePic.src = data.faceUrl; 335 | 336 | var analysisResult = document.getElementById("analysisResult"); 337 | analysisResult.style.display = "block"; 338 | var gender = document.getElementById("gender"); 339 | // var age = document.getElementById("age"); 340 | var expression = document.getElementById("expression"); 341 | var glass = document.getElementById("glass"); 342 | 343 | gender.innerHTML = data.gender; 344 | // age.innerHTML = data.age-5; 345 | expression.innerHTML = data.expression; 346 | glass.innerHTML = data.glass; 347 | 348 | localStorage.setItem("gender",data.gender); 349 | localStorage.setItem("expression",data.expression); 350 | localStorage.setItem("glass",data.glass); 351 | localStorage.setItem("faceUrl",data.faceUrl); 352 | 353 | var startBtn = document.getElementById("startBtn"); 354 | startBtn.style.display = "block"; 355 | 356 | var phoneBtn = document.getElementById("phoneBtn"); 357 | phoneBtn.style.display = "none"; 358 | 359 | localStorage.setItem("resultUrl",data.resultUrl); 360 | 361 | var faceBox = document.getElementById("faceBox"); 362 | faceBox.removeAttribute("onclick"); 363 | } 364 | } 365 | } 366 | xmlhttp.open("GET",url,true); 367 | xmlhttp.send(); 368 | 369 | }, 370 | fail: function (res) { 371 | alert(JSON.stringify(res)); 372 | } 373 | }); 374 | } 375 | }); 376 | 377 | 378 | } 379 | 380 | function upload2(){ 381 | var facePic = document.getElementById("facePic"); 382 | var uploadPic = document.getElementById("uploadPic"); 383 | var uploadPicTxt = document.getElementById("uploadPicTxt"); 384 | facePic.style.display = "block"; 385 | facePic.style.backgroundImage = "url(http://www.chaimm.com/upload/ai/1515649931)"; 386 | facePic.style.backgroundRepeat = "no-repeat"; 387 | facePic.style.backgroundSize = "cover"; 388 | facePic.style.backgroundPosition = "center center"; 389 | facePic.style.width = "100%"; 390 | facePic.style.height = "100%"; 391 | 392 | uploadPic.style.display = "none"; 393 | uploadPicTxt.style.display = "none"; 394 | 395 | // facePic.src = data.faceUrl; 396 | 397 | var analysisResult = document.getElementById("analysisResult"); 398 | analysisResult.style.display = "block"; 399 | var gender = document.getElementById("gender"); 400 | // var age = document.getElementById("age"); 401 | var expression = document.getElementById("expression"); 402 | var glass = document.getElementById("glass"); 403 | 404 | gender.innerHTML = "男"; 405 | // age.innerHTML = "21"; 406 | expression.innerHTML = "微笑"; 407 | glass.innerHTML = "戴眼镜"; 408 | 409 | var startBtn = document.getElementById("startBtn"); 410 | startBtn.style.display = "block"; 411 | 412 | var phoneBtn = document.getElementById("phoneBtn"); 413 | phoneBtn.style.display = "none"; 414 | 415 | // localStorage.setItem("resultUrl",data.resultUrl); 416 | 417 | var faceBox = document.getElementById("faceBox"); 418 | faceBox.removeAttribute("onclick"); 419 | } 420 | 421 | 422 | function init() { 423 | var faceUrl = localStorage.getItem("faceUrl"); 424 | if ( faceUrl == null || faceUrl == "" || faceUrl == undefined) { 425 | config(); 426 | return; 427 | } 428 | 429 | var facePic = document.getElementById("facePic"); 430 | var uploadPic = document.getElementById("uploadPic"); 431 | var uploadPicTxt = document.getElementById("uploadPicTxt"); 432 | facePic.style.display = "block"; 433 | facePic.style.backgroundImage = "url("+localStorage.getItem('faceUrl')+")"; 434 | facePic.style.backgroundRepeat = "no-repeat"; 435 | facePic.style.backgroundSize = "cover"; 436 | facePic.style.backgroundPosition = "center center"; 437 | facePic.style.width = "100%"; 438 | facePic.style.height = "100%"; 439 | 440 | uploadPic.style.display = "none"; 441 | uploadPicTxt.style.display = "none"; 442 | 443 | var analysisResult = document.getElementById("analysisResult"); 444 | analysisResult.style.display = "block"; 445 | var gender = document.getElementById("gender"); 446 | // var age = document.getElementById("age"); 447 | var expression = document.getElementById("expression"); 448 | var glass = document.getElementById("glass"); 449 | 450 | gender.innerHTML = localStorage.getItem("gender"); 451 | // age.innerHTML = data.age-5; 452 | expression.innerHTML = localStorage.getItem("expression"); 453 | glass.innerHTML = localStorage.getItem("glass"); 454 | 455 | 456 | 457 | var resultBtn = document.getElementById("resultBtn"); 458 | resultBtn.style.display = "block"; 459 | 460 | var phoneBtn = document.getElementById("phoneBtn"); 461 | phoneBtn.style.display = "none"; 462 | 463 | var startBtn = document.getElementById("startBtn"); 464 | phoneBtn.style.display = "none"; 465 | 466 | var faceBox = document.getElementById("faceBox"); 467 | faceBox.removeAttribute("onclick"); 468 | } 469 | 470 | init(); 471 | 472 | 473 | function config() { 474 | // $.get("/getJSTicket", 475 | // function (data, status) { 476 | // 477 | // var nonceStr = randomString(16); 478 | // var timestamp = Math.round(new Date().getTime() / 1000); 479 | // var url = finishURL; 480 | // var string1 = "jsapi_ticket=" + data + "&noncestr=" + nonceStr + "×tamp=" + timestamp + "&url=" + url; 481 | // var signature = hex_sha1(string1); 482 | // 483 | // wx.config({ 484 | // debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 485 | // appId: appID, // 必填,公众号的唯一标识 486 | // timestamp: timestamp, // 必填,生成签名的时间戳 487 | // nonceStr: nonceStr, // 必填,生成签名的随机串 488 | // signature: signature,// 必填,签名,见附录1 489 | // jsApiList: ['chooseImage', 'uploadImage', 'downloadImage', 'previewImage'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 490 | // }); 491 | // }); 492 | 493 | var xmlhttp; 494 | if (window.XMLHttpRequest) 495 | {// code for IE7+, Firefox, Chrome, Opera, Safari 496 | xmlhttp=new XMLHttpRequest(); 497 | } 498 | else 499 | {// code for IE6, IE5 500 | xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); 501 | } 502 | xmlhttp.onreadystatechange=function() 503 | { 504 | if (xmlhttp.readyState==4 && xmlhttp.status==200) 505 | { 506 | var data = xmlhttp.responseText; 507 | 508 | var nonceStr = randomString(16); 509 | var timestamp = Math.round(new Date().getTime() / 1000); 510 | var url = finishURL; 511 | var string1 = "jsapi_ticket=" + data + "&noncestr=" + nonceStr + "×tamp=" + timestamp + "&url=" + url; 512 | var signature = hex_sha1(string1); 513 | 514 | wx.config({ 515 | debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 516 | appId: appID, // 必填,公众号的唯一标识 517 | timestamp: timestamp, // 必填,生成签名的时间戳 518 | nonceStr: nonceStr, // 必填,生成签名的随机串 519 | signature: signature,// 必填,签名,见附录1 520 | jsApiList: ['chooseImage', 'uploadImage', 'downloadImage', 'previewImage'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 521 | }); 522 | } 523 | } 524 | xmlhttp.open("GET","/getJSTicket",true); 525 | xmlhttp.send(); 526 | } 527 | 528 | // config(); 529 | 530 | 531 | -------------------------------------------------------------------------------- /src/main/resources/static/js/dialogFx.js: -------------------------------------------------------------------------------- 1 | /** 2 | * dialogFx.js v1.0.0 3 | * http://www.codrops.com 4 | * 5 | * Licensed under the MIT license. 6 | * http://www.opensource.org/licenses/mit-license.php 7 | * 8 | * Copyright 2014, Codrops 9 | * http://www.codrops.com 10 | */ 11 | ;( function( window ) { 12 | 13 | 'use strict'; 14 | 15 | var support = { animations : Modernizr.cssanimations }, 16 | animEndEventNames = { 'WebkitAnimation' : 'webkitAnimationEnd', 'OAnimation' : 'oAnimationEnd', 'msAnimation' : 'MSAnimationEnd', 'animation' : 'animationend' }, 17 | animEndEventName = animEndEventNames[ Modernizr.prefixed( 'animation' ) ], 18 | onEndAnimation = function( el, callback ) { 19 | var onEndCallbackFn = function( ev ) { 20 | if( support.animations ) { 21 | if( ev.target != this ) return; 22 | this.removeEventListener( animEndEventName, onEndCallbackFn ); 23 | } 24 | if( callback && typeof callback === 'function' ) { callback.call(); } 25 | }; 26 | if( support.animations ) { 27 | el.addEventListener( animEndEventName, onEndCallbackFn ); 28 | } 29 | else { 30 | onEndCallbackFn(); 31 | } 32 | }; 33 | 34 | function extend( a, b ) { 35 | for( var key in b ) { 36 | if( b.hasOwnProperty( key ) ) { 37 | a[key] = b[key]; 38 | } 39 | } 40 | return a; 41 | } 42 | 43 | function DialogFx( el, options ) { 44 | this.el = el; 45 | this.options = extend( {}, this.options ); 46 | extend( this.options, options ); 47 | this.ctrlClose = this.el.querySelector( '[data-dialog-close]' ); 48 | this.isOpen = false; 49 | this._initEvents(); 50 | } 51 | 52 | DialogFx.prototype.options = { 53 | // callbacks 54 | onOpenDialog : function() { return false; }, 55 | onCloseDialog : function() { return false; } 56 | } 57 | 58 | DialogFx.prototype._initEvents = function() { 59 | var self = this; 60 | 61 | // close action 62 | this.ctrlClose.addEventListener( 'click', this.toggle.bind(this) ); 63 | 64 | // esc key closes dialog 65 | document.addEventListener( 'keydown', function( ev ) { 66 | var keyCode = ev.keyCode || ev.which; 67 | if( keyCode === 27 && self.isOpen ) { 68 | self.toggle(); 69 | } 70 | } ); 71 | 72 | this.el.querySelector( '.dialog__overlay' ).addEventListener( 'click', this.toggle.bind(this) ); 73 | } 74 | 75 | DialogFx.prototype.toggle = function() { 76 | var self = this; 77 | if( this.isOpen ) { 78 | classie.remove( this.el, 'dialog--open' ); 79 | classie.add( self.el, 'dialog--close' ); 80 | 81 | onEndAnimation( this.el.querySelector( '.dialog__content' ), function() { 82 | classie.remove( self.el, 'dialog--close' ); 83 | } ); 84 | 85 | // callback on close 86 | this.options.onCloseDialog( this ); 87 | } 88 | else { 89 | classie.add( this.el, 'dialog--open' ); 90 | 91 | // callback on open 92 | this.options.onOpenDialog( this ); 93 | } 94 | this.isOpen = !this.isOpen; 95 | }; 96 | 97 | // add to global namespace 98 | window.DialogFx = DialogFx; 99 | 100 | })( window ); -------------------------------------------------------------------------------- /src/main/resources/static/js/modernizr.custom.js: -------------------------------------------------------------------------------- 1 | /* Modernizr 2.8.3 (Custom Build) | MIT & BSD 2 | * Build: http://modernizr.com/download/#-cssanimations-shiv-cssclasses-prefixed-testprop-testallprops-domprefixes-load 3 | */ 4 | ;window.Modernizr=function(a,b,c){function x(a){j.cssText=a}function y(a,b){return x(prefixes.join(a+";")+(b||""))}function z(a,b){return typeof a===b}function A(a,b){return!!~(""+a).indexOf(b)}function B(a,b){for(var d in a){var e=a[d];if(!A(e,"-")&&j[e]!==c)return b=="pfx"?e:!0}return!1}function C(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:z(f,"function")?f.bind(d||b):f}return!1}function D(a,b,c){var d=a.charAt(0).toUpperCase()+a.slice(1),e=(a+" "+n.join(d+" ")+d).split(" ");return z(b,"string")||z(b,"undefined")?B(e,b):(e=(a+" "+o.join(d+" ")+d).split(" "),C(e,b,c))}var d="2.8.3",e={},f=!0,g=b.documentElement,h="modernizr",i=b.createElement(h),j=i.style,k,l={}.toString,m="Webkit Moz O ms",n=m.split(" "),o=m.toLowerCase().split(" "),p={},q={},r={},s=[],t=s.slice,u,v={}.hasOwnProperty,w;!z(v,"undefined")&&!z(v.call,"undefined")?w=function(a,b){return v.call(a,b)}:w=function(a,b){return b in a&&z(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=t.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(t.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(t.call(arguments)))};return e}),p.cssanimations=function(){return D("animationName")};for(var E in p)w(p,E)&&(u=E.toLowerCase(),e[u]=p[E](),s.push((e[u]?"":"no-")+u));return e.addTest=function(a,b){if(typeof a=="object")for(var d in a)w(a,d)&&e.addTest(d,a[d]);else{a=a.toLowerCase();if(e[a]!==c)return e;b=typeof b=="function"?b():b,typeof f!="undefined"&&f&&(g.className+=" "+(b?"":"no-")+a),e[a]=b}return e},x(""),i=k=null,function(a,b){function l(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function m(){var a=s.elements;return typeof a=="string"?a.split(" "):a}function n(a){var b=j[a[h]];return b||(b={},i++,a[h]=i,j[i]=b),b}function o(a,c,d){c||(c=b);if(k)return c.createElement(a);d||(d=n(c));var g;return d.cache[a]?g=d.cache[a].cloneNode():f.test(a)?g=(d.cache[a]=d.createElem(a)).cloneNode():g=d.createElem(a),g.canHaveChildren&&!e.test(a)&&!g.tagUrn?d.frag.appendChild(g):g}function p(a,c){a||(a=b);if(k)return a.createDocumentFragment();c=c||n(a);var d=c.frag.cloneNode(),e=0,f=m(),g=f.length;for(;e",g="hidden"in a,k=a.childNodes.length==1||function(){b.createElement("a");var a=b.createDocumentFragment();return typeof a.cloneNode=="undefined"||typeof a.createDocumentFragment=="undefined"||typeof a.createElement=="undefined"}()}catch(c){g=!0,k=!0}})();var s={elements:d.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output progress section summary template time video",version:c,shivCSS:d.shivCSS!==!1,supportsUnknownElements:k,shivMethods:d.shivMethods!==!1,type:"default",shivDocument:r,createElement:o,createDocumentFragment:p};a.html5=s,r(b)}(this,b),e._version=d,e._domPrefixes=o,e._cssomPrefixes=n,e.testProp=function(a){return B([a])},e.testAllProps=D,e.prefixed=function(a,b,c){return b?D(a,b,c):D(a,"pfx")},g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+s.join(" "):""),e}(this,this.document),function(a,b,c){function d(a){return"[object Function]"==o.call(a)}function e(a){return"string"==typeof a}function f(){}function g(a){return!a||"loaded"==a||"complete"==a||"uninitialized"==a}function h(){var a=p.shift();q=1,a?a.t?m(function(){("c"==a.t?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){"img"!=a&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l=b.createElement(a),o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};1===y[c]&&(r=1,y[c]=[]),"object"==a?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),"img"!=a&&(r||2===y[c]?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i("c"==b?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),1==p.length&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&"[object Opera]"==o.call(a.opera),l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return"[object Array]"==o.call(a)},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f