diff --git a/.gitignore b/.gitignore index cc6c12c..10d6ecd 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,34 @@ +# +# Idea project profiles +# .idea/ *.iml + +# +# Complie target +# + target/ -out/ \ No newline at end of file +out/ + +# +# Capture buffer directory +# +web/WEB-INF/captureBuffer/ + +# +# H2 database directory +# +db/ + +# +# Logs +# + +log/ + +# +# login.properties stored sensitive infomation +# +/**/users.properties +/**/login.properties diff --git a/ClassScheduleAdapter/pom.xml b/ClassScheduleAdapter/pom.xml deleted file mode 100644 index 11b5425..0000000 --- a/ClassScheduleAdapter/pom.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - ssim - net.catten - 2.0 - - 4.0.0 - - class-schedule-adapter - - - - org.jsoup - jsoup - - - - junit - junit - - - - \ No newline at end of file diff --git a/ClassScheduleAdapter/src/test/java/net/catten/ssim/schedule/factory/SubjectFactoryTest.java b/ClassScheduleAdapter/src/test/java/net/catten/ssim/schedule/factory/SubjectFactoryTest.java deleted file mode 100644 index 8aad2cf..0000000 --- a/ClassScheduleAdapter/src/test/java/net/catten/ssim/schedule/factory/SubjectFactoryTest.java +++ /dev/null @@ -1,22 +0,0 @@ -package net.catten.ssim.schedule.factory; - -import net.catten.ssim.schedule.model.Subject; -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Created by catten on 12/4/16. - */ -public class SubjectFactoryTest { - - @Test - public void parse() throws Exception { - SubjectFactory subjectFactory = new SubjectFactory("GB2312"); - Subject subject1 = subjectFactory.parse(this.getClass().getResourceAsStream("/000586.html"),586); - System.out.println(subject1); - Subject subject2 = subjectFactory.parse(this.getClass().getResourceAsStream("/012244.html"),12244); - System.out.println(subject2); - } - -} \ No newline at end of file diff --git a/ClassScheduleAdapter/src/test/java/net/catten/ssim/schedule/model/SubjectTest.java b/ClassScheduleAdapter/src/test/java/net/catten/ssim/schedule/model/SubjectTest.java deleted file mode 100644 index a3bac29..0000000 --- a/ClassScheduleAdapter/src/test/java/net/catten/ssim/schedule/model/SubjectTest.java +++ /dev/null @@ -1,20 +0,0 @@ -package net.catten.ssim.schedule.model; - -import org.junit.Test; - -import static org.junit.Assert.*; - -/** - * Created by catten on 12/4/16. - */ -public class SubjectTest { - - @Test - public void setNameWithCode(){ - Subject subject = new Subject(); - subject.setNameWithCode("[011795]编程基础"); - assertTrue(subject.getCode().equals("011795")); - assertTrue(subject.getName().equals("编程基础")); - } - -} \ No newline at end of file diff --git a/ClassScheduleAdapter/src/test/resources/000586.html b/ClassScheduleAdapter/src/test/resources/000586.html deleted file mode 100644 index 4ec48d9..0000000 --- a/ClassScheduleAdapter/src/test/resources/000586.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - LessonSel_rpt - - - - - - - - -
-
ѧԺγ̿α
2016-2017ѧһѧ

еλѧй  γ̣[AC000106Am]˶  ѧʱ36.0  ѧ֣2.0
ονʦϿ
Ͽ
γ
ʽ
Ͽΰ༶ܴڴص

001
0


15Ϣ̼1 15Ϣ̼2 15缼2 15缼3 15(IT) 15Ӧü 15 15ڱ(ʽ) 15Ƶ㻯() 15ҵ1 15Ƶ㻯()6 15ҩѧ6 15ҩѧ7 15ҩѧ8 15ҩѧ1 15ҩ1 15ҩ 15ؼ2 15һ廯(Զ)1 15Ƶ1 15Դ1 15԰ռ
1-18
һ[9-10]

-
- - diff --git a/LICENSE.MD b/LICENSE.MD new file mode 100644 index 0000000..af5153d --- /dev/null +++ b/LICENSE.MD @@ -0,0 +1,361 @@ +### GNU GENERAL PUBLIC LICENSE + +Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +### Preamble + +The licenses for most software are designed to take away your freedom +to share and change it. By contrast, the GNU General Public License is +intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + +When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + +To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if +you distribute copies of the software, or if you modify it. + +For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + +We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + +Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, +we want its recipients to know that what they have is not the +original, so that any problems introduced by others will not reflect +on the original authors' reputations. + +Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at +all. + +The precise terms and conditions for copying, distribution and +modification follow. + +### TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + +**0.** This License applies to any program or other work which +contains a notice placed by the copyright holder saying it may be +distributed under the terms of this General Public License. The +"Program", below, refers to any such program or work, and a "work +based on the Program" means either the Program or any derivative work +under copyright law: that is to say, a work containing the Program or +a portion of it, either verbatim or with modifications and/or +translated into another language. (Hereinafter, translation is +included without limitation in the term "modification".) Each licensee +is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the Program +(independent of having been made by running the Program). Whether that +is true depends on what the Program does. + +**1.** You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a +fee. + +**2.** You may modify your copy or copies of the Program or any +portion of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + +**a)** You must cause the modified files to carry prominent notices +stating that you changed the files and the date of any change. + + +**b)** You must cause any work that you distribute or publish, that in +whole or in part contains or is derived from the Program or any part +thereof, to be licensed as a whole at no charge to all third parties +under the terms of this License. + + +**c)** If the modified program normally reads commands interactively +when run, you must cause it, when started running for such interactive +use in the most ordinary way, to print or display an announcement +including an appropriate copyright notice and a notice that there is +no warranty (or else, saying that you provide a warranty) and that +users may redistribute the program under these conditions, and telling +the user how to view a copy of this License. (Exception: if the +Program itself is interactive but does not normally print such an +announcement, your work based on the Program is not required to print +an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote +it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +**3.** You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + +**a)** Accompany it with the complete corresponding machine-readable +source code, which must be distributed under the terms of Sections 1 +and 2 above on a medium customarily used for software interchange; or, + + +**b)** Accompany it with a written offer, valid for at least three +years, to give any third party, for a charge no more than your cost of +physically performing source distribution, a complete machine-readable +copy of the corresponding source code, to be distributed under the +terms of Sections 1 and 2 above on a medium customarily used for +software interchange; or, + + +**c)** Accompany it with the information you received as to the offer +to distribute corresponding source code. (This alternative is allowed +only for noncommercial distribution and only if you received the +program in object code or executable form with such an offer, in +accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + +**4.** You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt otherwise +to copy, modify, sublicense or distribute the Program is void, and +will automatically terminate your rights under this License. However, +parties who have received copies, or rights, from you under this +License will not have their licenses terminated so long as such +parties remain in full compliance. + +**5.** You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +**6.** Each time you redistribute the Program (or any work based on +the Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + +**7.** If, as a consequence of a court judgment or allegation of +patent infringement or for any other reason (not limited to patent +issues), conditions are imposed on you (whether by court order, +agreement or otherwise) that contradict the conditions of this +License, they do not excuse you from the conditions of this License. +If you cannot distribute so as to satisfy simultaneously your +obligations under this License and any other pertinent obligations, +then as a consequence you may not distribute the Program at all. For +example, if a patent license would not permit royalty-free +redistribution of the Program by all those who receive copies directly +or indirectly through you, then the only way you could satisfy both it +and this License would be to refrain entirely from distribution of the +Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +**8.** If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + +**9.** The Free Software Foundation may publish revised and/or new +versions of the General Public License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and +"any later version", you have the option of following the terms and +conditions either of that version or of any later version published by +the Free Software Foundation. If the Program does not specify a +version number of this License, you may choose any version ever +published by the Free Software Foundation. + +**10.** If you wish to incorporate parts of the Program into other +free programs whose distribution conditions are different, write to +the author to ask for permission. For software which is copyrighted by +the Free Software Foundation, write to the Free Software Foundation; +we sometimes make exceptions for this. Our decision will be guided by +the two goals of preserving the free status of all derivatives of our +free software and of promoting the sharing and reuse of software +generally. + +**NO WARRANTY** + +**11.** BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO +WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. +EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR +OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY +KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE +PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME +THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + +**12.** IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN +WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY +AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU +FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR +CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE +PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING +RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A +FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF +SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH +DAMAGES. + +### END OF TERMS AND CONDITIONS + +### How to Apply These Terms to Your New Programs + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these +terms. + +To do so, attach the following notices to the program. It is safest to +attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + one line to give the program's name and an idea of what it does. + Copyright (C) yyyy name of author + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + +Also add information on how to contact you by electronic and paper +mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details + type `show w'. This is free software, and you are welcome + to redistribute it under certain conditions; type `show c' + for details. + +The hypothetical commands \`show w' and \`show c' should show the +appropriate parts of the General Public License. Of course, the +commands you use may be called something other than \`show w' and +\`show c'; they could even be mouse-clicks or menu items--whatever +suits your program. + +You should also get your employer (if you work as a programmer) or +your school, if any, to sign a "copyright disclaimer" for the program, +if necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright + interest in the program `Gnomovision' + (which makes passes at compilers) written + by James Hacker. + + signature of Ty Coon, 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, +you may consider it more useful to permit linking proprietary +applications with the library. If this is what you want to do, use the +[GNU Lesser General Public +License](http://www.gnu.org/licenses/lgpl.html) instead of this +License. \ No newline at end of file diff --git a/LNCKingoJWCaterpillar/pom.xml b/LNCKingoJWCaterpillar/pom.xml deleted file mode 100644 index b9f13d5..0000000 --- a/LNCKingoJWCaterpillar/pom.xml +++ /dev/null @@ -1,44 +0,0 @@ - - - - ssim - net.catten - 2.0 - - 4.0.0 - - lnc-kingojw-caterpillar - - - - - org.jsoup - jsoup - - - - commons-io - commons-io - - - - org.apache.httpcomponents - httpclient - - - - junit - junit - - - - - - net.catten - ssim-common - ${project.version} - - - \ No newline at end of file diff --git a/LNCKingoJWCaterpillar/src/main/resources/login.properties.sample b/LNCKingoJWCaterpillar/src/main/resources/login.properties.sample deleted file mode 100644 index 3e7ab05..0000000 --- a/LNCKingoJWCaterpillar/src/main/resources/login.properties.sample +++ /dev/null @@ -1,7 +0,0 @@ -username= -password= -role=STU -charset=GB2312 -tableFormat=2 -delay=500 -userAgent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.90 Safari/537.36undefined5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.90 Safari/537.36 SN:NULL \ No newline at end of file diff --git a/README.MD b/README.MD index 081d571..9e1b376 100644 --- a/README.MD +++ b/README.MD @@ -1,98 +1,112 @@ -#青果网教务系统课表数据抓取工具 - -此工具专门用于批量抓取青果网教务系统的“课程课表”页面数据,并整理成原始课程数据导入到数据库 - -##构建 - -**需要先安装 maven 然后再构建此工程** - -在工程目录里执行 - - mvn clean package - -构建完之后文件在 SubjectImporter 的 target 里,ssim-main-2.0.jar 为可执行 jar 包,lib 文件夹为所依赖的组件。 - -##执行命令 - -总共有三种启动方式 - - java -jar ssim-main-2.0.jar 学期代号 - java -jar ssim-main-2.0.jar 学期代号 缓存文件夹 - java -jar ssim-main-2.0.jar 学期代号 缓存文件夹 --continue - -其中学期代号格式是年份+学期,例如20140,2014是年份,0为第一学期(1就是第二学期)。缓存文件夹是制定爬虫把网页缓存在哪里。 ---continue 选项是直接跳过抓取,仅丛缓存文件夹导入。 - -爬虫启动之后,将会先检查有没有数据库里面有没有存储数据用的表,没有将自动创建。表将以 学期代号 + 下划线 + 表名 的形在没有指定缓存文件夹的情况下,爬虫会把网页存储到内存中然后再导入到数据库。在指定了缓存文件夹的情况下,爬虫会把网页缓存到指定文件夹。 -导入数据库前爬虫会把所有网页预先格式化成对象全部存储到内存里。800个结果约占用200MB内存。 - -##配置文件 - -配置文件有两个: login.properties 和 connection.properties - -### login.properties 说明 - -此配置文件是关于爬虫的配置文件。 - -模板如下: - - username= - password= - role= - charset=GB2312 - tableFormat=2 - delay=600 - userAgent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.90 Safari/537.36undefined5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.90 Safari/537.36 SN:NULL - -username 填登录帐号。 password 填登录密码。 role 指登录的类型,学生的类型是 STU ,其他类型请自行查看青果网教务登录框的其他值。charset 是页面编码,默认 GB2312 不要改,除非青果网更改页面编码。 tableFormat 是爬取的课表格式,不用改。 delay 是抓取下一个页面前的等待时间,单位毫秒,建议不要低于400,容易卡住。 userAgent 是要伪装成什么浏览器,如果你有特殊偏好的话可以改成其他浏览器,这里默认是 Linux 下的 Chrome。 - -### connection.properties 说明 - -此配置文件是关于数据库的配置文件。 - -模板如下: - - hostname=localhost:3306 - username= - password= - database= - - hostname 填 mysql 服务器的地址,必须带上端口号。 username 和 password 是数据库用户和对应的密码。 database 指目标数据库。 - -##数据库表 - -爬虫使用两张表存储所有的课表数据,一张是 subject 一张是 lessons。字段含义分别如下: - -### subjects 表 - - -id : 课程的唯一 ID -term : 课程学期 -name : 课程名称 -code : 课程代号 -unit : 所属学院 -timeSpend : 学时 -point : 学分 - -#### lessons 表 - -id : 自增 id -subject : 对应 subjects 表内的课程 id -teacher : 任课老师姓名 -classNumber : 对应青果网表格的上课班号 -attendAmount : 上课人数 -classAttend : 上课班级 -classType : 课程类别 -assessmentType : 考核方式 -week : 周次 -timePoint : 节次 -address : 地点 - -##使用注意 - -- 只能使用 MySQL/MariaDB 数据库 -- 缓存文件夹要先创建,如果不存在将会报错 -- 每一次抓取前,都要事先清除掉缓存目录和目的数据库表 -- 目标数据库必须预先存在 -- 每次导入请先删除指定数据库中 Lessons 和 Subjects 两张表 -- 爬虫抓取页面的时间间隔建议不要低于400 +#简单的课表查询网站 + +为针对广东岭南职业技术学院所使用的教务系统(青果网教务系统)的课表爬取与整理网站 + +##公共API + +通过此类 API 与服务器通讯均使用 UTF-8 编码格式 + +####课表查询 API + +#####/api/terms + +查询所有可用学期 + +- 方法 : GET +- 无传参 +- 返回:学期字符串数组 + +``` +{ + "data":["2016-2017学年第二学期"] +} +``` + +####/api/weeks + +查询学期最大周数 + +- 方法 : GET +- 参数 + - termName : 学期全称 +- 返回 : 最大周数(从 1 开始算起) + +``` +{ + "data":19 +} +``` + +####/api/classes + +查询学期内上课的班级 + +- 方法 : GET +- 参数 + - termName : 学期全称 +- 返回 : 学期内所有上课班级 + +``` +{ + "data":["班级名称 1","班级名称 2", "班级名称 3", ....] +} +``` + +####/api/types + +查询所有课程类型 + +- 方法 : GET +- 无传参 +- 返回 : 所有课程类型 + +``` +{ + "data":[ + "专业基础课/必修课", + "专业课/必修课", + "专业课/限选课", + "公共课/任选课", + "公共课/必修课", + .... ] +} +``` + +####/api/lessons + +- 方法 : GET +- 参数 : + - termName : 学期全称 + - week : 周数(从 1 开始算起),可选,不填则返回整个学期课表 + - className : 上课班级全称 + - ignoreType : 忽略的课程类型,数组,可选,不填则返回全部类型的课程(包括因为教务录入问题而产生的重复课程) +- 返回 : 指定条件的课表 + +``` +{ + "data":[ + { + "id":158758, + "term":"2016-2017学年第二学期", // 学期 + "unit":"外语外贸学院", // 学院 + "name":"公共外语(二)", // 课程名称 + "period":63.0, // 课时 + "credit":3.5, // 学分 + "teacher":"XXX", // 上课教师 + "category":"公共课/必修课", // 课程类型 + "attendClass":"xx通信技术x班", //上课班级 + "week":1, // 周数 + "weekday":5, // 星期几 + "turn":5, // 第几节课 + "address":"C栋B609" // 地点 + }, .....] +} +``` + +*** +##参考 + +- [Hibernate EHCache – Hibernate Second Level Cache](http://www.journaldev.com/2980/hibernate-ehcache-hibernate-second-level-cache) +- [解决spring3 mvc中乱码的问题。](http://blog.csdn.net/zhengzhb/article/details/6967975) +- [How to configure log4j.properties for SpringJUnit4ClassRunner?](http://stackoverflow.com/questions/4570072/how-to-configure-log4j-properties-for-springjunit4classrunner) +- [H2数据库攻略](http://www.cnblogs.com/gao241/p/3480472.html) diff --git a/SubjectImportCommonUtils/pom.xml b/SubjectImportCommonUtils/pom.xml deleted file mode 100644 index 2b1de19..0000000 --- a/SubjectImportCommonUtils/pom.xml +++ /dev/null @@ -1,15 +0,0 @@ - - - - ssim - net.catten - 2.0 - - 4.0.0 - - ssim-common - - - \ No newline at end of file diff --git a/SubjectImportCommonUtils/src/main/resources/connection.property.sample b/SubjectImportCommonUtils/src/main/resources/connection.property.sample deleted file mode 100644 index 6a7f5d2..0000000 --- a/SubjectImportCommonUtils/src/main/resources/connection.property.sample +++ /dev/null @@ -1,4 +0,0 @@ -hostname=localhost:3306 -username=example -password=123456 -database=ClassSheet \ No newline at end of file diff --git a/SubjectImporter/pom.xml b/SubjectImporter/pom.xml deleted file mode 100644 index baee548..0000000 --- a/SubjectImporter/pom.xml +++ /dev/null @@ -1,88 +0,0 @@ - - - - ssim - net.catten - 2.0 - - 4.0.0 - - ssim-main - jar - - - - net.catten - class-schedule-adapter - 2.0 - - - - net.catten - lnc-kingojw-caterpillar - 2.0 - - - - mysql - mysql-connector-java - - - - junit - junit - 4.12 - test - - - - - - - - org.apache.maven.plugins - maven-jar-plugin - - - - false - - - - true - - lib/ - - net.catten.ssim.Main - - - - - - - - - - - org.apache.maven.plugins - maven-dependency-plugin - 2.10 - - - copy-dependencies - package - - copy-dependencies - - - ${project.build.directory}/lib - - - - - - - - \ No newline at end of file diff --git a/SubjectImporter/src/main/java/net/catten/ssim/Main.java b/SubjectImporter/src/main/java/net/catten/ssim/Main.java deleted file mode 100644 index fc4210c..0000000 --- a/SubjectImporter/src/main/java/net/catten/ssim/Main.java +++ /dev/null @@ -1,77 +0,0 @@ -package net.catten.ssim; - -import net.catten.lnc.kingo.jw.caterpillar.KingoJWCaterpillar; -import net.catten.ssim.events.ProgressPrinter; -import net.catten.ssim.helper.TableChecker; -import net.catten.ssim.helper.TableMaker; -import net.catten.ssim.services.DataImporter; -import net.catten.ssim.helper.DatabaseConnector; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.sql.Connection; -import java.sql.SQLException; -import java.util.*; -import java.util.logging.Logger; - -/** - * Created by catten on 11/13/16. - */ -public class Main { - public static void main(String[] args) throws ClassNotFoundException, SQLException, IOException, InterruptedException { - Logger logger = Logger.getLogger(Main.class.getClass().toString()); - ProgressPrinter progressPrinter = new ProgressPrinter(40); - - //Property preparing - Properties dbProperties = new Properties(); - dbProperties.load(new FileInputStream(new File("connection.properties"))); - logger.info("Database connection properties loaded."); - - Properties tableProperty = new Properties(); - tableProperty.load(Main.class.getResourceAsStream("/tables.properties")); - logger.info("Table properties loaded."); - - //Handling Database connection - DatabaseConnector databaseConnector = new DatabaseConnector(dbProperties); - Connection connection = databaseConnector.getConnection(); - logger.info("Database connected."); - - //Start capturing pages - Properties loginProperties = new Properties(); - loginProperties.load(new FileInputStream(new File("login.properties"))); - KingoJWCaterpillar caterpillar = new KingoJWCaterpillar(loginProperties); - caterpillar.setTickReceiver(progressPrinter); - - DataImporter dataImporter; - - String schoolTerm = args[0]; - String tablePrefix = schoolTerm + "_"; - - //Check tables and create not existed table - TableMaker tableMaker = new TableMaker(connection, tableProperty, tablePrefix); - TableChecker tableChecker = new TableChecker(connection, new ArrayList<>(tableProperty.stringPropertyNames()), tablePrefix); - List notExistTables = tableChecker.checkNotExist(); - logger.info("Check tables successful"); - tableMaker.make(notExistTables); - - if (args.length == 1) { - Map resultMap = caterpillar.getTermSubjectToMemory(Integer.parseInt(schoolTerm)); - - dataImporter = new DataImporter(connection, resultMap, loginProperties.getProperty("UTF-8"), tablePrefix); - } else { - File targetDir = new File(args[1]); - - if (args.length <= 2 || !args[2].equals("--continue")) - caterpillar.getTermSubjectToFiles(Integer.parseInt(schoolTerm), targetDir); - - dataImporter = new DataImporter(connection, targetDir, loginProperties.getProperty("charset"), ".html", tablePrefix); - } - - //Import to database - dataImporter.setTickReceiver(progressPrinter); - dataImporter.startJobs(); - - connection.close(); - } -} diff --git a/SubjectImporter/src/main/java/net/catten/ssim/dto/LessonDTO.java b/SubjectImporter/src/main/java/net/catten/ssim/dto/LessonDTO.java deleted file mode 100644 index 0c011e5..0000000 --- a/SubjectImporter/src/main/java/net/catten/ssim/dto/LessonDTO.java +++ /dev/null @@ -1,165 +0,0 @@ -package net.catten.ssim.dto; - -import net.catten.ssim.schedule.model.Lesson; - -import java.io.*; -import java.util.LinkedList; -import java.util.List; - -/** - * Created by catten on 11/14/16. - */ -public class LessonDTO implements Cloneable,Serializable { - private int id; - private int subject; - private String teacher; - private String classNumber; - private Integer attendAmount; - private String classAttend; - private String classType; - private String assessmentType; - private int weekday; - private String timePoint; - private String address; - - public static List splitLesson(Lesson lesson, Integer subjectId) { - String classList[] = lesson.getClassAttend(); - List weekdays = lesson.getWeeks(); - - List lessons = new LinkedList<>(); - - LessonDTO template = new LessonDTO(); - template.setSubject(subjectId); - template.setTeacher(lesson.getTeacher()); - template.setAssessmentType(lesson.getAssessmentType()); - template.setClassNumber(lesson.getClassNumber()); - template.setAttendAmount(lesson.getAttendAmount()); - template.setClassType(lesson.getClassType()); - template.setTimePoint(lesson.getTimePoint().toString()); - template.setAddress(lesson.getPosition()); - - for (String className : classList) { - for (Integer weekday : weekdays) { - LessonDTO clone = (LessonDTO) template.clone(); - clone.setClassAttend(className); - clone.setWeekday(weekday); - lessons.add(clone); - } - } - - return lessons; - } - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - public int getSubject() { - return subject; - } - - public void setSubject(int subject) { - this.subject = subject; - } - - public String getTeacher() { - return teacher; - } - - public void setTeacher(String teacher) { - this.teacher = teacher; - } - - public String getClassNumber() { - return classNumber; - } - - public void setClassNumber(String classNumber) { - this.classNumber = classNumber; - } - - public Integer getAttendAmount() { - return attendAmount; - } - - public void setAttendAmount(Integer attendAmount) { - this.attendAmount = attendAmount; - } - - public String getClassAttend() { - return classAttend; - } - - public void setClassAttend(String classAttend) { - this.classAttend = classAttend; - } - - public String getClassType() { - return classType; - } - - public void setClassType(String classType) { - this.classType = classType; - } - - public String getAssessmentType() { - return assessmentType; - } - - public void setAssessmentType(String assessmentType) { - this.assessmentType = assessmentType; - } - - public int getWeek() { - return weekday; - } - - public void setWeekday(int weekday) { - this.weekday = weekday; - } - - public String getTimePoint() { - return timePoint; - } - - public void setTimePoint(String timePoint) { - this.timePoint = timePoint; - } - - public String getAddress() { - return address; - } - - public void setAddress(String address) { - this.address = address; - } - - @Override - public Object clone() { - try { - return super.clone(); - } catch (CloneNotSupportedException ignored) {} - return null; - } - - @Override - public String toString() { - return "LessonDTO{" + - "id=" + id + - ", subject=" + subject + - ", teacher='" + teacher + '\'' + - ", classNumber='" + classNumber + '\'' + - ", attendAmount=" + attendAmount + - ", classAttend='" + classAttend + '\'' + - ", classType='" + classType + '\'' + - ", assessmentType='" + assessmentType + '\'' + - ", weekday=" + weekday + - ", timePoint='" + timePoint + '\'' + - ", address='" + address + '\'' + - '}'; - } -} diff --git a/SubjectImporter/src/main/java/net/catten/ssim/helper/DatabaseConnector.java b/SubjectImporter/src/main/java/net/catten/ssim/helper/DatabaseConnector.java deleted file mode 100644 index 25bde1d..0000000 --- a/SubjectImporter/src/main/java/net/catten/ssim/helper/DatabaseConnector.java +++ /dev/null @@ -1,62 +0,0 @@ -package net.catten.ssim.helper; - -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; -import java.util.Properties; - -/** - * Created by catten on 11/14/16. - */ -public class DatabaseConnector { - private Properties properties; - private Connection connection; - - /** - * Simple database manager, use database property to connect database - * - * @param properties a property object contained : - * hostname for target database server with port number - * username for login to database - * password for the database user - * database for target database(schema) - */ - public DatabaseConnector(Properties properties) throws ClassNotFoundException { - this.properties = properties; - Class.forName("com.mysql.jdbc.Driver"); - } - - /** - * Get a database connection - * - * If connection doesn't exist, try to create a connection - * - * @return - * @throws SQLException - * @throws ClassNotFoundException - */ - public Connection getConnection() throws SQLException, ClassNotFoundException { - if(connection == null || connection.isClosed()){ - createConnection(); - } - return connection; - } - - /** - * Close the connection - * - * @throws SQLException - */ - public void closeConnection() throws SQLException { - connection.close(); - } - - private void createConnection() throws SQLException { - String connectString = String.format("jdbc:mysql://%s/%s?user=%s&password=%s&useUnicode=true&characterEncoding=utf8", - properties.get("hostname"), - properties.get("database"), - properties.get("username"), - properties.get("password")); - connection = DriverManager.getConnection(connectString); - } -} diff --git a/SubjectImporter/src/main/java/net/catten/ssim/helper/TableChecker.java b/SubjectImporter/src/main/java/net/catten/ssim/helper/TableChecker.java deleted file mode 100644 index e9b32c9..0000000 --- a/SubjectImporter/src/main/java/net/catten/ssim/helper/TableChecker.java +++ /dev/null @@ -1,48 +0,0 @@ -package net.catten.ssim.helper; - -import java.sql.Connection; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.ArrayList; -import java.util.LinkedList; -import java.util.List; - -/** - * Created by catten on 11/13/16. - */ -public class TableChecker { - private Connection connection; - private ArrayList tables; - private String prefix; - - public TableChecker(Connection connection, ArrayList tables, String prefix) { - this.connection = connection; - this.tables = tables; - this.prefix = prefix; - } - - public List checkNotExist() throws SQLException { - List results = new LinkedList<>(); - for (String s : tables) { - ResultSet resultSet = connection.getMetaData().getTables(null, connection.getSchema(), prefix + s, new String[]{"TABLE"}); - if (!resultSet.next()) results.add(s); - } - return results; - } - - public Connection getConnection() { - return connection; - } - - public void setConnection(Connection connection) { - this.connection = connection; - } - - public ArrayList getTables() { - return tables; - } - - public void setTables(ArrayList tables) { - this.tables = tables; - } -} diff --git a/SubjectImporter/src/main/java/net/catten/ssim/helper/TableMaker.java b/SubjectImporter/src/main/java/net/catten/ssim/helper/TableMaker.java deleted file mode 100644 index 8e51b92..0000000 --- a/SubjectImporter/src/main/java/net/catten/ssim/helper/TableMaker.java +++ /dev/null @@ -1,58 +0,0 @@ -package net.catten.ssim.helper; - -import java.sql.Connection; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.List; -import java.util.Properties; -import java.util.logging.Logger; - -/** - * Created by catten on 11/14/16. - */ -public class TableMaker { - - private Properties tableProperty; - private Connection connection; - private Logger logger; - private String prefix; - - public TableMaker(Connection connection, Properties tableProperty, String prefix) { - this.connection = connection; - this.tableProperty = tableProperty; - this.prefix = prefix; - logger = Logger.getLogger(this.getClass().toString()); - } - - public void make(List makeList) throws SQLException { - Statement statement = connection.createStatement(); - for (String s : makeList) { - int result = statement.executeUpdate(String.format("CREATE TABLE %s (%s)", prefix + s,tableProperty.get(s))); - logger.info(String.format("Created table %s, result = %d", prefix + s, result)); - } - } - - public Properties getTableProperty() { - return tableProperty; - } - - public void setTableProperty(Properties tableProperty) { - this.tableProperty = tableProperty; - } - - public Connection getConnection() { - return connection; - } - - public void setConnection(Connection connection) { - this.connection = connection; - } - - public Logger getLogger() { - return logger; - } - - public void setLogger(Logger logger) { - this.logger = logger; - } -} diff --git a/SubjectImporter/src/main/java/net/catten/ssim/helper/Validator.java b/SubjectImporter/src/main/java/net/catten/ssim/helper/Validator.java deleted file mode 100644 index 8916dd2..0000000 --- a/SubjectImporter/src/main/java/net/catten/ssim/helper/Validator.java +++ /dev/null @@ -1,12 +0,0 @@ -package net.catten.ssim.helper; - -import java.io.File; - -/** - * Created by catten on 11/14/16. - */ -public class Validator { - public static void isDirectory(File file){ - if (!file.isDirectory()) throw new IllegalArgumentException("Source of data must be a directory!"); - } -} \ No newline at end of file diff --git a/SubjectImporter/src/main/java/net/catten/ssim/repository/BaseRepository.java b/SubjectImporter/src/main/java/net/catten/ssim/repository/BaseRepository.java deleted file mode 100644 index ef73dfe..0000000 --- a/SubjectImporter/src/main/java/net/catten/ssim/repository/BaseRepository.java +++ /dev/null @@ -1,19 +0,0 @@ -package net.catten.ssim.repository; - -import java.sql.Connection; -import java.sql.SQLException; - -/** - * Created by catten on 11/14/16. - */ -public abstract class BaseRepository { - protected Connection connection; - protected String table; - - public BaseRepository(Connection connection, String table) { - this.connection = connection; - this.table = table; - } - - public abstract void save(T entity) throws SQLException; -} diff --git a/SubjectImporter/src/main/java/net/catten/ssim/repository/LessonRepository.java b/SubjectImporter/src/main/java/net/catten/ssim/repository/LessonRepository.java deleted file mode 100644 index 404cc3a..0000000 --- a/SubjectImporter/src/main/java/net/catten/ssim/repository/LessonRepository.java +++ /dev/null @@ -1,35 +0,0 @@ -package net.catten.ssim.repository; - -import net.catten.ssim.dto.LessonDTO; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.SQLException; - -/** - * Created by catten on 11/14/16. - */ -public class LessonRepository extends BaseRepository { - - public LessonRepository(Connection connection, String table) { - super(connection, table); - } - - @Override - public void save(LessonDTO entity) throws SQLException { - PreparedStatement preparedStatement = connection.prepareStatement( - "INSERT INTO " + table + "lessons (subject,teacher,classNumber,attendAmount,classAttend,classType,assessmentType,week,timePoint,address) VALUE (?,?,?,?,?,?,?,?,?,?)"); - preparedStatement.setInt(1, entity.getSubject()); - preparedStatement.setString(2, entity.getTeacher()); - preparedStatement.setString(3, entity.getClassNumber()); - preparedStatement.setInt(4, entity.getAttendAmount()); - preparedStatement.setString(5, entity.getClassAttend()); - preparedStatement.setString(6, entity.getClassType()); - preparedStatement.setString(7, entity.getAssessmentType()); - preparedStatement.setInt(8, entity.getWeek()); - preparedStatement.setString(9, entity.getTimePoint()); - preparedStatement.setString(10, entity.getAddress()); - preparedStatement.execute(); - preparedStatement.close(); - } -} diff --git a/SubjectImporter/src/main/java/net/catten/ssim/repository/SubjectRepository.java b/SubjectImporter/src/main/java/net/catten/ssim/repository/SubjectRepository.java deleted file mode 100644 index 516616c..0000000 --- a/SubjectImporter/src/main/java/net/catten/ssim/repository/SubjectRepository.java +++ /dev/null @@ -1,33 +0,0 @@ -package net.catten.ssim.repository; - -import net.catten.ssim.schedule.model.Subject; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.SQLException; - -/** - * Created by catten on 11/14/16. - */ -public class SubjectRepository extends BaseRepository { - - public SubjectRepository(Connection connection, String table) { - super(connection, table); - } - - @Override - public void save(Subject entity) throws SQLException { - PreparedStatement preparedStatement = connection - .prepareStatement("INSERT INTO " + table + "subjects (id,term,name,code,unit,timeSpend,point) VALUES (?,?,?,?,?,?,?)"); - preparedStatement.setInt(1, entity.getId()); - preparedStatement.setString(2, entity.getTerm()); - preparedStatement.setString(3, entity.getName()); - preparedStatement.setString(4, entity.getCode()); - preparedStatement.setString(5, entity.getUnit()); - preparedStatement.setDouble(6, entity.getTimeSpend()); - preparedStatement.setDouble(7, entity.getPoint()); - preparedStatement.executeUpdate(); - preparedStatement.close(); - } - -} diff --git a/SubjectImporter/src/main/java/net/catten/ssim/services/DataImporter.java b/SubjectImporter/src/main/java/net/catten/ssim/services/DataImporter.java deleted file mode 100644 index c7a7b63..0000000 --- a/SubjectImporter/src/main/java/net/catten/ssim/services/DataImporter.java +++ /dev/null @@ -1,137 +0,0 @@ -package net.catten.ssim.services; - -import net.catten.ssim.common.events.TickEventProvider; -import net.catten.ssim.common.events.TickEventReceiver; -import net.catten.ssim.dto.LessonDTO; -import net.catten.ssim.helper.Validator; -import net.catten.ssim.repository.LessonRepository; -import net.catten.ssim.repository.SubjectRepository; -import net.catten.ssim.schedule.factory.SubjectFactory; -import net.catten.ssim.schedule.model.Lesson; -import net.catten.ssim.schedule.model.Subject; -import org.apache.commons.io.IOUtils; - -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.sql.Connection; -import java.sql.SQLException; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.logging.Logger; - -/** - * Created by catten on 11/14/16. - */ -public class DataImporter implements TickEventProvider { - private File targetDir; - private String fileSuffix; - private String tablePrefix; - - private SubjectFactory subjectFactory; - private Logger logger; - - private Map bufferMap; - - private LessonRepository lessonRepository; - private SubjectRepository subjectRepository; - - private TickEventReceiver tickEventReceiver = message -> { - //do nothing... - }; - - public DataImporter(Connection connection,File targetDir, String charset, String fileSuffix, String tablePrefix) { - - //Validate if target file is a directory - this.targetDir = targetDir; - Validator.isDirectory(targetDir); - - //Set file suffix - this.fileSuffix = fileSuffix; - - //Set table prefix - this.tablePrefix = tablePrefix; - - initialize(connection,charset); - logger.info("DataImporter initialized for import from file."); - } - - public DataImporter(Connection connection, Map bufferedData, String charset, String tablePrefix){ - this.bufferMap = bufferedData; - this.tablePrefix = tablePrefix; - - initialize(connection,charset); - - logger.info("DataImporter initialized for import from buffer."); - } - - private void initialize(Connection connection, String charset) { - //Set connection - - //Create subject factory with charset - this.subjectFactory = new SubjectFactory(charset); - - //Get logger for logging - this.logger = Logger.getLogger(this.getClass().toString()); - - lessonRepository = new LessonRepository(connection,tablePrefix); - subjectRepository = new SubjectRepository(connection,tablePrefix); - } - - public void startJobs() throws IOException, SQLException { - bufferItems(); - int currentItem = 0; - for (Integer item : bufferMap.keySet()) { - currentItem++; - - Subject subject = subjectFactory.parse(bufferMap.get(item),item); - subjectRepository.save(subject); - for (Lesson lesson : subject.getLessons()){ - - tickEventReceiver.tick(bufferMap.size(),currentItem, item); - List lessonDTOList = LessonDTO.splitLesson(lesson,subject.getId()); - for (LessonDTO lessonDTO : lessonDTOList){ - lessonRepository.save(lessonDTO); - } - } - } - System.out.println(); - logger.info("Work finished."); - } - - private void bufferItems() throws IOException { - if (targetDir != null) { - logger.info("Fetching files : " + targetDir.getAbsolutePath()); - File[] files = targetDir.listFiles((file, s) -> s.endsWith(fileSuffix)); - bufferMap = new HashMap<>(); - if(files != null){ - logger.info(String.valueOf(files.length) + " Files match, added to file list."); - - int currentFile = 0; - for (File file : files){ - currentFile++; - int suffixPos = file.getName().indexOf(fileSuffix.charAt(0)); - bufferMap.put(Integer.parseInt(file.getName().substring(0,suffixPos)), IOUtils.toString(new FileInputStream(file))); - tickEventReceiver.tick(files.length,currentFile,file.getName()); - } - System.out.println(); - logger.info("Buffering finished."); - } - } - } - - public String getCharset() { - return subjectFactory.getCharset(); - } - - public void setCharset(String charset) { - subjectFactory.setCharset(charset); - } - - - @Override - public void setTickReceiver(TickEventReceiver receiver) { - this.tickEventReceiver = receiver; - } -} diff --git a/SubjectImporter/src/main/resources/tables.properties b/SubjectImporter/src/main/resources/tables.properties deleted file mode 100644 index 5fabebf..0000000 --- a/SubjectImporter/src/main/resources/tables.properties +++ /dev/null @@ -1,2 +0,0 @@ -subjects=id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,term VARCHAR(30) NOT NULL ,name TEXT NOT NULL,code CHAR(20) NOT NULL ,unit VARCHAR(50) NOT NULL ,timeSpend DOUBLE NOT NULL ,point DOUBLE NOT NULL -lessons=id INT PRIMARY KEY NOT NULL AUTO_INCREMENT,subject INT NOT NULL ,teacher VARCHAR(50) NOT NULL ,classNumber CHAR(10) NOT NULL ,attendAmount INT NOT NULL ,classAttend TEXT,classType VARCHAR(20),assessmentType CHAR(10),week INT,timePoint CHAR(16),address TEXT \ No newline at end of file diff --git a/SubjectImporter/src/test/java/net/catten/ssim/dto/LessonDTOTest.java b/SubjectImporter/src/test/java/net/catten/ssim/dto/LessonDTOTest.java deleted file mode 100644 index b3feedf..0000000 --- a/SubjectImporter/src/test/java/net/catten/ssim/dto/LessonDTOTest.java +++ /dev/null @@ -1,30 +0,0 @@ -package net.catten.ssim.dto; - -import net.catten.ssim.Main; -import net.catten.ssim.dto.LessonDTO; -import net.catten.ssim.schedule.factory.SubjectFactory; -import net.catten.ssim.schedule.model.Lesson; -import net.catten.ssim.schedule.model.Subject; -import org.junit.Test; - -import java.util.LinkedList; -import java.util.List; - -import static org.junit.Assert.*; - -/** - * Created by catten on 11/14/16. - */ -public class LessonDTOTest { - @Test - public void splitLesson() throws Exception { - SubjectFactory subjectFactory = new SubjectFactory("GB2312"); - Subject subject = subjectFactory.parse(Main.class.getResourceAsStream("/012213.html"), 12213); - List lessonList = new LinkedList<>(); - for (Lesson lesson : subject.getLessons()) { - lessonList.addAll(LessonDTO.splitLesson(lesson, subject.getId())); - } - System.out.println(lessonList); - } - -} \ No newline at end of file diff --git a/SubjectImporter/src/test/resources/012213.html b/SubjectImporter/src/test/resources/012213.html deleted file mode 100644 index 4ba6b16..0000000 --- a/SubjectImporter/src/test/resources/012213.html +++ /dev/null @@ -1,27 +0,0 @@ - - - - - LessonSel_rpt - - - - - - - - -
-
ѧԺγ̿α
2016-2017ѧһѧ

еλϢѧԺ  γ̣[011922]רҵĿ  ѧʱ36.0  ѧ֣2.0
ονʦϿ
Ͽ
γ
ʽ
Ͽΰ༶ܴڴص
»
008
0
רҵ/޿

15()1
17
[1-2]
зʵѵ(B403)






17
[3-4]
зʵѵ(B403)






17-18
һ[1-2]
зʵѵ(B403)






17-18
һ[3-4]
зʵѵ(B403)






17-18
[5-6]
зʵѵ(B403)






17-18
[7-8]
зʵѵ(B403)






17-18
[1-2]
зʵѵ(B403)






17-18
[3-4]
зʵѵ(B403)






17-18
[5-6]
зʵѵ(B403)






17-18
[7-8]
зʵѵ(B403)
»
009
0
רҵ/޿

15()2
17-18
һ[5-6]
зʵѵ(B403)






17-18
һ[7-8]
зʵѵ(B403)






17-18
[1-2]
зʵѵ(B403)






17-18
[3-4]
зʵѵ(B403)






17-18
[5-6]
зʵѵ(B403)






17-18
[7-8]
зʵѵ(B403)






17-18
[1-2]
зʵѵ(B403)






17-18
[3-4]
зʵѵ(B403)






18
[1-2]
зʵѵ(B403)






18
[3-4]
зʵѵ(B403)

001
0
רҵ/޿

15()3
17-18
һ[5-6]
Ӧüһ(¥B307)






17-18
һ[7-8]
Ӧüһ(¥B307)






17-18
[1-2]
Ӧüһ(¥B307)






17-18
[3-4]
Ӧüһ(¥B307)






17-18
[9-10]
Ӧüһ(¥B307)






17-18
[11-12]
Ӧüһ(¥B307)






17-18
[1-2]
Ӧüһ(¥B307)






17-18
[3-4]
Ӧüһ(¥B307)






18
[5-6]
Ӧüһ(¥B307)






18
[7-8]
Ӧüһ(¥B307)
ı
003
0
רҵ/޿

15()1
17
[9-10]
ʵ(¥B408)






17
[11-12]
ʵ(¥B408)






17-18
һ[5-6]
ʵ(¥B408)






17-18
һ[7-8]
ʵ(¥B408)






17-18
[1-2]
ʵ(¥B408)






17-18
[3-4]
ʵ(¥B408)






17-18
[5-6]
ʵ(¥B408)






17-18
[7-8]
ʵ(¥B408)






17-18
[5-6]
ʵ(¥B408)






17-18
[7-8]
ʵ(¥B408)

004
0
/޿

15ɽ1
17
[1-2]
3G-ۺʵѵ(305)






17
[3-4]
3G-ۺʵѵ(305)






17-18
һ[1-2]
3G-ۺʵѵ(305)






17-18
һ[3-4]
3G-ۺʵѵ(305)






17-18
[5-6]
3G-ۺʵѵ(305)






17-18
[7-8]
3G-ۺʵѵ(305)






17-18
[1-2]
3G-ۺʵѵ(305)






17-18
[3-4]
3G-ۺʵѵ(305)






17-18
[5-6]
3G-ۺʵѵ(305)






17-18
[7-8]
3G-ۺʵѵ(305)

005
0
/޿

15ɽ2
17-18
һ[5-6]
3G-ۺʵѵ(305)






17-18
һ[7-8]
3G-ۺʵѵ(305)






17-18
[1-2]
3G-ۺʵѵ(305)






17-18
[3-4]
3G-ۺʵѵ(305)






17-18
[5-6]
3G-ۺʵѵ(305)






17-18
[7-8]
3G-ۺʵѵ(305)






17-18
[1-2]
3G-ۺʵѵ(305)






17-18
[3-4]
3G-ۺʵѵ(305)






18
[1-2]
3G-ۺʵѵ(305)






18
[3-4]
3G-ۺʵѵ(305)
ʤ
002
0
/޿

15(IT)
17-18
[1-2]
ʵѵң¶303






17-18
[3-4]
ʵѵң¶303






17-18
[5-6]
ʵѵң¶303






17-18
[7-8]
ʵѵң¶303






17-18
[9-10]
ʵѵң¶303






17-18
[11-12]
ʵѵң¶303






17-18
[5-6]
ʵѵң¶303






17-18
[7-8]
ʵѵң¶303






18
[1-2]
ʵѵң¶303






18
[3-4]
ʵѵң¶303
С
007
0
רҵ/޿

15()4
17-18
һ[1-2]
ʵ(¥B408)






17-18
һ[3-4]
ʵ(¥B408)






17-18
[1-2]
ʵ(¥B408)






17-18
[3-4]
ʵ(¥B408)






17-18
[5-6]
ʵ(¥B408)






17-18
[7-8]
ʵ(¥B408)






17-18
[1-2]
ʵ(¥B408)






17-18
[3-4]
ʵ(¥B408)






18
[9-10]
ʵ(¥B408)






18
[11-12]
ʵ(¥B408)
˹㻪
006
0
רҵ/޿

15()2
17
[1-2]
ʵѵң¶303






17
[3-4]
ʵѵң¶303






17-18
һ[5-6]
ʵѵң¶303






17-18
һ[7-8]
ʵѵң¶303






17-18
[5-6]
ʵѵң¶303






17-18
[7-8]
ʵѵң¶303






17-18
[9-10]
ʵѵң¶303






17-18
[11-12]
ʵѵң¶303






17-18
[1-2]
ʵѵң¶303






17-18
[3-4]
ʵѵң¶303
-
- - diff --git a/connection.properties b/connection.properties deleted file mode 100644 index ffc65a5..0000000 --- a/connection.properties +++ /dev/null @@ -1,4 +0,0 @@ -hostname=localhost:3306 -username= -password= -database= diff --git a/login.properties b/login.properties deleted file mode 100644 index 8443baf..0000000 --- a/login.properties +++ /dev/null @@ -1,7 +0,0 @@ -username= -password= -role=STU -charset=GB2312 -tableFormat=2 -delay=500 -userAgent=Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.90 Safari/537.36undefined5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.90 Safari/537.36 SN:NULL diff --git a/pom.xml b/pom.xml index 65c2186..d68a6c0 100644 --- a/pom.xml +++ b/pom.xml @@ -6,53 +6,179 @@ net.catten ssim - pom - 2.0 - - ClassScheduleAdapter - LNCKingoJWCaterpillar - SubjectImportCommonUtils - SubjectImporter - - - - - - - mysql - mysql-connector-java - 5.1.38 - - - - - org.jsoup - jsoup - 1.8.3 - - - - - commons-io - commons-io - 2.4 - - - - - org.apache.httpcomponents - httpclient - 4.5.2 - - - - junit - junit - 4.12 - test - - - + war + 3.0 + + + 5.1.0.Final + 4.2.5.RELEASE + 2.7.0 + + + + + + + + + + + mysql + mysql-connector-java + 5.1.38 + + + + + org.jsoup + jsoup + 1.8.3 + + + + + commons-io + commons-io + 2.4 + + + + + org.apache.httpcomponents + httpclient + 4.5.2 + + + + javax.servlet + servlet-api + 2.5 + + + + org.hibernate + hibernate-core + ${hibernate.version} + + + + org.hibernate + hibernate-entitymanager + ${hibernate.version} + + + + org.hibernate + hibernate-ehcache + ${hibernate.version} + + + + + org.springframework + spring-core + ${spring.version} + + + org.springframework + spring-orm + ${spring.version} + + + org.springframework + spring-context + ${spring.version} + + + + + + org.springframework + spring-webmvc + ${spring.version} + + + + org.freemarker + freemarker + 2.3.23 + + + + org.springframework + spring-context-support + ${spring.version} + + + + + + com.fasterxml.jackson.core + jackson-core + LATEST + + + + com.fasterxml.jackson.core + jackson-databind + LATEST + + + + com.fasterxml.jackson.core + jackson-annotations + LATEST + + + + + com.alibaba + druid + 1.0.15 + + + + + org.springframework.data + spring-data-jpa + 1.9.4.RELEASE + + + + + + org.slf4j + slf4j-log4j12 + 1.7.10 + + + + org.slf4j + jcl-over-slf4j + 1.7.10 + + + + org.springframework + spring-test + ${spring.version} + test + + + + org.mockito + mockito-core + 2.7.2 + test + + + + junit + junit + 4.12 + test + + @@ -64,6 +190,64 @@ 1.8 + + + + org.apache.maven.plugins + maven-war-plugin + 2.6 + + true + true + web + + + web + true + + + + + + + + org.eclipse.jetty + jetty-maven-plugin + 9.2.10.v20150310 + + 5 + web + + /cs + + + org.eclipse.jetty.util.URI.charset=UTF-8 + + stop + 8089 + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/SubjectImportCommonUtils/src/main/java/net/catten/ssim/common/events/TickEventProvider.java b/src/main/java/net/catten/ssim/common/events/TickEventProvider.java similarity index 100% rename from SubjectImportCommonUtils/src/main/java/net/catten/ssim/common/events/TickEventProvider.java rename to src/main/java/net/catten/ssim/common/events/TickEventProvider.java diff --git a/SubjectImportCommonUtils/src/main/java/net/catten/ssim/common/events/TickEventReceiver.java b/src/main/java/net/catten/ssim/common/events/TickEventReceiver.java similarity index 100% rename from SubjectImportCommonUtils/src/main/java/net/catten/ssim/common/events/TickEventReceiver.java rename to src/main/java/net/catten/ssim/common/events/TickEventReceiver.java diff --git a/src/main/java/net/catten/ssim/common/http/HttpSessionHolder.java b/src/main/java/net/catten/ssim/common/http/HttpSessionHolder.java new file mode 100644 index 0000000..8477158 --- /dev/null +++ b/src/main/java/net/catten/ssim/common/http/HttpSessionHolder.java @@ -0,0 +1,22 @@ +package net.catten.ssim.common.http; + +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.jsoup.nodes.Document; + +import java.io.IOException; + +/** + * Created by catten on 2/23/17. + */ +public interface HttpSessionHolder { + + Document post(String target, String refer, UrlEncodedFormEntity formEntity) throws IOException; + Document get(String target, String refer) throws IOException; + + void setUserAgent(String userAgent); + String getUserAgent(); + + void setCharset(String charset); + String getCharset(); + +} diff --git a/src/main/java/net/catten/ssim/common/http/impl/HttpSessionHolderImpl.java b/src/main/java/net/catten/ssim/common/http/impl/HttpSessionHolderImpl.java new file mode 100644 index 0000000..8dabca7 --- /dev/null +++ b/src/main/java/net/catten/ssim/common/http/impl/HttpSessionHolderImpl.java @@ -0,0 +1,100 @@ +package net.catten.ssim.common.http.impl; + +import net.catten.ssim.common.http.HttpSessionHolder; +import org.apache.http.NoHttpResponseException; +import org.apache.http.client.CookieStore; +import org.apache.http.client.HttpClient; +import org.apache.http.client.entity.UrlEncodedFormEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpPost; +import org.apache.http.client.protocol.HttpClientContext; +import org.apache.http.impl.client.BasicCookieStore; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.protocol.BasicHttpContext; +import org.apache.http.protocol.HttpContext; +import org.jsoup.Jsoup; +import org.jsoup.nodes.Document; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.io.IOException; + +/** + * Created by catten on 2/23/17. + */ +public class HttpSessionHolderImpl implements HttpSessionHolder { + + private Logger logger = LoggerFactory.getLogger(this.getClass()); + + private String userAgent = "HttpSessionHolder/Apache HttpClient/JRE"; + private String charset = "UTF-8"; + + private HttpClient httpClient; + + private HttpContext websiteContext; + private CookieStore cookieStore; + + public HttpSessionHolderImpl(){ + cookieStore = new BasicCookieStore(); + websiteContext = new BasicHttpContext(); + websiteContext.setAttribute(HttpClientContext.COOKIE_STORE, cookieStore); + + logger.info("Using userAgent : " + userAgent); + logger.info("Using charset : " + charset); + + httpClient = HttpClients + .custom() + .setRetryHandler((e, i, httpContext) -> i <= 5 && e instanceof NoHttpResponseException) + .build(); + } + + @Override + public Document post(String target, String refer, UrlEncodedFormEntity formEntity) throws IOException { + HttpPost request = new HttpPost(target); + request.setHeader("Referer", refer); + request.setHeader("User-Agent", userAgent); + request.setEntity(formEntity); + CloseableHttpResponse response = (CloseableHttpResponse) httpClient.execute(request, websiteContext); + Document document = Jsoup.parse(response.getEntity().getContent(),charset,target); + response.close(); + return document; + } + + @Override + public Document get(String target, String refer) throws IOException { + HttpGet request = new HttpGet(target); + request.setHeader("Referer", refer); + request.setHeader("User-Agent", userAgent); + CloseableHttpResponse response = (CloseableHttpResponse)httpClient.execute(request, websiteContext); + Document document = Jsoup.parse(response.getEntity().getContent(),charset,target); + response.close(); + return document; + } + + public String getUserAgent() { + return userAgent; + } + + public void setUserAgent(String userAgent) { + this.userAgent = userAgent; + logger.info("Set userAgent to " + userAgent); + } + + public String getCharset() { + return charset; + } + + public void setCharset(String charset) { + this.charset = charset; + logger.info("Set charset to " + charset); + } + + public CookieStore getCookieStore() { + return cookieStore; + } + + public void setCookieStore(CookieStore cookieStore) { + this.cookieStore = cookieStore; + } +} diff --git a/SubjectImporter/src/main/java/net/catten/ssim/events/ProgressPrinter.java b/src/main/java/net/catten/ssim/events/ProgressPrinter.java similarity index 100% rename from SubjectImporter/src/main/java/net/catten/ssim/events/ProgressPrinter.java rename to src/main/java/net/catten/ssim/events/ProgressPrinter.java diff --git a/src/main/java/net/catten/ssim/schedule/factory/CourseFactory.java b/src/main/java/net/catten/ssim/schedule/factory/CourseFactory.java new file mode 100644 index 0000000..3354669 --- /dev/null +++ b/src/main/java/net/catten/ssim/schedule/factory/CourseFactory.java @@ -0,0 +1,17 @@ +package net.catten.ssim.schedule.factory; + +import net.catten.ssim.schedule.model.KingoRawCourse; + +import java.io.File; +import java.io.IOException; + +/** + * Created by catten on 3/10/17. + */ +public interface CourseFactory { + T parse(File file) throws IOException; + + String getCharset(); + + void setCharset(String charset); +} diff --git a/src/main/java/net/catten/ssim/schedule/factory/LessonExpander.java b/src/main/java/net/catten/ssim/schedule/factory/LessonExpander.java new file mode 100644 index 0000000..4c5bcee --- /dev/null +++ b/src/main/java/net/catten/ssim/schedule/factory/LessonExpander.java @@ -0,0 +1,13 @@ +package net.catten.ssim.schedule.factory; + +import net.catten.ssim.schedule.model.KingoRawCourse; +import net.catten.ssim.web.model.Lesson; + +import java.util.List; + +/** + * Created by catten on 3/10/17. + */ +public interface LessonExpander { + List expand(R rawCourse); +} diff --git a/ClassScheduleAdapter/src/main/java/net/catten/ssim/schedule/factory/SubjectFactory.java b/src/main/java/net/catten/ssim/schedule/factory/impl/CourseFactoryImpl.java similarity index 75% rename from ClassScheduleAdapter/src/main/java/net/catten/ssim/schedule/factory/SubjectFactory.java rename to src/main/java/net/catten/ssim/schedule/factory/impl/CourseFactoryImpl.java index d7b75ce..42eb9c5 100644 --- a/ClassScheduleAdapter/src/main/java/net/catten/ssim/schedule/factory/SubjectFactory.java +++ b/src/main/java/net/catten/ssim/schedule/factory/impl/CourseFactoryImpl.java @@ -1,7 +1,9 @@ -package net.catten.ssim.schedule.factory; +package net.catten.ssim.schedule.factory.impl; -import net.catten.ssim.schedule.model.Lesson; -import net.catten.ssim.schedule.model.Subject; +import net.catten.ssim.schedule.factory.CourseFactory; +import net.catten.ssim.schedule.model.KingoRawCourse; +import net.catten.ssim.schedule.model.KingoRawLesson; +import net.catten.ssim.schedule.model.KingoRawTimePoint; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; @@ -13,7 +15,7 @@ /** * Created by catten on 11/12/16. */ -public class SubjectFactory { +public class CourseFactoryImpl implements CourseFactory { private String baseUrl = ""; private String charset = "UTF-8"; @@ -21,7 +23,7 @@ public class SubjectFactory { /** * Default constructor */ - public SubjectFactory(){ + public CourseFactoryImpl(){ } /** @@ -29,22 +31,10 @@ public SubjectFactory(){ * * @param charset */ - public SubjectFactory(String charset){ + public CourseFactoryImpl(String charset){ this.charset = charset; } - /** - * Parse HTML strings - * - * @param s HTML - * @param id id of this string - * @return - * @throws IOException - */ - public Subject parse(String s, Integer id) throws IOException { - return parse(Jsoup.parse(s),id); - } - /** * Parse HTML file using file object * @@ -52,7 +42,8 @@ public Subject parse(String s, Integer id) throws IOException { * @return * @throws IOException */ - public Subject parse(File file) throws IOException { + @Override + public KingoRawCourse parse(File file) throws IOException { if(file.isFile() && file.canRead() && file.exists()){ String name = file.getName().substring(0,file.getName().indexOf(".")); int id = 0; @@ -66,22 +57,22 @@ public Subject parse(File file) throws IOException { * Parse HTML file using stream * * @param inputStream stream - * @param id Give a ID to this Subject, can be null + * @param id Give a ID to this KingoRawCourse, can be null * @return * @throws IOException */ - public Subject parse(InputStream inputStream,Integer id) throws IOException { + public KingoRawCourse parse(InputStream inputStream, Integer id) throws IOException { Document document = Jsoup.parse(inputStream,charset, baseUrl); return parse(document,id); } - public Subject parse(Document document,Integer id){ + public KingoRawCourse parse(Document document, Integer id){ Element root = document.select("table").first(); Elements tables = root.select("table"); tables.remove(0); - Subject subject = new Subject(); + KingoRawCourse subject = new KingoRawCourse(); subject.setId(id); subject = processSubjectTerm(subject,tables.get(0)); @@ -98,10 +89,12 @@ public void setBaseUrl(String baseUrl) { this.baseUrl = baseUrl; } + @Override public String getCharset() { return charset; } + @Override public void setCharset(String charset) { this.charset = charset; } @@ -113,13 +106,13 @@ public void setCharset(String charset) { * * */ - private Subject processSubjectTerm(Subject subject,Element tableElement){ + private KingoRawCourse processSubjectTerm(KingoRawCourse subject, Element tableElement){ Elements elements = tableElement.select("tr"); subject.setTerm(elements.get(1).children().text()); return subject; } - private Subject processSubjectTitle(Subject subject,Element tableElement){ + private KingoRawCourse processSubjectTitle(KingoRawCourse subject, Element tableElement){ Elements fields = tableElement.select("td"); String text = fields.first().text(); String[] split = text.split(new String(new char[]{160})); @@ -145,16 +138,18 @@ private Subject processSubjectTitle(Subject subject,Element tableElement){ return subject; } - private List processLessonList(Element tableElement){ - LinkedList lessons = new LinkedList<>(); - Lesson lessonLatest = null; + private List processLessonList(Element tableElement){ + LinkedList lessons = new LinkedList<>(); + KingoRawLesson lessonLatest = null; Elements tableItems = tableElement.select("tr"); tableItems.removeIf(element -> !element.child(0).attr("width").equals("")); for (Element items : tableItems){ - Lesson lesson = new Lesson(); - for (int i = 0; i < items.childNodes().size();i++){ + KingoRawLesson lesson = new KingoRawLesson(); + KingoRawTimePoint timePoint = new KingoRawTimePoint(); + Elements elements = items.getElementsByTag("td"); + for (int i = 0; i < elements.size(); i++){ Element contentChild = items.child(i); String c = contentChild.text().trim(); boolean fillLatest = "".equals(c) && lessonLatest != null; @@ -178,10 +173,10 @@ private List processLessonList(Element tableElement){ lesson.setClassAttend(fillLatest ? lessonLatest.getClassAttend() : c.split(" ")); break; case 6: - lesson.setWeek(c); + timePoint.setWeekRange(c); break; case 7: - lesson.setTimePoint(c); + timePoint.setTimePoints(c); break; case 8: lesson.setPosition(c); @@ -190,6 +185,7 @@ private List processLessonList(Element tableElement){ break; } } + lesson.setTimePoint(timePoint); lessons.add(lesson); lessonLatest = lessons.getLast(); } diff --git a/src/main/java/net/catten/ssim/schedule/factory/impl/LessonExpanderImpl.java b/src/main/java/net/catten/ssim/schedule/factory/impl/LessonExpanderImpl.java new file mode 100644 index 0000000..149733e --- /dev/null +++ b/src/main/java/net/catten/ssim/schedule/factory/impl/LessonExpanderImpl.java @@ -0,0 +1,43 @@ +package net.catten.ssim.schedule.factory.impl; + +import net.catten.ssim.schedule.factory.LessonExpander; +import net.catten.ssim.web.model.Lesson; +import net.catten.ssim.schedule.model.KingoRawCourse; +import net.catten.ssim.schedule.model.KingoRawLesson; +import net.catten.ssim.schedule.model.Timepoint; + +import java.util.LinkedList; +import java.util.List; + +/** + * Created by catten on 2/24/17. + */ +public class LessonExpanderImpl implements LessonExpander { + @Override + public List expand(KingoRawCourse rawCourse){ + List lessons = new LinkedList<>(); + + for (KingoRawLesson rawLesson : rawCourse.getLessons()){ + for (Timepoint timepoint : rawLesson.getTimePoint().expand()){ + for (String c : rawLesson.getClassAttend()){ + Lesson lesson = new Lesson(); + lesson.setTerm(rawCourse.getTerm()); + lesson.setUnit(rawCourse.getUnit()); + lesson.setPeriod(rawCourse.getTimeSpend()); + lesson.setCredit(rawCourse.getPoint()); + lesson.setName(rawCourse.getName()); + lesson.setTeacher(rawLesson.getTeacher()); + lesson.setCategory(rawLesson.getClassType()); + lesson.setAttendClass(c); + lesson.setWeek(timepoint.getWeek()); + lesson.setWeekday(timepoint.getWeekday()); + lesson.setTurn(timepoint.getTurn()); + lesson.setAddress(rawLesson.getPosition()); + lessons.add(lesson); + } + } + } + + return lessons; + } +} diff --git a/src/main/java/net/catten/ssim/schedule/kingo/jw/caterpillar/CourseScheduleCaterpillar.java b/src/main/java/net/catten/ssim/schedule/kingo/jw/caterpillar/CourseScheduleCaterpillar.java new file mode 100644 index 0000000..9e0c729 --- /dev/null +++ b/src/main/java/net/catten/ssim/schedule/kingo/jw/caterpillar/CourseScheduleCaterpillar.java @@ -0,0 +1,33 @@ +package net.catten.ssim.schedule.kingo.jw.caterpillar; + +import net.catten.ssim.common.events.TickEventProvider; + +import java.io.File; +import java.io.IOException; +import java.util.Map; +import java.util.Properties; + +/** + * Created by catten on 2/24/17. + */ +public interface CourseScheduleCaterpillar extends TickEventProvider { + Map getTermsFromRemote() throws IOException; + + Map getCoursesFromRemote(String termCode) throws IOException; + + int getTermSubjectToFiles(String termCode, File outputFolder) throws IOException, InterruptedException; + + boolean isLoginExpire() throws IOException; + + String getUserAgent(); + + void setUserAgent(String userAgent); + + String getCharset(); + + void setCharset(String charset); + + Properties getLoginProperties(); + + void setLoginProperties(Properties loginProperties) throws IOException; +} diff --git a/LNCKingoJWCaterpillar/src/main/java/net/catten/lnc/kingo/jw/caterpillar/KingoJWCaterpillar.java b/src/main/java/net/catten/ssim/schedule/kingo/jw/caterpillar/impl/KingoJWCaterpillar.java similarity index 55% rename from LNCKingoJWCaterpillar/src/main/java/net/catten/lnc/kingo/jw/caterpillar/KingoJWCaterpillar.java rename to src/main/java/net/catten/ssim/schedule/kingo/jw/caterpillar/impl/KingoJWCaterpillar.java index 2af519d..ad84f05 100644 --- a/LNCKingoJWCaterpillar/src/main/java/net/catten/lnc/kingo/jw/caterpillar/KingoJWCaterpillar.java +++ b/src/main/java/net/catten/ssim/schedule/kingo/jw/caterpillar/impl/KingoJWCaterpillar.java @@ -1,80 +1,70 @@ -package net.catten.lnc.kingo.jw.caterpillar; +package net.catten.ssim.schedule.kingo.jw.caterpillar.impl; -import net.catten.ssim.common.events.TickEventProvider; +import net.catten.ssim.common.http.HttpSessionHolder; +import net.catten.ssim.common.http.impl.HttpSessionHolderImpl; +import net.catten.ssim.schedule.kingo.jw.caterpillar.CourseScheduleCaterpillar; import net.catten.ssim.common.events.TickEventReceiver; -import org.apache.commons.io.IOUtils; import org.apache.commons.io.output.FileWriterWithEncoding; import org.apache.http.NameValuePair; -import org.apache.http.client.CookieStore; -import org.apache.http.client.HttpClient; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; -import org.apache.http.client.methods.HttpGet; -import org.apache.http.client.methods.HttpPost; -import org.apache.http.client.methods.HttpRequestBase; -import org.apache.http.client.protocol.HttpClientContext; -import org.apache.http.impl.client.BasicCookieStore; -import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; -import org.apache.http.protocol.BasicHttpContext; -import org.apache.http.protocol.HttpContext; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.nodes.FormElement; import org.jsoup.select.Elements; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; -import java.io.*; +import java.io.File; +import java.io.IOException; +import java.io.UnsupportedEncodingException; import java.math.BigInteger; import java.nio.file.Files; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.util.*; -import java.util.logging.Logger; import java.util.stream.Collectors; /** * Created by catten on 11/17/16. */ -public class KingoJWCaterpillar implements TickEventProvider { +public class KingoJWCaterpillar implements CourseScheduleCaterpillar { private Properties loginProperties; private Properties stringProperties; - private String userAgent; - private String charset; private int delayMS; - private Logger logger = Logger.getLogger(KingoJWCaterpillar.class.toString()); + private Logger logger = LoggerFactory.getLogger(KingoJWCaterpillar.class); - private HttpContext websiteContext; - private CookieStore cookieStore; - - private HttpClient httpClient; + private HttpSessionHolder httpSessionHolder = new HttpSessionHolderImpl(); private TickEventReceiver tickEventReceiver = message -> { - //do nothing... + logger.info("Working : " + message[0] + "/" + message[1] + " - " + message[2]); }; public KingoJWCaterpillar(Properties loginProperties) throws IOException { - this.loginProperties = new Properties(); + init(loginProperties); + } + + public KingoJWCaterpillar(){ + logger.info("Using default tick receiver : logger "); + } + + private void init(Properties loginProperties) throws IOException { this.stringProperties = new Properties(); this.loginProperties = loginProperties; - stringProperties.load(KingoJWCaterpillar.class.getResourceAsStream("/strings.properties")); + + stringProperties.load(KingoJWCaterpillar.class.getResourceAsStream("/net/catten/ssim/schedule/kingo/jw/strings.properties")); logger.info("Properties Loaded."); - cookieStore = new BasicCookieStore(); - websiteContext = new BasicHttpContext(); - websiteContext.setAttribute(HttpClientContext.COOKIE_STORE, cookieStore); - logger.info("Website context initialized."); + setUserAgent(loginProperties.getProperty("userAgent")); + logger.info("Using User-Agent : " + getUserAgent()); + setCharset(loginProperties.getProperty("charset")); + logger.info("Using encoding : " + getCharset()); - userAgent = loginProperties.getProperty("userAgent"); - logger.info("Using User-Agent : " + userAgent); - charset = loginProperties.getProperty("charset"); - logger.info("Using encoding : " + charset); delayMS = Integer.parseInt(loginProperties.getProperty("delay")); logger.info("Page capture delay : " + String.valueOf(delayMS) + " ms."); - - httpClient = HttpClients.createDefault(); - logger.info("HTTP Client started."); } static String getEncryptedPassword(String username, String password) { @@ -110,25 +100,20 @@ public boolean initializeSession() throws IOException { CloseableHttpResponse response; //Try to get indexPage - logger.info("Requesting address : " + loginPageAddress); - response = getResponse(loginPageAddress, loginPageAddress); - resultPage = Jsoup.parse(response.getEntity().getContent(), charset, ""); - response.close(); + resultPage = httpSessionHolder.get(loginPageAddress, loginPageAddress); FormElement theForm = (FormElement) resultPage.getElementsByTag("form").first(); - if (theForm.elements().size() < 1) { - logger.warning("Login form not found, maybe the website was close or under construction."); + if (!Validate.isForm(theForm) && theForm.elements().size() <= 0) { + logger.warn("Login form not found, maybe the website was close or under construction."); return false; } //Try to login - response = postResponse(loginPageAddress, loginPageAddress, prepareLoginData(theForm)); - resultPage = Jsoup.parse(response.getEntity().getContent(), charset, ""); - response.close(); + resultPage = httpSessionHolder.post(loginPageAddress, loginPageAddress, prepareLoginData(theForm)); Element element = resultPage.getElementById("divLogNote").child(0); if (!element.text().equals(stringProperties.getProperty("loginSuccessTip"))) { - logger.warning("Login result : " + element.text()); + logger.warn("Login result : " + element.text()); return false; } return true; @@ -140,14 +125,13 @@ public boolean initializeSession() throws IOException { * @return * @throws IOException */ - public Map getTerms() throws IOException { + @Override + public Map getTermsFromRemote() throws IOException { String queryPage = stringProperties.getProperty("classInfoQueryPage"); + //Get page - CloseableHttpResponse response = getResponse(queryPage, queryPage); - Document resultPage = Jsoup.parse(response.getEntity().getContent(), charset, ""); - response.close(); - logger.info("request finished."); + Document resultPage = httpSessionHolder.get(queryPage, queryPage); //Analyze page FormElement theForm = (FormElement) resultPage.getElementById("form1"); @@ -166,15 +150,14 @@ public Map getTerms() throws IOException { * @return * @throws IOException */ - public Map getSubjects(Integer termCode) throws IOException { + @Override + public Map getCoursesFromRemote(String termCode) throws IOException { - String queryPage = stringProperties.getProperty("subjectListQueryPage") + String.valueOf(termCode); + String queryPage = stringProperties.getProperty("subjectListQueryPage") + termCode; String referPage = stringProperties.getProperty("classInfoQueryPage"); + //Get page - CloseableHttpResponse response = getResponse(queryPage, referPage); - Document resultPage = Jsoup.parse(response.getEntity().getContent(), charset, ""); - response.close(); - logger.info("request finished."); + Document resultPage = httpSessionHolder.get(queryPage, referPage); //Analyze page Element scriptElement = resultPage.getElementsByTag("script").first(); @@ -192,49 +175,6 @@ public Map getSubjects(Integer termCode) throws IOException { return null; } - /** - * Get all subjects in a term and save them to an array. - * - * @param termCode - * @return - * @throws IOException - * @throws InterruptedException - */ - public Map getTermSubjectToMemory(Integer termCode) throws IOException, InterruptedException { - - if (isLoginExpire()) initializeSession(); - logger.info("checking login status finished"); - - String referPage = stringProperties.getProperty("classInfoQueryPage"); - String targetPage = stringProperties.getProperty("subjectQueryPage"); - - - LinkedList nameValuePairs = new LinkedList<>(); - nameValuePairs.add(new BasicNameValuePair("Sel_XNXQ", String.valueOf(termCode))); - nameValuePairs.add(new BasicNameValuePair("gs", loginProperties.getProperty("tableFormat"))); - nameValuePairs.add(new BasicNameValuePair("txt_yzm", "")); - nameValuePairs.addLast(new BasicNameValuePair("Sel_KC", "")); - - Map results = new HashMap<>(); - - logger.info("Capturing subject data..."); - Map lessonListOfTheTerm = getSubjects(termCode); - int total = lessonListOfTheTerm.size(); - int current = 0; - logger.info("total item count - " + lessonListOfTheTerm.keySet().size()); - for (String key : lessonListOfTheTerm.keySet()) { - current++; - nameValuePairs.removeLast(); - nameValuePairs.addLast(new BasicNameValuePair("Sel_KC", key)); - results.put(Integer.parseInt(key), getSingleSubjectPage(referPage, targetPage, new UrlEncodedFormEntity(nameValuePairs))); - tickEventReceiver.tick(total, current, key); - Thread.sleep(delayMS); - } - System.out.println(); - logger.info("Capture finished."); - return results; - } - /** * Get all subjects in a term and save them to file. * @@ -244,13 +184,23 @@ public Map getTermSubjectToMemory(Integer termCode) throws IOEx * @throws IOException * @throws InterruptedException */ - public int getTermSubjectToFiles(Integer termCode, File outputFolder) throws IOException, InterruptedException { + @Override + public int getTermSubjectToFiles(String termCode, File outputFolder) throws IOException, InterruptedException { if (!outputFolder.isDirectory()) { - logger.warning("specified path is not a directory : " + outputFolder.getAbsolutePath()); + logger.warn("specified path is not a directory : " + outputFolder.getAbsolutePath()); return -1; } + File[] files = outputFolder.listFiles(); + if(files != null && files.length > 0){ + logger.info("Cleaning old files..."); + for (File file : files){ + Files.delete(file.toPath()); + } + logger.info("Cleaning finished."); + } + if (isLoginExpire()) initializeSession(); logger.info("checking login status finished"); @@ -259,13 +209,13 @@ public int getTermSubjectToFiles(Integer termCode, File outputFolder) throws IOE LinkedList nameValuePairs = new LinkedList<>(); - nameValuePairs.add(new BasicNameValuePair("Sel_XNXQ", String.valueOf(termCode))); + nameValuePairs.add(new BasicNameValuePair("Sel_XNXQ", termCode)); nameValuePairs.add(new BasicNameValuePair("gs", loginProperties.getProperty("tableFormat"))); nameValuePairs.add(new BasicNameValuePair("txt_yzm", "")); nameValuePairs.addLast(new BasicNameValuePair("Sel_KC", "")); logger.info("Capturing subject data..."); - Map lessonListOfTheTerm = getSubjects(termCode); + Map lessonListOfTheTerm = getCoursesFromRemote(termCode); int total = lessonListOfTheTerm.size(); int current = 0; logger.info("total item count - " + lessonListOfTheTerm.keySet().size()); @@ -276,7 +226,7 @@ public int getTermSubjectToFiles(Integer termCode, File outputFolder) throws IOE File file = new File(outputFolder, key + ".html"); FileWriterWithEncoding fileWriter = new FileWriterWithEncoding(file, "UTF-8"); - fileWriter.write(getSingleSubjectPage(referPage, targetPage, new UrlEncodedFormEntity(nameValuePairs))); + fileWriter.write(httpSessionHolder.post(targetPage, referPage, new UrlEncodedFormEntity(nameValuePairs)).toString()); fileWriter.flush(); fileWriter.close(); @@ -288,27 +238,18 @@ public int getTermSubjectToFiles(Integer termCode, File outputFolder) throws IOE return current; } - private String getSingleSubjectPage(String refer, String targetPage, UrlEncodedFormEntity formEntity) throws IOException { - CloseableHttpResponse response = postResponse(targetPage, refer, formEntity); - String result = IOUtils.toString(response.getEntity().getContent(), charset); - response.close(); - return result; - } - /** * Get a page , if the validate field in the from is require, return true. * * @return * @throws IOException */ + @Override public boolean isLoginExpire() throws IOException { String queryPage = stringProperties.getProperty("classInfoQueryPage"); - CloseableHttpResponse response = getResponse(queryPage, queryPage); - Document resultPage = Jsoup.parse(response.getEntity().getContent(), charset, ""); - response.close(); - logger.info("request finished."); + Document resultPage = httpSessionHolder.get(queryPage, queryPage); Element element = resultPage.getElementById("txt_yzm"); boolean result = !element.parent().attr("style").equals("display:none"); @@ -330,7 +271,7 @@ private UrlEncodedFormEntity prepareLoginData(FormElement formElement) throws Un String attrName = element.attr("name"); switch (attrName) { case "pcInfo": - nameValuePairs.add(new BasicNameValuePair(attrName, userAgent)); + nameValuePairs.add(new BasicNameValuePair(attrName, getUserAgent())); break; case "dsdsdsdsdxcxdfgfg": nameValuePairs.add(new BasicNameValuePair(attrName, getEncryptedPassword(loginProperties.getProperty("username"), loginProperties.getProperty("password")))); @@ -355,60 +296,43 @@ private UrlEncodedFormEntity prepareLoginData(FormElement formElement) throws Un } } } - return new UrlEncodedFormEntity(nameValuePairs, charset); + return new UrlEncodedFormEntity(nameValuePairs, getCharset()); } - /** - * Set user-agent as Chrome(Linux) and set refer - * - * @param request - * @param refer - */ - private void prepareBaseHeader(HttpRequestBase request, String refer) { - request.setHeader("Referer", refer); - request.setHeader("User-Agent", userAgent); + @Override + public String getUserAgent() { + return httpSessionHolder.getUserAgent(); } - /** - * Factory method for GET request - * - * @param targetPage - * @param refer - * @return - * @throws IOException - */ - private CloseableHttpResponse getResponse(String targetPage, String refer) throws IOException { - HttpGet httpGet = new HttpGet(targetPage); - prepareBaseHeader(httpGet, refer); - return (CloseableHttpResponse) httpClient.execute(httpGet, websiteContext); + @Override + public void setUserAgent(String userAgent) { + httpSessionHolder.setUserAgent(userAgent); } - /** - * Factory method for POST request - * - * @param targetPage - * @param refer - * @param formEntity - * @return - * @throws IOException - */ - private CloseableHttpResponse postResponse(String targetPage, String refer, UrlEncodedFormEntity formEntity) throws IOException { - HttpPost httpPost = new HttpPost(targetPage); - prepareBaseHeader(httpPost, refer); - httpPost.setEntity(formEntity); - return (CloseableHttpResponse) httpClient.execute(httpPost, websiteContext); + @Override + public void setTickReceiver(TickEventReceiver tickEventReceiver) { + this.tickEventReceiver = tickEventReceiver; + logger.info("Using tick receiver : " + tickEventReceiver.getClass()); } - public String getUserAgent() { - return userAgent; + @Override + public String getCharset() { + return httpSessionHolder.getCharset(); } - public void setUserAgent(String userAgent) { - this.userAgent = userAgent; + @Override + public void setCharset(String charset) { + httpSessionHolder.setCharset(charset); } @Override - public void setTickReceiver(TickEventReceiver tickEventReceiver) { - this.tickEventReceiver = tickEventReceiver; + public Properties getLoginProperties() { + return loginProperties; + } + + @Override + public void setLoginProperties(Properties loginProperties) throws IOException { + init(loginProperties); + this.loginProperties = loginProperties; } } diff --git a/src/main/java/net/catten/ssim/schedule/kingo/jw/caterpillar/impl/Validate.java b/src/main/java/net/catten/ssim/schedule/kingo/jw/caterpillar/impl/Validate.java new file mode 100644 index 0000000..6203a35 --- /dev/null +++ b/src/main/java/net/catten/ssim/schedule/kingo/jw/caterpillar/impl/Validate.java @@ -0,0 +1,13 @@ +package net.catten.ssim.schedule.kingo.jw.caterpillar.impl; + +import org.jsoup.nodes.Element; +import org.jsoup.nodes.FormElement; + +/** + * Created by catten on 2/23/17. + */ +public class Validate { + public static boolean isForm(Element element){ + return element.tag().getName().equals("form"); + } +} diff --git a/ClassScheduleAdapter/src/main/java/net/catten/ssim/schedule/model/Subject.java b/src/main/java/net/catten/ssim/schedule/model/KingoRawCourse.java similarity index 90% rename from ClassScheduleAdapter/src/main/java/net/catten/ssim/schedule/model/Subject.java rename to src/main/java/net/catten/ssim/schedule/model/KingoRawCourse.java index ed73905..a4259d0 100644 --- a/ClassScheduleAdapter/src/main/java/net/catten/ssim/schedule/model/Subject.java +++ b/src/main/java/net/catten/ssim/schedule/model/KingoRawCourse.java @@ -5,7 +5,7 @@ /** * Created by catten on 11/12/16. */ -public class Subject { +public class KingoRawCourse { private Integer id; //服务器上的ID private String term;//学期 private String name;//课程名称 @@ -13,7 +13,7 @@ public class Subject { private String unit;//承担单位 private double timeSpend;//学时 private Double point;//学分 - private List lessons;//课堂 + private List lessons;//课堂 public Integer getId() { return id; @@ -75,17 +75,17 @@ public void setPoint(Double point) { this.point = point; } - public List getLessons() { + public List getLessons() { return lessons; } - public void setLessons(List lessons) { + public void setLessons(List lessons) { this.lessons = lessons; } @Override public String toString() { - return "Subject{" + + return "KingoRawCourse{" + "id=" + id + ", term='" + term + '\'' + ", name='" + name + '\'' + diff --git a/ClassScheduleAdapter/src/main/java/net/catten/ssim/schedule/model/Lesson.java b/src/main/java/net/catten/ssim/schedule/model/KingoRawLesson.java similarity index 67% rename from ClassScheduleAdapter/src/main/java/net/catten/ssim/schedule/model/Lesson.java rename to src/main/java/net/catten/ssim/schedule/model/KingoRawLesson.java index 4418f3d..72bd2b2 100644 --- a/ClassScheduleAdapter/src/main/java/net/catten/ssim/schedule/model/Lesson.java +++ b/src/main/java/net/catten/ssim/schedule/model/KingoRawLesson.java @@ -1,21 +1,18 @@ package net.catten.ssim.schedule.model; import java.util.Arrays; -import java.util.LinkedList; -import java.util.List; /** * Created by catten on 11/12/16. */ -public class Lesson { +public class KingoRawLesson { private String teacher;//任课老师 private String classNumber;//上课班号 private Integer attendAmount;//上课人数 private String[] classAttend;//上课班级构成 private String classType;//课程类别 private String assessmentType;//考核方式 - private List weeks;//周次 - private String timePoint;//节次 + private KingoRawTimePoint timePoint; private String position;//地点 public String getTeacher() { @@ -58,40 +55,6 @@ public void setAssessmentType(String assessmentType) { this.assessmentType = assessmentType; } - public List getWeeks() { - return weeks; - } - - public void setWeek(String parse){ - String[] list = parse.split(","); - List _weeks = new LinkedList<>(); - for (String s : list){ - String[] range = s.split("-"); - if(range.length == 1) { - _weeks.add(Integer.parseInt(range[0])); - }else { - int _startWeek = Integer.parseInt(range[0]); - int _endWeek = Integer.parseInt(range[range.length - 1]); - for (int i = _startWeek; i <= _endWeek; i++){ - _weeks.add(i); - } - } - } - this.weeks = _weeks; - } - - public void setWeeks(List weeks) { - this.weeks = weeks; - } - - public String getTimePoint() { - return timePoint; - } - - public void setTimePoint(String timePoint) { - this.timePoint = timePoint; - } - public String getPosition() { return position; } @@ -110,16 +73,24 @@ public void setClassAttend(String[] classAttend) { @Override public String toString() { - return "Lesson{" + + return "KingoRawLesson{" + "teacher='" + teacher + '\'' + ", classNumber='" + classNumber + '\'' + ", attendAmount=" + attendAmount + ", classAttend=" + Arrays.toString(classAttend) + ", classType='" + classType + '\'' + ", assessmentType='" + assessmentType + '\'' + - ", weeks=" + weeks + + ", weeks=" + timePoint + ", timePoint=" + timePoint + ", position='" + position + '\'' + '}'; } + + public KingoRawTimePoint getTimePoint() { + return timePoint; + } + + public void setTimePoint(KingoRawTimePoint timePoint) { + this.timePoint = timePoint; + } } diff --git a/src/main/java/net/catten/ssim/schedule/model/KingoRawTimePoint.java b/src/main/java/net/catten/ssim/schedule/model/KingoRawTimePoint.java new file mode 100644 index 0000000..c69262e --- /dev/null +++ b/src/main/java/net/catten/ssim/schedule/model/KingoRawTimePoint.java @@ -0,0 +1,108 @@ +package net.catten.ssim.schedule.model; + +import java.util.HashMap; +import java.util.LinkedList; +import java.util.List; +import java.util.Map; + +/** + * Created by catten on 2/24/17. + */ +public class KingoRawTimePoint { + private static Map weekMap = new HashMap() { + { + put("日", 0); + put("一", 1); + put("二", 2); + put("三", 3); + put("四", 4); + put("五", 5); + put("六", 6); + } + }; + + private String weekRange; + private String timePoints; + + public KingoRawTimePoint() { + + } + + public KingoRawTimePoint(String weekRange, String timePoints) { + this.weekRange = weekRange; + this.timePoints = timePoints; + } + + public String getWeekRange() { + return weekRange; + } + + public void setWeekRange(String weekRange) { + this.weekRange = weekRange; + } + + public String getTimePoints() { + return timePoints; + } + + public void setTimePoints(String timePoints) { + timePoints = timePoints.replace("节",""); + this.timePoints = timePoints; + } + + private List parseWeeks(String parse) { + String[] list = parse.split(","); + List _weeks = new LinkedList<>(); + for (String s : list) { + String[] range = s.split("-"); + if (range.length == 1) { + _weeks.add(Integer.parseInt(range[0])); + } else { + int _startWeek = Integer.parseInt(range[0]); + int _endWeek = Integer.parseInt(range[range.length - 1]); + for (int i = _startWeek; i <= _endWeek; i++) { + _weeks.add(i); + } + } + } + return _weeks; + } + + public List expand() { + List timepoints = new LinkedList<>(); + + List weeks = parseWeeks(weekRange); + for (Integer week : weeks) { + String[] strings = timePoints.split("\\[|]"); + if (strings.length >= 3) { + switch (strings[2]) { + case "双": + if (week % 2 != 0) continue; + case "单": + if (week % 2 == 0) continue; + default: + break; + } + } + + String[] r = strings[1].split("-"); + if(r.length > 1){ + for (int i = Integer.parseInt(r[0]); i <= Integer.parseInt(r[1]); i++){ + timepoints.add(new Timepoint(week,weekMap.get(strings[0]),i)); + } + }else { + timepoints.add(new Timepoint(week,weekMap.get(strings[0]),Integer.parseInt(r[0]))); + } + } + + return timepoints; + } + + @Override + public String toString() { + return "KingoRawTimePoint{" + + "weekRange='" + weekRange + '\'' + + ", timePoints='" + timePoints + '\'' + + '}'; + } +} diff --git a/src/main/java/net/catten/ssim/schedule/model/Timepoint.java b/src/main/java/net/catten/ssim/schedule/model/Timepoint.java new file mode 100644 index 0000000..89757c1 --- /dev/null +++ b/src/main/java/net/catten/ssim/schedule/model/Timepoint.java @@ -0,0 +1,49 @@ +package net.catten.ssim.schedule.model; + +/** + * Created by catten on 2/24/17. + */ +public class Timepoint { + private int week; + private int weekday; + private int turn; + + public Timepoint(int week, int weekday, int turn) { + this.week = week; + this.weekday = weekday; + this.turn = turn; + } + + public int getWeek() { + return week; + } + + public void setWeek(int week) { + this.week = week; + } + + public int getWeekday() { + return weekday; + } + + public void setWeekday(int weekday) { + this.weekday = weekday; + } + + public int getTurn() { + return turn; + } + + public void setTurn(int turn) { + this.turn = turn; + } + + @Override + public String toString() { + return "Timepoint{" + + "week=" + week + + ", weekday=" + weekday + + ", turn=" + turn + + '}'; + } +} diff --git a/src/main/java/net/catten/ssim/web/controller/ClassScheduleController.java b/src/main/java/net/catten/ssim/web/controller/ClassScheduleController.java new file mode 100644 index 0000000..d7c2bed --- /dev/null +++ b/src/main/java/net/catten/ssim/web/controller/ClassScheduleController.java @@ -0,0 +1,64 @@ +package net.catten.ssim.web.controller; + +import net.catten.ssim.web.model.Lesson; +import net.catten.ssim.web.services.LessonServices; +import org.apache.log4j.Logger; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.List; + +/** + * Created by catten on 3/7/17. + */ +@Controller +@RequestMapping("/api") +public class ClassScheduleController { + + private LessonServices lessonServices; + + @Autowired + public void setLessonServices(LessonServices lessonServices) { + this.lessonServices = lessonServices; + } + + @RequestMapping("/terms") + public Model terms(Model model) { + model.addAttribute("data", lessonServices.querySchoolTerms()); + return model; + } + + @RequestMapping("/weeks") + public Model termWeekCount(@RequestParam("termName") String termName, Model model) { + model.addAttribute("data", lessonServices.queryWeeks(termName)); + return model; + } + + @RequestMapping("/classes") + public Model termClasses(@RequestParam("termName") String termName, Model model) { + model.addAttribute("data", lessonServices.listClassesInTerm(termName)); + return model; + } + + @RequestMapping("/lessons") + public Model lessons( + @RequestParam("termName") String termName, + @RequestParam(value = "week", required = false) Integer week, + @RequestParam("className") String className, + @RequestParam(value = "ignoreType", required = false) List ignoreTypes, + Model model) { + + model.addAttribute("data", lessonServices.querySchedule(termName, className, week, ignoreTypes)); + + return model; + } + + @RequestMapping("/types") + public Model lessonTypes(Model model) { + model.addAttribute("data",lessonServices.listClassTypes()); + return model; + } +} diff --git a/src/main/java/net/catten/ssim/web/controller/IndexController.java b/src/main/java/net/catten/ssim/web/controller/IndexController.java new file mode 100644 index 0000000..8d89f82 --- /dev/null +++ b/src/main/java/net/catten/ssim/web/controller/IndexController.java @@ -0,0 +1,84 @@ +package net.catten.ssim.web.controller; + +import net.catten.ssim.web.model.Lesson; +import net.catten.ssim.web.services.LessonServices; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; + +import java.util.*; +import java.util.stream.Collectors; + +/** + * Created by cattenlinger on 2017/3/10. + */ +@Controller +@RequestMapping("") +public class IndexController { + + private LessonServices lessonServices; + + @Autowired + public void setLessonServices(LessonServices lessonServices) { + this.lessonServices = lessonServices; + } + + @RequestMapping(method = RequestMethod.GET) + public String index(Model model){ + model.addAttribute("terms",lessonServices.querySchoolTerms()); + return "index"; + } + + @RequestMapping(value = "/terms/{termName}",method = RequestMethod.GET) + public String termInfo(@PathVariable("termName") String termName, Model model){ + + model.addAttribute("term",termName); + Integer weekCount = lessonServices.queryWeeks(termName); + if(weekCount == null) return "nodata"; + model.addAttribute("weeks",weekCount); + + model.addAttribute("classes",lessonServices.listClassesInTerm(termName)); + model.addAttribute("categories",lessonServices.listClassTypes()); + return "term"; + } + + @RequestMapping(value = "/schedule") + public String querySchedule( + @RequestParam("termName") String termName, + @RequestParam("week") Integer week, + @RequestParam("class") String className, + @RequestParam(value = "ignoreType",required = false) List ignoreTypes, + Model model){ + + model.addAttribute("term",termName); + + List lessons = lessonServices.querySchedule(termName, className, week, ignoreTypes); + if(lessons == null || lessons.size() == 0) return "nodata"; + + Queue sortedLessons = new LinkedList<>(lessons.parallelStream().sorted( + Comparator.comparing(Lesson::getWeekday) + .thenComparing(Comparator.comparing(Lesson::getTurn))) + .collect(Collectors.toList())); + +// List[][] lessonMap = new List[7][8]; +// for(Lesson lesson : lessons){ +// List turnLessons = lessonMap[lesson.getWeekday()][lesson.getTurn()]; +// if(turnLessons == null) { +// lessonMap[lesson.getWeekday()][lesson.getTurn()] = new LinkedList<>(); +// turnLessons = lessonMap[lesson.getWeekday()][lesson.getTurn()]; +// } +// +// turnLessons.add(lesson); +// } + + model.addAttribute("schedule",sortedLessons); + model.addAttribute("week",week); + model.addAttribute("className",className); + + return "schedule"; + } +} diff --git a/src/main/java/net/catten/ssim/web/controller/ManageController.java b/src/main/java/net/catten/ssim/web/controller/ManageController.java new file mode 100644 index 0000000..93bc18a --- /dev/null +++ b/src/main/java/net/catten/ssim/web/controller/ManageController.java @@ -0,0 +1,57 @@ +package net.catten.ssim.web.controller; + +import net.catten.ssim.web.services.CoursesUpdateServices; +import net.catten.ssim.web.services.SimpleUserServices; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; + +/** + * Created by cattenlinger on 2017/3/9. + */ +@Controller +@RequestMapping("/api/manage") +public class ManageController { + + private CoursesUpdateServices coursesUpdateServices; + @Autowired + public void setCoursesUpdateServices(CoursesUpdateServices coursesUpdateServices) { + this.coursesUpdateServices = coursesUpdateServices; + } + + @RequestMapping("/task") + public Model getTaskStatus(Model model){ + model.addAttribute("status",coursesUpdateServices.getStatus()); + model.addAttribute("task",coursesUpdateServices.getTaskStatus()); + return model; + } + + @RequestMapping("/task/fire") + public Model startTask(@RequestParam("code") String taskCode, Model model){ + coursesUpdateServices.setTaskCode(taskCode); + coursesUpdateServices.fireCaptureThread(false); + + model.addAttribute("status",coursesUpdateServices.getStatus()); + model.addAttribute("task",coursesUpdateServices.getTaskStatus()); + return model; + } + + @RequestMapping("/task/import") + public Model startImport(Model model){ + coursesUpdateServices.fireCaptureThread(true); + model.addAttribute("status",coursesUpdateServices.getStatus()); + model.addAttribute("task",coursesUpdateServices.getTaskStatus()); + return model; + } + + @RequestMapping("/task/terminate") + public Model stopTask(Model model){ + coursesUpdateServices.terminateCaptureThread(); + model.addAttribute("status",coursesUpdateServices.getStatus()); + model.addAttribute("task",coursesUpdateServices.getTaskStatus()); + return model; + } +} diff --git a/src/main/java/net/catten/ssim/web/controller/TokenController.java b/src/main/java/net/catten/ssim/web/controller/TokenController.java new file mode 100644 index 0000000..17ee279 --- /dev/null +++ b/src/main/java/net/catten/ssim/web/controller/TokenController.java @@ -0,0 +1,33 @@ +package net.catten.ssim.web.controller; + +import net.catten.ssim.web.services.SimpleUserServices; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Controller; +import org.springframework.ui.Model; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RequestParam; + +/** + * Created by cattenlinger on 2017/3/9. + */ +@Controller +@RequestMapping("/secure/token") +public class TokenController { + + private SimpleUserServices userServices; + + @Autowired + public void setUserServices(SimpleUserServices userServices) { + this.userServices = userServices; + } + + @RequestMapping(method = RequestMethod.POST) + public Model getToken(@RequestParam("username") String username, @RequestParam("password") String password, Model model){ + String token = userServices.generateToken(username,password); + model.addAttribute("token",token); + model.addAttribute("expireDate",userServices.tokenExpireDate(token)); + return model; + } + +} diff --git a/src/main/java/net/catten/ssim/web/interceptors/PermissionInterceptor.java b/src/main/java/net/catten/ssim/web/interceptors/PermissionInterceptor.java new file mode 100644 index 0000000..ee37e7e --- /dev/null +++ b/src/main/java/net/catten/ssim/web/interceptors/PermissionInterceptor.java @@ -0,0 +1,42 @@ +package net.catten.ssim.web.interceptors; + +import net.catten.ssim.web.services.SimpleUserServices; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.servlet.HandlerInterceptor; +import org.springframework.web.servlet.ModelAndView; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; + +/** + * Created by cattenlinger on 2017/3/9. + */ +public class PermissionInterceptor implements HandlerInterceptor { + + private SimpleUserServices userServices; + + @Autowired + public void setUserServices(SimpleUserServices userServices) { + this.userServices = userServices; + } + + @Override + public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { + + String token = request.getHeader("SSIM-AUTH-TOKEN"); + if(token == null || token.equals("") || userServices.isTokenExpired(token)) { + response.sendError(HttpServletResponse.SC_FORBIDDEN); + return false; + }else return true; + } + + @Override + public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { + + } + + @Override + public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { + + } +} diff --git a/src/main/java/net/catten/ssim/web/model/Lesson.java b/src/main/java/net/catten/ssim/web/model/Lesson.java new file mode 100644 index 0000000..cf31ca3 --- /dev/null +++ b/src/main/java/net/catten/ssim/web/model/Lesson.java @@ -0,0 +1,154 @@ +package net.catten.ssim.web.model; + +import javax.persistence.*; + +/** + * Created by catten on 2/24/17. + */ +@Entity +@Cacheable +@Table(name = "lesson",indexes = { + @Index(name = "index_term",columnList = "term"), + @Index(name = "index_attend_class", columnList = "attendClass"), + @Index(name = "index_category", columnList = "category") +}) +public class Lesson { + private Long id; + private String term; + private String unit; + private String name; + private Double period; + private Double credit; + private String teacher; + private String category; + private String attendClass; + private Integer week; + private Integer weekday; + private Integer turn; + private String address; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getTerm() { + return term; + } + + public void setTerm(String term) { + this.term = term; + } + + public Double getPeriod() { + return period; + } + + public void setPeriod(Double period) { + this.period = period; + } + + public Double getCredit() { + return credit; + } + + public void setCredit(Double credit) { + this.credit = credit; + } + + public String getTeacher() { + return teacher; + } + + public void setTeacher(String teacher) { + this.teacher = teacher; + } + + public String getCategory() { + return category; + } + + public void setCategory(String category) { + this.category = category; + } + + public String getAttendClass() { + return attendClass; + } + + public void setAttendClass(String attendClass) { + this.attendClass = attendClass; + } + + public Integer getWeek() { + return week; + } + + public void setWeek(Integer week) { + this.week = week; + } + + public Integer getWeekday() { + return weekday; + } + + public void setWeekday(Integer weekday) { + this.weekday = weekday; + } + + public Integer getTurn() { + return turn; + } + + public void setTurn(Integer turn) { + this.turn = turn; + } + + public String getAddress() { + return address; + } + + public void setAddress(String address) { + this.address = address; + } + + public String getUnit() { + return unit; + } + + public void setUnit(String unit) { + this.unit = unit; + } + + @Override + public String toString() { + return "Lesson{" + + "id=" + id + + ", term='" + term + '\'' + + ", unit='" + unit + '\'' + + ", name='" + name + '\'' + + ", period=" + period + + ", credit=" + credit + + ", teacher='" + teacher + '\'' + + ", category='" + category + '\'' + + ", attendClass='" + attendClass + '\'' + + ", week=" + week + + ", weekday=" + weekday + + ", turn=" + turn + + ", address='" + address + '\'' + + '}'; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } +} diff --git a/src/main/java/net/catten/ssim/web/model/UpdateRequest.java b/src/main/java/net/catten/ssim/web/model/UpdateRequest.java new file mode 100644 index 0000000..97b80fb --- /dev/null +++ b/src/main/java/net/catten/ssim/web/model/UpdateRequest.java @@ -0,0 +1,52 @@ +package net.catten.ssim.web.model; + +import javax.persistence.*; + +/** + * Created by cattenlinger on 2017/3/9. + */ +@Entity +@Table(name = "update_request", indexes = { + @Index(name = "index_ur_senderId",columnList = "senderId"), + @Index(name = "index_ur_request",columnList = "requestFor") +}) +public class UpdateRequest { + private Long id; + private String senderId; + private String senderName; + private String requestFor; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + + public String getSenderId() { + return senderId; + } + + public void setSenderId(String senderId) { + this.senderId = senderId; + } + + public String getSenderName() { + return senderName; + } + + public void setSenderName(String senderName) { + this.senderName = senderName; + } + + public String getRequestFor() { + return requestFor; + } + + public void setRequestFor(String requestFor) { + this.requestFor = requestFor; + } +} diff --git a/src/main/java/net/catten/ssim/web/repositories/LessonDAO.java b/src/main/java/net/catten/ssim/web/repositories/LessonDAO.java new file mode 100644 index 0000000..d181810 --- /dev/null +++ b/src/main/java/net/catten/ssim/web/repositories/LessonDAO.java @@ -0,0 +1,28 @@ +package net.catten.ssim.web.repositories; + +import net.catten.ssim.web.model.Lesson; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.JpaSpecificationExecutor; +import org.springframework.data.jpa.repository.Query; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * Created by catten on 2/24/17. + */ +@Repository +public interface LessonDAO extends JpaRepository, JpaSpecificationExecutor{ + + @Query("select distinct l.term from Lesson l order by l.term desc ") + List getTerms(); + + @Query("select max(l.week) from Lesson l where l.term = ?1") + Integer getLatestWeek(String term); + + @Query("select distinct l.attendClass from Lesson l where l.term = ?1 order by l.attendClass desc") + List getAttendClassesInTerm(String term); + + @Query("select distinct l.category from Lesson l") + List getTypes(); +} diff --git a/src/main/java/net/catten/ssim/web/services/CoursesUpdateServices.java b/src/main/java/net/catten/ssim/web/services/CoursesUpdateServices.java new file mode 100644 index 0000000..03556b5 --- /dev/null +++ b/src/main/java/net/catten/ssim/web/services/CoursesUpdateServices.java @@ -0,0 +1,54 @@ +package net.catten.ssim.web.services; + +import net.catten.ssim.schedule.kingo.jw.caterpillar.CourseScheduleCaterpillar; +import net.catten.ssim.web.repositories.LessonDAO; +import net.catten.ssim.web.services.util.CaptureThread; +import net.catten.ssim.web.services.util.TickModel; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.Map; + +/** + * Created by catten on 2/24/17. + */ +@Service +public class CoursesUpdateServices { + + private CaptureThread captureThread; + private Thread captureThreadHolder; + + private TickModel tickModel; + + @Autowired + public void setCaptureThread(CaptureThread captureThread) { + this.captureThread = captureThread; + } + + @Autowired + public void setTickModel(TickModel tickModel) { + this.tickModel = tickModel; + } + + public TickModel getTaskStatus(){ + return tickModel; + } + + public void setTaskCode(String taskCode){ + captureThread.setTaskCode(taskCode); + } + + public String getStatus(){ + return captureThread.getStatus(); + } + + public void fireCaptureThread(boolean skipCapture){ + captureThreadHolder = new Thread(captureThread); + captureThread.setSkipCapture(skipCapture); + captureThreadHolder.start(); + } + + public void terminateCaptureThread(){ + captureThreadHolder.interrupt(); + } +} diff --git a/src/main/java/net/catten/ssim/web/services/LessonServices.java b/src/main/java/net/catten/ssim/web/services/LessonServices.java new file mode 100644 index 0000000..e65086a --- /dev/null +++ b/src/main/java/net/catten/ssim/web/services/LessonServices.java @@ -0,0 +1,79 @@ +package net.catten.ssim.web.services; + +import net.catten.ssim.web.model.Lesson; +import net.catten.ssim.web.repositories.LessonDAO; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.jpa.domain.Specification; +import org.springframework.stereotype.Service; + +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Predicate; +import javax.persistence.criteria.Root; +import java.util.List; + +/** + * Created by catten on 2/24/17. + */ +@Service +public class LessonServices { + + private LessonDAO lessonDAO; + + @Autowired + public void setLessonDAO(LessonDAO lessonDAO) { + this.lessonDAO = lessonDAO; + } + + public List querySchoolTerms(){ + return lessonDAO.getTerms(); + } + + public List querySchedule(String termName, String attendClass){ + return lessonDAO.findAll((root, cq, cb) -> cb.and( + cb.equal(root.get("term"),termName), + cb.equal(root.get("attendClass"),attendClass)) + ); + } + + public List querySchedule(String termName,String attendClass, Integer week, List ignoreType){ + return lessonDAO.findAll((root, cq, cb) -> { + Predicate predicate = cb.and( + cb.equal(root.get("term"),termName), + cb.equal(root.get("attendClass"),attendClass) + ); + + if(week != null) predicate = cb.and( + predicate, + cb.equal(root.get("week"),week) + ); + + if(ignoreType != null && ignoreType.size() > 0) predicate = cb.and( + predicate, + cb.not(root.get("category").in(ignoreType)) + ); + + return predicate; + }); + } + + public List querySchedule(String termName, String attendClass, Integer week){ + return lessonDAO.findAll((root, criteriaQuery, cb) -> cb.and( + cb.equal(root.get("term"),termName), + cb.equal(root.get("attendClass"),attendClass), + cb.equal(root.get("week"),week) + )); + } + + public Integer queryWeeks(String termName){ + return lessonDAO.getLatestWeek(termName); + } + + public List listClassesInTerm(String termName){ + return lessonDAO.getAttendClassesInTerm(termName); + } + + public List listClassTypes(){ + return lessonDAO.getTypes(); + } +} diff --git a/src/main/java/net/catten/ssim/web/services/SimpleUserServices.java b/src/main/java/net/catten/ssim/web/services/SimpleUserServices.java new file mode 100644 index 0000000..ebed5fa --- /dev/null +++ b/src/main/java/net/catten/ssim/web/services/SimpleUserServices.java @@ -0,0 +1,48 @@ +package net.catten.ssim.web.services; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.*; + +/** + * Created by cattenlinger on 2017/3/9. + */ +@Service +public class SimpleUserServices { + + private Properties userProperties; + private Map tokenPool; + + public SimpleUserServices() { + tokenPool = new HashMap<>(); + } + + @Autowired + public void setUserProperties(Properties userProperties) { + this.userProperties = userProperties; + } + + public String generateToken(String username, String password) { + String passwd = userProperties.getProperty(username); + + if (passwd == null || !password.equals(passwd)) { + return null; + } + + String token = UUID.randomUUID().toString(); + tokenPool.put(token,System.currentTimeMillis() + 36000000); + return token; + } + + public Date tokenExpireDate(String token){ + Long ms = tokenPool.get(token); + if(ms == null) return null; + return new Date(ms); + } + + public boolean isTokenExpired(String token){ + Long tokenPeriod = tokenPool.get(token); + return tokenPeriod == null || tokenPeriod < System.currentTimeMillis(); + } +} diff --git a/src/main/java/net/catten/ssim/web/services/util/CaptureThread.java b/src/main/java/net/catten/ssim/web/services/util/CaptureThread.java new file mode 100644 index 0000000..7ec2a29 --- /dev/null +++ b/src/main/java/net/catten/ssim/web/services/util/CaptureThread.java @@ -0,0 +1,168 @@ +package net.catten.ssim.web.services.util; + +import net.catten.ssim.common.events.TickEventReceiver; +import net.catten.ssim.schedule.factory.CourseFactory; +import net.catten.ssim.schedule.factory.LessonExpander; +import net.catten.ssim.web.repositories.LessonDAO; +import net.catten.ssim.schedule.kingo.jw.caterpillar.CourseScheduleCaterpillar; +//import org.apache.log4j.Logger; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; + +import java.io.File; +import java.io.IOException; + +/** + * Created by catten on 3/4/17. + */ +public class CaptureThread implements Runnable { + + public final static String STATUS_ERROR = "error"; + public final static String STATUS_READY = "ready"; + public final static String STATUS_CAPTURING = "capturing"; + public final static String STATUS_IMPORTING = "importing"; + public final static String STATUS_STOPPED = "stopped"; + + private Logger logger = LoggerFactory.getLogger(this.getClass()); + + private TickEventReceiver receiver; + private CourseScheduleCaterpillar caterpillar; + private CourseFactory factory; + private LessonExpander expander; + + private String bufferPath; + + private String taskCode; + private String status = STATUS_READY; + private boolean skipCapture = false; + + private LessonDAO dao; + + @Override + public void run() { + //Provide a default ticker, output status to log. + if(this.receiver == null){ + logger.warn("No tick receiver, using default receiver!"); + this.receiver = message -> logger.info("Work status : " + message[1] + "/" + message[0] + " - " + message[2]); + } + + File file = new File(bufferPath); + if (file.exists() && file.isDirectory()) { + logger.info("Directory : " + file.getAbsolutePath()); + + try { + if ((taskCode != null && !taskCode.equals("")) || skipCapture) { + status = STATUS_CAPTURING; + if(!skipCapture) { + logger.info("Start capturing from website."); + caterpillar.getTermSubjectToFiles(taskCode, file); + logger.info("Capture finished"); + } + status = STATUS_IMPORTING; + File[] files = file.listFiles(); + if (files != null) { + logger.info("Start importing task."); + int count = 0; + for (File f : files){ + dao.save(expander.expand(factory.parse(f))); + count++; + receiver.tick(count,files.length,f.getName()); + } + logger.info("Importing finished."); + } + status = STATUS_READY; + } else { + logger.error("Task not available."); + status = STATUS_ERROR; + } + } catch (IOException e) { + logger.error("An error occur, task interrupted.",e); + status = STATUS_ERROR; + } catch (InterruptedException e) { + logger.error("Task interrupted.", e); + status = STATUS_STOPPED; + } + } else { + logger.error("Capture could not start, please check if buffer path exist and is a directory!"); + status = STATUS_ERROR; + } + } + + /* + * + * + * Getter setter + * + * + * */ + + public CourseScheduleCaterpillar getCaterpillar() { + return caterpillar; + } + + public void setCaterpillar(CourseScheduleCaterpillar caterpillar) { + this.caterpillar = caterpillar; + } + + public TickEventReceiver getReceiver() { + return receiver; + } + + public void setReceiver(TickEventReceiver receiver) { + this.receiver = receiver; + } + + public LessonDAO getDao() { + return dao; + } + + @Autowired + public void setDao(LessonDAO dao) { + this.dao = dao; + } + + public String getBufferPath() { + return bufferPath; + } + + public void setBufferPath(String bufferPath) { + this.bufferPath = bufferPath; + } + + public String getStatus() { + return status; + } + + public void setStatus(String status) { + this.status = status; + } + + public void setTaskCode(String taskCode) { + this.taskCode = taskCode; + } + + public CourseFactory getFactory() { + return factory; + } + + public void setFactory(CourseFactory factory) { + this.factory = factory; + } + + public LessonExpander getExpander() { + return expander; + } + + public void setExpander(LessonExpander expander) { + this.expander = expander; + } + + public boolean isSkipCapture() { + return skipCapture; + } + + public void setSkipCapture(boolean skipCapture) { + this.skipCapture = skipCapture; + } +} diff --git a/src/main/java/net/catten/ssim/web/services/util/TickModel.java b/src/main/java/net/catten/ssim/web/services/util/TickModel.java new file mode 100644 index 0000000..c3decef --- /dev/null +++ b/src/main/java/net/catten/ssim/web/services/util/TickModel.java @@ -0,0 +1,53 @@ +package net.catten.ssim.web.services.util; + +import net.catten.ssim.common.events.TickEventReceiver; + +/** + * Created by catten on 3/4/17. + */ +public class TickModel implements TickEventReceiver { + private Integer taskTotal = 0; + private Integer taskCurrent = 0; + private String taskStatus; + + @Override + public void tick(Object... message) { + + Integer _total = (Integer) message[0]; + Integer _current = (Integer) message[1]; + + if (!taskTotal.equals(_total)) taskTotal = _total; + setTaskCurrent(_current); + setTaskStatus((String) message[2]); + } + + /* + * + * Getter setter + * + * */ + + public synchronized Integer getTaskTotal() { + return taskTotal; + } + + public synchronized void setTaskTotal(Integer taskTotal) { + this.taskTotal = taskTotal; + } + + public synchronized void setTaskCurrent(Integer taskCurrent) { + this.taskCurrent = taskCurrent; + } + + public synchronized String getTaskStatus() { + return taskStatus; + } + + public synchronized void setTaskStatus(String taskStatus) { + this.taskStatus = taskStatus; + } + + public Integer getTaskCurrent() { + return taskCurrent; + } +} diff --git a/src/main/resources/context-application.xml b/src/main/resources/context-application.xml new file mode 100644 index 0000000..5e69278 --- /dev/null +++ b/src/main/resources/context-application.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/context-caterpillar.xml b/src/main/resources/context-caterpillar.xml new file mode 100644 index 0000000..72b7442 --- /dev/null +++ b/src/main/resources/context-caterpillar.xml @@ -0,0 +1,31 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/context-infrastructure.xml b/src/main/resources/context-infrastructure.xml new file mode 100644 index 0000000..7cf817d --- /dev/null +++ b/src/main/resources/context-infrastructure.xml @@ -0,0 +1,41 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/context-webmvc.xml b/src/main/resources/context-webmvc.xml new file mode 100644 index 0000000..fc5b96f --- /dev/null +++ b/src/main/resources/context-webmvc.xml @@ -0,0 +1,46 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/resources/hibernate.properties b/src/main/resources/hibernate.properties new file mode 100644 index 0000000..f0be561 --- /dev/null +++ b/src/main/resources/hibernate.properties @@ -0,0 +1,7 @@ +hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect +hibernate.hbm2ddl.auto=update +hibernate.cache.use_second_level_cache=true +hibernate.cache.use_query_cache=true +cache.provider_class=org.hibernate.cache.EhCacheProvider +hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory +#hibernate.show_sql=true diff --git a/src/main/resources/log4j.properties b/src/main/resources/log4j.properties new file mode 100644 index 0000000..46fefe1 --- /dev/null +++ b/src/main/resources/log4j.properties @@ -0,0 +1,23 @@ +# Set root logger level to DEBUG and its only appender to A1. +log4j.rootLogger=INFO, stdout, file + +# Stdout is set to be a ConsoleAppender. +log4j.appender.stdout=org.apache.log4j.ConsoleAppender +# Stdout uses PatternLayout. +log4j.appender.stdout.layout=org.apache.log4j.PatternLayout +log4j.appender.stdout.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n + +# File output +log4j.appender.file=org.apache.log4j.FileAppender +# File output setting +log4j.appender.file.File=log/log-info.log +log4j.appender.file.layout=org.apache.log4j.PatternLayout +log4j.appender.file.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss} + +#log4j.logger.captureThread=info, net.catten.ssim.services.util.CaptureThread +#log4j.appender.time=org.apache.log4j.ConsoleAppender +#log4j.appender.time.layout=org.apache.log4j.PatternLayout +#log4j.appender.time.layout.ConversionPattern=[%-5p] %d{yyyy-MM-dd HH:mm:ss} + +# An alternative logging format: +# log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1} - %m%n \ No newline at end of file diff --git a/LNCKingoJWCaterpillar/src/main/resources/strings.properties b/src/main/resources/net/catten/ssim/schedule/kingo/jw/strings.properties similarity index 100% rename from LNCKingoJWCaterpillar/src/main/resources/strings.properties rename to src/main/resources/net/catten/ssim/schedule/kingo/jw/strings.properties diff --git a/src/test/java/configuration/TestConfiguration.java b/src/test/java/configuration/TestConfiguration.java new file mode 100644 index 0000000..16b1f5b --- /dev/null +++ b/src/test/java/configuration/TestConfiguration.java @@ -0,0 +1,17 @@ +package configuration; + +import net.catten.ssim.web.repositories.LessonDAO; +import org.mockito.Mockito; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +/** + * Created by catten on 3/4/17 + */ +@Configuration +public class TestConfiguration { + @Bean + public LessonDAO lessonDAO(){ + return Mockito.mock(LessonDAO.class); + } +} diff --git a/src/test/java/net/catten/ssim/helper/LessonExpanderImplTest.java b/src/test/java/net/catten/ssim/helper/LessonExpanderImplTest.java new file mode 100644 index 0000000..eea7a88 --- /dev/null +++ b/src/test/java/net/catten/ssim/helper/LessonExpanderImplTest.java @@ -0,0 +1,37 @@ +package net.catten.ssim.helper; + +import net.catten.ssim.schedule.factory.LessonExpander; +import net.catten.ssim.schedule.factory.impl.LessonExpanderImpl; +import net.catten.ssim.web.model.Lesson; +import net.catten.ssim.schedule.factory.impl.CourseFactoryImpl; +import net.catten.ssim.schedule.model.KingoRawCourse; +import org.junit.Test; + +import java.io.InputStream; +import java.util.List; + +/** + * Created by catten on 2/24/17. + */ +public class LessonExpanderImplTest { + private String testCaseFiles[] = new String[]{ + "000586", + "012244" + }; + + @Test + public void expand() throws Exception { + for (String testCast : testCaseFiles){ + InputStream inputStream = this.getClass().getResourceAsStream("/kingo/" + testCast + ".html"); + CourseFactoryImpl reader = new CourseFactoryImpl(); + reader.setCharset("GBK"); + KingoRawCourse rawTable = reader.parse(inputStream,Integer.parseInt(testCast)); + LessonExpander expander = new LessonExpanderImpl(); + List lessons = expander.expand(rawTable); + for (Lesson lesson : lessons){ + System.out.println(lesson); + } + } + } + +} \ No newline at end of file diff --git a/src/test/java/net/catten/ssim/schedule/kingo/KingoCourseTableReaderTest.java b/src/test/java/net/catten/ssim/schedule/kingo/KingoCourseTableReaderTest.java new file mode 100644 index 0000000..3f97985 --- /dev/null +++ b/src/test/java/net/catten/ssim/schedule/kingo/KingoCourseTableReaderTest.java @@ -0,0 +1,36 @@ +package net.catten.ssim.schedule.kingo; + +import net.catten.ssim.schedule.factory.impl.CourseFactoryImpl; +import net.catten.ssim.schedule.model.KingoRawCourse; +import net.catten.ssim.schedule.model.KingoRawLesson; +import net.catten.ssim.schedule.model.Timepoint; +import org.junit.Test; + +import java.io.InputStream; + +/** + * Created by catten on 2/23/17. + */ +public class KingoCourseTableReaderTest { + + private String testCaseFiles[] = new String[]{ + "000586", + "012244" + }; + + @Test + public void parse() throws Exception { + for (String testCast : testCaseFiles){ + InputStream inputStream = this.getClass().getResourceAsStream("/kingo/" + testCast + ".html"); + CourseFactoryImpl reader = new CourseFactoryImpl(); + reader.setCharset("GBK"); + KingoRawCourse rawTable = reader.parse(inputStream,Integer.parseInt(testCast)); + for (KingoRawLesson lesson : rawTable.getLessons()){ + for (Timepoint timepoint : lesson.getTimePoint().expand()){ + System.out.println(lesson + " - " + timepoint); + } + } + } + } + +} \ No newline at end of file diff --git a/LNCKingoJWCaterpillar/src/test/java/net/catten/lnc/kingo/jw/caterpillar/KingoJWCaterpillarTest.java b/src/test/java/net/catten/ssim/schedule/kingo/jw/caterpillar/impl/KingoJWCaterpillarTest.java similarity index 76% rename from LNCKingoJWCaterpillar/src/test/java/net/catten/lnc/kingo/jw/caterpillar/KingoJWCaterpillarTest.java rename to src/test/java/net/catten/ssim/schedule/kingo/jw/caterpillar/impl/KingoJWCaterpillarTest.java index 98cd25a..61561ae 100644 --- a/LNCKingoJWCaterpillar/src/test/java/net/catten/lnc/kingo/jw/caterpillar/KingoJWCaterpillarTest.java +++ b/src/test/java/net/catten/ssim/schedule/kingo/jw/caterpillar/impl/KingoJWCaterpillarTest.java @@ -1,13 +1,13 @@ -package net.catten.lnc.kingo.jw.caterpillar; +package net.catten.ssim.schedule.kingo.jw.caterpillar.impl; +import net.catten.ssim.schedule.kingo.jw.caterpillar.impl.KingoJWCaterpillar; +import org.junit.Assert; import org.junit.Test; import java.math.BigInteger; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; -import static org.junit.Assert.*; - /** * Created by catten on 11/18/16. */ @@ -28,7 +28,7 @@ public void md5Test() throws NoSuchAlgorithmException { @Test public void encryptPasswordTest(){ - assertTrue(KingoJWCaterpillar.getEncryptedPassword("14601120234","14601120234").equals("B82AA43F8653B8E4420CA239DC1BA0")); + Assert.assertTrue(KingoJWCaterpillar.getEncryptedPassword("14601120234","14601120234").equals("B82AA43F8653B8E4420CA239DC1BA0")); } } \ No newline at end of file diff --git a/src/test/java/net/catten/ssim/schedule/model/KingoRawTimePointTest.java b/src/test/java/net/catten/ssim/schedule/model/KingoRawTimePointTest.java new file mode 100644 index 0000000..dee52ac --- /dev/null +++ b/src/test/java/net/catten/ssim/schedule/model/KingoRawTimePointTest.java @@ -0,0 +1,17 @@ +package net.catten.ssim.schedule.model; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Created by catten on 3/5/17. + */ +public class KingoRawTimePointTest { + @Test + public void expand() throws Exception { + KingoRawTimePoint timePoint = new KingoRawTimePoint("1-2","一[1-4]节"); + System.out.println(timePoint.expand()); + } + +} \ No newline at end of file diff --git a/src/test/java/net/catten/ssim/web/services/util/CaptureThreadTest.java b/src/test/java/net/catten/ssim/web/services/util/CaptureThreadTest.java new file mode 100644 index 0000000..10dcac2 --- /dev/null +++ b/src/test/java/net/catten/ssim/web/services/util/CaptureThreadTest.java @@ -0,0 +1,47 @@ +package net.catten.ssim.web.services.util; + +import net.catten.ssim.web.repositories.LessonDAO; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.ContextHierarchy; +import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; + +import java.io.File; + +/** + * Created by catten on 3/4/17. + */ +@RunWith(SpringJUnit4ClassRunner.class) +@ContextHierarchy({ + //@ContextConfiguration(classes = TestConfiguration.class), + @ContextConfiguration("classpath:cat-test.xml") +}) + +public class CaptureThreadTest { + + @Autowired + private CaptureThread captureThread; + + @Autowired + private LessonDAO lessonDAO; + + @Test + public void run() throws Exception { + String[] terms = new String[]{"20140","20141","20150","20151","20160","20161"}; + System.out.println("Current path : " + new File("").getAbsolutePath()); + captureThread.setDao(lessonDAO); + +// captureThread.setTaskCode("20161"); +// //captureThread.setSkipCapture(true); +// captureThread.setDao(lessonDAO); +// captureThread.run(); + +// for (String term : terms){ +// captureThread.setTaskCode(term); +// captureThread.run(); +// } + } + +} \ No newline at end of file diff --git a/src/test/resources/cat-test.xml b/src/test/resources/cat-test.xml new file mode 100644 index 0000000..251f330 --- /dev/null +++ b/src/test/resources/cat-test.xml @@ -0,0 +1,66 @@ + + + + + + + + + + + + + + + + + + + + + + + + + org.hibernate.dialect.MySQL5InnoDBDialect + update + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/test/resources/db.properties b/src/test/resources/db.properties new file mode 100644 index 0000000..130d8bc --- /dev/null +++ b/src/test/resources/db.properties @@ -0,0 +1,6 @@ +#jdbc.url=jdbc:h2:file:~/.h2/classSchedule;AUTO_SERVER=TRUE +#jdbc.driver=org.h2.Driver +jdbc.driver=com.mysql.jdbc.Driver +jdbc.url=jdbc:mysql:///lnc_databases +jdbc.username=devel_lncdb +jdbc.password=123456 \ No newline at end of file diff --git a/src/test/resources/kingo/000586.html b/src/test/resources/kingo/000586.html new file mode 100644 index 0000000..17b35d3 --- /dev/null +++ b/src/test/resources/kingo/000586.html @@ -0,0 +1,71 @@ + + + + LessonSel_rpt + + + + + + + + + + + + +
+ + + + + + + +
ѧԺγ̿α
2016-2017ѧһѧ
+
+ + + + +
еλѧй  γ̣[AC000106Am]˶  ѧʱ36.0  ѧ֣2.0
+ + + + + + + + + + + + + + + + + + + + + + + +
ονʦϿ
Ͽ
γ
ʽ
Ͽΰ༶ܴڴص

001
0


15Ϣ̼1 15Ϣ̼2 15缼2 15缼3 15(IT) 15Ӧü 15 + 15ڱ(ʽ) 15Ƶ㻯() 15ҵ1 15Ƶ㻯()6 15ҩѧ6 15ҩѧ7 15ҩѧ8 15ҩѧ1 15ҩ1 + 15ҩ 15ؼ2 15һ廯(Զ)1 15Ƶ1 15Դ1 15԰ռ
1-18
һ[9-10]

+
+ + diff --git a/src/test/resources/kingo/000586.result b/src/test/resources/kingo/000586.result new file mode 100644 index 0000000..d506a82 --- /dev/null +++ b/src/test/resources/kingo/000586.result @@ -0,0 +1 @@ +KingoCourseRawTable(term=2016-2017学年第一学期, unit=教学运行管理中心, course=[AC000106Am]排球运动与排球裁判, totalPeriod=36.0, credit=2.0, teacher=001, classNum=null, memberCount=0, category=公共课/任选课, examineType=考查, attendClass=15电子信息工程技术1班 15电子信息工程技术2班 15计算机网络技术2班 15计算机网络技术3班 15软件技术(国际IT)班 15物联网应用技术班 15商务日语班 15金融保险(国际金融)班 15会计电算化(涉外会计)班 15工商企业管理1班 15会计电算化(电算)6班 15药学6班 15药学7班 15药学8班 15药学1班 15中药1班 15生物制药技术班 15数控技术2班 15机电一体化(自动化)1班 15酒店管理1班 15人力资源管理1班 15园艺技术班, weeks=1-18, timePoint=一[9-10节], address=排球1号场) \ No newline at end of file diff --git a/ClassScheduleAdapter/src/test/resources/012244.html b/src/test/resources/kingo/012244.html similarity index 100% rename from ClassScheduleAdapter/src/test/resources/012244.html rename to src/test/resources/kingo/012244.html diff --git a/src/test/resources/kingo/012244.result b/src/test/resources/kingo/012244.result new file mode 100644 index 0000000..5b29c64 --- /dev/null +++ b/src/test/resources/kingo/012244.result @@ -0,0 +1,156 @@ +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=赖燕璇, classNum=007, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16电子商务1班, weeks=5-18, timePoint=二[1-2节]双, address=计算机七室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=三[1-2节], address=计算机九室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=赖燕璇, classNum=008, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16电子商务2班, weeks=5-18, timePoint=二[3-4节]单, address=计算机七室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=三[3-4节], address=计算机七室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=赖燕璇, classNum=009, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16电子商务3班, weeks=5-18, timePoint=二[1-2节]单, address=计算机七室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=三[5-6节], address=计算机六室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=赖燕璇, classNum=010, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16电子商务4班, weeks=5-18, timePoint=二[3-4节]双, address=计算机七室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=三[7-8节], address=计算机九室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=陈师哲, classNum=043, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16企业经营与管理1班, weeks=8-17, timePoint=二[5-6节], address=计算机二室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=8-18, timePoint=一[5-6节], address=计算机二室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=陈师哲, classNum=044, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16企业经营与管理2班, weeks=8-17, timePoint=二[1-2节], address=计算机一室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=8-18, timePoint=一[7-8节], address=计算机一室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=任颖燕, classNum=027, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16国际商务2班, weeks=8-17, timePoint=三[5-6节], address=计算机一室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=8-18, timePoint=四[1-2节], address=计算机一室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=任颖燕, classNum=028, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16物流管理1班, weeks=8-17, timePoint=四[7-8节], address=计算机一室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=8-18, timePoint=四[3-4节], address=会计岗位模拟实训室(崇礼楼203)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=任颖燕, classNum=029, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16物流管理2班, weeks=8-17, timePoint=四[5-6节], address=计算机五室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=8-18, timePoint=三[7-8节], address=计算机一室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=任颖燕, classNum=069, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16会计1班, weeks=8-17, timePoint=五[5-6节], address=计算机五室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=8-18, timePoint=二[3-4节], address=计算机四室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=姜霞, classNum=071, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16通信技术(工程设计管理)2班, weeks=5-8, timePoint=一[5-6节]单, address=EDA实训室(809)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-8,18, timePoint=三[3-4节], address=EDA实训室(809)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=9-17, timePoint=三[3-4节], address=计算机应用技术1室(808)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=9-18, timePoint=一[5-6节]单, address=3G-程控实验室(201)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=姜霞, classNum=072, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16通信技术(工程设计管理)1班, weeks=5-8, timePoint=一[5-6节]双, address=EDA实训室(809)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-8, timePoint=二[3-4节], address=EDA实训室(809)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=9-18, timePoint=一[5-6节]双, address=3G-程控实验室(201)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=9-18, timePoint=三[9-10节], address=3G-程控实验室(201)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=阎旭东, classNum=033, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16工业设计(珠宝设计)班, weeks=5-18, timePoint=一[3-4节], address=计算机八室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=四[3-4节]单, address=计算机五室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=罗涓涓, classNum=049, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16动漫制作技术4班, weeks=10, timePoint=一[9-10节], address=机房1(科B6楼)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=11-16, timePoint=四[3-4节], address=数字内容工厂实训室(科A603)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=12-18, timePoint=一[5-6节], address=机房1(科B6楼)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=12-18, timePoint=二[7-8节], address=机房3(科B6楼)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=余生, classNum=030, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16中小企业创业管理5班, weeks=5-18, timePoint=一[7-8节]单, address=EDA实训室(809)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=三[3-4节], address=计算机二室(609)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=左慧平, classNum=024, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16企业经营与管理3班, weeks=8-17, timePoint=二[5-6节], address=计算机八室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=8-18, timePoint=三[1-2节], address=计算机五室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=左慧平, classNum=025, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16企业经营与管理4班, weeks=12-18, timePoint=一[5-6节], address=计算机七室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=8-10, timePoint=一[1-2节], address=计算机七室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=8-18, timePoint=三[3-4节], address=计算机五室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=左慧平, classNum=026, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16国际商务1班, weeks=8-17, timePoint=一[7-8节], address=计算机七室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=8-18, timePoint=二[7-8节], address=计算机一室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=李好逑, classNum=073, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16工业设计(产品创意设计)班, weeks=5-18, timePoint=四[1-2节], address=计算机四室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=四[3-4节]单, address=计算机一室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=尹振江, classNum=016, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16动漫制作技术6班, weeks=5-18, timePoint=一[9-10节], address=电子商务室(807)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=二[7-8节]单, address=计算机一室(408)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=黄文浩, classNum=032, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16动漫制作技术2班, weeks=5-18, timePoint=三[1-2节], address=旅游管理(608)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=五[3-4节]双, address=旅游管理(608)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=吴丽娟, classNum=050, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16动漫制作技术3班, weeks=10-15, timePoint=四[1-2节], address=创新工坊实训室(科A601)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=10-16, timePoint=四[3-4节], address=创新工坊实训室(科A601)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=6-9, timePoint=四[1-2节], address=机房1(科B6楼)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=6-9, timePoint=四[3-4节], address=机房1(科B6楼)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=罗人东, classNum=051, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16计算机网络技术1班, weeks=5-18, timePoint=三[1-2节]双, address=计算机四室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=四[5-6节], address=计算机七室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=罗人东, classNum=052, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16计算机网络技术2班, weeks=5-18, timePoint=二[9-10节], address=计算机九室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=三[3-4节]单, address=计算机二室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=罗人东, classNum=053, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16计算机网络技术3班, weeks=5-18, timePoint=二[11-12节]单, address=计算机七室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=三[7-8节], address=计算机七室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=罗人东, classNum=054, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16计算机网络技术4班, weeks=5-18, timePoint=二[11-12节]双, address=计算机七室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=四[3-4节], address=计算机二室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=罗人东, classNum=055, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16软件技术(移动互联网)1班, weeks=5-18, timePoint=二[7-8节], address=计算机四室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=三[1-2节]单, address=计算机四室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=罗人东, classNum=056, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16软件技术(移动互联网)2班, weeks=5-18, timePoint=三[5-6节]双, address=计算机二室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=四[1-2节], address=计算机二室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=吴小红, classNum=058, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16通信技术(移动通信)1班, weeks=5-18, timePoint=一[1-2节], address=计算机二室(609)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=四[3-4节]单, address=物流模拟1室(806)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=吴小红, classNum=059, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16通信技术(移动通信)2班, weeks=5-18, timePoint=一[7-8节]单, address=旅游管理(608)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=四[1-2节], address=EDA实训室(809)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=吴小红, classNum=060, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16通信技术(移动通信)3班, weeks=5-18, timePoint=一[3-4节], address=旅游管理(608)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=一[7-8节]双, address=旅游管理(608)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=吴小红, classNum=061, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16中小企业创业管理1班, weeks=5-18, timePoint=一[5-6节], address=旅游管理(608)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=三[5-6节]单, address=旅游管理(608)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=蒋明豪, classNum=034, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16数控技术班, weeks=5-18, timePoint=二[9-10节]单, address=计算机四室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=四[5-6节], address=计算机四室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=徐文罕, classNum=062, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16人力资源管理1班, weeks=5-18, timePoint=一[7-8节], address=计算机二室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=三[5-6节]单, address=计算机五室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=徐文罕, classNum=063, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16人力资源管理2班, weeks=5-18, timePoint=二[1-2节], address=计算机二室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=三[5-6节]双, address=计算机五室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=徐文罕, classNum=064, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16人力资源管理3班, weeks=5-18, timePoint=二[3-4节], address=计算机五室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=三[7-8节]单, address=计算机二室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=徐文罕, classNum=065, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16涉外会计1班, weeks=5-18, timePoint=二[7-8节], address=计算机二室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=三[7-8节]双, address=计算机二室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=徐文罕, classNum=066, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16涉外会计2班, weeks=5-18, timePoint=二[5-6节]单, address=计算机四室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=四[5-6节], address=计算机二室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=徐文罕, classNum=070, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16软件技术(国际IT)班, weeks=5-18, timePoint=二[5-6节]双, address=计算机四室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=四[3-4节], address=计算机四室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=李德平, classNum=035, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16软件技术(移动互联网)3班, weeks=5-18, timePoint=二[11-12节], address=计算机九室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-6,7,9,11,13,15, timePoint=四[11-12节], address=计算机九室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=崔强, classNum=015, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16动漫制作技术5班, weeks=5-18, timePoint=四[1-2节], address=旅游管理(608)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=四[5-6节]双, address=计算机一室(408)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=崔强, classNum=031, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16动漫制作技术1班, weeks=5-18, timePoint=四[3-4节], address=旅游管理(608)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=四[5-6节]单, address=计算机应用技术1室(808)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=戴建新, classNum=022, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16中小企业创业管理3班, weeks=5-18, timePoint=五[1-2节], address=物流模拟1室(806)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=五[5-6节]单, address=物流模拟1室(806)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=戴建新, classNum=023, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16中小企业创业管理4班, weeks=5-18, timePoint=五[3-4节], address=物流模拟1室(806)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=五[5-6节]双, address=物流模拟1室(806)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=徐健, classNum=017, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16级成教电子商务1班, weeks=5-18, timePoint=一[9-10节]双, address=EDA实训室(809)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=三[1-2节], address=计算机一室(408)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=徐健, classNum=018, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16级成教电子商务2班, weeks=5-18, timePoint=三[3-4节], address=计算机一室(408)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=三[11-12节]双, address=EDA实训室(809)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=徐健, classNum=019, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16级成教软件技术1班, weeks=5-18, timePoint=一[9-10节]单, address=EDA实训室(809)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=三[9-10节], address=EDA实训室(809)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=尹菡, classNum=020, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16级成教软件技术2班, weeks=11-17, timePoint=一[7-8节], address=市场营销模拟(901)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-10,18, timePoint=三[5-6节], address=计算机一室(408)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=四[5-6节]单, address=计算机二室(609)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=尹菡, classNum=021, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16中小企业创业管理2班, weeks=10-18, timePoint=四[7-8节], address=ERP实验室(801)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=四[5-6节]双, address=计算机二室(609)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-9, timePoint=三[7-8节], address=计算机一室(408)) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=丁知平, classNum=011, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16电子信息工程技术2班, weeks=5-18, timePoint=二[9-11节], address=计算机六室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=郭峰, classNum=002, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16软件技术(软件开发)3班, weeks=5-18, timePoint=二[5-6节]双, address=计算机六室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=三[1-2节], address=计算机七室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=郭峰, classNum=003, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16软件技术(软件开发)4班, weeks=5-18, timePoint=二[7-8节]双, address=计算机七室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=三[3-4节], address=计算机九室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=郭峰, classNum=004, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16软件技术(软件开发)5班, weeks=5, timePoint=四[9-10节], address=计算机八室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=二[5-6节]单, address=计算机七室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=6-18, timePoint=四[1-2节], address=计算机七室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=郭峰, classNum=005, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16软件技术(软件开发)6班, weeks=5, timePoint=四[11-12节], address=计算机八室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=二[7-8节]单, address=计算机七室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=6-18, timePoint=四[3-4节], address=计算机七室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=王刚, classNum=001, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16软件技术(软件开发)1班, weeks=5-18, timePoint=一[1-2节], address=计算机八室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=四[5-6节]单, address=计算机六室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=王刚, classNum=006, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16软件技术(软件开发)2班, weeks=5-18, timePoint=一[3-4节], address=计算机七室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=四[5-6节]双, address=计算机六室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=胡晓凤, classNum=012, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16电子商务5班, weeks=5-18, timePoint=二[7-8节], address=计算机八室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=二[11-12节]单, address=计算机八室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=胡晓凤, classNum=013, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16物联网应用技术1班, weeks=5-18, timePoint=二[9-10节], address=计算机七室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=三[3-4节]单, address=计算机一室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=胡晓凤, classNum=014, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16物联网应用技术2班, weeks=5-18, timePoint=二[11-12节]双, address=计算机八室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=三[1-2节], address=计算机一室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=李飞龙, classNum=036, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16会计2班, weeks=5-18, timePoint=二[9-10节]单, address=计算机八室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=三[1-2节], address=计算机二室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=李飞龙, classNum=037, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16会计3班, weeks=5-18, timePoint=二[9-10节]双, address=计算机四室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=三[3-4节], address=计算机四室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=李飞龙, classNum=038, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16会计4班, weeks=5-18, timePoint=二[7-8节], address=计算机九室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=三[5-6节]双, address=计算机七室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=陈桂君, classNum=039, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16会计5班, weeks=5-18, timePoint=四[9-10节]双, address=计算机九室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=五[1-2节], address=计算机九室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=陈桂君, classNum=040, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16会计6班, weeks=5-18, timePoint=四[9-10节]单, address=计算机九室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=五[3-4节], address=计算机八室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=陈桂君, classNum=041, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16会计7班, weeks=5-18, timePoint=四[7-8节], address=计算机八室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=五[5-6节]双, address=计算机八室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=谭凤媚, classNum=046, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16机电一体化技术1班, weeks=5-18, timePoint=四[9-10节]单, address=计算机六室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=五[1-2节], address=计算机六室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=谭凤媚, classNum=047, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16机电一体化技术2班, weeks=5-18, timePoint=四[7-8节], address=计算机九室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=五[5-6节]单, address=计算机六室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=谭凤媚, classNum=048, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16机电一体化技术3班, weeks=5-18, timePoint=四[9-10节]双, address=计算机八室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=5-18, timePoint=五[3-4节], address=计算机六室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=杨杏芬, classNum=068, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16会计(中外合作)班 16工业机器人技术班, weeks=6-15, timePoint=五[5-6节], address=计算机一室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=6-16, timePoint=五[3-4节], address=计算机一室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=刘翠翠, classNum=075, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16医疗器械维护与管理班 16模具设计与制造班, weeks=6-15, timePoint=五[5-6节], address=计算机四室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=6-16, timePoint=五[3-4节], address=计算机四室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=周少波, classNum=045, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16电子信息工程技术1班, weeks=8-17, timePoint=五[5-6节], address=计算机九室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=8-18, timePoint=五[3-4节], address=计算机九室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=周少波, classNum=067, memberCount=0, category=公共课/必修课, examineType=考试, attendClass=16国际商务(中外合作)班, weeks=8-17, timePoint=五[7-8节], address=计算机一室) +KingoCourseRawTable(term=2016-2017学年第一学期, unit=电子信息工程学院, course=[011953]计算机应用, totalPeriod=43.0, credit=2.5, teacher=, classNum=, memberCount=, category=, examineType=, attendClass=, weeks=8-18, timePoint=五[1-2节], address=计算机一室) \ No newline at end of file diff --git a/src/test/resources/log4j.properties b/src/test/resources/log4j.properties new file mode 100644 index 0000000..8de3174 --- /dev/null +++ b/src/test/resources/log4j.properties @@ -0,0 +1,17 @@ +# Set root logger level to DEBUG and its only appender to A1. +log4j.rootLogger=INFO, A1 + +# A1 is set to be a ConsoleAppender. +log4j.appender.A1=org.apache.log4j.ConsoleAppender + +# A1 uses PatternLayout. +log4j.appender.A1.layout=org.apache.log4j.PatternLayout +log4j.appender.A1.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n + +log4j.logger.captureThread=debug, net.catten.ssim.services.util.CaptureThread +log4j.appender.time=org.apache.log4j.ConsoleAppender +log4j.appender.time.layout=org.apache.log4j.PatternLayout +log4j.appender.time.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n + +# An alternative logging format: +# log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss} %-5p %c{1} - %m%n \ No newline at end of file diff --git a/web/WEB-INF/db.properties b/web/WEB-INF/db.properties new file mode 100644 index 0000000..130d8bc --- /dev/null +++ b/web/WEB-INF/db.properties @@ -0,0 +1,6 @@ +#jdbc.url=jdbc:h2:file:~/.h2/classSchedule;AUTO_SERVER=TRUE +#jdbc.driver=org.h2.Driver +jdbc.driver=com.mysql.jdbc.Driver +jdbc.url=jdbc:mysql:///lnc_databases +jdbc.username=devel_lncdb +jdbc.password=123456 \ No newline at end of file diff --git a/web/WEB-INF/login.properties.sample b/web/WEB-INF/login.properties.sample new file mode 100644 index 0000000..570a459 --- /dev/null +++ b/web/WEB-INF/login.properties.sample @@ -0,0 +1,7 @@ +username=your username +password=your password +charset=GBK +delay=500 +tableFormat=2 +role=STU +userAgent=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/602.4.8 (KHTML, like Gecko) Version/10.0.3 Safari/602.4.8 \ No newline at end of file diff --git a/web/WEB-INF/view/index.ftl b/web/WEB-INF/view/index.ftl new file mode 100644 index 0000000..9f4a558 --- /dev/null +++ b/web/WEB-INF/view/index.ftl @@ -0,0 +1,26 @@ +<#import "temp/main.ftl" as temp> +<@temp.body "简单课表查询 - 岭南软件园协会"> +
+ <#if (terms?? && terms?size > 0) > +
+
+

请选择学期

+
+
+ <#list terms as term> + ${term} + +
+
+ <#else> +
+
+ +

我们还没往数据库内添加数据,请稍后再来

+
+
+ +
+ \ No newline at end of file diff --git a/web/WEB-INF/view/nodata.ftl b/web/WEB-INF/view/nodata.ftl new file mode 100644 index 0000000..5adbd97 --- /dev/null +++ b/web/WEB-INF/view/nodata.ftl @@ -0,0 +1,15 @@ +<#import "temp/main.ftl" as temp> +<@temp.body title="${term}"> +
+
+
+ + +
+
+
+ \ No newline at end of file diff --git a/web/WEB-INF/view/schedule.ftl b/web/WEB-INF/view/schedule.ftl new file mode 100644 index 0000000..5f9146b --- /dev/null +++ b/web/WEB-INF/view/schedule.ftl @@ -0,0 +1,49 @@ +<#import "temp/main.ftl" as temp> +<@temp.body title="${className} 在第 ${week} 周的课程 - ${term}"> +
+
+
+

+ ${term} +
${className}在第${week}周的课程 +

+
+ 返回 +
+
+
+ + + <#list ["#","日","一","二","三","四","五","六"] as days> + + + + <#list 1..8 as turns> + + + <#list 0..6 as day> + + + + + + <#assign weekdaysZh =["日","一","二","三","四","五","六"] /> + +
+
+ \ No newline at end of file diff --git a/web/WEB-INF/view/temp/main.ftl b/web/WEB-INF/view/temp/main.ftl new file mode 100644 index 0000000..5202840 --- /dev/null +++ b/web/WEB-INF/view/temp/main.ftl @@ -0,0 +1,50 @@ +<#-- + Default body template +--> +<#macro body title> + + + ${title} + + <@_import_css> + + +
+ +
+ <#nested > +
+
+
+ 本站开放源代码 : Github
+ 使用请遵循 GPLv2 协议 +
+
+<@_import_js> + + + + +<#-- + CSS import +--> + +<#macro _import_css> + + + + + + +<#-- + JS import +--> + +<#macro _import_js> + + + + + \ No newline at end of file diff --git a/web/WEB-INF/view/term.ftl b/web/WEB-INF/view/term.ftl new file mode 100644 index 0000000..e4a0aba --- /dev/null +++ b/web/WEB-INF/view/term.ftl @@ -0,0 +1,44 @@ +<#import "temp/main.ftl" as temp> +<@temp.body title="${term}"> +
+
+
+

查询 ${term} 的课程

+
+
+
+ +
+ + +
+
+ +
+ +
+
+
+
+ + +
+
+
+ + 返回首页 +
+
+
+
+
+
+ \ No newline at end of file diff --git a/web/WEB-INF/web.xml b/web/WEB-INF/web.xml new file mode 100644 index 0000000..8a0683d --- /dev/null +++ b/web/WEB-INF/web.xml @@ -0,0 +1,61 @@ + + + + + contextConfigLocation + classpath:context-application.xml + + + + + + openEntityManagerInViewFilter + org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter + + + + utf8EncodingFilter + org.springframework.web.filter.CharacterEncodingFilter + + encoding + UTF-8 + + + + + utf8EncodingFilter + /* + + + + openEntityManagerInViewFilter + /* + + + + + + org.springframework.web.context.ContextLoaderListener + + + + + + springMvc + org.springframework.web.servlet.DispatcherServlet + + contextConfigLocation + classpath:context-webmvc.xml + + 1 + + + + springMvc + /* + + + \ No newline at end of file diff --git a/web/apple-touch-icon-precomposed.png b/web/apple-touch-icon-precomposed.png new file mode 100644 index 0000000..f5179ab Binary files /dev/null and b/web/apple-touch-icon-precomposed.png differ diff --git a/web/apple-touch-icon.png b/web/apple-touch-icon.png new file mode 100644 index 0000000..f5179ab Binary files /dev/null and b/web/apple-touch-icon.png differ diff --git a/web/css/animate.css b/web/css/animate.css new file mode 100644 index 0000000..7148b57 --- /dev/null +++ b/web/css/animate.css @@ -0,0 +1,3340 @@ +@charset "UTF-8"; + +/*! + * animate.css -http://daneden.me/animate + * Version - 3.5.1 + * Licensed under the MIT license - http://opensource.org/licenses/MIT + * + * Copyright (c) 2016 Daniel Eden + */ + +.animated { + -webkit-animation-duration: 1s; + animation-duration: 1s; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} + +.animated.infinite { + -webkit-animation-iteration-count: infinite; + animation-iteration-count: infinite; +} + +.animated.hinge { + -webkit-animation-duration: 2s; + animation-duration: 2s; +} + +.animated.flipOutX, +.animated.flipOutY, +.animated.bounceIn, +.animated.bounceOut { + -webkit-animation-duration: .75s; + animation-duration: .75s; +} + +@-webkit-keyframes bounce { + from, 20%, 53%, 80%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + -webkit-transform: translate3d(0,0,0); + transform: translate3d(0,0,0); + } + + 40%, 43% { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + -webkit-transform: translate3d(0, -30px, 0); + transform: translate3d(0, -30px, 0); + } + + 70% { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + -webkit-transform: translate3d(0, -15px, 0); + transform: translate3d(0, -15px, 0); + } + + 90% { + -webkit-transform: translate3d(0,-4px,0); + transform: translate3d(0,-4px,0); + } +} + +@keyframes bounce { + from, 20%, 53%, 80%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + -webkit-transform: translate3d(0,0,0); + transform: translate3d(0,0,0); + } + + 40%, 43% { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + -webkit-transform: translate3d(0, -30px, 0); + transform: translate3d(0, -30px, 0); + } + + 70% { + -webkit-animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + animation-timing-function: cubic-bezier(0.755, 0.050, 0.855, 0.060); + -webkit-transform: translate3d(0, -15px, 0); + transform: translate3d(0, -15px, 0); + } + + 90% { + -webkit-transform: translate3d(0,-4px,0); + transform: translate3d(0,-4px,0); + } +} + +.bounce { + -webkit-animation-name: bounce; + animation-name: bounce; + -webkit-transform-origin: center bottom; + transform-origin: center bottom; +} + +@-webkit-keyframes flash { + from, 50%, to { + opacity: 1; + } + + 25%, 75% { + opacity: 0; + } +} + +@keyframes flash { + from, 50%, to { + opacity: 1; + } + + 25%, 75% { + opacity: 0; + } +} + +.flash { + -webkit-animation-name: flash; + animation-name: flash; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes pulse { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 50% { + -webkit-transform: scale3d(1.05, 1.05, 1.05); + transform: scale3d(1.05, 1.05, 1.05); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +@keyframes pulse { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 50% { + -webkit-transform: scale3d(1.05, 1.05, 1.05); + transform: scale3d(1.05, 1.05, 1.05); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +.pulse { + -webkit-animation-name: pulse; + animation-name: pulse; +} + +@-webkit-keyframes rubberBand { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 30% { + -webkit-transform: scale3d(1.25, 0.75, 1); + transform: scale3d(1.25, 0.75, 1); + } + + 40% { + -webkit-transform: scale3d(0.75, 1.25, 1); + transform: scale3d(0.75, 1.25, 1); + } + + 50% { + -webkit-transform: scale3d(1.15, 0.85, 1); + transform: scale3d(1.15, 0.85, 1); + } + + 65% { + -webkit-transform: scale3d(.95, 1.05, 1); + transform: scale3d(.95, 1.05, 1); + } + + 75% { + -webkit-transform: scale3d(1.05, .95, 1); + transform: scale3d(1.05, .95, 1); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +@keyframes rubberBand { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 30% { + -webkit-transform: scale3d(1.25, 0.75, 1); + transform: scale3d(1.25, 0.75, 1); + } + + 40% { + -webkit-transform: scale3d(0.75, 1.25, 1); + transform: scale3d(0.75, 1.25, 1); + } + + 50% { + -webkit-transform: scale3d(1.15, 0.85, 1); + transform: scale3d(1.15, 0.85, 1); + } + + 65% { + -webkit-transform: scale3d(.95, 1.05, 1); + transform: scale3d(.95, 1.05, 1); + } + + 75% { + -webkit-transform: scale3d(1.05, .95, 1); + transform: scale3d(1.05, .95, 1); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +.rubberBand { + -webkit-animation-name: rubberBand; + animation-name: rubberBand; +} + +@-webkit-keyframes shake { + from, to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 10%, 30%, 50%, 70%, 90% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + } + + 20%, 40%, 60%, 80% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); + } +} + +@keyframes shake { + from, to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + 10%, 30%, 50%, 70%, 90% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + } + + 20%, 40%, 60%, 80% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); + } +} + +.shake { + -webkit-animation-name: shake; + animation-name: shake; +} + +@-webkit-keyframes headShake { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 6.5% { + -webkit-transform: translateX(-6px) rotateY(-9deg); + transform: translateX(-6px) rotateY(-9deg); + } + + 18.5% { + -webkit-transform: translateX(5px) rotateY(7deg); + transform: translateX(5px) rotateY(7deg); + } + + 31.5% { + -webkit-transform: translateX(-3px) rotateY(-5deg); + transform: translateX(-3px) rotateY(-5deg); + } + + 43.5% { + -webkit-transform: translateX(2px) rotateY(3deg); + transform: translateX(2px) rotateY(3deg); + } + + 50% { + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +@keyframes headShake { + 0% { + -webkit-transform: translateX(0); + transform: translateX(0); + } + + 6.5% { + -webkit-transform: translateX(-6px) rotateY(-9deg); + transform: translateX(-6px) rotateY(-9deg); + } + + 18.5% { + -webkit-transform: translateX(5px) rotateY(7deg); + transform: translateX(5px) rotateY(7deg); + } + + 31.5% { + -webkit-transform: translateX(-3px) rotateY(-5deg); + transform: translateX(-3px) rotateY(-5deg); + } + + 43.5% { + -webkit-transform: translateX(2px) rotateY(3deg); + transform: translateX(2px) rotateY(3deg); + } + + 50% { + -webkit-transform: translateX(0); + transform: translateX(0); + } +} + +.headShake { + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + -webkit-animation-name: headShake; + animation-name: headShake; +} + +@-webkit-keyframes swing { + 20% { + -webkit-transform: rotate3d(0, 0, 1, 15deg); + transform: rotate3d(0, 0, 1, 15deg); + } + + 40% { + -webkit-transform: rotate3d(0, 0, 1, -10deg); + transform: rotate3d(0, 0, 1, -10deg); + } + + 60% { + -webkit-transform: rotate3d(0, 0, 1, 5deg); + transform: rotate3d(0, 0, 1, 5deg); + } + + 80% { + -webkit-transform: rotate3d(0, 0, 1, -5deg); + transform: rotate3d(0, 0, 1, -5deg); + } + + to { + -webkit-transform: rotate3d(0, 0, 1, 0deg); + transform: rotate3d(0, 0, 1, 0deg); + } +} + +@keyframes swing { + 20% { + -webkit-transform: rotate3d(0, 0, 1, 15deg); + transform: rotate3d(0, 0, 1, 15deg); + } + + 40% { + -webkit-transform: rotate3d(0, 0, 1, -10deg); + transform: rotate3d(0, 0, 1, -10deg); + } + + 60% { + -webkit-transform: rotate3d(0, 0, 1, 5deg); + transform: rotate3d(0, 0, 1, 5deg); + } + + 80% { + -webkit-transform: rotate3d(0, 0, 1, -5deg); + transform: rotate3d(0, 0, 1, -5deg); + } + + to { + -webkit-transform: rotate3d(0, 0, 1, 0deg); + transform: rotate3d(0, 0, 1, 0deg); + } +} + +.swing { + -webkit-transform-origin: top center; + transform-origin: top center; + -webkit-animation-name: swing; + animation-name: swing; +} + +@-webkit-keyframes tada { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 10%, 20% { + -webkit-transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg); + transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg); + } + + 30%, 50%, 70%, 90% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + } + + 40%, 60%, 80% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +@keyframes tada { + from { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } + + 10%, 20% { + -webkit-transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg); + transform: scale3d(.9, .9, .9) rotate3d(0, 0, 1, -3deg); + } + + 30%, 50%, 70%, 90% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, 3deg); + } + + 40%, 60%, 80% { + -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + transform: scale3d(1.1, 1.1, 1.1) rotate3d(0, 0, 1, -3deg); + } + + to { + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +.tada { + -webkit-animation-name: tada; + animation-name: tada; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes wobble { + from { + -webkit-transform: none; + transform: none; + } + + 15% { + -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + } + + 30% { + -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + } + + 45% { + -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + } + + 60% { + -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + } + + 75% { + -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + } + + to { + -webkit-transform: none; + transform: none; + } +} + +@keyframes wobble { + from { + -webkit-transform: none; + transform: none; + } + + 15% { + -webkit-transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + transform: translate3d(-25%, 0, 0) rotate3d(0, 0, 1, -5deg); + } + + 30% { + -webkit-transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + transform: translate3d(20%, 0, 0) rotate3d(0, 0, 1, 3deg); + } + + 45% { + -webkit-transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + transform: translate3d(-15%, 0, 0) rotate3d(0, 0, 1, -3deg); + } + + 60% { + -webkit-transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + transform: translate3d(10%, 0, 0) rotate3d(0, 0, 1, 2deg); + } + + 75% { + -webkit-transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + transform: translate3d(-5%, 0, 0) rotate3d(0, 0, 1, -1deg); + } + + to { + -webkit-transform: none; + transform: none; + } +} + +.wobble { + -webkit-animation-name: wobble; + animation-name: wobble; +} + +@-webkit-keyframes jello { + from, 11.1%, to { + -webkit-transform: none; + transform: none; + } + + 22.2% { + -webkit-transform: skewX(-12.5deg) skewY(-12.5deg); + transform: skewX(-12.5deg) skewY(-12.5deg); + } + + 33.3% { + -webkit-transform: skewX(6.25deg) skewY(6.25deg); + transform: skewX(6.25deg) skewY(6.25deg); + } + + 44.4% { + -webkit-transform: skewX(-3.125deg) skewY(-3.125deg); + transform: skewX(-3.125deg) skewY(-3.125deg); + } + + 55.5% { + -webkit-transform: skewX(1.5625deg) skewY(1.5625deg); + transform: skewX(1.5625deg) skewY(1.5625deg); + } + + 66.6% { + -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg); + transform: skewX(-0.78125deg) skewY(-0.78125deg); + } + + 77.7% { + -webkit-transform: skewX(0.390625deg) skewY(0.390625deg); + transform: skewX(0.390625deg) skewY(0.390625deg); + } + + 88.8% { + -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + } +} + +@keyframes jello { + from, 11.1%, to { + -webkit-transform: none; + transform: none; + } + + 22.2% { + -webkit-transform: skewX(-12.5deg) skewY(-12.5deg); + transform: skewX(-12.5deg) skewY(-12.5deg); + } + + 33.3% { + -webkit-transform: skewX(6.25deg) skewY(6.25deg); + transform: skewX(6.25deg) skewY(6.25deg); + } + + 44.4% { + -webkit-transform: skewX(-3.125deg) skewY(-3.125deg); + transform: skewX(-3.125deg) skewY(-3.125deg); + } + + 55.5% { + -webkit-transform: skewX(1.5625deg) skewY(1.5625deg); + transform: skewX(1.5625deg) skewY(1.5625deg); + } + + 66.6% { + -webkit-transform: skewX(-0.78125deg) skewY(-0.78125deg); + transform: skewX(-0.78125deg) skewY(-0.78125deg); + } + + 77.7% { + -webkit-transform: skewX(0.390625deg) skewY(0.390625deg); + transform: skewX(0.390625deg) skewY(0.390625deg); + } + + 88.8% { + -webkit-transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + transform: skewX(-0.1953125deg) skewY(-0.1953125deg); + } +} + +.jello { + -webkit-animation-name: jello; + animation-name: jello; + -webkit-transform-origin: center; + transform-origin: center; +} + +@-webkit-keyframes bounceIn { + from, 20%, 40%, 60%, 80%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } + + 20% { + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + 40% { + -webkit-transform: scale3d(.9, .9, .9); + transform: scale3d(.9, .9, .9); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(1.03, 1.03, 1.03); + transform: scale3d(1.03, 1.03, 1.03); + } + + 80% { + -webkit-transform: scale3d(.97, .97, .97); + transform: scale3d(.97, .97, .97); + } + + to { + opacity: 1; + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +@keyframes bounceIn { + from, 20%, 40%, 60%, 80%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } + + 20% { + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + 40% { + -webkit-transform: scale3d(.9, .9, .9); + transform: scale3d(.9, .9, .9); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(1.03, 1.03, 1.03); + transform: scale3d(1.03, 1.03, 1.03); + } + + 80% { + -webkit-transform: scale3d(.97, .97, .97); + transform: scale3d(.97, .97, .97); + } + + to { + opacity: 1; + -webkit-transform: scale3d(1, 1, 1); + transform: scale3d(1, 1, 1); + } +} + +.bounceIn { + -webkit-animation-name: bounceIn; + animation-name: bounceIn; +} + +@-webkit-keyframes bounceInDown { + from, 60%, 75%, 90%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(0, -3000px, 0); + transform: translate3d(0, -3000px, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, 25px, 0); + transform: translate3d(0, 25px, 0); + } + + 75% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); + } + + 90% { + -webkit-transform: translate3d(0, 5px, 0); + transform: translate3d(0, 5px, 0); + } + + to { + -webkit-transform: none; + transform: none; + } +} + +@keyframes bounceInDown { + from, 60%, 75%, 90%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(0, -3000px, 0); + transform: translate3d(0, -3000px, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, 25px, 0); + transform: translate3d(0, 25px, 0); + } + + 75% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); + } + + 90% { + -webkit-transform: translate3d(0, 5px, 0); + transform: translate3d(0, 5px, 0); + } + + to { + -webkit-transform: none; + transform: none; + } +} + +.bounceInDown { + -webkit-animation-name: bounceInDown; + animation-name: bounceInDown; +} + +@-webkit-keyframes bounceInLeft { + from, 60%, 75%, 90%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(-3000px, 0, 0); + transform: translate3d(-3000px, 0, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(25px, 0, 0); + transform: translate3d(25px, 0, 0); + } + + 75% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + } + + 90% { + -webkit-transform: translate3d(5px, 0, 0); + transform: translate3d(5px, 0, 0); + } + + to { + -webkit-transform: none; + transform: none; + } +} + +@keyframes bounceInLeft { + from, 60%, 75%, 90%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + 0% { + opacity: 0; + -webkit-transform: translate3d(-3000px, 0, 0); + transform: translate3d(-3000px, 0, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(25px, 0, 0); + transform: translate3d(25px, 0, 0); + } + + 75% { + -webkit-transform: translate3d(-10px, 0, 0); + transform: translate3d(-10px, 0, 0); + } + + 90% { + -webkit-transform: translate3d(5px, 0, 0); + transform: translate3d(5px, 0, 0); + } + + to { + -webkit-transform: none; + transform: none; + } +} + +.bounceInLeft { + -webkit-animation-name: bounceInLeft; + animation-name: bounceInLeft; +} + +@-webkit-keyframes bounceInRight { + from, 60%, 75%, 90%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + from { + opacity: 0; + -webkit-transform: translate3d(3000px, 0, 0); + transform: translate3d(3000px, 0, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(-25px, 0, 0); + transform: translate3d(-25px, 0, 0); + } + + 75% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); + } + + 90% { + -webkit-transform: translate3d(-5px, 0, 0); + transform: translate3d(-5px, 0, 0); + } + + to { + -webkit-transform: none; + transform: none; + } +} + +@keyframes bounceInRight { + from, 60%, 75%, 90%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + from { + opacity: 0; + -webkit-transform: translate3d(3000px, 0, 0); + transform: translate3d(3000px, 0, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(-25px, 0, 0); + transform: translate3d(-25px, 0, 0); + } + + 75% { + -webkit-transform: translate3d(10px, 0, 0); + transform: translate3d(10px, 0, 0); + } + + 90% { + -webkit-transform: translate3d(-5px, 0, 0); + transform: translate3d(-5px, 0, 0); + } + + to { + -webkit-transform: none; + transform: none; + } +} + +.bounceInRight { + -webkit-animation-name: bounceInRight; + animation-name: bounceInRight; +} + +@-webkit-keyframes bounceInUp { + from, 60%, 75%, 90%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + from { + opacity: 0; + -webkit-transform: translate3d(0, 3000px, 0); + transform: translate3d(0, 3000px, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } + + 75% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } + + 90% { + -webkit-transform: translate3d(0, -5px, 0); + transform: translate3d(0, -5px, 0); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes bounceInUp { + from, 60%, 75%, 90%, to { + -webkit-animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + animation-timing-function: cubic-bezier(0.215, 0.610, 0.355, 1.000); + } + + from { + opacity: 0; + -webkit-transform: translate3d(0, 3000px, 0); + transform: translate3d(0, 3000px, 0); + } + + 60% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } + + 75% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } + + 90% { + -webkit-transform: translate3d(0, -5px, 0); + transform: translate3d(0, -5px, 0); + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.bounceInUp { + -webkit-animation-name: bounceInUp; + animation-name: bounceInUp; +} + +@-webkit-keyframes bounceOut { + 20% { + -webkit-transform: scale3d(.9, .9, .9); + transform: scale3d(.9, .9, .9); + } + + 50%, 55% { + opacity: 1; + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + to { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } +} + +@keyframes bounceOut { + 20% { + -webkit-transform: scale3d(.9, .9, .9); + transform: scale3d(.9, .9, .9); + } + + 50%, 55% { + opacity: 1; + -webkit-transform: scale3d(1.1, 1.1, 1.1); + transform: scale3d(1.1, 1.1, 1.1); + } + + to { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } +} + +.bounceOut { + -webkit-animation-name: bounceOut; + animation-name: bounceOut; +} + +@-webkit-keyframes bounceOutDown { + 20% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } + + 40%, 45% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } +} + +@keyframes bounceOutDown { + 20% { + -webkit-transform: translate3d(0, 10px, 0); + transform: translate3d(0, 10px, 0); + } + + 40%, 45% { + opacity: 1; + -webkit-transform: translate3d(0, -20px, 0); + transform: translate3d(0, -20px, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } +} + +.bounceOutDown { + -webkit-animation-name: bounceOutDown; + animation-name: bounceOutDown; +} + +@-webkit-keyframes bounceOutLeft { + 20% { + opacity: 1; + -webkit-transform: translate3d(20px, 0, 0); + transform: translate3d(20px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } +} + +@keyframes bounceOutLeft { + 20% { + opacity: 1; + -webkit-transform: translate3d(20px, 0, 0); + transform: translate3d(20px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } +} + +.bounceOutLeft { + -webkit-animation-name: bounceOutLeft; + animation-name: bounceOutLeft; +} + +@-webkit-keyframes bounceOutRight { + 20% { + opacity: 1; + -webkit-transform: translate3d(-20px, 0, 0); + transform: translate3d(-20px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } +} + +@keyframes bounceOutRight { + 20% { + opacity: 1; + -webkit-transform: translate3d(-20px, 0, 0); + transform: translate3d(-20px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } +} + +.bounceOutRight { + -webkit-animation-name: bounceOutRight; + animation-name: bounceOutRight; +} + +@-webkit-keyframes bounceOutUp { + 20% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); + } + + 40%, 45% { + opacity: 1; + -webkit-transform: translate3d(0, 20px, 0); + transform: translate3d(0, 20px, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } +} + +@keyframes bounceOutUp { + 20% { + -webkit-transform: translate3d(0, -10px, 0); + transform: translate3d(0, -10px, 0); + } + + 40%, 45% { + opacity: 1; + -webkit-transform: translate3d(0, 20px, 0); + transform: translate3d(0, 20px, 0); + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } +} + +.bounceOutUp { + -webkit-animation-name: bounceOutUp; + animation-name: bounceOutUp; +} + +@-webkit-keyframes fadeIn { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + +@keyframes fadeIn { + from { + opacity: 0; + } + + to { + opacity: 1; + } +} + +.fadeIn { + -webkit-animation-name: fadeIn; + animation-name: fadeIn; +} + +@-webkit-keyframes fadeInDown { + from { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInDown { + from { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInDown { + -webkit-animation-name: fadeInDown; + animation-name: fadeInDown; +} + +@-webkit-keyframes fadeInDownBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInDownBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInDownBig { + -webkit-animation-name: fadeInDownBig; + animation-name: fadeInDownBig; +} + +@-webkit-keyframes fadeInLeft { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInLeft { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInLeft { + -webkit-animation-name: fadeInLeft; + animation-name: fadeInLeft; +} + +@-webkit-keyframes fadeInLeftBig { + from { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInLeftBig { + from { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInLeftBig { + -webkit-animation-name: fadeInLeftBig; + animation-name: fadeInLeftBig; +} + +@-webkit-keyframes fadeInRight { + from { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInRight { + from { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInRight { + -webkit-animation-name: fadeInRight; + animation-name: fadeInRight; +} + +@-webkit-keyframes fadeInRightBig { + from { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInRightBig { + from { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInRightBig { + -webkit-animation-name: fadeInRightBig; + animation-name: fadeInRightBig; +} + +@-webkit-keyframes fadeInUp { + from { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInUp { + from { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInUp { + -webkit-animation-name: fadeInUp; + animation-name: fadeInUp; +} + +@-webkit-keyframes fadeInUpBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes fadeInUpBig { + from { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.fadeInUpBig { + -webkit-animation-name: fadeInUpBig; + animation-name: fadeInUpBig; +} + +@-webkit-keyframes fadeOut { + from { + opacity: 1; + } + + to { + opacity: 0; + } +} + +@keyframes fadeOut { + from { + opacity: 1; + } + + to { + opacity: 0; + } +} + +.fadeOut { + -webkit-animation-name: fadeOut; + animation-name: fadeOut; +} + +@-webkit-keyframes fadeOutDown { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +@keyframes fadeOutDown { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +.fadeOutDown { + -webkit-animation-name: fadeOutDown; + animation-name: fadeOutDown; +} + +@-webkit-keyframes fadeOutDownBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } +} + +@keyframes fadeOutDownBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, 2000px, 0); + transform: translate3d(0, 2000px, 0); + } +} + +.fadeOutDownBig { + -webkit-animation-name: fadeOutDownBig; + animation-name: fadeOutDownBig; +} + +@-webkit-keyframes fadeOutLeft { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +@keyframes fadeOutLeft { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +.fadeOutLeft { + -webkit-animation-name: fadeOutLeft; + animation-name: fadeOutLeft; +} + +@-webkit-keyframes fadeOutLeftBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } +} + +@keyframes fadeOutLeftBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(-2000px, 0, 0); + transform: translate3d(-2000px, 0, 0); + } +} + +.fadeOutLeftBig { + -webkit-animation-name: fadeOutLeftBig; + animation-name: fadeOutLeftBig; +} + +@-webkit-keyframes fadeOutRight { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +@keyframes fadeOutRight { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +.fadeOutRight { + -webkit-animation-name: fadeOutRight; + animation-name: fadeOutRight; +} + +@-webkit-keyframes fadeOutRightBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } +} + +@keyframes fadeOutRightBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(2000px, 0, 0); + transform: translate3d(2000px, 0, 0); + } +} + +.fadeOutRightBig { + -webkit-animation-name: fadeOutRightBig; + animation-name: fadeOutRightBig; +} + +@-webkit-keyframes fadeOutUp { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +@keyframes fadeOutUp { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +.fadeOutUp { + -webkit-animation-name: fadeOutUp; + animation-name: fadeOutUp; +} + +@-webkit-keyframes fadeOutUpBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } +} + +@keyframes fadeOutUpBig { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(0, -2000px, 0); + transform: translate3d(0, -2000px, 0); + } +} + +.fadeOutUpBig { + -webkit-animation-name: fadeOutUpBig; + animation-name: fadeOutUpBig; +} + +@-webkit-keyframes flip { + from { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg); + transform: perspective(400px) rotate3d(0, 1, 0, -360deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 40% { + -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 50% { + -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 80% { + -webkit-transform: perspective(400px) scale3d(.95, .95, .95); + transform: perspective(400px) scale3d(.95, .95, .95); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } +} + +@keyframes flip { + from { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -360deg); + transform: perspective(400px) rotate3d(0, 1, 0, -360deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 40% { + -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -190deg); + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + } + + 50% { + -webkit-transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + transform: perspective(400px) translate3d(0, 0, 150px) rotate3d(0, 1, 0, -170deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 80% { + -webkit-transform: perspective(400px) scale3d(.95, .95, .95); + transform: perspective(400px) scale3d(.95, .95, .95); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } +} + +.animated.flip { + -webkit-backface-visibility: visible; + backface-visibility: visible; + -webkit-animation-name: flip; + animation-name: flip; +} + +@-webkit-keyframes flipInX { + from { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +@keyframes flipInX { + from { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + transform: perspective(400px) rotate3d(1, 0, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + transform: perspective(400px) rotate3d(1, 0, 0, -5deg); + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +.flipInX { + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipInX; + animation-name: flipInX; +} + +@-webkit-keyframes flipInY { + from { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +@keyframes flipInY { + from { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + opacity: 0; + } + + 40% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + transform: perspective(400px) rotate3d(0, 1, 0, -20deg); + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; + } + + 60% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + transform: perspective(400px) rotate3d(0, 1, 0, 10deg); + opacity: 1; + } + + 80% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + transform: perspective(400px) rotate3d(0, 1, 0, -5deg); + } + + to { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } +} + +.flipInY { + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipInY; + animation-name: flipInY; +} + +@-webkit-keyframes flipOutX { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + opacity: 1; + } + + to { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + opacity: 0; + } +} + +@keyframes flipOutX { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + transform: perspective(400px) rotate3d(1, 0, 0, -20deg); + opacity: 1; + } + + to { + -webkit-transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + transform: perspective(400px) rotate3d(1, 0, 0, 90deg); + opacity: 0; + } +} + +.flipOutX { + -webkit-animation-name: flipOutX; + animation-name: flipOutX; + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; +} + +@-webkit-keyframes flipOutY { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + opacity: 1; + } + + to { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + opacity: 0; + } +} + +@keyframes flipOutY { + from { + -webkit-transform: perspective(400px); + transform: perspective(400px); + } + + 30% { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + transform: perspective(400px) rotate3d(0, 1, 0, -15deg); + opacity: 1; + } + + to { + -webkit-transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + transform: perspective(400px) rotate3d(0, 1, 0, 90deg); + opacity: 0; + } +} + +.flipOutY { + -webkit-backface-visibility: visible !important; + backface-visibility: visible !important; + -webkit-animation-name: flipOutY; + animation-name: flipOutY; +} + +@-webkit-keyframes lightSpeedIn { + from { + -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg); + transform: translate3d(100%, 0, 0) skewX(-30deg); + opacity: 0; + } + + 60% { + -webkit-transform: skewX(20deg); + transform: skewX(20deg); + opacity: 1; + } + + 80% { + -webkit-transform: skewX(-5deg); + transform: skewX(-5deg); + opacity: 1; + } + + to { + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes lightSpeedIn { + from { + -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg); + transform: translate3d(100%, 0, 0) skewX(-30deg); + opacity: 0; + } + + 60% { + -webkit-transform: skewX(20deg); + transform: skewX(20deg); + opacity: 1; + } + + 80% { + -webkit-transform: skewX(-5deg); + transform: skewX(-5deg); + opacity: 1; + } + + to { + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.lightSpeedIn { + -webkit-animation-name: lightSpeedIn; + animation-name: lightSpeedIn; + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; +} + +@-webkit-keyframes lightSpeedOut { + from { + opacity: 1; + } + + to { + -webkit-transform: translate3d(100%, 0, 0) skewX(30deg); + transform: translate3d(100%, 0, 0) skewX(30deg); + opacity: 0; + } +} + +@keyframes lightSpeedOut { + from { + opacity: 1; + } + + to { + -webkit-transform: translate3d(100%, 0, 0) skewX(30deg); + transform: translate3d(100%, 0, 0) skewX(30deg); + opacity: 0; + } +} + +.lightSpeedOut { + -webkit-animation-name: lightSpeedOut; + animation-name: lightSpeedOut; + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; +} + +@-webkit-keyframes rotateIn { + from { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate3d(0, 0, 1, -200deg); + transform: rotate3d(0, 0, 1, -200deg); + opacity: 0; + } + + to { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes rotateIn { + from { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate3d(0, 0, 1, -200deg); + transform: rotate3d(0, 0, 1, -200deg); + opacity: 0; + } + + to { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.rotateIn { + -webkit-animation-name: rotateIn; + animation-name: rotateIn; +} + +@-webkit-keyframes rotateInDownLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes rotateInDownLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.rotateInDownLeft { + -webkit-animation-name: rotateInDownLeft; + animation-name: rotateInDownLeft; +} + +@-webkit-keyframes rotateInDownRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes rotateInDownRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.rotateInDownRight { + -webkit-animation-name: rotateInDownRight; + animation-name: rotateInDownRight; +} + +@-webkit-keyframes rotateInUpLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes rotateInUpLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.rotateInUpLeft { + -webkit-animation-name: rotateInUpLeft; + animation-name: rotateInUpLeft; +} + +@-webkit-keyframes rotateInUpRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, -90deg); + transform: rotate3d(0, 0, 1, -90deg); + opacity: 0; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +@keyframes rotateInUpRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, -90deg); + transform: rotate3d(0, 0, 1, -90deg); + opacity: 0; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: none; + transform: none; + opacity: 1; + } +} + +.rotateInUpRight { + -webkit-animation-name: rotateInUpRight; + animation-name: rotateInUpRight; +} + +@-webkit-keyframes rotateOut { + from { + -webkit-transform-origin: center; + transform-origin: center; + opacity: 1; + } + + to { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate3d(0, 0, 1, 200deg); + transform: rotate3d(0, 0, 1, 200deg); + opacity: 0; + } +} + +@keyframes rotateOut { + from { + -webkit-transform-origin: center; + transform-origin: center; + opacity: 1; + } + + to { + -webkit-transform-origin: center; + transform-origin: center; + -webkit-transform: rotate3d(0, 0, 1, 200deg); + transform: rotate3d(0, 0, 1, 200deg); + opacity: 0; + } +} + +.rotateOut { + -webkit-animation-name: rotateOut; + animation-name: rotateOut; +} + +@-webkit-keyframes rotateOutDownLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } +} + +@keyframes rotateOutDownLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, 45deg); + transform: rotate3d(0, 0, 1, 45deg); + opacity: 0; + } +} + +.rotateOutDownLeft { + -webkit-animation-name: rotateOutDownLeft; + animation-name: rotateOutDownLeft; +} + +@-webkit-keyframes rotateOutDownRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} + +@keyframes rotateOutDownRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} + +.rotateOutDownRight { + -webkit-animation-name: rotateOutDownRight; + animation-name: rotateOutDownRight; +} + +@-webkit-keyframes rotateOutUpLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} + +@keyframes rotateOutUpLeft { + from { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: left bottom; + transform-origin: left bottom; + -webkit-transform: rotate3d(0, 0, 1, -45deg); + transform: rotate3d(0, 0, 1, -45deg); + opacity: 0; + } +} + +.rotateOutUpLeft { + -webkit-animation-name: rotateOutUpLeft; + animation-name: rotateOutUpLeft; +} + +@-webkit-keyframes rotateOutUpRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, 90deg); + transform: rotate3d(0, 0, 1, 90deg); + opacity: 0; + } +} + +@keyframes rotateOutUpRight { + from { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + opacity: 1; + } + + to { + -webkit-transform-origin: right bottom; + transform-origin: right bottom; + -webkit-transform: rotate3d(0, 0, 1, 90deg); + transform: rotate3d(0, 0, 1, 90deg); + opacity: 0; + } +} + +.rotateOutUpRight { + -webkit-animation-name: rotateOutUpRight; + animation-name: rotateOutUpRight; +} + +@-webkit-keyframes hinge { + 0% { + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 20%, 60% { + -webkit-transform: rotate3d(0, 0, 1, 80deg); + transform: rotate3d(0, 0, 1, 80deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 40%, 80% { + -webkit-transform: rotate3d(0, 0, 1, 60deg); + transform: rotate3d(0, 0, 1, 60deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + opacity: 1; + } + + to { + -webkit-transform: translate3d(0, 700px, 0); + transform: translate3d(0, 700px, 0); + opacity: 0; + } +} + +@keyframes hinge { + 0% { + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 20%, 60% { + -webkit-transform: rotate3d(0, 0, 1, 80deg); + transform: rotate3d(0, 0, 1, 80deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + } + + 40%, 80% { + -webkit-transform: rotate3d(0, 0, 1, 60deg); + transform: rotate3d(0, 0, 1, 60deg); + -webkit-transform-origin: top left; + transform-origin: top left; + -webkit-animation-timing-function: ease-in-out; + animation-timing-function: ease-in-out; + opacity: 1; + } + + to { + -webkit-transform: translate3d(0, 700px, 0); + transform: translate3d(0, 700px, 0); + opacity: 0; + } +} + +.hinge { + -webkit-animation-name: hinge; + animation-name: hinge; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes rollIn { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +@keyframes rollIn { + from { + opacity: 0; + -webkit-transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + transform: translate3d(-100%, 0, 0) rotate3d(0, 0, 1, -120deg); + } + + to { + opacity: 1; + -webkit-transform: none; + transform: none; + } +} + +.rollIn { + -webkit-animation-name: rollIn; + animation-name: rollIn; +} + +/* originally authored by Nick Pettit - https://github.com/nickpettit/glide */ + +@-webkit-keyframes rollOut { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + } +} + +@keyframes rollOut { + from { + opacity: 1; + } + + to { + opacity: 0; + -webkit-transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + transform: translate3d(100%, 0, 0) rotate3d(0, 0, 1, 120deg); + } +} + +.rollOut { + -webkit-animation-name: rollOut; + animation-name: rollOut; +} + +@-webkit-keyframes zoomIn { + from { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } + + 50% { + opacity: 1; + } +} + +@keyframes zoomIn { + from { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } + + 50% { + opacity: 1; + } +} + +.zoomIn { + -webkit-animation-name: zoomIn; + animation-name: zoomIn; +} + +@-webkit-keyframes zoomInDown { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +@keyframes zoomInDown { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomInDown { + -webkit-animation-name: zoomInDown; + animation-name: zoomInDown; +} + +@-webkit-keyframes zoomInLeft { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0); + transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +@keyframes zoomInLeft { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0); + transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomInLeft { + -webkit-animation-name: zoomInLeft; + animation-name: zoomInLeft; +} + +@-webkit-keyframes zoomInRight { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0); + transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +@keyframes zoomInRight { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0); + transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomInRight { + -webkit-animation-name: zoomInRight; + animation-name: zoomInRight; +} + +@-webkit-keyframes zoomInUp { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +@keyframes zoomInUp { + from { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + 60% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomInUp { + -webkit-animation-name: zoomInUp; + animation-name: zoomInUp; +} + +@-webkit-keyframes zoomOut { + from { + opacity: 1; + } + + 50% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } + + to { + opacity: 0; + } +} + +@keyframes zoomOut { + from { + opacity: 1; + } + + 50% { + opacity: 0; + -webkit-transform: scale3d(.3, .3, .3); + transform: scale3d(.3, .3, .3); + } + + to { + opacity: 0; + } +} + +.zoomOut { + -webkit-animation-name: zoomOut; + animation-name: zoomOut; +} + +@-webkit-keyframes zoomOutDown { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + to { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +@keyframes zoomOutDown { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + to { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomOutDown { + -webkit-animation-name: zoomOutDown; + animation-name: zoomOutDown; +} + +@-webkit-keyframes zoomOutLeft { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: scale(.1) translate3d(-2000px, 0, 0); + transform: scale(.1) translate3d(-2000px, 0, 0); + -webkit-transform-origin: left center; + transform-origin: left center; + } +} + +@keyframes zoomOutLeft { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: scale(.1) translate3d(-2000px, 0, 0); + transform: scale(.1) translate3d(-2000px, 0, 0); + -webkit-transform-origin: left center; + transform-origin: left center; + } +} + +.zoomOutLeft { + -webkit-animation-name: zoomOutLeft; + animation-name: zoomOutLeft; +} + +@-webkit-keyframes zoomOutRight { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: scale(.1) translate3d(2000px, 0, 0); + transform: scale(.1) translate3d(2000px, 0, 0); + -webkit-transform-origin: right center; + transform-origin: right center; + } +} + +@keyframes zoomOutRight { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0); + transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0); + } + + to { + opacity: 0; + -webkit-transform: scale(.1) translate3d(2000px, 0, 0); + transform: scale(.1) translate3d(2000px, 0, 0); + -webkit-transform-origin: right center; + transform-origin: right center; + } +} + +.zoomOutRight { + -webkit-animation-name: zoomOutRight; + animation-name: zoomOutRight; +} + +@-webkit-keyframes zoomOutUp { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + to { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +@keyframes zoomOutUp { + 40% { + opacity: 1; + -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0); + -webkit-animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + animation-timing-function: cubic-bezier(0.550, 0.055, 0.675, 0.190); + } + + to { + opacity: 0; + -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0); + transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0); + -webkit-transform-origin: center bottom; + transform-origin: center bottom; + -webkit-animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + animation-timing-function: cubic-bezier(0.175, 0.885, 0.320, 1); + } +} + +.zoomOutUp { + -webkit-animation-name: zoomOutUp; + animation-name: zoomOutUp; +} + +@-webkit-keyframes slideInDown { + from { + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes slideInDown { + from { + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.slideInDown { + -webkit-animation-name: slideInDown; + animation-name: slideInDown; +} + +@-webkit-keyframes slideInLeft { + from { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes slideInLeft { + from { + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.slideInLeft { + -webkit-animation-name: slideInLeft; + animation-name: slideInLeft; +} + +@-webkit-keyframes slideInRight { + from { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes slideInRight { + from { + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.slideInRight { + -webkit-animation-name: slideInRight; + animation-name: slideInRight; +} + +@-webkit-keyframes slideInUp { + from { + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +@keyframes slideInUp { + from { + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + visibility: visible; + } + + to { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } +} + +.slideInUp { + -webkit-animation-name: slideInUp; + animation-name: slideInUp; +} + +@-webkit-keyframes slideOutDown { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +@keyframes slideOutDown { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(0, 100%, 0); + transform: translate3d(0, 100%, 0); + } +} + +.slideOutDown { + -webkit-animation-name: slideOutDown; + animation-name: slideOutDown; +} + +@-webkit-keyframes slideOutLeft { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +@keyframes slideOutLeft { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(-100%, 0, 0); + transform: translate3d(-100%, 0, 0); + } +} + +.slideOutLeft { + -webkit-animation-name: slideOutLeft; + animation-name: slideOutLeft; +} + +@-webkit-keyframes slideOutRight { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +@keyframes slideOutRight { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(100%, 0, 0); + transform: translate3d(100%, 0, 0); + } +} + +.slideOutRight { + -webkit-animation-name: slideOutRight; + animation-name: slideOutRight; +} + +@-webkit-keyframes slideOutUp { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +@keyframes slideOutUp { + from { + -webkit-transform: translate3d(0, 0, 0); + transform: translate3d(0, 0, 0); + } + + to { + visibility: hidden; + -webkit-transform: translate3d(0, -100%, 0); + transform: translate3d(0, -100%, 0); + } +} + +.slideOutUp { + -webkit-animation-name: slideOutUp; + animation-name: slideOutUp; +} diff --git a/web/css/bootstrap-select.min.css b/web/css/bootstrap-select.min.css new file mode 100755 index 0000000..d178d82 --- /dev/null +++ b/web/css/bootstrap-select.min.css @@ -0,0 +1,6 @@ +/*! + * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select) + * + * Copyright 2013-2017 bootstrap-select + * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE) + */select.bs-select-hidden,select.selectpicker{display:none!important}.bootstrap-select{width:220px\9}.bootstrap-select>.dropdown-toggle{width:100%;padding-right:25px;z-index:1}.bootstrap-select>.dropdown-toggle.bs-placeholder,.bootstrap-select>.dropdown-toggle.bs-placeholder:active,.bootstrap-select>.dropdown-toggle.bs-placeholder:focus,.bootstrap-select>.dropdown-toggle.bs-placeholder:hover{color:#999}.bootstrap-select>select{position:absolute!important;bottom:0;left:50%;display:block!important;width:.5px!important;height:100%!important;padding:0!important;opacity:0!important;border:none}.bootstrap-select>select.mobile-device{top:0;left:0;display:block!important;width:100%!important;z-index:2}.error .bootstrap-select .dropdown-toggle,.has-error .bootstrap-select .dropdown-toggle{border-color:#b94a48}.bootstrap-select.fit-width{width:auto!important}.bootstrap-select:not([class*=col-]):not([class*=form-control]):not(.input-group-btn){width:220px}.bootstrap-select .dropdown-toggle:focus{outline:thin dotted #333!important;outline:5px auto -webkit-focus-ring-color!important;outline-offset:-2px}.bootstrap-select.form-control{margin-bottom:0;padding:0;border:none}.bootstrap-select.form-control:not([class*=col-]){width:100%}.bootstrap-select.form-control.input-group-btn{z-index:auto}.bootstrap-select.form-control.input-group-btn:not(:first-child):not(:last-child)>.btn{border-radius:0}.bootstrap-select.btn-group:not(.input-group-btn),.bootstrap-select.btn-group[class*=col-]{float:none;display:inline-block;margin-left:0}.bootstrap-select.btn-group.dropdown-menu-right,.bootstrap-select.btn-group[class*=col-].dropdown-menu-right,.row .bootstrap-select.btn-group[class*=col-].dropdown-menu-right{float:right}.form-group .bootstrap-select.btn-group,.form-horizontal .bootstrap-select.btn-group,.form-inline .bootstrap-select.btn-group{margin-bottom:0}.form-group-lg .bootstrap-select.btn-group.form-control,.form-group-sm .bootstrap-select.btn-group.form-control{padding:0}.form-group-lg .bootstrap-select.btn-group.form-control .dropdown-toggle,.form-group-sm .bootstrap-select.btn-group.form-control .dropdown-toggle{height:100%;font-size:inherit;line-height:inherit;border-radius:inherit}.form-inline .bootstrap-select.btn-group .form-control{width:100%}.bootstrap-select.btn-group.disabled,.bootstrap-select.btn-group>.disabled{cursor:not-allowed}.bootstrap-select.btn-group.disabled:focus,.bootstrap-select.btn-group>.disabled:focus{outline:0!important}.bootstrap-select.btn-group.bs-container{position:absolute;height:0!important;padding:0!important}.bootstrap-select.btn-group.bs-container .dropdown-menu{z-index:1060}.bootstrap-select.btn-group .dropdown-toggle .filter-option{display:inline-block;overflow:hidden;width:100%;text-align:left}.bootstrap-select.btn-group .dropdown-toggle .caret{position:absolute;top:50%;right:12px;margin-top:-2px;vertical-align:middle}.bootstrap-select.btn-group[class*=col-] .dropdown-toggle{width:100%}.bootstrap-select.btn-group .dropdown-menu{min-width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bootstrap-select.btn-group .dropdown-menu.inner{position:static;float:none;border:0;padding:0;margin:0;border-radius:0;-webkit-box-shadow:none;box-shadow:none}.bootstrap-select.btn-group .dropdown-menu li{position:relative}.bootstrap-select.btn-group .dropdown-menu li.active small{color:#fff}.bootstrap-select.btn-group .dropdown-menu li.disabled a{cursor:not-allowed}.bootstrap-select.btn-group .dropdown-menu li a{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.bootstrap-select.btn-group .dropdown-menu li a.opt{position:relative;padding-left:2.25em}.bootstrap-select.btn-group .dropdown-menu li a span.check-mark{display:none}.bootstrap-select.btn-group .dropdown-menu li a span.text{display:inline-block}.bootstrap-select.btn-group .dropdown-menu li small{padding-left:.5em}.bootstrap-select.btn-group .dropdown-menu .notify{position:absolute;bottom:5px;width:96%;margin:0 2%;min-height:26px;padding:3px 5px;background:#f5f5f5;border:1px solid #e3e3e3;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05);pointer-events:none;opacity:.9;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bootstrap-select.btn-group .no-results{padding:3px;background:#f5f5f5;margin:0 5px;white-space:nowrap}.bootstrap-select.btn-group.fit-width .dropdown-toggle .filter-option{position:static}.bootstrap-select.btn-group.fit-width .dropdown-toggle .caret{position:static;top:auto;margin-top:-1px}.bootstrap-select.btn-group.show-tick .dropdown-menu li.selected a span.check-mark{position:absolute;display:inline-block;right:15px;margin-top:5px}.bootstrap-select.btn-group.show-tick .dropdown-menu li a span.text{margin-right:34px}.bootstrap-select.show-menu-arrow.open>.dropdown-toggle{z-index:1061}.bootstrap-select.show-menu-arrow .dropdown-toggle:before{content:'';border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid rgba(204,204,204,.2);position:absolute;bottom:-4px;left:9px;display:none}.bootstrap-select.show-menu-arrow .dropdown-toggle:after{content:'';border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #fff;position:absolute;bottom:-4px;left:10px;display:none}.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle:before{bottom:auto;top:-3px;border-top:7px solid rgba(204,204,204,.2);border-bottom:0}.bootstrap-select.show-menu-arrow.dropup .dropdown-toggle:after{bottom:auto;top:-3px;border-top:6px solid #fff;border-bottom:0}.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle:before{right:12px;left:auto}.bootstrap-select.show-menu-arrow.pull-right .dropdown-toggle:after{right:13px;left:auto}.bootstrap-select.show-menu-arrow.open>.dropdown-toggle:after,.bootstrap-select.show-menu-arrow.open>.dropdown-toggle:before{display:block}.bs-actionsbox,.bs-donebutton,.bs-searchbox{padding:4px 8px}.bs-actionsbox{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bs-actionsbox .btn-group button{width:50%}.bs-donebutton{float:left;width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.bs-donebutton .btn-group button{width:100%}.bs-searchbox+.bs-actionsbox{padding:0 8px 4px}.bs-searchbox .form-control{margin-bottom:0;width:100%;float:none} \ No newline at end of file diff --git a/web/css/bootstrap.min.css b/web/css/bootstrap.min.css new file mode 100644 index 0000000..90f14a4 --- /dev/null +++ b/web/css/bootstrap.min.css @@ -0,0 +1,11 @@ +@import url("https://fonts.googleapis.com/css?family=Lato:400,700,400italic");/*! + * bootswatch v3.3.7 + * Homepage: http://bootswatch.com + * Copyright 2012-2016 Thomas Park + * Licensed under MIT + * Based on Bootstrap +*//*! + * Bootstrap v3.3.7 (http://getbootstrap.com) + * Copyright 2011-2016 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}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:1em 40px}hr{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;-webkit-box-shadow:none !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-size:15px;line-height:1.42857143;color:#ffffff;background-color:#222222}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#0ce3ac;text-decoration:none}a:hover,a:focus{color:#0ce3ac;text-decoration:underline}a:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:2px;line-height:1.42857143;background-color:#222222;border:1px solid #464545;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:21px;margin-bottom:21px;border:0;border-top:1px solid #464545}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:400;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#999999}h1,.h1,h2,.h2,h3,.h3{margin-top:21px;margin-bottom:10.5px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10.5px;margin-bottom:10.5px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:39px}h2,.h2{font-size:32px}h3,.h3{font-size:26px}h4,.h4{font-size:19px}h5,.h5{font-size:15px}h6,.h6{font-size:13px}p{margin:0 0 10.5px}.lead{margin-bottom:21px;font-size:17px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:22.5px}}small,.small{font-size:86%}mark,.mark{background-color:#f39c12;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#999999}.text-primary{color:#375a7f}a.text-primary:hover,a.text-primary:focus{color:#28415b}.text-success{color:#ffffff}a.text-success:hover,a.text-success:focus{color:#e6e6e6}.text-info{color:#ffffff}a.text-info:hover,a.text-info:focus{color:#e6e6e6}.text-warning{color:#ffffff}a.text-warning:hover,a.text-warning:focus{color:#e6e6e6}.text-danger{color:#ffffff}a.text-danger:hover,a.text-danger:focus{color:#e6e6e6}.bg-primary{color:#fff;background-color:#375a7f}a.bg-primary:hover,a.bg-primary:focus{background-color:#28415b}.bg-success{background-color:#00bc8c}a.bg-success:hover,a.bg-success:focus{background-color:#008966}.bg-info{background-color:#3498db}a.bg-info:hover,a.bg-info:focus{background-color:#217dbb}.bg-warning{background-color:#f39c12}a.bg-warning:hover,a.bg-warning:focus{background-color:#c87f0a}.bg-danger{background-color:#e74c3c}a.bg-danger:hover,a.bg-danger:focus{background-color:#d62c1a}.page-header{padding-bottom:9.5px;margin:42px 0 21px;border-bottom:1px solid transparent}ul,ol{margin-top:0;margin-bottom:10.5px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:21px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10.5px 21px;margin:0 0 21px;font-size:18.75px;border-left:5px solid #464545}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#999999}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #464545;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:21px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#ffffff;background-color:#333333;border-radius:3px;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;-webkit-box-shadow:none;box-shadow:none}pre{display:block;padding:10px;margin:0 0 10.5px;font-size:14px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#303030;background-color:#ebebeb;border:1px solid #cccccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0%}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0%}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0%}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0%}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#999999;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:21px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #464545}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #464545}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #464545}.table .table{background-color:#222222}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #464545}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #464545}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#3d3d3d}.table-hover>tbody>tr:hover{background-color:#464545}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#464545}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#393838}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#00bc8c}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#00a379}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#3498db}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#258cd1}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#f39c12}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#e08e0b}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#e74c3c}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#e43725}.table-responsive{overflow-x:auto;min-height:0.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15.75px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #464545}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:21px;font-size:22.5px;line-height:inherit;color:#ffffff;border:0;border-bottom:1px solid transparent}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:11px;font-size:15px;line-height:1.42857143;color:#464545}.form-control{display:block;width:100%;height:45px;padding:10px 15px;font-size:15px;line-height:1.42857143;color:#464545;background-color:#ffffff;background-image:none;border:1px solid #f1f1f1;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,-webkit-box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#ffffff;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(255,255,255,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(255,255,255,0.6)}.form-control::-moz-placeholder{color:#999999;opacity:1}.form-control:-ms-input-placeholder{color:#999999}.form-control::-webkit-input-placeholder{color:#999999}.form-control::-ms-expand{border:0;background-color:transparent}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#ebebeb;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:45px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:35px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:66px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:21px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:11px;padding-bottom:11px;margin-bottom:0;min-height:36px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:35px;padding:6px 9px;font-size:13px;line-height:1.5;border-radius:3px}select.input-sm{height:35px;line-height:35px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:35px;padding:6px 9px;font-size:13px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:35px;line-height:35px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:35px;min-height:34px;padding:7px 9px;font-size:13px;line-height:1.5}.input-lg{height:66px;padding:18px 27px;font-size:19px;line-height:1.3333333;border-radius:6px}select.input-lg{height:66px;line-height:66px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:66px;padding:18px 27px;font-size:19px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:66px;line-height:66px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:66px;min-height:40px;padding:19px 27px;font-size:19px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:56.25px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:45px;height:45px;line-height:45px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:66px;height:66px;line-height:66px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:35px;height:35px;line-height:35px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#ffffff}.has-success .form-control{border-color:#ffffff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-success .input-group-addon{color:#ffffff;border-color:#ffffff;background-color:#00bc8c}.has-success .form-control-feedback{color:#ffffff}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#ffffff}.has-warning .form-control{border-color:#ffffff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-warning .input-group-addon{color:#ffffff;border-color:#ffffff;background-color:#f39c12}.has-warning .form-control-feedback{color:#ffffff}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#ffffff}.has-error .form-control{border-color:#ffffff;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#e6e6e6;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #fff}.has-error .input-group-addon{color:#ffffff;border-color:#ffffff;background-color:#e74c3c}.has-error .form-control-feedback{color:#ffffff}.has-feedback label~.form-control-feedback{top:26px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#ffffff}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:11px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:32px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:11px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:19px;font-size:19px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:7px;font-size:13px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;-ms-touch-action:manipulation;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:10px 15px;font-size:15px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#ffffff;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#ffffff;background-color:#464545;border-color:#464545}.btn-default:focus,.btn-default.focus{color:#ffffff;background-color:#2c2c2c;border-color:#060606}.btn-default:hover{color:#ffffff;background-color:#2c2c2c;border-color:#272727}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#ffffff;background-color:#2c2c2c;border-color:#272727}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#ffffff;background-color:#1a1a1a;border-color:#060606}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus{background-color:#464545;border-color:#464545}.btn-default .badge{color:#464545;background-color:#ffffff}.btn-primary{color:#ffffff;background-color:#375a7f;border-color:#375a7f}.btn-primary:focus,.btn-primary.focus{color:#ffffff;background-color:#28415b;border-color:#101b26}.btn-primary:hover{color:#ffffff;background-color:#28415b;border-color:#253c54}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#ffffff;background-color:#28415b;border-color:#253c54}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#ffffff;background-color:#1d2f43;border-color:#101b26}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus{background-color:#375a7f;border-color:#375a7f}.btn-primary .badge{color:#375a7f;background-color:#ffffff}.btn-success{color:#ffffff;background-color:#00bc8c;border-color:#00bc8c}.btn-success:focus,.btn-success.focus{color:#ffffff;background-color:#008966;border-color:#003d2d}.btn-success:hover{color:#ffffff;background-color:#008966;border-color:#007f5e}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#ffffff;background-color:#008966;border-color:#007f5e}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#ffffff;background-color:#00654b;border-color:#003d2d}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus{background-color:#00bc8c;border-color:#00bc8c}.btn-success .badge{color:#00bc8c;background-color:#ffffff}.btn-info{color:#ffffff;background-color:#3498db;border-color:#3498db}.btn-info:focus,.btn-info.focus{color:#ffffff;background-color:#217dbb;border-color:#16527a}.btn-info:hover{color:#ffffff;background-color:#217dbb;border-color:#2077b2}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#ffffff;background-color:#217dbb;border-color:#2077b2}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#ffffff;background-color:#1c699d;border-color:#16527a}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus{background-color:#3498db;border-color:#3498db}.btn-info .badge{color:#3498db;background-color:#ffffff}.btn-warning{color:#ffffff;background-color:#f39c12;border-color:#f39c12}.btn-warning:focus,.btn-warning.focus{color:#ffffff;background-color:#c87f0a;border-color:#7f5006}.btn-warning:hover{color:#ffffff;background-color:#c87f0a;border-color:#be780a}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#ffffff;background-color:#c87f0a;border-color:#be780a}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#ffffff;background-color:#a66908;border-color:#7f5006}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus{background-color:#f39c12;border-color:#f39c12}.btn-warning .badge{color:#f39c12;background-color:#ffffff}.btn-danger{color:#ffffff;background-color:#e74c3c;border-color:#e74c3c}.btn-danger:focus,.btn-danger.focus{color:#ffffff;background-color:#d62c1a;border-color:#921e12}.btn-danger:hover{color:#ffffff;background-color:#d62c1a;border-color:#cd2a19}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#ffffff;background-color:#d62c1a;border-color:#cd2a19}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#ffffff;background-color:#b62516;border-color:#921e12}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus{background-color:#e74c3c;border-color:#e74c3c}.btn-danger .badge{color:#e74c3c;background-color:#ffffff}.btn-link{color:#0ce3ac;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#0ce3ac;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999999;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:18px 27px;font-size:19px;line-height:1.3333333;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:6px 9px;font-size:13px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:13px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;-o-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:0.35s;-o-transition-duration:0.35s;transition-duration:0.35s;-webkit-transition-timing-function:ease;-o-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:15px;text-align:left;background-color:#303030;border:1px solid #cccccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);-webkit-background-clip:padding-box;background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:#464545}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#ebebeb;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#ffffff;background-color:#375a7f}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#ffffff;text-decoration:none;outline:0;background-color:#375a7f}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:13px;line-height:1.42857143;color:#999999;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:66px;padding:18px 27px;font-size:19px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:66px;line-height:66px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:35px;padding:6px 9px;font-size:13px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:35px;line-height:35px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:10px 15px;font-size:15px;font-weight:normal;line-height:1;color:#464545;text-align:center;background-color:#464545;border:1px solid transparent;border-radius:4px}.input-group-addon.input-sm{padding:6px 9px;font-size:13px;border-radius:3px}.input-group-addon.input-lg{padding:18px 27px;font-size:19px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#303030}.nav>li.disabled>a{color:#605e5e}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#605e5e;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#303030;border-color:#0ce3ac}.nav .nav-divider{height:1px;margin:9.5px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #464545}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#464545 #464545 #464545}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#00bc8c;background-color:#222222;border:1px solid #464545;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ebebeb}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ebebeb;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#222222}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#ffffff;background-color:#375a7f}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ebebeb}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ebebeb;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#222222}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:60px;margin-bottom:21px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;-webkit-box-shadow:none;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:19.5px 15px;font-size:19px;line-height:21px;height:60px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:13px;margin-bottom:13px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:9.75px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:21px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;-webkit-box-shadow:none;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:21px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:19.5px;padding-bottom:19.5px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:7.5px;margin-bottom:7.5px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:7.5px;margin-bottom:7.5px}.navbar-btn.btn-sm{margin-top:12.5px;margin-bottom:12.5px}.navbar-btn.btn-xs{margin-top:19px;margin-bottom:19px}.navbar-text{margin-top:19.5px;margin-bottom:19.5px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#375a7f;border-color:transparent}.navbar-default .navbar-brand{color:#ffffff}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#00bc8c;background-color:transparent}.navbar-default .navbar-text{color:#ffffff}.navbar-default .navbar-nav>li>a{color:#ffffff}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#00bc8c;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#ffffff;background-color:#28415b}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#cccccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#28415b}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#28415b}.navbar-default .navbar-toggle .icon-bar{background-color:#ffffff}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:transparent}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#28415b;color:#ffffff}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#ffffff}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#00bc8c;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#28415b}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#cccccc;background-color:transparent}}.navbar-default .navbar-link{color:#ffffff}.navbar-default .navbar-link:hover{color:#00bc8c}.navbar-default .btn-link{color:#ffffff}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#00bc8c}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#cccccc}.navbar-inverse{background-color:#00bc8c;border-color:transparent}.navbar-inverse .navbar-brand{color:#ffffff}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#375a7f;background-color:transparent}.navbar-inverse .navbar-text{color:#ffffff}.navbar-inverse .navbar-nav>li>a{color:#ffffff}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#375a7f;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#ffffff;background-color:#00a379}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#aaaaaa;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#008966}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#008966}.navbar-inverse .navbar-toggle .icon-bar{background-color:#ffffff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#009871}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#00a379;color:#ffffff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#ffffff}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#375a7f;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#ffffff;background-color:#00a379}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#aaaaaa;background-color:transparent}}.navbar-inverse .navbar-link{color:#ffffff}.navbar-inverse .navbar-link:hover{color:#375a7f}.navbar-inverse .btn-link{color:#ffffff}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#375a7f}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#aaaaaa}.breadcrumb{padding:8px 15px;margin-bottom:21px;list-style:none;background-color:#464545;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ffffff}.breadcrumb>.active{color:#999999}.pagination{display:inline-block;padding-left:0;margin:21px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:10px 15px;line-height:1.42857143;text-decoration:none;color:#ffffff;background-color:#00bc8c;border:1px solid transparent;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{z-index:2;color:#ffffff;background-color:#00dba3;border-color:transparent}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:3;color:#ffffff;background-color:#00dba3;border-color:transparent;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#ffffff;background-color:#007053;border-color:transparent;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:18px 27px;font-size:19px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:6px 9px;font-size:13px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:21px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#00bc8c;border:1px solid transparent;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#00dba3}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#dddddd;background-color:#00bc8c;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#ffffff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#ffffff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#464545}.label-default[href]:hover,.label-default[href]:focus{background-color:#2c2c2c}.label-primary{background-color:#375a7f}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#28415b}.label-success{background-color:#00bc8c}.label-success[href]:hover,.label-success[href]:focus{background-color:#008966}.label-info{background-color:#3498db}.label-info[href]:hover,.label-info[href]:focus{background-color:#217dbb}.label-warning{background-color:#f39c12}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#c87f0a}.label-danger{background-color:#e74c3c}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#d62c1a}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:13px;font-weight:bold;color:#ffffff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#464545;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#375a7f;background-color:#ffffff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#303030}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:23px;font-weight:200}.jumbotron>hr{border-top-color:#161616}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px;padding-left:15px;padding-right:15px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:68px}}.thumbnail{display:block;padding:2px;margin-bottom:21px;line-height:1.42857143;background-color:#222222;border:1px solid #464545;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#0ce3ac}.thumbnail .caption{padding:9px;color:#ffffff}.alert{padding:15px;margin-bottom:21px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#00bc8c;border-color:#00bc8c;color:#ffffff}.alert-success hr{border-top-color:#00a379}.alert-success .alert-link{color:#e6e6e6}.alert-info{background-color:#3498db;border-color:#3498db;color:#ffffff}.alert-info hr{border-top-color:#258cd1}.alert-info .alert-link{color:#e6e6e6}.alert-warning{background-color:#f39c12;border-color:#f39c12;color:#ffffff}.alert-warning hr{border-top-color:#e08e0b}.alert-warning .alert-link{color:#e6e6e6}.alert-danger{background-color:#e74c3c;border-color:#e74c3c;color:#ffffff}.alert-danger hr{border-top-color:#e43725}.alert-danger .alert-link{color:#e6e6e6}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:21px;margin-bottom:21px;background-color:#ebebeb;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0%;height:100%;font-size:13px;line-height:21px;color:#ffffff;text-align:center;background-color:#375a7f;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#00bc8c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#3498db}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#f39c12}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#e74c3c}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#303030;border:1px solid #464545}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#0ce3ac}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#0bcb9a}a.list-group-item:hover,button.list-group-item:hover,a.list-group-item:focus,button.list-group-item:focus{text-decoration:none;color:#0ce3ac;background-color:transparent}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#ebebeb;color:#999999;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#999999}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#ffffff;background-color:#375a7f;border-color:#375a7f}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#a8c0da}.list-group-item-success{color:#ffffff;background-color:#00bc8c}a.list-group-item-success,button.list-group-item-success{color:#ffffff}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,button.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:focus{color:#ffffff;background-color:#00a379}a.list-group-item-success.active,button.list-group-item-success.active,a.list-group-item-success.active:hover,button.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-info{color:#ffffff;background-color:#3498db}a.list-group-item-info,button.list-group-item-info{color:#ffffff}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,button.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:focus{color:#ffffff;background-color:#258cd1}a.list-group-item-info.active,button.list-group-item-info.active,a.list-group-item-info.active:hover,button.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-warning{color:#ffffff;background-color:#f39c12}a.list-group-item-warning,button.list-group-item-warning{color:#ffffff}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,button.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:focus{color:#ffffff;background-color:#e08e0b}a.list-group-item-warning.active,button.list-group-item-warning.active,a.list-group-item-warning.active:hover,button.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-danger{color:#ffffff;background-color:#e74c3c}a.list-group-item-danger,button.list-group-item-danger{color:#ffffff}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,button.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:focus{color:#ffffff;background-color:#e43725}a.list-group-item-danger.active,button.list-group-item-danger.active,a.list-group-item-danger.active:hover,button.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active:focus{color:#fff;background-color:#ffffff;border-color:#ffffff}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:21px;background-color:#303030;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:17px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#464545;border-top:1px solid #464545;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #464545}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:21px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #464545}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #464545}.panel-default{border-color:#464545}.panel-default>.panel-heading{color:#ffffff;background-color:#303030;border-color:#464545}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#464545}.panel-default>.panel-heading .badge{color:#303030;background-color:#ffffff}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#464545}.panel-primary{border-color:#375a7f}.panel-primary>.panel-heading{color:#ffffff;background-color:#375a7f;border-color:#375a7f}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#375a7f}.panel-primary>.panel-heading .badge{color:#375a7f;background-color:#ffffff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#375a7f}.panel-success{border-color:#00bc8c}.panel-success>.panel-heading{color:#ffffff;background-color:#00bc8c;border-color:#00bc8c}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#00bc8c}.panel-success>.panel-heading .badge{color:#00bc8c;background-color:#ffffff}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#00bc8c}.panel-info{border-color:#3498db}.panel-info>.panel-heading{color:#ffffff;background-color:#3498db;border-color:#3498db}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#3498db}.panel-info>.panel-heading .badge{color:#3498db;background-color:#ffffff}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#3498db}.panel-warning{border-color:#f39c12}.panel-warning>.panel-heading{color:#ffffff;background-color:#f39c12;border-color:#f39c12}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#f39c12}.panel-warning>.panel-heading .badge{color:#f39c12;background-color:#ffffff}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#f39c12}.panel-danger{border-color:#e74c3c}.panel-danger>.panel-heading{color:#ffffff;background-color:#e74c3c;border-color:#e74c3c}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#e74c3c}.panel-danger>.panel-heading .badge{color:#e74c3c;background-color:#ffffff}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#e74c3c}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#303030;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:22.5px;font-weight:bold;line-height:1;color:#ffffff;text-shadow:none;opacity:0.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#ffffff;text-decoration:none;cursor:pointer;opacity:0.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#303030;border:1px solid #999999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);-webkit-background-clip:padding-box;background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:0.7;filter:alpha(opacity=70)}.modal-header{padding:15px;border-bottom:1px solid #464545}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{padding:20px;text-align:right;border-top:1px solid #464545}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:13px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:0.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#ffffff;text-align:center;background-color:#000000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Lato","Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:15px;background-color:#303030;-webkit-background-clip:padding-box;background-clip:padding-box;border:1px solid #999999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:15px;background-color:#282828;border-bottom:1px solid #1c1c1c;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#666666;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#303030}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#666666;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#303030}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#666666;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#303030}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#666666;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#303030;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform .6s ease-in-out;-o-transition:-o-transform .6s ease-in-out;transition:transform .6s ease-in-out;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:0.5;filter:alpha(opacity=50);font-size:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6);background-color:rgba(0,0,0,0)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.5)), to(rgba(0,0,0,0.0001)));background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-webkit-gradient(linear, left top, right top, from(rgba(0,0,0,0.0001)), to(rgba(0,0,0,0.5)));background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #ffffff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#ffffff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#ffffff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-header:before,.modal-header:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-header:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}.navbar{border-width:0}.navbar-default .badge{background-color:#fff;color:#375a7f}.navbar-inverse .badge{background-color:#fff;color:#00bc8c}.navbar-brand{line-height:1}.navbar-form .form-control{background-color:white}.navbar-form .form-control:focus{border-color:white}.btn{border-width:2px}.btn:active{-webkit-box-shadow:none;box-shadow:none}.btn-group.open .dropdown-toggle{-webkit-box-shadow:none;box-shadow:none}.text-primary,.text-primary:hover{color:#4673a3}.text-success,.text-success:hover{color:#00bc8c}.text-danger,.text-danger:hover{color:#e74c3c}.text-warning,.text-warning:hover{color:#f39c12}.text-info,.text-info:hover{color:#3498db}table a:not(.btn),.table a:not(.btn){text-decoration:underline}table .dropdown-menu a,.table .dropdown-menu a{text-decoration:none}table .success,.table .success,table .warning,.table .warning,table .danger,.table .danger,table .info,.table .info{color:#fff}table .success>th>a,.table .success>th>a,table .warning>th>a,.table .warning>th>a,table .danger>th>a,.table .danger>th>a,table .info>th>a,.table .info>th>a,table .success>td>a,.table .success>td>a,table .warning>td>a,.table .warning>td>a,table .danger>td>a,.table .danger>td>a,table .info>td>a,.table .info>td>a,table .success>a,.table .success>a,table .warning>a,.table .warning>a,table .danger>a,.table .danger>a,table .info>a,.table .info>a{color:#fff}table>thead>tr>th,.table>thead>tr>th,table>tbody>tr>th,.table>tbody>tr>th,table>tfoot>tr>th,.table>tfoot>tr>th,table>thead>tr>td,.table>thead>tr>td,table>tbody>tr>td,.table>tbody>tr>td,table>tfoot>tr>td,.table>tfoot>tr>td{border:none}table-bordered>thead>tr>th,.table-bordered>thead>tr>th,table-bordered>tbody>tr>th,.table-bordered>tbody>tr>th,table-bordered>tfoot>tr>th,.table-bordered>tfoot>tr>th,table-bordered>thead>tr>td,.table-bordered>thead>tr>td,table-bordered>tbody>tr>td,.table-bordered>tbody>tr>td,table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #464545}input,textarea{color:#464545}.form-control,input,textarea{border:2px hidden transparent;-webkit-box-shadow:none;box-shadow:none}.form-control:focus,input:focus,textarea:focus{-webkit-box-shadow:none;box-shadow:none}.form-control-feedback{color:#464545}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label,.has-warning .form-control-feedback{color:#f39c12}.has-warning .form-control,.has-warning .form-control:focus{-webkit-box-shadow:none;box-shadow:none}.has-warning .input-group-addon{border-color:#f39c12}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label,.has-error .form-control-feedback{color:#e74c3c}.has-error .form-control,.has-error .form-control:focus{-webkit-box-shadow:none;box-shadow:none}.has-error .input-group-addon{border-color:#e74c3c}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label,.has-success .form-control-feedback{color:#00bc8c}.has-success .form-control,.has-success .form-control:focus{-webkit-box-shadow:none;box-shadow:none}.has-success .input-group-addon{border-color:#00bc8c}.input-group-addon{color:#ffffff}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{border-color:#464545}.nav-tabs>li>a,.nav-pills>li>a{color:#fff}.pager a,.pager a:hover{color:#fff}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{background-color:#007053}.breadcrumb a{color:#fff}.close{text-decoration:none;text-shadow:none;opacity:0.4}.close:hover,.close:focus{opacity:1}.alert .alert-link{color:#fff;text-decoration:underline}.progress{height:10px;-webkit-box-shadow:none;box-shadow:none}.progress .progress-bar{font-size:10px;line-height:10px}.well{-webkit-box-shadow:none;box-shadow:none}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{border-color:#464545}a.list-group-item-success.active{background-color:#00bc8c}a.list-group-item-success.active:hover,a.list-group-item-success.active:focus{background-color:#00a379}a.list-group-item-warning.active{background-color:#f39c12}a.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus{background-color:#e08e0b}a.list-group-item-danger.active{background-color:#e74c3c}a.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus{background-color:#e43725}.popover{color:#ffffff}.panel-default>.panel-heading{background-color:#464545} \ No newline at end of file diff --git a/web/css/main.css b/web/css/main.css new file mode 100644 index 0000000..0362db7 --- /dev/null +++ b/web/css/main.css @@ -0,0 +1,24 @@ +*{ + margin: 0; + padding: 0; +} + +body{ + margin-top: 30px; +} + +.table-schedule>tr>td{ + text-align: center; +} + +.table-schedule .item>small{ + display: inline-block; +} + +.table-schedule .item>label{ + display: inline-block; +} + +.table-schedule .item{ + border-bottom: gray dotted 1px; +} \ No newline at end of file diff --git a/web/favicon.ico b/web/favicon.ico new file mode 100644 index 0000000..a843cc7 Binary files /dev/null and b/web/favicon.ico differ diff --git a/web/fonts/FontAwesome.otf b/web/fonts/FontAwesome.otf new file mode 100644 index 0000000..401ec0f Binary files /dev/null and b/web/fonts/FontAwesome.otf differ diff --git a/web/fonts/fontawesome-webfont.eot b/web/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000..e9f60ca Binary files /dev/null and b/web/fonts/fontawesome-webfont.eot differ diff --git a/web/fonts/fontawesome-webfont.svg b/web/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000..855c845 --- /dev/null +++ b/web/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/web/fonts/fontawesome-webfont.ttf b/web/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000..35acda2 Binary files /dev/null and b/web/fonts/fontawesome-webfont.ttf differ diff --git a/web/fonts/fontawesome-webfont.woff b/web/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000..400014a Binary files /dev/null and b/web/fonts/fontawesome-webfont.woff differ diff --git a/web/fonts/fontawesome-webfont.woff2 b/web/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000..4d13fc6 Binary files /dev/null and b/web/fonts/fontawesome-webfont.woff2 differ diff --git a/web/js/bootstrap-select.min.js b/web/js/bootstrap-select.min.js new file mode 100755 index 0000000..80f6556 --- /dev/null +++ b/web/js/bootstrap-select.min.js @@ -0,0 +1,9 @@ +/*! + * Bootstrap-select v1.12.2 (http://silviomoreto.github.io/bootstrap-select) + * + * Copyright 2013-2017 bootstrap-select + * Licensed under MIT (https://github.com/silviomoreto/bootstrap-select/blob/master/LICENSE) + */ +!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof module&&module.exports?module.exports=b(require("jquery")):b(a.jQuery)}(this,function(a){!function(a){"use strict";function b(b){var c=[{re:/[\xC0-\xC6]/g,ch:"A"},{re:/[\xE0-\xE6]/g,ch:"a"},{re:/[\xC8-\xCB]/g,ch:"E"},{re:/[\xE8-\xEB]/g,ch:"e"},{re:/[\xCC-\xCF]/g,ch:"I"},{re:/[\xEC-\xEF]/g,ch:"i"},{re:/[\xD2-\xD6]/g,ch:"O"},{re:/[\xF2-\xF6]/g,ch:"o"},{re:/[\xD9-\xDC]/g,ch:"U"},{re:/[\xF9-\xFC]/g,ch:"u"},{re:/[\xC7-\xE7]/g,ch:"c"},{re:/[\xD1]/g,ch:"N"},{re:/[\xF1]/g,ch:"n"}];return a.each(c,function(){b=b?b.replace(this.re,this.ch):""}),b}function c(b){var c=arguments,d=b;[].shift.apply(c);var e,f=this.each(function(){var b=a(this);if(b.is("select")){var f=b.data("selectpicker"),g="object"==typeof d&&d;if(f){if(g)for(var h in g)g.hasOwnProperty(h)&&(f.options[h]=g[h])}else{var i=a.extend({},k.DEFAULTS,a.fn.selectpicker.defaults||{},b.data(),g);i.template=a.extend({},k.DEFAULTS.template,a.fn.selectpicker.defaults?a.fn.selectpicker.defaults.template:{},b.data().template,g.template),b.data("selectpicker",f=new k(this,i))}"string"==typeof d&&(e=f[d]instanceof Function?f[d].apply(f,c):f.options[d])}});return"undefined"!=typeof e?e:f}String.prototype.includes||!function(){var a={}.toString,b=function(){try{var a={},b=Object.defineProperty,c=b(a,a,a)&&b}catch(a){}return c}(),c="".indexOf,d=function(b){if(null==this)throw new TypeError;var d=String(this);if(b&&"[object RegExp]"==a.call(b))throw new TypeError;var e=d.length,f=String(b),g=f.length,h=arguments.length>1?arguments[1]:void 0,i=h?Number(h):0;i!=i&&(i=0);var j=Math.min(Math.max(i,0),e);return!(g+j>e)&&c.call(d,f,i)!=-1};b?b(String.prototype,"includes",{value:d,configurable:!0,writable:!0}):String.prototype.includes=d}(),String.prototype.startsWith||!function(){var a=function(){try{var a={},b=Object.defineProperty,c=b(a,a,a)&&b}catch(a){}return c}(),b={}.toString,c=function(a){if(null==this)throw new TypeError;var c=String(this);if(a&&"[object RegExp]"==b.call(a))throw new TypeError;var d=c.length,e=String(a),f=e.length,g=arguments.length>1?arguments[1]:void 0,h=g?Number(g):0;h!=h&&(h=0);var i=Math.min(Math.max(h,0),d);if(f+i>d)return!1;for(var j=-1;++j":">",'"':""","'":"'","`":"`"},g={"&":"&","<":"<",">":">",""":'"',"'":"'","`":"`"},h=function(a){var b=function(b){return a[b]},c="(?:"+Object.keys(a).join("|")+")",d=RegExp(c),e=RegExp(c,"g");return function(a){return a=null==a?"":""+a,d.test(a)?a.replace(e,b):a}},i=h(f),j=h(g),k=function(b,c){d.useDefault||(a.valHooks.select.set=d._set,d.useDefault=!0),this.$element=a(b),this.$newElement=null,this.$button=null,this.$menu=null,this.$lis=null,this.options=c,null===this.options.title&&(this.options.title=this.$element.attr("title"));var e=this.options.windowPadding;"number"==typeof e&&(this.options.windowPadding=[e,e,e,e]),this.val=k.prototype.val,this.render=k.prototype.render,this.refresh=k.prototype.refresh,this.setStyle=k.prototype.setStyle,this.selectAll=k.prototype.selectAll,this.deselectAll=k.prototype.deselectAll,this.destroy=k.prototype.destroy,this.remove=k.prototype.remove,this.show=k.prototype.show,this.hide=k.prototype.hide,this.init()};k.VERSION="1.12.2",k.DEFAULTS={noneSelectedText:"Nothing selected",noneResultsText:"No results matched {0}",countSelectedText:function(a,b){return 1==a?"{0} item selected":"{0} items selected"},maxOptionsText:function(a,b){return[1==a?"Limit reached ({n} item max)":"Limit reached ({n} items max)",1==b?"Group limit reached ({n} item max)":"Group limit reached ({n} items max)"]},selectAllText:"Select All",deselectAllText:"Deselect All",doneButton:!1,doneButtonText:"Close",multipleSeparator:", ",styleBase:"btn",style:"btn-default",size:"auto",title:null,selectedTextFormat:"values",width:!1,container:!1,hideDisabled:!1,showSubtext:!1,showIcon:!0,showContent:!0,dropupAuto:!0,header:!1,liveSearch:!1,liveSearchPlaceholder:null,liveSearchNormalize:!1,liveSearchStyle:"contains",actionsBox:!1,iconBase:"glyphicon",tickIcon:"glyphicon-ok",showTick:!1,template:{caret:''},maxOptions:!1,mobile:!1,selectOnTab:!1,dropdownAlignRight:!1,windowPadding:0},k.prototype={constructor:k,init:function(){var b=this,c=this.$element.attr("id");this.$element.addClass("bs-select-hidden"),this.liObj={},this.multiple=this.$element.prop("multiple"),this.autofocus=this.$element.prop("autofocus"),this.$newElement=this.createView(),this.$element.after(this.$newElement).appendTo(this.$newElement),this.$button=this.$newElement.children("button"),this.$menu=this.$newElement.children(".dropdown-menu"),this.$menuInner=this.$menu.children(".inner"),this.$searchbox=this.$menu.find("input"),this.$element.removeClass("bs-select-hidden"),this.options.dropdownAlignRight===!0&&this.$menu.addClass("dropdown-menu-right"),"undefined"!=typeof c&&(this.$button.attr("data-id",c),a('label[for="'+c+'"]').click(function(a){a.preventDefault(),b.$button.focus()})),this.checkDisabled(),this.clickListener(),this.options.liveSearch&&this.liveSearchListener(),this.render(),this.setStyle(),this.setWidth(),this.options.container&&this.selectPosition(),this.$menu.data("this",this),this.$newElement.data("this",this),this.options.mobile&&this.mobile(),this.$newElement.on({"hide.bs.dropdown":function(a){b.$menuInner.attr("aria-expanded",!1),b.$element.trigger("hide.bs.select",a)},"hidden.bs.dropdown":function(a){b.$element.trigger("hidden.bs.select",a)},"show.bs.dropdown":function(a){b.$menuInner.attr("aria-expanded",!0),b.$element.trigger("show.bs.select",a)},"shown.bs.dropdown":function(a){b.$element.trigger("shown.bs.select",a)}}),b.$element[0].hasAttribute("required")&&this.$element.on("invalid",function(){b.$button.addClass("bs-invalid").focus(),b.$element.on({"focus.bs.select":function(){b.$button.focus(),b.$element.off("focus.bs.select")},"shown.bs.select":function(){b.$element.val(b.$element.val()).off("shown.bs.select")},"rendered.bs.select":function(){this.validity.valid&&b.$button.removeClass("bs-invalid"),b.$element.off("rendered.bs.select")}})}),setTimeout(function(){b.$element.trigger("loaded.bs.select")})},createDropdown:function(){var b=this.multiple||this.options.showTick?" show-tick":"",c=this.$element.parent().hasClass("input-group")?" input-group-btn":"",d=this.autofocus?" autofocus":"",e=this.options.header?'
'+this.options.header+"
":"",f=this.options.liveSearch?'':"",g=this.multiple&&this.options.actionsBox?'
":"",h=this.multiple&&this.options.doneButton?'
":"",j='
";return a(j)},createView:function(){var a=this.createDropdown(),b=this.createLi();return a.find("ul")[0].innerHTML=b,a},reloadLi:function(){var a=this.createLi();this.$menuInner[0].innerHTML=a},createLi:function(){var c=this,d=[],e=0,f=document.createElement("option"),g=-1,h=function(a,b,c,d){return""+a+""},j=function(d,e,f,g){return''+d+''};if(this.options.title&&!this.multiple&&(g--,!this.$element.find(".bs-title-option").length)){var k=this.$element[0];f.className="bs-title-option",f.innerHTML=this.options.title,f.value="",k.insertBefore(f,k.firstChild);var l=a(k.options[k.selectedIndex]);void 0===l.attr("selected")&&void 0===this.$element.data("selected")&&(f.selected=!0)}return this.$element.find("option").each(function(b){var f=a(this);if(g++,!f.hasClass("bs-title-option")){var k=this.className||"",l=this.style.cssText,m=f.data("content")?f.data("content"):f.html(),n=f.data("tokens")?f.data("tokens"):null,o="undefined"!=typeof f.data("subtext")?''+f.data("subtext")+"":"",p="undefined"!=typeof f.data("icon")?' ':"",q=f.parent(),r="OPTGROUP"===q[0].tagName,s=r&&q[0].disabled,t=this.disabled||s;if(""!==p&&t&&(p=""+p+""),c.options.hideDisabled&&(t&&!r||s))return void g--;if(f.data("content")||(m=p+''+m+o+""),r&&f.data("divider")!==!0){if(c.options.hideDisabled&&t){if(void 0===q.data("allOptionsDisabled")){var u=q.children();q.data("allOptionsDisabled",u.filter(":disabled").length===u.length)}if(q.data("allOptionsDisabled"))return void g--}var v=" "+q[0].className||"";if(0===f.index()){e+=1;var w=q[0].label,x="undefined"!=typeof q.data("subtext")?''+q.data("subtext")+"":"",y=q.data("icon")?' ':"";w=y+''+i(w)+x+"",0!==b&&d.length>0&&(g++,d.push(h("",null,"divider",e+"div"))),g++,d.push(h(w,null,"dropdown-header"+v,e))}if(c.options.hideDisabled&&t)return void g--;d.push(h(j(m,"opt "+k+v,l,n),b,"",e))}else if(f.data("divider")===!0)d.push(h("",b,"divider"));else if(f.data("hidden")===!0)d.push(h(j(m,k,l,n),b,"hidden is-hidden"));else{var z=this.previousElementSibling&&"OPTGROUP"===this.previousElementSibling.tagName;if(!z&&c.options.hideDisabled)for(var A=a(this).prevAll(),B=0;B ':"";return b=d.options.showSubtext&&c.data("subtext")&&!d.multiple?' '+c.data("subtext")+"":"","undefined"!=typeof c.attr("title")?c.attr("title"):c.data("content")&&d.options.showContent?c.data("content").toString():e+c.html()+b}}).toArray(),f=this.multiple?e.join(this.options.multipleSeparator):e[0];if(this.multiple&&this.options.selectedTextFormat.indexOf("count")>-1){var g=this.options.selectedTextFormat.split(">");if(g.length>1&&e.length>g[1]||1==g.length&&e.length>=2){c=this.options.hideDisabled?", [disabled]":"";var h=this.$element.find("option").not('[data-divider="true"], [data-hidden="true"]'+c).length,i="function"==typeof this.options.countSelectedText?this.options.countSelectedText(e.length,h):this.options.countSelectedText;f=i.replace("{0}",e.length.toString()).replace("{1}",h.toString())}}void 0==this.options.title&&(this.options.title=this.$element.attr("title")),"static"==this.options.selectedTextFormat&&(f=this.options.title),f||(f="undefined"!=typeof this.options.title?this.options.title:this.options.noneSelectedText),this.$button.attr("title",j(a.trim(f.replace(/<[^>]*>?/g,"")))),this.$button.children(".filter-option").html(f),this.$element.trigger("rendered.bs.select")},setStyle:function(a,b){this.$element.attr("class")&&this.$newElement.addClass(this.$element.attr("class").replace(/selectpicker|mobile-device|bs-select-hidden|validate\[.*\]/gi,""));var c=a?a:this.options.style;"add"==b?this.$button.addClass(c):"remove"==b?this.$button.removeClass(c):(this.$button.removeClass(this.options.style),this.$button.addClass(c))},liHeight:function(b){if(b||this.options.size!==!1&&!this.sizeInfo){var c=document.createElement("div"),d=document.createElement("div"),e=document.createElement("ul"),f=document.createElement("li"),g=document.createElement("li"),h=document.createElement("a"),i=document.createElement("span"),j=this.options.header&&this.$menu.find(".popover-title").length>0?this.$menu.find(".popover-title")[0].cloneNode(!0):null,k=this.options.liveSearch?document.createElement("div"):null,l=this.options.actionsBox&&this.multiple&&this.$menu.find(".bs-actionsbox").length>0?this.$menu.find(".bs-actionsbox")[0].cloneNode(!0):null,m=this.options.doneButton&&this.multiple&&this.$menu.find(".bs-donebutton").length>0?this.$menu.find(".bs-donebutton")[0].cloneNode(!0):null;if(i.className="text",c.className=this.$menu[0].parentNode.className+" open",d.className="dropdown-menu open",e.className="dropdown-menu inner",f.className="divider",i.appendChild(document.createTextNode("Inner text")),h.appendChild(i),g.appendChild(h),e.appendChild(g),e.appendChild(f),j&&d.appendChild(j),k){var n=document.createElement("input");k.className="bs-searchbox",n.className="form-control",k.appendChild(n),d.appendChild(k)}l&&d.appendChild(l),d.appendChild(e),m&&d.appendChild(m),c.appendChild(d),document.body.appendChild(c);var o=h.offsetHeight,p=j?j.offsetHeight:0,q=k?k.offsetHeight:0,r=l?l.offsetHeight:0,s=m?m.offsetHeight:0,t=a(f).outerHeight(!0),u="function"==typeof getComputedStyle&&getComputedStyle(d),v=u?null:a(d),w={vert:parseInt(u?u.paddingTop:v.css("paddingTop"))+parseInt(u?u.paddingBottom:v.css("paddingBottom"))+parseInt(u?u.borderTopWidth:v.css("borderTopWidth"))+parseInt(u?u.borderBottomWidth:v.css("borderBottomWidth")),horiz:parseInt(u?u.paddingLeft:v.css("paddingLeft"))+parseInt(u?u.paddingRight:v.css("paddingRight"))+parseInt(u?u.borderLeftWidth:v.css("borderLeftWidth"))+parseInt(u?u.borderRightWidth:v.css("borderRightWidth"))},x={vert:w.vert+parseInt(u?u.marginTop:v.css("marginTop"))+parseInt(u?u.marginBottom:v.css("marginBottom"))+2,horiz:w.horiz+parseInt(u?u.marginLeft:v.css("marginLeft"))+parseInt(u?u.marginRight:v.css("marginRight"))+2};document.body.removeChild(c),this.sizeInfo={liHeight:o,headerHeight:p,searchHeight:q,actionsHeight:r,doneButtonHeight:s,dividerHeight:t,menuPadding:w,menuExtras:x}}},setSize:function(){if(this.findLis(),this.liHeight(),this.options.header&&this.$menu.css("padding-top",0),this.options.size!==!1){var b,c,d,e,f,g,h,i,j=this,k=this.$menu,l=this.$menuInner,m=a(window),n=this.$newElement[0].offsetHeight,o=this.$newElement[0].offsetWidth,p=this.sizeInfo.liHeight,q=this.sizeInfo.headerHeight,r=this.sizeInfo.searchHeight,s=this.sizeInfo.actionsHeight,t=this.sizeInfo.doneButtonHeight,u=this.sizeInfo.dividerHeight,v=this.sizeInfo.menuPadding,w=this.sizeInfo.menuExtras,x=this.options.hideDisabled?".disabled":"",y=function(){var b,c=j.$newElement.offset(),d=a(j.options.container);j.options.container&&!d.is("body")?(b=d.offset(),b.top+=parseInt(d.css("borderTopWidth")),b.left+=parseInt(d.css("borderLeftWidth"))):b={top:0,left:0};var e=j.options.windowPadding;f=c.top-b.top-m.scrollTop(),g=m.height()-f-n-b.top-e[2],h=c.left-b.left-m.scrollLeft(),i=m.width()-h-o-b.left-e[1],f-=e[0],h-=e[3]};if(y(),"auto"===this.options.size){var z=function(){var m,n=function(b,c){return function(d){return c?d.classList?d.classList.contains(b):a(d).hasClass(b):!(d.classList?d.classList.contains(b):a(d).hasClass(b))}},u=j.$menuInner[0].getElementsByTagName("li"),x=Array.prototype.filter?Array.prototype.filter.call(u,n("hidden",!1)):j.$lis.not(".hidden"),z=Array.prototype.filter?Array.prototype.filter.call(x,n("dropdown-header",!0)):x.filter(".dropdown-header");y(),b=g-w.vert,c=i-w.horiz,j.options.container?(k.data("height")||k.data("height",k.height()),d=k.data("height"),k.data("width")||k.data("width",k.width()),e=k.data("width")):(d=k.height(),e=k.width()),j.options.dropupAuto&&j.$newElement.toggleClass("dropup",f>g&&b-w.verti&&c-w.horiz3?3*p+w.vert-2:0,k.css({"max-height":b+"px",overflow:"hidden","min-height":m+q+r+s+t+"px"}),l.css({"max-height":b-q-r-s-t-v.vert+"px","overflow-y":"auto","min-height":Math.max(m-v.vert,0)+"px"})};z(),this.$searchbox.off("input.getSize propertychange.getSize").on("input.getSize propertychange.getSize",z),m.off("resize.getSize scroll.getSize").on("resize.getSize scroll.getSize",z)}else if(this.options.size&&"auto"!=this.options.size&&this.$lis.not(x).length>this.options.size){var A=this.$lis.not(".divider").not(x).children().slice(0,this.options.size).last().parent().index(),B=this.$lis.slice(0,A+1).filter(".divider").length;b=p*this.options.size+B*u+v.vert,j.options.container?(k.data("height")||k.data("height",k.height()),d=k.data("height")):d=k.height(),j.options.dropupAuto&&this.$newElement.toggleClass("dropup",f>g&&b-w.vert');var b,c,d,e=this,f=a(this.options.container),g=function(a){e.$bsContainer.addClass(a.attr("class").replace(/form-control|fit-width/gi,"")).toggleClass("dropup",a.hasClass("dropup")),b=a.offset(),f.is("body")?c={top:0,left:0}:(c=f.offset(),c.top+=parseInt(f.css("borderTopWidth"))-f.scrollTop(),c.left+=parseInt(f.css("borderLeftWidth"))-f.scrollLeft()),d=a.hasClass("dropup")?0:a[0].offsetHeight,e.$bsContainer.css({top:b.top-c.top+d,left:b.left-c.left,width:a[0].offsetWidth})};this.$button.on("click",function(){var b=a(this);e.isDisabled()||(g(e.$newElement),e.$bsContainer.appendTo(e.options.container).toggleClass("open",!b.hasClass("open")).append(e.$menu))}),a(window).on("resize scroll",function(){g(e.$newElement)}),this.$element.on("hide.bs.select",function(){e.$menu.data("height",e.$menu.height()),e.$bsContainer.detach()})},setSelected:function(a,b,c){c||(this.togglePlaceholder(),c=this.findLis().eq(this.liObj[a])),c.toggleClass("selected",b).find("a").attr("aria-selected",b)},setDisabled:function(a,b,c){c||(c=this.findLis().eq(this.liObj[a])),b?c.addClass("disabled").children("a").attr("href","#").attr("tabindex",-1).attr("aria-disabled",!0):c.removeClass("disabled").children("a").removeAttr("href").attr("tabindex",0).attr("aria-disabled",!1)},isDisabled:function(){return this.$element[0].disabled},checkDisabled:function(){var a=this;this.isDisabled()?(this.$newElement.addClass("disabled"),this.$button.addClass("disabled").attr("tabindex",-1).attr("aria-disabled",!0)):(this.$button.hasClass("disabled")&&(this.$newElement.removeClass("disabled"),this.$button.removeClass("disabled").attr("aria-disabled",!1)),this.$button.attr("tabindex")!=-1||this.$element.data("tabindex")||this.$button.removeAttr("tabindex")),this.$button.click(function(){return!a.isDisabled()})},togglePlaceholder:function(){var a=this.$element.val();this.$button.toggleClass("bs-placeholder",null===a||""===a||a.constructor===Array&&0===a.length)},tabIndex:function(){this.$element.data("tabindex")!==this.$element.attr("tabindex")&&this.$element.attr("tabindex")!==-98&&"-98"!==this.$element.attr("tabindex")&&(this.$element.data("tabindex",this.$element.attr("tabindex")),this.$button.attr("tabindex",this.$element.data("tabindex"))),this.$element.attr("tabindex",-98)},clickListener:function(){var b=this,c=a(document);c.data("spaceSelect",!1),this.$button.on("keyup",function(a){/(32)/.test(a.keyCode.toString(10))&&c.data("spaceSelect")&&(a.preventDefault(),c.data("spaceSelect",!1))}),this.$button.on("click",function(){b.setSize()}),this.$element.on("shown.bs.select",function(){if(b.options.liveSearch||b.multiple){if(!b.multiple){var a=b.liObj[b.$element[0].selectedIndex];if("number"!=typeof a||b.options.size===!1)return;var c=b.$lis.eq(a)[0].offsetTop-b.$menuInner[0].offsetTop;c=c-b.$menuInner[0].offsetHeight/2+b.sizeInfo.liHeight/2,b.$menuInner[0].scrollTop=c}}else b.$menuInner.find(".selected a").focus()}),this.$menuInner.on("click","li a",function(c){var d=a(this),f=d.parent().data("originalIndex"),g=b.$element.val(),h=b.$element.prop("selectedIndex"),i=!0;if(b.multiple&&1!==b.options.maxOptions&&c.stopPropagation(),c.preventDefault(),!b.isDisabled()&&!d.parent().hasClass("disabled")){var j=b.$element.find("option"),k=j.eq(f),l=k.prop("selected"),m=k.parent("optgroup"),n=b.options.maxOptions,o=m.data("maxOptions")||!1;if(b.multiple){if(k.prop("selected",!l),b.setSelected(f,!l),d.blur(),n!==!1||o!==!1){var p=n');t[2]&&(u=u.replace("{var}",t[2][n>1?0:1]),v=v.replace("{var}",t[2][o>1?0:1])),k.prop("selected",!1),b.$menu.append(w),n&&p&&(w.append(a("
"+u+"
")),i=!1,b.$element.trigger("maxReached.bs.select")),o&&q&&(w.append(a("
"+v+"
")),i=!1,b.$element.trigger("maxReachedGrp.bs.select")),setTimeout(function(){b.setSelected(f,!1)},10),w.delay(750).fadeOut(300,function(){a(this).remove()})}}}else j.prop("selected",!1),k.prop("selected",!0),b.$menuInner.find(".selected").removeClass("selected").find("a").attr("aria-selected",!1),b.setSelected(f,!0);!b.multiple||b.multiple&&1===b.options.maxOptions?b.$button.focus():b.options.liveSearch&&b.$searchbox.focus(),i&&(g!=b.$element.val()&&b.multiple||h!=b.$element.prop("selectedIndex")&&!b.multiple)&&(e=[f,k.prop("selected"),l],b.$element.triggerNative("change"))}}),this.$menu.on("click","li.disabled a, .popover-title, .popover-title :not(.close)",function(c){c.currentTarget==this&&(c.preventDefault(),c.stopPropagation(),b.options.liveSearch&&!a(c.target).hasClass("close")?b.$searchbox.focus():b.$button.focus())}),this.$menuInner.on("click",".divider, .dropdown-header",function(a){a.preventDefault(),a.stopPropagation(),b.options.liveSearch?b.$searchbox.focus():b.$button.focus()}),this.$menu.on("click",".popover-title .close",function(){b.$button.click()}),this.$searchbox.on("click",function(a){a.stopPropagation()}),this.$menu.on("click",".actions-btn",function(c){b.options.liveSearch?b.$searchbox.focus():b.$button.focus(),c.preventDefault(),c.stopPropagation(),a(this).hasClass("bs-select-all")?b.selectAll():b.deselectAll()}),this.$element.change(function(){b.render(!1),b.$element.trigger("changed.bs.select",e),e=null})},liveSearchListener:function(){var c=this,d=a('
  • ');this.$button.on("click.dropdown.data-api",function(){c.$menuInner.find(".active").removeClass("active"),c.$searchbox.val()&&(c.$searchbox.val(""),c.$lis.not(".is-hidden").removeClass("hidden"),d.parent().length&&d.remove()),c.multiple||c.$menuInner.find(".selected").addClass("active"),setTimeout(function(){c.$searchbox.focus()},10)}),this.$searchbox.on("click.dropdown.data-api focus.dropdown.data-api touchend.dropdown.data-api",function(a){a.stopPropagation()}),this.$searchbox.on("input propertychange",function(){if(c.$lis.not(".is-hidden").removeClass("hidden"),c.$lis.filter(".active").removeClass("active"),d.remove(),c.$searchbox.val()){var e,f=c.$lis.not(".is-hidden, .divider, .dropdown-header");if(e=c.options.liveSearchNormalize?f.find("a").not(":a"+c._searchStyle()+'("'+b(c.$searchbox.val())+'")'):f.find("a").not(":"+c._searchStyle()+'("'+c.$searchbox.val()+'")'),e.length===f.length)d.html(c.options.noneResultsText.replace("{0}",'"'+i(c.$searchbox.val())+'"')),c.$menuInner.append(d),c.$lis.addClass("hidden");else{e.parent().addClass("hidden");var g,h=c.$lis.not(".hidden");h.each(function(b){var c=a(this);c.hasClass("divider")?void 0===g?c.addClass("hidden"):(g&&g.addClass("hidden"),g=c):c.hasClass("dropdown-header")&&h.eq(b+1).data("optgroup")!==c.data("optgroup")?c.addClass("hidden"):g=null}),g&&g.addClass("hidden"),f.not(".hidden").first().addClass("active")}}})},_searchStyle:function(){var a={begins:"ibegins",startsWith:"ibegins"};return a[this.options.liveSearchStyle]||"icontains"},val:function(a){return"undefined"!=typeof a?(this.$element.val(a),this.render(),this.$element):this.$element.val()},changeAll:function(b){if(this.multiple){"undefined"==typeof b&&(b=!0),this.findLis();var c=this.$element.find("option"),d=this.$lis.not(".divider, .dropdown-header, .disabled, .hidden"),e=d.length,f=[];if(b){if(d.filter(".selected").length===d.length)return}else if(0===d.filter(".selected").length)return;d.toggleClass("selected",b);for(var g=0;g=48&&c.keyCode<=57||c.keyCode>=96&&c.keyCode<=105||c.keyCode>=65&&c.keyCode<=90))return o.options.container?o.$button.trigger("click"):(o.setSize(),o.$menu.parent().addClass("open"),l=!0),void o.$searchbox.focus();if(o.options.liveSearch&&(/(^9$|27)/.test(c.keyCode.toString(10))&&l&&(c.preventDefault(),c.stopPropagation(),o.$menuInner.click(),o.$button.focus()),d=a('[role="listbox"] li'+p,n),m.val()||/(38|40)/.test(c.keyCode.toString(10))||0===d.filter(".active").length&&(d=o.$menuInner.find("li"),d=o.options.liveSearchNormalize?d.filter(":a"+o._searchStyle()+"("+b(q[c.keyCode])+")"):d.filter(":"+o._searchStyle()+"("+q[c.keyCode]+")"))),d.length){if(/(38|40)/.test(c.keyCode.toString(10)))e=d.index(d.find("a").filter(":focus").parent()),g=d.filter(p).first().index(),h=d.filter(p).last().index(),f=d.eq(e).nextAll(p).eq(0).index(),i=d.eq(e).prevAll(p).eq(0).index(),j=d.eq(f).prevAll(p).eq(0).index(),o.options.liveSearch&&(d.each(function(b){a(this).hasClass("disabled")||a(this).data("index",b)}),e=d.index(d.filter(".active")),g=d.first().data("index"),h=d.last().data("index"),f=d.eq(e).nextAll().eq(0).data("index"),i=d.eq(e).prevAll().eq(0).data("index"),j=d.eq(f).prevAll().eq(0).data("index")),k=m.data("prevIndex"),38==c.keyCode?(o.options.liveSearch&&e--,e!=j&&e>i&&(e=i),eh&&(e=h),e==k&&(e=g)),m.data("prevIndex",e),o.options.liveSearch?(c.preventDefault(),m.hasClass("dropdown-toggle")||(d.removeClass("active").eq(e).addClass("active").children("a").focus(),m.focus())):d.eq(e).children("a").focus();else if(!m.is("input")){var r,s,t=[];d.each(function(){a(this).hasClass("disabled")||a.trim(a(this).children("a").text().toLowerCase()).substring(0,1)==q[c.keyCode]&&t.push(a(this).index())}),r=a(document).data("keycount"),r++,a(document).data("keycount",r),s=a.trim(a(":focus").text().toLowerCase()).substring(0,1),s!=q[c.keyCode]?(r=1,a(document).data("keycount",r)):r>=t.length&&(a(document).data("keycount",0),r>t.length&&(r=1)),d.eq(t[r-1]).children("a").focus()}if((/(13|32)/.test(c.keyCode.toString(10))||/(^9$)/.test(c.keyCode.toString(10))&&o.options.selectOnTab)&&l){if(/(32)/.test(c.keyCode.toString(10))||c.preventDefault(),o.options.liveSearch)/(32)/.test(c.keyCode.toString(10))||(o.$menuInner.find(".active a").click(), +m.focus());else{var u=a(":focus");u.click(),u.focus(),c.preventDefault(),a(document).data("spaceSelect",!0)}a(document).data("keycount",0)}(/(^9$|27)/.test(c.keyCode.toString(10))&&l&&(o.multiple||o.options.liveSearch)||/(27)/.test(c.keyCode.toString(10))&&!l)&&(o.$menu.parent().removeClass("open"),o.options.container&&o.$newElement.removeClass("open"),o.$button.focus())}},mobile:function(){this.$element.addClass("mobile-device")},refresh:function(){this.$lis=null,this.liObj={},this.reloadLi(),this.render(),this.checkDisabled(),this.liHeight(!0),this.setStyle(),this.setWidth(),this.$lis&&this.$searchbox.trigger("propertychange"),this.$element.trigger("refreshed.bs.select")},hide:function(){this.$newElement.hide()},show:function(){this.$newElement.show()},remove:function(){this.$newElement.remove(),this.$element.remove()},destroy:function(){this.$newElement.before(this.$element).remove(),this.$bsContainer?this.$bsContainer.remove():this.$menu.remove(),this.$element.off(".bs.select").removeData("selectpicker").removeClass("bs-select-hidden selectpicker")}};var l=a.fn.selectpicker;a.fn.selectpicker=c,a.fn.selectpicker.Constructor=k,a.fn.selectpicker.noConflict=function(){return a.fn.selectpicker=l,this},a(document).data("keycount",0).on("keydown.bs.select",'.bootstrap-select [data-toggle=dropdown], .bootstrap-select [role="listbox"], .bs-searchbox input',k.prototype.keydown).on("focusin.modal",'.bootstrap-select [data-toggle=dropdown], .bootstrap-select [role="listbox"], .bs-searchbox input',function(a){a.stopPropagation()}),a(window).on("load.bs.select.data-api",function(){a(".selectpicker").each(function(){var b=a(this);c.call(b,b.data())})})}(a)}); +//# sourceMappingURL=bootstrap-select.js.map \ No newline at end of file