diff --git a/.idea/.rakeTasks b/.idea/.rakeTasks
new file mode 100644
index 000000000..6be95750b
--- /dev/null
+++ b/.idea/.rakeTasks
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
../ +HTTPClient/ 01-Nov-2005 05:03 - +abbot/ 28-Sep-2015 06:18 - +acegisecurity/ 23-Dec-2005 12:20 - +activation/ 21-Dec-2005 15:37 - +activecluster/ 01-Nov-2005 05:09 - +activeio/ 01-Nov-2005 05:10 - +activemq/ 01-Nov-2005 05:13 - +activemq-jaxb/ 01-Nov-2005 05:11 - +activesoap/ 01-Nov-2005 05:20 - +activespace/ 01-Nov-2005 05:04 - +adarwin/ 01-Nov-2005 05:03 - +ae/ 06-Apr-2015 06:14 - +aelfred/ 01-Nov-2005 05:03 - +aero/ 01-Aug-2014 14:03 - +ai/ 28-Nov-2016 07:10 - +aislib/ 01-Nov-2005 05:14 - +al/ 21-Nov-2016 13:18 - +altrmi/ 01-Nov-2005 05:14 - +am/ 21-Nov-2016 13:19 - +andromda/ 01-Nov-2005 05:19 - +annogen/ 01-Nov-2005 05:19 - +ant/ 01-Nov-2005 05:17 - +ant-contrib/ 08-Aug-2008 22:17 - +ant-doxygen/ 01-Nov-2005 05:04 - +ant4eclipse/ 21-Aug-2011 11:53 - +antlr/ 01-Nov-2005 05:12 - +anttex/ 01-Nov-2005 05:19 - +aopalliance/ 28-Oct-2005 01:26 - +apache-jaxme/ 01-Nov-2005 05:10 - +aptconvert/ 01-Nov-2005 05:07 - +ar/ 06-Mar-2008 17:19 - +args4j/ 16-Mar-2013 07:01 - +as/ 25-May-2015 06:15 - +ashkay/ 01-Nov-2005 05:13 - +ashkelon/ 01-Nov-2005 05:20 - +asia/ 23-Feb-2013 08:01 - +asm/ 07-Jul-2009 04:08 - +aspectj/ 21-Dec-2005 12:23 - +aspectwerkz/ 01-Nov-2005 05:09 - +at/ 28-Nov-2016 07:12 - +au/ 12-Oct-2015 07:37 - +avalon/ 19-Oct-2006 19:23 - +avalon-activation/ 01-Nov-2005 05:20 - +avalon-apps/ 01-Nov-2005 05:14 - +avalon-composition/ 01-Nov-2005 05:13 - +avalon-cornerstone/ 01-Nov-2005 05:02 - +avalon-extension/ 01-Nov-2005 05:09 - +avalon-framework/ 01-Nov-2005 05:15 - +avalon-http/ 18-Jul-2006 18:10 - +avalon-logging/ 01-Nov-2005 05:19 - +avalon-logkit/ 01-Nov-2005 05:11 - +avalon-meta/ 01-Nov-2005 05:05 - +avalon-phoenix/ 01-Nov-2005 05:10 - +avalon-repository/ 01-Nov-2005 05:10 - +avalon-util/ 01-Nov-2005 05:12 - +axion/ 01-Nov-2005 05:20 - +axis/ 19-Oct-2006 19:23 - +axis2/ 04-May-2006 20:31 - +azote/ 01-Nov-2005 05:14 - +ba/ 29-Jun-2015 06:17 - +backport-util-concurrent/ 20-Feb-2008 05:30 - +backport175/ 01-Nov-2005 05:07 - +band/ 21-Nov-2016 13:41 - +barsuift/ 21-Aug-2011 11:54 - +batik/ 01-Nov-2005 05:09 - +bcel/ 28-Oct-2005 01:26 - +be/ 21-Nov-2016 13:41 - +beehive/ 01-Nov-2005 05:10 - +berkano/ 01-Nov-2005 05:14 - +berkeleydb/ 01-Nov-2005 05:06 - +binky/ 26-Feb-2010 19:31 - +biz/ 14-Mar-2016 06:15 - +black/ 01-Jun-2015 06:20 - +blissed/ 01-Nov-2005 05:04 - +boo/ 06-Nov-2006 01:04 - +bouncycastle/ 03-Sep-2009 13:30 - +boxstuff/ 01-Nov-2005 05:12 - +br/ 21-Nov-2016 13:45 - +bsf/ 01-Nov-2005 05:03 - +bsh/ 01-Nov-2005 05:03 - +burlap/ 01-Nov-2005 05:03 - +by/ 12-Jan-2015 07:18 - +bz/ 01-Aug-2014 14:08 - +c10n/ 09-Mar-2013 08:02 - +c3p0/ 01-Nov-2005 05:06 - +ca/ 21-Nov-2016 13:53 - +cactus/ 11-Apr-2008 19:59 - +cargo/ 01-Nov-2005 05:07 - +cas/ 22-Jun-2006 17:05 - +castor/ 06-Dec-2007 02:46 - +cat/ 21-Nov-2016 14:02 - +cc/ 21-Nov-2016 14:02 - +cd/ 05-Jan-2015 07:18 - +cewolf/ 01-Nov-2005 05:04 - +cf/ 01-Aug-2014 14:11 - +cglib/ 29-Feb-2016 07:17 - +ch/ 21-Nov-2016 14:07 - +charlotte/ 01-Nov-2005 05:04 - +checkstyle/ 28-Oct-2005 01:27 - +cl/ 06-Jul-2015 06:24 - +classworlds/ 01-Nov-2005 05:10 - +clickstream/ 24-Nov-2005 06:03 - +clirr/ 01-Nov-2005 05:04 - +cloud/ 21-Nov-2016 14:20 - +clover/ 01-Nov-2005 05:11 - +cm/ 21-Nov-2016 14:20 - +cmsdeploy/ 06-Dec-2005 20:10 - +cn/ 28-Nov-2016 07:25 - +co/ 21-Nov-2016 14:24 - +cobertura/ 06-Feb-2006 21:04 - +coconut/ 01-Nov-2005 05:21 - +cocoon/ 09-Jun-2008 20:01 - +code/ 21-Aug-2011 11:56 - +code316/ 01-Nov-2005 05:03 - +codehaus/ 16-Jul-2008 22:44 - +codes/ 01-Jun-2015 06:28 - +colt/ 01-Nov-2005 05:03 - +com/ 28-Nov-2016 07:29 - +commons-attributes/ 03-Jul-2006 21:30 - +commons-beanutils/ 01-Dec-2012 08:50 - +commons-betwixt/ 01-Nov-2005 05:13 - +commons-chain/ 01-Jun-2008 18:20 - +commons-cli/ 19-Mar-2009 20:08 - +commons-codec/ 09-Aug-2009 21:14 - +commons-collections/ 15-Apr-2008 01:05 - +commons-compress/ 01-Nov-2005 05:21 - +commons-configuration/ 11-Jan-2009 14:01 - +commons-daemon/ 01-Nov-2005 05:12 - +commons-dbcp/ 28-Oct-2005 01:26 - +commons-dbutils/ 26-Apr-2009 04:30 - +commons-digester/ 03-Jan-2009 21:44 - +commons-discovery/ 01-Nov-2005 05:03 - +commons-el/ 28-Oct-2005 01:27 - +commons-email/ 28-Sep-2007 19:29 - +commons-fileupload/ 20-Feb-2007 11:31 - +commons-grafolia/ 01-Nov-2005 05:03 - +commons-grant/ 01-Nov-2005 05:16 - +commons-graph/ 01-Nov-2005 05:19 - +commons-http/ 01-Nov-2005 05:21 - +commons-httpclient/ 01-Nov-2005 05:19 - +commons-i18n/ 01-Nov-2005 05:19 - +commons-io/ 01-Jan-2008 21:00 - +commons-jdbc2pool/ 01-Nov-2005 05:11 - +commons-jelly/ 01-Nov-2005 05:12 - +commons-jexl/ 01-Nov-2005 05:08 - +commons-jux/ 01-Nov-2005 05:05 - +commons-jxpath/ 13-Aug-2008 22:13 - +commons-lang/ 19-Mar-2008 05:42 - +commons-latka/ 01-Nov-2005 05:19 - +commons-launcher/ 03-Jul-2006 21:30 - +commons-logging/ 26-Nov-2007 19:24 - +commons-math/ 25-Feb-2008 00:30 - +commons-messenger/ 01-Nov-2005 05:14 - +commons-modeler/ 01-Nov-2005 05:03 - +commons-naming/ 01-Nov-2005 05:13 - +commons-net/ 30-Oct-2008 20:28 - +commons-pool/ 21-Dec-2008 00:14 - +commons-primitives/ 01-Nov-2005 05:08 - +commons-resources/ 01-Nov-2005 05:09 - +commons-scxml/ 19-May-2008 19:41 - +commons-services/ 28-Oct-2005 01:27 - +commons-sql/ 01-Nov-2005 05:14 - +commons-test/ 08-Nov-2005 09:49 - +commons-threadpool/ 01-Nov-2005 05:14 - +commons-transaction/ 01-Nov-2005 05:14 - +commons-util/ 01-Nov-2005 05:19 - +commons-validator/ 28-Oct-2005 01:27 - +commons-vfs/ 01-Nov-2005 05:10 - +commons-xo/ 01-Nov-2005 05:08 - +concurrent/ 28-Oct-2005 01:26 - +consulting/ 10-Aug-2015 10:55 - +continuum/ 01-Nov-2005 05:04 - +controlhaus/ 01-Nov-2005 05:19 - +cool/ 29-Nov-2016 23:08 - +coop/ 20-Oct-2014 09:33 - +cornerstone-connection/ 01-Nov-2005 05:20 - +cornerstone-datasources/ 01-Nov-2005 05:21 - +cornerstone-scheduler/ 01-Nov-2005 05:12 - +cornerstone-sockets/ 01-Nov-2005 05:13 - +cornerstone-store/ 01-Nov-2005 05:03 - +cornerstone-threads/ 01-Nov-2005 05:07 - +cos/ 06-Dec-2005 20:11 - +crimson/ 01-Nov-2005 05:03 - +cryptix/ 01-Nov-2005 05:07 - +cssparser/ 21-Aug-2011 14:29 - +cz/ 29-Nov-2016 23:08 - +d-haven-event/ 01-Nov-2005 05:14 - +d-haven-eventbus/ 01-Nov-2005 05:09 - +d-haven-mpool/ 01-Nov-2005 05:16 - +dalma/ 21-Aug-2011 14:29 - +dalms/ 21-Aug-2011 14:29 - +damagecontrol/ 01-Nov-2005 05:10 - +dataforge/ 01-Nov-2005 05:11 - +datasift/ 01-Nov-2005 05:14 - +dbunit/ 01-Nov-2005 05:13 - +de/ 29-Nov-2016 23:10 - +decorutils/ 01-Nov-2005 05:04 - +dentaku/ 01-Nov-2005 05:07 - +directory/ 24-Dec-2005 17:47 - +directory-asn1/ 01-Nov-2005 05:19 - +directory-authx/ 01-Nov-2005 05:21 - +directory-clients/ 01-Nov-2005 05:05 - +directory-naming/ 01-Nov-2005 05:03 - +directory-network/ 01-Nov-2005 05:07 - +directory-protocols/ 01-Nov-2005 05:09 - +directory-shared/ 01-Nov-2005 05:19 - +displaytag/ 12-Aug-2008 07:35 - +ditchnet/ 24-Nov-2005 06:03 - +dk/ 30-Nov-2016 00:31 - +dna/ 01-Nov-2005 05:21 - +dnsjava/ 01-Nov-2005 05:14 - +docbook/ 16-Jun-2006 18:32 - +doccheck/ 01-Nov-2005 05:10 - +dom4j/ 01-Nov-2005 05:16 - +domify/ 21-Aug-2011 14:31 - +dot-index/ 15-Jul-2012 10:55 - +doxia/ 28-Oct-2005 01:27 - +drone/ 01-Nov-2005 05:03 - +drools/ 31-Jan-2007 18:40 - +drools-examples/ 01-Nov-2005 05:10 - +dsh-vocabulary/ 01-Nov-2005 05:09 - +dtdparser/ 01-Nov-2005 05:15 - +dumbster/ 01-Nov-2005 05:03 - +dwr/ 24-Nov-2005 06:03 - +dynaop/ 01-Nov-2005 05:04 - +easyconf/ 01-Nov-2005 05:19 - +easymock/ 28-Oct-2005 01:27 - +ec/ 26-Jan-2015 11:42 - +echo/ 01-Nov-2005 05:07 - +echo3/ 21-Aug-2011 14:32 - +echo3extras/ 21-Aug-2011 14:32 - +eclipse/ 01-Nov-2005 05:03 - +ecs/ 01-Nov-2005 05:14 - +edenlib/ 01-Nov-2005 05:05 - +edtftp/ 01-Nov-2005 05:16 - +edu/ 30-Nov-2016 00:32 - +ee/ 30-Nov-2016 01:01 - +ehcache/ 28-Oct-2005 01:26 - +ejb/ 06-Dec-2005 20:11 - +el-impl/ 21-Aug-2011 14:32 - +emberio/ 01-Nov-2005 05:17 - +emma/ 01-Nov-2005 05:03 - +enterprises/ 07-Dec-2015 10:38 - +ervacon/ 01-Nov-2005 05:21 - +es/ 30-Nov-2016 01:01 - +esper/ 29-Jan-2008 02:43 - +eu/ 30-Nov-2016 01:03 - +eus/ 27-Apr-2015 10:40 - +excalibur/ 01-Nov-2005 05:06 - +excalibur-altrmi/ 01-Nov-2005 05:05 - +excalibur-cli/ 01-Nov-2005 05:07 - +excalibur-collections/ 01-Nov-2005 05:10 - +excalibur-component/ 01-Nov-2005 05:10 - +excalibur-component-examples/ 01-Nov-2005 05:04 - +excalibur-component-tests/ 01-Nov-2005 05:15 - +excalibur-concurrent/ 01-Nov-2005 05:07 - +excalibur-configuration/ 01-Nov-2005 05:09 - +excalibur-containerkit/ 01-Nov-2005 05:03 - +excalibur-datasource/ 01-Nov-2005 05:03 - +excalibur-event/ 01-Nov-2005 05:03 - +excalibur-extension/ 01-Nov-2005 05:04 - +excalibur-fortress/ 01-Nov-2005 05:04 - +excalibur-i18n/ 01-Nov-2005 05:15 - +excalibur-instrument/ 01-Nov-2005 05:10 - +excalibur-instrument-manager/ 01-Nov-2005 05:08 - +excalibur-instrument-manager-interfaces/ 01-Nov-2005 05:07 - +excalibur-io/ 01-Nov-2005 05:11 - +excalibur-lifecycle/ 01-Nov-2005 05:15 - +excalibur-logger/ 01-Nov-2005 05:04 - +excalibur-monitor/ 01-Nov-2005 05:15 - +excalibur-mpool/ 01-Nov-2005 05:05 - +excalibur-naming/ 01-Nov-2005 05:14 - +excalibur-pool/ 01-Nov-2005 05:03 - +excalibur-sourceresolve/ 01-Nov-2005 05:14 - +excalibur-store/ 01-Nov-2005 05:09 - +excalibur-thread/ 01-Nov-2005 05:07 - +excalibur-util/ 01-Nov-2005 05:15 - +excalibur-xmlutil/ 01-Nov-2005 05:04 - +exist/ 01-Nov-2005 05:12 - +exml/ 01-Nov-2005 05:16 - +exo/ 01-Nov-2005 00:35 - +exolabcore/ 01-Nov-2005 00:35 - +exteca/ 01-Nov-2005 00:35 - +external/ 01-Aug-2014 20:15 - +farm/ 26-Oct-2015 11:01 - +fastutil/ 01-Nov-2005 00:35 - +fesi/ 01-Nov-2005 00:35 - +fi/ 30-Nov-2016 01:13 - +findbugs/ 06-Nov-2006 01:05 - +fish/ 18-May-2015 10:45 - +flox/ 01-Nov-2005 00:35 - +flux/ 21-Aug-2011 14:32 - +fm/ 22-Feb-2016 09:57 - +foo/ 30-Nov-2016 01:49 - +foo3/ 21-Nov-2016 12:45 - +fop/ 01-Nov-2005 00:35 - +forehead/ 01-Nov-2005 00:35 - +formproc/ 01-Nov-2005 00:34 - +foundation/ 30-Nov-2016 01:49 - +foxtrot/ 12-Nov-2011 11:19 - +fr/ 30-Nov-2016 01:49 - +freebxml/ 01-Nov-2005 00:34 - +freemarker/ 01-Nov-2005 00:35 - +frl/ 14-Sep-2015 11:30 - +fulcrum/ 01-Nov-2005 00:35 - +ga/ 30-Nov-2016 02:02 - +gabriel/ 01-Nov-2005 00:35 - +gbean/ 01-Nov-2005 00:35 - +generama/ 17-Jul-2008 20:56 - +genjar/ 01-Nov-2005 00:34 - +genjava/ 01-Nov-2005 00:35 - +geronimo/ 08-Jan-2007 15:55 - +geronimo-spec/ 01-Nov-2005 00:35 - +gg/ 12-May-2012 09:05 - +github/ 30-Nov-2016 02:04 - +glassfish/ 21-Aug-2011 14:33 - +global/ 30-Nov-2016 02:04 - +gnu/ 21-Aug-2011 14:33 - +gnu-regexp/ 01-Nov-2005 00:35 - +gov/ 30-Nov-2016 02:04 - +gr/ 30-Nov-2016 02:18 - +graphlayout/ 01-Nov-2005 00:35 - +grizzly/ 21-Aug-2011 14:33 - +grizzly-cachetest/ 21-Aug-2011 14:33 - +groovy/ 30-Apr-2007 21:29 - +groovy-xmlrpc/ 26-May-2006 21:50 - +gs/ 08-Sep-2012 07:49 - +gsbase/ 01-Nov-2005 00:35 - +guru/ 26-Jan-2015 11:51 - +hessian/ 01-Nov-2005 00:34 - +hibernate/ 26-Dec-2008 14:12 - +hivemind/ 01-Nov-2005 00:34 - +hm/ 01-Aug-2014 20:22 - +howl/ 01-Nov-2005 00:35 - +hr/ 30-Nov-2016 02:20 - +hsqldb/ 28-Oct-2005 01:27 - +htmlunit/ 01-Nov-2005 00:34 - +httpcomponents-httpcore/ 02-Jul-2007 18:15 - +httpunit/ 28-Oct-2005 01:26 - +hu/ 30-Nov-2016 02:20 - +hudson/ 21-Aug-2011 14:34 - +ical4j/ 01-Nov-2005 00:34 - +icu/ 03-Nov-2005 01:12 - +icu4j/ 03-Nov-2005 21:39 - +id/ 30-Nov-2016 02:21 - +idb/ 01-Nov-2005 00:35 - +ie/ 21-Dec-2015 09:56 - +iirekm/ 21-Aug-2011 14:34 - +il/ 30-Nov-2016 02:21 - +im/ 30-Nov-2016 02:21 - +in/ 30-Nov-2016 02:50 - +info/ 30-Nov-2016 02:51 - +informa/ 01-Nov-2005 00:34 - +innig/ 01-Nov-2005 00:35 - +int/ 24-Aug-2014 05:19 - +io/ 30-Nov-2016 03:02 - +ir/ 30-Nov-2016 13:35 - +is/ 03-Nov-2014 11:18 - +isorelax/ 01-Nov-2005 00:35 - +it/ 30-Nov-2016 13:37 - +itext/ 01-Nov-2005 00:35 - +ivory/ 01-Nov-2005 00:35 - +izpack/ 01-Nov-2005 00:35 - +jaas/ 01-Nov-2005 00:35 - +jackcess/ 01-Nov-2005 00:35 - +jackson/ 06-Sep-2008 07:58 - +jacl/ 01-Nov-2005 00:35 - +jaf/ 28-Oct-2005 01:27 - +jaimbot/ 01-Nov-2005 00:35 - +jakarta-regexp/ 01-Nov-2005 00:34 - +jalopy/ 01-Nov-2005 00:35 - +james/ 01-Nov-2005 00:35 - +janino/ 01-Nov-2005 00:35 - +jardiff/ 14-Feb-2006 01:31 - +jarjar/ 01-Nov-2005 00:35 - +jarsync/ 01-Nov-2005 00:35 - +jasper-jsr199/ 21-Aug-2011 14:37 - +jasperreports/ 01-Nov-2005 00:35 - +java2html/ 01-Nov-2005 00:34 - +java3d/ 01-Nov-2005 00:35 - +java_cup/ 01-Aug-2014 21:21 - +javacc/ 01-Nov-2005 00:34 - +javaconfig/ 01-Nov-2005 00:35 - +javadb/ 21-Aug-2011 14:37 - +javadoc/ 31-Oct-2005 19:40 - +javaee/ 21-Aug-2011 14:37 - +javagroups/ 01-Nov-2005 05:14 - +javainetlocator/ 01-Nov-2005 05:03 - +javamail/ 01-Nov-2005 05:07 - +javancss/ 01-Nov-2005 05:19 - +javanettasks/ 21-Aug-2011 14:37 - +javassist/ 01-Apr-2008 07:08 - +javassist / 04-Apr-2008 17:18 - +javatar/ 01-Nov-2005 05:19 - +javax/ 20-Jul-2015 11:38 - +javazoom/ 10-Nov-2012 09:25 - +javolution/ 21-Aug-2011 17:05 - +jawin/ 24-Nov-2005 06:03 - +jaxb/ 21-Aug-2011 14:37 - +jaxen/ 19-Oct-2006 19:23 - +jaxme/ 06-Nov-2006 01:06 - +jaxr-ra/ 21-Aug-2011 14:37 - +jblanket/ 01-Nov-2005 05:11 - +jboss/ 27-Apr-2013 08:15 - +jca/ 01-Nov-2005 05:03 - +jcache/ 01-Nov-2005 05:03 - +jcharts/ 06-Dec-2007 02:46 - +jcifs/ 29-Apr-2008 16:16 - +jcom/ 24-Nov-2005 06:03 - +jcommon/ 28-Oct-2005 01:27 - +jcoverage/ 01-Nov-2005 05:20 - +jcs/ 01-Nov-2005 05:03 - +jcs-javagroups/ 01-Nov-2005 05:18 - +jcvsii/ 01-Nov-2005 05:03 - +jdbc/ 28-Oct-2005 01:26 - +jdbm/ 01-Nov-2005 05:13 - +jdepend/ 01-Nov-2005 05:03 - +jdiff/ 01-Nov-2005 05:19 - +jdo/ 01-Nov-2005 05:03 - +jdom/ 28-Oct-2005 01:27 - +jdring/ 01-Nov-2005 05:09 - +jdsl/ 01-Nov-2005 05:04 - +jen/ 21-Aug-2011 14:38 - +jencks/ 01-Nov-2005 05:13 - +jep/ 01-Nov-2005 05:03 - +jepi/ 21-Aug-2011 14:38 - +jersey/ 21-Aug-2011 14:38 - +jetty/ 20-Oct-2006 15:24 - +jexcelapi/ 06-Nov-2006 01:07 - +jface/ 01-Nov-2005 05:09 - +jfree/ 13-Dec-2006 19:51 - +jfreechart/ 01-Nov-2005 05:15 - +jgen/ 01-Nov-2005 05:20 - +jgoodies/ 01-Nov-2005 05:13 - +jgraph/ 01-Nov-2005 05:07 - +jgrapht/ 01-Nov-2005 05:07 - +jgroups/ 01-Nov-2005 05:04 - +jhunlang/ 01-Nov-2005 05:04 - +jini/ 10-Dec-2005 02:18 - +jintention/ 21-Aug-2011 14:38 - +jisp/ 01-Nov-2005 05:10 - +jivesoftware/ 01-Nov-2005 05:03 - +jlibdiff/ 01-Nov-2005 05:03 - +jline/ 19-Oct-2006 19:23 - +jmagick/ 21-Aug-2011 14:38 - +jmaki/ 21-Aug-2011 14:38 - +jmdns/ 01-Nov-2005 05:14 - +jmimemagic/ 01-Nov-2005 05:14 - +jmml/ 01-Nov-2005 05:12 - +jmock/ 28-Oct-2005 01:26 - +jms/ 28-Oct-2005 01:27 - +jmscts/ 01-Nov-2005 05:09 - +jmsn/ 01-Nov-2005 05:16 - +joda-time/ 15-Nov-2009 14:12 - +john-test/ 29-May-2008 08:01 - +jotm/ 01-Nov-2005 05:20 - +jp/ 30-Nov-2016 13:53 - +jparsec/ 26-Aug-2006 17:55 - +jpl/ 10-Nov-2012 09:26 - +jpox/ 21-Jan-2008 06:44 - +jpox-dbcp/ 13-Mar-2007 21:30 - +jpox-enhancer/ 13-Mar-2007 21:30 - +jpox-java5/ 13-Mar-2007 21:30 - +jrexx/ 01-Nov-2005 05:11 - +jrms/ 01-Nov-2005 05:19 - +jrobin/ 01-Nov-2005 05:06 - +jruby/ 21-Aug-2007 18:14 - +jsch/ 28-Oct-2005 01:26 - +jsf-extensions/ 21-Aug-2011 14:38 - +jspapi/ 28-Oct-2005 01:26 - +jsptags/ 01-Nov-2005 05:15 - +jstl/ 28-Oct-2005 01:26 - +jstyle/ 01-Nov-2005 05:09 - +jta/ 28-Oct-2005 01:26 - +jtds/ 20-Jan-2006 12:18 - +jtidy/ 28-Oct-2005 01:27 - +juddi/ 01-Nov-2005 05:03 - +jug/ 01-Nov-2005 05:12 - +jung/ 01-Nov-2005 05:03 - +junit/ 10-May-2009 13:17 - +junit-addons/ 28-Oct-2005 01:27 - +junit-doclet/ 01-Nov-2005 05:19 - +junitperf/ 01-Nov-2005 05:21 - +juno/ 21-Aug-2011 14:38 - +jwebunit/ 01-Nov-2005 05:10 - +jxta/ 01-Nov-2005 05:10 - +jython/ 01-Nov-2005 05:04 - +kawa/ 01-Nov-2005 05:04 - +kg/ 23-Feb-2013 09:19 - +kohsuke/ 21-Aug-2011 14:38 - +kr/ 30-Nov-2016 13:56 - +kxml/ 01-Nov-2005 05:09 - +kxml2/ 01-Nov-2005 05:07 - +kz/ 04-Jan-2016 09:50 - +la/ 20-Apr-2015 11:09 - +ldapd-common/ 01-Nov-2005 05:21 - +ldapsdk/ 01-Nov-2005 05:11 - +li/ 30-Nov-2016 14:03 - +life/ 30-Nov-2016 14:04 - +lingo/ 01-Nov-2005 05:21 - +link/ 07-Dec-2015 11:24 - +locc/ 01-Nov-2005 05:11 - +log4j/ 28-Nov-2007 21:22 - +log4unit/ 01-Nov-2005 05:20 - +logkit/ 02-Nov-2005 09:29 - +loom/ 01-Nov-2005 05:21 - +lpg/ 16-Nov-2013 10:06 - +lt/ 19-Jan-2013 09:12 - +lucene/ 01-Nov-2005 05:04 - +lv/ 22-Feb-2016 10:49 - +ly/ 29-Sep-2014 10:35 - +ma/ 30-Nov-2016 14:08 - +magicGball/ 01-Nov-2005 05:03 - +maps/ 21-Aug-2011 14:38 - +market/ 12-Oct-2015 22:45 - +marmalade/ 21-Jul-2006 17:02 - +math/ 23-Nov-2013 10:01 - +maven/ 06-Nov-2006 01:08 - +maven-integration-test-helper/ 11-Jun-2011 11:01 - +maven-javanet-plugin/ 21-Aug-2011 14:39 - +maven-new/ 01-Nov-2005 05:06 - +maven-plugins/ 06-Nov-2006 01:07 - +maven-proxy/ 01-Nov-2005 05:03 - +maven-taglib/ 01-Nov-2005 05:19 - +maven-torque-plugin/ 01-Nov-2005 05:03 - +maven-validator/ 01-Nov-2005 05:07 - +maven-xdoclet2-plugin/ 01-Nov-2005 05:19 - +maxq/ 01-Nov-2005 05:09 - +mckoi/ 01-Nov-2005 05:12 - +md/ 30-Nov-2016 14:09 - +me/ 30-Nov-2016 14:09 - +merlin/ 01-Nov-2005 05:02 - +merlin-developer/ 01-Nov-2005 05:19 - +merlin-tutorial/ 01-Nov-2005 05:15 - +messenger/ 01-Nov-2005 05:08 - +metaclass/ 01-Nov-2005 05:08 - +mevenide/ 01-Nov-2005 05:14 - +microcontainer/ 01-Nov-2005 05:16 - +middlegen/ 01-Nov-2005 05:03 - +mil/ 30-Nov-2016 14:19 - +milyn/ 16-May-2007 17:40 - +ml/ 30-Nov-2016 14:20 - +mm/ 01-Nov-2005 05:12 - +mm-mysql/ 01-Nov-2005 05:16 - +mobi/ 30-Nov-2016 14:22 - +mockcreator/ 01-Nov-2005 05:09 - +mockit/ 21-Aug-2011 14:39 - +mockmaker/ 01-Nov-2005 05:07 - +mockobjects/ 01-Nov-2005 05:05 - +mockrunner/ 24-Nov-2005 06:03 - +modello/ 01-Nov-2005 05:12 - +mrj/ 01-Nov-2005 05:14 - +ms/ 01-Aug-2014 21:28 - +mstor/ 01-Nov-2005 05:14 - +msv/ 01-Nov-2005 05:15 - +mule/ 10-Apr-2007 13:34 - +muse/ 01-Nov-2005 05:11 - +mx/ 22-Feb-2016 10:54 - +mx4j/ 01-Nov-2005 05:14 - +myfaces/ 21-Nov-2005 13:21 - +mysql/ 15-Oct-2011 10:12 - +name/ 30-Nov-2016 14:22 - +nanning/ 01-Nov-2005 05:11 - +nanocontainer/ 14-Jun-2006 10:28 - +nekohtml/ 01-Jun-2008 16:25 - +neo/ 01-Nov-2005 05:08 - +net/ 30-Nov-2016 14:23 - +netbeans/ 01-Nov-2005 05:04 - +new/ 21-Aug-2011 15:09 - +nf/ 02-Mar-2013 10:13 - +ng/ 30-Nov-2016 16:55 - +ninja/ 16-Nov-2015 14:52 - +nl/ 30-Nov-2016 16:55 - +no/ 30-Nov-2016 17:07 - +norbert/ 01-Nov-2005 05:03 - +np/ 17-Nov-2014 12:32 - +nsuml/ 01-Nov-2005 05:16 - +nu/ 30-Nov-2016 17:15 - +nz/ 30-Nov-2016 17:15 - +oauth/ 26-Feb-2010 19:44 - +odmg/ 28-Oct-2005 01:27 - +ognl/ 20-Jun-2007 20:09 - +ojb/ 01-Nov-2005 05:11 - +ojdbc/ 28-Oct-2005 01:26 - +old/ 01-Nov-2005 05:13 - +one/ 30-Nov-2015 14:42 - +oness/ 01-Nov-2005 05:13 - +online/ 30-Nov-2016 17:23 - +open/ 21-Aug-2011 15:33 - +open-esb/ 21-Aug-2011 15:33 - +opencypher/ 30-Nov-2016 17:23 - +openejb/ 07-May-2006 00:35 - +openim/ 01-Nov-2005 05:12 - +openjms/ 01-Nov-2005 05:03 - +opennms/ 01-Nov-2005 05:06 - +opensymphony/ 19-Feb-2009 14:07 - +oracle/ 21-Aug-2011 15:33 - +org/ 30-Nov-2016 17:23 - +org.elasticsearch/ 30-Nov-2016 17:23 - +org.elasticsearch.client/ 30-Nov-2016 17:23 - +org.elasticsearch.distribution.integ-test-zip/ 30-Nov-2016 17:23 - +org.elasticsearch.distribution.zip/ 30-Nov-2016 17:23 - +org.elasticsearch.gradle/ 30-Nov-2016 17:23 - +org.elasticsearch.plugin/ 30-Nov-2016 17:23 - +org.elasticsearch.test/ 30-Nov-2016 17:23 - +oro/ 28-Oct-2005 01:27 - +oscube/ 01-Nov-2005 05:02 - +p2psockets/ 01-Nov-2005 05:15 - +p6spy/ 01-Nov-2005 05:05 - +patterntesting/ 01-Nov-2005 05:05 - +payload/ 01-Nov-2005 05:03 - +pcj/ 01-Nov-2005 05:09 - +pdfbox/ 01-Nov-2005 05:16 - +pe/ 21-Nov-2016 12:45 - +penguin/ 01-Nov-2005 05:10 - +petridish/ 01-Nov-2005 05:06 - +ph/ 30-Jun-2012 17:32 - +piccolo/ 01-Nov-2005 05:03 - +picocontainer/ 14-Jun-2006 10:25 - +picounit/ 01-Nov-2005 05:10 - +pircbot/ 01-Nov-2005 05:06 - +pitt/ 07-Dec-2013 15:12 - +pl/ 25-Jan-2016 18:00 - +plexus/ 04-Jan-2007 19:16 - +plj/ 01-Nov-2005 05:14 - +plugin/ 01-Nov-2005 05:07 - +pluto-container/ 01-Nov-2005 05:07 - +pmd/ 10-Aug-2008 09:08 - +pnuts/ 22-Aug-2011 09:13 - +poi/ 28-Oct-2005 23:26 - +poolman/ 01-Nov-2005 05:20 - +portlet-api/ 01-Nov-2005 05:10 - +postgresql/ 01-Nov-2005 05:15 - +prevayler/ 01-Nov-2005 05:13 - +pro/ 03-Nov-2015 02:37 - +proctor/ 22-Aug-2011 09:13 - +profiler/ 01-Nov-2005 05:11 - +proxool/ 28-Oct-2005 01:27 - +proxytoys/ 01-Nov-2005 05:04 - +pt/ 15-Dec-2015 03:32 - +pubscribe/ 01-Nov-2005 05:11 - +pull-parser/ 28-Oct-2005 01:27 - +pw/ 26-Oct-2013 13:30 - +qdox/ 28-Oct-2005 01:27 - +qfork/ 01-Nov-2005 05:14 - +quartz/ 01-Nov-2005 05:16 - +quartz-jboss/ 26-Feb-2010 21:25 - +quartz-oracle/ 26-Feb-2010 21:25 - +quartz-weblogic/ 26-Feb-2010 21:25 - +quilt/ 01-Nov-2005 05:12 - +radeox/ 01-Nov-2005 05:14 - +re/ 17-Aug-2014 12:17 - +readline/ 01-Nov-2005 05:10 - +red/ 21-Nov-2016 12:45 - +redhill/ 01-Nov-2005 05:03 - +redis/ 09-Oct-2010 07:48 - +redmine/ 22-Aug-2011 09:13 - +regexp/ 19-Oct-2006 19:23 - +relaxngDatatype/ 01-Nov-2005 05:15 - +ren/ 19-Oct-2015 23:59 - +reportrunner/ 01-Nov-2005 05:15 - +rest/ 21-Nov-2016 12:45 - +rhino/ 01-Nov-2005 05:11 - +ro/ 21-Dec-2015 16:56 - +robo-guice/ 22-Aug-2011 09:13 - +roboguice/ 22-Aug-2011 09:13 - +rocks/ 20-Oct-2014 18:43 - +roller/ 22-Aug-2011 09:13 - +rome/ 22-Aug-2011 09:13 - +rs/ 01-Dec-2014 19:54 - +rss4j/ 01-Nov-2005 05:08 - +rsslibj/ 01-Nov-2005 05:04 - +ru/ 14-Mar-2016 15:50 - +rubygems/ 27-Oct-2015 00:40 - +run/ 21-Nov-2016 12:45 - +sablecc/ 01-Nov-2005 05:04 - +sax/ 01-Nov-2005 05:11 - +saxon/ 19-Oct-2006 19:23 - +saxpath/ 28-Oct-2005 01:26 - +sc/ 15-Jun-2015 21:26 - +science/ 21-Nov-2016 12:45 - +scout/ 29-Oct-2005 08:00 - +scraping-engine/ 01-Nov-2005 05:07 - +se/ 11-Jan-2016 15:55 - +securityfilter/ 01-Nov-2005 05:13 - +servicemix/ 25-Mar-2006 00:55 - +servicemix-ws/ 01-Nov-2005 05:15 - +servletapi/ 28-Oct-2005 23:26 - +servlets/ 01-Nov-2005 05:12 - +setpoint/ 06-Nov-2006 01:09 - +sfx4j/ 22-Aug-2011 09:14 - +sg/ 21-Nov-2016 12:45 - +sh/ 10-Nov-2015 04:31 - +shellix/ 22-Aug-2011 09:14 - +shocks/ 01-Nov-2005 05:11 - +si/ 15-Feb-2016 16:33 - +sillyexceptions/ 01-Nov-2005 05:04 - +simple-jms/ 09-Dec-2005 01:32 - +simple-jndi/ 01-Nov-2005 05:19 - +sk/ 15-Feb-2016 16:33 - +skaringa/ 01-Nov-2005 05:09 - +skinlf/ 01-Nov-2005 05:03 - +slide/ 01-Nov-2005 05:14 - +smartrics/ 15-Dec-2012 12:57 - +soap/ 01-Nov-2005 05:04 - +software/ 14-Mar-2016 15:54 - +soimp/ 22-Aug-2011 09:14 - +solarisrealm/ 22-Aug-2011 09:14 - +solutions/ 20-Oct-2015 00:09 - +space/ 21-Nov-2016 12:45 - +speexx/ 01-Nov-2005 05:04 - +spice/ 01-Nov-2005 05:03 - +spring/ 01-Nov-2005 05:07 - +springframework/ 01-Nov-2005 05:11 - +springmodules/ 19-Jun-2006 22:22 - +sqlline/ 09-Mar-2015 21:41 - +sshtools/ 01-Nov-2005 05:03 - +sslext/ 01-Nov-2005 05:04 - +st/ 10-Aug-2015 22:33 - +stapler/ 22-Aug-2011 09:15 - +statcvs/ 01-Nov-2005 05:07 - +stax/ 06-Nov-2006 01:09 - +stax-utils/ 01-Nov-2005 05:11 - +stratum/ 01-Nov-2005 05:14 - +stream/ 21-Nov-2016 12:45 - +struts/ 01-Nov-2005 05:15 - +struts-menu/ 01-Nov-2005 05:03 - +strutstestcase/ 01-Nov-2005 05:12 - +studio/ 21-Nov-2016 12:45 - +stxx/ 01-Nov-2005 05:05 - +su/ 10-Aug-2014 15:19 - +subpersistence/ 01-Nov-2005 05:09 - +subshell/ 01-Nov-2005 05:03 - +suiterunner/ 01-Nov-2005 05:09 - +surefire/ 28-Oct-2005 01:26 - +swarmcache/ 28-Oct-2005 01:26 - +swt/ 01-Nov-2005 05:05 - +systems/ 18-Jan-2016 16:33 - +sysunit/ 01-Nov-2005 05:15 - +tablelayout/ 01-Nov-2005 05:14 - +tagalog/ 01-Nov-2005 05:16 - +tagishauth/ 01-Nov-2005 05:03 - +taglibrarydoc/ 01-Nov-2005 05:07 - +taglibs/ 01-Nov-2005 05:06 - +tagsoup/ 05-Nov-2005 01:42 - +tambora/ 01-Nov-2005 05:20 - +tanukisoft/ 07-Mar-2008 02:07 - +tapestry/ 01-Nov-2005 05:04 - +tclib/ 01-Nov-2005 05:07 - +tec/ 23-Mar-2015 21:07 - +tech/ 22-Feb-2016 17:58 - +technology/ 15-Dec-2015 03:41 - +textarea/ 01-Nov-2005 05:16 - +th/ 13-Oct-2015 11:58 - +thaiopensource/ 19-Oct-2006 19:23 - +tiffrenderer/ 01-Nov-2005 05:09 - +tjdo/ 01-Nov-2005 05:03 - +tk/ 11-Jan-2016 15:58 - +tl/ 13-Jul-2013 12:50 - +tmporb/ 01-Nov-2005 05:09 - +to/ 25-Jan-2016 18:06 - +tokyo/ 21-Nov-2016 12:45 - +tomcat/ 24-Jan-2008 04:19 - +tomcat-util/ 01-Nov-2005 05:20 - +tonic/ 08-Nov-2005 05:35 - +tools/ 29-Feb-2016 17:11 - +top/ 08-Feb-2016 18:28 - +toplink/ 22-Aug-2011 09:16 - +torque/ 11-Jan-2008 22:47 - +torque-gen/ 01-Nov-2005 05:04 - +touchstone/ 01-Nov-2005 05:10 - +tr/ 15-Dec-2015 03:41 - +traer/ 07-Apr-2012 17:18 - +trail-taglib/ 01-Nov-2005 05:04 - +tranql/ 01-Nov-2005 05:10 - +travel/ 04-May-2015 22:09 - +trove/ 01-Nov-2005 05:08 - +turbine/ 01-Nov-2005 05:04 - +tv/ 18-Jan-2016 16:34 - +tw/ 18-May-2015 21:53 - +tyrex/ 01-Nov-2005 05:14 - +ua/ 29-Feb-2016 17:11 - +uaihebert/ 23-Feb-2013 13:20 - +ubique/ 01-Nov-2005 05:15 - +ug/ 25-Jan-2016 18:07 - +uispec4j/ 01-Nov-2005 05:07 - +uk/ 10-Aug-2015 22:35 - +uno/ 01-Dec-2015 04:36 - +urbanophile/ 01-Nov-2005 05:03 - +urlrewrite/ 24-Nov-2005 06:03 - +us/ 18-Jan-2016 16:35 - +uy/ 24-Aug-2015 23:36 - +vc/ 28-Dec-2015 15:38 - +vdoclet/ 01-Nov-2005 05:11 - +velocity/ 29-Apr-2007 21:29 - +velocity-anakia/ 29-Apr-2007 21:29 - +velocity-dvsl/ 01-Nov-2005 05:12 - +velocity-tools/ 01-Nov-2005 05:10 - +village/ 01-Nov-2005 05:04 - +vn/ 02-Dec-2016 00:09 - +vu/ 20-Jul-2013 12:57 - +wadi/ 01-Nov-2005 05:15 - +wang/ 10-Aug-2015 22:36 - +webmacro/ 01-Nov-2005 05:12 - +website/ 22-Feb-2016 18:03 - +webtest/ 01-Nov-2005 05:19 - +werken-xpath/ 28-Oct-2005 01:26 - +werkflow/ 01-Nov-2005 05:16 - +werkz/ 01-Nov-2005 05:08 - +westhawk/ 01-Nov-2005 05:18 - +wf/ 10-Nov-2014 19:54 - +which/ 01-Nov-2005 05:16 - +wicket/ 11-Aug-2008 15:44 - +wiki/ 22-Feb-2016 18:03 - +win/ 21-Nov-2016 12:45 - +woodstox/ 21-Nov-2007 04:35 - +work/ 18-Jan-2016 16:37 - +works/ 22-Feb-2016 18:03 - +wrapper/ 01-Nov-2005 05:14 - +ws/ 25-Jan-2016 18:11 - +ws-commons/ 19-Sep-2006 14:21 - +ws-commons-java5/ 01-Nov-2005 05:03 - +ws-commons-util/ 01-Nov-2005 05:16 - +ws-scout/ 18-Feb-2006 13:32 - +wsdl4j/ 01-Nov-2005 05:07 - +wsrf/ 01-Nov-2005 05:08 - +wss4j/ 02-May-2006 20:32 - +wstx/ 01-Nov-2005 05:09 - +wurfl/ 01-Nov-2005 05:14 - +wutka/ 01-Nov-2005 05:21 - +xajile/ 03-Aug-2009 09:25 - +xalan/ 30-Sep-2008 08:02 - +xbean/ 04-Jan-2006 17:31 - +xdoclet/ 17-Jul-2008 21:29 - +xdoclet-plugins/ 02-Jul-2006 21:14 - +xerces/ 19-Oct-2006 19:23 - +xercesjarv/ 01-Nov-2005 05:06 - +xfire/ 06-Nov-2006 01:09 - +xfire-root/ 01-Nov-2005 05:03 - +xin/ 21-Nov-2016 12:45 - +xjavadoc/ 01-Nov-2005 05:14 - +xml-apis/ 22-Dec-2006 13:37 - +xml-resolver/ 01-Nov-2005 05:11 - +xml-security/ 19-Oct-2006 19:23 - +xmlbeans/ 03-Jul-2007 16:43 - +xmldb/ 01-Nov-2005 05:12 - +xmlenc/ 01-Nov-2005 05:19 - +xmlmind/ 01-Nov-2005 05:21 - +xmlpull/ 01-Nov-2005 05:21 - +xmlrpc/ 25-Jun-2006 02:41 - +xmlrpc-helma/ 01-Nov-2005 05:03 - +xmlunit/ 15-Sep-2008 23:50 - +xmlwise/ 27-Oct-2012 10:59 - +xmlwriter/ 01-Nov-2005 05:04 - +xom/ 19-Oct-2006 19:23 - +xpp3/ 28-Oct-2005 01:26 - +xsddoc/ 01-Nov-2005 05:19 - +xsdlib/ 01-Nov-2005 05:04 - +xstream/ 27-Nov-2006 21:45 - +xtc/ 07-Apr-2012 17:20 - +xtiff-jai/ 01-Nov-2005 05:10 - +xxl/ 01-Nov-2005 05:12 - +xyz/ 08-Feb-2016 18:33 - +yan/ 13-Jan-2006 21:31 - +ymsg/ 01-Nov-2005 05:04 - +yom/ 01-Nov-2005 05:08 - +za/ 25-May-2013 12:39 - +zone/ 26-Jan-2015 23:05 - +94a8262a403880.properties 03-Feb-2015 07:36 301 +94a8262a403880.properties.md5 20-May-2015 05:24 32 +94a8262a403880.properties.sha1 20-May-2015 05:24 40 +9e9bbc30f020cf.properties 03-Oct-2014 19:03 310 +9e9bbc30f020cf.properties.md5 02-Nov-2014 16:27 32 +9e9bbc30f020cf.properties.sha1 02-Nov-2014 16:27 40 +archetype-catalog.xml 27-Nov-2016 13:20 5385400 +archetype-catalog.xml.md5 27-Nov-2016 13:20 32 +archetype-catalog.xml.sha1 27-Nov-2016 13:20 40 +fb69c44c24b38.properties 17-Apr-2014 13:29 307 +fb69c44c24b38.properties.md5 02-Nov-2014 14:37 32 +fb69c44c24b38.properties.sha1 02-Nov-2014 14:37 40 +last_updated.txt 28-Nov-2016 06:55 29 +robots.txt 10-Nov-2009 12:12 26 +server.txt 08-Nov-2014 19:04 207 +
../ +HTTPClient/ 01-Nov-2005 05:03 - +abbot/ 28-Sep-2015 06:18 - +acegisecurity/ 23-Dec-2005 12:20 - +activation/ 21-Dec-2005 15:37 - +activecluster/ 01-Nov-2005 05:09 - +activeio/ 01-Nov-2005 05:10 - +activemq/ 01-Nov-2005 05:13 - +activemq-jaxb/ 01-Nov-2005 05:11 - +activesoap/ 01-Nov-2005 05:20 - +activespace/ 01-Nov-2005 05:04 - +adarwin/ 01-Nov-2005 05:03 - +ae/ 06-Apr-2015 06:14 - +aelfred/ 01-Nov-2005 05:03 - +aero/ 01-Aug-2014 14:03 - +ai/ 28-Nov-2016 07:10 - +aislib/ 01-Nov-2005 05:14 - +al/ 21-Nov-2016 13:18 - +altrmi/ 01-Nov-2005 05:14 - +am/ 21-Nov-2016 13:19 - +andromda/ 01-Nov-2005 05:19 - +annogen/ 01-Nov-2005 05:19 - +ant/ 01-Nov-2005 05:17 - +ant-contrib/ 08-Aug-2008 22:17 - +ant-doxygen/ 01-Nov-2005 05:04 - +ant4eclipse/ 21-Aug-2011 11:53 - +antlr/ 01-Nov-2005 05:12 - +anttex/ 01-Nov-2005 05:19 - +aopalliance/ 28-Oct-2005 01:26 - +apache-jaxme/ 01-Nov-2005 05:10 - +aptconvert/ 01-Nov-2005 05:07 - +ar/ 06-Mar-2008 17:19 - +args4j/ 16-Mar-2013 07:01 - +as/ 25-May-2015 06:15 - +ashkay/ 01-Nov-2005 05:13 - +ashkelon/ 01-Nov-2005 05:20 - +asia/ 23-Feb-2013 08:01 - +asm/ 07-Jul-2009 04:08 - +aspectj/ 21-Dec-2005 12:23 - +aspectwerkz/ 01-Nov-2005 05:09 - +at/ 28-Nov-2016 07:12 - +au/ 12-Oct-2015 07:37 - +avalon/ 19-Oct-2006 19:23 - +avalon-activation/ 01-Nov-2005 05:20 - +avalon-apps/ 01-Nov-2005 05:14 - +avalon-composition/ 01-Nov-2005 05:13 - +avalon-cornerstone/ 01-Nov-2005 05:02 - +avalon-extension/ 01-Nov-2005 05:09 - +avalon-framework/ 01-Nov-2005 05:15 - +avalon-http/ 18-Jul-2006 18:10 - +avalon-logging/ 01-Nov-2005 05:19 - +avalon-logkit/ 01-Nov-2005 05:11 - +avalon-meta/ 01-Nov-2005 05:05 - +avalon-phoenix/ 01-Nov-2005 05:10 - +avalon-repository/ 01-Nov-2005 05:10 - +avalon-util/ 01-Nov-2005 05:12 - +axion/ 01-Nov-2005 05:20 - +axis/ 19-Oct-2006 19:23 - +axis2/ 04-May-2006 20:31 - +azote/ 01-Nov-2005 05:14 - +ba/ 29-Jun-2015 06:17 - +backport-util-concurrent/ 20-Feb-2008 05:30 - +backport175/ 01-Nov-2005 05:07 - +band/ 21-Nov-2016 13:41 - +barsuift/ 21-Aug-2011 11:54 - +batik/ 01-Nov-2005 05:09 - +bcel/ 28-Oct-2005 01:26 - +be/ 21-Nov-2016 13:41 - +beehive/ 01-Nov-2005 05:10 - +berkano/ 01-Nov-2005 05:14 - +berkeleydb/ 01-Nov-2005 05:06 - +binky/ 26-Feb-2010 19:31 - +biz/ 14-Mar-2016 06:15 - +black/ 01-Jun-2015 06:20 - +blissed/ 01-Nov-2005 05:04 - +boo/ 06-Nov-2006 01:04 - +bouncycastle/ 03-Sep-2009 13:30 - +boxstuff/ 01-Nov-2005 05:12 - +br/ 21-Nov-2016 13:45 - +bsf/ 01-Nov-2005 05:03 - +bsh/ 01-Nov-2005 05:03 - +burlap/ 01-Nov-2005 05:03 - +by/ 12-Jan-2015 07:18 - +bz/ 01-Aug-2014 14:08 - +c10n/ 09-Mar-2013 08:02 - +c3p0/ 01-Nov-2005 05:06 - +ca/ 21-Nov-2016 13:53 - +cactus/ 11-Apr-2008 19:59 - +cargo/ 01-Nov-2005 05:07 - +cas/ 22-Jun-2006 17:05 - +castor/ 06-Dec-2007 02:46 - +cat/ 21-Nov-2016 14:02 - +cc/ 21-Nov-2016 14:02 - +cd/ 05-Jan-2015 07:18 - +cewolf/ 01-Nov-2005 05:04 - +cf/ 01-Aug-2014 14:11 - +cglib/ 29-Feb-2016 07:17 - +ch/ 21-Nov-2016 14:07 - +charlotte/ 01-Nov-2005 05:04 - +checkstyle/ 28-Oct-2005 01:27 - +cl/ 06-Jul-2015 06:24 - +classworlds/ 01-Nov-2005 05:10 - +clickstream/ 24-Nov-2005 06:03 - +clirr/ 01-Nov-2005 05:04 - +cloud/ 21-Nov-2016 14:20 - +clover/ 01-Nov-2005 05:11 - +cm/ 21-Nov-2016 14:20 - +cmsdeploy/ 06-Dec-2005 20:10 - +cn/ 28-Nov-2016 07:25 - +co/ 21-Nov-2016 14:24 - +cobertura/ 06-Feb-2006 21:04 - +coconut/ 01-Nov-2005 05:21 - +cocoon/ 09-Jun-2008 20:01 - +code/ 21-Aug-2011 11:56 - +code316/ 01-Nov-2005 05:03 - +codehaus/ 16-Jul-2008 22:44 - +codes/ 01-Jun-2015 06:28 - +colt/ 01-Nov-2005 05:03 - +com/ 28-Nov-2016 07:29 - +commons-attributes/ 03-Jul-2006 21:30 - +commons-beanutils/ 01-Dec-2012 08:50 - +commons-betwixt/ 01-Nov-2005 05:13 - +commons-chain/ 01-Jun-2008 18:20 - +commons-cli/ 19-Mar-2009 20:08 - +commons-codec/ 09-Aug-2009 21:14 - +commons-collections/ 15-Apr-2008 01:05 - +commons-compress/ 01-Nov-2005 05:21 - +commons-configuration/ 11-Jan-2009 14:01 - +commons-daemon/ 01-Nov-2005 05:12 - +commons-dbcp/ 28-Oct-2005 01:26 - +commons-dbutils/ 26-Apr-2009 04:30 - +commons-digester/ 03-Jan-2009 21:44 - +commons-discovery/ 01-Nov-2005 05:03 - +commons-el/ 28-Oct-2005 01:27 - +commons-email/ 28-Sep-2007 19:29 - +commons-fileupload/ 20-Feb-2007 11:31 - +commons-grafolia/ 01-Nov-2005 05:03 - +commons-grant/ 01-Nov-2005 05:16 - +commons-graph/ 01-Nov-2005 05:19 - +commons-http/ 01-Nov-2005 05:21 - +commons-httpclient/ 01-Nov-2005 05:19 - +commons-i18n/ 01-Nov-2005 05:19 - +commons-io/ 01-Jan-2008 21:00 - +commons-jdbc2pool/ 01-Nov-2005 05:11 - +commons-jelly/ 01-Nov-2005 05:12 - +commons-jexl/ 01-Nov-2005 05:08 - +commons-jux/ 01-Nov-2005 05:05 - +commons-jxpath/ 13-Aug-2008 22:13 - +commons-lang/ 19-Mar-2008 05:42 - +commons-latka/ 01-Nov-2005 05:19 - +commons-launcher/ 03-Jul-2006 21:30 - +commons-logging/ 26-Nov-2007 19:24 - +commons-math/ 25-Feb-2008 00:30 - +commons-messenger/ 01-Nov-2005 05:14 - +commons-modeler/ 01-Nov-2005 05:03 - +commons-naming/ 01-Nov-2005 05:13 - +commons-net/ 30-Oct-2008 20:28 - +commons-pool/ 21-Dec-2008 00:14 - +commons-primitives/ 01-Nov-2005 05:08 - +commons-resources/ 01-Nov-2005 05:09 - +commons-scxml/ 19-May-2008 19:41 - +commons-services/ 28-Oct-2005 01:27 - +commons-sql/ 01-Nov-2005 05:14 - +commons-test/ 08-Nov-2005 09:49 - +commons-threadpool/ 01-Nov-2005 05:14 - +commons-transaction/ 01-Nov-2005 05:14 - +commons-util/ 01-Nov-2005 05:19 - +commons-validator/ 28-Oct-2005 01:27 - +commons-vfs/ 01-Nov-2005 05:10 - +commons-xo/ 01-Nov-2005 05:08 - +concurrent/ 28-Oct-2005 01:26 - +consulting/ 10-Aug-2015 10:55 - +continuum/ 01-Nov-2005 05:04 - +controlhaus/ 01-Nov-2005 05:19 - +cool/ 29-Nov-2016 23:08 - +coop/ 20-Oct-2014 09:33 - +cornerstone-connection/ 01-Nov-2005 05:20 - +cornerstone-datasources/ 01-Nov-2005 05:21 - +cornerstone-scheduler/ 01-Nov-2005 05:12 - +cornerstone-sockets/ 01-Nov-2005 05:13 - +cornerstone-store/ 01-Nov-2005 05:03 - +cornerstone-threads/ 01-Nov-2005 05:07 - +cos/ 06-Dec-2005 20:11 - +crimson/ 01-Nov-2005 05:03 - +cryptix/ 01-Nov-2005 05:07 - +cssparser/ 21-Aug-2011 14:29 - +cz/ 29-Nov-2016 23:08 - +d-haven-event/ 01-Nov-2005 05:14 - +d-haven-eventbus/ 01-Nov-2005 05:09 - +d-haven-mpool/ 01-Nov-2005 05:16 - +dalma/ 21-Aug-2011 14:29 - +dalms/ 21-Aug-2011 14:29 - +damagecontrol/ 01-Nov-2005 05:10 - +dataforge/ 01-Nov-2005 05:11 - +datasift/ 01-Nov-2005 05:14 - +dbunit/ 01-Nov-2005 05:13 - +de/ 29-Nov-2016 23:10 - +decorutils/ 01-Nov-2005 05:04 - +dentaku/ 01-Nov-2005 05:07 - +directory/ 24-Dec-2005 17:47 - +directory-asn1/ 01-Nov-2005 05:19 - +directory-authx/ 01-Nov-2005 05:21 - +directory-clients/ 01-Nov-2005 05:05 - +directory-naming/ 01-Nov-2005 05:03 - +directory-network/ 01-Nov-2005 05:07 - +directory-protocols/ 01-Nov-2005 05:09 - +directory-shared/ 01-Nov-2005 05:19 - +displaytag/ 12-Aug-2008 07:35 - +ditchnet/ 24-Nov-2005 06:03 - +dk/ 30-Nov-2016 00:31 - +dna/ 01-Nov-2005 05:21 - +dnsjava/ 01-Nov-2005 05:14 - +docbook/ 16-Jun-2006 18:32 - +doccheck/ 01-Nov-2005 05:10 - +dom4j/ 01-Nov-2005 05:16 - +domify/ 21-Aug-2011 14:31 - +dot-index/ 15-Jul-2012 10:55 - +doxia/ 28-Oct-2005 01:27 - +drone/ 01-Nov-2005 05:03 - +drools/ 31-Jan-2007 18:40 - +drools-examples/ 01-Nov-2005 05:10 - +dsh-vocabulary/ 01-Nov-2005 05:09 - +dtdparser/ 01-Nov-2005 05:15 - +dumbster/ 01-Nov-2005 05:03 - +dwr/ 24-Nov-2005 06:03 - +dynaop/ 01-Nov-2005 05:04 - +easyconf/ 01-Nov-2005 05:19 - +easymock/ 28-Oct-2005 01:27 - +ec/ 26-Jan-2015 11:42 - +echo/ 01-Nov-2005 05:07 - +echo3/ 21-Aug-2011 14:32 - +echo3extras/ 21-Aug-2011 14:32 - +eclipse/ 01-Nov-2005 05:03 - +ecs/ 01-Nov-2005 05:14 - +edenlib/ 01-Nov-2005 05:05 - +edtftp/ 01-Nov-2005 05:16 - +edu/ 30-Nov-2016 00:32 - +ee/ 30-Nov-2016 01:01 - +ehcache/ 28-Oct-2005 01:26 - +ejb/ 06-Dec-2005 20:11 - +el-impl/ 21-Aug-2011 14:32 - +emberio/ 01-Nov-2005 05:17 - +emma/ 01-Nov-2005 05:03 - +enterprises/ 07-Dec-2015 10:38 - +ervacon/ 01-Nov-2005 05:21 - +es/ 30-Nov-2016 01:01 - +esper/ 29-Jan-2008 02:43 - +eu/ 30-Nov-2016 01:03 - +eus/ 27-Apr-2015 10:40 - +excalibur/ 01-Nov-2005 05:06 - +excalibur-altrmi/ 01-Nov-2005 05:05 - +excalibur-cli/ 01-Nov-2005 05:07 - +excalibur-collections/ 01-Nov-2005 05:10 - +excalibur-component/ 01-Nov-2005 05:10 - +excalibur-component-examples/ 01-Nov-2005 05:04 - +excalibur-component-tests/ 01-Nov-2005 05:15 - +excalibur-concurrent/ 01-Nov-2005 05:07 - +excalibur-configuration/ 01-Nov-2005 05:09 - +excalibur-containerkit/ 01-Nov-2005 05:03 - +excalibur-datasource/ 01-Nov-2005 05:03 - +excalibur-event/ 01-Nov-2005 05:03 - +excalibur-extension/ 01-Nov-2005 05:04 - +excalibur-fortress/ 01-Nov-2005 05:04 - +excalibur-i18n/ 01-Nov-2005 05:15 - +excalibur-instrument/ 01-Nov-2005 05:10 - +excalibur-instrument-manager/ 01-Nov-2005 05:08 - +excalibur-instrument-manager-interfaces/ 01-Nov-2005 05:07 - +excalibur-io/ 01-Nov-2005 05:11 - +excalibur-lifecycle/ 01-Nov-2005 05:15 - +excalibur-logger/ 01-Nov-2005 05:04 - +excalibur-monitor/ 01-Nov-2005 05:15 - +excalibur-mpool/ 01-Nov-2005 05:05 - +excalibur-naming/ 01-Nov-2005 05:14 - +excalibur-pool/ 01-Nov-2005 05:03 - +excalibur-sourceresolve/ 01-Nov-2005 05:14 - +excalibur-store/ 01-Nov-2005 05:09 - +excalibur-thread/ 01-Nov-2005 05:07 - +excalibur-util/ 01-Nov-2005 05:15 - +excalibur-xmlutil/ 01-Nov-2005 05:04 - +exist/ 01-Nov-2005 05:12 - +exml/ 01-Nov-2005 05:16 - +exo/ 01-Nov-2005 00:35 - +exolabcore/ 01-Nov-2005 00:35 - +exteca/ 01-Nov-2005 00:35 - +external/ 01-Aug-2014 20:15 - +farm/ 26-Oct-2015 11:01 - +fastutil/ 01-Nov-2005 00:35 - +fesi/ 01-Nov-2005 00:35 - +fi/ 30-Nov-2016 01:13 - +findbugs/ 06-Nov-2006 01:05 - +fish/ 18-May-2015 10:45 - +flox/ 01-Nov-2005 00:35 - +flux/ 21-Aug-2011 14:32 - +fm/ 22-Feb-2016 09:57 - +foo/ 30-Nov-2016 01:49 - +foo3/ 21-Nov-2016 12:45 - +fop/ 01-Nov-2005 00:35 - +forehead/ 01-Nov-2005 00:35 - +formproc/ 01-Nov-2005 00:34 - +foundation/ 30-Nov-2016 01:49 - +foxtrot/ 12-Nov-2011 11:19 - +fr/ 30-Nov-2016 01:49 - +freebxml/ 01-Nov-2005 00:34 - +freemarker/ 01-Nov-2005 00:35 - +frl/ 14-Sep-2015 11:30 - +fulcrum/ 01-Nov-2005 00:35 - +ga/ 30-Nov-2016 02:02 - +gabriel/ 01-Nov-2005 00:35 - +gbean/ 01-Nov-2005 00:35 - +generama/ 17-Jul-2008 20:56 - +genjar/ 01-Nov-2005 00:34 - +genjava/ 01-Nov-2005 00:35 - +geronimo/ 08-Jan-2007 15:55 - +geronimo-spec/ 01-Nov-2005 00:35 - +gg/ 12-May-2012 09:05 - +github/ 30-Nov-2016 02:04 - +glassfish/ 21-Aug-2011 14:33 - +global/ 30-Nov-2016 02:04 - +gnu/ 21-Aug-2011 14:33 - +gnu-regexp/ 01-Nov-2005 00:35 - +gov/ 30-Nov-2016 02:04 - +gr/ 30-Nov-2016 02:18 - +graphlayout/ 01-Nov-2005 00:35 - +grizzly/ 21-Aug-2011 14:33 - +grizzly-cachetest/ 21-Aug-2011 14:33 - +groovy/ 30-Apr-2007 21:29 - +groovy-xmlrpc/ 26-May-2006 21:50 - +gs/ 08-Sep-2012 07:49 - +gsbase/ 01-Nov-2005 00:35 - +guru/ 26-Jan-2015 11:51 - +hessian/ 01-Nov-2005 00:34 - +hibernate/ 26-Dec-2008 14:12 - +hivemind/ 01-Nov-2005 00:34 - +hm/ 01-Aug-2014 20:22 - +howl/ 01-Nov-2005 00:35 - +hr/ 30-Nov-2016 02:20 - +hsqldb/ 28-Oct-2005 01:27 - +htmlunit/ 01-Nov-2005 00:34 - +httpcomponents-httpcore/ 02-Jul-2007 18:15 - +httpunit/ 28-Oct-2005 01:26 - +hu/ 30-Nov-2016 02:20 - +hudson/ 21-Aug-2011 14:34 - +ical4j/ 01-Nov-2005 00:34 - +icu/ 03-Nov-2005 01:12 - +icu4j/ 03-Nov-2005 21:39 - +id/ 30-Nov-2016 02:21 - +idb/ 01-Nov-2005 00:35 - +ie/ 21-Dec-2015 09:56 - +iirekm/ 21-Aug-2011 14:34 - +il/ 30-Nov-2016 02:21 - +im/ 30-Nov-2016 02:21 - +in/ 30-Nov-2016 02:50 - +info/ 30-Nov-2016 02:51 - +informa/ 01-Nov-2005 00:34 - +innig/ 01-Nov-2005 00:35 - +int/ 24-Aug-2014 05:19 - +io/ 30-Nov-2016 03:02 - +ir/ 30-Nov-2016 13:35 - +is/ 03-Nov-2014 11:18 - +isorelax/ 01-Nov-2005 00:35 - +it/ 30-Nov-2016 13:37 - +itext/ 01-Nov-2005 00:35 - +ivory/ 01-Nov-2005 00:35 - +izpack/ 01-Nov-2005 00:35 - +jaas/ 01-Nov-2005 00:35 - +jackcess/ 01-Nov-2005 00:35 - +jackson/ 06-Sep-2008 07:58 - +jacl/ 01-Nov-2005 00:35 - +jaf/ 28-Oct-2005 01:27 - +jaimbot/ 01-Nov-2005 00:35 - +jakarta-regexp/ 01-Nov-2005 00:34 - +jalopy/ 01-Nov-2005 00:35 - +james/ 01-Nov-2005 00:35 - +janino/ 01-Nov-2005 00:35 - +jardiff/ 14-Feb-2006 01:31 - +jarjar/ 01-Nov-2005 00:35 - +jarsync/ 01-Nov-2005 00:35 - +jasper-jsr199/ 21-Aug-2011 14:37 - +jasperreports/ 01-Nov-2005 00:35 - +java2html/ 01-Nov-2005 00:34 - +java3d/ 01-Nov-2005 00:35 - +java_cup/ 01-Aug-2014 21:21 - +javacc/ 01-Nov-2005 00:34 - +javaconfig/ 01-Nov-2005 00:35 - +javadb/ 21-Aug-2011 14:37 - +javadoc/ 31-Oct-2005 19:40 - +javaee/ 21-Aug-2011 14:37 - +javagroups/ 01-Nov-2005 05:14 - +javainetlocator/ 01-Nov-2005 05:03 - +javamail/ 01-Nov-2005 05:07 - +javancss/ 01-Nov-2005 05:19 - +javanettasks/ 21-Aug-2011 14:37 - +javassist/ 01-Apr-2008 07:08 - +javassist / 04-Apr-2008 17:18 - +javatar/ 01-Nov-2005 05:19 - +javax/ 20-Jul-2015 11:38 - +javazoom/ 10-Nov-2012 09:25 - +javolution/ 21-Aug-2011 17:05 - +jawin/ 24-Nov-2005 06:03 - +jaxb/ 21-Aug-2011 14:37 - +jaxen/ 19-Oct-2006 19:23 - +jaxme/ 06-Nov-2006 01:06 - +jaxr-ra/ 21-Aug-2011 14:37 - +jblanket/ 01-Nov-2005 05:11 - +jboss/ 27-Apr-2013 08:15 - +jca/ 01-Nov-2005 05:03 - +jcache/ 01-Nov-2005 05:03 - +jcharts/ 06-Dec-2007 02:46 - +jcifs/ 29-Apr-2008 16:16 - +jcom/ 24-Nov-2005 06:03 - +jcommon/ 28-Oct-2005 01:27 - +jcoverage/ 01-Nov-2005 05:20 - +jcs/ 01-Nov-2005 05:03 - +jcs-javagroups/ 01-Nov-2005 05:18 - +jcvsii/ 01-Nov-2005 05:03 - +jdbc/ 28-Oct-2005 01:26 - +jdbm/ 01-Nov-2005 05:13 - +jdepend/ 01-Nov-2005 05:03 - +jdiff/ 01-Nov-2005 05:19 - +jdo/ 01-Nov-2005 05:03 - +jdom/ 28-Oct-2005 01:27 - +jdring/ 01-Nov-2005 05:09 - +jdsl/ 01-Nov-2005 05:04 - +jen/ 21-Aug-2011 14:38 - +jencks/ 01-Nov-2005 05:13 - +jep/ 01-Nov-2005 05:03 - +jepi/ 21-Aug-2011 14:38 - +jersey/ 21-Aug-2011 14:38 - +jetty/ 20-Oct-2006 15:24 - +jexcelapi/ 06-Nov-2006 01:07 - +jface/ 01-Nov-2005 05:09 - +jfree/ 13-Dec-2006 19:51 - +jfreechart/ 01-Nov-2005 05:15 - +jgen/ 01-Nov-2005 05:20 - +jgoodies/ 01-Nov-2005 05:13 - +jgraph/ 01-Nov-2005 05:07 - +jgrapht/ 01-Nov-2005 05:07 - +jgroups/ 01-Nov-2005 05:04 - +jhunlang/ 01-Nov-2005 05:04 - +jini/ 10-Dec-2005 02:18 - +jintention/ 21-Aug-2011 14:38 - +jisp/ 01-Nov-2005 05:10 - +jivesoftware/ 01-Nov-2005 05:03 - +jlibdiff/ 01-Nov-2005 05:03 - +jline/ 19-Oct-2006 19:23 - +jmagick/ 21-Aug-2011 14:38 - +jmaki/ 21-Aug-2011 14:38 - +jmdns/ 01-Nov-2005 05:14 - +jmimemagic/ 01-Nov-2005 05:14 - +jmml/ 01-Nov-2005 05:12 - +jmock/ 28-Oct-2005 01:26 - +jms/ 28-Oct-2005 01:27 - +jmscts/ 01-Nov-2005 05:09 - +jmsn/ 01-Nov-2005 05:16 - +joda-time/ 15-Nov-2009 14:12 - +john-test/ 29-May-2008 08:01 - +jotm/ 01-Nov-2005 05:20 - +jp/ 30-Nov-2016 13:53 - +jparsec/ 26-Aug-2006 17:55 - +jpl/ 10-Nov-2012 09:26 - +jpox/ 21-Jan-2008 06:44 - +jpox-dbcp/ 13-Mar-2007 21:30 - +jpox-enhancer/ 13-Mar-2007 21:30 - +jpox-java5/ 13-Mar-2007 21:30 - +jrexx/ 01-Nov-2005 05:11 - +jrms/ 01-Nov-2005 05:19 - +jrobin/ 01-Nov-2005 05:06 - +jruby/ 21-Aug-2007 18:14 - +jsch/ 28-Oct-2005 01:26 - +jsf-extensions/ 21-Aug-2011 14:38 - +jspapi/ 28-Oct-2005 01:26 - +jsptags/ 01-Nov-2005 05:15 - +jstl/ 28-Oct-2005 01:26 - +jstyle/ 01-Nov-2005 05:09 - +jta/ 28-Oct-2005 01:26 - +jtds/ 20-Jan-2006 12:18 - +jtidy/ 28-Oct-2005 01:27 - +juddi/ 01-Nov-2005 05:03 - +jug/ 01-Nov-2005 05:12 - +jung/ 01-Nov-2005 05:03 - +junit/ 10-May-2009 13:17 - +junit-addons/ 28-Oct-2005 01:27 - +junit-doclet/ 01-Nov-2005 05:19 - +junitperf/ 01-Nov-2005 05:21 - +juno/ 21-Aug-2011 14:38 - +jwebunit/ 01-Nov-2005 05:10 - +jxta/ 01-Nov-2005 05:10 - +jython/ 01-Nov-2005 05:04 - +kawa/ 01-Nov-2005 05:04 - +kg/ 23-Feb-2013 09:19 - +kohsuke/ 21-Aug-2011 14:38 - +kr/ 30-Nov-2016 13:56 - +kxml/ 01-Nov-2005 05:09 - +kxml2/ 01-Nov-2005 05:07 - +kz/ 04-Jan-2016 09:50 - +la/ 20-Apr-2015 11:09 - +ldapd-common/ 01-Nov-2005 05:21 - +ldapsdk/ 01-Nov-2005 05:11 - +li/ 30-Nov-2016 14:03 - +life/ 30-Nov-2016 14:04 - +lingo/ 01-Nov-2005 05:21 - +link/ 07-Dec-2015 11:24 - +locc/ 01-Nov-2005 05:11 - +log4j/ 28-Nov-2007 21:22 - +log4unit/ 01-Nov-2005 05:20 - +logkit/ 02-Nov-2005 09:29 - +loom/ 01-Nov-2005 05:21 - +lpg/ 16-Nov-2013 10:06 - +lt/ 19-Jan-2013 09:12 - +lucene/ 01-Nov-2005 05:04 - +lv/ 22-Feb-2016 10:49 - +ly/ 29-Sep-2014 10:35 - +ma/ 30-Nov-2016 14:08 - +magicGball/ 01-Nov-2005 05:03 - +maps/ 21-Aug-2011 14:38 - +market/ 12-Oct-2015 22:45 - +marmalade/ 21-Jul-2006 17:02 - +math/ 23-Nov-2013 10:01 - +maven/ 06-Nov-2006 01:08 - +maven-integration-test-helper/ 11-Jun-2011 11:01 - +maven-javanet-plugin/ 21-Aug-2011 14:39 - +maven-new/ 01-Nov-2005 05:06 - +maven-plugins/ 06-Nov-2006 01:07 - +maven-proxy/ 01-Nov-2005 05:03 - +maven-taglib/ 01-Nov-2005 05:19 - +maven-torque-plugin/ 01-Nov-2005 05:03 - +maven-validator/ 01-Nov-2005 05:07 - +maven-xdoclet2-plugin/ 01-Nov-2005 05:19 - +maxq/ 01-Nov-2005 05:09 - +mckoi/ 01-Nov-2005 05:12 - +md/ 30-Nov-2016 14:09 - +me/ 30-Nov-2016 14:09 - +merlin/ 01-Nov-2005 05:02 - +merlin-developer/ 01-Nov-2005 05:19 - +merlin-tutorial/ 01-Nov-2005 05:15 - +messenger/ 01-Nov-2005 05:08 - +metaclass/ 01-Nov-2005 05:08 - +mevenide/ 01-Nov-2005 05:14 - +microcontainer/ 01-Nov-2005 05:16 - +middlegen/ 01-Nov-2005 05:03 - +mil/ 30-Nov-2016 14:19 - +milyn/ 16-May-2007 17:40 - +ml/ 30-Nov-2016 14:20 - +mm/ 01-Nov-2005 05:12 - +mm-mysql/ 01-Nov-2005 05:16 - +mobi/ 30-Nov-2016 14:22 - +mockcreator/ 01-Nov-2005 05:09 - +mockit/ 21-Aug-2011 14:39 - +mockmaker/ 01-Nov-2005 05:07 - +mockobjects/ 01-Nov-2005 05:05 - +mockrunner/ 24-Nov-2005 06:03 - +modello/ 01-Nov-2005 05:12 - +mrj/ 01-Nov-2005 05:14 - +ms/ 01-Aug-2014 21:28 - +mstor/ 01-Nov-2005 05:14 - +msv/ 01-Nov-2005 05:15 - +mule/ 10-Apr-2007 13:34 - +muse/ 01-Nov-2005 05:11 - +mx/ 22-Feb-2016 10:54 - +mx4j/ 01-Nov-2005 05:14 - +myfaces/ 21-Nov-2005 13:21 - +mysql/ 15-Oct-2011 10:12 - +name/ 30-Nov-2016 14:22 - +nanning/ 01-Nov-2005 05:11 - +nanocontainer/ 14-Jun-2006 10:28 - +nekohtml/ 01-Jun-2008 16:25 - +neo/ 01-Nov-2005 05:08 - +net/ 30-Nov-2016 14:23 - +netbeans/ 01-Nov-2005 05:04 - +new/ 21-Aug-2011 15:09 - +nf/ 02-Mar-2013 10:13 - +ng/ 30-Nov-2016 16:55 - +ninja/ 16-Nov-2015 14:52 - +nl/ 30-Nov-2016 16:55 - +no/ 30-Nov-2016 17:07 - +norbert/ 01-Nov-2005 05:03 - +np/ 17-Nov-2014 12:32 - +nsuml/ 01-Nov-2005 05:16 - +nu/ 30-Nov-2016 17:15 - +nz/ 30-Nov-2016 17:15 - +oauth/ 26-Feb-2010 19:44 - +odmg/ 28-Oct-2005 01:27 - +ognl/ 20-Jun-2007 20:09 - +ojb/ 01-Nov-2005 05:11 - +ojdbc/ 28-Oct-2005 01:26 - +old/ 01-Nov-2005 05:13 - +one/ 30-Nov-2015 14:42 - +oness/ 01-Nov-2005 05:13 - +online/ 30-Nov-2016 17:23 - +open/ 21-Aug-2011 15:33 - +open-esb/ 21-Aug-2011 15:33 - +opencypher/ 30-Nov-2016 17:23 - +openejb/ 07-May-2006 00:35 - +openim/ 01-Nov-2005 05:12 - +openjms/ 01-Nov-2005 05:03 - +opennms/ 01-Nov-2005 05:06 - +opensymphony/ 19-Feb-2009 14:07 - +oracle/ 21-Aug-2011 15:33 - +org/ 30-Nov-2016 17:23 - +org.elasticsearch/ 30-Nov-2016 17:23 - +org.elasticsearch.client/ 30-Nov-2016 17:23 - +org.elasticsearch.distribution.integ-test-zip/ 30-Nov-2016 17:23 - +org.elasticsearch.distribution.zip/ 30-Nov-2016 17:23 - +org.elasticsearch.gradle/ 30-Nov-2016 17:23 - +org.elasticsearch.plugin/ 30-Nov-2016 17:23 - +org.elasticsearch.test/ 30-Nov-2016 17:23 - +oro/ 28-Oct-2005 01:27 - +oscube/ 01-Nov-2005 05:02 - +p2psockets/ 01-Nov-2005 05:15 - +p6spy/ 01-Nov-2005 05:05 - +patterntesting/ 01-Nov-2005 05:05 - +payload/ 01-Nov-2005 05:03 - +pcj/ 01-Nov-2005 05:09 - +pdfbox/ 01-Nov-2005 05:16 - +pe/ 21-Nov-2016 12:45 - +penguin/ 01-Nov-2005 05:10 - +petridish/ 01-Nov-2005 05:06 - +ph/ 30-Jun-2012 17:32 - +piccolo/ 01-Nov-2005 05:03 - +picocontainer/ 14-Jun-2006 10:25 - +picounit/ 01-Nov-2005 05:10 - +pircbot/ 01-Nov-2005 05:06 - +pitt/ 07-Dec-2013 15:12 - +pl/ 25-Jan-2016 18:00 - +plexus/ 04-Jan-2007 19:16 - +plj/ 01-Nov-2005 05:14 - +plugin/ 01-Nov-2005 05:07 - +pluto-container/ 01-Nov-2005 05:07 - +pmd/ 10-Aug-2008 09:08 - +pnuts/ 22-Aug-2011 09:13 - +poi/ 28-Oct-2005 23:26 - +poolman/ 01-Nov-2005 05:20 - +portlet-api/ 01-Nov-2005 05:10 - +postgresql/ 01-Nov-2005 05:15 - +prevayler/ 01-Nov-2005 05:13 - +pro/ 03-Nov-2015 02:37 - +proctor/ 22-Aug-2011 09:13 - +profiler/ 01-Nov-2005 05:11 - +proxool/ 28-Oct-2005 01:27 - +proxytoys/ 01-Nov-2005 05:04 - +pt/ 15-Dec-2015 03:32 - +pubscribe/ 01-Nov-2005 05:11 - +pull-parser/ 28-Oct-2005 01:27 - +pw/ 26-Oct-2013 13:30 - +qdox/ 28-Oct-2005 01:27 - +qfork/ 01-Nov-2005 05:14 - +quartz/ 01-Nov-2005 05:16 - +quartz-jboss/ 26-Feb-2010 21:25 - +quartz-oracle/ 26-Feb-2010 21:25 - +quartz-weblogic/ 26-Feb-2010 21:25 - +quilt/ 01-Nov-2005 05:12 - +radeox/ 01-Nov-2005 05:14 - +re/ 17-Aug-2014 12:17 - +readline/ 01-Nov-2005 05:10 - +red/ 21-Nov-2016 12:45 - +redhill/ 01-Nov-2005 05:03 - +redis/ 09-Oct-2010 07:48 - +redmine/ 22-Aug-2011 09:13 - +regexp/ 19-Oct-2006 19:23 - +relaxngDatatype/ 01-Nov-2005 05:15 - +ren/ 19-Oct-2015 23:59 - +reportrunner/ 01-Nov-2005 05:15 - +rest/ 21-Nov-2016 12:45 - +rhino/ 01-Nov-2005 05:11 - +ro/ 21-Dec-2015 16:56 - +robo-guice/ 22-Aug-2011 09:13 - +roboguice/ 22-Aug-2011 09:13 - +rocks/ 20-Oct-2014 18:43 - +roller/ 22-Aug-2011 09:13 - +rome/ 22-Aug-2011 09:13 - +rs/ 01-Dec-2014 19:54 - +rss4j/ 01-Nov-2005 05:08 - +rsslibj/ 01-Nov-2005 05:04 - +ru/ 14-Mar-2016 15:50 - +rubygems/ 27-Oct-2015 00:40 - +run/ 21-Nov-2016 12:45 - +sablecc/ 01-Nov-2005 05:04 - +sax/ 01-Nov-2005 05:11 - +saxon/ 19-Oct-2006 19:23 - +saxpath/ 28-Oct-2005 01:26 - +sc/ 15-Jun-2015 21:26 - +science/ 21-Nov-2016 12:45 - +scout/ 29-Oct-2005 08:00 - +scraping-engine/ 01-Nov-2005 05:07 - +se/ 11-Jan-2016 15:55 - +securityfilter/ 01-Nov-2005 05:13 - +servicemix/ 25-Mar-2006 00:55 - +servicemix-ws/ 01-Nov-2005 05:15 - +servletapi/ 28-Oct-2005 23:26 - +servlets/ 01-Nov-2005 05:12 - +setpoint/ 06-Nov-2006 01:09 - +sfx4j/ 22-Aug-2011 09:14 - +sg/ 21-Nov-2016 12:45 - +sh/ 10-Nov-2015 04:31 - +shellix/ 22-Aug-2011 09:14 - +shocks/ 01-Nov-2005 05:11 - +si/ 15-Feb-2016 16:33 - +sillyexceptions/ 01-Nov-2005 05:04 - +simple-jms/ 09-Dec-2005 01:32 - +simple-jndi/ 01-Nov-2005 05:19 - +sk/ 15-Feb-2016 16:33 - +skaringa/ 01-Nov-2005 05:09 - +skinlf/ 01-Nov-2005 05:03 - +slide/ 01-Nov-2005 05:14 - +smartrics/ 15-Dec-2012 12:57 - +soap/ 01-Nov-2005 05:04 - +software/ 14-Mar-2016 15:54 - +soimp/ 22-Aug-2011 09:14 - +solarisrealm/ 22-Aug-2011 09:14 - +solutions/ 20-Oct-2015 00:09 - +space/ 21-Nov-2016 12:45 - +speexx/ 01-Nov-2005 05:04 - +spice/ 01-Nov-2005 05:03 - +spring/ 01-Nov-2005 05:07 - +springframework/ 01-Nov-2005 05:11 - +springmodules/ 19-Jun-2006 22:22 - +sqlline/ 09-Mar-2015 21:41 - +sshtools/ 01-Nov-2005 05:03 - +sslext/ 01-Nov-2005 05:04 - +st/ 10-Aug-2015 22:33 - +stapler/ 22-Aug-2011 09:15 - +statcvs/ 01-Nov-2005 05:07 - +stax/ 06-Nov-2006 01:09 - +stax-utils/ 01-Nov-2005 05:11 - +stratum/ 01-Nov-2005 05:14 - +stream/ 21-Nov-2016 12:45 - +struts/ 01-Nov-2005 05:15 - +struts-menu/ 01-Nov-2005 05:03 - +strutstestcase/ 01-Nov-2005 05:12 - +studio/ 21-Nov-2016 12:45 - +stxx/ 01-Nov-2005 05:05 - +su/ 10-Aug-2014 15:19 - +subpersistence/ 01-Nov-2005 05:09 - +subshell/ 01-Nov-2005 05:03 - +suiterunner/ 01-Nov-2005 05:09 - +surefire/ 28-Oct-2005 01:26 - +swarmcache/ 28-Oct-2005 01:26 - +swt/ 01-Nov-2005 05:05 - +systems/ 18-Jan-2016 16:33 - +sysunit/ 01-Nov-2005 05:15 - +tablelayout/ 01-Nov-2005 05:14 - +tagalog/ 01-Nov-2005 05:16 - +tagishauth/ 01-Nov-2005 05:03 - +taglibrarydoc/ 01-Nov-2005 05:07 - +taglibs/ 01-Nov-2005 05:06 - +tagsoup/ 05-Nov-2005 01:42 - +tambora/ 01-Nov-2005 05:20 - +tanukisoft/ 07-Mar-2008 02:07 - +tapestry/ 01-Nov-2005 05:04 - +tclib/ 01-Nov-2005 05:07 - +tec/ 23-Mar-2015 21:07 - +tech/ 22-Feb-2016 17:58 - +technology/ 15-Dec-2015 03:41 - +textarea/ 01-Nov-2005 05:16 - +th/ 13-Oct-2015 11:58 - +thaiopensource/ 19-Oct-2006 19:23 - +tiffrenderer/ 01-Nov-2005 05:09 - +tjdo/ 01-Nov-2005 05:03 - +tk/ 11-Jan-2016 15:58 - +tl/ 13-Jul-2013 12:50 - +tmporb/ 01-Nov-2005 05:09 - +to/ 25-Jan-2016 18:06 - +tokyo/ 21-Nov-2016 12:45 - +tomcat/ 24-Jan-2008 04:19 - +tomcat-util/ 01-Nov-2005 05:20 - +tonic/ 08-Nov-2005 05:35 - +tools/ 29-Feb-2016 17:11 - +top/ 08-Feb-2016 18:28 - +toplink/ 22-Aug-2011 09:16 - +torque/ 11-Jan-2008 22:47 - +torque-gen/ 01-Nov-2005 05:04 - +touchstone/ 01-Nov-2005 05:10 - +tr/ 15-Dec-2015 03:41 - +traer/ 07-Apr-2012 17:18 - +trail-taglib/ 01-Nov-2005 05:04 - +tranql/ 01-Nov-2005 05:10 - +travel/ 04-May-2015 22:09 - +trove/ 01-Nov-2005 05:08 - +turbine/ 01-Nov-2005 05:04 - +tv/ 18-Jan-2016 16:34 - +tw/ 18-May-2015 21:53 - +tyrex/ 01-Nov-2005 05:14 - +ua/ 29-Feb-2016 17:11 - +uaihebert/ 23-Feb-2013 13:20 - +ubique/ 01-Nov-2005 05:15 - +ug/ 25-Jan-2016 18:07 - +uispec4j/ 01-Nov-2005 05:07 - +uk/ 10-Aug-2015 22:35 - +uno/ 01-Dec-2015 04:36 - +urbanophile/ 01-Nov-2005 05:03 - +urlrewrite/ 24-Nov-2005 06:03 - +us/ 18-Jan-2016 16:35 - +uy/ 24-Aug-2015 23:36 - +vc/ 28-Dec-2015 15:38 - +vdoclet/ 01-Nov-2005 05:11 - +velocity/ 29-Apr-2007 21:29 - +velocity-anakia/ 29-Apr-2007 21:29 - +velocity-dvsl/ 01-Nov-2005 05:12 - +velocity-tools/ 01-Nov-2005 05:10 - +village/ 01-Nov-2005 05:04 - +vn/ 02-Dec-2016 00:09 - +vu/ 20-Jul-2013 12:57 - +wadi/ 01-Nov-2005 05:15 - +wang/ 10-Aug-2015 22:36 - +webmacro/ 01-Nov-2005 05:12 - +website/ 22-Feb-2016 18:03 - +webtest/ 01-Nov-2005 05:19 - +werken-xpath/ 28-Oct-2005 01:26 - +werkflow/ 01-Nov-2005 05:16 - +werkz/ 01-Nov-2005 05:08 - +westhawk/ 01-Nov-2005 05:18 - +wf/ 10-Nov-2014 19:54 - +which/ 01-Nov-2005 05:16 - +wicket/ 11-Aug-2008 15:44 - +wiki/ 22-Feb-2016 18:03 - +win/ 21-Nov-2016 12:45 - +woodstox/ 21-Nov-2007 04:35 - +work/ 18-Jan-2016 16:37 - +works/ 22-Feb-2016 18:03 - +wrapper/ 01-Nov-2005 05:14 - +ws/ 25-Jan-2016 18:11 - +ws-commons/ 19-Sep-2006 14:21 - +ws-commons-java5/ 01-Nov-2005 05:03 - +ws-commons-util/ 01-Nov-2005 05:16 - +ws-scout/ 18-Feb-2006 13:32 - +wsdl4j/ 01-Nov-2005 05:07 - +wsrf/ 01-Nov-2005 05:08 - +wss4j/ 02-May-2006 20:32 - +wstx/ 01-Nov-2005 05:09 - +wurfl/ 01-Nov-2005 05:14 - +wutka/ 01-Nov-2005 05:21 - +xajile/ 03-Aug-2009 09:25 - +xalan/ 30-Sep-2008 08:02 - +xbean/ 04-Jan-2006 17:31 - +xdoclet/ 17-Jul-2008 21:29 - +xdoclet-plugins/ 02-Jul-2006 21:14 - +xerces/ 19-Oct-2006 19:23 - +xercesjarv/ 01-Nov-2005 05:06 - +xfire/ 06-Nov-2006 01:09 - +xfire-root/ 01-Nov-2005 05:03 - +xin/ 21-Nov-2016 12:45 - +xjavadoc/ 01-Nov-2005 05:14 - +xml-apis/ 22-Dec-2006 13:37 - +xml-resolver/ 01-Nov-2005 05:11 - +xml-security/ 19-Oct-2006 19:23 - +xmlbeans/ 03-Jul-2007 16:43 - +xmldb/ 01-Nov-2005 05:12 - +xmlenc/ 01-Nov-2005 05:19 - +xmlmind/ 01-Nov-2005 05:21 - +xmlpull/ 01-Nov-2005 05:21 - +xmlrpc/ 25-Jun-2006 02:41 - +xmlrpc-helma/ 01-Nov-2005 05:03 - +xmlunit/ 15-Sep-2008 23:50 - +xmlwise/ 27-Oct-2012 10:59 - +xmlwriter/ 01-Nov-2005 05:04 - +xom/ 19-Oct-2006 19:23 - +xpp3/ 28-Oct-2005 01:26 - +xsddoc/ 01-Nov-2005 05:19 - +xsdlib/ 01-Nov-2005 05:04 - +xstream/ 27-Nov-2006 21:45 - +xtc/ 07-Apr-2012 17:20 - +xtiff-jai/ 01-Nov-2005 05:10 - +xxl/ 01-Nov-2005 05:12 - +xyz/ 08-Feb-2016 18:33 - +yan/ 13-Jan-2006 21:31 - +ymsg/ 01-Nov-2005 05:04 - +yom/ 01-Nov-2005 05:08 - +za/ 25-May-2013 12:39 - +zone/ 26-Jan-2015 23:05 - +94a8262a403880.properties 03-Feb-2015 07:36 301 +94a8262a403880.properties.md5 20-May-2015 05:24 32 +94a8262a403880.properties.sha1 20-May-2015 05:24 40 +9e9bbc30f020cf.properties 03-Oct-2014 19:03 310 +9e9bbc30f020cf.properties.md5 02-Nov-2014 16:27 32 +9e9bbc30f020cf.properties.sha1 02-Nov-2014 16:27 40 +archetype-catalog.xml 27-Nov-2016 13:20 5385400 +archetype-catalog.xml.md5 27-Nov-2016 13:20 32 +archetype-catalog.xml.sha1 27-Nov-2016 13:20 40 +fb69c44c24b38.properties 17-Apr-2014 13:29 307 +fb69c44c24b38.properties.md5 02-Nov-2014 14:37 32 +fb69c44c24b38.properties.sha1 02-Nov-2014 14:37 40 +last_updated.txt 28-Nov-2016 06:55 29 +robots.txt 10-Nov-2009 12:12 26 +server.txt 08-Nov-2014 19:04 207 +
../ +HTTPClient/ 01-Nov-2005 05:03 - +abbot/ 28-Sep-2015 06:18 - +acegisecurity/ 23-Dec-2005 12:20 - +activation/ 21-Dec-2005 15:37 - +activecluster/ 01-Nov-2005 05:09 - +activeio/ 01-Nov-2005 05:10 - +activemq/ 01-Nov-2005 05:13 - +activemq-jaxb/ 01-Nov-2005 05:11 - +activesoap/ 01-Nov-2005 05:20 - +activespace/ 01-Nov-2005 05:04 - +adarwin/ 01-Nov-2005 05:03 - +ae/ 06-Apr-2015 06:14 - +aelfred/ 01-Nov-2005 05:03 - +aero/ 01-Aug-2014 14:03 - +ai/ 28-Nov-2016 07:10 - +aislib/ 01-Nov-2005 05:14 - +al/ 21-Nov-2016 13:18 - +altrmi/ 01-Nov-2005 05:14 - +am/ 21-Nov-2016 13:19 - +andromda/ 01-Nov-2005 05:19 - +annogen/ 01-Nov-2005 05:19 - +ant/ 01-Nov-2005 05:17 - +ant-contrib/ 08-Aug-2008 22:17 - +ant-doxygen/ 01-Nov-2005 05:04 - +ant4eclipse/ 21-Aug-2011 11:53 - +antlr/ 01-Nov-2005 05:12 - +anttex/ 01-Nov-2005 05:19 - +aopalliance/ 28-Oct-2005 01:26 - +apache-jaxme/ 01-Nov-2005 05:10 - +aptconvert/ 01-Nov-2005 05:07 - +ar/ 06-Mar-2008 17:19 - +args4j/ 16-Mar-2013 07:01 - +as/ 25-May-2015 06:15 - +ashkay/ 01-Nov-2005 05:13 - +ashkelon/ 01-Nov-2005 05:20 - +asia/ 23-Feb-2013 08:01 - +asm/ 07-Jul-2009 04:08 - +aspectj/ 21-Dec-2005 12:23 - +aspectwerkz/ 01-Nov-2005 05:09 - +at/ 28-Nov-2016 07:12 - +au/ 12-Oct-2015 07:37 - +avalon/ 19-Oct-2006 19:23 - +avalon-activation/ 01-Nov-2005 05:20 - +avalon-apps/ 01-Nov-2005 05:14 - +avalon-composition/ 01-Nov-2005 05:13 - +avalon-cornerstone/ 01-Nov-2005 05:02 - +avalon-extension/ 01-Nov-2005 05:09 - +avalon-framework/ 01-Nov-2005 05:15 - +avalon-http/ 18-Jul-2006 18:10 - +avalon-logging/ 01-Nov-2005 05:19 - +avalon-logkit/ 01-Nov-2005 05:11 - +avalon-meta/ 01-Nov-2005 05:05 - +avalon-phoenix/ 01-Nov-2005 05:10 - +avalon-repository/ 01-Nov-2005 05:10 - +avalon-util/ 01-Nov-2005 05:12 - +axion/ 01-Nov-2005 05:20 - +axis/ 19-Oct-2006 19:23 - +axis2/ 04-May-2006 20:31 - +azote/ 01-Nov-2005 05:14 - +ba/ 29-Jun-2015 06:17 - +backport-util-concurrent/ 20-Feb-2008 05:30 - +backport175/ 01-Nov-2005 05:07 - +band/ 21-Nov-2016 13:41 - +barsuift/ 21-Aug-2011 11:54 - +batik/ 01-Nov-2005 05:09 - +bcel/ 28-Oct-2005 01:26 - +be/ 21-Nov-2016 13:41 - +beehive/ 01-Nov-2005 05:10 - +berkano/ 01-Nov-2005 05:14 - +berkeleydb/ 01-Nov-2005 05:06 - +binky/ 26-Feb-2010 19:31 - +biz/ 14-Mar-2016 06:15 - +black/ 01-Jun-2015 06:20 - +blissed/ 01-Nov-2005 05:04 - +boo/ 06-Nov-2006 01:04 - +bouncycastle/ 03-Sep-2009 13:30 - +boxstuff/ 01-Nov-2005 05:12 - +br/ 21-Nov-2016 13:45 - +bsf/ 01-Nov-2005 05:03 - +bsh/ 01-Nov-2005 05:03 - +burlap/ 01-Nov-2005 05:03 - +by/ 12-Jan-2015 07:18 - +bz/ 01-Aug-2014 14:08 - +c10n/ 09-Mar-2013 08:02 - +c3p0/ 01-Nov-2005 05:06 - +ca/ 21-Nov-2016 13:53 - +cactus/ 11-Apr-2008 19:59 - +cargo/ 01-Nov-2005 05:07 - +cas/ 22-Jun-2006 17:05 - +castor/ 06-Dec-2007 02:46 - +cat/ 21-Nov-2016 14:02 - +cc/ 21-Nov-2016 14:02 - +cd/ 05-Jan-2015 07:18 - +cewolf/ 01-Nov-2005 05:04 - +cf/ 01-Aug-2014 14:11 - +cglib/ 29-Feb-2016 07:17 - +ch/ 21-Nov-2016 14:07 - +charlotte/ 01-Nov-2005 05:04 - +checkstyle/ 28-Oct-2005 01:27 - +cl/ 06-Jul-2015 06:24 - +classworlds/ 01-Nov-2005 05:10 - +clickstream/ 24-Nov-2005 06:03 - +clirr/ 01-Nov-2005 05:04 - +cloud/ 21-Nov-2016 14:20 - +clover/ 01-Nov-2005 05:11 - +cm/ 21-Nov-2016 14:20 - +cmsdeploy/ 06-Dec-2005 20:10 - +cn/ 28-Nov-2016 07:25 - +co/ 21-Nov-2016 14:24 - +cobertura/ 06-Feb-2006 21:04 - +coconut/ 01-Nov-2005 05:21 - +cocoon/ 09-Jun-2008 20:01 - +code/ 21-Aug-2011 11:56 - +code316/ 01-Nov-2005 05:03 - +codehaus/ 16-Jul-2008 22:44 - +codes/ 01-Jun-2015 06:28 - +colt/ 01-Nov-2005 05:03 - +com/ 28-Nov-2016 07:29 - +commons-attributes/ 03-Jul-2006 21:30 - +commons-beanutils/ 01-Dec-2012 08:50 - +commons-betwixt/ 01-Nov-2005 05:13 - +commons-chain/ 01-Jun-2008 18:20 - +commons-cli/ 19-Mar-2009 20:08 - +commons-codec/ 09-Aug-2009 21:14 - +commons-collections/ 15-Apr-2008 01:05 - +commons-compress/ 01-Nov-2005 05:21 - +commons-configuration/ 11-Jan-2009 14:01 - +commons-daemon/ 01-Nov-2005 05:12 - +commons-dbcp/ 28-Oct-2005 01:26 - +commons-dbutils/ 26-Apr-2009 04:30 - +commons-digester/ 03-Jan-2009 21:44 - +commons-discovery/ 01-Nov-2005 05:03 - +commons-el/ 28-Oct-2005 01:27 - +commons-email/ 28-Sep-2007 19:29 - +commons-fileupload/ 20-Feb-2007 11:31 - +commons-grafolia/ 01-Nov-2005 05:03 - +commons-grant/ 01-Nov-2005 05:16 - +commons-graph/ 01-Nov-2005 05:19 - +commons-http/ 01-Nov-2005 05:21 - +commons-httpclient/ 01-Nov-2005 05:19 - +commons-i18n/ 01-Nov-2005 05:19 - +commons-io/ 01-Jan-2008 21:00 - +commons-jdbc2pool/ 01-Nov-2005 05:11 - +commons-jelly/ 01-Nov-2005 05:12 - +commons-jexl/ 01-Nov-2005 05:08 - +commons-jux/ 01-Nov-2005 05:05 - +commons-jxpath/ 13-Aug-2008 22:13 - +commons-lang/ 19-Mar-2008 05:42 - +commons-latka/ 01-Nov-2005 05:19 - +commons-launcher/ 03-Jul-2006 21:30 - +commons-logging/ 26-Nov-2007 19:24 - +commons-math/ 25-Feb-2008 00:30 - +commons-messenger/ 01-Nov-2005 05:14 - +commons-modeler/ 01-Nov-2005 05:03 - +commons-naming/ 01-Nov-2005 05:13 - +commons-net/ 30-Oct-2008 20:28 - +commons-pool/ 21-Dec-2008 00:14 - +commons-primitives/ 01-Nov-2005 05:08 - +commons-resources/ 01-Nov-2005 05:09 - +commons-scxml/ 19-May-2008 19:41 - +commons-services/ 28-Oct-2005 01:27 - +commons-sql/ 01-Nov-2005 05:14 - +commons-test/ 08-Nov-2005 09:49 - +commons-threadpool/ 01-Nov-2005 05:14 - +commons-transaction/ 01-Nov-2005 05:14 - +commons-util/ 01-Nov-2005 05:19 - +commons-validator/ 28-Oct-2005 01:27 - +commons-vfs/ 01-Nov-2005 05:10 - +commons-xo/ 01-Nov-2005 05:08 - +concurrent/ 28-Oct-2005 01:26 - +consulting/ 10-Aug-2015 10:55 - +continuum/ 01-Nov-2005 05:04 - +controlhaus/ 01-Nov-2005 05:19 - +cool/ 29-Nov-2016 23:08 - +coop/ 20-Oct-2014 09:33 - +cornerstone-connection/ 01-Nov-2005 05:20 - +cornerstone-datasources/ 01-Nov-2005 05:21 - +cornerstone-scheduler/ 01-Nov-2005 05:12 - +cornerstone-sockets/ 01-Nov-2005 05:13 - +cornerstone-store/ 01-Nov-2005 05:03 - +cornerstone-threads/ 01-Nov-2005 05:07 - +cos/ 06-Dec-2005 20:11 - +crimson/ 01-Nov-2005 05:03 - +cryptix/ 01-Nov-2005 05:07 - +cssparser/ 21-Aug-2011 14:29 - +cz/ 29-Nov-2016 23:08 - +d-haven-event/ 01-Nov-2005 05:14 - +d-haven-eventbus/ 01-Nov-2005 05:09 - +d-haven-mpool/ 01-Nov-2005 05:16 - +dalma/ 21-Aug-2011 14:29 - +dalms/ 21-Aug-2011 14:29 - +damagecontrol/ 01-Nov-2005 05:10 - +dataforge/ 01-Nov-2005 05:11 - +datasift/ 01-Nov-2005 05:14 - +dbunit/ 01-Nov-2005 05:13 - +de/ 29-Nov-2016 23:10 - +decorutils/ 01-Nov-2005 05:04 - +dentaku/ 01-Nov-2005 05:07 - +directory/ 24-Dec-2005 17:47 - +directory-asn1/ 01-Nov-2005 05:19 - +directory-authx/ 01-Nov-2005 05:21 - +directory-clients/ 01-Nov-2005 05:05 - +directory-naming/ 01-Nov-2005 05:03 - +directory-network/ 01-Nov-2005 05:07 - +directory-protocols/ 01-Nov-2005 05:09 - +directory-shared/ 01-Nov-2005 05:19 - +displaytag/ 12-Aug-2008 07:35 - +ditchnet/ 24-Nov-2005 06:03 - +dk/ 30-Nov-2016 00:31 - +dna/ 01-Nov-2005 05:21 - +dnsjava/ 01-Nov-2005 05:14 - +docbook/ 16-Jun-2006 18:32 - +doccheck/ 01-Nov-2005 05:10 - +dom4j/ 01-Nov-2005 05:16 - +domify/ 21-Aug-2011 14:31 - +dot-index/ 15-Jul-2012 10:55 - +doxia/ 28-Oct-2005 01:27 - +drone/ 01-Nov-2005 05:03 - +drools/ 31-Jan-2007 18:40 - +drools-examples/ 01-Nov-2005 05:10 - +dsh-vocabulary/ 01-Nov-2005 05:09 - +dtdparser/ 01-Nov-2005 05:15 - +dumbster/ 01-Nov-2005 05:03 - +dwr/ 24-Nov-2005 06:03 - +dynaop/ 01-Nov-2005 05:04 - +easyconf/ 01-Nov-2005 05:19 - +easymock/ 28-Oct-2005 01:27 - +ec/ 26-Jan-2015 11:42 - +echo/ 01-Nov-2005 05:07 - +echo3/ 21-Aug-2011 14:32 - +echo3extras/ 21-Aug-2011 14:32 - +eclipse/ 01-Nov-2005 05:03 - +ecs/ 01-Nov-2005 05:14 - +edenlib/ 01-Nov-2005 05:05 - +edtftp/ 01-Nov-2005 05:16 - +edu/ 30-Nov-2016 00:32 - +ee/ 30-Nov-2016 01:01 - +ehcache/ 28-Oct-2005 01:26 - +ejb/ 06-Dec-2005 20:11 - +el-impl/ 21-Aug-2011 14:32 - +emberio/ 01-Nov-2005 05:17 - +emma/ 01-Nov-2005 05:03 - +enterprises/ 07-Dec-2015 10:38 - +ervacon/ 01-Nov-2005 05:21 - +es/ 30-Nov-2016 01:01 - +esper/ 29-Jan-2008 02:43 - +eu/ 30-Nov-2016 01:03 - +eus/ 27-Apr-2015 10:40 - +excalibur/ 01-Nov-2005 05:06 - +excalibur-altrmi/ 01-Nov-2005 05:05 - +excalibur-cli/ 01-Nov-2005 05:07 - +excalibur-collections/ 01-Nov-2005 05:10 - +excalibur-component/ 01-Nov-2005 05:10 - +excalibur-component-examples/ 01-Nov-2005 05:04 - +excalibur-component-tests/ 01-Nov-2005 05:15 - +excalibur-concurrent/ 01-Nov-2005 05:07 - +excalibur-configuration/ 01-Nov-2005 05:09 - +excalibur-containerkit/ 01-Nov-2005 05:03 - +excalibur-datasource/ 01-Nov-2005 05:03 - +excalibur-event/ 01-Nov-2005 05:03 - +excalibur-extension/ 01-Nov-2005 05:04 - +excalibur-fortress/ 01-Nov-2005 05:04 - +excalibur-i18n/ 01-Nov-2005 05:15 - +excalibur-instrument/ 01-Nov-2005 05:10 - +excalibur-instrument-manager/ 01-Nov-2005 05:08 - +excalibur-instrument-manager-interfaces/ 01-Nov-2005 05:07 - +excalibur-io/ 01-Nov-2005 05:11 - +excalibur-lifecycle/ 01-Nov-2005 05:15 - +excalibur-logger/ 01-Nov-2005 05:04 - +excalibur-monitor/ 01-Nov-2005 05:15 - +excalibur-mpool/ 01-Nov-2005 05:05 - +excalibur-naming/ 01-Nov-2005 05:14 - +excalibur-pool/ 01-Nov-2005 05:03 - +excalibur-sourceresolve/ 01-Nov-2005 05:14 - +excalibur-store/ 01-Nov-2005 05:09 - +excalibur-thread/ 01-Nov-2005 05:07 - +excalibur-util/ 01-Nov-2005 05:15 - +excalibur-xmlutil/ 01-Nov-2005 05:04 - +exist/ 01-Nov-2005 05:12 - +exml/ 01-Nov-2005 05:16 - +exo/ 01-Nov-2005 00:35 - +exolabcore/ 01-Nov-2005 00:35 - +exteca/ 01-Nov-2005 00:35 - +external/ 01-Aug-2014 20:15 - +farm/ 26-Oct-2015 11:01 - +fastutil/ 01-Nov-2005 00:35 - +fesi/ 01-Nov-2005 00:35 - +fi/ 30-Nov-2016 01:13 - +findbugs/ 06-Nov-2006 01:05 - +fish/ 18-May-2015 10:45 - +flox/ 01-Nov-2005 00:35 - +flux/ 21-Aug-2011 14:32 - +fm/ 22-Feb-2016 09:57 - +foo/ 30-Nov-2016 01:49 - +foo3/ 21-Nov-2016 12:45 - +fop/ 01-Nov-2005 00:35 - +forehead/ 01-Nov-2005 00:35 - +formproc/ 01-Nov-2005 00:34 - +foundation/ 30-Nov-2016 01:49 - +foxtrot/ 12-Nov-2011 11:19 - +fr/ 30-Nov-2016 01:49 - +freebxml/ 01-Nov-2005 00:34 - +freemarker/ 01-Nov-2005 00:35 - +frl/ 14-Sep-2015 11:30 - +fulcrum/ 01-Nov-2005 00:35 - +ga/ 30-Nov-2016 02:02 - +gabriel/ 01-Nov-2005 00:35 - +gbean/ 01-Nov-2005 00:35 - +generama/ 17-Jul-2008 20:56 - +genjar/ 01-Nov-2005 00:34 - +genjava/ 01-Nov-2005 00:35 - +geronimo/ 08-Jan-2007 15:55 - +geronimo-spec/ 01-Nov-2005 00:35 - +gg/ 12-May-2012 09:05 - +github/ 30-Nov-2016 02:04 - +glassfish/ 21-Aug-2011 14:33 - +global/ 30-Nov-2016 02:04 - +gnu/ 21-Aug-2011 14:33 - +gnu-regexp/ 01-Nov-2005 00:35 - +gov/ 30-Nov-2016 02:04 - +gr/ 30-Nov-2016 02:18 - +graphlayout/ 01-Nov-2005 00:35 - +grizzly/ 21-Aug-2011 14:33 - +grizzly-cachetest/ 21-Aug-2011 14:33 - +groovy/ 30-Apr-2007 21:29 - +groovy-xmlrpc/ 26-May-2006 21:50 - +gs/ 08-Sep-2012 07:49 - +gsbase/ 01-Nov-2005 00:35 - +guru/ 26-Jan-2015 11:51 - +hessian/ 01-Nov-2005 00:34 - +hibernate/ 26-Dec-2008 14:12 - +hivemind/ 01-Nov-2005 00:34 - +hm/ 01-Aug-2014 20:22 - +howl/ 01-Nov-2005 00:35 - +hr/ 30-Nov-2016 02:20 - +hsqldb/ 28-Oct-2005 01:27 - +htmlunit/ 01-Nov-2005 00:34 - +httpcomponents-httpcore/ 02-Jul-2007 18:15 - +httpunit/ 28-Oct-2005 01:26 - +hu/ 30-Nov-2016 02:20 - +hudson/ 21-Aug-2011 14:34 - +ical4j/ 01-Nov-2005 00:34 - +icu/ 03-Nov-2005 01:12 - +icu4j/ 03-Nov-2005 21:39 - +id/ 30-Nov-2016 02:21 - +idb/ 01-Nov-2005 00:35 - +ie/ 21-Dec-2015 09:56 - +iirekm/ 21-Aug-2011 14:34 - +il/ 30-Nov-2016 02:21 - +im/ 30-Nov-2016 02:21 - +in/ 30-Nov-2016 02:50 - +info/ 30-Nov-2016 02:51 - +informa/ 01-Nov-2005 00:34 - +innig/ 01-Nov-2005 00:35 - +int/ 24-Aug-2014 05:19 - +io/ 30-Nov-2016 03:02 - +ir/ 30-Nov-2016 13:35 - +is/ 03-Nov-2014 11:18 - +isorelax/ 01-Nov-2005 00:35 - +it/ 30-Nov-2016 13:37 - +itext/ 01-Nov-2005 00:35 - +ivory/ 01-Nov-2005 00:35 - +izpack/ 01-Nov-2005 00:35 - +jaas/ 01-Nov-2005 00:35 - +jackcess/ 01-Nov-2005 00:35 - +jackson/ 06-Sep-2008 07:58 - +jacl/ 01-Nov-2005 00:35 - +jaf/ 28-Oct-2005 01:27 - +jaimbot/ 01-Nov-2005 00:35 - +jakarta-regexp/ 01-Nov-2005 00:34 - +jalopy/ 01-Nov-2005 00:35 - +james/ 01-Nov-2005 00:35 - +janino/ 01-Nov-2005 00:35 - +jardiff/ 14-Feb-2006 01:31 - +jarjar/ 01-Nov-2005 00:35 - +jarsync/ 01-Nov-2005 00:35 - +jasper-jsr199/ 21-Aug-2011 14:37 - +jasperreports/ 01-Nov-2005 00:35 - +java2html/ 01-Nov-2005 00:34 - +java3d/ 01-Nov-2005 00:35 - +java_cup/ 01-Aug-2014 21:21 - +javacc/ 01-Nov-2005 00:34 - +javaconfig/ 01-Nov-2005 00:35 - +javadb/ 21-Aug-2011 14:37 - +javadoc/ 31-Oct-2005 19:40 - +javaee/ 21-Aug-2011 14:37 - +javagroups/ 01-Nov-2005 05:14 - +javainetlocator/ 01-Nov-2005 05:03 - +javamail/ 01-Nov-2005 05:07 - +javancss/ 01-Nov-2005 05:19 - +javanettasks/ 21-Aug-2011 14:37 - +javassist/ 01-Apr-2008 07:08 - +javassist / 04-Apr-2008 17:18 - +javatar/ 01-Nov-2005 05:19 - +javax/ 20-Jul-2015 11:38 - +javazoom/ 10-Nov-2012 09:25 - +javolution/ 21-Aug-2011 17:05 - +jawin/ 24-Nov-2005 06:03 - +jaxb/ 21-Aug-2011 14:37 - +jaxen/ 19-Oct-2006 19:23 - +jaxme/ 06-Nov-2006 01:06 - +jaxr-ra/ 21-Aug-2011 14:37 - +jblanket/ 01-Nov-2005 05:11 - +jboss/ 27-Apr-2013 08:15 - +jca/ 01-Nov-2005 05:03 - +jcache/ 01-Nov-2005 05:03 - +jcharts/ 06-Dec-2007 02:46 - +jcifs/ 29-Apr-2008 16:16 - +jcom/ 24-Nov-2005 06:03 - +jcommon/ 28-Oct-2005 01:27 - +jcoverage/ 01-Nov-2005 05:20 - +jcs/ 01-Nov-2005 05:03 - +jcs-javagroups/ 01-Nov-2005 05:18 - +jcvsii/ 01-Nov-2005 05:03 - +jdbc/ 28-Oct-2005 01:26 - +jdbm/ 01-Nov-2005 05:13 - +jdepend/ 01-Nov-2005 05:03 - +jdiff/ 01-Nov-2005 05:19 - +jdo/ 01-Nov-2005 05:03 - +jdom/ 28-Oct-2005 01:27 - +jdring/ 01-Nov-2005 05:09 - +jdsl/ 01-Nov-2005 05:04 - +jen/ 21-Aug-2011 14:38 - +jencks/ 01-Nov-2005 05:13 - +jep/ 01-Nov-2005 05:03 - +jepi/ 21-Aug-2011 14:38 - +jersey/ 21-Aug-2011 14:38 - +jetty/ 20-Oct-2006 15:24 - +jexcelapi/ 06-Nov-2006 01:07 - +jface/ 01-Nov-2005 05:09 - +jfree/ 13-Dec-2006 19:51 - +jfreechart/ 01-Nov-2005 05:15 - +jgen/ 01-Nov-2005 05:20 - +jgoodies/ 01-Nov-2005 05:13 - +jgraph/ 01-Nov-2005 05:07 - +jgrapht/ 01-Nov-2005 05:07 - +jgroups/ 01-Nov-2005 05:04 - +jhunlang/ 01-Nov-2005 05:04 - +jini/ 10-Dec-2005 02:18 - +jintention/ 21-Aug-2011 14:38 - +jisp/ 01-Nov-2005 05:10 - +jivesoftware/ 01-Nov-2005 05:03 - +jlibdiff/ 01-Nov-2005 05:03 - +jline/ 19-Oct-2006 19:23 - +jmagick/ 21-Aug-2011 14:38 - +jmaki/ 21-Aug-2011 14:38 - +jmdns/ 01-Nov-2005 05:14 - +jmimemagic/ 01-Nov-2005 05:14 - +jmml/ 01-Nov-2005 05:12 - +jmock/ 28-Oct-2005 01:26 - +jms/ 28-Oct-2005 01:27 - +jmscts/ 01-Nov-2005 05:09 - +jmsn/ 01-Nov-2005 05:16 - +joda-time/ 15-Nov-2009 14:12 - +john-test/ 29-May-2008 08:01 - +jotm/ 01-Nov-2005 05:20 - +jp/ 30-Nov-2016 13:53 - +jparsec/ 26-Aug-2006 17:55 - +jpl/ 10-Nov-2012 09:26 - +jpox/ 21-Jan-2008 06:44 - +jpox-dbcp/ 13-Mar-2007 21:30 - +jpox-enhancer/ 13-Mar-2007 21:30 - +jpox-java5/ 13-Mar-2007 21:30 - +jrexx/ 01-Nov-2005 05:11 - +jrms/ 01-Nov-2005 05:19 - +jrobin/ 01-Nov-2005 05:06 - +jruby/ 21-Aug-2007 18:14 - +jsch/ 28-Oct-2005 01:26 - +jsf-extensions/ 21-Aug-2011 14:38 - +jspapi/ 28-Oct-2005 01:26 - +jsptags/ 01-Nov-2005 05:15 - +jstl/ 28-Oct-2005 01:26 - +jstyle/ 01-Nov-2005 05:09 - +jta/ 28-Oct-2005 01:26 - +jtds/ 20-Jan-2006 12:18 - +jtidy/ 28-Oct-2005 01:27 - +juddi/ 01-Nov-2005 05:03 - +jug/ 01-Nov-2005 05:12 - +jung/ 01-Nov-2005 05:03 - +junit/ 10-May-2009 13:17 - +junit-addons/ 28-Oct-2005 01:27 - +junit-doclet/ 01-Nov-2005 05:19 - +junitperf/ 01-Nov-2005 05:21 - +juno/ 21-Aug-2011 14:38 - +jwebunit/ 01-Nov-2005 05:10 - +jxta/ 01-Nov-2005 05:10 - +jython/ 01-Nov-2005 05:04 - +kawa/ 01-Nov-2005 05:04 - +kg/ 23-Feb-2013 09:19 - +kohsuke/ 21-Aug-2011 14:38 - +kr/ 30-Nov-2016 13:56 - +kxml/ 01-Nov-2005 05:09 - +kxml2/ 01-Nov-2005 05:07 - +kz/ 04-Jan-2016 09:50 - +la/ 20-Apr-2015 11:09 - +ldapd-common/ 01-Nov-2005 05:21 - +ldapsdk/ 01-Nov-2005 05:11 - +li/ 30-Nov-2016 14:03 - +life/ 30-Nov-2016 14:04 - +lingo/ 01-Nov-2005 05:21 - +link/ 07-Dec-2015 11:24 - +locc/ 01-Nov-2005 05:11 - +log4j/ 28-Nov-2007 21:22 - +log4unit/ 01-Nov-2005 05:20 - +logkit/ 02-Nov-2005 09:29 - +loom/ 01-Nov-2005 05:21 - +lpg/ 16-Nov-2013 10:06 - +lt/ 19-Jan-2013 09:12 - +lucene/ 01-Nov-2005 05:04 - +lv/ 22-Feb-2016 10:49 - +ly/ 29-Sep-2014 10:35 - +ma/ 30-Nov-2016 14:08 - +magicGball/ 01-Nov-2005 05:03 - +maps/ 21-Aug-2011 14:38 - +market/ 12-Oct-2015 22:45 - +marmalade/ 21-Jul-2006 17:02 - +math/ 23-Nov-2013 10:01 - +maven/ 06-Nov-2006 01:08 - +maven-integration-test-helper/ 11-Jun-2011 11:01 - +maven-javanet-plugin/ 21-Aug-2011 14:39 - +maven-new/ 01-Nov-2005 05:06 - +maven-plugins/ 06-Nov-2006 01:07 - +maven-proxy/ 01-Nov-2005 05:03 - +maven-taglib/ 01-Nov-2005 05:19 - +maven-torque-plugin/ 01-Nov-2005 05:03 - +maven-validator/ 01-Nov-2005 05:07 - +maven-xdoclet2-plugin/ 01-Nov-2005 05:19 - +maxq/ 01-Nov-2005 05:09 - +mckoi/ 01-Nov-2005 05:12 - +md/ 30-Nov-2016 14:09 - +me/ 30-Nov-2016 14:09 - +merlin/ 01-Nov-2005 05:02 - +merlin-developer/ 01-Nov-2005 05:19 - +merlin-tutorial/ 01-Nov-2005 05:15 - +messenger/ 01-Nov-2005 05:08 - +metaclass/ 01-Nov-2005 05:08 - +mevenide/ 01-Nov-2005 05:14 - +microcontainer/ 01-Nov-2005 05:16 - +middlegen/ 01-Nov-2005 05:03 - +mil/ 30-Nov-2016 14:19 - +milyn/ 16-May-2007 17:40 - +ml/ 30-Nov-2016 14:20 - +mm/ 01-Nov-2005 05:12 - +mm-mysql/ 01-Nov-2005 05:16 - +mobi/ 30-Nov-2016 14:22 - +mockcreator/ 01-Nov-2005 05:09 - +mockit/ 21-Aug-2011 14:39 - +mockmaker/ 01-Nov-2005 05:07 - +mockobjects/ 01-Nov-2005 05:05 - +mockrunner/ 24-Nov-2005 06:03 - +modello/ 01-Nov-2005 05:12 - +mrj/ 01-Nov-2005 05:14 - +ms/ 01-Aug-2014 21:28 - +mstor/ 01-Nov-2005 05:14 - +msv/ 01-Nov-2005 05:15 - +mule/ 10-Apr-2007 13:34 - +muse/ 01-Nov-2005 05:11 - +mx/ 22-Feb-2016 10:54 - +mx4j/ 01-Nov-2005 05:14 - +myfaces/ 21-Nov-2005 13:21 - +mysql/ 15-Oct-2011 10:12 - +name/ 30-Nov-2016 14:22 - +nanning/ 01-Nov-2005 05:11 - +nanocontainer/ 14-Jun-2006 10:28 - +nekohtml/ 01-Jun-2008 16:25 - +neo/ 01-Nov-2005 05:08 - +net/ 30-Nov-2016 14:23 - +netbeans/ 01-Nov-2005 05:04 - +new/ 21-Aug-2011 15:09 - +nf/ 02-Mar-2013 10:13 - +ng/ 30-Nov-2016 16:55 - +ninja/ 16-Nov-2015 14:52 - +nl/ 30-Nov-2016 16:55 - +no/ 30-Nov-2016 17:07 - +norbert/ 01-Nov-2005 05:03 - +np/ 17-Nov-2014 12:32 - +nsuml/ 01-Nov-2005 05:16 - +nu/ 30-Nov-2016 17:15 - +nz/ 30-Nov-2016 17:15 - +oauth/ 26-Feb-2010 19:44 - +odmg/ 28-Oct-2005 01:27 - +ognl/ 20-Jun-2007 20:09 - +ojb/ 01-Nov-2005 05:11 - +ojdbc/ 28-Oct-2005 01:26 - +old/ 01-Nov-2005 05:13 - +one/ 30-Nov-2015 14:42 - +oness/ 01-Nov-2005 05:13 - +online/ 30-Nov-2016 17:23 - +open/ 21-Aug-2011 15:33 - +open-esb/ 21-Aug-2011 15:33 - +opencypher/ 30-Nov-2016 17:23 - +openejb/ 07-May-2006 00:35 - +openim/ 01-Nov-2005 05:12 - +openjms/ 01-Nov-2005 05:03 - +opennms/ 01-Nov-2005 05:06 - +opensymphony/ 19-Feb-2009 14:07 - +oracle/ 21-Aug-2011 15:33 - +org/ 30-Nov-2016 17:23 - +org.elasticsearch/ 30-Nov-2016 17:23 - +org.elasticsearch.client/ 30-Nov-2016 17:23 - +org.elasticsearch.distribution.integ-test-zip/ 30-Nov-2016 17:23 - +org.elasticsearch.distribution.zip/ 30-Nov-2016 17:23 - +org.elasticsearch.gradle/ 30-Nov-2016 17:23 - +org.elasticsearch.plugin/ 30-Nov-2016 17:23 - +org.elasticsearch.test/ 30-Nov-2016 17:23 - +oro/ 28-Oct-2005 01:27 - +oscube/ 01-Nov-2005 05:02 - +p2psockets/ 01-Nov-2005 05:15 - +p6spy/ 01-Nov-2005 05:05 - +patterntesting/ 01-Nov-2005 05:05 - +payload/ 01-Nov-2005 05:03 - +pcj/ 01-Nov-2005 05:09 - +pdfbox/ 01-Nov-2005 05:16 - +pe/ 21-Nov-2016 12:45 - +penguin/ 01-Nov-2005 05:10 - +petridish/ 01-Nov-2005 05:06 - +ph/ 30-Jun-2012 17:32 - +piccolo/ 01-Nov-2005 05:03 - +picocontainer/ 14-Jun-2006 10:25 - +picounit/ 01-Nov-2005 05:10 - +pircbot/ 01-Nov-2005 05:06 - +pitt/ 07-Dec-2013 15:12 - +pl/ 25-Jan-2016 18:00 - +plexus/ 04-Jan-2007 19:16 - +plj/ 01-Nov-2005 05:14 - +plugin/ 01-Nov-2005 05:07 - +pluto-container/ 01-Nov-2005 05:07 - +pmd/ 10-Aug-2008 09:08 - +pnuts/ 22-Aug-2011 09:13 - +poi/ 28-Oct-2005 23:26 - +poolman/ 01-Nov-2005 05:20 - +portlet-api/ 01-Nov-2005 05:10 - +postgresql/ 01-Nov-2005 05:15 - +prevayler/ 01-Nov-2005 05:13 - +pro/ 03-Nov-2015 02:37 - +proctor/ 22-Aug-2011 09:13 - +profiler/ 01-Nov-2005 05:11 - +proxool/ 28-Oct-2005 01:27 - +proxytoys/ 01-Nov-2005 05:04 - +pt/ 15-Dec-2015 03:32 - +pubscribe/ 01-Nov-2005 05:11 - +pull-parser/ 28-Oct-2005 01:27 - +pw/ 26-Oct-2013 13:30 - +qdox/ 28-Oct-2005 01:27 - +qfork/ 01-Nov-2005 05:14 - +quartz/ 01-Nov-2005 05:16 - +quartz-jboss/ 26-Feb-2010 21:25 - +quartz-oracle/ 26-Feb-2010 21:25 - +quartz-weblogic/ 26-Feb-2010 21:25 - +quilt/ 01-Nov-2005 05:12 - +radeox/ 01-Nov-2005 05:14 - +re/ 17-Aug-2014 12:17 - +readline/ 01-Nov-2005 05:10 - +red/ 21-Nov-2016 12:45 - +redhill/ 01-Nov-2005 05:03 - +redis/ 09-Oct-2010 07:48 - +redmine/ 22-Aug-2011 09:13 - +regexp/ 19-Oct-2006 19:23 - +relaxngDatatype/ 01-Nov-2005 05:15 - +ren/ 19-Oct-2015 23:59 - +reportrunner/ 01-Nov-2005 05:15 - +rest/ 21-Nov-2016 12:45 - +rhino/ 01-Nov-2005 05:11 - +ro/ 21-Dec-2015 16:56 - +robo-guice/ 22-Aug-2011 09:13 - +roboguice/ 22-Aug-2011 09:13 - +rocks/ 20-Oct-2014 18:43 - +roller/ 22-Aug-2011 09:13 - +rome/ 22-Aug-2011 09:13 - +rs/ 01-Dec-2014 19:54 - +rss4j/ 01-Nov-2005 05:08 - +rsslibj/ 01-Nov-2005 05:04 - +ru/ 14-Mar-2016 15:50 - +rubygems/ 27-Oct-2015 00:40 - +run/ 21-Nov-2016 12:45 - +sablecc/ 01-Nov-2005 05:04 - +sax/ 01-Nov-2005 05:11 - +saxon/ 19-Oct-2006 19:23 - +saxpath/ 28-Oct-2005 01:26 - +sc/ 15-Jun-2015 21:26 - +science/ 21-Nov-2016 12:45 - +scout/ 29-Oct-2005 08:00 - +scraping-engine/ 01-Nov-2005 05:07 - +se/ 11-Jan-2016 15:55 - +securityfilter/ 01-Nov-2005 05:13 - +servicemix/ 25-Mar-2006 00:55 - +servicemix-ws/ 01-Nov-2005 05:15 - +servletapi/ 28-Oct-2005 23:26 - +servlets/ 01-Nov-2005 05:12 - +setpoint/ 06-Nov-2006 01:09 - +sfx4j/ 22-Aug-2011 09:14 - +sg/ 21-Nov-2016 12:45 - +sh/ 10-Nov-2015 04:31 - +shellix/ 22-Aug-2011 09:14 - +shocks/ 01-Nov-2005 05:11 - +si/ 15-Feb-2016 16:33 - +sillyexceptions/ 01-Nov-2005 05:04 - +simple-jms/ 09-Dec-2005 01:32 - +simple-jndi/ 01-Nov-2005 05:19 - +sk/ 15-Feb-2016 16:33 - +skaringa/ 01-Nov-2005 05:09 - +skinlf/ 01-Nov-2005 05:03 - +slide/ 01-Nov-2005 05:14 - +smartrics/ 15-Dec-2012 12:57 - +soap/ 01-Nov-2005 05:04 - +software/ 14-Mar-2016 15:54 - +soimp/ 22-Aug-2011 09:14 - +solarisrealm/ 22-Aug-2011 09:14 - +solutions/ 20-Oct-2015 00:09 - +space/ 21-Nov-2016 12:45 - +speexx/ 01-Nov-2005 05:04 - +spice/ 01-Nov-2005 05:03 - +spring/ 01-Nov-2005 05:07 - +springframework/ 01-Nov-2005 05:11 - +springmodules/ 19-Jun-2006 22:22 - +sqlline/ 09-Mar-2015 21:41 - +sshtools/ 01-Nov-2005 05:03 - +sslext/ 01-Nov-2005 05:04 - +st/ 10-Aug-2015 22:33 - +stapler/ 22-Aug-2011 09:15 - +statcvs/ 01-Nov-2005 05:07 - +stax/ 06-Nov-2006 01:09 - +stax-utils/ 01-Nov-2005 05:11 - +stratum/ 01-Nov-2005 05:14 - +stream/ 21-Nov-2016 12:45 - +struts/ 01-Nov-2005 05:15 - +struts-menu/ 01-Nov-2005 05:03 - +strutstestcase/ 01-Nov-2005 05:12 - +studio/ 21-Nov-2016 12:45 - +stxx/ 01-Nov-2005 05:05 - +su/ 10-Aug-2014 15:19 - +subpersistence/ 01-Nov-2005 05:09 - +subshell/ 01-Nov-2005 05:03 - +suiterunner/ 01-Nov-2005 05:09 - +surefire/ 28-Oct-2005 01:26 - +swarmcache/ 28-Oct-2005 01:26 - +swt/ 01-Nov-2005 05:05 - +systems/ 18-Jan-2016 16:33 - +sysunit/ 01-Nov-2005 05:15 - +tablelayout/ 01-Nov-2005 05:14 - +tagalog/ 01-Nov-2005 05:16 - +tagishauth/ 01-Nov-2005 05:03 - +taglibrarydoc/ 01-Nov-2005 05:07 - +taglibs/ 01-Nov-2005 05:06 - +tagsoup/ 05-Nov-2005 01:42 - +tambora/ 01-Nov-2005 05:20 - +tanukisoft/ 07-Mar-2008 02:07 - +tapestry/ 01-Nov-2005 05:04 - +tclib/ 01-Nov-2005 05:07 - +tec/ 23-Mar-2015 21:07 - +tech/ 22-Feb-2016 17:58 - +technology/ 15-Dec-2015 03:41 - +textarea/ 01-Nov-2005 05:16 - +th/ 13-Oct-2015 11:58 - +thaiopensource/ 19-Oct-2006 19:23 - +tiffrenderer/ 01-Nov-2005 05:09 - +tjdo/ 01-Nov-2005 05:03 - +tk/ 11-Jan-2016 15:58 - +tl/ 13-Jul-2013 12:50 - +tmporb/ 01-Nov-2005 05:09 - +to/ 25-Jan-2016 18:06 - +tokyo/ 21-Nov-2016 12:45 - +tomcat/ 24-Jan-2008 04:19 - +tomcat-util/ 01-Nov-2005 05:20 - +tonic/ 08-Nov-2005 05:35 - +tools/ 29-Feb-2016 17:11 - +top/ 08-Feb-2016 18:28 - +toplink/ 22-Aug-2011 09:16 - +torque/ 11-Jan-2008 22:47 - +torque-gen/ 01-Nov-2005 05:04 - +touchstone/ 01-Nov-2005 05:10 - +tr/ 15-Dec-2015 03:41 - +traer/ 07-Apr-2012 17:18 - +trail-taglib/ 01-Nov-2005 05:04 - +tranql/ 01-Nov-2005 05:10 - +travel/ 04-May-2015 22:09 - +trove/ 01-Nov-2005 05:08 - +turbine/ 01-Nov-2005 05:04 - +tv/ 18-Jan-2016 16:34 - +tw/ 18-May-2015 21:53 - +tyrex/ 01-Nov-2005 05:14 - +ua/ 29-Feb-2016 17:11 - +uaihebert/ 23-Feb-2013 13:20 - +ubique/ 01-Nov-2005 05:15 - +ug/ 25-Jan-2016 18:07 - +uispec4j/ 01-Nov-2005 05:07 - +uk/ 10-Aug-2015 22:35 - +uno/ 01-Dec-2015 04:36 - +urbanophile/ 01-Nov-2005 05:03 - +urlrewrite/ 24-Nov-2005 06:03 - +us/ 18-Jan-2016 16:35 - +uy/ 24-Aug-2015 23:36 - +vc/ 28-Dec-2015 15:38 - +vdoclet/ 01-Nov-2005 05:11 - +velocity/ 29-Apr-2007 21:29 - +velocity-anakia/ 29-Apr-2007 21:29 - +velocity-dvsl/ 01-Nov-2005 05:12 - +velocity-tools/ 01-Nov-2005 05:10 - +village/ 01-Nov-2005 05:04 - +vn/ 02-Dec-2016 00:09 - +vu/ 20-Jul-2013 12:57 - +wadi/ 01-Nov-2005 05:15 - +wang/ 10-Aug-2015 22:36 - +webmacro/ 01-Nov-2005 05:12 - +website/ 22-Feb-2016 18:03 - +webtest/ 01-Nov-2005 05:19 - +werken-xpath/ 28-Oct-2005 01:26 - +werkflow/ 01-Nov-2005 05:16 - +werkz/ 01-Nov-2005 05:08 - +westhawk/ 01-Nov-2005 05:18 - +wf/ 10-Nov-2014 19:54 - +which/ 01-Nov-2005 05:16 - +wicket/ 11-Aug-2008 15:44 - +wiki/ 22-Feb-2016 18:03 - +win/ 21-Nov-2016 12:45 - +woodstox/ 21-Nov-2007 04:35 - +work/ 18-Jan-2016 16:37 - +works/ 22-Feb-2016 18:03 - +wrapper/ 01-Nov-2005 05:14 - +ws/ 25-Jan-2016 18:11 - +ws-commons/ 19-Sep-2006 14:21 - +ws-commons-java5/ 01-Nov-2005 05:03 - +ws-commons-util/ 01-Nov-2005 05:16 - +ws-scout/ 18-Feb-2006 13:32 - +wsdl4j/ 01-Nov-2005 05:07 - +wsrf/ 01-Nov-2005 05:08 - +wss4j/ 02-May-2006 20:32 - +wstx/ 01-Nov-2005 05:09 - +wurfl/ 01-Nov-2005 05:14 - +wutka/ 01-Nov-2005 05:21 - +xajile/ 03-Aug-2009 09:25 - +xalan/ 30-Sep-2008 08:02 - +xbean/ 04-Jan-2006 17:31 - +xdoclet/ 17-Jul-2008 21:29 - +xdoclet-plugins/ 02-Jul-2006 21:14 - +xerces/ 19-Oct-2006 19:23 - +xercesjarv/ 01-Nov-2005 05:06 - +xfire/ 06-Nov-2006 01:09 - +xfire-root/ 01-Nov-2005 05:03 - +xin/ 21-Nov-2016 12:45 - +xjavadoc/ 01-Nov-2005 05:14 - +xml-apis/ 22-Dec-2006 13:37 - +xml-resolver/ 01-Nov-2005 05:11 - +xml-security/ 19-Oct-2006 19:23 - +xmlbeans/ 03-Jul-2007 16:43 - +xmldb/ 01-Nov-2005 05:12 - +xmlenc/ 01-Nov-2005 05:19 - +xmlmind/ 01-Nov-2005 05:21 - +xmlpull/ 01-Nov-2005 05:21 - +xmlrpc/ 25-Jun-2006 02:41 - +xmlrpc-helma/ 01-Nov-2005 05:03 - +xmlunit/ 15-Sep-2008 23:50 - +xmlwise/ 27-Oct-2012 10:59 - +xmlwriter/ 01-Nov-2005 05:04 - +xom/ 19-Oct-2006 19:23 - +xpp3/ 28-Oct-2005 01:26 - +xsddoc/ 01-Nov-2005 05:19 - +xsdlib/ 01-Nov-2005 05:04 - +xstream/ 27-Nov-2006 21:45 - +xtc/ 07-Apr-2012 17:20 - +xtiff-jai/ 01-Nov-2005 05:10 - +xxl/ 01-Nov-2005 05:12 - +xyz/ 08-Feb-2016 18:33 - +yan/ 13-Jan-2006 21:31 - +ymsg/ 01-Nov-2005 05:04 - +yom/ 01-Nov-2005 05:08 - +za/ 25-May-2013 12:39 - +zone/ 26-Jan-2015 23:05 - +94a8262a403880.properties 03-Feb-2015 07:36 301 +94a8262a403880.properties.md5 20-May-2015 05:24 32 +94a8262a403880.properties.sha1 20-May-2015 05:24 40 +9e9bbc30f020cf.properties 03-Oct-2014 19:03 310 +9e9bbc30f020cf.properties.md5 02-Nov-2014 16:27 32 +9e9bbc30f020cf.properties.sha1 02-Nov-2014 16:27 40 +archetype-catalog.xml 27-Nov-2016 13:20 5385400 +archetype-catalog.xml.md5 27-Nov-2016 13:20 32 +archetype-catalog.xml.sha1 27-Nov-2016 13:20 40 +fb69c44c24b38.properties 17-Apr-2014 13:29 307 +fb69c44c24b38.properties.md5 02-Nov-2014 14:37 32 +fb69c44c24b38.properties.sha1 02-Nov-2014 14:37 40 +last_updated.txt 28-Nov-2016 06:55 29 +robots.txt 10-Nov-2009 12:12 26 +server.txt 08-Nov-2014 19:04 207 +
`, ``, and ``.
+// $font-family-monospace: Menlo, Monaco, Consolas, "Courier New", monospace
+// $font-family-base: $font-family-sans-serif
+
+// $font-size-base: 14px
+// $font-size-large: ceil(($font-size-base * 1.25)) // ~18px
+// $font-size-small: ceil(($font-size-base * 0.85)) // ~12px
+
+// $font-size-h1: floor(($font-size-base * 2.6)) // ~36px
+// $font-size-h2: floor(($font-size-base * 2.15)) // ~30px
+// $font-size-h3: ceil(($font-size-base * 1.7)) // ~24px
+// $font-size-h4: ceil(($font-size-base * 1.25)) // ~18px
+// $font-size-h5: $font-size-base
+// $font-size-h6: ceil(($font-size-base * 0.85)) // ~12px
+
+//** Unit-less `line-height` for use in components like buttons.
+// $line-height-base: 1.428571429 // 20/14
+//** Computed "line-height" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.
+// $line-height-computed: floor(($font-size-base * $line-height-base)) // ~20px
+
+//** By default, this inherits from the ``.
+// $headings-font-family: inherit
+// $headings-font-weight: 500
+// $headings-line-height: 1.1
+// $headings-color: inherit
+
+//== Iconography
+//
+//## Specify custom location and filename of the included Glyphicons icon font. Useful for those including Bootstrap via Bower.
+
+//** Load fonts from this directory.
+
+// [converter] Asset helpers such as Sprockets and Node.js Mincer do not resolve relative paths
+// $icon-font-path: if($bootstrap-sass-asset-helper, "bootstrap/", "../fonts/bootstrap/")
+
+//** File name for all font files.
+// $icon-font-name: "glyphicons-halflings-regular"
+//** Element ID within SVG icon file.
+// $icon-font-svg-id: "glyphicons_halflingsregular"
+
+//== Components
+//
+//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).
+
+// $padding-base-vertical: 6px
+// $padding-base-horizontal: 12px
+
+// $padding-large-vertical: 10px
+// $padding-large-horizontal: 16px
+
+// $padding-small-vertical: 5px
+// $padding-small-horizontal: 10px
+
+// $padding-xs-vertical: 1px
+// $padding-xs-horizontal: 5px
+
+// $line-height-large: 1.33
+// $line-height-small: 1.5
+
+// $border-radius-base: 4px
+// $border-radius-large: 6px
+// $border-radius-small: 3px
+
+//** Global color for active items (e.g., navs or dropdowns).
+// $component-active-color: #fff
+//** Global background color for active items (e.g., navs or dropdowns).
+// $component-active-bg: $brand-primary
+
+//** Width of the `border` for generating carets that indicator dropdowns.
+// $caret-width-base: 4px
+//** Carets increase slightly in size for larger components.
+// $caret-width-large: 5px
+
+//== Tables
+//
+//## Customizes the `.table` component with basic values, each used across all table variations.
+
+//** Padding for ``s and ` `s.
+// $table-cell-padding: 8px
+//** Padding for cells in `.table-condensed`.
+// $table-condensed-cell-padding: 5px
+
+//** Default background color used for all tables.
+// $table-bg: transparent
+//** Background color used for `.table-striped`.
+// $table-bg-accent: #f9f9f9
+//** Background color used for `.table-hover`.
+// $table-bg-hover: #f5f5f5
+// $table-bg-active: $table-bg-hover
+
+//** Border color for table and cell borders.
+// $table-border-color: #ddd
+
+//== Buttons
+//
+//## For each of Bootstrap's buttons, define text, background and border color.
+
+// $btn-font-weight: normal
+
+// $btn-default-color: #333
+// $btn-default-bg: #fff
+// $btn-default-border: #ccc
+
+// $btn-primary-color: #fff
+// $btn-primary-bg: $brand-primary
+// $btn-primary-border: darken($btn-primary-bg, 5%)
+
+// $btn-success-color: #fff
+// $btn-success-bg: $brand-success
+// $btn-success-border: darken($btn-success-bg, 5%)
+
+// $btn-info-color: #fff
+// $btn-info-bg: $brand-info
+// $btn-info-border: darken($btn-info-bg, 5%)
+
+// $btn-warning-color: #fff
+// $btn-warning-bg: $brand-warning
+// $btn-warning-border: darken($btn-warning-bg, 5%)
+
+// $btn-danger-color: #fff
+// $btn-danger-bg: $brand-danger
+// $btn-danger-border: darken($btn-danger-bg, 5%)
+
+// $btn-link-disabled-color: $gray-light
+
+//== Forms
+//
+//##
+
+//** `` background color
+// $input-bg: #fff
+//** `` background color
+// $input-bg-disabled: $gray-lighter
+
+//** Text color for ``s
+// $input-color: $gray
+//** `` border color
+// $input-border: #ccc
+
+// TODO: Rename `$input-border-radius` to `$input-border-radius-base` in v4
+//** Default `.form-control` border radius
+// $input-border-radius: $border-radius-base
+//** Large `.form-control` border radius
+// $input-border-radius-large: $border-radius-large
+//** Small `.form-control` border radius
+// $input-border-radius-small: $border-radius-small
+
+//** Border color for inputs on focus
+// $input-border-focus: #66afe9
+
+//** Placeholder text color
+// $input-color-placeholder: #999
+
+//** Default `.form-control` height
+// $input-height-base: ($line-height-computed + ($padding-base-vertical * 2) + 2)
+//** Large `.form-control` height
+// $input-height-large: (ceil($font-size-large * $line-height-large) + ($padding-large-vertical * 2) + 2)
+//** Small `.form-control` height
+// $input-height-small: (floor($font-size-small * $line-height-small) + ($padding-small-vertical * 2) + 2)
+
+// $legend-color: $gray-dark
+// $legend-border-color: #e5e5e5
+
+//** Background color for textual input addons
+// $input-group-addon-bg: $gray-lighter
+//** Border color for textual input addons
+// $input-group-addon-border-color: $input-border
+
+//** Disabled cursor for form controls and buttons.
+// $cursor-disabled: not-allowed
+
+//== Dropdowns
+//
+//## Dropdown menu container and contents.
+
+//** Background for the dropdown menu.
+// $dropdown-bg: #fff
+//** Dropdown menu `border-color`.
+// $dropdown-border: rgba(0,0,0,.15)
+//** Dropdown menu `border-color` **for IE8**.
+// $dropdown-fallback-border: #ccc
+//** Divider color for between dropdown items.
+// $dropdown-divider-bg: #e5e5e5
+
+//** Dropdown link text color.
+// $dropdown-link-color: $gray-dark
+//** Hover color for dropdown links.
+// $dropdown-link-hover-color: darken($gray-dark, 5%)
+//** Hover background for dropdown links.
+// $dropdown-link-hover-bg: #f5f5f5
+
+//** Active dropdown menu item text color.
+// $dropdown-link-active-color: $component-active-color
+//** Active dropdown menu item background color.
+// $dropdown-link-active-bg: $component-active-bg
+
+//** Disabled dropdown menu item background color.
+// $dropdown-link-disabled-color: $gray-light
+
+//** Text color for headers within dropdown menus.
+// $dropdown-header-color: $gray-light
+
+//** Deprecated `$dropdown-caret-color` as of v3.1.0
+// $dropdown-caret-color: #000
+
+//-- Z-index master list
+//
+// Warning: Avoid customizing these values. They're used for a bird's eye view
+// of components dependent on the z-axis and are designed to all work together.
+//
+// Note: These variables are not generated into the Customizer.
+
+// $zindex-navbar: 1000
+// $zindex-dropdown: 1000
+// $zindex-popover: 1060
+// $zindex-tooltip: 1070
+// $zindex-navbar-fixed: 1030
+// $zindex-modal: 1040
+
+//== Media queries breakpoints
+//
+//## Define the breakpoints at which your layout will change, adapting to different screen sizes.
+
+// Extra small screen / phone
+//** Deprecated `$screen-xs` as of v3.0.1
+// $screen-xs: 480px
+//** Deprecated `$screen-xs-min` as of v3.2.0
+// $screen-xs-min: $screen-xs
+//** Deprecated `$screen-phone` as of v3.0.1
+// $screen-phone: $screen-xs-min
+
+// Small screen / tablet
+//** Deprecated `$screen-sm` as of v3.0.1
+// $screen-sm: 768px
+// $screen-sm-min: $screen-sm
+//** Deprecated `$screen-tablet` as of v3.0.1
+// $screen-tablet: $screen-sm-min
+
+// Medium screen / desktop
+//** Deprecated `$screen-md` as of v3.0.1
+// $screen-md: 992px
+// $screen-md-min: $screen-md
+//** Deprecated `$screen-desktop` as of v3.0.1
+// $screen-desktop: $screen-md-min
+
+// Large screen / wide desktop
+//** Deprecated `$screen-lg` as of v3.0.1
+// $screen-lg: 1200px
+// $screen-lg-min: $screen-lg
+//** Deprecated `$screen-lg-desktop` as of v3.0.1
+// $screen-lg-desktop: $screen-lg-min
+
+// So media queries don't overlap when required, provide a maximum
+// $screen-xs-max: ($screen-sm-min - 1)
+// $screen-sm-max: ($screen-md-min - 1)
+// $screen-md-max: ($screen-lg-min - 1)
+
+//== Grid system
+//
+//## Define your custom responsive grid.
+
+//** Number of columns in the grid.
+// $grid-columns: 12
+//** Padding between columns. Gets divided in half for the left and right.
+// $grid-gutter-width: 30px
+// Navbar collapse
+//** Point at which the navbar becomes uncollapsed.
+// $grid-float-breakpoint: $screen-sm-min
+//** Point at which the navbar begins collapsing.
+// $grid-float-breakpoint-max: ($grid-float-breakpoint - 1)
+
+//== Container sizes
+//
+//## Define the maximum width of `.container` for different screen sizes.
+
+// Small screen / tablet
+// $container-tablet: (720px + $grid-gutter-width)
+//** For `$screen-sm-min` and up.
+// $container-sm: $container-tablet
+
+// Medium screen / desktop
+// $container-desktop: (940px + $grid-gutter-width)
+//** For `$screen-md-min` and up.
+// $container-md: $container-desktop
+
+// Large screen / wide desktop
+// $container-large-desktop: (1140px + $grid-gutter-width)
+//** For `$screen-lg-min` and up.
+// $container-lg: $container-large-desktop
+
+//== Navbar
+//
+//##
+
+// Basics of a navbar
+// $navbar-height: 50px
+// $navbar-margin-bottom: $line-height-computed
+// $navbar-border-radius: $border-radius-base
+// $navbar-padding-horizontal: floor(($grid-gutter-width / 2))
+// $navbar-padding-vertical: (($navbar-height - $line-height-computed) / 2)
+// $navbar-collapse-max-height: 340px
+
+// $navbar-default-color: #777
+// $navbar-default-bg: #f8f8f8
+// $navbar-default-border: darken($navbar-default-bg, 6.5%)
+
+// Navbar links
+// $navbar-default-link-color: #777
+// $navbar-default-link-hover-color: #333
+// $navbar-default-link-hover-bg: transparent
+// $navbar-default-link-active-color: #555
+// $navbar-default-link-active-bg: darken($navbar-default-bg, 6.5%)
+// $navbar-default-link-disabled-color: #ccc
+// $navbar-default-link-disabled-bg: transparent
+
+// Navbar brand label
+// $navbar-default-brand-color: $navbar-default-link-color
+// $navbar-default-brand-hover-color: darken($navbar-default-brand-color, 10%)
+// $navbar-default-brand-hover-bg: transparent
+
+// Navbar toggle
+// $navbar-default-toggle-hover-bg: #ddd
+// $navbar-default-toggle-icon-bar-bg: #888
+// $navbar-default-toggle-border-color: #ddd
+
+// Inverted navbar
+// Reset inverted navbar basics
+// $navbar-inverse-color: lighten($gray-light, 15%)
+// $navbar-inverse-bg: #222
+// $navbar-inverse-border: darken($navbar-inverse-bg, 10%)
+
+// Inverted navbar links
+// $navbar-inverse-link-color: lighten($gray-light, 15%)
+// $navbar-inverse-link-hover-color: #fff
+// $navbar-inverse-link-hover-bg: transparent
+// $navbar-inverse-link-active-color: $navbar-inverse-link-hover-color
+// $navbar-inverse-link-active-bg: darken($navbar-inverse-bg, 10%)
+// $navbar-inverse-link-disabled-color: #444
+// $navbar-inverse-link-disabled-bg: transparent
+
+// Inverted navbar brand label
+// $navbar-inverse-brand-color: $navbar-inverse-link-color
+// $navbar-inverse-brand-hover-color: #fff
+// $navbar-inverse-brand-hover-bg: transparent
+
+// Inverted navbar toggle
+// $navbar-inverse-toggle-hover-bg: #333
+// $navbar-inverse-toggle-icon-bar-bg: #fff
+// $navbar-inverse-toggle-border-color: #333
+
+//== Navs
+//
+//##
+
+//=== Shared nav styles
+// $nav-link-padding: 10px 15px
+// $nav-link-hover-bg: $gray-lighter
+
+// $nav-disabled-link-color: $gray-light
+// $nav-disabled-link-hover-color: $gray-light
+
+//== Tabs
+// $nav-tabs-border-color: #ddd
+
+// $nav-tabs-link-hover-border-color: $gray-lighter
+
+// $nav-tabs-active-link-hover-bg: $body-bg
+// $nav-tabs-active-link-hover-color: $gray
+// $nav-tabs-active-link-hover-border-color: #ddd
+
+// $nav-tabs-justified-link-border-color: #ddd
+// $nav-tabs-justified-active-link-border-color: $body-bg
+
+//== Pills
+// $nav-pills-border-radius: $border-radius-base
+// $nav-pills-active-link-hover-bg: $component-active-bg
+// $nav-pills-active-link-hover-color: $component-active-color
+
+//== Pagination
+//
+//##
+
+// $pagination-color: $link-color
+// $pagination-bg: #fff
+// $pagination-border: #ddd
+
+// $pagination-hover-color: $link-hover-color
+// $pagination-hover-bg: $gray-lighter
+// $pagination-hover-border: #ddd
+
+// $pagination-active-color: #fff
+// $pagination-active-bg: $brand-primary
+// $pagination-active-border: $brand-primary
+
+// $pagination-disabled-color: $gray-light
+// $pagination-disabled-bg: #fff
+// $pagination-disabled-border: #ddd
+
+//== Pager
+//
+//##
+
+// $pager-bg: $pagination-bg
+// $pager-border: $pagination-border
+// $pager-border-radius: 15px
+
+// $pager-hover-bg: $pagination-hover-bg
+
+// $pager-active-bg: $pagination-active-bg
+// $pager-active-color: $pagination-active-color
+
+// $pager-disabled-color: $pagination-disabled-color
+
+//== Jumbotron
+//
+//##
+
+// $jumbotron-padding: 30px
+// $jumbotron-color: inherit
+// $jumbotron-bg: $gray-lighter
+// $jumbotron-heading-color: inherit
+// $jumbotron-font-size: ceil(($font-size-base * 1.5))
+
+//== Form states and alerts
+//
+//## Define colors for form feedback states and, by default, alerts.
+
+// $state-success-text: #3c763d
+// $state-success-bg: #dff0d8
+// $state-success-border: darken(adjust-hue($state-success-bg, -10), 5%)
+
+// $state-info-text: #31708f
+// $state-info-bg: #d9edf7
+// $state-info-border: darken(adjust-hue($state-info-bg, -10), 7%)
+
+// $state-warning-text: #8a6d3b
+// $state-warning-bg: #fcf8e3
+// $state-warning-border: darken(adjust-hue($state-warning-bg, -10), 5%)
+
+// $state-danger-text: #a94442
+// $state-danger-bg: #f2dede
+// $state-danger-border: darken(adjust-hue($state-danger-bg, -10), 5%)
+
+//== Tooltips
+//
+//##
+
+//** Tooltip max width
+// $tooltip-max-width: 200px
+//** Tooltip text color
+// $tooltip-color: #fff
+//** Tooltip background color
+// $tooltip-bg: #000
+// $tooltip-opacity: .9
+
+//** Tooltip arrow width
+// $tooltip-arrow-width: 5px
+//** Tooltip arrow color
+// $tooltip-arrow-color: $tooltip-bg
+
+//== Popovers
+//
+//##
+
+//** Popover body background color
+// $popover-bg: #fff
+//** Popover maximum width
+// $popover-max-width: 276px
+//** Popover border color
+// $popover-border-color: rgba(0,0,0,.2)
+//** Popover fallback border color
+// $popover-fallback-border-color: #ccc
+
+//** Popover title background color
+// $popover-title-bg: darken($popover-bg, 3%)
+
+//** Popover arrow width
+// $popover-arrow-width: 10px
+//** Popover arrow color
+// $popover-arrow-color: $popover-bg
+
+//** Popover outer arrow width
+// $popover-arrow-outer-width: ($popover-arrow-width + 1)
+//** Popover outer arrow color
+// $popover-arrow-outer-color: fade_in($popover-border-color, 0.05)
+//** Popover outer arrow fallback color
+// $popover-arrow-outer-fallback-color: darken($popover-fallback-border-color, 20%)
+
+//== Labels
+//
+//##
+
+//** Default label background color
+// $label-default-bg: $gray-light
+//** Primary label background color
+// $label-primary-bg: $brand-primary
+//** Success label background color
+// $label-success-bg: $brand-success
+//** Info label background color
+// $label-info-bg: $brand-info
+//** Warning label background color
+// $label-warning-bg: $brand-warning
+//** Danger label background color
+// $label-danger-bg: $brand-danger
+
+//** Default label text color
+// $label-color: #fff
+//** Default text color of a linked label
+// $label-link-hover-color: #fff
+
+//== Modals
+//
+//##
+
+//** Padding applied to the modal body
+// $modal-inner-padding: 15px
+
+//** Padding applied to the modal title
+// $modal-title-padding: 15px
+//** Modal title line-height
+// $modal-title-line-height: $line-height-base
+
+//** Background color of modal content area
+// $modal-content-bg: #fff
+//** Modal content border color
+// $modal-content-border-color: rgba(0,0,0,.2)
+//** Modal content border color **for IE8**
+// $modal-content-fallback-border-color: #999
+
+//** Modal backdrop background color
+// $modal-backdrop-bg: #000
+//** Modal backdrop opacity
+// $modal-backdrop-opacity: .5
+//** Modal header border color
+// $modal-header-border-color: #e5e5e5
+//** Modal footer border color
+// $modal-footer-border-color: $modal-header-border-color
+
+// $modal-lg: 900px
+// $modal-md: 600px
+// $modal-sm: 300px
+
+//== Alerts
+//
+//## Define alert colors, border radius, and padding.
+
+// $alert-padding: 15px
+// $alert-border-radius: $border-radius-base
+// $alert-link-font-weight: bold
+
+// $alert-success-bg: $state-success-bg
+// $alert-success-text: $state-success-text
+// $alert-success-border: $state-success-border
+
+// $alert-info-bg: $state-info-bg
+// $alert-info-text: $state-info-text
+// $alert-info-border: $state-info-border
+
+// $alert-warning-bg: $state-warning-bg
+// $alert-warning-text: $state-warning-text
+// $alert-warning-border: $state-warning-border
+
+// $alert-danger-bg: $state-danger-bg
+// $alert-danger-text: $state-danger-text
+// $alert-danger-border: $state-danger-border
+
+//== Progress bars
+//
+//##
+
+//** Background color of the whole progress component
+// $progress-bg: #f5f5f5
+//** Progress bar text color
+// $progress-bar-color: #fff
+//** Variable for setting rounded corners on progress bar.
+// $progress-border-radius: $border-radius-base
+
+//** Default progress bar color
+// $progress-bar-bg: $brand-primary
+//** Success progress bar color
+// $progress-bar-success-bg: $brand-success
+//** Warning progress bar color
+// $progress-bar-warning-bg: $brand-warning
+//** Danger progress bar color
+// $progress-bar-danger-bg: $brand-danger
+//** Info progress bar color
+// $progress-bar-info-bg: $brand-info
+
+//== List group
+//
+//##
+
+//** Background color on `.list-group-item`
+// $list-group-bg: #fff
+//** `.list-group-item` border color
+// $list-group-border: #ddd
+//** List group border radius
+// $list-group-border-radius: $border-radius-base
+
+//** Background color of single list items on hover
+// $list-group-hover-bg: #f5f5f5
+//** Text color of active list items
+// $list-group-active-color: $component-active-color
+//** Background color of active list items
+// $list-group-active-bg: $component-active-bg
+//** Border color of active list elements
+// $list-group-active-border: $list-group-active-bg
+//** Text color for content within active list items
+// $list-group-active-text-color: lighten($list-group-active-bg, 40%)
+
+//** Text color of disabled list items
+// $list-group-disabled-color: $gray-light
+//** Background color of disabled list items
+// $list-group-disabled-bg: $gray-lighter
+//** Text color for content within disabled list items
+// $list-group-disabled-text-color: $list-group-disabled-color
+
+// $list-group-link-color: #555
+// $list-group-link-hover-color: $list-group-link-color
+// $list-group-link-heading-color: #333
+
+//== Panels
+//
+//##
+
+// $panel-bg: #fff
+// $panel-body-padding: 15px
+// $panel-heading-padding: 10px 15px
+// $panel-footer-padding: $panel-heading-padding
+// $panel-border-radius: $border-radius-base
+
+//** Border color for elements within panels
+// $panel-inner-border: #ddd
+// $panel-footer-bg: #f5f5f5
+
+// $panel-default-text: $gray-dark
+// $panel-default-border: #ddd
+// $panel-default-heading-bg: #f5f5f5
+
+// $panel-primary-text: #fff
+// $panel-primary-border: $brand-primary
+// $panel-primary-heading-bg: $brand-primary
+
+// $panel-success-text: $state-success-text
+// $panel-success-border: $state-success-border
+// $panel-success-heading-bg: $state-success-bg
+
+// $panel-info-text: $state-info-text
+// $panel-info-border: $state-info-border
+// $panel-info-heading-bg: $state-info-bg
+
+// $panel-warning-text: $state-warning-text
+// $panel-warning-border: $state-warning-border
+// $panel-warning-heading-bg: $state-warning-bg
+
+// $panel-danger-text: $state-danger-text
+// $panel-danger-border: $state-danger-border
+// $panel-danger-heading-bg: $state-danger-bg
+
+//== Thumbnails
+//
+//##
+
+//** Padding around the thumbnail image
+// $thumbnail-padding: 4px
+//** Thumbnail background color
+// $thumbnail-bg: $body-bg
+//** Thumbnail border color
+// $thumbnail-border: #ddd
+//** Thumbnail border radius
+// $thumbnail-border-radius: $border-radius-base
+
+//** Custom text color for thumbnail captions
+// $thumbnail-caption-color: $text-color
+//** Padding around the thumbnail caption
+// $thumbnail-caption-padding: 9px
+
+//== Wells
+//
+//##
+
+// $well-bg: #f5f5f5
+// $well-border: darken($well-bg, 7%)
+
+//== Badges
+//
+//##
+
+// $badge-color: #fff
+//** Linked badge text color on hover
+// $badge-link-hover-color: #fff
+// $badge-bg: $gray-light
+
+//** Badge text color in active nav link
+// $badge-active-color: $link-color
+//** Badge background color in active nav link
+// $badge-active-bg: #fff
+
+// $badge-font-weight: bold
+// $badge-line-height: 1
+// $badge-border-radius: 10px
+
+//== Breadcrumbs
+//
+//##
+
+// $breadcrumb-padding-vertical: 8px
+// $breadcrumb-padding-horizontal: 15px
+//** Breadcrumb background color
+// $breadcrumb-bg: #f5f5f5
+//** Breadcrumb text color
+// $breadcrumb-color: #ccc
+//** Text color of current page in the breadcrumb
+// $breadcrumb-active-color: $gray-light
+//** Textual separator for between breadcrumb elements
+// $breadcrumb-separator: "/"
+
+//== Carousel
+//
+//##
+
+// $carousel-text-shadow: 0 1px 2px rgba(0,0,0,.6)
+
+// $carousel-control-color: #fff
+// $carousel-control-width: 15%
+// $carousel-control-opacity: .5
+// $carousel-control-font-size: 20px
+
+// $carousel-indicator-active-bg: #fff
+// $carousel-indicator-border-color: #fff
+
+// $carousel-caption-color: #fff
+
+//== Close
+//
+//##
+
+// $close-font-weight: bold
+// $close-color: #000
+// $close-text-shadow: 0 1px 0 #fff
+
+//== Code
+//
+//##
+
+// $code-color: #c7254e
+// $code-bg: #f9f2f4
+
+// $kbd-color: #fff
+// $kbd-bg: #333
+
+// $pre-bg: #f5f5f5
+// $pre-color: $gray-dark
+// $pre-border-color: #ccc
+// $pre-scrollable-max-height: 340px
+
+//== Type
+//
+//##
+
+//** Horizontal offset for forms and lists.
+// $component-offset-horizontal: 180px
+//** Text muted color
+// $text-muted: $gray-light
+//** Abbreviations and acronyms border color
+// $abbr-border-color: $gray-light
+//** Headings small color
+// $headings-small-color: $gray-light
+//** Blockquote small color
+// $blockquote-small-color: $gray-light
+//** Blockquote font size
+// $blockquote-font-size: ($font-size-base * 1.25)
+//** Blockquote border color
+// $blockquote-border-color: $gray-lighter
+//** Page header border color
+// $page-header-border-color: $gray-lighter
+//** Width of horizontal description list titles
+// $dl-horizontal-offset: $component-offset-horizontal
+//** Horizontal line color.
+// $hr-border: $gray-lighter
diff --git a/src/test/css/selectors.css b/src/test/css/selectors.css
new file mode 100644
index 000000000..2aa1791ef
--- /dev/null
+++ b/src/test/css/selectors.css
@@ -0,0 +1,146 @@
+.thumbnail-list li div.selection-show {
+ position: absolute;
+ border: 1px dashed red;
+ display: none;
+ pointer-events: none;
+}
+
+/* selections */
+.repeat-lassos-group {
+ position: absolute;
+ right: -185px;
+ bottom: -35px;
+}
+
+/* rectangularSelector.js classes */
+.selection-box, .table-region {
+ position: absolute;
+ border: 1px dashed rgba(255, 87, 0, 0.8);
+ background: rgba(255, 87, 0, 0.2);
+ box-sizing: border-box;
+}
+.selection-box:hover, .table-region:hover {
+ cursor: pointer;
+}
+
+.selection-box {
+ z-index: 42;
+ width: 0;
+ height: 0;
+ visibility: hidden;
+}
+
+.table-region {
+ top: 0;
+ left: 0;
+ z-index: 21;
+
+}
+
+div.table-region .resize-handle {
+ position: absolute;
+}
+
+div.table-region .n-border {
+ width: calc(100% - 10px);
+ top: -5px;
+ left: 5px;
+ height: 10px;
+}
+
+div.table-region .s-border {
+ width: calc(100% - 10px);
+ bottom: -5px;
+ left: 5px;
+ height: 10px;
+}
+
+div.table-region .w-border {
+ height: calc(100% - 10px);
+ left: -5px;
+ top: 5px;
+ width: 10px;
+}
+
+div.table-region .e-border {
+ height: calc(100% - 10px);
+ top: 5px;
+ right: -5px;
+ width: 10px;
+}
+
+div.table-region .nw-border {
+ width: 10px;
+ height: 10px;
+ top: -5px;
+ left: -5px;
+}
+
+div.table-region .ne-border {
+ width: 10px;
+ height: 10px;
+ top: -5px;
+ right: -5px;
+}
+
+div.table-region .sw-border {
+ width: 10px;
+ height: 10px;
+ bottom: -5px;
+ left: -5px;
+}
+
+div.table-region .se-border {
+ width: 10px;
+ height: 10px;
+ bottom: -5px;
+ right: -5px;
+}
+
+div.table-region .n-border:hover {
+ cursor: n-resize;
+}
+
+div.table-region .nw-border:hover {
+ cursor: nw-resize;
+}
+
+div.table-region .ne-border:hover {
+ cursor: ne-resize;
+}
+
+div.table-region .s-border:hover {
+ cursor: s-resize;
+}
+
+div.table-region .sw-border:hover {
+ cursor: sw-resize;
+}
+
+div.table-region .se-border:hover {
+ cursor: se-resize;
+}
+
+div.table-region .w-border:hover {
+ cursor: w-resize;
+}
+
+div.table-region .e-border:hover {
+ cursor: e-resize;
+}
+
+div.table-region button[name=close] {
+ font-weight: bold;
+ border: 0;
+ background-color: transparent;
+ padding: 0;
+ font-size: 20px;
+ position: relative;
+ top: -25px;
+ left: 100%;
+ margin-left: 5px;
+}
+
+div.table-region button[name=close]:hover {
+ color: red;
+}
diff --git a/src/test/css/styles.css b/src/test/css/styles.css
new file mode 100644
index 000000000..856b8118b
--- /dev/null
+++ b/src/test/css/styles.css
@@ -0,0 +1,7852 @@
+@charset "UTF-8";
+/*! normalize.css v3.0.1 | MIT License | git.io/normalize */
+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,
+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: 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 {
+ -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"] {
+ 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;
+ -moz-box-sizing: content-box;
+ -webkit-box-sizing: content-box;
+ box-sizing: content-box;
+}
+
+input[type="search"]::-webkit-search-cancel-button,
+input[type="search"]::-webkit-search-decoration {
+ -webkit-appearance: none;
+}
+
+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;
+}
+
+@media print {
+ * {
+ text-shadow: none !important;
+ color: #000 !important;
+ background: transparent !important;
+ box-shadow: none !important;
+ }
+
+ a,
+ a:visited {
+ text-decoration: underline;
+ }
+
+ a[href]:after {
+ content: " (" attr(href) ")";
+ }
+
+ abbr[title]:after {
+ content: " (" attr(title) ")";
+ }
+
+ a[href^="javascript:"]:after,
+ a[href^="#"]:after {
+ content: "";
+ }
+
+ 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;
+ }
+
+ select {
+ background: #fff !important;
+ }
+
+ .navbar {
+ display: none;
+ }
+
+ .table td,
+ .table th {
+ background-color: #fff !important;
+ }
+
+ .btn > .caret,
+ .dropup > .btn > .caret {
+ border-top-color: #000 !important;
+ }
+
+ .label {
+ border: 1px solid #000;
+ }
+
+ .table {
+ border-collapse: collapse !important;
+ }
+
+ .table-bordered th,
+ .table-bordered td {
+ border: 1px solid #ddd !important;
+ }
+}
+@font-face {
+ font-family: 'Glyphicons Halflings';
+ src: url(webapp/fonts/bootstrap/glyphicons-halflings-regular.eot);
+ src: url(webapp/fonts/bootstrap/glyphicons-halflings-regular.eot?#iefix) format("embedded-opentype"), url(webapp/fonts/bootstrap/glyphicons-halflings-regular.woff) format("woff"), url(webapp/fonts/bootstrap/glyphicons-halflings-regular.ttf) format("truetype"), url(webapp/fonts/bootstrap/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: "\2a";
+}
+
+.glyphicon-plus:before {
+ content: "\2b";
+}
+
+.glyphicon-euro:before {
+ content: "\20ac";
+}
+
+.glyphicon-minus:before {
+ content: "\2212";
+}
+
+.glyphicon-cloud:before {
+ content: "\2601";
+}
+
+.glyphicon-envelope:before {
+ content: "\2709";
+}
+
+.glyphicon-pencil:before {
+ content: "\270f";
+}
+
+.glyphicon-glass:before {
+ content: "\e001";
+}
+
+.glyphicon-music:before {
+ content: "\e002";
+}
+
+.glyphicon-search:before {
+ content: "\e003";
+}
+
+.glyphicon-heart:before {
+ content: "\e005";
+}
+
+.glyphicon-star:before {
+ content: "\e006";
+}
+
+.glyphicon-star-empty:before {
+ content: "\e007";
+}
+
+.glyphicon-user:before {
+ content: "\e008";
+}
+
+.glyphicon-film:before {
+ content: "\e009";
+}
+
+.glyphicon-th-large:before {
+ content: "\e010";
+}
+
+.glyphicon-th:before {
+ content: "\e011";
+}
+
+.glyphicon-th-list:before {
+ content: "\e012";
+}
+
+.glyphicon-ok:before {
+ content: "\e013";
+}
+
+.glyphicon-remove:before {
+ content: "\e014";
+}
+
+.glyphicon-zoom-in:before {
+ content: "\e015";
+}
+
+.glyphicon-zoom-out:before {
+ content: "\e016";
+}
+
+.glyphicon-off:before {
+ content: "\e017";
+}
+
+.glyphicon-signal:before {
+ content: "\e018";
+}
+
+.glyphicon-cog:before {
+ content: "\e019";
+}
+
+.glyphicon-trash:before {
+ content: "\e020";
+}
+
+.glyphicon-home:before {
+ content: "\e021";
+}
+
+.glyphicon-file:before {
+ content: "\e022";
+}
+
+.glyphicon-time:before {
+ content: "\e023";
+}
+
+.glyphicon-road:before {
+ content: "\e024";
+}
+
+.glyphicon-download-alt:before {
+ content: "\e025";
+}
+
+.glyphicon-download:before {
+ content: "\e026";
+}
+
+.glyphicon-upload:before {
+ content: "\e027";
+}
+
+.glyphicon-inbox:before {
+ content: "\e028";
+}
+
+.glyphicon-play-circle:before {
+ content: "\e029";
+}
+
+.glyphicon-repeat:before {
+ content: "\e030";
+}
+
+.glyphicon-refresh:before {
+ content: "\e031";
+}
+
+.glyphicon-list-alt:before {
+ content: "\e032";
+}
+
+.glyphicon-lock:before {
+ content: "\e033";
+}
+
+.glyphicon-flag:before {
+ content: "\e034";
+}
+
+.glyphicon-headphones:before {
+ content: "\e035";
+}
+
+.glyphicon-volume-off:before {
+ content: "\e036";
+}
+
+.glyphicon-volume-down:before {
+ content: "\e037";
+}
+
+.glyphicon-volume-up:before {
+ content: "\e038";
+}
+
+.glyphicon-qrcode:before {
+ content: "\e039";
+}
+
+.glyphicon-barcode:before {
+ content: "\e040";
+}
+
+.glyphicon-tag:before {
+ content: "\e041";
+}
+
+.glyphicon-tags:before {
+ content: "\e042";
+}
+
+.glyphicon-book:before {
+ content: "\e043";
+}
+
+.glyphicon-bookmark:before {
+ content: "\e044";
+}
+
+.glyphicon-print:before {
+ content: "\e045";
+}
+
+.glyphicon-camera:before {
+ content: "\e046";
+}
+
+.glyphicon-font:before {
+ content: "\e047";
+}
+
+.glyphicon-bold:before {
+ content: "\e048";
+}
+
+.glyphicon-italic:before {
+ content: "\e049";
+}
+
+.glyphicon-text-height:before {
+ content: "\e050";
+}
+
+.glyphicon-text-width:before {
+ content: "\e051";
+}
+
+.glyphicon-align-left:before {
+ content: "\e052";
+}
+
+.glyphicon-align-center:before {
+ content: "\e053";
+}
+
+.glyphicon-align-right:before {
+ content: "\e054";
+}
+
+.glyphicon-align-justify:before {
+ content: "\e055";
+}
+
+.glyphicon-list:before {
+ content: "\e056";
+}
+
+.glyphicon-indent-left:before {
+ content: "\e057";
+}
+
+.glyphicon-indent-right:before {
+ content: "\e058";
+}
+
+.glyphicon-facetime-video:before {
+ content: "\e059";
+}
+
+.glyphicon-picture:before {
+ content: "\e060";
+}
+
+.glyphicon-map-marker:before {
+ content: "\e062";
+}
+
+.glyphicon-adjust:before {
+ content: "\e063";
+}
+
+.glyphicon-tint:before {
+ content: "\e064";
+}
+
+.glyphicon-edit:before {
+ content: "\e065";
+}
+
+.glyphicon-share:before {
+ content: "\e066";
+}
+
+.glyphicon-check:before {
+ content: "\e067";
+}
+
+.glyphicon-move:before {
+ content: "\e068";
+}
+
+.glyphicon-step-backward:before {
+ content: "\e069";
+}
+
+.glyphicon-fast-backward:before {
+ content: "\e070";
+}
+
+.glyphicon-backward:before {
+ content: "\e071";
+}
+
+.glyphicon-play:before {
+ content: "\e072";
+}
+
+.glyphicon-pause:before {
+ content: "\e073";
+}
+
+.glyphicon-stop:before {
+ content: "\e074";
+}
+
+.glyphicon-forward:before {
+ content: "\e075";
+}
+
+.glyphicon-fast-forward:before {
+ content: "\e076";
+}
+
+.glyphicon-step-forward:before {
+ content: "\e077";
+}
+
+.glyphicon-eject:before {
+ content: "\e078";
+}
+
+.glyphicon-chevron-left:before {
+ content: "\e079";
+}
+
+.glyphicon-chevron-right:before {
+ content: "\e080";
+}
+
+.glyphicon-plus-sign:before {
+ content: "\e081";
+}
+
+.glyphicon-minus-sign:before {
+ content: "\e082";
+}
+
+.glyphicon-remove-sign:before {
+ content: "\e083";
+}
+
+.glyphicon-ok-sign:before {
+ content: "\e084";
+}
+
+.glyphicon-question-sign:before {
+ content: "\e085";
+}
+
+.glyphicon-info-sign:before {
+ content: "\e086";
+}
+
+.glyphicon-screenshot:before {
+ content: "\e087";
+}
+
+.glyphicon-remove-circle:before {
+ content: "\e088";
+}
+
+.glyphicon-ok-circle:before {
+ content: "\e089";
+}
+
+.glyphicon-ban-circle:before {
+ content: "\e090";
+}
+
+.glyphicon-arrow-left:before {
+ content: "\e091";
+}
+
+.glyphicon-arrow-right:before {
+ content: "\e092";
+}
+
+.glyphicon-arrow-up:before {
+ content: "\e093";
+}
+
+.glyphicon-arrow-down:before {
+ content: "\e094";
+}
+
+.glyphicon-share-alt:before {
+ content: "\e095";
+}
+
+.glyphicon-resize-full:before {
+ content: "\e096";
+}
+
+.glyphicon-resize-small:before {
+ content: "\e097";
+}
+
+.glyphicon-exclamation-sign:before {
+ content: "\e101";
+}
+
+.glyphicon-gift:before {
+ content: "\e102";
+}
+
+.glyphicon-leaf:before {
+ content: "\e103";
+}
+
+.glyphicon-fire:before {
+ content: "\e104";
+}
+
+.glyphicon-eye-open:before {
+ content: "\e105";
+}
+
+.glyphicon-eye-close:before {
+ content: "\e106";
+}
+
+.glyphicon-warning-sign:before {
+ content: "\e107";
+}
+
+.glyphicon-plane:before {
+ content: "\e108";
+}
+
+.glyphicon-calendar:before {
+ content: "\e109";
+}
+
+.glyphicon-random:before {
+ content: "\e110";
+}
+
+.glyphicon-comment:before {
+ content: "\e111";
+}
+
+.glyphicon-magnet:before {
+ content: "\e112";
+}
+
+.glyphicon-chevron-up:before {
+ content: "\e113";
+}
+
+.glyphicon-chevron-down:before {
+ content: "\e114";
+}
+
+.glyphicon-retweet:before {
+ content: "\e115";
+}
+
+.glyphicon-shopping-cart:before {
+ content: "\e116";
+}
+
+.glyphicon-folder-close:before {
+ content: "\e117";
+}
+
+.glyphicon-folder-open:before {
+ content: "\e118";
+}
+
+.glyphicon-resize-vertical:before {
+ content: "\e119";
+}
+
+.glyphicon-resize-horizontal:before {
+ content: "\e120";
+}
+
+.glyphicon-hdd:before {
+ content: "\e121";
+}
+
+.glyphicon-bullhorn:before {
+ content: "\e122";
+}
+
+.glyphicon-bell:before {
+ content: "\e123";
+}
+
+.glyphicon-certificate:before {
+ content: "\e124";
+}
+
+.glyphicon-thumbs-up:before {
+ content: "\e125";
+}
+
+.glyphicon-thumbs-down:before {
+ content: "\e126";
+}
+
+.glyphicon-hand-right:before {
+ content: "\e127";
+}
+
+.glyphicon-hand-left:before {
+ content: "\e128";
+}
+
+.glyphicon-hand-up:before {
+ content: "\e129";
+}
+
+.glyphicon-hand-down:before {
+ content: "\e130";
+}
+
+.glyphicon-circle-arrow-right:before {
+ content: "\e131";
+}
+
+.glyphicon-circle-arrow-left:before {
+ content: "\e132";
+}
+
+.glyphicon-circle-arrow-up:before {
+ content: "\e133";
+}
+
+.glyphicon-circle-arrow-down:before {
+ content: "\e134";
+}
+
+.glyphicon-globe:before {
+ content: "\e135";
+}
+
+.glyphicon-wrench:before {
+ content: "\e136";
+}
+
+.glyphicon-tasks:before {
+ content: "\e137";
+}
+
+.glyphicon-filter:before {
+ content: "\e138";
+}
+
+.glyphicon-briefcase:before {
+ content: "\e139";
+}
+
+.glyphicon-fullscreen:before {
+ content: "\e140";
+}
+
+.glyphicon-dashboard:before {
+ content: "\e141";
+}
+
+.glyphicon-paperclip:before {
+ content: "\e142";
+}
+
+.glyphicon-heart-empty:before {
+ content: "\e143";
+}
+
+.glyphicon-link:before {
+ content: "\e144";
+}
+
+.glyphicon-phone:before {
+ content: "\e145";
+}
+
+.glyphicon-pushpin:before {
+ content: "\e146";
+}
+
+.glyphicon-usd:before {
+ content: "\e148";
+}
+
+.glyphicon-gbp:before {
+ content: "\e149";
+}
+
+.glyphicon-sort:before {
+ content: "\e150";
+}
+
+.glyphicon-sort-by-alphabet:before {
+ content: "\e151";
+}
+
+.glyphicon-sort-by-alphabet-alt:before {
+ content: "\e152";
+}
+
+.glyphicon-sort-by-order:before {
+ content: "\e153";
+}
+
+.glyphicon-sort-by-order-alt:before {
+ content: "\e154";
+}
+
+.glyphicon-sort-by-attributes:before {
+ content: "\e155";
+}
+
+.glyphicon-sort-by-attributes-alt:before {
+ content: "\e156";
+}
+
+.glyphicon-unchecked:before {
+ content: "\e157";
+}
+
+.glyphicon-expand:before {
+ content: "\e158";
+}
+
+.glyphicon-collapse-down:before {
+ content: "\e159";
+}
+
+.glyphicon-collapse-up:before {
+ content: "\e160";
+}
+
+.glyphicon-log-in:before {
+ content: "\e161";
+}
+
+.glyphicon-flash:before {
+ content: "\e162";
+}
+
+.glyphicon-log-out:before {
+ content: "\e163";
+}
+
+.glyphicon-new-window:before {
+ content: "\e164";
+}
+
+.glyphicon-record:before {
+ content: "\e165";
+}
+
+.glyphicon-save:before {
+ content: "\e166";
+}
+
+.glyphicon-open:before {
+ content: "\e167";
+}
+
+.glyphicon-saved:before {
+ content: "\e168";
+}
+
+.glyphicon-import:before {
+ content: "\e169";
+}
+
+.glyphicon-export:before {
+ content: "\e170";
+}
+
+.glyphicon-send:before {
+ content: "\e171";
+}
+
+.glyphicon-floppy-disk:before {
+ content: "\e172";
+}
+
+.glyphicon-floppy-saved:before {
+ content: "\e173";
+}
+
+.glyphicon-floppy-remove:before {
+ content: "\e174";
+}
+
+.glyphicon-floppy-save:before {
+ content: "\e175";
+}
+
+.glyphicon-floppy-open:before {
+ content: "\e176";
+}
+
+.glyphicon-credit-card:before {
+ content: "\e177";
+}
+
+.glyphicon-transfer:before {
+ content: "\e178";
+}
+
+.glyphicon-cutlery:before {
+ content: "\e179";
+}
+
+.glyphicon-header:before {
+ content: "\e180";
+}
+
+.glyphicon-compressed:before {
+ content: "\e181";
+}
+
+.glyphicon-earphone:before {
+ content: "\e182";
+}
+
+.glyphicon-phone-alt:before {
+ content: "\e183";
+}
+
+.glyphicon-tower:before {
+ content: "\e184";
+}
+
+.glyphicon-stats:before {
+ content: "\e185";
+}
+
+.glyphicon-sd-video:before {
+ content: "\e186";
+}
+
+.glyphicon-hd-video:before {
+ content: "\e187";
+}
+
+.glyphicon-subtitles:before {
+ content: "\e188";
+}
+
+.glyphicon-sound-stereo:before {
+ content: "\e189";
+}
+
+.glyphicon-sound-dolby:before {
+ content: "\e190";
+}
+
+.glyphicon-sound-5-1:before {
+ content: "\e191";
+}
+
+.glyphicon-sound-6-1:before {
+ content: "\e192";
+}
+
+.glyphicon-sound-7-1:before {
+ content: "\e193";
+}
+
+.glyphicon-copyright-mark:before {
+ content: "\e194";
+}
+
+.glyphicon-registration-mark:before {
+ content: "\e195";
+}
+
+.glyphicon-cloud-download:before {
+ content: "\e197";
+}
+
+.glyphicon-cloud-upload:before {
+ content: "\e198";
+}
+
+.glyphicon-tree-conifer:before {
+ content: "\e199";
+}
+
+.glyphicon-tree-deciduous:before {
+ content: "\e200";
+}
+
+* {
+ -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: transparent;
+}
+
+body {
+ font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+ line-height: 1.428571429;
+ background-color: #fff;
+}
+
+input,
+button,
+select,
+textarea {
+ font-family: inherit;
+ font-size: inherit;
+ line-height: inherit;
+}
+
+a {
+ color: #428bca;
+ text-decoration: none;
+}
+a:hover, a:focus {
+ color: #2a6496;
+ text-decoration: underline;
+}
+a:focus {
+ outline: thin dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px;
+}
+
+figure {
+ margin: 0;
+}
+
+img {
+ vertical-align: middle;
+}
+
+.img-responsive {
+ display: block;
+ width: 100% \9;
+ max-width: 100%;
+ height: auto;
+}
+
+.img-rounded {
+ border-radius: 6px;
+}
+
+.img-thumbnail {
+ padding: 4px;
+ line-height: 1.428571429;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ border-radius: 4px;
+ -webkit-transition: all 0.2s ease-in-out;
+ -o-transition: all 0.2s ease-in-out;
+ transition: all 0.2s ease-in-out;
+ display: inline-block;
+ width: 100% \9;
+ max-width: 100%;
+ height: auto;
+}
+
+.img-circle {
+ border-radius: 50%;
+}
+
+hr {
+ margin-top: 20px;
+ margin-bottom: 20px;
+ border: 0;
+ border-top: 1px solid #eeeeee;
+}
+
+.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;
+}
+
+h1, h2, h3, h4, h5, h6,
+.h1, .h2, .h3, .h4, .h5, .h6 {
+ font-family: inherit;
+ font-weight: 500;
+ line-height: 1.1;
+ color: inherit;
+}
+h1 small,
+h1 .small, h2 small,
+h2 .small, h3 small,
+h3 .small, h4 small,
+h4 .small, h5 small,
+h5 .small, h6 small,
+h6 .small,
+.h1 small,
+.h1 .small, .h2 small,
+.h2 .small, .h3 small,
+.h3 .small, .h4 small,
+.h4 .small, .h5 small,
+.h5 .small, .h6 small,
+.h6 .small {
+ font-weight: normal;
+ line-height: 1;
+ color: #777777;
+}
+
+h1, .h1,
+h2, .h2,
+h3, .h3 {
+ margin-top: 20px;
+ margin-bottom: 10px;
+}
+h1 small,
+h1 .small, .h1 small,
+.h1 .small,
+h2 small,
+h2 .small, .h2 small,
+.h2 .small,
+h3 small,
+h3 .small, .h3 small,
+.h3 .small {
+ font-size: 65%;
+}
+
+h4, .h4,
+h5, .h5,
+h6, .h6 {
+ margin-top: 0px;
+ margin-bottom: 10px;
+}
+h4 small,
+h4 .small, .h4 small,
+.h4 .small,
+h5 small,
+h5 .small, .h5 small,
+.h5 .small,
+h6 small,
+h6 .small, .h6 small,
+.h6 .small {
+ font-size: 75%;
+}
+
+h1, .h1 {
+ font-size: 36px;
+}
+
+h2, .h2 {
+ font-size: 30px;
+}
+
+h3, .h3 {
+ font-size: 24px;
+}
+
+h4, .h4 {
+ font-size: 18px;
+}
+
+h5, .h5 {
+ font-size: 14px;
+}
+
+h6, .h6 {
+ font-size: 12px;
+}
+
+p {
+ margin: 0 0 10px;
+}
+
+.lead {
+ margin-bottom: 20px;
+ font-size: 16px;
+ font-weight: 300;
+ line-height: 1.4;
+}
+@media (min-width: 768px) {
+ .lead {
+ font-size: 21px;
+ }
+}
+
+small,
+.small {
+ font-size: 85%;
+}
+
+cite {
+ font-style: normal;
+}
+
+mark,
+.mark {
+ background-color: #fcf8e3;
+ 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: #777777;
+}
+
+.text-primary {
+ color: #428bca;
+}
+
+a.text-primary:hover {
+ color: #3071a9;
+}
+
+.text-success {
+ color: #3c763d;
+}
+
+a.text-success:hover {
+ color: #2b542c;
+}
+
+.text-info {
+ color: #31708f;
+}
+
+a.text-info:hover {
+ color: #245269;
+}
+
+.text-warning {
+ color: #8a6d3b;
+}
+
+a.text-warning:hover {
+ color: #66512c;
+}
+
+.text-danger {
+ color: #a94442;
+}
+
+a.text-danger:hover {
+ color: #843534;
+}
+
+.bg-primary {
+ color: #fff;
+}
+
+.bg-primary {
+ background-color: #428bca;
+}
+
+a.bg-primary:hover {
+ background-color: #3071a9;
+}
+
+.bg-success {
+ background-color: #dff0d8;
+}
+
+a.bg-success:hover {
+ background-color: #c1e2b3;
+}
+
+.bg-info {
+ background-color: #d9edf7;
+}
+
+a.bg-info:hover {
+ background-color: #afd9ee;
+}
+
+.bg-warning {
+ background-color: #fcf8e3;
+}
+
+a.bg-warning:hover {
+ background-color: #f7ecb5;
+}
+
+.bg-danger {
+ background-color: #f2dede;
+}
+
+a.bg-danger:hover {
+ background-color: #e4b9b9;
+}
+
+.page-header {
+ padding-bottom: 9px;
+ margin: 40px 0 20px;
+ border-bottom: 1px solid #eeeeee;
+}
+
+ul,
+ol {
+ margin-top: 0;
+ margin-bottom: 0px;
+}
+ul ul,
+ul ol,
+ol ul,
+ol ol {
+ margin-bottom: 0;
+}
+
+.list-unstyled, .list-inline {
+ padding-left: 0;
+ list-style: none;
+}
+
+.list-inline {
+ margin-left: -5px;
+}
+.list-inline > li {
+ display: inline-block;
+ padding-left: 5px;
+ padding-right: 5px;
+}
+
+dl {
+ margin-top: 0;
+ margin-bottom: 20px;
+}
+
+dt,
+dd {
+ line-height: 1.428571429;
+}
+
+dt {
+ font-weight: bold;
+}
+
+dd {
+ margin-left: 0;
+}
+
+.dl-horizontal dd:before, .dl-horizontal dd:after {
+ content: " ";
+ display: table;
+}
+.dl-horizontal dd:after {
+ clear: both;
+}
+@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 #777777;
+}
+
+.initialism {
+ font-size: 90%;
+ text-transform: uppercase;
+}
+
+blockquote {
+ padding: 10px 20px;
+ margin: 0 0 20px;
+ font-size: 17.5px;
+ border-left: 5px solid #eeeeee;
+}
+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.428571429;
+ color: #777777;
+}
+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 #eeeeee;
+ border-left: 0;
+ text-align: right;
+}
+.blockquote-reverse footer:before,
+.blockquote-reverse small:before,
+.blockquote-reverse .small:before,
+blockquote.pull-right footer:before,
+blockquote.pull-right small:before,
+blockquote.pull-right .small:before {
+ content: '';
+}
+.blockquote-reverse footer:after,
+.blockquote-reverse small:after,
+.blockquote-reverse .small:after,
+blockquote.pull-right footer:after,
+blockquote.pull-right small:after,
+blockquote.pull-right .small:after {
+ content: '\00A0 \2014';
+}
+
+blockquote:before,
+blockquote:after {
+ content: "";
+}
+
+address {
+ margin-bottom: 20px;
+ font-style: normal;
+ line-height: 1.428571429;
+}
+
+code,
+kbd,
+pre,
+samp {
+ font-family: Menlo, Monaco, Consolas, "Courier New", monospace;
+}
+
+code {
+ padding: 2px 4px;
+ font-size: 90%;
+ color: #c7254e;
+ background-color: #f9f2f4;
+ border-radius: 4px;
+}
+
+kbd {
+ padding: 2px 4px;
+ font-size: 90%;
+ color: #fff;
+ background-color: #333;
+ border-radius: 3px;
+ box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+kbd kbd {
+ padding: 0;
+ font-size: 100%;
+ box-shadow: none;
+}
+
+pre {
+ display: block;
+ padding: 9.5px;
+ margin: 0 0 10px;
+ font-size: 13px;
+ line-height: 1.428571429;
+ word-break: break-all;
+ word-wrap: break-word;
+ color: #333333;
+ background-color: #f5f5f5;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+}
+pre code {
+ padding: 0;
+ font-size: inherit;
+ color: inherit;
+ white-space: pre-wrap;
+ background-color: transparent;
+ border-radius: 0;
+}
+
+.pre-scrollable {
+ max-height: 340px;
+ overflow-y: scroll;
+}
+
+.container {
+ margin-right: auto;
+ margin-left: auto;
+ padding-left: 15px;
+ padding-right: 15px;
+}
+.container:before, .container:after {
+ content: " ";
+ display: table;
+}
+.container:after {
+ clear: both;
+}
+@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;
+}
+.container-fluid:before, .container-fluid:after {
+ content: " ";
+ display: table;
+}
+.container-fluid:after {
+ clear: both;
+}
+
+.row {
+ margin-left: -15px;
+ margin-right: -15px;
+}
+.row:before, .row:after {
+ content: " ";
+ display: table;
+}
+.row:after {
+ clear: both;
+}
+
+.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-1 {
+ width: 8.3333333333%;
+}
+
+.col-xs-2 {
+ width: 16.6666666667%;
+}
+
+.col-xs-3 {
+ width: 25%;
+}
+
+.col-xs-4 {
+ width: 33.3333333333%;
+}
+
+.col-xs-5 {
+ width: 41.6666666667%;
+}
+
+.col-xs-6 {
+ width: 50%;
+}
+
+.col-xs-7 {
+ width: 58.3333333333%;
+}
+
+.col-xs-8 {
+ width: 66.6666666667%;
+}
+
+.col-xs-9 {
+ width: 75%;
+}
+
+.col-xs-10 {
+ width: 83.3333333333%;
+}
+
+.col-xs-11 {
+ width: 91.6666666667%;
+}
+
+.col-xs-12 {
+ width: 100%;
+}
+
+.col-xs-pull-0 {
+ right: auto;
+}
+
+.col-xs-pull-1 {
+ right: 8.3333333333%;
+}
+
+.col-xs-pull-2 {
+ right: 16.6666666667%;
+}
+
+.col-xs-pull-3 {
+ right: 25%;
+}
+
+.col-xs-pull-4 {
+ right: 33.3333333333%;
+}
+
+.col-xs-pull-5 {
+ right: 41.6666666667%;
+}
+
+.col-xs-pull-6 {
+ right: 50%;
+}
+
+.col-xs-pull-7 {
+ right: 58.3333333333%;
+}
+
+.col-xs-pull-8 {
+ right: 66.6666666667%;
+}
+
+.col-xs-pull-9 {
+ right: 75%;
+}
+
+.col-xs-pull-10 {
+ right: 83.3333333333%;
+}
+
+.col-xs-pull-11 {
+ right: 91.6666666667%;
+}
+
+.col-xs-pull-12 {
+ right: 100%;
+}
+
+.col-xs-push-0 {
+ left: auto;
+}
+
+.col-xs-push-1 {
+ left: 8.3333333333%;
+}
+
+.col-xs-push-2 {
+ left: 16.6666666667%;
+}
+
+.col-xs-push-3 {
+ left: 25%;
+}
+
+.col-xs-push-4 {
+ left: 33.3333333333%;
+}
+
+.col-xs-push-5 {
+ left: 41.6666666667%;
+}
+
+.col-xs-push-6 {
+ left: 50%;
+}
+
+.col-xs-push-7 {
+ left: 58.3333333333%;
+}
+
+.col-xs-push-8 {
+ left: 66.6666666667%;
+}
+
+.col-xs-push-9 {
+ left: 75%;
+}
+
+.col-xs-push-10 {
+ left: 83.3333333333%;
+}
+
+.col-xs-push-11 {
+ left: 91.6666666667%;
+}
+
+.col-xs-push-12 {
+ left: 100%;
+}
+
+.col-xs-offset-0 {
+ margin-left: 0%;
+}
+
+.col-xs-offset-1 {
+ margin-left: 8.3333333333%;
+}
+
+.col-xs-offset-2 {
+ margin-left: 16.6666666667%;
+}
+
+.col-xs-offset-3 {
+ margin-left: 25%;
+}
+
+.col-xs-offset-4 {
+ margin-left: 33.3333333333%;
+}
+
+.col-xs-offset-5 {
+ margin-left: 41.6666666667%;
+}
+
+.col-xs-offset-6 {
+ margin-left: 50%;
+}
+
+.col-xs-offset-7 {
+ margin-left: 58.3333333333%;
+}
+
+.col-xs-offset-8 {
+ margin-left: 66.6666666667%;
+}
+
+.col-xs-offset-9 {
+ margin-left: 75%;
+}
+
+.col-xs-offset-10 {
+ margin-left: 83.3333333333%;
+}
+
+.col-xs-offset-11 {
+ margin-left: 91.6666666667%;
+}
+
+.col-xs-offset-12 {
+ margin-left: 100%;
+}
+
+@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-1 {
+ width: 8.3333333333%;
+ }
+
+ .col-sm-2 {
+ width: 16.6666666667%;
+ }
+
+ .col-sm-3 {
+ width: 25%;
+ }
+
+ .col-sm-4 {
+ width: 33.3333333333%;
+ }
+
+ .col-sm-5 {
+ width: 41.6666666667%;
+ }
+
+ .col-sm-6 {
+ width: 50%;
+ }
+
+ .col-sm-7 {
+ width: 58.3333333333%;
+ }
+
+ .col-sm-8 {
+ width: 66.6666666667%;
+ }
+
+ .col-sm-9 {
+ width: 75%;
+ }
+
+ .col-sm-10 {
+ width: 83.3333333333%;
+ }
+
+ .col-sm-11 {
+ width: 91.6666666667%;
+ }
+
+ .col-sm-12 {
+ width: 100%;
+ }
+
+ .col-sm-pull-0 {
+ right: auto;
+ }
+
+ .col-sm-pull-1 {
+ right: 8.3333333333%;
+ }
+
+ .col-sm-pull-2 {
+ right: 16.6666666667%;
+ }
+
+ .col-sm-pull-3 {
+ right: 25%;
+ }
+
+ .col-sm-pull-4 {
+ right: 33.3333333333%;
+ }
+
+ .col-sm-pull-5 {
+ right: 41.6666666667%;
+ }
+
+ .col-sm-pull-6 {
+ right: 50%;
+ }
+
+ .col-sm-pull-7 {
+ right: 58.3333333333%;
+ }
+
+ .col-sm-pull-8 {
+ right: 66.6666666667%;
+ }
+
+ .col-sm-pull-9 {
+ right: 75%;
+ }
+
+ .col-sm-pull-10 {
+ right: 83.3333333333%;
+ }
+
+ .col-sm-pull-11 {
+ right: 91.6666666667%;
+ }
+
+ .col-sm-pull-12 {
+ right: 100%;
+ }
+
+ .col-sm-push-0 {
+ left: auto;
+ }
+
+ .col-sm-push-1 {
+ left: 8.3333333333%;
+ }
+
+ .col-sm-push-2 {
+ left: 16.6666666667%;
+ }
+
+ .col-sm-push-3 {
+ left: 25%;
+ }
+
+ .col-sm-push-4 {
+ left: 33.3333333333%;
+ }
+
+ .col-sm-push-5 {
+ left: 41.6666666667%;
+ }
+
+ .col-sm-push-6 {
+ left: 50%;
+ }
+
+ .col-sm-push-7 {
+ left: 58.3333333333%;
+ }
+
+ .col-sm-push-8 {
+ left: 66.6666666667%;
+ }
+
+ .col-sm-push-9 {
+ left: 75%;
+ }
+
+ .col-sm-push-10 {
+ left: 83.3333333333%;
+ }
+
+ .col-sm-push-11 {
+ left: 91.6666666667%;
+ }
+
+ .col-sm-push-12 {
+ left: 100%;
+ }
+
+ .col-sm-offset-0 {
+ margin-left: 0%;
+ }
+
+ .col-sm-offset-1 {
+ margin-left: 8.3333333333%;
+ }
+
+ .col-sm-offset-2 {
+ margin-left: 16.6666666667%;
+ }
+
+ .col-sm-offset-3 {
+ margin-left: 25%;
+ }
+
+ .col-sm-offset-4 {
+ margin-left: 33.3333333333%;
+ }
+
+ .col-sm-offset-5 {
+ margin-left: 41.6666666667%;
+ }
+
+ .col-sm-offset-6 {
+ margin-left: 50%;
+ }
+
+ .col-sm-offset-7 {
+ margin-left: 58.3333333333%;
+ }
+
+ .col-sm-offset-8 {
+ margin-left: 66.6666666667%;
+ }
+
+ .col-sm-offset-9 {
+ margin-left: 75%;
+ }
+
+ .col-sm-offset-10 {
+ margin-left: 83.3333333333%;
+ }
+
+ .col-sm-offset-11 {
+ margin-left: 91.6666666667%;
+ }
+
+ .col-sm-offset-12 {
+ margin-left: 100%;
+ }
+}
+@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-1 {
+ width: 8.3333333333%;
+ }
+
+ .col-md-2 {
+ width: 16.6666666667%;
+ }
+
+ .col-md-3 {
+ width: 25%;
+ }
+
+ .col-md-4 {
+ width: 33.3333333333%;
+ }
+
+ .col-md-5 {
+ width: 41.6666666667%;
+ }
+
+ .col-md-6 {
+ width: 50%;
+ }
+
+ .col-md-7 {
+ width: 58.3333333333%;
+ }
+
+ .col-md-8 {
+ width: 66.6666666667%;
+ }
+
+ .col-md-9 {
+ width: 75%;
+ }
+
+ .col-md-10 {
+ width: 83.3333333333%;
+ }
+
+ .col-md-11 {
+ width: 91.6666666667%;
+ }
+
+ .col-md-12 {
+ width: 100%;
+ }
+
+ .col-md-pull-0 {
+ right: auto;
+ }
+
+ .col-md-pull-1 {
+ right: 8.3333333333%;
+ }
+
+ .col-md-pull-2 {
+ right: 16.6666666667%;
+ }
+
+ .col-md-pull-3 {
+ right: 25%;
+ }
+
+ .col-md-pull-4 {
+ right: 33.3333333333%;
+ }
+
+ .col-md-pull-5 {
+ right: 41.6666666667%;
+ }
+
+ .col-md-pull-6 {
+ right: 50%;
+ }
+
+ .col-md-pull-7 {
+ right: 58.3333333333%;
+ }
+
+ .col-md-pull-8 {
+ right: 66.6666666667%;
+ }
+
+ .col-md-pull-9 {
+ right: 75%;
+ }
+
+ .col-md-pull-10 {
+ right: 83.3333333333%;
+ }
+
+ .col-md-pull-11 {
+ right: 91.6666666667%;
+ }
+
+ .col-md-pull-12 {
+ right: 100%;
+ }
+
+ .col-md-push-0 {
+ left: auto;
+ }
+
+ .col-md-push-1 {
+ left: 8.3333333333%;
+ }
+
+ .col-md-push-2 {
+ left: 16.6666666667%;
+ }
+
+ .col-md-push-3 {
+ left: 25%;
+ }
+
+ .col-md-push-4 {
+ left: 33.3333333333%;
+ }
+
+ .col-md-push-5 {
+ left: 41.6666666667%;
+ }
+
+ .col-md-push-6 {
+ left: 50%;
+ }
+
+ .col-md-push-7 {
+ left: 58.3333333333%;
+ }
+
+ .col-md-push-8 {
+ left: 66.6666666667%;
+ }
+
+ .col-md-push-9 {
+ left: 75%;
+ }
+
+ .col-md-push-10 {
+ left: 83.3333333333%;
+ }
+
+ .col-md-push-11 {
+ left: 91.6666666667%;
+ }
+
+ .col-md-push-12 {
+ left: 100%;
+ }
+
+ .col-md-offset-0 {
+ margin-left: 0%;
+ }
+
+ .col-md-offset-1 {
+ margin-left: 8.3333333333%;
+ }
+
+ .col-md-offset-2 {
+ margin-left: 16.6666666667%;
+ }
+
+ .col-md-offset-3 {
+ margin-left: 25%;
+ }
+
+ .col-md-offset-4 {
+ margin-left: 33.3333333333%;
+ }
+
+ .col-md-offset-5 {
+ margin-left: 41.6666666667%;
+ }
+
+ .col-md-offset-6 {
+ margin-left: 50%;
+ }
+
+ .col-md-offset-7 {
+ margin-left: 58.3333333333%;
+ }
+
+ .col-md-offset-8 {
+ margin-left: 66.6666666667%;
+ }
+
+ .col-md-offset-9 {
+ margin-left: 75%;
+ }
+
+ .col-md-offset-10 {
+ margin-left: 83.3333333333%;
+ }
+
+ .col-md-offset-11 {
+ margin-left: 91.6666666667%;
+ }
+
+ .col-md-offset-12 {
+ margin-left: 100%;
+ }
+}
+@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-1 {
+ width: 8.3333333333%;
+ }
+
+ .col-lg-2 {
+ width: 16.6666666667%;
+ }
+
+ .col-lg-3 {
+ width: 25%;
+ }
+
+ .col-lg-4 {
+ width: 33.3333333333%;
+ }
+
+ .col-lg-5 {
+ width: 41.6666666667%;
+ }
+
+ .col-lg-6 {
+ width: 50%;
+ }
+
+ .col-lg-7 {
+ width: 58.3333333333%;
+ }
+
+ .col-lg-8 {
+ width: 66.6666666667%;
+ }
+
+ .col-lg-9 {
+ width: 75%;
+ }
+
+ .col-lg-10 {
+ width: 83.3333333333%;
+ }
+
+ .col-lg-11 {
+ width: 91.6666666667%;
+ }
+
+ .col-lg-12 {
+ width: 100%;
+ }
+
+ .col-lg-pull-0 {
+ right: auto;
+ }
+
+ .col-lg-pull-1 {
+ right: 8.3333333333%;
+ }
+
+ .col-lg-pull-2 {
+ right: 16.6666666667%;
+ }
+
+ .col-lg-pull-3 {
+ right: 25%;
+ }
+
+ .col-lg-pull-4 {
+ right: 33.3333333333%;
+ }
+
+ .col-lg-pull-5 {
+ right: 41.6666666667%;
+ }
+
+ .col-lg-pull-6 {
+ right: 50%;
+ }
+
+ .col-lg-pull-7 {
+ right: 58.3333333333%;
+ }
+
+ .col-lg-pull-8 {
+ right: 66.6666666667%;
+ }
+
+ .col-lg-pull-9 {
+ right: 75%;
+ }
+
+ .col-lg-pull-10 {
+ right: 83.3333333333%;
+ }
+
+ .col-lg-pull-11 {
+ right: 91.6666666667%;
+ }
+
+ .col-lg-pull-12 {
+ right: 100%;
+ }
+
+ .col-lg-push-0 {
+ left: auto;
+ }
+
+ .col-lg-push-1 {
+ left: 8.3333333333%;
+ }
+
+ .col-lg-push-2 {
+ left: 16.6666666667%;
+ }
+
+ .col-lg-push-3 {
+ left: 25%;
+ }
+
+ .col-lg-push-4 {
+ left: 33.3333333333%;
+ }
+
+ .col-lg-push-5 {
+ left: 41.6666666667%;
+ }
+
+ .col-lg-push-6 {
+ left: 50%;
+ }
+
+ .col-lg-push-7 {
+ left: 58.3333333333%;
+ }
+
+ .col-lg-push-8 {
+ left: 66.6666666667%;
+ }
+
+ .col-lg-push-9 {
+ left: 75%;
+ }
+
+ .col-lg-push-10 {
+ left: 83.3333333333%;
+ }
+
+ .col-lg-push-11 {
+ left: 91.6666666667%;
+ }
+
+ .col-lg-push-12 {
+ left: 100%;
+ }
+
+ .col-lg-offset-0 {
+ margin-left: 0%;
+ }
+
+ .col-lg-offset-1 {
+ margin-left: 8.3333333333%;
+ }
+
+ .col-lg-offset-2 {
+ margin-left: 16.6666666667%;
+ }
+
+ .col-lg-offset-3 {
+ margin-left: 25%;
+ }
+
+ .col-lg-offset-4 {
+ margin-left: 33.3333333333%;
+ }
+
+ .col-lg-offset-5 {
+ margin-left: 41.6666666667%;
+ }
+
+ .col-lg-offset-6 {
+ margin-left: 50%;
+ }
+
+ .col-lg-offset-7 {
+ margin-left: 58.3333333333%;
+ }
+
+ .col-lg-offset-8 {
+ margin-left: 66.6666666667%;
+ }
+
+ .col-lg-offset-9 {
+ margin-left: 75%;
+ }
+
+ .col-lg-offset-10 {
+ margin-left: 83.3333333333%;
+ }
+
+ .col-lg-offset-11 {
+ margin-left: 91.6666666667%;
+ }
+
+ .col-lg-offset-12 {
+ margin-left: 100%;
+ }
+}
+table {
+ background-color: transparent;
+}
+
+th {
+ text-align: left;
+}
+
+.table {
+ width: 100%;
+ max-width: 100%;
+ margin-bottom: 20px;
+}
+.table > thead > tr > th,
+.table > thead > tr > td,
+.table > tbody > tr > th,
+.table > tbody > tr > td,
+.table > tfoot > tr > th,
+.table > tfoot > tr > td {
+ padding: 8px;
+ line-height: 1.428571429;
+ vertical-align: top;
+ border-top: 1px solid #ddd;
+}
+.table > thead > tr > th {
+ vertical-align: bottom;
+ border-bottom: 2px solid #ddd;
+}
+.table > caption + thead > tr:first-child > th,
+.table > caption + thead > tr:first-child > td,
+.table > colgroup + thead > tr:first-child > th,
+.table > colgroup + thead > tr:first-child > td,
+.table > thead:first-child > tr:first-child > th,
+.table > thead:first-child > tr:first-child > td {
+ border-top: 0;
+}
+.table > tbody + tbody {
+ border-top: 2px solid #ddd;
+}
+.table .table {
+ background-color: #fff;
+}
+
+.table-condensed > thead > tr > th,
+.table-condensed > thead > tr > td,
+.table-condensed > tbody > tr > th,
+.table-condensed > tbody > tr > td,
+.table-condensed > tfoot > tr > th,
+.table-condensed > tfoot > tr > td {
+ padding: 5px;
+}
+
+.table-bordered {
+ border: 1px solid #ddd;
+}
+.table-bordered > thead > tr > th,
+.table-bordered > thead > tr > td,
+.table-bordered > tbody > tr > th,
+.table-bordered > tbody > tr > td,
+.table-bordered > tfoot > tr > th,
+.table-bordered > tfoot > tr > td {
+ border: 1px solid #ddd;
+}
+.table-bordered > thead > tr > th,
+.table-bordered > thead > tr > td {
+ border-bottom-width: 2px;
+}
+
+.table-striped > tbody > tr:nth-child(odd) > td,
+.table-striped > tbody > tr:nth-child(odd) > th {
+ background-color: #f9f9f9;
+}
+
+.table-hover > tbody > tr:hover > td,
+.table-hover > tbody > tr:hover > th {
+ background-color: #f5f5f5;
+}
+
+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 > thead > tr > th.active, .table > thead > tr.active > td, .table > thead > tr.active > th,
+.table > tbody > tr > td.active,
+.table > tbody > tr > th.active,
+.table > tbody > tr.active > td,
+.table > tbody > tr.active > th,
+.table > tfoot > tr > td.active,
+.table > tfoot > tr > th.active,
+.table > tfoot > tr.active > td,
+.table > tfoot > tr.active > th {
+ background-color: #f5f5f5;
+}
+
+.table-hover > tbody > tr > td.active:hover,
+.table-hover > tbody > tr > th.active:hover, .table-hover > tbody > tr.active:hover > td, .table-hover > tbody > tr:hover > .active, .table-hover > tbody > tr.active:hover > th {
+ background-color: #e8e8e8;
+}
+
+.table > thead > tr > td.success,
+.table > thead > tr > th.success, .table > thead > tr.success > td, .table > thead > tr.success > th,
+.table > tbody > tr > td.success,
+.table > tbody > tr > th.success,
+.table > tbody > tr.success > td,
+.table > tbody > tr.success > th,
+.table > tfoot > tr > td.success,
+.table > tfoot > tr > th.success,
+.table > tfoot > tr.success > td,
+.table > tfoot > tr.success > th {
+ background-color: #dff0d8;
+}
+
+.table-hover > tbody > tr > td.success:hover,
+.table-hover > tbody > tr > th.success:hover, .table-hover > tbody > tr.success:hover > td, .table-hover > tbody > tr:hover > .success, .table-hover > tbody > tr.success:hover > th {
+ background-color: #d0e9c6;
+}
+
+.table > thead > tr > td.info,
+.table > thead > tr > th.info, .table > thead > tr.info > td, .table > thead > tr.info > th,
+.table > tbody > tr > td.info,
+.table > tbody > tr > th.info,
+.table > tbody > tr.info > td,
+.table > tbody > tr.info > th,
+.table > tfoot > tr > td.info,
+.table > tfoot > tr > th.info,
+.table > tfoot > tr.info > td,
+.table > tfoot > tr.info > th {
+ background-color: #d9edf7;
+}
+
+.table-hover > tbody > tr > td.info:hover,
+.table-hover > tbody > tr > th.info:hover, .table-hover > tbody > tr.info:hover > td, .table-hover > tbody > tr:hover > .info, .table-hover > tbody > tr.info:hover > th {
+ background-color: #c4e3f3;
+}
+
+.table > thead > tr > td.warning,
+.table > thead > tr > th.warning, .table > thead > tr.warning > td, .table > thead > tr.warning > th,
+.table > tbody > tr > td.warning,
+.table > tbody > tr > th.warning,
+.table > tbody > tr.warning > td,
+.table > tbody > tr.warning > th,
+.table > tfoot > tr > td.warning,
+.table > tfoot > tr > th.warning,
+.table > tfoot > tr.warning > td,
+.table > tfoot > tr.warning > th {
+ background-color: #fcf8e3;
+}
+
+.table-hover > tbody > tr > td.warning:hover,
+.table-hover > tbody > tr > th.warning:hover, .table-hover > tbody > tr.warning:hover > td, .table-hover > tbody > tr:hover > .warning, .table-hover > tbody > tr.warning:hover > th {
+ background-color: #faf2cc;
+}
+
+.table > thead > tr > td.danger,
+.table > thead > tr > th.danger, .table > thead > tr.danger > td, .table > thead > tr.danger > th,
+.table > tbody > tr > td.danger,
+.table > tbody > tr > th.danger,
+.table > tbody > tr.danger > td,
+.table > tbody > tr.danger > th,
+.table > tfoot > tr > td.danger,
+.table > tfoot > tr > th.danger,
+.table > tfoot > tr.danger > td,
+.table > tfoot > tr.danger > th {
+ background-color: #f2dede;
+}
+
+.table-hover > tbody > tr > td.danger:hover,
+.table-hover > tbody > tr > th.danger:hover, .table-hover > tbody > tr.danger:hover > td, .table-hover > tbody > tr:hover > .danger, .table-hover > tbody > tr.danger:hover > th {
+ background-color: #ebcccc;
+}
+
+@media screen and (max-width: 767px) {
+ .table-responsive {
+ width: 100%;
+ margin-bottom: 15px;
+ overflow-y: hidden;
+ overflow-x: auto;
+ -ms-overflow-style: -ms-autohiding-scrollbar;
+ border: 1px solid #ddd;
+ -webkit-overflow-scrolling: touch;
+ }
+ .table-responsive > .table {
+ margin-bottom: 0;
+ }
+ .table-responsive > .table > thead > tr > th,
+ .table-responsive > .table > thead > tr > td,
+ .table-responsive > .table > tbody > tr > th,
+ .table-responsive > .table > tbody > tr > td,
+ .table-responsive > .table > tfoot > tr > th,
+ .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 > thead > tr > td:first-child,
+ .table-responsive > .table-bordered > tbody > tr > th:first-child,
+ .table-responsive > .table-bordered > tbody > tr > td:first-child,
+ .table-responsive > .table-bordered > tfoot > tr > th: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 > thead > tr > td:last-child,
+ .table-responsive > .table-bordered > tbody > tr > th:last-child,
+ .table-responsive > .table-bordered > tbody > tr > td:last-child,
+ .table-responsive > .table-bordered > tfoot > tr > th: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 > tbody > tr:last-child > td,
+ .table-responsive > .table-bordered > tfoot > tr:last-child > th,
+ .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: 20px;
+ font-size: 21px;
+ line-height: inherit;
+ color: #333333;
+ border: 0;
+ border-bottom: 1px solid #e5e5e5;
+}
+
+label {
+ display: inline-block;
+ max-width: 100%;
+ margin-bottom: 5px;
+ font-weight: bold;
+}
+
+input[type="search"] {
+ -webkit-box-sizing: border-box;
+ -moz-box-sizing: border-box;
+ box-sizing: border-box;
+}
+
+input[type="radio"],
+input[type="checkbox"] {
+ margin: 4px 0 0;
+ margin-top: 1px \9;
+ line-height: normal;
+}
+
+input[type="file"] {
+ display: block;
+}
+
+input[type="range"] {
+ display: block;
+ width: 100%;
+}
+
+select[multiple],
+select[size] {
+ height: auto;
+}
+
+input[type="file"]:focus,
+input[type="radio"]:focus,
+input[type="checkbox"]:focus {
+ outline: thin dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px;
+}
+
+output {
+ display: block;
+ padding-top: 7px;
+ font-size: 14px;
+ line-height: 1.428571429;
+ color: #555555;
+}
+
+.form-control {
+ display: block;
+ width: 100%;
+ height: 34px;
+ padding: 6px 12px;
+ font-size: 14px;
+ line-height: 1.428571429;
+ color: #555555;
+ background-color: #fff;
+ background-image: none;
+ border: 1px solid #ccc;
+ 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 0.15s, box-shadow ease-in-out 0.15s;
+ -o-transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
+ transition: border-color ease-in-out 0.15s, box-shadow ease-in-out 0.15s;
+}
+.form-control:focus {
+ border-color: #66afe9;
+ outline: 0;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(102, 175, 233, 0.6);
+}
+.form-control::-moz-placeholder {
+ color: #777777;
+ opacity: 1;
+}
+.form-control:-ms-input-placeholder {
+ color: #777777;
+}
+.form-control::-webkit-input-placeholder {
+ color: #777777;
+}
+.form-control[disabled], .form-control[readonly], fieldset[disabled] .form-control {
+ cursor: not-allowed;
+ background-color: #eeeeee;
+ opacity: 1;
+}
+
+textarea.form-control {
+ height: auto;
+}
+
+input[type="search"] {
+ -webkit-appearance: none;
+}
+
+input[type="date"],
+input[type="time"],
+input[type="datetime-local"],
+input[type="month"] {
+ line-height: 34px;
+ line-height: 1.428571429 \0;
+}
+input[type="date"].input-sm, .form-horizontal .form-group-sm input[type="date"].form-control, .input-group-sm > input[type="date"].form-control,
+.input-group-sm > input[type="date"].input-group-addon,
+.input-group-sm > .input-group-btn > input[type="date"].btn,
+input[type="time"].input-sm,
+.form-horizontal .form-group-sm input[type="time"].form-control,
+.input-group-sm > input[type="time"].form-control,
+.input-group-sm > input[type="time"].input-group-addon,
+.input-group-sm > .input-group-btn > input[type="time"].btn,
+input[type="datetime-local"].input-sm,
+.form-horizontal .form-group-sm input[type="datetime-local"].form-control,
+.input-group-sm > input[type="datetime-local"].form-control,
+.input-group-sm > input[type="datetime-local"].input-group-addon,
+.input-group-sm > .input-group-btn > input[type="datetime-local"].btn,
+input[type="month"].input-sm,
+.form-horizontal .form-group-sm input[type="month"].form-control,
+.input-group-sm > input[type="month"].form-control,
+.input-group-sm > input[type="month"].input-group-addon,
+.input-group-sm > .input-group-btn > input[type="month"].btn {
+ line-height: 30px;
+}
+input[type="date"].input-lg, .form-horizontal .form-group-lg input[type="date"].form-control, .input-group-lg > input[type="date"].form-control,
+.input-group-lg > input[type="date"].input-group-addon,
+.input-group-lg > .input-group-btn > input[type="date"].btn,
+input[type="time"].input-lg,
+.form-horizontal .form-group-lg input[type="time"].form-control,
+.input-group-lg > input[type="time"].form-control,
+.input-group-lg > input[type="time"].input-group-addon,
+.input-group-lg > .input-group-btn > input[type="time"].btn,
+input[type="datetime-local"].input-lg,
+.form-horizontal .form-group-lg input[type="datetime-local"].form-control,
+.input-group-lg > input[type="datetime-local"].form-control,
+.input-group-lg > input[type="datetime-local"].input-group-addon,
+.input-group-lg > .input-group-btn > input[type="datetime-local"].btn,
+input[type="month"].input-lg,
+.form-horizontal .form-group-lg input[type="month"].form-control,
+.input-group-lg > input[type="month"].form-control,
+.input-group-lg > input[type="month"].input-group-addon,
+.input-group-lg > .input-group-btn > input[type="month"].btn {
+ line-height: 46px;
+}
+
+.form-group {
+ margin-bottom: 15px;
+}
+
+.radio,
+.checkbox {
+ position: relative;
+ display: block;
+ min-height: 20px;
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+.radio label,
+.checkbox label {
+ 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 {
+ 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="radio"].disabled, fieldset[disabled] input[type="radio"],
+input[type="checkbox"][disabled],
+input[type="checkbox"].disabled, fieldset[disabled]
+input[type="checkbox"] {
+ cursor: not-allowed;
+}
+
+.radio-inline.disabled, fieldset[disabled] .radio-inline,
+.checkbox-inline.disabled, fieldset[disabled]
+.checkbox-inline {
+ cursor: not-allowed;
+}
+
+.radio.disabled label, fieldset[disabled] .radio label,
+.checkbox.disabled label, fieldset[disabled]
+.checkbox label {
+ cursor: not-allowed;
+}
+
+.form-control-static {
+ padding-top: 7px;
+ padding-bottom: 7px;
+ margin-bottom: 0;
+}
+.form-control-static.input-lg, .form-horizontal .form-group-lg .form-control-static.form-control, .input-group-lg > .form-control-static.form-control,
+.input-group-lg > .form-control-static.input-group-addon,
+.input-group-lg > .input-group-btn > .form-control-static.btn, .form-control-static.input-sm, .form-horizontal .form-group-sm .form-control-static.form-control, .input-group-sm > .form-control-static.form-control,
+.input-group-sm > .form-control-static.input-group-addon,
+.input-group-sm > .input-group-btn > .form-control-static.btn {
+ padding-left: 0;
+ padding-right: 0;
+}
+
+.input-sm, .form-horizontal .form-group-sm .form-control, .input-group-sm > .form-control,
+.input-group-sm > .input-group-addon,
+.input-group-sm > .input-group-btn > .btn {
+ height: 30px;
+ padding: 5px 10px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px;
+}
+
+select.input-sm, .form-horizontal .form-group-sm select.form-control, .input-group-sm > select.form-control,
+.input-group-sm > select.input-group-addon,
+.input-group-sm > .input-group-btn > select.btn {
+ height: 30px;
+ line-height: 30px;
+}
+
+textarea.input-sm, .form-horizontal .form-group-sm textarea.form-control, .input-group-sm > textarea.form-control,
+.input-group-sm > textarea.input-group-addon,
+.input-group-sm > .input-group-btn > textarea.btn,
+select[multiple].input-sm,
+.form-horizontal .form-group-sm select[multiple].form-control,
+.input-group-sm > select[multiple].form-control,
+.input-group-sm > select[multiple].input-group-addon,
+.input-group-sm > .input-group-btn > select[multiple].btn {
+ height: auto;
+}
+
+.input-lg, .form-horizontal .form-group-lg .form-control, .input-group-lg > .form-control,
+.input-group-lg > .input-group-addon,
+.input-group-lg > .input-group-btn > .btn {
+ height: 46px;
+ padding: 10px 16px;
+ font-size: 18px;
+ line-height: 1.33;
+ border-radius: 6px;
+}
+
+select.input-lg, .form-horizontal .form-group-lg select.form-control, .input-group-lg > select.form-control,
+.input-group-lg > select.input-group-addon,
+.input-group-lg > .input-group-btn > select.btn {
+ height: 46px;
+ line-height: 46px;
+}
+
+textarea.input-lg, .form-horizontal .form-group-lg textarea.form-control, .input-group-lg > textarea.form-control,
+.input-group-lg > textarea.input-group-addon,
+.input-group-lg > .input-group-btn > textarea.btn,
+select[multiple].input-lg,
+.form-horizontal .form-group-lg select[multiple].form-control,
+.input-group-lg > select[multiple].form-control,
+.input-group-lg > select[multiple].input-group-addon,
+.input-group-lg > .input-group-btn > select[multiple].btn {
+ height: auto;
+}
+
+.has-feedback {
+ position: relative;
+}
+.has-feedback .form-control {
+ padding-right: 42.5px;
+}
+
+.form-control-feedback {
+ position: absolute;
+ top: 25px;
+ right: 0;
+ z-index: 2;
+ display: block;
+ width: 34px;
+ height: 34px;
+ line-height: 34px;
+ text-align: center;
+}
+
+.input-lg + .form-control-feedback, .form-horizontal .form-group-lg .form-control + .form-control-feedback, .input-group-lg > .form-control + .form-control-feedback,
+.input-group-lg > .input-group-addon + .form-control-feedback,
+.input-group-lg > .input-group-btn > .btn + .form-control-feedback {
+ width: 46px;
+ height: 46px;
+ line-height: 46px;
+}
+
+.input-sm + .form-control-feedback, .form-horizontal .form-group-sm .form-control + .form-control-feedback, .input-group-sm > .form-control + .form-control-feedback,
+.input-group-sm > .input-group-addon + .form-control-feedback,
+.input-group-sm > .input-group-btn > .btn + .form-control-feedback {
+ width: 30px;
+ height: 30px;
+ line-height: 30px;
+}
+
+.has-success .help-block,
+.has-success .control-label,
+.has-success .radio,
+.has-success .checkbox,
+.has-success .radio-inline,
+.has-success .checkbox-inline {
+ color: #3c763d;
+}
+.has-success .form-control {
+ border-color: #3c763d;
+ -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: #2b542c;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #67b168;
+}
+.has-success .input-group-addon {
+ color: #3c763d;
+ border-color: #3c763d;
+ background-color: #dff0d8;
+}
+.has-success .form-control-feedback {
+ color: #3c763d;
+}
+
+.has-warning .help-block,
+.has-warning .control-label,
+.has-warning .radio,
+.has-warning .checkbox,
+.has-warning .radio-inline,
+.has-warning .checkbox-inline {
+ color: #8a6d3b;
+}
+.has-warning .form-control {
+ border-color: #8a6d3b;
+ -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: #66512c;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #c0a16b;
+}
+.has-warning .input-group-addon {
+ color: #8a6d3b;
+ border-color: #8a6d3b;
+ background-color: #fcf8e3;
+}
+.has-warning .form-control-feedback {
+ color: #8a6d3b;
+}
+
+.has-error .help-block,
+.has-error .control-label,
+.has-error .radio,
+.has-error .checkbox,
+.has-error .radio-inline,
+.has-error .checkbox-inline {
+ color: #a94442;
+}
+.has-error .form-control {
+ border-color: #a94442;
+ -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: #843534;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #ce8483;
+}
+.has-error .input-group-addon {
+ color: #a94442;
+ border-color: #a94442;
+ background-color: #f2dede;
+}
+.has-error .form-control-feedback {
+ color: #a94442;
+}
+
+.has-feedback label.sr-only ~ .form-control-feedback {
+ top: 0;
+}
+
+.help-block {
+ display: block;
+ margin-top: 5px;
+ margin-bottom: 10px;
+ color: #737373;
+}
+
+@media (min-width: 768px) {
+ .form-inline .form-group, .navbar-form .form-group {
+ display: inline-block;
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .form-inline .form-control, .navbar-form .form-control {
+ display: inline-block;
+ width: auto;
+ vertical-align: middle;
+ }
+ .form-inline .input-group, .navbar-form .input-group {
+ display: inline-table;
+ vertical-align: middle;
+ }
+ .form-inline .input-group .input-group-addon, .navbar-form .input-group .input-group-addon,
+ .form-inline .input-group .input-group-btn,
+ .navbar-form .input-group .input-group-btn,
+ .form-inline .input-group .form-control,
+ .navbar-form .input-group .form-control {
+ width: auto;
+ }
+ .form-inline .input-group > .form-control, .navbar-form .input-group > .form-control {
+ width: 100%;
+ }
+ .form-inline .control-label, .navbar-form .control-label {
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .form-inline .radio, .navbar-form .radio,
+ .form-inline .checkbox,
+ .navbar-form .checkbox {
+ display: inline-block;
+ margin-top: 0;
+ margin-bottom: 0;
+ vertical-align: middle;
+ }
+ .form-inline .radio label, .navbar-form .radio label,
+ .form-inline .checkbox label,
+ .navbar-form .checkbox label {
+ padding-left: 0;
+ }
+ .form-inline .radio input[type="radio"], .navbar-form .radio input[type="radio"],
+ .form-inline .checkbox input[type="checkbox"],
+ .navbar-form .checkbox input[type="checkbox"] {
+ position: relative;
+ margin-left: 0;
+ }
+ .form-inline .has-feedback .form-control-feedback, .navbar-form .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: 7px;
+}
+.form-horizontal .radio,
+.form-horizontal .checkbox {
+ min-height: 27px;
+}
+.form-horizontal .form-group {
+ margin-left: -15px;
+ margin-right: -15px;
+}
+.form-horizontal .form-group:before, .form-horizontal .form-group:after {
+ content: " ";
+ display: table;
+}
+.form-horizontal .form-group:after {
+ clear: both;
+}
+@media (min-width: 768px) {
+ .form-horizontal .control-label {
+ text-align: right;
+ margin-bottom: 0;
+ padding-top: 7px;
+ }
+}
+.form-horizontal .has-feedback .form-control-feedback {
+ top: 0;
+ right: 15px;
+}
+@media (min-width: 768px) {
+ .form-horizontal .form-group-lg .control-label {
+ padding-top: 14.3px;
+ }
+}
+@media (min-width: 768px) {
+ .form-horizontal .form-group-sm .control-label {
+ padding-top: 6px;
+ }
+}
+
+.btn {
+ display: inline-block;
+ margin-bottom: 0;
+ font-weight: normal;
+ text-align: center;
+ vertical-align: middle;
+ cursor: pointer;
+ background-image: none;
+ border: 1px solid transparent;
+ white-space: nowrap;
+ padding: 6px 12px;
+ font-size: 14px;
+ line-height: 1.428571429;
+ 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 {
+ outline: thin dotted;
+ outline: 5px auto -webkit-focus-ring-color;
+ outline-offset: -2px;
+}
+.btn:hover, .btn:focus {
+ color: #333;
+ 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;
+ pointer-events: none;
+ opacity: 0.65;
+ filter: alpha(opacity=65);
+ -webkit-box-shadow: none;
+ box-shadow: none;
+}
+
+.btn-default {
+ color: #333;
+ background-color: #fff;
+ border-color: #ccc;
+}
+.btn-default:hover, .btn-default:focus, .btn-default:active, .btn-default.active, .open > .btn-default.dropdown-toggle {
+ color: #333;
+ background-color: #e6e6e6;
+ border-color: #adadad;
+}
+.btn-default:active, .btn-default.active, .open > .btn-default.dropdown-toggle {
+ background-image: none;
+}
+.btn-default.disabled, .btn-default.disabled:hover, .btn-default.disabled:focus, .btn-default.disabled:active, .btn-default.disabled.active, .btn-default[disabled], .btn-default[disabled]:hover, .btn-default[disabled]:focus, .btn-default[disabled]:active, .btn-default[disabled].active, fieldset[disabled] .btn-default, fieldset[disabled] .btn-default:hover, fieldset[disabled] .btn-default:focus, fieldset[disabled] .btn-default:active, fieldset[disabled] .btn-default.active {
+ background-color: #fff;
+ border-color: #ccc;
+}
+.btn-default .badge {
+ color: #fff;
+ background-color: #333;
+}
+
+.btn-primary {
+ color: #fff;
+ background-color: #428bca;
+ border-color: #357ebd;
+}
+.btn-primary:hover, .btn-primary:focus, .btn-primary:active, .btn-primary.active, .open > .btn-primary.dropdown-toggle {
+ color: #fff;
+ background-color: #3071a9;
+ border-color: #285e8e;
+}
+.btn-primary:active, .btn-primary.active, .open > .btn-primary.dropdown-toggle {
+ background-image: none;
+}
+.btn-primary.disabled, .btn-primary.disabled:hover, .btn-primary.disabled:focus, .btn-primary.disabled:active, .btn-primary.disabled.active, .btn-primary[disabled], .btn-primary[disabled]:hover, .btn-primary[disabled]:focus, .btn-primary[disabled]:active, .btn-primary[disabled].active, fieldset[disabled] .btn-primary, fieldset[disabled] .btn-primary:hover, fieldset[disabled] .btn-primary:focus, fieldset[disabled] .btn-primary:active, fieldset[disabled] .btn-primary.active {
+ background-color: #428bca;
+ border-color: #357ebd;
+}
+.btn-primary .badge {
+ color: #428bca;
+ background-color: #fff;
+}
+
+.btn-success {
+ color: #fff;
+ background-color: #5cb85c;
+ border-color: #4cae4c;
+}
+.btn-success:hover, .btn-success:focus, .btn-success:active, .btn-success.active, .open > .btn-success.dropdown-toggle {
+ color: #fff;
+ background-color: #449d44;
+ border-color: #398439;
+}
+.btn-success:active, .btn-success.active, .open > .btn-success.dropdown-toggle {
+ background-image: none;
+}
+
+
+.btn-success.disabled, .btn-success.disabled:hover, .btn-success.disabled:focus, .btn-success.disabled:active, .btn-success.disabled.active, .btn-success[disabled], .btn-success[disabled]:hover, .btn-success[disabled]:focus, .btn-success[disabled]:active, .btn-success[disabled].active, fieldset[disabled] .btn-success, fieldset[disabled] .btn-success:hover, fieldset[disabled] .btn-success:focus, fieldset[disabled] .btn-success:active, fieldset[disabled] .btn-success.active {
+ background-color: #b82a4f;
+ border-color: #ae5437;
+}
+.btn-success .badge {
+ color: #5cb85c;
+ background-color: #fff;
+}
+
+.btn-info {
+ color: #fff;
+ background-color: #5bc0de;
+ border-color: #46b8da;
+}
+.btn-info:hover, .btn-info:focus, .btn-info:active, .btn-info.active, .open > .btn-info.dropdown-toggle {
+ color: #fff;
+ background-color: #31b0d5;
+ border-color: #269abc;
+}
+.btn-info:active, .btn-info.active, .open > .btn-info.dropdown-toggle {
+ background-image: none;
+}
+.btn-info.disabled, .btn-info.disabled:hover, .btn-info.disabled:focus, .btn-info.disabled:active, .btn-info.disabled.active, .btn-info[disabled], .btn-info[disabled]:hover, .btn-info[disabled]:focus, .btn-info[disabled]:active, .btn-info[disabled].active, fieldset[disabled] .btn-info, fieldset[disabled] .btn-info:hover, fieldset[disabled] .btn-info:focus, fieldset[disabled] .btn-info:active, fieldset[disabled] .btn-info.active {
+ background-color: #5bc0de;
+ border-color: #46b8da;
+}
+.btn-info .badge {
+ color: #5bc0de;
+ background-color: #fff;
+}
+
+.btn-warning {
+ color: #fff;
+ background-color: #f0ad4e;
+ border-color: #eea236;
+}
+.btn-warning:hover, .btn-warning:focus, .btn-warning:active, .btn-warning.active, .open > .btn-warning.dropdown-toggle {
+ color: #fff;
+ background-color: #ec971f;
+ border-color: #d58512;
+}
+.btn-warning:active, .btn-warning.active, .open > .btn-warning.dropdown-toggle {
+ background-image: none;
+}
+.btn-warning.disabled, .btn-warning.disabled:hover, .btn-warning.disabled:focus, .btn-warning.disabled:active, .btn-warning.disabled.active, .btn-warning[disabled], .btn-warning[disabled]:hover, .btn-warning[disabled]:focus, .btn-warning[disabled]:active, .btn-warning[disabled].active, fieldset[disabled] .btn-warning, fieldset[disabled] .btn-warning:hover, fieldset[disabled] .btn-warning:focus, fieldset[disabled] .btn-warning:active, fieldset[disabled] .btn-warning.active {
+ background-color: #f0ad4e;
+ border-color: #eea236;
+}
+.btn-warning .badge {
+ color: #f0ad4e;
+ background-color: #fff;
+}
+
+.btn-danger {
+ color: #fff;
+ background-color: #d9534f;
+ border-color: #d43f3a;
+}
+.btn-danger:hover, .btn-danger:focus, .btn-danger:active, .btn-danger.active, .open > .btn-danger.dropdown-toggle {
+ color: #fff;
+ background-color: #c9302c;
+ border-color: #ac2925;
+}
+.btn-danger:active, .btn-danger.active, .open > .btn-danger.dropdown-toggle {
+ background-image: none;
+}
+.btn-danger.disabled, .btn-danger.disabled:hover, .btn-danger.disabled:focus, .btn-danger.disabled:active, .btn-danger.disabled.active, .btn-danger[disabled], .btn-danger[disabled]:hover, .btn-danger[disabled]:focus, .btn-danger[disabled]:active, .btn-danger[disabled].active, fieldset[disabled] .btn-danger, fieldset[disabled] .btn-danger:hover, fieldset[disabled] .btn-danger:focus, fieldset[disabled] .btn-danger:active, fieldset[disabled] .btn-danger.active {
+ background-color: #d9534f;
+ border-color: #d43f3a;
+}
+.btn-danger .badge {
+ color: #d9534f;
+ background-color: #fff;
+}
+
+.btn-link {
+ color: #428bca;
+ font-weight: normal;
+ cursor: pointer;
+ border-radius: 0;
+}
+.btn-link, .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: #2a6496;
+ text-decoration: underline;
+ background-color: transparent;
+}
+.btn-link[disabled]:hover, .btn-link[disabled]:focus, fieldset[disabled] .btn-link:hover, fieldset[disabled] .btn-link:focus {
+ color: #777777;
+ text-decoration: none;
+}
+
+.btn-lg, .btn-group-lg > .btn {
+ padding: 10px 16px;
+ font-size: 18px;
+ line-height: 1.33;
+ border-radius: 6px;
+}
+
+.btn-sm, .btn-group-sm > .btn {
+ padding: 5px 10px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px;
+}
+
+.btn-xs, .btn-group-xs > .btn {
+ padding: 1px 5px;
+ font-size: 12px;
+ line-height: 1.5;
+ border-radius: 3px;
+}
+
+.btn-block {
+ display: block;
+ width: 100%;
+}
+
+.btn-block + .btn-block {
+ margin-top: 5px;
+}
+
+input[type="submit"].btn-block,
+input[type="reset"].btn-block,
+input[type="button"].btn-block {
+ width: 100%;
+}
+
+.fade {
+ opacity: 0;
+ -webkit-transition: opacity 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: height 0.35s ease;
+ -o-transition: height 0.35s ease;
+ transition: height 0.35s ease;
+}
+
+.caret {
+ display: inline-block;
+ width: 0;
+ height: 0;
+ margin-left: 2px;
+ vertical-align: middle;
+ border-top: 4px solid;
+ border-right: 4px solid transparent;
+ border-left: 4px solid transparent;
+}
+
+.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: 14px;
+ text-align: left;
+ background-color: #fff;
+ border: 1px solid #ccc;
+ 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);
+ background-clip: padding-box;
+}
+.dropdown-menu.pull-right {
+ right: 0;
+ left: auto;
+}
+.dropdown-menu .divider {
+ height: 1px;
+ margin: 9px 0;
+ overflow: hidden;
+ background-color: #e5e5e5;
+}
+.dropdown-menu > li > a {
+ display: block;
+ padding: 3px 20px;
+ clear: both;
+ font-weight: normal;
+ line-height: 1.428571429;
+ color: #333333;
+ white-space: nowrap;
+}
+
+.dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus {
+ text-decoration: none;
+ color: #262626;
+ background-color: #f5f5f5;
+}
+
+.dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus {
+ color: #fff;
+ text-decoration: none;
+ outline: 0;
+ background-color: #428bca;
+}
+
+.dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus {
+ color: #777777;
+}
+
+.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: 12px;
+ line-height: 1.428571429;
+ color: #777777;
+ 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 solid;
+ content: "";
+}
+.dropup .dropdown-menu,
+.navbar-fixed-bottom .dropdown .dropdown-menu {
+ top: auto;
+ bottom: 100%;
+ margin-bottom: 1px;
+}
+
+@media (min-width: 768px) {
+ .navbar-right .dropdown-menu {
+ right: 0;
+ left: auto;
+ }
+ .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 > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active,
+.btn-group-vertical > .btn:hover,
+.btn-group-vertical > .btn:focus,
+.btn-group-vertical > .btn:active,
+.btn-group-vertical > .btn.active {
+ z-index: 2;
+}
+.btn-group > .btn:focus,
+.btn-group-vertical > .btn:focus {
+ outline: 0;
+}
+
+.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:before, .btn-toolbar:after {
+ content: " ";
+ display: table;
+}
+.btn-toolbar:after {
+ clear: both;
+}
+.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 > .btn:last-child,
+.btn-group > .btn-group:first-child > .dropdown-toggle {
+ border-bottom-right-radius: 0;
+ border-top-right-radius: 0;
+}
+
+.btn-group > .btn-group:last-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, .btn-group-lg.btn-group > .btn + .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, .btn-group-lg > .btn .caret {
+ border-width: 5px 5px 0;
+ border-bottom-width: 0;
+}
+
+.dropup .btn-lg .caret, .dropup .btn-group-lg > .btn .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:before, .btn-group-vertical > .btn-group:after {
+ content: " ";
+ display: table;
+}
+.btn-group-vertical > .btn-group:after {
+ clear: both;
+}
+.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-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+}
+.btn-group-vertical > .btn:last-child:not(:first-child) {
+ border-bottom-left-radius: 4px;
+ border-top-right-radius: 0;
+ border-top-left-radius: 0;
+}
+
+.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 > input[type="checkbox"] {
+ position: absolute;
+ z-index: -1;
+ opacity: 0;
+ filter: alpha(opacity=0);
+}
+
+.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-addon,
+.input-group-btn,
+.input-group .form-control {
+ display: table-cell;
+}
+.input-group-addon:not(:first-child):not(:last-child),
+.input-group-btn:not(:first-child):not(:last-child),
+.input-group .form-control:not(:first-child):not(:last-child) {
+ border-radius: 0;
+}
+
+.input-group-addon,
+.input-group-btn {
+ width: 1%;
+ white-space: nowrap;
+ vertical-align: middle;
+}
+
+.input-group-addon {
+ padding: 6px 12px;
+ font-size: 14px;
+ font-weight: normal;
+ line-height: 1;
+ color: #555555;
+ text-align: center;
+ background-color: #eeeeee;
+ border: 1px solid #ccc;
+ border-radius: 4px;
+}
+.input-group-addon.input-sm, .form-horizontal .form-group-sm .input-group-addon.form-control,
+.input-group-sm > .input-group-addon,
+.input-group-sm > .input-group-btn > .input-group-addon.btn {
+ padding: 5px 10px;
+ font-size: 12px;
+ border-radius: 3px;
+}
+.input-group-addon.input-lg, .form-horizontal .form-group-lg .input-group-addon.form-control,
+.input-group-lg > .input-group-addon,
+.input-group-lg > .input-group-btn > .input-group-addon.btn {
+ padding: 10px 16px;
+ font-size: 18px;
+ border-radius: 6px;
+}
+.input-group-addon input[type="radio"],
+.input-group-addon input[type="checkbox"] {
+ margin-top: 0;
+}
+
+.input-group .form-control:first-child,
+.input-group-addon:first-child,
+.input-group-btn:first-child > .btn,
+.input-group-btn:first-child > .btn-group > .btn,
+.input-group-btn:first-child > .dropdown-toggle,
+.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),
+.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {
+ border-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 {
+ margin-left: -1px;
+}
+
+.nav {
+ margin-bottom: 0;
+ padding-left: 0;
+ list-style: none;
+}
+.nav:before, .nav:after {
+ content: " ";
+ display: table;
+}
+.nav:after {
+ clear: both;
+}
+.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: #eeeeee;
+}
+.nav > li.disabled > a {
+ color: #777777;
+}
+.nav > li.disabled > a:hover, .nav > li.disabled > a:focus {
+ color: #777777;
+ text-decoration: none;
+ background-color: transparent;
+ cursor: not-allowed;
+}
+.nav .open > a, .nav .open > a:hover, .nav .open > a:focus {
+ background-color: #eeeeee;
+ border-color: #428bca;
+}
+.nav .nav-divider {
+ height: 1px;
+ margin: 9px 0;
+ overflow: hidden;
+ background-color: #e5e5e5;
+}
+.nav > li > a > img {
+ max-width: none;
+}
+
+.nav-tabs {
+ border-bottom: 1px solid #ddd;
+}
+.nav-tabs > li {
+ float: left;
+ margin-bottom: -1px;
+}
+.nav-tabs > li > a {
+ margin-right: 2px;
+ line-height: 1.428571429;
+ border: 1px solid transparent;
+ border-radius: 4px 4px 0 0;
+}
+.nav-tabs > li > a:hover {
+ border-color: #eeeeee #eeeeee #ddd;
+}
+.nav-tabs > li.active > a, .nav-tabs > li.active > a:hover, .nav-tabs > li.active > a:focus {
+ color: #555555;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ border-bottom-color: transparent;
+ cursor: default;
+}
+
+.nav-pills > li {
+ float: left;
+}
+.nav-pills > li > a {
+ border-radius: 4px;
+}
+.nav-pills > li + li {
+ margin-left: 2px;
+}
+.nav-pills > li.active > a, .nav-pills > li.active > a:hover, .nav-pills > li.active > a:focus {
+ color: #fff;
+ background-color: #428bca;
+}
+
+.nav-stacked > li {
+ float: none;
+}
+.nav-stacked > li + li {
+ margin-top: 2px;
+ margin-left: 0;
+}
+
+.nav-justified, .nav-tabs.nav-justified {
+ width: 100%;
+}
+.nav-justified > li, .nav-tabs.nav-justified > li {
+ float: none;
+}
+.nav-justified > li > a, .nav-tabs.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, .nav-tabs.nav-justified > li {
+ display: table-cell;
+ width: 1%;
+ }
+ .nav-justified > li > a, .nav-tabs.nav-justified > li > a {
+ margin-bottom: 0;
+ }
+}
+
+.nav-tabs-justified, .nav-tabs.nav-justified {
+ border-bottom: 0;
+}
+.nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a {
+ margin-right: 0;
+ border-radius: 4px;
+}
+.nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a,
+.nav-tabs-justified > .active > a:hover,
+.nav-tabs.nav-justified > .active > a:hover,
+.nav-tabs-justified > .active > a:focus,
+.nav-tabs.nav-justified > .active > a:focus {
+ border: 1px solid #ddd;
+}
+@media (min-width: 768px) {
+ .nav-tabs-justified > li > a, .nav-tabs.nav-justified > li > a {
+ border-bottom: 1px solid #ddd;
+ border-radius: 4px 4px 0 0;
+ }
+ .nav-tabs-justified > .active > a, .nav-tabs.nav-justified > .active > a,
+ .nav-tabs-justified > .active > a:hover,
+ .nav-tabs.nav-justified > .active > a:hover,
+ .nav-tabs-justified > .active > a:focus,
+ .nav-tabs.nav-justified > .active > a:focus {
+ border-bottom-color: #fff;
+ }
+}
+
+.tab-content > .tab-pane {
+ display: none;
+}
+.tab-content > .active {
+ display: block;
+}
+
+.nav-tabs .dropdown-menu {
+ margin-top: -1px;
+ border-top-right-radius: 0;
+ border-top-left-radius: 0;
+}
+
+.navbar {
+ position: relative;
+ min-height: 50px;
+ margin-bottom: 20px;
+ border: 1px solid transparent;
+}
+.navbar:before, .navbar:after {
+ content: " ";
+ display: table;
+}
+.navbar:after {
+ clear: both;
+}
+@media (min-width: 768px) {
+ .navbar {
+ border-radius: 4px;
+ }
+}
+
+.navbar-header:before, .navbar-header:after {
+ content: " ";
+ display: table;
+}
+.navbar-header:after {
+ clear: both;
+}
+@media (min-width: 768px) {
+ .navbar-header {
+ float: left;
+ }
+}
+
+.navbar-collapse {
+ overflow-x: visible;
+ padding-right: 15px;
+ padding-left: 15px;
+ border-top: 1px solid transparent;
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1);
+ -webkit-overflow-scrolling: touch;
+}
+.navbar-collapse:before, .navbar-collapse:after {
+ content: " ";
+ display: table;
+}
+.navbar-collapse:after {
+ clear: both;
+}
+.navbar-collapse.in {
+ overflow-y: auto;
+}
+@media (min-width: 768px) {
+ .navbar-collapse {
+ width: auto;
+ border-top: 0;
+ 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-width: 480px) and (orientation: landscape) {
+ .navbar-fixed-top .navbar-collapse,
+ .navbar-fixed-bottom .navbar-collapse {
+ max-height: 200px;
+ }
+}
+
+.container > .navbar-header,
+.container > .navbar-collapse,
+.container-fluid > .navbar-header,
+.container-fluid > .navbar-collapse {
+ margin-right: -15px;
+ margin-left: -15px;
+}
+@media (min-width: 768px) {
+ .container > .navbar-header,
+ .container > .navbar-collapse,
+ .container-fluid > .navbar-header,
+ .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;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+}
+@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: 15px 15px;
+ font-size: 18px;
+ line-height: 20px;
+ height: 50px;
+}
+.navbar-brand:hover, .navbar-brand:focus {
+ text-decoration: none;
+}
+@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: 8px;
+ margin-bottom: 8px;
+ background-color: transparent;
+ background-image: none;
+ border: 1px solid transparent;
+ border-radius: 4px;
+}
+.navbar-toggle:focus {
+ outline: 0;
+}
+.navbar-toggle .icon-bar {
+ display: block;
+ width: 22px;
+ height: 2px;
+ border-radius: 1px;
+}
+.navbar-toggle .icon-bar + .icon-bar {
+ margin-top: 4px;
+}
+@media (min-width: 768px) {
+ .navbar-toggle {
+ display: none;
+ }
+}
+
+.navbar-nav {
+ margin: 7.5px -15px;
+}
+.navbar-nav > li > a {
+ padding-top: 10px;
+ padding-bottom: 10px;
+ line-height: 20px;
+}
+@media (max-width: 767px) {
+ .navbar-nav .open .dropdown-menu {
+ position: static;
+ float: none;
+ width: auto;
+ margin-top: 0;
+ background-color: transparent;
+ border: 0;
+ box-shadow: none;
+ }
+ .navbar-nav .open .dropdown-menu > li > a,
+ .navbar-nav .open .dropdown-menu .dropdown-header {
+ padding: 5px 15px 5px 25px;
+ }
+ .navbar-nav .open .dropdown-menu > li > a {
+ line-height: 20px;
+ }
+ .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-nav .open .dropdown-menu > li > a:focus {
+ background-image: none;
+ }
+}
+@media (min-width: 768px) {
+ .navbar-nav {
+ float: left;
+ margin: 0;
+ }
+ .navbar-nav > li {
+ float: left;
+ }
+ .navbar-nav > li > a {
+ padding-top: 15px;
+ padding-bottom: 15px;
+ }
+ .navbar-nav.navbar-right:last-child {
+ margin-right: -15px;
+ }
+}
+
+@media (min-width: 768px) {
+ .navbar-left {
+ float: left !important;
+ }
+
+ .navbar-right {
+ float: right !important;
+ }
+}
+.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: 8px;
+ margin-bottom: 8px;
+}
+@media (max-width: 767px) {
+ .navbar-form .form-group {
+ margin-bottom: 5px;
+ }
+}
+@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-form.navbar-right:last-child {
+ margin-right: -15px;
+ }
+}
+
+.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 {
+ border-bottom-right-radius: 0;
+ border-bottom-left-radius: 0;
+}
+
+.navbar-btn {
+ margin-top: 8px;
+ margin-bottom: 8px;
+}
+.navbar-btn.btn-sm, .btn-group-sm > .navbar-btn.btn {
+ margin-top: 10px;
+ margin-bottom: 10px;
+}
+.navbar-btn.btn-xs, .btn-group-xs > .navbar-btn.btn {
+ margin-top: 14px;
+ margin-bottom: 14px;
+}
+
+.navbar-text {
+ margin-top: 15px;
+ margin-bottom: 15px;
+}
+@media (min-width: 768px) {
+ .navbar-text {
+ float: left;
+ margin-left: 15px;
+ margin-right: 15px;
+ }
+ .navbar-text.navbar-right:last-child {
+ margin-right: 0;
+ }
+}
+
+.navbar-default {
+ background-color: #f8f8f8;
+ border-color: #e7e7e7;
+}
+.navbar-default .navbar-brand {
+ color: #777;
+}
+.navbar-default .navbar-brand:hover, .navbar-default .navbar-brand:focus {
+ color: #5e5e5e;
+ background-color: transparent;
+}
+.navbar-default .navbar-text {
+ color: #777;
+}
+.navbar-default .navbar-nav > li > a {
+ color: #777;
+}
+.navbar-default .navbar-nav > li > a:hover, .navbar-default .navbar-nav > li > a:focus {
+ color: #333;
+ background-color: transparent;
+}
+.navbar-default .navbar-nav > .active > a, .navbar-default .navbar-nav > .active > a:hover, .navbar-default .navbar-nav > .active > a:focus {
+ color: #555;
+ background-color: #e7e7e7;
+}
+.navbar-default .navbar-nav > .disabled > a, .navbar-default .navbar-nav > .disabled > a:hover, .navbar-default .navbar-nav > .disabled > a:focus {
+ color: #ccc;
+ background-color: transparent;
+}
+.navbar-default .navbar-toggle {
+ border-color: #ddd;
+}
+.navbar-default .navbar-toggle:hover, .navbar-default .navbar-toggle:focus {
+ background-color: #ddd;
+}
+.navbar-default .navbar-toggle .icon-bar {
+ background-color: #888;
+}
+.navbar-default .navbar-collapse,
+.navbar-default .navbar-form {
+ border-color: #e7e7e7;
+}
+.navbar-default .navbar-nav > .open > a, .navbar-default .navbar-nav > .open > a:hover, .navbar-default .navbar-nav > .open > a:focus {
+ background-color: #e7e7e7;
+ color: #555;
+}
+@media (max-width: 767px) {
+ .navbar-default .navbar-nav .open .dropdown-menu > li > a {
+ color: #777;
+ }
+ .navbar-default .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > li > a:focus {
+ color: #333;
+ background-color: transparent;
+ }
+ .navbar-default .navbar-nav .open .dropdown-menu > .active > a, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .active > a:focus {
+ color: #555;
+ background-color: #e7e7e7;
+ }
+ .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-default .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+ color: #ccc;
+ background-color: transparent;
+ }
+}
+.navbar-default .navbar-link {
+ color: #777;
+}
+.navbar-default .navbar-link:hover {
+ color: #333;
+}
+.navbar-default .btn-link {
+ color: #777;
+}
+.navbar-default .btn-link:hover, .navbar-default .btn-link:focus {
+ color: #333;
+}
+.navbar-default .btn-link[disabled]:hover, .navbar-default .btn-link[disabled]:focus, fieldset[disabled] .navbar-default .btn-link:hover, fieldset[disabled] .navbar-default .btn-link:focus {
+ color: #ccc;
+}
+
+.navbar-inverse {
+ background-color: #222;
+ border-color: #090909;
+}
+.navbar-inverse .navbar-brand {
+ color: #777777;
+}
+.navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus {
+ color: #fff;
+ background-color: transparent;
+}
+.navbar-inverse .navbar-text {
+ color: #777777;
+}
+.navbar-inverse .navbar-nav > li > a {
+ color: #777777;
+}
+.navbar-inverse .navbar-nav > li > a:hover, .navbar-inverse .navbar-nav > li > a:focus {
+ color: #fff;
+ background-color: transparent;
+}
+.navbar-inverse .navbar-nav > .active > a, .navbar-inverse .navbar-nav > .active > a:hover, .navbar-inverse .navbar-nav > .active > a:focus {
+ color: #fff;
+ background-color: #090909;
+}
+.navbar-inverse .navbar-nav > .disabled > a, .navbar-inverse .navbar-nav > .disabled > a:hover, .navbar-inverse .navbar-nav > .disabled > a:focus {
+ color: #444;
+ background-color: transparent;
+}
+.navbar-inverse .navbar-toggle {
+ border-color: #333;
+}
+.navbar-inverse .navbar-toggle:hover, .navbar-inverse .navbar-toggle:focus {
+ background-color: #333;
+}
+.navbar-inverse .navbar-toggle .icon-bar {
+ background-color: #fff;
+}
+.navbar-inverse .navbar-collapse,
+.navbar-inverse .navbar-form {
+ border-color: #101010;
+}
+.navbar-inverse .navbar-nav > .open > a, .navbar-inverse .navbar-nav > .open > a:hover, .navbar-inverse .navbar-nav > .open > a:focus {
+ background-color: #090909;
+ color: #fff;
+}
+@media (max-width: 767px) {
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {
+ border-color: #090909;
+ }
+ .navbar-inverse .navbar-nav .open .dropdown-menu .divider {
+ background-color: #090909;
+ }
+ .navbar-inverse .navbar-nav .open .dropdown-menu > li > a {
+ color: #777777;
+ }
+ .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > li > a:focus {
+ color: #fff;
+ background-color: transparent;
+ }
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .active > a:focus {
+ color: #fff;
+ background-color: #090909;
+ }
+ .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:hover, .navbar-inverse .navbar-nav .open .dropdown-menu > .disabled > a:focus {
+ color: #444;
+ background-color: transparent;
+ }
+}
+.navbar-inverse .navbar-link {
+ color: #777777;
+}
+.navbar-inverse .navbar-link:hover {
+ color: #fff;
+}
+.navbar-inverse .btn-link {
+ color: #777777;
+}
+.navbar-inverse .btn-link:hover, .navbar-inverse .btn-link:focus {
+ color: #fff;
+}
+.navbar-inverse .btn-link[disabled]:hover, .navbar-inverse .btn-link[disabled]:focus, fieldset[disabled] .navbar-inverse .btn-link:hover, fieldset[disabled] .navbar-inverse .btn-link:focus {
+ color: #444;
+}
+
+.breadcrumb {
+ padding: 8px 15px;
+ margin-bottom: 20px;
+ list-style: none;
+ background-color: #f5f5f5;
+ border-radius: 4px;
+}
+.breadcrumb > li {
+ display: inline-block;
+}
+.breadcrumb > li + li:before {
+ content: "/ ";
+ padding: 0 5px;
+ color: #ccc;
+}
+.breadcrumb > .active {
+ color: #777777;
+}
+
+.pagination {
+ display: inline-block;
+ padding-left: 0;
+ margin: 20px 0;
+ border-radius: 4px;
+}
+.pagination > li {
+ display: inline;
+}
+.pagination > li > a,
+.pagination > li > span {
+ position: relative;
+ float: left;
+ padding: 6px 12px;
+ line-height: 1.428571429;
+ text-decoration: none;
+ color: #428bca;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ 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 > a:focus,
+.pagination > li > span:hover,
+.pagination > li > span:focus {
+ color: #2a6496;
+ background-color: #eeeeee;
+ border-color: #ddd;
+}
+.pagination > .active > a, .pagination > .active > a:hover, .pagination > .active > a:focus,
+.pagination > .active > span,
+.pagination > .active > span:hover,
+.pagination > .active > span:focus {
+ z-index: 2;
+ color: #fff;
+ background-color: #428bca;
+ border-color: #428bca;
+ 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: #777777;
+ background-color: #fff;
+ border-color: #ddd;
+ cursor: not-allowed;
+}
+
+.pagination-lg > li > a,
+.pagination-lg > li > span {
+ padding: 10px 16px;
+ font-size: 18px;
+}
+.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: 5px 10px;
+ font-size: 12px;
+}
+.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: 20px 0;
+ list-style: none;
+ text-align: center;
+}
+.pager:before, .pager:after {
+ content: " ";
+ display: table;
+}
+.pager:after {
+ clear: both;
+}
+.pager li {
+ display: inline;
+}
+.pager li > a,
+.pager li > span {
+ display: inline-block;
+ padding: 5px 14px;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ border-radius: 15px;
+}
+.pager li > a:hover,
+.pager li > a:focus {
+ text-decoration: none;
+ background-color: #eeeeee;
+}
+.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: #777777;
+ background-color: #fff;
+ cursor: not-allowed;
+}
+
+.label {
+ display: inline;
+ padding: .2em .6em .3em;
+ font-size: 75%;
+ font-weight: bold;
+ line-height: 1;
+ color: #fff;
+ text-align: center;
+ white-space: nowrap;
+ vertical-align: baseline;
+ border-radius: .25em;
+}
+.label:empty {
+ display: none;
+}
+.btn .label {
+ position: relative;
+ top: -1px;
+}
+
+a.label:hover, a.label:focus {
+ color: #fff;
+ text-decoration: none;
+ cursor: pointer;
+}
+
+.label-default {
+ background-color: #777777;
+}
+.label-default[href]:hover, .label-default[href]:focus {
+ background-color: #5e5e5e;
+}
+
+.label-primary {
+ background-color: #428bca;
+}
+.label-primary[href]:hover, .label-primary[href]:focus {
+ background-color: #3071a9;
+}
+
+.label-success {
+ background-color: #5cb85c;
+}
+.label-success[href]:hover, .label-success[href]:focus {
+ background-color: #449d44;
+}
+
+.label-info {
+ background-color: #5bc0de;
+}
+.label-info[href]:hover, .label-info[href]:focus {
+ background-color: #31b0d5;
+}
+
+.label-warning {
+ background-color: #f0ad4e;
+}
+.label-warning[href]:hover, .label-warning[href]:focus {
+ background-color: #ec971f;
+}
+
+.label-danger {
+ background-color: #d9534f;
+}
+.label-danger[href]:hover, .label-danger[href]:focus {
+ background-color: #c9302c;
+}
+
+.badge {
+ display: inline-block;
+ min-width: 10px;
+ padding: 3px 7px;
+ font-size: 12px;
+ font-weight: bold;
+ color: #fff;
+ line-height: 1;
+ vertical-align: baseline;
+ white-space: nowrap;
+ text-align: center;
+ background-color: #777777;
+ 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.list-group-item.active > .badge, .nav-pills > .active > a > .badge {
+ color: #428bca;
+ background-color: #fff;
+}
+.nav-pills > li > a > .badge {
+ margin-left: 3px;
+}
+
+a.badge:hover, a.badge:focus {
+ color: #fff;
+ text-decoration: none;
+ cursor: pointer;
+}
+
+.jumbotron {
+ padding: 30px;
+ margin-bottom: 30px;
+ color: inherit;
+ background-color: #eeeeee;
+}
+.jumbotron h1,
+.jumbotron .h1 {
+ color: inherit;
+}
+.jumbotron p {
+ margin-bottom: 0px;
+ font-size: 21px;
+ font-weight: 200;
+}
+.jumbotron > hr {
+ border-top-color: #d5d5d5;
+}
+.container .jumbotron {
+ border-radius: 6px;
+}
+.jumbotron .container {
+ max-width: 100%;
+}
+@media screen and (min-width: 768px) {
+ .jumbotron {
+ padding-top: 48px;
+ padding-bottom: 48px;
+ }
+ .container .jumbotron {
+ padding-left: 60px;
+ padding-right: 60px;
+ }
+ .jumbotron h1,
+ .jumbotron .h1 {
+ font-size: 63px;
+ }
+}
+
+.thumbnail {
+ display: block;
+ padding: 4px;
+ margin-bottom: 20px;
+ line-height: 1.428571429;
+ background-color: #fff;
+ border: 1px solid #ddd;
+ border-radius: 4px;
+ -webkit-transition: all 0.2s ease-in-out;
+ -o-transition: all 0.2s ease-in-out;
+ transition: all 0.2s ease-in-out;
+}
+.thumbnail > img,
+.thumbnail a > img {
+ display: block;
+ width: 100% \9;
+ max-width: 100%;
+ height: auto;
+ margin-left: auto;
+ margin-right: auto;
+}
+.thumbnail .caption {
+ padding: 9px;
+ color: #333333;
+}
+
+a.thumbnail:hover,
+a.thumbnail:focus,
+a.thumbnail.active {
+ border-color: #428bca;
+}
+
+.alert {
+ padding: 15px;
+ margin-bottom: 20px;
+ border: 1px solid transparent;
+ border-radius: 4px;
+}
+.alert h4 {
+ margin-top: 0;
+ color: inherit;
+}
+.alert .alert-link {
+ font-weight: bold;
+}
+.alert > p,
+.alert > ul {
+ margin-bottom: 0;
+}
+.alert > p + p {
+ margin-top: 5px;
+}
+
+.alert-dismissable,
+.alert-dismissible {
+ padding-right: 35px;
+}
+.alert-dismissable .close,
+.alert-dismissible .close {
+ position: relative;
+ top: -2px;
+ right: -21px;
+ color: inherit;
+}
+
+.alert-success {
+ background-color: #dff0d8;
+ border-color: #d6e9c6;
+ color: #3c763d;
+}
+.alert-success hr {
+ border-top-color: #c9e2b3;
+}
+.alert-success .alert-link {
+ color: #2b542c;
+}
+
+.alert-info {
+ background-color: #d9edf7;
+ border-color: #bce8f1;
+ color: #31708f;
+}
+.alert-info hr {
+ border-top-color: #a6e1ec;
+}
+.alert-info .alert-link {
+ color: #245269;
+}
+
+.alert-warning {
+ background-color: #fcf8e3;
+ border-color: #faebcc;
+ color: #8a6d3b;
+}
+.alert-warning hr {
+ border-top-color: #f7e1b5;
+}
+.alert-warning .alert-link {
+ color: #66512c;
+}
+
+.alert-danger {
+ background-color: #f2dede;
+ border-color: #ebccd1;
+ color: #a94442;
+}
+.alert-danger hr {
+ border-top-color: #e4b9c0;
+}
+.alert-danger .alert-link {
+ color: #843534;
+}
+
+@-webkit-keyframes progress-bar-stripes {
+ from {
+ background-position: 40px 0;
+ }
+ to {
+ background-position: 0 0;
+ }
+}
+@keyframes progress-bar-stripes {
+ from {
+ background-position: 40px 0;
+ }
+ to {
+ background-position: 0 0;
+ }
+}
+.progress {
+ overflow: hidden;
+ height: 20px;
+ margin-bottom: 20px;
+ background-color: #f5f5f5;
+ 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: 12px;
+ line-height: 20px;
+ color: #fff;
+ text-align: center;
+ background-color: #428bca;
+ -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%, rgba(0, 0, 0, 0) 25%, rgba(0, 0, 0, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(0, 0, 0, 0) 75%, rgba(0, 0, 0, 0));
+ 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[aria-valuenow="1"], .progress-bar[aria-valuenow="2"] {
+ min-width: 30px;
+}
+.progress-bar[aria-valuenow="0"] {
+ color: #777777;
+ min-width: 30px;
+ background-color: transparent;
+ background-image: none;
+ box-shadow: none;
+}
+
+.progress-bar-success {
+ background-color: #5cb85c;
+}
+.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%, rgba(0, 0, 0, 0) 25%, rgba(0, 0, 0, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(0, 0, 0, 0) 75%, rgba(0, 0, 0, 0));
+}
+
+.progress-bar-info {
+ background-color: #5bc0de;
+}
+.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%, rgba(0, 0, 0, 0) 25%, rgba(0, 0, 0, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(0, 0, 0, 0) 75%, rgba(0, 0, 0, 0));
+}
+
+.progress-bar-warning {
+ background-color: #f0ad4e;
+}
+.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%, rgba(0, 0, 0, 0) 25%, rgba(0, 0, 0, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(0, 0, 0, 0) 75%, rgba(0, 0, 0, 0));
+}
+
+.progress-bar-danger {
+ background-color: #d9534f;
+}
+.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%, rgba(0, 0, 0, 0) 25%, rgba(0, 0, 0, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(0, 0, 0, 0) 75%, rgba(0, 0, 0, 0));
+}
+
+.media,
+.media-body {
+ overflow: hidden;
+ zoom: 1;
+}
+
+.media,
+.media .media {
+ margin-top: 15px;
+}
+
+.media:first-child {
+ margin-top: 0;
+}
+
+.media-object {
+ display: block;
+}
+
+.media-heading {
+ margin: 0 0 5px;
+}
+
+.media > .pull-left {
+ margin-right: 10px;
+}
+.media > .pull-right {
+ margin-left: 10px;
+}
+
+.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: #fff;
+ border: 1px solid #ddd;
+}
+.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;
+}
+.list-group-item > .badge {
+ float: right;
+}
+.list-group-item > .badge + .badge {
+ margin-right: 5px;
+}
+
+a.list-group-item {
+ color: #555;
+}
+a.list-group-item .list-group-item-heading {
+ color: #333;
+}
+a.list-group-item:hover, a.list-group-item:focus {
+ text-decoration: none;
+ color: #555;
+ background-color: #f5f5f5;
+}
+
+.list-group-item.disabled, .list-group-item.disabled:hover, .list-group-item.disabled:focus {
+ background-color: #eeeeee;
+ color: #777777;
+}
+.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: #777777;
+}
+.list-group-item.active, .list-group-item.active:hover, .list-group-item.active:focus {
+ z-index: 2;
+ color: #fff;
+ background-color: #428bca;
+ border-color: #428bca;
+}
+.list-group-item.active .list-group-item-heading,
+.list-group-item.active .list-group-item-heading > small,
+.list-group-item.active .list-group-item-heading > .small, .list-group-item.active:hover .list-group-item-heading,
+.list-group-item.active:hover .list-group-item-heading > small,
+.list-group-item.active:hover .list-group-item-heading > .small, .list-group-item.active:focus .list-group-item-heading,
+.list-group-item.active:focus .list-group-item-heading > small,
+.list-group-item.active:focus .list-group-item-heading > .small {
+ 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: #e1edf7;
+}
+
+.list-group-item-success {
+ color: #3c763d;
+ background-color: #dff0d8;
+}
+
+a.list-group-item-success {
+ color: #3c763d;
+}
+a.list-group-item-success .list-group-item-heading {
+ color: inherit;
+}
+a.list-group-item-success:hover, a.list-group-item-success:focus {
+ color: #3c763d;
+ background-color: #d0e9c6;
+}
+a.list-group-item-success.active, a.list-group-item-success.active:hover, a.list-group-item-success.active:focus {
+ color: #fff;
+ background-color: #3c763d;
+ border-color: #3c763d;
+}
+
+.list-group-item-info {
+ color: #31708f;
+ background-color: #d9edf7;
+}
+
+a.list-group-item-info {
+ color: #31708f;
+}
+a.list-group-item-info .list-group-item-heading {
+ color: inherit;
+}
+a.list-group-item-info:hover, a.list-group-item-info:focus {
+ color: #31708f;
+ background-color: #c4e3f3;
+}
+a.list-group-item-info.active, a.list-group-item-info.active:hover, a.list-group-item-info.active:focus {
+ color: #fff;
+ background-color: #31708f;
+ border-color: #31708f;
+}
+
+.list-group-item-warning {
+ color: #8a6d3b;
+ background-color: #fcf8e3;
+}
+
+a.list-group-item-warning {
+ color: #8a6d3b;
+}
+a.list-group-item-warning .list-group-item-heading {
+ color: inherit;
+}
+a.list-group-item-warning:hover, a.list-group-item-warning:focus {
+ color: #8a6d3b;
+ background-color: #faf2cc;
+}
+a.list-group-item-warning.active, a.list-group-item-warning.active:hover, a.list-group-item-warning.active:focus {
+ color: #fff;
+ background-color: #8a6d3b;
+ border-color: #8a6d3b;
+}
+
+.list-group-item-danger {
+ color: #a94442;
+ background-color: #f2dede;
+}
+
+a.list-group-item-danger {
+ color: #a94442;
+}
+a.list-group-item-danger .list-group-item-heading {
+ color: inherit;
+}
+a.list-group-item-danger:hover, a.list-group-item-danger:focus {
+ color: #a94442;
+ background-color: #ebcccc;
+}
+a.list-group-item-danger.active, a.list-group-item-danger.active:hover, a.list-group-item-danger.active:focus {
+ color: #fff;
+ background-color: #a94442;
+ border-color: #a94442;
+}
+
+.list-group-item-heading {
+ margin-top: 0;
+ margin-bottom: 5px;
+}
+
+.list-group-item-text {
+ margin-bottom: 0;
+ line-height: 1.3;
+}
+
+.panel {
+ margin-bottom: 20px;
+ background-color: #fff;
+ border: 1px solid transparent;
+ border-radius: 4px;
+ -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
+}
+
+.panel-body {
+ padding: 15px;
+}
+.panel-body:before, .panel-body:after {
+ content: " ";
+ display: table;
+}
+.panel-body:after {
+ clear: both;
+}
+
+.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: 16px;
+ color: inherit;
+}
+.panel-title > a {
+ color: inherit;
+}
+
+.panel-footer {
+ padding: 10px 15px;
+ background-color: #f5f5f5;
+ border-top: 1px solid #ddd;
+ border-bottom-right-radius: 3px;
+ border-bottom-left-radius: 3px;
+}
+
+.panel > .list-group {
+ margin-bottom: 0;
+}
+.panel > .list-group .list-group-item {
+ border-width: 1px 0;
+ border-radius: 0;
+}
+.panel > .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 {
+ border-bottom: 0;
+ border-bottom-right-radius: 3px;
+ border-bottom-left-radius: 3px;
+}
+
+.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: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 td:first-child,
+.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {
+ border-top-left-radius: 3px;
+}
+.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,
+.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,
+.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,
+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,
+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {
+ 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 td:first-child,
+.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {
+ border-bottom-left-radius: 3px;
+}
+.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,
+.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
+.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,
+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {
+ border-bottom-right-radius: 3px;
+}
+.panel > .panel-body + .table,
+.panel > .panel-body + .table-responsive {
+ border-top: 1px solid #ddd;
+}
+.panel > .table > tbody:first-child > tr:first-child th,
+.panel > .table > tbody:first-child > tr:first-child td {
+ border-top: 0;
+}
+.panel > .table-bordered,
+.panel > .table-responsive > .table-bordered {
+ border: 0;
+}
+.panel > .table-bordered > thead > tr > th:first-child,
+.panel > .table-bordered > thead > tr > td:first-child,
+.panel > .table-bordered > tbody > tr > th:first-child,
+.panel > .table-bordered > tbody > tr > td:first-child,
+.panel > .table-bordered > tfoot > tr > th:first-child,
+.panel > .table-bordered > tfoot > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > th: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-bordered > thead > tr > td:last-child,
+.panel > .table-bordered > tbody > tr > th:last-child,
+.panel > .table-bordered > tbody > tr > td:last-child,
+.panel > .table-bordered > tfoot > tr > th:last-child,
+.panel > .table-bordered > tfoot > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,
+.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,
+.panel > .table-responsive > .table-bordered > tfoot > tr > th: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-bordered > thead > tr:first-child > th,
+.panel > .table-bordered > tbody > tr:first-child > td,
+.panel > .table-bordered > tbody > tr:first-child > th,
+.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,
+.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,
+.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,
+.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {
+ border-bottom: 0;
+}
+.panel > .table-bordered > tbody > tr:last-child > td,
+.panel > .table-bordered > tbody > tr:last-child > th,
+.panel > .table-bordered > tfoot > tr:last-child > td,
+.panel > .table-bordered > tfoot > tr:last-child > th,
+.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,
+.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,
+.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,
+.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {
+ border-bottom: 0;
+}
+.panel > .table-responsive {
+ border: 0;
+ margin-bottom: 0;
+}
+
+.panel-group {
+ margin-bottom: 20px;
+}
+.panel-group .panel {
+ margin-bottom: 0;
+ border-radius: 4px;
+}
+.panel-group .panel + .panel {
+ margin-top: 5px;
+}
+.panel-group .panel-heading {
+ border-bottom: 0;
+}
+.panel-group .panel-heading + .panel-collapse > .panel-body {
+ border-top: 1px solid #ddd;
+}
+.panel-group .panel-footer {
+ border-top: 0;
+}
+.panel-group .panel-footer + .panel-collapse .panel-body {
+ border-bottom: 1px solid #ddd;
+}
+
+.panel-default {
+ border-color: #ddd;
+}
+.panel-default > .panel-heading {
+ color: #333333;
+ background-color: #f5f5f5;
+ border-color: #ddd;
+}
+.panel-default > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #ddd;
+}
+.panel-default > .panel-heading .badge {
+ color: #f5f5f5;
+ background-color: #333333;
+}
+.panel-default > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #ddd;
+}
+
+.panel-primary {
+ border-color: #428bca;
+}
+.panel-primary > .panel-heading {
+ color: #fff;
+ background-color: #428bca;
+ border-color: #428bca;
+}
+.panel-primary > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #428bca;
+}
+.panel-primary > .panel-heading .badge {
+ color: #428bca;
+ background-color: #fff;
+}
+.panel-primary > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #428bca;
+}
+
+.panel-success {
+ border-color: #d6e9c6;
+}
+.panel-success > .panel-heading {
+ color: #3c763d;
+ background-color: #dff0d8;
+ border-color: #d6e9c6;
+}
+.panel-success > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #d6e9c6;
+}
+.panel-success > .panel-heading .badge {
+ color: #dff0d8;
+ background-color: #3c763d;
+}
+.panel-success > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #d6e9c6;
+}
+
+.panel-info {
+ border-color: #bce8f1;
+}
+.panel-info > .panel-heading {
+ color: #31708f;
+ background-color: #d9edf7;
+ border-color: #bce8f1;
+}
+.panel-info > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #bce8f1;
+}
+.panel-info > .panel-heading .badge {
+ color: #d9edf7;
+ background-color: #31708f;
+}
+.panel-info > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #bce8f1;
+}
+
+.panel-warning {
+ border-color: #faebcc;
+}
+.panel-warning > .panel-heading {
+ color: #8a6d3b;
+ background-color: #fcf8e3;
+ border-color: #faebcc;
+}
+.panel-warning > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #faebcc;
+}
+.panel-warning > .panel-heading .badge {
+ color: #fcf8e3;
+ background-color: #8a6d3b;
+}
+.panel-warning > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #faebcc;
+}
+
+.panel-danger {
+ border-color: #ebccd1;
+}
+.panel-danger > .panel-heading {
+ color: #a94442;
+ background-color: #f2dede;
+ border-color: #ebccd1;
+}
+.panel-danger > .panel-heading + .panel-collapse > .panel-body {
+ border-top-color: #ebccd1;
+}
+.panel-danger > .panel-heading .badge {
+ color: #f2dede;
+ background-color: #a94442;
+}
+.panel-danger > .panel-footer + .panel-collapse > .panel-body {
+ border-bottom-color: #ebccd1;
+}
+
+.embed-responsive {
+ position: relative;
+ display: block;
+ height: 0;
+ padding: 0;
+ overflow: hidden;
+}
+.embed-responsive .embed-responsive-item,
+.embed-responsive iframe,
+.embed-responsive embed,
+.embed-responsive object {
+ position: absolute;
+ top: 0;
+ left: 0;
+ bottom: 0;
+ height: 100%;
+ width: 100%;
+ border: 0;
+}
+.embed-responsive.embed-responsive-16by9 {
+ padding-bottom: 56.25%;
+}
+.embed-responsive.embed-responsive-4by3 {
+ padding-bottom: 75%;
+}
+
+.well {
+ min-height: 20px;
+ padding: 19px;
+ margin-bottom: 20px;
+ background-color: #f5f5f5;
+ border: 1px solid #e3e3e3;
+ border-radius: 4px;
+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 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: 21px;
+ font-weight: bold;
+ line-height: 1;
+ color: #000;
+ text-shadow: 0 1px 0 #fff;
+ opacity: 0.2;
+ filter: alpha(opacity=20);
+}
+.close:hover, .close:focus {
+ color: #000;
+ 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: translate3d(0, -25%, 0);
+ transform: translate3d(0, -25%, 0);
+ -webkit-transition: -webkit-transform 0.3s ease-out;
+ -moz-transition: -moz-transform 0.3s ease-out;
+ -o-transition: -o-transform 0.3s ease-out;
+ transition: transform 0.3s ease-out;
+}
+.modal.in .modal-dialog {
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+}
+
+.modal-open .modal {
+ overflow-x: hidden;
+ overflow-y: auto;
+}
+
+.modal-dialog {
+ position: relative;
+ width: auto;
+ margin: 10px;
+}
+
+.modal-content {
+ position: relative;
+ background-color: #fff;
+ border: 1px solid #999;
+ 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);
+ background-clip: padding-box;
+ outline: 0;
+}
+
+.modal-backdrop {
+ position: fixed;
+ top: 0;
+ right: 0;
+ bottom: 0;
+ left: 0;
+ z-index: 1040;
+ background-color: #000;
+}
+.modal-backdrop.fade {
+ opacity: 0;
+ filter: alpha(opacity=0);
+}
+.modal-backdrop.in {
+ opacity: 0.5;
+ filter: alpha(opacity=50);
+}
+
+.modal-header {
+ padding: 15px;
+ border-bottom: 1px solid #e5e5e5;
+ min-height: 16.428571429px;
+}
+
+.modal-header .close {
+ margin-top: -2px;
+}
+
+.modal-title {
+ margin: 0;
+ line-height: 1.428571429;
+}
+
+.modal-body {
+ position: relative;
+ padding: 15px;
+}
+
+.modal-footer {
+ padding: 15px;
+ text-align: right;
+ border-top: 1px solid #e5e5e5;
+}
+.modal-footer:before, .modal-footer:after {
+ content: " ";
+ display: table;
+}
+.modal-footer:after {
+ clear: both;
+}
+.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;
+ visibility: visible;
+ font-size: 12px;
+ line-height: 1.4;
+ 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: #fff;
+ text-align: center;
+ text-decoration: none;
+ background-color: #000;
+ border-radius: 4px;
+}
+
+.tooltip-arrow {
+ position: absolute;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid;
+}
+
+.tooltip.top .tooltip-arrow {
+ bottom: 0;
+ left: 50%;
+ margin-left: -5px;
+ border-width: 5px 5px 0;
+ border-top-color: #000;
+}
+.tooltip.top-left .tooltip-arrow {
+ bottom: 0;
+ left: 5px;
+ border-width: 5px 5px 0;
+ border-top-color: #000;
+}
+.tooltip.top-right .tooltip-arrow {
+ bottom: 0;
+ right: 5px;
+ border-width: 5px 5px 0;
+ border-top-color: #000;
+}
+.tooltip.right .tooltip-arrow {
+ top: 50%;
+ left: 0;
+ margin-top: -5px;
+ border-width: 5px 5px 5px 0;
+ border-right-color: #000;
+}
+.tooltip.left .tooltip-arrow {
+ top: 50%;
+ right: 0;
+ margin-top: -5px;
+ border-width: 5px 0 5px 5px;
+ border-left-color: #000;
+}
+.tooltip.bottom .tooltip-arrow {
+ top: 0;
+ left: 50%;
+ margin-left: -5px;
+ border-width: 0 5px 5px;
+ border-bottom-color: #000;
+}
+.tooltip.bottom-left .tooltip-arrow {
+ top: 0;
+ left: 5px;
+ border-width: 0 5px 5px;
+ border-bottom-color: #000;
+}
+.tooltip.bottom-right .tooltip-arrow {
+ top: 0;
+ right: 5px;
+ border-width: 0 5px 5px;
+ border-bottom-color: #000;
+}
+
+.popover {
+ position: absolute;
+ top: 0;
+ left: 0;
+ z-index: 1060;
+ display: none;
+ max-width: 276px;
+ padding: 1px;
+ text-align: left;
+ background-color: #fff;
+ background-clip: padding-box;
+ border: 1px solid #ccc;
+ 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);
+ white-space: normal;
+}
+.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: 14px;
+ font-weight: normal;
+ line-height: 18px;
+ background-color: #f7f7f7;
+ border-bottom: 1px solid #ebebeb;
+ border-radius: 5px 5px 0 0;
+}
+
+.popover-content {
+ padding: 9px 14px;
+}
+
+.popover > .arrow, .popover > .arrow:after {
+ position: absolute;
+ display: block;
+ width: 0;
+ height: 0;
+ border-color: transparent;
+ border-style: solid;
+}
+
+.popover > .arrow {
+ border-width: 11px;
+}
+
+.popover > .arrow:after {
+ border-width: 10px;
+ content: "";
+}
+
+.popover.top > .arrow {
+ left: 50%;
+ margin-left: -11px;
+ border-bottom-width: 0;
+ border-top-color: #999999;
+ 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: #fff;
+}
+.popover.right > .arrow {
+ top: 50%;
+ left: -11px;
+ margin-top: -11px;
+ border-left-width: 0;
+ border-right-color: #999999;
+ 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: #fff;
+}
+.popover.bottom > .arrow {
+ left: 50%;
+ margin-left: -11px;
+ border-top-width: 0;
+ border-bottom-color: #999999;
+ 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: #fff;
+}
+.popover.left > .arrow {
+ top: 50%;
+ right: -11px;
+ margin-top: -11px;
+ border-right-width: 0;
+ border-left-color: #999999;
+ border-left-color: rgba(0, 0, 0, 0.25);
+}
+.popover.left > .arrow:after {
+ content: " ";
+ right: 1px;
+ border-right-width: 0;
+ border-left-color: #fff;
+ bottom: -10px;
+}
+
+.carousel {
+ position: relative;
+}
+
+.carousel-inner {
+ position: relative;
+ overflow: hidden;
+ width: 100%;
+}
+.carousel-inner > .item {
+ display: none;
+ position: relative;
+ -webkit-transition: 0.6s ease-in-out left;
+ -o-transition: 0.6s ease-in-out left;
+ transition: 0.6s ease-in-out left;
+}
+.carousel-inner > .item > img,
+.carousel-inner > .item > a > img {
+ display: block;
+ width: 100% \9;
+ max-width: 100%;
+ height: auto;
+ line-height: 1;
+}
+.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: #fff;
+ text-align: center;
+ text-shadow: 0 1px 2px rgba(0, 0, 0, 0.6);
+}
+.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: 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: 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: #fff;
+ 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%;
+ 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;
+ margin-top: -10px;
+ 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 #fff;
+ border-radius: 10px;
+ cursor: pointer;
+ background-color: #000 \9;
+ background-color: transparent;
+}
+.carousel-indicators .active {
+ margin: 0;
+ width: 12px;
+ height: 12px;
+ background-color: #fff;
+}
+
+.carousel-caption {
+ position: absolute;
+ left: 15%;
+ right: 15%;
+ bottom: 20px;
+ z-index: 10;
+ padding-top: 20px;
+ padding-bottom: 20px;
+ color: #fff;
+ 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: -15px;
+ font-size: 30px;
+ }
+ .carousel-control .glyphicon-chevron-left,
+ .carousel-control .icon-prev {
+ margin-left: -15px;
+ }
+ .carousel-control .glyphicon-chevron-right,
+ .carousel-control .icon-next {
+ margin-right: -15px;
+ }
+
+ .carousel-caption {
+ left: 20%;
+ right: 20%;
+ padding-bottom: 30px;
+ }
+
+ .carousel-indicators {
+ bottom: 20px;
+ }
+}
+.clearfix:before, .clearfix:after {
+ content: " ";
+ display: table;
+}
+.clearfix: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;
+ visibility: hidden !important;
+}
+
+.affix {
+ position: fixed;
+ -webkit-transform: translate3d(0, 0, 0);
+ transform: translate3d(0, 0, 0);
+}
+
+@-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;
+ }
+
+ 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;
+ }
+
+ 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;
+ }
+
+ 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;
+ }
+
+ 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;
+ }
+
+ 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;
+ }
+}
+.btn-default,
+.btn-primary,
+.btn-success,
+.btn-info,
+.btn-warning,
+.btn-danger {
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075);
+}
+.btn-default:active, .btn-default.active,
+.btn-primary:active,
+.btn-primary.active,
+.btn-success:active,
+.btn-success.active,
+.btn-info:active,
+.btn-info.active,
+.btn-warning:active,
+.btn-warning.active,
+.btn-danger:active,
+.btn-danger.active {
+ -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:active, .btn.active {
+ background-image: none;
+}
+
+.btn-default {
+ background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);
+ background-image: -o-linear-gradient(top, #fff 0%, #e0e0e0 100%);
+ background-image: linear-gradient(to bottom, #ffffff 0%, #e0e0e0 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFE0E0E0', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+ background-repeat: repeat-x;
+ border-color: #dbdbdb;
+ text-shadow: 0 1px 0 #fff;
+ border-color: #ccc;
+}
+.btn-default:hover, .btn-default:focus {
+ background-color: #e0e0e0;
+ background-position: 0 -15px;
+}
+.btn-default:active, .btn-default.active {
+ background-color: #e0e0e0;
+ border-color: #dbdbdb;
+}
+.btn-default:disabled, .btn-default[disabled] {
+ background-color: #e0e0e0;
+ background-image: none;
+}
+
+.btn-primary {
+ background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%);
+ background-image: -o-linear-gradient(top, #428bca 0%, #2d6ca2 100%);
+ background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FF428BCA', endColorstr='#FF2D6CA2', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+ background-repeat: repeat-x;
+ border-color: #2b669a;
+}
+.btn-primary:hover, .btn-primary:focus {
+ background-color: #2d6ca2;
+ background-position: 0 -15px;
+}
+.btn-primary:active, .btn-primary.active {
+ background-color: #2d6ca2;
+ border-color: #2b669a;
+}
+.btn-primary:disabled, .btn-primary[disabled] {
+ background-color: #2d6ca2;
+ background-image: none;
+}
+
+.btn-success {
+ background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);
+ background-image: -o-linear-gradient(top, #5cb85c 0%, #419641 100%);
+ background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FF5CB85C', endColorstr='#FF419641', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+ background-repeat: repeat-x;
+ border-color: #3e8f3e;
+}
+.btn-success:hover, .btn-success:focus {
+ background-color: #419641;
+ background-position: 0 -15px;
+}
+.btn-success:active, .btn-success.active {
+ background-color: #419641;
+ border-color: #3e8f3e;
+}
+.btn-success:disabled, .btn-success[disabled] {
+ background-color: #419641;
+ background-image: none;
+}
+
+.btn-info {
+ background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
+ background-image: -o-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);
+ background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FF5BC0DE', endColorstr='#FF2AABD2', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+ background-repeat: repeat-x;
+ border-color: #28a4c9;
+}
+.btn-info:hover, .btn-info:focus {
+ background-color: #2aabd2;
+ background-position: 0 -15px;
+}
+.btn-info:active, .btn-info.active {
+ background-color: #2aabd2;
+ border-color: #28a4c9;
+}
+.btn-info:disabled, .btn-info[disabled] {
+ background-color: #2aabd2;
+ background-image: none;
+}
+
+.btn-warning {
+ background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
+ background-image: -o-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);
+ background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFF0AD4E', endColorstr='#FFEB9316', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+ background-repeat: repeat-x;
+ border-color: #e38d13;
+}
+.btn-warning:hover, .btn-warning:focus {
+ background-color: #eb9316;
+ background-position: 0 -15px;
+}
+.btn-warning:active, .btn-warning.active {
+ background-color: #eb9316;
+ border-color: #e38d13;
+}
+.btn-warning:disabled, .btn-warning[disabled] {
+ background-color: #eb9316;
+ background-image: none;
+}
+
+.btn-danger {
+ background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
+ background-image: -o-linear-gradient(top, #d9534f 0%, #c12e2a 100%);
+ background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFD9534F', endColorstr='#FFC12E2A', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+ background-repeat: repeat-x;
+ border-color: #b92c28;
+}
+.btn-danger:hover, .btn-danger:focus {
+ background-color: #c12e2a;
+ background-position: 0 -15px;
+}
+.btn-danger:active, .btn-danger.active {
+ background-color: #c12e2a;
+ border-color: #b92c28;
+}
+.btn-danger:disabled, .btn-danger[disabled] {
+ background-color: #c12e2a;
+ background-image: none;
+}
+
+.thumbnail,
+.img-thumbnail {
+ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);
+}
+
+.dropdown-menu > li > a:hover,
+.dropdown-menu > li > a:focus {
+ background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+ background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+ background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFF5F5F5', endColorstr='#FFE8E8E8', GradientType=0);
+ background-color: #e8e8e8;
+}
+
+.dropdown-menu > .active > a,
+.dropdown-menu > .active > a:hover,
+.dropdown-menu > .active > a:focus {
+ background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);
+ background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%);
+ background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FF428BCA', endColorstr='#FF357EBD', GradientType=0);
+ background-color: #357ebd;
+}
+
+.navbar-default {
+ background-image: -webkit-linear-gradient(top, white 0%, #f8f8f8 100%);
+ background-image: -o-linear-gradient(top, white 0%, #f8f8f8 100%);
+ background-image: linear-gradient(to bottom, #ffffff 0%, #f8f8f8 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFFFFFF', endColorstr='#FFF8F8F8', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+ border-radius: 4px;
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 5px rgba(0, 0, 0, 0.075);
+}
+.navbar-default .navbar-nav > .active > a {
+ background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%);
+ background-image: -o-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%);
+ background-image: linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEBEBEB', endColorstr='#FFF3F3F3', GradientType=0);
+ -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);
+ box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.075);
+}
+
+.navbar-brand,
+.navbar-nav > li > a {
+ text-shadow: 0 1px 0 rgba(255, 255, 255, 0.25);
+}
+
+.navbar-inverse {
+ background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);
+ background-image: -o-linear-gradient(top, #3c3c3c 0%, #222 100%);
+ background-image: linear-gradient(to bottom, #3c3c3c 0%, #222222 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FF3C3C3C', endColorstr='#FF222222', GradientType=0);
+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);
+}
+.navbar-inverse .navbar-nav > .active > a {
+ background-image: -webkit-linear-gradient(top, #222 0%, #282828 100%);
+ background-image: -o-linear-gradient(top, #222 0%, #282828 100%);
+ background-image: linear-gradient(to bottom, #222222 0%, #282828 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FF222222', endColorstr='#FF282828', GradientType=0);
+ -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);
+ box-shadow: inset 0 3px 9px rgba(0, 0, 0, 0.25);
+}
+.navbar-inverse .navbar-brand,
+.navbar-inverse .navbar-nav > li > a {
+ text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
+}
+
+.navbar-static-top,
+.navbar-fixed-top,
+.navbar-fixed-bottom {
+ border-radius: 0;
+}
+
+.alert {
+ text-shadow: 0 1px 0 rgba(255, 255, 255, 0.2);
+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.25), 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.alert-success {
+ background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
+ background-image: -o-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);
+ background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFDFF0D8', endColorstr='#FFC8E5BC', GradientType=0);
+ border-color: #b2dba1;
+}
+
+.alert-info {
+ background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
+ background-image: -o-linear-gradient(top, #d9edf7 0%, #b9def0 100%);
+ background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFD9EDF7', endColorstr='#FFB9DEF0', GradientType=0);
+ border-color: #9acfea;
+}
+
+.alert-warning {
+ background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
+ background-image: -o-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);
+ background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFCF8E3', endColorstr='#FFF8EFC0', GradientType=0);
+ border-color: #f5e79e;
+}
+
+.alert-danger {
+ background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
+ background-image: -o-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);
+ background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFF2DEDE', endColorstr='#FFE7C3C3', GradientType=0);
+ border-color: #dca7a7;
+}
+
+.progress {
+ background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
+ background-image: -o-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);
+ background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFEBEBEB', endColorstr='#FFF5F5F5', GradientType=0);
+}
+
+.progress-bar {
+ background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%);
+ background-image: -o-linear-gradient(top, #428bca 0%, #3071a9 100%);
+ background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FF428BCA', endColorstr='#FF3071A9', GradientType=0);
+}
+
+.progress-bar-success {
+ background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);
+ background-image: -o-linear-gradient(top, #5cb85c 0%, #449d44 100%);
+ background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FF5CB85C', endColorstr='#FF449D44', GradientType=0);
+}
+
+.progress-bar-info {
+ background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
+ background-image: -o-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);
+ background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FF5BC0DE', endColorstr='#FF31B0D5', GradientType=0);
+}
+
+.progress-bar-warning {
+ background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
+ background-image: -o-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);
+ background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFF0AD4E', endColorstr='#FFEC971F', GradientType=0);
+}
+
+.progress-bar-danger {
+ background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);
+ background-image: -o-linear-gradient(top, #d9534f 0%, #c9302c 100%);
+ background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFD9534F', endColorstr='#FFC9302C', GradientType=0);
+}
+
+.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%, rgba(0, 0, 0, 0) 25%, rgba(0, 0, 0, 0) 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, rgba(0, 0, 0, 0) 75%, rgba(0, 0, 0, 0));
+}
+
+.list-group {
+ border-radius: 4px;
+ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.075);
+}
+
+.list-group-item.active,
+.list-group-item.active:hover,
+.list-group-item.active:focus {
+ text-shadow: 0 -1px 0 #3071a9;
+ background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%);
+ background-image: -o-linear-gradient(top, #428bca 0%, #3278b3 100%);
+ background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FF428BCA', endColorstr='#FF3278B3', GradientType=0);
+ border-color: #3278b3;
+}
+
+.panel {
+ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);
+}
+
+.panel-default > .panel-heading {
+ background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+ background-image: -o-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);
+ background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFF5F5F5', endColorstr='#FFE8E8E8', GradientType=0);
+}
+
+.panel-primary > .panel-heading {
+ background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);
+ background-image: -o-linear-gradient(top, #428bca 0%, #357ebd 100%);
+ background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FF428BCA', endColorstr='#FF357EBD', GradientType=0);
+}
+
+.panel-success > .panel-heading {
+ background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
+ background-image: -o-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);
+ background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFDFF0D8', endColorstr='#FFD0E9C6', GradientType=0);
+}
+
+.panel-info > .panel-heading {
+ background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
+ background-image: -o-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);
+ background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFD9EDF7', endColorstr='#FFC4E3F3', GradientType=0);
+}
+
+.panel-warning > .panel-heading {
+ background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
+ background-image: -o-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);
+ background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFFCF8E3', endColorstr='#FFFAF2CC', GradientType=0);
+}
+
+.panel-danger > .panel-heading {
+ background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
+ background-image: -o-linear-gradient(top, #f2dede 0%, #ebcccc 100%);
+ background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFF2DEDE', endColorstr='#FFEBCCCC', GradientType=0);
+}
+
+.well {
+ background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
+ background-image: -o-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);
+ background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);
+ background-repeat: repeat-x;
+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#FFE8E8E8', endColorstr='#FFF5F5F5', GradientType=0);
+ border-color: gainsboro;
+ -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);
+ box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.05), 0 1px 0 rgba(255, 255, 255, 0.1);
+}
+
+.thumbnail-list li div.selection-show {
+ position: absolute;
+ border: 1px dashed red;
+ display: none;
+ pointer-events: none;
+}
+
+/* selections */
+.repeat-lassos-group {
+ position: absolute;
+ right: -185px;
+ bottom: -35px;
+}
+
+.header-region{
+ position: absolute;
+ border: 3px solid rgba(41, 255, 52, 0.8);
+ background: rgba(31, 255, 32, 0.2);
+ box-sizing: border-box;
+}
+
+.footer-region{
+ position: absolute;
+ border: 3px solid rgba(19, 248, 255, 0.8);
+ background: rgba(15, 183, 255, 0.2);
+ box-sizing: border-box;
+}
+
+.header-region:hover, .footer-region:hover{
+ cursor: row-resize;
+}
+
+/* rectangularSelector.js classes */
+.selection-box, .table-region {
+ position: absolute;
+ border: 1px dashed rgba(255, 87, 0, 0.8);
+ background: rgba(255, 87, 0, 0.2);
+ box-sizing: border-box;
+}
+
+.regex-table-region {
+ position: absolute;
+ border: 1px dashed rgba(255, 172, 23, 0.8);
+ background: rgba(255, 150, 11, 0.2);
+ box-sizing: border-box;
+}
+
+.selection-box:hover, .table-region:hover {
+ cursor: pointer;
+}
+
+.selection-box {
+ z-index: 42;
+ width: 0;
+ height: 0;
+ visibility: hidden;
+}
+
+.table-region, .regex-table-region {
+ top: 0;
+ left: 0;
+ z-index: 21;
+}
+
+div.table-region .fixed-handle, div.regex-table-region.fixed-handle {
+ position: absolute;
+}
+
+div.table-region .resize-handle, div.regex-table-region.resize-handle {
+ position: absolute;
+}
+
+div.table-region .n-border, div.regex-table-region.n-border {
+ width: calc(100% - 10px);
+ top: -5px;
+ left: 5px;
+ height: 10px;
+}
+
+div.table-region .s-border, div.regex-table-region.s-border {
+ width: calc(100% - 10px);
+ bottom: -5px;
+ left: 5px;
+ height: 10px;
+}
+
+div.table-region .w-border, div.regex-table-region.w-border {
+ height: calc(100% - 10px);
+ left: -5px;
+ top: 5px;
+ width: 10px;
+}
+
+div.table-region .e-border, div.regex-table-region.e-border {
+ height: calc(100% - 10px);
+ top: 5px;
+ right: -5px;
+ width: 10px;
+}
+
+div.table-region .nw-border, div.regex-table-region.nw-border {
+ width: 10px;
+ height: 10px;
+ top: -5px;
+ left: -5px;
+}
+
+div.table-region .ne-border, div.regex-table-region.ne-border {
+ width: 10px;
+ height: 10px;
+ top: -5px;
+ right: -5px;
+}
+
+div.table-region .sw-border, div.regex-table-region.sw-border {
+ width: 10px;
+ height: 10px;
+ bottom: -5px;
+ left: -5px;
+}
+
+div.table-region .se-border, div.regex-table-region.se-border {
+ width: 10px;
+ height: 10px;
+ bottom: -5px;
+ right: -5px;
+}
+
+div.table-region .n-border:hover {
+ cursor: n-resize;
+}
+
+div.table-region .nw-border:hover {
+ cursor: nw-resize;
+}
+
+div.table-region .ne-border:hover {
+ cursor: ne-resize;
+}
+
+div.table-region .s-border:hover {
+ cursor: s-resize;
+}
+
+div.table-region .sw-border:hover {
+ cursor: sw-resize;
+}
+
+div.table-region .se-border:hover {
+ cursor: se-resize;
+}
+
+div.table-region .w-border:hover {
+ cursor: w-resize;
+}
+
+div.table-region .e-border:hover {
+ cursor: e-resize;
+}
+
+div.table-region button[name=close] {
+ font-weight: bold;
+ border: 0;
+ background-color: transparent;
+ padding: 0;
+ font-size: 20px;
+ position: relative;
+ top: -25px;
+ left: 100%;
+ margin-left: 5px;
+}
+
+div.table-region button[name=close]:hover {
+ color: red;
+}
+
+@font-face {
+ font-family: 'Glyphicons Halflings';
+ src: url("glyphicons-halflings-regular.eot");
+ src: url("../fonts/bootstrap/glyphicons-halflings-regular.eot?#iefix") format("embedded-opentype"), url("../fonts/bootstrap/glyphicons-halflings-regular.woff") format("woff"), url("../fonts/bootstrap/glyphicons-halflings-regular.ttf") format("truetype"), url("../fonts/bootstrap/glyphicons-halflings-regular.svg#webfont") format("svg");
+}
+body {
+ padding-top: 70px;
+}
+
+.jumbotron h1 {
+ font-size: 2em;
+}
+.jumbotron h2, .jumbotron h3, .jumbotron h4, .jumbotron h5, .jumbotron h6 {
+ font-size: 1.3em;
+}
+.jumbotron p {
+ font-size: 1.3em;
+}
+
+.navbar-fixed-top .container {
+ margin: 0 1em;
+}
+
+#navbar .active {
+ font-weight: 500;
+ color: #333333;
+}
+
+
+.navbar-default a.navbar-brand {
+ padding-left: 30px;
+ position: relative;
+ font-weight: bold;
+ color: black;
+}
+.navbar-default a.navbar-brand::before {
+ position: absolute;
+ content: "";
+ display: block;
+ background-image: url("../img/logo.png");
+ background-repeat: no-repeat;
+ background-size: 25px 30px;
+ width: 25px;
+ height: 30px;
+ left: 0;
+ top: 10px;
+}
+
+.btn-file {
+ position: relative;
+ overflow: hidden;
+}
+
+.btn-file input[type=file] {
+ position: absolute;
+ top: 0;
+ right: 0;
+ min-width: 100%;
+ min-height: 100%;
+ font-size: 100px;
+ text-align: right;
+ filter: alpha(opacity=0);
+ opacity: 0;
+ outline: none;
+ background: white;
+ cursor: inherit;
+ display: block;
+}
+
+.form-inline .input-group > .form-control, .navbar-form .input-group > .form-control {
+ background: white;
+ width: 500px;
+}
+
+form {
+ margin-bottom: 1em;
+}
+
+#file-list-container {
+ max-height: 500px;
+ overflow-y: scroll;
+}
+#file-list-container .file-list thead tr th {
+ text-align: center;
+ cursor: pointer;
+ position: relative;
+ border-right: 1px solid #ddd;
+ padding-right: 20px;
+}
+#file-list-container .file-list thead tr th::before, #file-list-container .file-list thead tr th::after {
+ text-align: right;
+ width: 11px;
+ color: #ddd;
+ position: absolute;
+ display: block;
+ font-family: 'Glyphicons Halflings';
+ font-size: .8em;
+ font-style: normal;
+ font-weight: normal;
+ line-height: 1;
+ -webkit-font-smoothing: antialiased;
+ -moz-osx-font-smoothing: grayscale;
+}
+#file-list-container .file-list thead tr th::before {
+ content: "\e113";
+ right: 3px;
+ top: 6px;
+}
+#file-list-container .file-list thead tr th::after {
+ content: "\e114";
+ right: 4px;
+ bottom: 6px;
+}
+#file-list-container .file-list thead tr th.headerSortUp::before {
+ color: #777777 !important;
+}
+#file-list-container .file-list thead tr th.headerSortDown:after {
+ color: #777777 !important;
+}
+#file-list-container .file-list thead tr th:first-of-type {
+ text-align: left;
+}
+#file-list-container .file-list thead tr th:nth-child(n+5) {
+ cursor: default;
+ padding-right: 8px;
+}
+#file-list-container .file-list thead tr th:nth-child(n+5)::before, #file-list-container .file-list thead tr th:nth-child(n+5)::after {
+ content: "";
+ display: none;
+ position: relative;
+}
+#file-list-container .file-list tbody tr {
+ background: white;
+}
+#file-list-container .file-list tbody tr:hover {
+ background: #d9edf7;
+}
+#file-list-container .file-list tbody tr td {
+ line-height: 2.25;
+ text-align: center;
+}
+#file-list-container .file-list tbody tr td:first-of-type {
+ font-weight: bold;
+ text-align: left;
+}
+#file-list-container .file-list tbody tr td a {
+ color: #333;
+}
+
+.glyphicon-remove {
+ color: #777777;
+}
+.glyphicon-remove:hover {
+ color: #d9534f;
+}
+
+#sidebar {
+ background: #eeeeee;
+ width: 195px;
+ padding: 0em 0 0;
+ height: calc(100% - 51px);
+ text-align: center;
+ overflow-y: scroll;
+ overflow-x: hidden;
+ position: fixed;
+ left: 0;
+ top: 104px;
+ z-index: 2;
+ -webkit-box-shadow: inset -0.25em 0 0.5em -0.25em rgba(0, 0, 0, 0.1);
+ box-shadow: inset -0.25em 0 0.5em -0.25em rgba(0, 0, 0, 0.1);
+ height: 100%;
+}
+#sidebar h5 {
+ border-top: 1px solid #777777;
+ padding-top: 1em;
+ margin-top: 1em;
+}
+#sidebar .btn-group button {
+ width: 83px;
+ margin-bottom: 10px;
+}
+#sidebar p {
+ font-size: .9em;
+}
+#sidebar .thumbnail-list {
+ padding-left: 0px;
+}
+#sidebar .thumbnail-list .page {
+ margin: 0 auto 1.25em;
+ display: block;
+ width: 90%;
+ padding-left: .5em;
+ padding-right: .5em;
+/* padding: 1em .5em .5em 1em; */
+ position: relative;
+}
+#sidebar .thumbnail-list .page img {
+ display: block;
+ width: 100%;
+}
+#sidebar .thumbnail-list .page p {
+ margin-top: .25em;
+ color: #555555;
+ line-height: 1;
+}
+#sidebar .thumbnail-list .page:hover img {
+ cursor: pointer;
+ -webkit-box-shadow: 0 0 0 0.1em rgba(0, 0, 0, 0.1);
+ box-shadow: 0 0 0 0.1em rgba(0, 0, 0, 0.1);
+}
+#sidebar .thumbnail-list .page.active img {
+ -webkit-box-shadow: 0 0 0 0.1em #5bc0de;
+ box-shadow: 0 0 0 0.1em #5bc0de;
+}
+#sidebar .thumbnail-list .page .remove {
+ position: absolute;
+ left: -.25em;
+ top: 1em;
+ height: 1em;
+ display: block;
+ line-height: 1;
+ font-size: 1em;
+}
+#sidebar .thumbnail-list .page .remove:hover {
+ cursor: pointer;
+}
+
+#control-panel {
+ position: fixed;
+ top: 50px;
+ left: 0px;
+ width: 100%;
+ z-index: 101;
+ /* gotta be >100, which is the max z-index for selections */
+ background: #d9edf7;
+ padding: 1em;
+ -webkit-box-shadow: 0 1px 5px rgba(0, 0, 0, 0.075);
+ box-shadow: 0 1px 5px rgba(0, 0, 0, 0.075);
+ padding-left: 5%;
+ padding-right: 5%;
+}
+#control-panel button {
+ margin-right: 1.25em;
+}
+#control-panel .filename {
+ display: inline-block;
+ margin-right: 20px;
+ max-width: 270px;
+ white-space: nowrap;
+ overflow: hidden;
+ text-overflow: ellipsis;
+}
+#control-panel span.filename {
+ vertical-align: middle;
+}
+#control-panel #template-dropdown-container ul {
+ padding-left: 20px;
+}
+#control-panel #template-dropdown-container button {
+ padding-left: 0px;
+}
+#control-panel #template-dropdown-container ul:first-of-type {
+ margin-bottom: 0px;
+}
+#control-panel #template-dropdown-container li a {
+ cursor: pointer;
+ color: #333;
+}
+#control-panel #template-dropdown-templates-list-container li a {
+ cursor: pointer;
+ color: #333;
+}
+
+#main-pane {
+ background: #777777;
+ padding: 4.25em 2em 2em 2em;
+ margin-left: 195px;
+ height: 100%;
+ width: calc(100% - 200px);
+ z-index: 1;
+}
+
+/*
+#pages-container {
+ width: 100%;
+ height: auto;
+ margin: 0 auto;
+ padding: 3px;
+ position: relative;
+ padding-right: 20%;
+}
+*/
+
+html.wait, html.wait * { cursor: wait !important; }
+
+#main-pane .pdf-page {
+ position: relative;
+}
+#main-pane .pdf-page .page-number {
+ position: absolute;
+}
+#main-pane .page {
+ width: 100%;
+ max-width: 800px;
+ min-width: 179px;
+ -webkit-box-shadow: 0 0 2em rgba(0, 0, 0, 0.4);
+
+ position: relative;
+ margin: 0 auto;
+}
+#main-pane .page img {
+ margin: 2em 0;
+ display: block;
+ width: 100%;
+ max-width: 800px;
+ min-width: 0px;
+ user-select: none;
+ -moz-user-select: none;
+ -webkit-user-select: none;
+ -ms-user-select: none;
+}
+#main-pane .page img:hover {
+ cursor: crosshair;
+}
+#main-pane .selection-box, #main-pane .table-region {
+ border: 3px dashed rgba(224, 1, 1, 0.6);
+ background: rgba(224, 1, 1, 0.2);
+}
+#main-pane .selection-box .selection-panel, #main-pane .table-region .selection-panel {
+ display: none;
+ position: absolute;
+ bottom: -2.8em;
+ left: 0;
+ min-width: 320px;
+}
+#main-pane .selection-box .selection-panel button:hover, #main-pane .table-region .selection-panel button:hover {
+ cursor: pointer;
+}
+#main-pane .selection-box:hover, #main-pane .table-region:hover {
+ cursor: move;
+}
+#main-pane .selection-box:hover .selection-panel, #main-pane .table-region:hover .selection-panel {
+ display: block;
+}
+
+body.page-selections {
+ padding-top: 50px;
+ background: #777777;
+}
+body.page-selections #main-pane {
+ background: #777777;
+}
+
+body.page-export {
+ padding-top: 50px;
+ background: white;
+}
+body.page-export #sidebar {
+ text-align: left;
+ padding: .5em;
+}
+body.page-export #sidebar .lattice.glyphicon {
+ color: #ededed;
+ background: #666;
+ text-shadow: none;
+ border: solid #666;
+ border-width: 0 0 1px 1px;
+}
+body.page-export #main-pane {
+ background: white;
+ padding-top: 5.5em;
+}
+body.page-export #main-pane #control-panel form {
+ display: inline-block;
+ margin-bottom: 0;
+}
+body.page-export #main-pane #control-panel form .form-control {
+ width: 100px;
+ margin-right: 1em;
+ display: inline-block;
+}
+body.page-export #main-pane #control-panel form .form-control.format {
+ width: 130px;
+}
+body.page-export #main-pane #control-panel form #copy-csv-to-clipboard {
+ min-width: 140px;
+}
+body.page-export #main-pane table {
+ margin-top: 2em;
+}
+
+.jumbotron.about p {
+ font-size: 1.1em;
+}
+
+div.spinner {
+ top: 10px !important;
+}
+
+#progress-container h5 {
+ display: inline-block;
+ font-size: 1.1em;
+ font-weight: bold;
+}
+
+#progress-container #message {
+ color: #aaa;
+}
+
+.autodetect-in-progress .glyphicon-refresh,
+#download-data.download-in-progress .glyphicon-refresh {
+ animation: 4s linear 0s normal none infinite running spin;
+ display: inline-block;
+}
+
+@-moz-keyframes spin {
+ 0% {
+ -moz-transform: rotate(0deg);
+ }
+ 100% {
+ -moz-transform: rotate(359deg);
+ }
+}
+@-webkit-keyframes spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ }
+}
+@-o-keyframes spin {
+ 0% {
+ -o-transform: rotate(0deg);
+ }
+ 100% {
+ -o-transform: rotate(359deg);
+ }
+}
+@keyframes spin {
+ 0% {
+ -webkit-transform: rotate(0deg);
+ transform: rotate(0deg);
+ }
+ 100% {
+ -webkit-transform: rotate(359deg);
+ transform: rotate(359deg);
+ }
+}
+.autodetect-in-progress .glyphicon-flash {
+ display: none;
+}
+
+.autodetect-finished .glyphicon-flash {
+ display: inline;
+}
+
+.autodetect-finished .glyphicon-refresh {
+ display: none;
+}
+
+#download-data.download-in-progress .glyphicon-download {
+ display: none;
+}
+#download-data .glyphicon-download {
+ display: inline;
+}
+#download-data .glyphicon-refresh {
+ display: none;
+}
+
+.flash {
+ -moz-animation: flash 2s ease-out;
+ -moz-animation-iteration-count: 1;
+ -webkit-animation: flash 2s ease-out;
+ -webkit-animation-iteration-count: 1;
+ -ms-animation: flash 2s ease-out;
+ -ms-animation-iteration-count: 1;
+}
+
+@-webkit-keyframes flash {
+ 0% {
+ background-color: none;
+ }
+ 50% {
+ background-color: #fbf8b2;
+ }
+ 100% {
+ background-color: none;
+ }
+}
+@-moz-keyframes flash {
+ 0% {
+ background-color: none;
+ }
+ 50% {
+ background-color: #fbf8b2;
+ }
+ 100% {
+ background-color: none;
+ }
+}
+@-ms-keyframes flash {
+ 0% {
+ background-color: none;
+ }
+ 50% {
+ background-color: #fbf8b2;
+ }
+ 100% {
+ background-color: none;
+ }
+}
+#loading {
+ padding-left: 30px;
+}
+#loading #spinner {
+ position: relative;
+ top: 6px;
+ margin-right: 5px;
+}
+.social_media_nav {
+ display: block;
+ margin: 0 auto;
+ text-align: center;
+ width: 70%;
+ padding-bottom: 5px;
+}
+.navbar_1 .navbar-nav_1 {
+ display: inline-block;
+ float: none;
+}
+
+.navbar_1 .navbar-collapse_1 {
+ text-align: center;
+}
+#regex-container {
+ background: #eeeeee;
+ float: right;
+ right: 0px;
+ position: fixed;
+ top: 104px;
+ height:100%;
+ width: 230px;
+ display: inline;
+ overflow-y: scroll;
+ padding-bottom: 40px;
+}
+
+.regex-result:hover {
+ background: #ffc314;
+}
+
+.regex-result:hover {
+ background: #ffc314;
+}
diff --git a/src/test/java/TestAboutPage.java b/src/test/java/TestAboutPage.java
new file mode 100644
index 000000000..14d956a5d
--- /dev/null
+++ b/src/test/java/TestAboutPage.java
@@ -0,0 +1,144 @@
+import org.junit.After;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.chrome.ChromeOptions;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import java.util.concurrent.TimeUnit;
+
+import static junit.framework.TestCase.assertTrue;
+
+//Checks the multiple links found on the About page. For three of the links, there will be 3 tabs that open in addition to
+// to the original tab. The three tabs, I have not been able to switch control to another tab so it only checks to open the
+// url. Additionally, the media menu is not tested for since it is already tested in TestHomePage. Additionally, the media
+// menu is not tested for since it is already tested in TestHomePage.
+//@author: SM modified: 2/22/18
+public class TestAboutPage {
+ WebDriver driver;
+
+ @Test
+ public void startWebDriver(){
+ System.setProperty("webdriver.chrome.driver","/usr/local/bin/chromedriver");
+ ChromeOptions options = new ChromeOptions();
+ options.addArguments("headless");
+ options.addArguments("no-sandbox");
+
+ driver = new ChromeDriver(options);
+ driver.get("http://127.0.0.1:9292/");
+ driver.manage().window().maximize();
+ WebDriverWait wait = new WebDriverWait(driver, 100);
+
+ try {
+ //checks for the multiple links found on the About page and compares the url that the link navigates
+ // to the one that is set for in the html page
+ By about_id = By.linkText("About");
+ WebElement about_icon = wait.until(ExpectedConditions.visibilityOfElementLocated(about_id));
+ about_icon.click();
+ WebElement about_icon2 = wait.until(ExpectedConditions.visibilityOfElementLocated(about_id));
+ about_icon2.click();
+ String about_title = "About Tabula";
+ By abouttabula_classname = By.className("abouttabula");
+ WebElement abouttabula = wait.until(ExpectedConditions.visibilityOfElementLocated(abouttabula_classname));
+ assertTrue("Failed, couldn't find About page", about_title.equals(abouttabula.getText()));
+
+ By github_fork_link = By.id("github_fork");
+ WebElement github_fork = wait.until(ExpectedConditions.elementToBeClickable(github_fork_link));
+ github_fork.click();
+ String tabula_github_url = "https://github.com/tabulapdf/tabula";
+ assertTrue("Failed, couldn't find Tabula's GitHub page", driver.getCurrentUrl().equals(tabula_github_url));
+ driver.navigate().back();
+
+ //The following 3 links open up 3 additional tabs which are not tested for, since I wasn't able to find a correct
+ //way to switch the control of the tab to another tab to check for the correct url, the test only opens up the urls.
+ By Manuel_text = By.linkText("Manuel Aristarán");
+ WebElement Manuel_link = wait.until(ExpectedConditions.elementToBeClickable(Manuel_text));
+ Manuel_link.click();
+ Thread.sleep(3000);
+
+ By Mike_text = By.linkText("Mike Tigas");
+ WebElement Mike_link = wait.until(ExpectedConditions.elementToBeClickable(Mike_text));
+ Mike_link.click();
+
+ By Jeremy_text = By.linkText("Jeremy B. Merrill");
+ WebElement Jeremy_link = wait.until(ExpectedConditions.elementToBeClickable(Jeremy_text));
+ Jeremy_link.click();
+
+ //the following links will check for the correct url.
+ By ProPublica_text = By.linkText("ProPublica");
+ WebElement ProPublica_link = wait.until(ExpectedConditions.elementToBeClickable(ProPublica_text));
+ ProPublica_link.click();
+ String ProPublica_url = "https://www.propublica.org/";
+ driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
+ assertTrue("Failed, couldn't find ProPublica's page", driver.getCurrentUrl().equals(ProPublica_url));
+ driver.navigate().back();
+
+ By LaNacion_text = By.linkText("La Nación DATA");
+ WebElement LaNacion_link = wait.until(ExpectedConditions.elementToBeClickable(LaNacion_text));
+ LaNacion_link.click();
+ String LaNacion_url = "http://blogs.lanacion.com.ar/data/";
+ driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
+ assertTrue("Failed, couldn't find La Nacion DATA's page", driver.getCurrentUrl().equals(LaNacion_url));
+ driver.navigate().back();
+
+ By KnightMozilla_text = By.linkText("Knight-Mozilla OpenNews");
+ WebElement KnightMozilla_link = wait.until(ExpectedConditions.elementToBeClickable(KnightMozilla_text));
+ KnightMozilla_link.click();
+ String KnightMozilla_url = "https://opennews.org/";
+ driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
+ assertTrue("Failed, couldn't find Knight-Mozilla OpenNews' page", driver.getCurrentUrl().equals(KnightMozilla_url));
+ driver.navigate().back();
+
+ By NYTimes_text = By.linkText("The New York Times");
+ WebElement NYTimes_link = wait.until(ExpectedConditions.elementToBeClickable(NYTimes_text));
+ NYTimes_link.click();
+ String NYTimes_url = "https://www.nytimes.com/";
+ driver.manage().timeouts().pageLoadTimeout(150, TimeUnit.SECONDS);
+ assertTrue("Failed, couldn't find The New York Times' page", driver.getCurrentUrl().equals(NYTimes_url));
+ driver.navigate().back();
+
+ By NUKnight_text = By.linkText("Northwestern University Knight Lab");
+ WebElement NUKnight_link = wait.until(ExpectedConditions.elementToBeClickable(NUKnight_text));
+ NUKnight_link.click();
+ String NUKnight_url = "https://knightlab.northwestern.edu/";
+ driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
+ assertTrue("Failed, couldn't find Northwestern University Knight Lab's page", driver.getCurrentUrl().equals(NUKnight_url));
+ driver.navigate().back();
+
+ By KnightFoundation_text = By.linkText("The Knight Foundation");
+ WebElement KnightFoundation_link = wait.until(ExpectedConditions.elementToBeClickable(KnightFoundation_text));
+ KnightFoundation_link.click();
+ String KnightFoundation_url = "https://www.knightfoundation.org/";
+ driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
+ assertTrue("Failed, couldn't find The Knight Foundation's page", driver.getCurrentUrl().equals(KnightFoundation_url));
+ driver.navigate().back();
+
+ By Shuttleworth_text = By.linkText("The Shuttleworth Foundation");
+ WebElement Shuttleworth_link = wait.until(ExpectedConditions.elementToBeClickable(Shuttleworth_text));
+ Shuttleworth_link.click();
+ String Shuttleworth_url = "https://shuttleworthfoundation.org/";
+ driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
+ assertTrue("Failed, couldn't find The Shuttleworth Foundation's page", driver.getCurrentUrl().equals(Shuttleworth_url));
+ driver.navigate().back();
+
+ By Jason_text = By.linkText("Jason Das.");
+ WebElement Jason_link = wait.until(ExpectedConditions.elementToBeClickable(Jason_text));
+ Jason_link.click();
+ String Jason_url = "http://www.jasondas.com/";
+ driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
+ assertTrue("Failed, couldn't find Jason Das's page", driver.getCurrentUrl().equals(Jason_url));
+
+ driver.navigate().back();
+
+ }catch(Exception e){
+ System.out.print(e);
+ }
+ }
+ @After
+ public void TearDown(){
+ driver.quit();
+ }
+}
\ No newline at end of file
diff --git a/src/test/java/TestCorrespondence_FINAL_SBE.java b/src/test/java/TestCorrespondence_FINAL_SBE.java
new file mode 100644
index 000000000..599a77724
--- /dev/null
+++ b/src/test/java/TestCorrespondence_FINAL_SBE.java
@@ -0,0 +1,339 @@
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.chrome.ChromeOptions;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import java.util.List;
+
+import static junit.framework.TestCase.assertTrue;
+//Test of the Correspondence_FINAL_SBE pdf file, it will go through various user scenarios to test the functionality of the regex
+// implementation (spanning pages, multiple search results, inclusive and non-inclusive, and overlap)
+// @author SM modified: 4/29/18
+
+public class TestCorrespondence_FINAL_SBE {
+ //Test of the Correspondence_FINAL_SBE pdf file.
+ private static WebDriver driver;
+ private static String Tabula_url = "http://127.0.0.1:9292/";
+ private WebDriverWait wait = new WebDriverWait(driver, 500);
+
+ //will continue to refresh the page until it sees one of the buttons appear in the menu option of the extraction page
+ private void PageRefresh() throws InterruptedException {
+ //menu options did not fully load
+ Thread.sleep(1000);
+ //refresh the page
+ while(driver.findElements( By.id("restore-detected-tables")).size() == 0) {
+ driver.navigate().refresh();
+ Thread.sleep(700);
+ }
+ }
+ //will navigate and wait for the data to appear in the preview and export data page
+ private void PreviewandExportDatapg(){
+ By previewandexport_id = By.id("all-data");
+ WebElement previewandexport_button = wait.until(ExpectedConditions.visibilityOfElementLocated(previewandexport_id));
+ previewandexport_button.click();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("detection-row")));
+ }
+ //will wait for the regex button to become clickable and then click the regex button
+ private void ClickRegexButton() throws InterruptedException {
+ By regex_search_id = By.id("regex-search");
+ WebElement regex_button = new WebDriverWait(driver, 30).until(ExpectedConditions.
+ elementToBeClickable(regex_search_id));
+ regex_button.click();
+ Thread.sleep(800);
+ }
+ //send regex inputs to the corresponding pattern type
+ private void PatternInputStrings(String pattern_before, String pattern_after){
+ By pattern_before_input = By.id("pattern_before");
+ By pattern_after_input = By.id("pattern_after");
+ driver.findElement(pattern_before_input).sendKeys(pattern_before);
+ driver.findElement(pattern_after_input).sendKeys(pattern_after);
+ }
+ //send corresponding info of inclusive to the pattern type
+ private void InclusiveButtons(boolean patternbefore, boolean patternafter){
+ WebElement inclusive_before_btn = new WebDriverWait(driver, 30).
+ until(ExpectedConditions.elementToBeClickable(driver.findElement(By.id("include_pattern_before"))));
+ WebElement inclusive_after_btn = new WebDriverWait(driver, 30).
+ until(ExpectedConditions.elementToBeClickable(driver.findElement(By.id("include_pattern_after"))));
+ if (patternbefore){
+ inclusive_before_btn.click(); }
+ if(patternafter){
+ inclusive_after_btn.click(); }
+ }
+ //go on and upload the pdf file
+ private void UploadPDF() throws InterruptedException {
+ String filePath = System.getProperty("user.dir") +
+ "/src/test/pdf/Correspondence_FINAL_SBE_one-stop_plans_adopted_for_non-unanimous_countiespdf.pdf";
+ WebElement chooseFile = driver.findElement(By.id("file"));
+ chooseFile.sendKeys(filePath);
+ Thread.sleep(1000);
+ WebElement import_btn = driver.findElement(By.id("import_file"));
+ import_btn.click();
+ Thread.sleep(5000);
+ wait.until(ExpectedConditions.elementToBeClickable(By.id("templates_title")));
+ }
+ //delete the pdf file
+ private void DeletePDF(){
+ //navigates back and deletes the pdf utilized
+ driver.findElement(By.id("delete_pdf")).click();
+ driver.switchTo().alert().accept();
+ }
+ //instantiation of Tabula
+ @BeforeClass
+ public static void SetUp(){
+ //set up of chromedriver and navigation to the url, as well as uploading of the pdf file
+ System.setProperty("webdriver.chrome.driver","/usr/local/bin/chromedriver");
+ ChromeOptions options = new ChromeOptions();
+ options.addArguments("headless");
+ options.addArguments("no-sandbox");
+
+ driver = new ChromeDriver(options);
+ driver.get(Tabula_url);
+ driver.manage().window().maximize();
+ }
+ //test of 2 different instances of inputting regex to get a multi spanning table
+ @Test
+ public void TestMultiPageTables() {
+ try {
+ UploadPDF();
+ PageRefresh();
+ //Test of regex input with inclusive for pattern before for a table of 3 pages in length
+ PatternInputStrings("VIA", "Additional sites:");
+ InclusiveButtons(true, false);
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ //Confirm search found
+ String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'1')]")).getText();
+ Boolean regex_result;
+ if (result.equals("1")) {
+ regex_result = true;
+ } //if true, there are zero matches
+ else {
+ regex_result = false;
+ }
+ PreviewandExportDatapg();
+ //verify data extraction
+ String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'VIA ELECTRONIC MAIL')]")).getText();
+ Boolean regex_data;
+ if (result_data.equals("VIA ELECTRONIC MAIL")) {
+ regex_data = true;
+ } else {
+ regex_data = false;
+ }
+ String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'Sunday, October 30: 1:00 p.m. to 5:00 p.m.')]")).getText();
+ Boolean regex_data2;
+ if (result_data2.equals("Sunday, October 30: 1:00 p.m. to 5:00 p.m.")) {
+ regex_data2 = true;
+ } else {
+ regex_data2 = false;
+ }
+ Boolean final_results;
+ if (regex_result && regex_data && regex_data2) {
+ final_results = true;
+ } else {
+ final_results = false;
+ }
+ assertTrue("Failed, regex found no match for inclusive input for pattern before for a 3 page length table"
+ , final_results);
+ driver.navigate().refresh();
+ PageRefresh();
+
+ //Test of regex input with inclusive for pattern after for a table of 7 pages in length
+ PatternInputStrings("Bertie County", "Watauga County");
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ String result3 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'2')]")).getText();
+ Boolean regex_result3;
+ if (result3.equals("2")) {
+ regex_result3 = true;
+ } //if true, there are zero matches
+ else {
+ regex_result3 = false;
+ }
+ PreviewandExportDatapg();
+ String result_data5 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'Bladen County Board of Elections')]")).getText();
+ Boolean regex_data5;
+ if (result_data5.equals("Bladen County Board of Elections")) {
+ regex_data5 = true;
+ } else {
+ regex_data5 = false;
+ }
+ String result_data6 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'Page 7')]")).getText();
+ Boolean regex_data6;
+ if (result_data6.equals("Page 7")) {
+ regex_data6 = true;
+ } else {
+ regex_data6 = false;
+ }
+ Boolean final_results3;
+ if (regex_result3 && regex_data5 && regex_data6) {
+ final_results3 = true;
+ } else {
+ final_results3 = false;
+ }
+ assertTrue("Failed, Tabula found no match for a multi page table spanning more than 5 pages", final_results3);
+
+ driver.navigate().back();
+ driver.navigate().back();
+ Thread.sleep(500);
+ DeletePDF();
+ }catch (Exception e){
+ System.out.print(e);
+ }
+ }
+ //test of 3 different instances of inputting regex searches with 3 different types of inclusive combinations to
+ // get multiple regex results
+ @Test
+ public void TestInclusivePatternswithRegexSearches() {
+ try{
+ UploadPDF();
+ PageRefresh();
+
+ //Tests for inclusive for pattern before and non-inclusive for pattern after
+ PatternInputStrings("County","County");
+ InclusiveButtons(true, false);
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'33')]")).getText();
+ Boolean regex_result;
+ if(result.equals("33")){ regex_result = true;} //if true, there are zero matches
+ else{ regex_result = false;}
+ PreviewandExportDatapg();
+ String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'Nash County Board of Elections')]")).getText();
+ Boolean regex_data;
+ if(result_data.equals("Nash County Board of Elections")){ regex_data = true;}
+ else{ regex_data = false;}
+ Thread.sleep(600);
+ String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'Modifications:')]")).getText();
+ Boolean regex_data2;
+ if(result_data2.equals("Modifications:")){ regex_data2 = true;}
+ else{ regex_data2 = false;}
+ Boolean final_results;
+ if(regex_result && regex_data && regex_data2){ final_results = true;}
+ else{final_results = false;}
+ assertTrue("Failed, Tabula found no match for inclusive for pattern before and non-inclusive for " +
+ "pattern after", final_results);
+ driver.navigate().refresh();
+ PageRefresh();
+
+ //Tests for non-inclusive for pattern before and inclusive for pattern after
+ PatternInputStrings("Additional", "Plan");
+ InclusiveButtons(false, true);
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ String result2 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'2')]")).getText();
+ Boolean regex_result3;
+ if(result2.equals("2")){ regex_result3 = true;} //if true, there are zero matches
+ else{ regex_result3 = false;}
+ PreviewandExportDatapg();
+ String result_data3 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'Bladen County')]")).getText();
+ Boolean regex_data3;
+ if(result_data3.equals("Bladen County")){ regex_data3 = true;}
+ else{ regex_data3 = false;}
+ Thread.sleep(1000);
+ String result_data4 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'2016 General Election Early Voting Site Implementation Plans for Non-Unanimous Counties')]")).getText();
+ Boolean regex_data4;
+ if(result_data4.equals("2016 General Election Early Voting Site Implementation Plans for Non-Unanimous Counties")){ regex_data4 = true;}
+ else{ regex_data4 = false;}
+ Boolean final_results2;
+ if(regex_result3 && regex_data3 && regex_data4){ final_results2 = true;}
+ else{final_results2 = false;}
+ assertTrue("Failed, Tabula found no match for inclusive for pattern after and non-inclusive for " +
+ "pattern before", final_results2);
+ driver.navigate().refresh();
+ PageRefresh();
+
+ //Tests for inclusive for pattern before and for pattern after
+ PatternInputStrings("Plan:","Modifications:");
+ InclusiveButtons(true, true);
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ String result3 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'31')]")).getText();
+ Boolean regex_result4;
+ if(result3.equals("31")){ regex_result4 = true;} //if true, there are zero matches
+ else{ regex_result4 = false;}
+ PreviewandExportDatapg();
+ String result_data5 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'Plan:')]")).getText();
+ Boolean regex_data5;
+ if(result_data5.equals("Plan:")){ regex_data5 = true;}
+ else{ regex_data5 = false;}
+ Thread.sleep(700);
+ String result_data6 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'Modifications:')]")).getText();
+ Boolean regex_data6;
+ if(result_data6.equals("Modifications:")){ regex_data6 = true;}
+ else{ regex_data6 = false;}
+ Boolean final_results3;
+ if(regex_result4 && regex_data5 && regex_data6){ final_results3 = true;}
+ else{final_results3 = false;}
+ assertTrue("Failed, Tabula found no match for inclusive for pattern after and inclusive for " +
+ "pattern before", final_results3);
+ driver.navigate().back();
+ driver.navigate().back();
+ Thread.sleep(500);
+ DeletePDF();
+ }catch(Exception e){
+ System.out.print(e);
+ }
+ }
+ //test of an overlapping instance where it checks that there is only one regex result after attempting an overlap
+ @Test
+ public void TestOverlapRegexSearch() {
+ try{
+ //Test for overlapping regex searches
+ UploadPDF();
+ PageRefresh();
+
+ PatternInputStrings("Please contact", "Cc.:");
+ InclusiveButtons(true, false);
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ PatternInputStrings("Sincerely", "Kimberly");
+ InclusiveButtons(false, true);
+ ClickRegexButton();
+ Thread.sleep(5000);
+ driver.switchTo().alert().accept(); //accept error pop-up window
+ //Checks that there is only one regex result, since it shouldn't had allowed for 2 results to appear since the
+ // 2nd one causes an overlap
+ Thread.sleep(2000);
+ List regex_rows = driver.findElements(By.className("regex-result"));
+ int regex_count = regex_rows.size();
+ int regex_count1 = 1;
+ assertTrue("Failed, Tabula found more than one match for an overlap regex search", (regex_count1 == regex_count ));
+ PreviewandExportDatapg();
+ String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'Please contact me with any questions you may have.')]")).getText();
+ Boolean regex_data;
+ if (result_data.equals("Please contact me with any questions you may have.")) { regex_data = true;
+ } else { regex_data = false; }
+ String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'Executive Director, North Carolina State Board of Elections')]")).getText();
+ Boolean regex_data2;
+ if (result_data2.equals("Executive Director, North Carolina State Board of Elections")) { regex_data2 = true;
+ } else { regex_data2 = false; }
+ Boolean final_results;
+ if (regex_data && regex_data2) { final_results = true;
+ } else { final_results = false; }
+ assertTrue("Failed, Tabula found no match for the multi-page table", final_results);
+ driver.navigate().back();
+ driver.navigate().back();
+ Thread.sleep(500);
+ DeletePDF();
+ }catch (Exception e){
+ System.out.print(e);
+ }
+ }
+ @AfterClass
+ public static void TearDown(){
+ driver.quit();
+ }
+}
diff --git a/src/test/java/TestEU_002.java b/src/test/java/TestEU_002.java
new file mode 100644
index 000000000..8e905df8d
--- /dev/null
+++ b/src/test/java/TestEU_002.java
@@ -0,0 +1,762 @@
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.chrome.ChromeOptions;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import static junit.framework.TestCase.assertTrue;
+import static org.junit.Assert.assertFalse;
+
+//Test of the eu_002 pdf file, it will go through various user scenarios to test the functionality of the regex
+// implementation (spanning pages, multiple search results, inclusive and non-inclusive, and overlap)
+// @author SM modified: 4/28/18
+
+public class TestEU_002 {
+ private static WebDriver driver;
+ private static String Tabula_url = "http://127.0.0.1:9292/";
+ private WebDriverWait wait = new WebDriverWait(driver, 500);
+
+ //will continue to refresh the page until it sees one of the buttons appear inthe menu option of the extraction page
+ private void PageRefresh() throws InterruptedException {
+ //menu options did not fully load
+ Thread.sleep(1000);
+ //refresh the page
+ while(driver.findElements( By.id("restore-detected-tables")).size() == 0) {
+ driver.navigate().refresh();
+ Thread.sleep(700);
+ }
+ }
+ //will navigate and wait for the data to appear in the preview and export data page
+ private void PreviewandExportDatapg(){
+ By previewandexport_id = By.id("all-data");
+ WebElement previewandexport_button = wait.until(ExpectedConditions.visibilityOfElementLocated(previewandexport_id));
+ previewandexport_button.click();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("detection-row")));
+ }
+ //will wait for the regex button to become clickable and then click the regex button
+ private void ClickRegexButton() throws InterruptedException {
+ By regex_search_id = By.id("regex-search");
+ WebElement regex_button = new WebDriverWait(driver, 30).until(ExpectedConditions.elementToBeClickable(regex_search_id));
+ regex_button.click();
+ Thread.sleep(800);
+ }
+ //send regex inputs to the corresponding pattern type
+ private void PatternInputStrings(String pattern_before, String pattern_after){
+ By pattern_before_input = By.id("pattern_before");
+ By pattern_after_input = By.id("pattern_after");
+ driver.findElement(pattern_before_input).sendKeys(pattern_before);
+ driver.findElement(pattern_after_input).sendKeys(pattern_after);
+ }
+ //send corresponding info of inclusive to the pattern type
+ private void InclusiveButtons(boolean patternbefore, boolean patternafter){
+ WebElement inclusive_before_btn = new WebDriverWait(driver, 30).
+ until(ExpectedConditions.elementToBeClickable(driver.findElement(By.id("include_pattern_before"))));
+ WebElement inclusive_after_btn = new WebDriverWait(driver, 30).
+ until(ExpectedConditions.elementToBeClickable(driver.findElement(By.id("include_pattern_after"))));
+ if (patternbefore){
+ inclusive_before_btn.click();
+ }
+
+ if(patternafter){
+ inclusive_after_btn.click();
+ }
+ }
+ //go on and upload the pdf file
+ private void UploadPDF() throws InterruptedException {
+ String filePath = System.getProperty("user.dir") + "/src/test/pdf/eu-002.pdf";
+ WebElement chooseFile = driver.findElement(By.id("file"));
+ chooseFile.sendKeys(filePath);
+ Thread.sleep(1000);
+ WebElement import_btn = driver.findElement(By.id("import_file"));
+ import_btn.click();
+ Thread.sleep(5000);
+ wait.until(ExpectedConditions.elementToBeClickable(By.id("restore-detected-tables")));
+ }
+ //delete the pdf file
+ private void DeletePDF(){
+ //navigates back and deletes the pdf utilized
+ driver.findElement(By.id("delete_pdf")).click();
+ driver.switchTo().alert().accept();
+ }
+ //instantiation of Tabula
+ @BeforeClass
+ public static void SetUp(){
+ System.setProperty("webdriver.chrome.driver","/usr/local/bin/chromedriver");
+ ChromeOptions options = new ChromeOptions();
+ options.addArguments("headless");
+ options.addArguments("no-sandbox");
+
+ //set up of chromdriver and navigation to the url, as well as uploading of the pdf file
+ driver = new ChromeDriver(options);
+ driver.get(Tabula_url);
+ driver.manage().window().maximize();
+
+ }
+ //test for 2 different cases of only filling one of the regex inputs and checking that it didn't enable the regex button
+ @Test
+ public void TestHalfRegexInputsforPatternBeforeandPatternAfter(){
+ try {
+ UploadPDF();
+ PageRefresh();
+
+ //Test that checks that the regex search button is disabled after entering "Table 5" in pattern_before and
+ // clicking the regex search button
+ By pattern_before_input = By.id("pattern_before");
+ driver.findElement(pattern_before_input).sendKeys("Chart 4");
+ By regex_search_id = By.id("regex-search");
+ Thread.sleep(600);
+ assertFalse("Failed, regex search button is enabled", driver.findElement(regex_search_id).isEnabled());
+ driver.findElement(pattern_before_input).clear();
+ driver.navigate().refresh();
+ PageRefresh();
+
+ //Test that checks that the regex search button is disabled after entering "Table 6" in pattern_after and
+ // clicking the regex search button
+ By pattern_after_input = By.id("pattern_after");
+ driver.findElement(pattern_after_input).sendKeys("Chart 5");
+ By regex_search_id2 = By.id("regex-search");
+ Thread.sleep(600);
+ assertFalse("Failed, regex search button is enabled", driver.findElement(regex_search_id2).isEnabled());
+ driver.findElement(pattern_after_input).clear();
+
+ driver.navigate().back();
+ Thread.sleep(500);
+ DeletePDF();
+
+ } catch (Exception e) {
+ System.out.print(e);
+ }
+ }
+ //Test of 3 different instances of either one of the inputs being wrong or both of the inputs being wrong and
+ // checking that it gave a regex result of zero
+ @Test
+ public void TestWrongInputsforBeforePatternandAfterPattern(){
+ try{
+ UploadPDF();
+ PageRefresh();
+ //Test that inputs an incorrect input for pattern before and incorrect input for pattern after
+ PatternInputStrings("ksgjlk", "fgfsgs");
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'0')]")).getText();
+ Boolean regex_result;
+ if(result.equals("0")){ regex_result = true;} //if true, there are zero matches
+ else{ regex_result = false;}
+ assertTrue("Failed, Tabula found a match for incorrect inputs for pattern before and pattern after",
+ regex_result);
+ driver.navigate().refresh();
+ PageRefresh();
+
+ //Test inputs correct input for pattern after and incorrect input for pattern before
+ PatternInputStrings("jflaksl","Table 6" );
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ String result2 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'0')]")).getText();
+ Boolean regex_result2;
+ if(result2.equals("0")){ regex_result2 = true;} //if true, there are zero matches
+ else{ regex_result2 = false;}
+ assertTrue("Failed, Tabula found a match for a correct input for pattern after and incorrect input for " +
+ "pattern before", regex_result2);
+ driver.navigate().refresh();
+ PageRefresh();
+
+ //Test inputs incorrect input for pattern after and correct input for pattern before
+ PatternInputStrings("Table 5","glslkgf");
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ String result3 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'0')]")).getText();
+ Boolean regex_result3;
+ if(result3.equals("0")){ regex_result3 = true;} //if true, there are zero matches
+ else{ regex_result3 = false;}
+ assertTrue("Failed, Tabula found a match for incorrect input for pattern after and correct input for" +
+ " pattern before", regex_result3);
+
+ driver.navigate().back();
+ Thread.sleep(500);
+ DeletePDF();
+ }
+ catch(Exception e){
+ System.out.print(e);
+ }
+ }
+ //test of 3 different instances of inputting the same word for both regex inputs for one or the other or for both inputs
+ @Test
+ public void TestCommonWordInputforPatternBeforeandPatternAfter(){
+ try{
+ UploadPDF();
+ PageRefresh();
+
+ //Tests pattern before and pattern after with a common input found in the pdf
+ PatternInputStrings("Impacts", "Impacts");
+ ClickRegexButton();
+ Thread.sleep(1000);
+ PageRefresh();
+ //confirmation of data picked and number of results from the regex results table in the extraction page
+ Thread.sleep(600);
+ String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'1')]")).getText();
+ Boolean regex_result;
+ if(result.equals("1")){ regex_result = true;} //if true, there are zero matches
+ else{ regex_result = false;}
+ PreviewandExportDatapg();
+ String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'Knowledge')]"))
+ .getText();
+ Boolean regex_data;
+ if(result_data.equals("Knowledge and awareness of different cultures")){ regex_data = true;}
+ else{ regex_data = false;}
+ Thread.sleep(600);
+ String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'Self')]")).getText();
+ Boolean regex_data2;
+ if(result_data2.equals("Self competence")){ regex_data2 = true;}
+ else{ regex_data2 = false;}
+ Boolean final_results;
+ if(regex_result && regex_data && regex_data2){ final_results = true;}
+ else{final_results = false;}
+ assertTrue("Failed, Tabula found no match/correct match for a common input found in the pdf for both " +
+ "pattern before and pattern after",
+ final_results);
+ driver.navigate().back();
+ Thread.sleep(500);
+
+ driver.navigate().refresh();
+ PageRefresh();
+
+ //Tests pattern before with a common input found in the pdf and pattern after with a correct input
+ PatternInputStrings("Impacts", "Impacts on participating teachers");
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ String result2 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'1')]")).getText();
+ Boolean regex_result2;
+ if(result2.equals("1")){ regex_result2 = true;}
+ else{ regex_result2 = false;}
+ PreviewandExportDatapg();
+ String result_data3 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'Knowledge')]")).getText();
+ Boolean regex_data3;
+ if(result_data3.equals("Knowledge and awareness of different cultures")){ regex_data3 = true;}
+ else{ regex_data3 = false;}
+ Thread.sleep(600);
+ String result_data4 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'Self')]")).getText();
+ Boolean regex_data4;
+ if(result_data4.equals("Self competence")){ regex_data4 = true;}
+ else{ regex_data4 = false;}
+ Boolean final_results2;
+ if(regex_result2 && regex_data3 && regex_data4){ final_results2 = true;}
+ else{final_results2 = false;}
+ assertTrue("Failed, Tabula found no match/correct match for a common input for pattern before and " +
+ "correct input for pattern after", final_results2);
+ driver.navigate().refresh();
+ PageRefresh();
+
+ //Tests pattern before with a correct input and pattern after with a common input found in the pdf
+ PatternInputStrings("Impacts on participating pupils","Impacts");
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ String result3 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'1')]")).getText();
+ Boolean regex_result3;
+ if(result3.equals("1")){ regex_result3 = true;} //if true, there are zero matches
+ else{ regex_result3 = false;}
+ PreviewandExportDatapg();
+ String result_data5 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'Knowledge')]")).getText();
+ Boolean regex_data5;
+ if(result_data5.equals("Knowledge and awareness of different cultures")){ regex_data5 = true;}
+ else{ regex_data5 = false;}
+ Thread.sleep(600);
+ String result_data6 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'Self')]")).getText();
+ Boolean regex_data6;
+ if(result_data6.equals("Self competence")){ regex_data6 = true;}
+ else{ regex_data6 = false;}
+ Boolean final_results3;
+ if(regex_result3 && regex_data5 && regex_data6){ final_results3 = true;}
+ else{final_results3 = false;}
+ assertTrue("Failed, Tabula found no match/correct match for a common input for pattern after and " +
+ "correct input for pattern after", final_results3);
+
+ driver.navigate().back();
+ driver.navigate().back();
+ Thread.sleep(500);
+ DeletePDF();
+ }catch(Exception e){
+ System.out.print(e);
+ }
+ }
+ //test of 3 different instances for including inclusiveness for one or the other or for both inputs
+ @Test
+ public void TestInclusiveInputsforPatternBeforeandPatternAfter() {
+ try{
+ UploadPDF();
+ PageRefresh();
+
+ //Tests for inclusive for pattern before and non-inclusive for pattern after
+ PatternInputStrings("European/International","International");
+ InclusiveButtons(true, false);
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'1')]")).getText();
+ Boolean regex_result;
+ if(result.equals("1")){ regex_result = true;} //if true, there are zero matches
+ else{ regex_result = false;}
+ PreviewandExportDatapg();
+ String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'European/International')]")).getText();
+ Boolean regex_data;
+ if(result_data.equals("European/International dimension of the")){ regex_data = true;}
+ else{ regex_data = false;}
+ Thread.sleep(600);
+ String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'day')]")).getText();
+ Boolean regex_data2;
+ if(result_data2.equals("day school-life")){ regex_data2 = true;}
+ else{ regex_data2 = false;}
+ Boolean final_results;
+ if(regex_result && regex_data && regex_data2){ final_results = true;}
+ else{final_results = false;}
+ assertTrue("Failed, Tabula found no match for inclusive for pattern before and non-inclusive for " +
+ "pattern after", final_results);
+ driver.navigate().refresh();
+ PageRefresh();
+
+ //Tests for non-inclusive for pattern before and inclusive for pattern after
+ PatternInputStrings("European/International", "International");
+ InclusiveButtons(false, true);
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ String result2 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'1')]")).getText();
+ Boolean regex_result3;
+ if(result2.equals("1")){ regex_result3 = true;} //if true, there are zero matches
+ else{ regex_result3 = false;}
+ PreviewandExportDatapg();
+ String result_data3 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'school')]")).getText();
+ Boolean regex_data3;
+ if(result_data3.equals("school")){ regex_data3 = true;}
+ else{ regex_data3 = false;}
+ Thread.sleep(600);
+ String result_data4 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'International')]")).getText();
+ Boolean regex_data4;
+ if(result_data4.equals("International mobility of pupils")){ regex_data4 = true;}
+ else{ regex_data4 = false;}
+ Boolean final_results2;
+ if(regex_result3 && regex_data3 && regex_data4){ final_results2 = true;}
+ else{final_results2 = false;}
+ assertTrue("Failed, Tabula found no match for inclusive for pattern after and non-inclusive for " +
+ "pattern before", final_results2);
+ driver.navigate().refresh();
+ PageRefresh();
+
+ //Tests for inclusive for pattern before and for pattern after
+ PatternInputStrings("European/International","Training");
+ InclusiveButtons(true, true);
+ Thread.sleep(500);
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ String result3 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'1')]")).getText();
+ Boolean regex_result4;
+ if(result3.equals("1")){ regex_result4 = true;} //if true, there are zero matches
+ else{ regex_result4 = false;}
+ PreviewandExportDatapg();
+ String result_data5 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'European/International')]")).getText();
+ Boolean regex_data5;
+ if(result_data5.equals("European/International dimension of the")){ regex_data5 = true;}
+ else{ regex_data5 = false;}
+ Thread.sleep(600);
+ String result_data6 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'Training')]"))
+ .getText();
+ Boolean regex_data6;
+ if(result_data6.equals("Training of teachers")){ regex_data6 = true;}
+ else{ regex_data6 = false;}
+ Boolean final_results3;
+ if(regex_result4 && regex_data5 && regex_data6){ final_results3 = true;}
+ else{final_results3 = false;}
+ assertTrue("Failed, Tabula found no match for inclusive for pattern after and inclusive for " +
+ "pattern before", final_results3);
+ driver.navigate().back();
+ driver.navigate().back();
+ Thread.sleep(500);
+ DeletePDF();
+ }catch(Exception e){
+ System.out.print(e);
+ }
+ }
+ //test of 3 instances where one or the other or both instances are inputted a correct input but with the wrong or
+ // right cause sensitivity
+ @Test
+ public void TestCaseSensitivity(){
+ try {
+ UploadPDF();
+ PageRefresh();
+
+ //Test case sensitive input for pattern before and correct input for pattern after
+ PatternInputStrings("knowledge and awareness", "Self competence");
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'0')]")).getText();
+ //check that there is 0 results in the regex table
+ Boolean regex_result;
+ if (result.equals("0")) {
+ regex_result = true;
+ } //if true, there are zero matches
+ else {
+ regex_result = false;
+ }
+ assertTrue("Failed, Tabula found a match for a case-sensitive search of pattern before",
+ regex_result);
+ driver.navigate().refresh();
+ PageRefresh();
+
+ //Test case sensitive input for pattern after and correct input for pattern before
+ PatternInputStrings("Knowledge and awareness", "self competence");
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+
+ String result2 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'0')]")).getText();
+ //check that there is 0 results in the regex table
+ Boolean regex_result2;
+ if (result2.equals("0")) {
+ regex_result2 = true;
+ } //if true, there are zero matches
+ else {
+ regex_result2 = false;
+ }
+ assertTrue("Failed, Tabula found a match for a case-sensitive search of pattern after",
+ regex_result2);
+ driver.navigate().refresh();
+ PageRefresh();
+
+ //Test case sensitive input for both pattern before and pattern after
+ PatternInputStrings("knowledge and awareness", "self competence");
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ String result3 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'0')]")).getText();
+ //check that there is 0 results in the regex table
+ Boolean regex_result3;
+ if (result3.equals("0")) {
+ regex_result3 = true;
+ } //if true, there are zero matches
+ else {
+ regex_result3 = false;
+ }
+ assertTrue("Failed, Tabula found a match for a case-sensitive search of pattern after and pattern before",
+ regex_result3);
+ driver.navigate().back();
+ Thread.sleep(500);
+ DeletePDF();
+ }catch(Exception e){
+ System.out.print(e);
+ }
+ }
+ //test of getting the text based image to display it's data in a linear form
+ @Test
+ public void TestTextBasedImage(){
+ try {
+ UploadPDF();
+ PageRefresh();
+
+ //Test to get only the text-based image to appear in the preview and export data page
+ PatternInputStrings("satisfied", "Question");
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+
+ String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'1')]")).getText();
+ Boolean regex_result;
+ if (result.equals("1")) { regex_result = true; } //if true, there are zero matches
+ else { regex_result = false; }
+ PreviewandExportDatapg();
+ String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'Total')]")).getText();
+ Boolean regex_data;
+ if (result_data.equals("Total")) { regex_data = true; }
+ else { regex_data = false; }
+ Thread.sleep(600);
+ String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'EU-25/EFTA: Middle')]")).getText();
+ Boolean regex_data2;
+ if (result_data2.equals("EU-25/EFTA: Middle (AT, BE, DE, LI, LU, NL)")) {
+ regex_data2 = true; }
+ else { regex_data2 = false; }
+ Boolean final_results;
+ if (regex_result && regex_data && regex_data2) { final_results = true; }
+ else { final_results = false; }
+ assertTrue("Failed, Tabula could not find the text-based image", final_results);
+
+ driver.navigate().back();
+ driver.navigate().back();
+ Thread.sleep(500);
+ DeletePDF();
+ }catch (Exception e){
+ System.out.print(e);
+ }
+ }
+ //test of two instances trying to get a horizontal table to appear
+ @Test
+ public void TestHorizontalTable(){
+ try {
+ UploadPDF();
+ PageRefresh();
+ //Test for vertical table
+ PatternInputStrings("Preperation", "Presentation");
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+
+ String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'0')]")).getText();
+ Boolean regex_result;
+ if (result.equals("0")) {
+ regex_result = true;
+ } //if true, there are zero matches
+ else {
+ regex_result = false;
+ }
+ assertTrue("Failed, Tabula found a match for a vertical table",
+ regex_result);
+ driver.navigate().refresh();
+
+ //Test of a different vertical table
+ PageRefresh();
+ PatternInputStrings("Impacts", "Lack of interest");
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ String result2 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'0')]")).getText();
+ Boolean regex_result2;
+ if (result2.equals("0")) {
+ regex_result2 = true;
+ } //if true, there are zero matches
+ else {
+ regex_result2 = false;
+ }
+ assertTrue("Failed, Tabula found a match for a vertical table",
+ regex_result2);
+ driver.navigate().back();
+ Thread.sleep(500);
+ DeletePDF();
+ }catch (Exception e){
+ System.out.print(e);
+ }
+ }
+ //test of two instances to get multiple regex results
+ @Test
+ public void TestMultipleRegexSearches(){
+ try {
+ //Tests for 2 regex search results
+ UploadPDF();
+ PageRefresh();
+
+ PatternInputStrings("Impacts", "Knowledge");
+ InclusiveButtons(true, true);
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+
+ String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'2')]")).getText();
+ Boolean regex_result;
+ if (result.equals("2")) {
+ regex_result = true;
+ } //if true, there are 2 matches
+ else {
+ regex_result = false;
+ }
+ PreviewandExportDatapg();
+ String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'Impacts on participating pupils')]")).getText();
+ Boolean regex_data;
+ if (result_data.equals("Impacts on participating pupils")) {
+ regex_data = true;
+ } else {
+ regex_data = false;
+ }
+ Thread.sleep(600);
+ String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'Knowledge/appreciation of school')]")).getText();
+ Boolean regex_data2;
+ if (result_data2.equals("Knowledge/appreciation of school system and")) {
+ regex_data2 = true;
+ } else {
+ regex_data2 = false;
+ }
+ Boolean final_results;
+ if (regex_result && regex_data && regex_data2) {
+ final_results = true;
+ } else {
+ final_results = false;
+ }
+ Thread.sleep(500);
+ assertTrue("Failed, Tabula didn't find the 2 regex matches", final_results);
+ driver.navigate().refresh();
+
+ //Test for 3 regex search results
+ PageRefresh();
+ PatternInputStrings("Knowledge", "Foreign");
+ InclusiveButtons(true, true);
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+
+ String result2 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'3')]")).getText();
+ Boolean regex_result3;
+ if (result2.equals("3")) {
+ regex_result3 = true;
+ } //if true, there are 3 matches
+ else {
+ regex_result3 = false;
+ }
+ PreviewandExportDatapg();
+ String result_data3 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'Knowledge and awareness')]")).getText();
+ Boolean regex_data3;
+ if (result_data3.equals("Knowledge and awareness of different cultures")) {
+ regex_data3 = true;
+ } else {
+ regex_data3 = false;
+ }
+ Thread.sleep(600);
+ String result_data4 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'Foreign language')]")).getText();
+ Boolean regex_data4;
+ if (result_data4.equals("Foreign language competence")) {
+ regex_data4 = true;
+ } else {
+ regex_data4 = false;
+ }
+ Boolean final_results2;
+ if (regex_result3 && regex_data3 && regex_data4) {
+ final_results2 = true;
+ } else {
+ final_results2 = false;
+ }
+ Thread.sleep(500);
+ assertTrue("Failed, Tabula didn't find the 3 regex matches", final_results2);
+ driver.navigate().back();
+ Thread.sleep(500);
+ driver.navigate().back();
+ Thread.sleep(500);
+ DeletePDF();
+ }catch (Exception e){
+ System.out.print(e);
+ }
+ }
+ //test of a multipage spanning table
+ @Test
+ public void TestMultiPageTables(){
+ try {
+ //Test for a multi spanning page (2 page table)
+ UploadPDF();
+ PageRefresh();
+
+ PatternInputStrings("Table 5", "Question 4.9");
+ InclusiveButtons(false, true);
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'1')]")).getText();
+ Boolean regex_result;
+ if (result.equals("1")) {
+ regex_result = true;
+ } //if true, there is 1 match
+ else {
+ regex_result = false;
+ }
+ PreviewandExportDatapg();
+ String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'Correlations')]")).getText();
+ Boolean regex_data;
+ if (result_data.equals("Correlations between the extent of participation of pupils in project activities and the")) {
+ regex_data = true;
+ } else {
+ regex_data = false;
+ }
+ String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'Question')]")).getText();
+ Boolean regex_data2;
+ if (result_data2.equals("Question 4.9: Overall, how satisfied are you with the outcomes and impacts of " +
+ "the Comenius project?")) {
+ regex_data2 = true;
+ } else {
+ regex_data2 = false;
+ }
+ Boolean final_results;
+ if (regex_result && regex_data && regex_data2) {
+ final_results = true;
+ } else {
+ final_results = false;
+ }
+ assertTrue("Failed, Tabula found no match for the multi-page table", final_results);
+
+ driver.navigate().back();
+ driver.navigate().back();
+ Thread.sleep(500);
+ DeletePDF();
+ }catch (Exception e){
+ System.out.print(e);
+ }
+ }
+ //test of an overlap attempt, and then checking that overlap was detected
+ @Test
+ public void TestOverlapRegexSearch() {
+ try{
+ //Test for overlapping regex searches
+ UploadPDF();
+ PageRefresh();
+
+ PatternInputStrings("Table 5", "Impacts on");
+ ClickRegexButton();
+ Thread.sleep(600);
+ PatternInputStrings("Table 6", "School climate");
+ InclusiveButtons(false, true);
+ ClickRegexButton();
+ Thread.sleep(600);
+ driver.switchTo().alert().accept(); //accept error pop-up window
+ //Checks that there is only one regex result, since it shouldn't had allowed for 2 results to appear since the
+ // 2nd one causes an overlap
+ String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'1')]")).getText();
+ Boolean regex_result;
+ if(result.equals("1")){ regex_result = true;} //if true, there are zero matches
+ else{ regex_result = false;}
+ assertTrue("Failed, Tabula found found more than one match for an overlap regex search",
+ regex_result);
+
+ driver.navigate().back();
+ Thread.sleep(500);
+ DeletePDF();
+ }catch (Exception e){
+ System.out.print(e);
+ }
+ }
+ //test checking duplication of inputting the same regex searches twice to see if it will caught it
+ @Test
+ public void TestDuplicateOverlapRegexSearch(){
+ try {
+ //Test for a duplicate overlapping regex search
+ UploadPDF();
+ PageRefresh();
+ PatternInputStrings("Table 5", "Table 6");
+ InclusiveButtons(true, true);
+ ClickRegexButton();
+ Thread.sleep(600);
+ PatternInputStrings("Table 5", "Table 6");
+ InclusiveButtons(true, true);
+ ClickRegexButton();
+ Thread.sleep(600);
+ driver.switchTo().alert().accept(); //accept error pop-up window
+ //Checks that there is only one regex result, since it shouldn't had allowed for 2 results to appear since the
+ // 2nd one causes a duplicate overlap
+ String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'1')]")).getText();
+ Boolean regex_result;
+ if (result.equals("1")) {
+ regex_result = true;
+ } //if true, there are zero matches
+ else {
+ regex_result = false;
+ }
+ assertTrue("Failed, Tabula found more than one match for a duplicate overlap regex search",
+ regex_result);
+
+ driver.navigate().back();
+ Thread.sleep(500);
+ DeletePDF();
+ }catch (Exception e){
+ System.out.print(e);
+ }
+ }
+ @AfterClass
+ public static void TearDown(){
+ driver.quit();
+ }
+}
diff --git a/src/test/java/TestExtractionPage.java b/src/test/java/TestExtractionPage.java
new file mode 100644
index 000000000..ccb232cc7
--- /dev/null
+++ b/src/test/java/TestExtractionPage.java
@@ -0,0 +1,125 @@
+import org.junit.After;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.chrome.ChromeOptions;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+import java.util.concurrent.TimeUnit;
+import static junit.framework.TestCase.assertFalse;
+import static junit.framework.TestCase.assertTrue;
+
+//Test of Tabula's extraction page, which incorporates the template, pdf outline, and regex buttons, as well as
+// the regex tabs. Prior and after each button is clicked, it checks if the element is present or not on the page.
+// What it doesn't test are the individual URL links in the regex tabs, since those same links are already tested in
+// the TestHelpPage and TestHomePage test cases, as well as the Autodetect Tables button and the Preview & Export Data
+// button are not tested since their functionality will be tested in other test cases.
+// For this test case, eu_002.pdf is utilized.
+// @author SM modified: 3/6/18
+public class TestExtractionPage {
+ WebDriver driver;
+ private void PageRefresh() throws InterruptedException {
+ //menu options did not fully load
+ Thread.sleep(1000);
+ //refresh the page
+ while(driver.findElements( By.id("restore-detected-tables")).size() == 0) {
+ driver.navigate().refresh();
+ Thread.sleep(700);
+ }
+ }
+
+ @Test
+ public void startWebDriver() throws InterruptedException{
+ System.setProperty("webdriver.chrome.driver","/usr/local/bin/chromedriver");
+ ChromeOptions options = new ChromeOptions();
+ options.addArguments("headless");
+ options.addArguments("no-sandbox");
+
+ driver = new ChromeDriver(options);
+ driver.get("http://127.0.0.1:9292/");
+ driver.manage().window().maximize();
+ WebDriverWait wait = new WebDriverWait(driver, 200);
+ String filePath = System.getProperty("user.dir") + "/src/test/pdf/eu-002.pdf";
+ WebElement chooseFile = driver.findElement(By.id("file"));
+ chooseFile.sendKeys(filePath);
+ Thread.sleep(1000);
+ WebElement import_btn = driver.findElement(By.id("import_file"));
+ import_btn.click();
+ try{
+ //navigates to the extraction page and checks that it is in the extraction page
+ By extract_name = By.linkText("Extract Data");
+ WebElement extract_button = wait.until(ExpectedConditions.elementToBeClickable(extract_name));
+ extract_button.click();
+ driver.manage().timeouts().pageLoadTimeout(300, TimeUnit.SECONDS);
+
+ //menu options did not fully load
+ PageRefresh();
+
+ String regex_options_string = "Regex Options";
+ By regex_options_title = By.id("regex_options_title");
+ WebElement regex_options = wait.until(ExpectedConditions.elementToBeClickable(regex_options_title));
+ driver.manage().timeouts().pageLoadTimeout(200, TimeUnit.SECONDS);
+ assertTrue("Failed, couldn't find Extraction page", regex_options_string.equals(regex_options.getText()));
+ //checking that the PDF outline sidebar is visible
+ By sidebar_title = By.id("sidebar");
+ driver.manage().timeouts().pageLoadTimeout(150, TimeUnit.SECONDS);
+ assertTrue("PDF sidebar is not visible in Extraction page", driver.findElement(sidebar_title).isDisplayed());
+ //clicking PDF outline button and checking if sidebar is not visible
+ By pdf_outline_id = By.id("pdf_outline_title");
+ WebElement pdf_outline_button = wait.until(ExpectedConditions.elementToBeClickable(pdf_outline_id));
+ pdf_outline_button.click();
+ By sidebar_check = By.id("sidebar");
+ driver.manage().timeouts().pageLoadTimeout(150, TimeUnit.SECONDS);
+ assertFalse("PDF sidebar is visible in Extraction page", driver.findElement(sidebar_check).isDisplayed());
+
+ //Checks regex Options bar is visible via text
+ By regex_command_title = By.id("regex_command_title");
+ WebElement regex_command = wait.until(ExpectedConditions.elementToBeClickable(regex_command_title));
+ String regex_command_string = "Regex Command";
+ driver.manage().timeouts().pageLoadTimeout(150, TimeUnit.SECONDS);
+ assertTrue("Regex Options sidebar is not visible in Extraction page", regex_command_string.equals(regex_command.getText()));
+
+ //Click on regex options button and check if regex options bar/regex guide tab is now invisible
+ By regex_guide_name = By.className("regex-guide");
+ WebElement regex_guide_tab = wait.until(ExpectedConditions.elementToBeClickable(regex_guide_name));
+ regex_guide_tab.click();
+ By regex_guide_id = By.id("regex_guide");
+ WebElement regex_guide = wait.until(ExpectedConditions.elementToBeClickable(regex_guide_id));
+ String regex_guide_string = "Regex Guide";
+ driver.manage().timeouts().pageLoadTimeout(150, TimeUnit.SECONDS);
+ assertTrue("Regex Guide tab is not visible in Extraction page", regex_guide_string.equals(regex_guide.getText()));
+ By regex_options_ttle = By.id("regex_options_title");
+ WebElement regex_options_button = wait.until(ExpectedConditions.elementToBeClickable(regex_options_ttle));
+ regex_options_button.click();
+ driver.manage().timeouts().pageLoadTimeout(150, TimeUnit.SECONDS);
+ assertFalse("Regex Options sidebar is visible in Extraction page", regex_command_string.equals(regex_command.getText()));
+
+ //waits for the templates button and then clicks on it, and checks that the templates content appears
+ driver.manage().timeouts().pageLoadTimeout(150, TimeUnit.SECONDS);
+ By templates_name = By.id("templates_title");
+ WebElement templates_button = wait.until(ExpectedConditions.elementToBeClickable(templates_name));
+ templates_button.click();
+ String templates_list_string = "Load templates:";
+ By templates_list_title = By.id("loaded_templates_title");
+ WebElement templates_list = wait.until(ExpectedConditions.elementToBeClickable(templates_list_title));
+ driver.manage().timeouts().pageLoadTimeout(150, TimeUnit.SECONDS);
+ assertTrue("Failed, couldn't find Templates List in Extraction page", templates_list_string.equals(templates_list.getText()));
+
+ //navigates back and deletes the pdf utilized
+ driver.navigate().back();
+ By delete_pdf = By.id("delete_pdf");
+ WebElement delete_btn = wait.until(ExpectedConditions.elementToBeClickable(delete_pdf));
+ delete_btn.click();
+ driver.switchTo().alert().accept();
+
+ }catch(Exception e){
+ System.out.print(e);
+ }
+ }
+ @After
+ public void TearDown(){
+ driver.quit();
+ }
+}
diff --git a/src/test/java/TestFeb_9_2016.java b/src/test/java/TestFeb_9_2016.java
new file mode 100644
index 000000000..17c7143e4
--- /dev/null
+++ b/src/test/java/TestFeb_9_2016.java
@@ -0,0 +1,299 @@
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.chrome.ChromeOptions;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import java.util.List;
+
+import static junit.framework.TestCase.assertTrue;
+//Test of the Feb_9_2016 pdf file, it will go through various user scenarios to test the functionality of the regex
+// implementation (spanning pages, multiple search results, inclusive and non-inclusive, and overlap)
+// @author SM modified: 4/28/18
+
+public class TestFeb_9_2016 {
+ //Test of the Feb_9_2016 pdf file.
+ private static WebDriver driver;
+ private static String Tabula_url = "http://127.0.0.1:9292/";
+ private WebDriverWait wait = new WebDriverWait(driver, 500);
+
+ //will continue to refresh the page until it sees one of the buttons appear in the menu option of the extraction page
+ private void PageRefresh() throws InterruptedException {
+ //menu options did not fully load
+ Thread.sleep(1000);
+ //refresh the page
+ while(driver.findElements( By.id("restore-detected-tables")).size() == 0) {
+ driver.navigate().refresh();
+ Thread.sleep(700);
+ }
+ }
+ //will navigate and wait for the data to appear in the preview and export data page
+ private void PreviewandExportDatapg(){
+ By previewandexport_id = By.id("all-data");
+ WebElement previewandexport_button = wait.until(ExpectedConditions.visibilityOfElementLocated(previewandexport_id));
+ previewandexport_button.click();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("detection-row")));
+ }
+ //will wait for the regex button to become clickable and then click the regex button
+ private void ClickRegexButton() throws InterruptedException {
+ By regex_search_id = By.id("regex-search");
+ WebElement regex_button = new WebDriverWait(driver, 30).until(ExpectedConditions.
+ elementToBeClickable(regex_search_id));
+ regex_button.click();
+ Thread.sleep(800);
+ }
+ //send regex inputs to the corresponding pattern type
+ private void PatternInputStrings(String pattern_before, String pattern_after){
+ By pattern_before_input = By.id("pattern_before");
+ By pattern_after_input = By.id("pattern_after");
+ driver.findElement(pattern_before_input).sendKeys(pattern_before);
+ driver.findElement(pattern_after_input).sendKeys(pattern_after);
+ }
+ //send corresponding info of inclusive to the pattern type
+ private void InclusiveButtons(boolean patternbefore, boolean patternafter){
+ WebElement inclusive_before_btn = new WebDriverWait(driver, 30).
+ until(ExpectedConditions.elementToBeClickable(driver.findElement(By.id("include_pattern_before"))));
+ WebElement inclusive_after_btn = new WebDriverWait(driver, 30).
+ until(ExpectedConditions.elementToBeClickable(driver.findElement(By.id("include_pattern_after"))));
+ if (patternbefore){
+ inclusive_before_btn.click(); }
+ if(patternafter){
+ inclusive_after_btn.click(); }
+ }
+ //go on and upload the pdf file
+ private void UploadPDF() throws InterruptedException {
+ String filePath = System.getProperty("user.dir") + "/src/test/pdf/Feb_9,_2016_1_4700_PM_ESTRE_Voters.pdf";
+ WebElement chooseFile = driver.findElement(By.id("file"));
+ chooseFile.sendKeys(filePath);
+ Thread.sleep(1000);
+ WebElement import_btn = driver.findElement(By.id("import_file"));
+ import_btn.click();
+ Thread.sleep(5000);
+ wait.until(ExpectedConditions.elementToBeClickable(By.id("templates_title")));
+ }
+ //delete the pdf file
+ private void DeletePDF(){
+ //navigates back and deletes the pdf utilized
+ driver.findElement(By.id("delete_pdf")).click();
+ driver.switchTo().alert().accept();
+ }
+ //instantiation of Tabula
+ @BeforeClass
+ public static void SetUp(){
+ //set up of chromedriver and navigation to the url, as well as uploading of the pdf file
+ System.setProperty("webdriver.chrome.driver","/usr/local/bin/chromedriver");
+ ChromeOptions options = new ChromeOptions();
+ options.addArguments("headless");
+ options.addArguments("no-sandbox");
+
+ driver = new ChromeDriver(options);
+ driver.get(Tabula_url);
+ driver.manage().window().maximize();
+ }
+ //test of 2 different instances of inputting regex to get a multi spanning table
+ @Test
+ public void TestMultiPageTables() {
+ try {
+ UploadPDF();
+ PageRefresh();
+ //Test of regex input with inclusive for pattern before for a table of 3 pages in length
+ PatternInputStrings("From:", "From:");
+ InclusiveButtons(true, false);
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ //Confirm search found
+ String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'5')]")).getText();
+ Boolean regex_result;
+ if (result.equals("5")) {
+ regex_result = true;
+ } //if true, there are zero matches
+ else {
+ regex_result = false;
+ }
+ PreviewandExportDatapg();
+ //verify data extraction
+ String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'From: Bucholtz, Tracy L regex_rows = driver.findElements(By.className("regex-result"));
+ int regex_count = regex_rows.size();
+ int regex_count1 = 1;
+ assertTrue("Failed, Tabula found more than one match for an overlap regex search", (regex_count1 == regex_count ));
+ PreviewandExportDatapg();
+ String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'Raleigh, NC 27699-3110')]")).getText();
+ Boolean regex_data;
+ if (result_data.equals("Raleigh, NC 27699-3110")) { regex_data = true;
+ } else { regex_data = false; }
+ String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'Raleigh, NC 27699-3123')]")).getText();
+ Boolean regex_data2;
+ if (result_data2.equals("Raleigh, NC 27699-3123")) { regex_data2 = true;
+ } else { regex_data2 = false; }
+ Boolean final_results;
+ if (regex_data && regex_data2) { final_results = true;
+ } else { final_results = false; }
+ assertTrue("Failed, Tabula found no match for the multi-page table", final_results);
+ driver.navigate().back();
+ driver.navigate().back();
+ Thread.sleep(500);
+ DeletePDF();
+ }catch (Exception e){
+ System.out.print(e);
+ }
+ }
+ @AfterClass
+ public static void TearDown(){
+ driver.quit();
+ }
+}
diff --git a/src/test/java/TestHelpPage.java b/src/test/java/TestHelpPage.java
new file mode 100644
index 000000000..14fb77775
--- /dev/null
+++ b/src/test/java/TestHelpPage.java
@@ -0,0 +1,131 @@
+import org.junit.After;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.chrome.ChromeOptions;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import java.util.concurrent.TimeUnit;
+
+import static junit.framework.TestCase.assertTrue;
+import static org.junit.Assert.assertFalse;
+
+//Test of Tabula's test page, which incorporates the hover menu per section and the links found on the page.
+// All the links are tested except for LibreOffice Calc's link due to an existing exception thrown whenever clicked.
+// The exception thrown is ElementClickInterceptedException where an element obscures the link from being clicked.
+// LibreOffice Calc's link is tested however in TestHomePage test case, so this test case does not duplicate the same
+// steps taken to test LibreOffice Calc. Additionally, the media menu is not tested for since it is already tested in
+// TestHomePage.
+//need to fix
+// @author SM modified: 2/23/18
+
+public class TestHelpPage {
+ WebDriver driver;
+ @Test
+ public void startWebDriver(){
+ System.setProperty("webdriver.chrome.driver","/usr/local/bin/chromedriver");
+ ChromeOptions options = new ChromeOptions();
+ options.addArguments("headless");
+ options.addArguments("no-sandbox");
+
+ driver = new ChromeDriver(options);
+ driver.get("http://127.0.0.1:9292/");
+ driver.manage().window().maximize();
+ WebDriverWait wait = new WebDriverWait(driver, 100);
+
+ try{
+ Thread.sleep(1000);
+ //navigates to the help tab from the homepage
+ By help_id = By.linkText("Help");
+ WebElement help_icon = wait.until(ExpectedConditions.elementToBeClickable(help_id));
+ help_icon.click();
+ WebElement help_icon2 = wait.until(ExpectedConditions.elementToBeClickable(help_id));
+ help_icon2.click();
+ Thread.sleep(2000);
+ String help_title = "How to Use Tabula";
+ By tabulahelp_id = By.id("tabulahelp");
+ WebElement helptabula = wait.until(ExpectedConditions.visibilityOfElementLocated(tabulahelp_id));
+ assertTrue("Failed, couldn't find Help page", help_title.equals(helptabula.getText()));
+
+ //the following will click to all of the links found in the help page except for LibreOffice Calc since it
+ // has been tested before in the TestHomePage
+ By tutorialspoint_text = By.className("tutorialspoint");
+ WebElement tutorialspoint_link = wait.until(ExpectedConditions.elementToBeClickable(tutorialspoint_text));
+ tutorialspoint_link.click();
+ String tutorialspoint_url = "https://www.tutorialspoint.com/java/java_regular_expressions.htm";
+ driver.manage().timeouts().pageLoadTimeout(150, TimeUnit.SECONDS);
+ assertTrue("Failed, couldn't find Tutorial's Point Regex Syntax page", driver.getCurrentUrl().equals(tutorialspoint_url));
+ driver.navigate().back();
+
+ By regex_text = By.linkText("here");
+ WebElement regex_link = wait.until(ExpectedConditions.elementToBeClickable(regex_text));
+ regex_link.click();
+ String regex_url = "https://regexr.com/";
+ driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
+ assertTrue("Failed, couldn't find Tutorial's Point Regex Syntax page", driver.getCurrentUrl().equals(regex_url));
+ driver.navigate().back();
+
+ By pdfsandwich_text = By.linkText("PDFSandwich");
+ WebElement pdfsandwich_link = wait.until(ExpectedConditions.elementToBeClickable(pdfsandwich_text));
+ pdfsandwich_link.click();
+ String pdfsandwich_url = "http://www.tobias-elze.de/pdfsandwich/";
+ driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
+ assertTrue("Failed, couldn't find PDFSandwich page", driver.getCurrentUrl().equals(pdfsandwich_url));
+ driver.navigate().back();
+
+ By limeOCR_text = By.linkText("Lime OCR");
+ WebElement limeOCR_link = wait.until(ExpectedConditions.elementToBeClickable(limeOCR_text));
+ limeOCR_link.click();
+ String limeOCR_url = "https://code.google.com/archive/p/lime-ocr/";
+ driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
+ assertTrue("Failed, couldn't find limeOCR page", driver.getCurrentUrl().equals(limeOCR_url));
+ driver.navigate().back();
+
+ By openrefine_text = By.linkText("OpenRefine");
+ WebElement openrefine_link = wait.until(ExpectedConditions.elementToBeClickable(openrefine_text));
+ openrefine_link.click();
+ String openrefine_url = "http://openrefine.org/";
+ driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
+ assertTrue("Failed, couldn't find OpenRefine page", driver.getCurrentUrl().equals(openrefine_url));
+ driver.navigate().back();
+
+ By extractor_text = By.linkText("tabula-extractor");
+ WebElement extractor_link = wait.until(ExpectedConditions.elementToBeClickable(extractor_text));
+ extractor_link.click();
+ String extractor_url = "https://github.com/tabulapdf/tabula-extractor";
+ driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
+ assertTrue("Failed, couldn't find tabula-extractor page", driver.getCurrentUrl().equals(extractor_url));
+ driver.navigate().back();
+
+ By report_text = By.linkText("report it to us here");
+ WebElement report_link = wait.until(ExpectedConditions.elementToBeClickable(report_text));
+ report_link.click();
+ String report_url = "https://github.com/tabulapdf/tabula/issues/new";
+ driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
+ assertFalse("Failed, couldn't find GitHub's sign-in page to view the issues page", driver.getCurrentUrl().equals(report_url));
+ driver.navigate().back();
+
+ By about_text = By.linkText("one of the Tabula creators.");
+ WebElement about_icon = wait.until(ExpectedConditions.visibilityOfElementLocated(about_text));
+ about_icon.click();
+ String about_title = "About Tabula";
+ By abouttabula_classname = By.className("abouttabula");
+ driver.manage().timeouts().pageLoadTimeout(60, TimeUnit.SECONDS);
+ WebElement abouttabula = wait.until(ExpectedConditions.visibilityOfElementLocated(abouttabula_classname));
+ assertTrue("Failed, couldn't find About page", about_title.equals(abouttabula.getText()));
+
+ }catch(Exception e){
+ System.out.print(e);
+
+ }
+
+ }
+ //whether the test case passes or not, the instance of the browser will close
+ @After
+ public void TearDown(){
+ driver.quit();
+ }
+}
diff --git a/src/test/java/TestHomePage.java b/src/test/java/TestHomePage.java
new file mode 100644
index 000000000..2ae0a5075
--- /dev/null
+++ b/src/test/java/TestHomePage.java
@@ -0,0 +1,129 @@
+import org.junit.After;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.chrome.ChromeOptions;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import java.util.concurrent.TimeUnit;
+
+import static junit.framework.TestCase.assertTrue;
+
+// Test of Tabula's homepage, menu, media links at the bottom of the page, and button to click window explorer to upload files.
+// Test will not test for uploading a file or clicking the extracting button to navigate to the extraction page
+// Test will not test the Help and Template links located in the How to Use Tabula section, since navigating to those sections are
+// already being done
+// Currently, this test case will not check for the Import button since the button is technically enabled but disabled to do anything
+// @author SM modified: 2/18/18
+
+public class TestHomePage {
+ WebDriver driver;
+ @Test
+ public void startWebDriver(){
+ System.setProperty("webdriver.chrome.driver","/usr/local/bin/chromedriver");
+ ChromeOptions options = new ChromeOptions();
+ options.addArguments("headless");
+ options.addArguments("no-sandbox");
+
+ driver = new ChromeDriver(options);
+ driver.get("http://127.0.0.1:9292/");
+ driver.manage().window().maximize();
+ WebDriverWait wait = new WebDriverWait(driver, 100);
+
+ try {
+ //navbar-brand and upload-nav when clicked just stay in the homepage
+ By navbar_class = By.className("navbar-brand");
+ WebElement navbar_icon = wait.until(ExpectedConditions.visibilityOfElementLocated(navbar_class));
+ navbar_icon.click();
+
+ By upload__id = By.linkText("My Files");
+ WebElement upload_icon = wait.until(ExpectedConditions.visibilityOfElementLocated(upload__id));
+ upload_icon.click();
+
+ By templates_id = By.linkText("My Templates");
+ WebElement templates_icon = wait.until(ExpectedConditions.visibilityOfElementLocated(templates_id));
+ templates_icon.click();
+
+ String text_template = "My Saved Templates";
+ By saved_template_classname = By.className("my_saved_template_title");
+ WebElement template_title = wait.until(ExpectedConditions.visibilityOfElementLocated(saved_template_classname));
+ assertTrue("Failed, couldn't find My Templates page", text_template.equals(template_title.getText()));
+ driver.navigate().back();
+
+ By about_id = By.linkText("About");
+ WebElement about_icon = wait.until(ExpectedConditions.visibilityOfElementLocated(about_id));
+ about_icon.click();
+
+ String about_title = "About Tabula";
+ By abouttabula_classname = By.className("abouttabula");
+ WebElement abouttabula = wait.until(ExpectedConditions.visibilityOfElementLocated(abouttabula_classname));
+ assertTrue("Failed, couldn't find About page", about_title.equals(abouttabula.getText()));
+ driver.navigate().back();
+
+ By help_id = By.linkText("Help");
+ WebElement help_icon = wait.until(ExpectedConditions.visibilityOfElementLocated(help_id));
+ help_icon.click();
+
+ String help_title = "How to Use Tabula";
+ By helptabula_id = By.id("tabulahelp");
+ WebElement helptabula = wait.until(ExpectedConditions.visibilityOfElementLocated(helptabula_id));
+ assertTrue("Failed, couldn't find Help page", help_title.equals(helptabula.getText()));
+ driver.navigate().back();
+
+ By source_code_id = By.linkText("Source Code");
+ WebElement source_code_icon = wait.until(ExpectedConditions.elementToBeClickable(source_code_id));
+ source_code_icon.click();
+
+ String github_url = "https://github.com/tabulapdf/tabula";
+ driver.manage().timeouts().pageLoadTimeout(150, TimeUnit.SECONDS);
+ assertTrue("Failed, couldn't find Tabula's GitHub page", driver.getCurrentUrl().equals(github_url));
+ driver.navigate().back();
+
+ //Test of home page's media links located in the bottom of the page
+ By tabulatwt_classname = By.linkText("@TabulaPDF");
+ WebElement tabula_twitter_icon = wait.until(ExpectedConditions.elementToBeClickable(tabulatwt_classname));
+ tabula_twitter_icon.click();
+ String tabula_twitter_url = "https://twitter.com/tabulapdf?lang=en";
+ driver.manage().timeouts().pageLoadTimeout(150, TimeUnit.SECONDS);
+ assertTrue("Failed, couldn't find Tabula's Twitter page", driver.getCurrentUrl().equals(tabula_twitter_url));
+ driver.navigate().back();
+
+ // https://tabula.technology's url is hard to check because of network issues causing it to not
+ // consistently load the page without a warning
+
+ By tabulapdfoc_classname = By.linkText("Tabulapdf");
+ WebElement tabulapdfoc_icon = wait.until(ExpectedConditions.elementToBeClickable(tabulapdfoc_classname));
+ tabulapdfoc_icon.click();
+ String tabulapdfoc_url = "https://opencollective.com/tabulapdf";
+ driver.manage().timeouts().pageLoadTimeout(200, TimeUnit.SECONDS);
+ assertTrue("Failed, couldn't find Tabula's Opencollective page", driver.getCurrentUrl().equals(tabulapdfoc_url));
+ driver.navigate().back();
+
+ //Checking for smaller links located in How to use Tabula steps in the home page, but not the links
+ // for templates or the help page
+ By libreoffice_text = By.linkText("LibreOffice Calc");
+ WebElement libreoffice_link = wait.until(ExpectedConditions.elementToBeClickable(libreoffice_text));
+ libreoffice_link.click();
+ String libreoffice_url = "https://www.libreoffice.org/discover/calc/";
+ driver.manage().timeouts().pageLoadTimeout(200, TimeUnit.SECONDS);
+ assertTrue("Failed, couldn't find LibreOffice Calc page", driver.getCurrentUrl().equals(libreoffice_url));
+ driver.navigate().back();
+
+ //Checking Browse button, which will open up File Explorer
+ By input_btn = By.className("input-group-btn");
+ WebElement input_browser = wait.until(ExpectedConditions.elementToBeClickable(input_btn));
+ input_browser.click();
+ Thread.sleep(1000);
+
+ }catch(Exception e){
+ System.out.print(e); }
+ }
+ //whether the test case passes or not, the instance of the browser will close
+ @After
+ public void TearDown(){
+ driver.quit();
+ }
+}
diff --git a/src/test/java/TestImageBasedPDFs.java b/src/test/java/TestImageBasedPDFs.java
new file mode 100644
index 000000000..7d4cf3344
--- /dev/null
+++ b/src/test/java/TestImageBasedPDFs.java
@@ -0,0 +1,90 @@
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.chrome.ChromeOptions;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import java.util.concurrent.TimeUnit;
+//TestImageBasedPDFs contains 3 different test cases that attempt to upload 3 different types of pdf files that contain
+// an image of some sort.
+//Test cases in this file: Test4BuckCAPPart2PDF, TestAllenCSAtablePDF, and TestCliffsidePDF
+//@author SM; 4/21/18
+public class TestImageBasedPDFs {
+ private WebDriver driver;
+ private String Tabula_url = "http://127.0.0.1:9292/";
+
+ @Before
+ public void Setup() {
+ System.setProperty("webdriver.chrome.driver", "/usr/local/bin/chromedriver");
+ ChromeOptions options = new ChromeOptions();
+ options.addArguments("headless");
+ options.addArguments("no-sandbox");
+
+ //set up of chromdriver and navigation to the url, as well as uploading of the pdf file
+ driver = new ChromeDriver(options);
+ driver.get(Tabula_url);
+ driver.manage().window().maximize();
+
+ }
+ @Test
+ public void Test4BuckCAPPart2PDF(){
+ try {
+ //Attempts to upload pdf file
+ WebDriverWait wait = new WebDriverWait(driver, 500);
+ String filePath = System.getProperty("user.dir") + "/src/test/pdf/4._Buck_CAP_Part_2_Appx_A_partial.pdf";
+ WebElement chooseFile = driver.findElement(By.id("file"));
+ chooseFile.sendKeys(filePath);//sends pdf path location
+ WebElement import_btn = wait.until(ExpectedConditions.elementToBeClickable(driver.findElement(By.id("import_file"))));
+ import_btn.click();
+ Thread.sleep(15000);
+ driver.manage().timeouts().pageLoadTimeout(1500, TimeUnit.SECONDS);
+ driver.switchTo().alert().accept(); //accept error pop-up window
+ Thread.sleep(1000);
+ }
+ catch (Exception e){}
+ }
+ @Test
+ public void TestAllenCSAtablePDF(){
+ try {
+ //Attempts to upload pdf file
+ WebDriverWait wait = new WebDriverWait(driver, 500);
+ String filePath = System.getProperty("user.dir") + "/src/test/pdf/Allen_CSA_table_6-9_gradients.pdf";
+ WebElement chooseFile = driver.findElement(By.id("file"));
+ chooseFile.sendKeys(filePath); //sends pdf path location
+ WebElement import_btn = wait.until(ExpectedConditions.elementToBeClickable(driver.findElement(By.id("import_file"))));
+ import_btn.click();
+ Thread.sleep(15000);
+ driver.manage().timeouts().pageLoadTimeout(1500, TimeUnit.SECONDS);
+ driver.switchTo().alert().accept(); //accept error pop-up window
+ Thread.sleep(1000);
+ }
+ catch(Exception e){}
+ }
+ @Test
+ public void TestCliffsidePDF(){
+ try {
+ //Attempts to upload pdf file
+ WebDriverWait wait = new WebDriverWait(driver, 500);
+ String filePath = System.getProperty("user.dir") + "/src/test/pdf/Cliffside_CSA_Report_NCDENR_Submittal.pdf";
+ WebElement chooseFile = driver.findElement(By.id("file"));
+ chooseFile.sendKeys(filePath); //sends pdf path location
+ WebElement import_btn = wait.until(ExpectedConditions.elementToBeClickable(driver.findElement(By.id("import_file"))));
+ import_btn.click();
+ Thread.sleep(15000);
+ driver.manage().timeouts().pageLoadTimeout(1500, TimeUnit.SECONDS);
+ driver.switchTo().alert().accept(); //accept error pop-up window
+ Thread.sleep(1000);
+ }
+ catch(Exception e){}
+ }
+ @After
+ public void TearDown(){
+ //navigates back and deletes the pdf utilized
+ driver.quit();
+ }
+}
diff --git a/src/test/java/TestMecklenburgMajority.java b/src/test/java/TestMecklenburgMajority.java
new file mode 100644
index 000000000..9a6c4d510
--- /dev/null
+++ b/src/test/java/TestMecklenburgMajority.java
@@ -0,0 +1,337 @@
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.chrome.ChromeOptions;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import java.util.List;
+
+import static junit.framework.TestCase.assertTrue;
+//Test of the Mecklenburg.Majority pdf file, it will go through various user scenarios to test the functionality of the regex
+// implementation (spanning pages, multiple search results, inclusive and non-inclusive, and overlap)
+// @author SM modified: 4/28/18
+
+public class TestMecklenburgMajority {
+ //Test of the Mecklenburg.Majority pdf file.
+ private static WebDriver driver;
+ private static String Tabula_url = "http://127.0.0.1:9292/";
+ private WebDriverWait wait = new WebDriverWait(driver, 100);
+
+ //will continue to refresh the page until it sees one of the buttons appear in the menu option of the extraction page
+ private void PageRefresh() throws InterruptedException {
+ //menu options did not fully load
+ Thread.sleep(1000);
+ //refresh the page
+ while(driver.findElements( By.id("restore-detected-tables")).size() == 0) {
+ driver.navigate().refresh();
+ Thread.sleep(700);
+ }
+ }
+ //will navigate and wait for the data to appear in the preview and export data page
+ private void PreviewandExportDatapg(){
+ By previewandexport_id = By.id("all-data");
+ WebElement previewandexport_button = wait.until(ExpectedConditions.visibilityOfElementLocated(previewandexport_id));
+ previewandexport_button.click();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("detection-row")));
+ }
+ //will wait for the regex button to become clickable and then click the regex button
+ private void ClickRegexButton() throws InterruptedException {
+ By regex_search_id = By.id("regex-search");
+ WebElement regex_button = new WebDriverWait(driver, 30).until(ExpectedConditions.
+ elementToBeClickable(regex_search_id));
+ regex_button.click();
+ Thread.sleep(800);
+ }
+ //send regex inputs to the corresponding pattern type
+ private void PatternInputStrings(String pattern_before, String pattern_after){
+ By pattern_before_input = By.id("pattern_before");
+ By pattern_after_input = By.id("pattern_after");
+ driver.findElement(pattern_before_input).sendKeys(pattern_before);
+ driver.findElement(pattern_after_input).sendKeys(pattern_after);
+ }
+ //send corresponding info of inclusive to the pattern type
+ private void InclusiveButtons(boolean patternbefore, boolean patternafter){
+ WebElement inclusive_before_btn = new WebDriverWait(driver, 30).
+ until(ExpectedConditions.elementToBeClickable(driver.findElement(By.id("include_pattern_before"))));
+ WebElement inclusive_after_btn = new WebDriverWait(driver, 30).
+ until(ExpectedConditions.elementToBeClickable(driver.findElement(By.id("include_pattern_after"))));
+ if (patternbefore){
+ inclusive_before_btn.click(); }
+ if(patternafter){
+ inclusive_after_btn.click(); }
+ }
+ //go on and upload the pdf file
+ private void UploadPDF() throws InterruptedException {
+ String filePath = System.getProperty("user.dir") + "/src/test/pdf/Mecklenburg.Majority.pdf";
+ WebElement chooseFile = driver.findElement(By.id("file"));
+ chooseFile.sendKeys(filePath);
+ Thread.sleep(1000);
+ WebElement import_btn = driver.findElement(By.id("import_file"));
+ import_btn.click();
+ Thread.sleep(5000);
+ wait.until(ExpectedConditions.elementToBeClickable(By.id("restore-detected-tables")));
+ }
+ //delete the pdf file
+ private void DeletePDF(){
+ //navigates back and deletes the pdf utilized
+ driver.findElement(By.id("delete_pdf")).click();
+ driver.switchTo().alert().accept();
+ }
+ //instantiation of Tabula
+ @BeforeClass
+ public static void SetUp(){
+ //set up of chromdriver and navigation to the url, as well as uploading of the pdf file
+ System.setProperty("webdriver.chrome.driver","/usr/local/bin/chromedriver");
+ ChromeOptions options = new ChromeOptions();
+ options.addArguments("headless");
+ options.addArguments("no-sandbox");
+
+ driver = new ChromeDriver(options);
+ driver.get(Tabula_url);
+ driver.manage().window().maximize();
+ }
+ //test of 2 different instances of inputting regex to get a multi spanning table
+ @Test
+ public void TestMultiPageTables() {
+ try {
+ UploadPDF();
+ PageRefresh();
+ //Test of regex input with inclusive for pattern before for a table of 3 pages in length
+ PatternInputStrings("16", "Q38:");
+ InclusiveButtons(true, false);
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ //Confirm search found
+ String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'16')]")).getText();
+ Boolean regex_result;
+ if (result.equals("16")) {
+ regex_result = true;
+ } //if true, there are zero matches
+ else {
+ regex_result = false;
+ }
+ PreviewandExportDatapg();
+ //verify data extraction
+ String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'11/5/2016')]")).getText();
+ Boolean regex_data;
+ if (result_data.equals("11/5/2016")) {
+ regex_data = true;
+ } else {
+ regex_data = false;
+ }
+ String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'PAGE 8: Privately Owned Site (Site #2)')]")).getText();
+ Boolean regex_data2;
+ if (result_data2.equals("PAGE 8: Privately Owned Site (Site #2)")) {
+ regex_data2 = true;
+ } else {
+ regex_data2 = false;
+ }
+ Boolean final_results;
+ if (regex_result && regex_data && regex_data2) {
+ final_results = true;
+ } else {
+ final_results = false;
+ }
+ assertTrue("Failed, regex found no match for inclusive input for pattern before for a 3 page length table"
+ , final_results);
+ driver.navigate().refresh();
+ PageRefresh();
+
+ //Test of regex input with inclusive for pattern after for a table of 8 pages in length
+ PatternInputStrings("Q1:", "Q41:");
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ String result3 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'1')]")).getText();
+ Boolean regex_result3;
+ if (result3.equals("Q1:")) {
+ regex_result3 = true;
+ } //if true, there are zero matches
+ else {
+ regex_result3 = false;
+ }
+ PreviewandExportDatapg();
+ String result_data5 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'Q2: Please select the type of voting system')]")).getText();
+ Boolean regex_data5;
+ if (result_data5.equals("Q2: Please select the type of voting system used at one- Touchscreen machines")) {
+ regex_data5 = true;
+ } else {
+ regex_data5 = false;
+ }
+ String result_data6 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'One-stop Implementation Plans')]")).getText();
+ Boolean regex_data6;
+ if (result_data6.equals("One-stop Implementation Plans")) {
+ regex_data6 = true;
+ } else {
+ regex_data6 = false;
+ }
+ Boolean final_results3;
+ if (regex_result3 && regex_data5 && regex_data6) {
+ final_results3 = true;
+ } else {
+ final_results3 = false;
+ }
+ assertTrue("Failed, Tabula found no match for a multi page table spanning more than 5 pages", final_results3);
+
+ driver.navigate().back();
+ driver.navigate().back();
+ Thread.sleep(500);
+ DeletePDF();
+ }catch (Exception e){
+ System.out.print(e);
+ }
+ }
+ //test of 3 different instances of inputting regex searches with 3 different types of inclusive combinations to
+ // get multiple regex results
+ @Test
+ public void TestInclusivePatternswithRegexSearches() {
+ try{
+ UploadPDF();
+ PageRefresh();
+
+ //Tests for inclusive for pattern before and non-inclusive for pattern after
+ PatternInputStrings("Q","Q");
+ InclusiveButtons(true, false);
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'172')]")).getText();
+ Boolean regex_result;
+ if(result.equals("172")){ regex_result = true;} //if true, there are zero matches
+ else{ regex_result = false;}
+ PreviewandExportDatapg();
+ String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'Q1: Please select your county.')]")).getText();
+ Boolean regex_data;
+ if(result_data.equals("Q1: Please select your county.")){ regex_data = true;}
+ else{ regex_data = false;}
+ Thread.sleep(600);
+ String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'Q343: Street Address')]")).getText();
+ Boolean regex_data2;
+ if(result_data2.equals("Q343: Street Address")){ regex_data2 = true;}
+ else{ regex_data2 = false;}
+ Boolean final_results;
+ if(regex_result && regex_data && regex_data2){ final_results = true;}
+ else{final_results = false;}
+ assertTrue("Failed, Tabula found no match for inclusive for pattern before and non-inclusive for " +
+ "pattern after", final_results);
+ driver.navigate().refresh();
+ PageRefresh();
+
+ //Tests for non-inclusive for pattern before and inclusive for pattern after
+ PatternInputStrings("PAGE", "PAGE");
+ InclusiveButtons(false, true);
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ String result2 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'35')]")).getText();
+ Boolean regex_result3;
+ if(result2.equals("35")){ regex_result3 = true;} //if true, there are zero matches
+ else{ regex_result3 = false;}
+ PreviewandExportDatapg();
+ String result_data3 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'Q1: Please select your county.')]")).getText();
+ Boolean regex_data3;
+ if(result_data3.equals("Q1: Please select your county.")){ regex_data3 = true;}
+ else{ regex_data3 = false;}
+ Thread.sleep(1000);
+ String result_data4 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'PAGE 70: Additional Site Information (Site #23)')]")).getText();
+ Boolean regex_data4;
+ if(result_data4.equals("PAGE 70: Additional Site Information (Site #23)")){ regex_data4 = true;}
+ else{ regex_data4 = false;}
+ Boolean final_results2;
+ if(regex_result3 && regex_data3 && regex_data4){ final_results2 = true;}
+ else{final_results2 = false;}
+ assertTrue("Failed, Tabula found no match for inclusive for pattern after and non-inclusive for " +
+ "pattern before", final_results2);
+ driver.navigate().refresh();
+ PageRefresh();
+
+ //Tests for inclusive for pattern before and for pattern after
+ PatternInputStrings("ADA","Number of curbside");
+ InclusiveButtons(true, true);
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ String result3 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'22')]")).getText();
+ Boolean regex_result4;
+ if(result3.equals("22")){ regex_result4 = true;} //if true, there are zero matches
+ else{ regex_result4 = false;}
+ PreviewandExportDatapg();
+ String result_data5 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'Non-ADA-accessible IvoTronics')]")).getText();
+ Boolean regex_data5;
+ if(result_data5.equals("Non-ADA-accessible IvoTronics")){ regex_data5 = true;}
+ else{ regex_data5 = false;}
+ Thread.sleep(700);
+ String result_data6 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'Number of curbside voting spots.')]")).getText();
+ Boolean regex_data6;
+ if(result_data6.equals("Number of curbside voting spots.")){ regex_data6 = true;}
+ else{ regex_data6 = false;}
+ Boolean final_results3;
+ if(regex_result4 && regex_data5 && regex_data6){ final_results3 = true;}
+ else{final_results3 = false;}
+ assertTrue("Failed, Tabula found no match for inclusive for pattern after and inclusive for " +
+ "pattern before", final_results3);
+ driver.navigate().back();
+ driver.navigate().back();
+ Thread.sleep(500);
+ DeletePDF();
+ }catch(Exception e){
+ System.out.print(e);
+ }
+ }
+ //test of an overlapping instance where it checks that there is only one regex result after attempting an overlap
+ @Test
+ public void TestOverlapRegexSearch() {
+ try{
+ //Test for overlapping regex searches
+ UploadPDF();
+ PageRefresh();
+
+ PatternInputStrings("Q1", "Q24");
+ InclusiveButtons(true, false);
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ PatternInputStrings("Q20", "Q22");
+ InclusiveButtons(false, true);
+ ClickRegexButton();
+ Thread.sleep(5000);
+ driver.switchTo().alert().accept(); //accept error pop-up window
+ //Checks that there is only one regex result, since it shouldn't had allowed for 2 results to appear since the
+ // 2nd one causes an overlap
+ Thread.sleep(2000);
+ List regex_rows = driver.findElements(By.className("regex-result"));
+ int regex_count = regex_rows.size();
+ int regex_count1 = 1;
+ assertTrue("Failed, Tabula found more than one match for an overlap regex search", (regex_count1 == regex_count ));
+ PreviewandExportDatapg();
+ String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'Q19: Please check all that apply:')]")).getText();
+ Boolean regex_data;
+ if (result_data.equals("Q19: Please check all that apply:")) { regex_data = true;
+ } else { regex_data = false; }
+ String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'Q239: Suite/Room Name')]")).getText();
+ Boolean regex_data2;
+ if (result_data2.equals("Q239: Suite/Room Name")) { regex_data2 = true;
+ } else { regex_data2 = false; }
+ Boolean final_results;
+ if (regex_data && regex_data2) { final_results = true;
+ } else { final_results = false; }
+ assertTrue("Failed, Tabula found no match for the multi-page table", final_results);
+ driver.navigate().back();
+ driver.navigate().back();
+ Thread.sleep(500);
+ DeletePDF();
+ }catch (Exception e){
+ System.out.print(e);
+ }
+ }
+ @AfterClass
+ public static void TearDown(){
+ driver.quit();
+ }
+ }
+
diff --git a/src/test/java/TestMyTemplatesPage.java b/src/test/java/TestMyTemplatesPage.java
new file mode 100644
index 000000000..b2b86a6be
--- /dev/null
+++ b/src/test/java/TestMyTemplatesPage.java
@@ -0,0 +1,76 @@
+import org.junit.After;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.chrome.ChromeOptions;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import static junit.framework.TestCase.assertTrue;
+
+// Test of Tabula's My Templates' page and it's associating links. It clicks through the navigating links and the
+// browsing button. Additionally, the media menu is not tested for since it is already tested in TestHomePage.
+// @author SM modified: 2/23/18
+public class TestMyTemplatesPage {
+ WebDriver driver;
+ @Test
+ public void startWebDriver(){
+ System.setProperty("webdriver.chrome.driver","/usr/local/bin/chromedriver");
+ ChromeOptions options = new ChromeOptions();
+ options.addArguments("headless");
+ options.addArguments("no-sandbox");
+
+ driver = new ChromeDriver(options);
+ driver.get("http://127.0.0.1:9292/");
+ driver.manage().window().maximize();
+ WebDriverWait wait = new WebDriverWait(driver, 100);
+ try{
+ //navigates to the My Templates tab from the homepage tab
+ By templates_id = By.linkText("My Templates");
+ WebElement templates_icon = wait.until(ExpectedConditions.visibilityOfElementLocated(templates_id));
+ templates_icon.click();
+ WebElement templates_icon2 = wait.until(ExpectedConditions.visibilityOfElementLocated(templates_id));
+ templates_icon2.click();
+ String text_template = "My Saved Templates";
+ By saved_template_classname = By.className("my_saved_template_title");
+ WebElement template_title = wait.until(ExpectedConditions.visibilityOfElementLocated(saved_template_classname));
+ assertTrue("Failed, couldn't find My Templates page", text_template.equals(template_title.getText()));
+
+ //checks links and browsing button
+ By upload_text = By.linkText("upload a file");
+ WebElement upload_link = wait.until(ExpectedConditions.visibilityOfElementLocated(upload_text));
+ upload_link.click();
+ String homepagecheck = "First time using Tabula? Welcome!";
+ By welcome_id = By.id("welcome_title");
+ WebElement welcome = wait.until(ExpectedConditions.visibilityOfElementLocated(welcome_id));
+ assertTrue("Failed, couldn't find My Upload a file in the Home page", homepagecheck.equals(welcome.getText()));
+ driver.navigate().back();
+
+ By myfiles_text = By.linkText("My Files");
+ WebElement myfiles_link = wait.until(ExpectedConditions.visibilityOfElementLocated(myfiles_text));
+ myfiles_link.click();
+ By welcome_id2 = By.id("welcome_title");
+ WebElement welcome2 = wait.until(ExpectedConditions.visibilityOfElementLocated(welcome_id2));
+ assertTrue("Failed, couldn't find My Upload a file in the Home page", homepagecheck.equals(welcome2.getText()));
+ driver.navigate().back();
+
+ //Checking Browse button, which will open up File Explorer
+ By input_btn = By.className("input-group-btn");
+ WebElement input_browser = wait.until(ExpectedConditions.elementToBeClickable(input_btn));
+ input_browser.click();
+ //utilizing thread.sleep() to give enough time for the file explorer to display correctly.
+ Thread.sleep(1000);
+
+ }catch(Exception e){
+ System.out.print("TestMyTemplatesPage failed.");
+ System.out.print(e);
+ }
+ }
+ //whether the test case passes or not, the instance of the browser will close
+ @After
+ public void TearDown(){
+ driver.quit();
+ }
+}
diff --git a/src/test/java/TestNCHouse2017StatPack.java b/src/test/java/TestNCHouse2017StatPack.java
new file mode 100644
index 000000000..0c322249f
--- /dev/null
+++ b/src/test/java/TestNCHouse2017StatPack.java
@@ -0,0 +1,302 @@
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.chrome.ChromeOptions;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import java.util.List;
+
+import static junit.framework.TestCase.assertTrue;
+
+//Test of the NCHouse2017StatPack pdf file, it will go through various user scenarios to test the functionality of the regex
+// implementation (spanning pages, multiple search results, inclusive and non-inclusive, and overlap)
+// @author SM modified: 4/28/18
+
+public class TestNCHouse2017StatPack {
+ private static WebDriver driver;
+ private static String Tabula_url = "http://127.0.0.1:9292/";
+ private WebDriverWait wait = new WebDriverWait(driver, 500);
+
+ //will continue to refresh the page until it sees one of the buttons appear in the menu option of the extraction page
+ private void PageRefresh() throws InterruptedException {
+ //menu options did not fully load
+ Thread.sleep(1000);
+ //refresh the page
+ while(driver.findElements( By.id("restore-detected-tables")).size() == 0) {
+ driver.navigate().refresh();
+ Thread.sleep(700);
+ }
+ }
+ //will navigate and wait for the data to appear in the preview and export data page
+ private void PreviewandExportDatapg(){
+ By previewandexport_id = By.id("all-data");
+ WebElement previewandexport_button = wait.until(ExpectedConditions.visibilityOfElementLocated(previewandexport_id));
+ previewandexport_button.click();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("detection-row")));
+ }
+ //will wait for the regex button to become clickable and then click the regex button
+ private void ClickRegexButton() throws InterruptedException {
+ By regex_search_id = By.id("regex-search");
+ WebElement regex_button = new WebDriverWait(driver, 30).until(ExpectedConditions.
+ elementToBeClickable(regex_search_id));
+ regex_button.click();
+ Thread.sleep(800);
+ }
+ //send regex inputs to the corresponding pattern type
+ private void PatternInputStrings(String pattern_before, String pattern_after){
+ By pattern_before_input = By.id("pattern_before");
+ By pattern_after_input = By.id("pattern_after");
+ driver.findElement(pattern_before_input).sendKeys(pattern_before);
+ driver.findElement(pattern_after_input).sendKeys(pattern_after);
+ }
+ //send corresponding info of inclusive to the pattern type
+ private void InclusiveButtons(boolean patternbefore, boolean patternafter){
+ WebElement inclusive_before_btn = new WebDriverWait(driver, 30).
+ until(ExpectedConditions.elementToBeClickable(driver.findElement(By.id("include_pattern_before"))));
+ WebElement inclusive_after_btn = new WebDriverWait(driver, 30).
+ until(ExpectedConditions.elementToBeClickable(driver.findElement(By.id("include_pattern_after"))));
+ if (patternbefore){
+ inclusive_before_btn.click(); }
+ if(patternafter){
+ inclusive_after_btn.click(); }
+ }
+ //go on and upload the pdf file
+ private void UploadPDF() throws InterruptedException {
+ String filePath = System.getProperty("user.dir") + "/src/test/pdf/NC_HOUSE_2017_Stat_Pack_8.21.17.pdf";
+ WebElement chooseFile = driver.findElement(By.id("file"));
+ chooseFile.sendKeys(filePath);
+ Thread.sleep(1000);
+ WebElement import_btn = driver.findElement(By.id("import_file"));
+ import_btn.click();
+ Thread.sleep(5000);
+ wait.until(ExpectedConditions.elementToBeClickable(By.id("restore-detected-tables")));
+ }
+ //delete the pdf file
+ private void DeletePDF(){
+ //navigates back and deletes the pdf utilized
+ driver.findElement(By.id("delete_pdf")).click();
+ driver.switchTo().alert().accept();
+ }
+ //instantiation of Tabula
+ @BeforeClass
+ public static void SetUp(){
+ System.setProperty("webdriver.chrome.driver","/usr/local/bin/chromedriver");
+ ChromeOptions options = new ChromeOptions();
+ options.addArguments("headless");
+ options.addArguments("no-sandbox");
+
+ //set up of chromdriver and navigation to the url, as well as uploading of the pdf file
+ driver = new ChromeDriver(options);
+ driver.get(Tabula_url);
+ driver.manage().window().maximize();
+
+ }
+ //test of 3 different instances of inputting regex searches with 3 different types of inclusive combinations to
+ // get multiple regex results
+ @Test
+ public void TestInclusivePatternswithRegexSearches() {
+ try{
+ UploadPDF();
+ PageRefresh();
+
+ //Tests for inclusive for pattern before and non-inclusive for pattern after
+ PatternInputStrings("2017 House Redistricting","69");
+ InclusiveButtons(true, false);
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ // Thread.sleep(5000);
+ String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'14')]")).getText();
+ Boolean regex_result;
+ if(result.equals("14")){ regex_result = true;} //if true, there are zero matches
+ else{ regex_result = false;}
+ PreviewandExportDatapg();
+ String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'2017 House Redistricting Plan: Population Deviation')]")).getText();
+ Boolean regex_data;
+ if(result_data.equals("2017 House Redistricting Plan: Population Deviation")){ regex_data = true;}
+ else{ regex_data = false;}
+ Thread.sleep(600);
+ String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'District')]")).getText();
+ Boolean regex_data2;
+ if(result_data2.equals("District 2010 Pop")){ regex_data2 = true;}
+ else{ regex_data2 = false;}
+ Boolean final_results;
+ if(regex_result && regex_data && regex_data2){ final_results = true;}
+ else{final_results = false;}
+ assertTrue("Failed, Tabula found no match for inclusive for pattern before and non-inclusive for " +
+ "pattern after", final_results);
+ driver.navigate().refresh();
+ PageRefresh();
+
+ //Tests for non-inclusive for pattern before and inclusive for pattern after
+ PatternInputStrings("2017 House Redistricting", "69");
+ InclusiveButtons(false, true);
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ String result2 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'14')]")).getText();
+ Boolean regex_result3;
+ if(result2.equals("14")){ regex_result3 = true;} //if true, there are zero matches
+ else{ regex_result3 = false;}
+ PreviewandExportDatapg();
+ String result_data3 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'District')]")).getText();
+ Boolean regex_data3;
+ if(result_data3.equals("District")){ regex_data3 = true;}
+ else{ regex_data3 = false;}
+ Thread.sleep(600);
+ String result_data4 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'105')]")).getText();
+ Boolean regex_data4;
+ if(result_data4.equals("105")){ regex_data4 = true;}
+ else{ regex_data4 = false;}
+ Boolean final_results2;
+ if(regex_result3 && regex_data3 && regex_data4){ final_results2 = true;}
+ else{final_results2 = false;}
+ assertTrue("Failed, Tabula found no match for inclusive for pattern after and non-inclusive for " +
+ "pattern before", final_results2);
+ driver.navigate().refresh();
+ PageRefresh();
+
+ //Tests for inclusive for pattern before and for pattern after
+ PatternInputStrings("2017 House Redistricting","69");
+ InclusiveButtons(true, true);
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ String result3 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'14')]")).getText();
+ Boolean regex_result4;
+ if(result3.equals("14")){ regex_result4 = true;} //if true, there are zero matches
+ else{ regex_result4 = false;}
+ PreviewandExportDatapg();
+ String result_data5 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'2017 House Redistricting Plan: Population Deviation')]")).getText();
+ Boolean regex_data5;
+ if(result_data5.equals("2017 House Redistricting Plan: Population Deviation")){ regex_data5 = true;}
+ else{ regex_data5 = false;}
+ Thread.sleep(600);
+ String result_data6 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'105 22,913 55.44% 17,133 41.45% 1,287 3.11%')]")).getText();
+ Boolean regex_data6;
+ if(result_data6.equals("105 22,913 55.44% 17,133 41.45% 1,287 3.11%")){ regex_data6 = true;}
+ else{ regex_data6 = false;}
+ Boolean final_results3;
+ if(regex_result4 && regex_data5 && regex_data6){ final_results3 = true;}
+ else{final_results3 = false;}
+ assertTrue("Failed, Tabula found no match for inclusive for pattern after and inclusive for " +
+ "pattern before", final_results3);
+ driver.navigate().back();
+ driver.navigate().back();
+ Thread.sleep(500);
+ DeletePDF();
+ }catch(Exception e){
+ System.out.print(e);
+ }
+ }
+ //test of 2 different instances of inputting regex to get a multi spanning table
+ @Test
+ public void TestMultiPageTables(){
+ try {
+ //Test for a multi spanning page of 2 pages that is found 7 times in the file
+ UploadPDF();
+ PageRefresh();
+
+ PatternInputStrings("District", "District");
+ InclusiveButtons(false, true);
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'7')]")).getText();
+ Boolean regex_result;
+ if (result.equals("7")) {
+ regex_result = true;
+ } //if true, there is a match
+ else {
+ regex_result = false;
+ }
+ PreviewandExportDatapg();
+ String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'1')]")).getText();
+ Boolean regex_data;
+ if (result_data.equals("1")) {
+ regex_data = true;
+ } else {
+ regex_data = false;
+ }
+ String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'District Rep Rep % Dem Dem % Lib Lib %')]")).getText();
+ Boolean regex_data2;
+ if (result_data2.equals("District Rep Rep % Dem Dem % Lib Lib % Write-In Write-In %")) {
+ regex_data2 = true;
+ } else {
+ regex_data2 = false;
+ }
+ Boolean final_results;
+ if (regex_result && regex_data && regex_data2) {
+ final_results = true;
+ } else {
+ final_results = false;
+ }
+ assertTrue("Failed, Tabula found no match for the multi-page table", final_results);
+
+ driver.navigate().back();
+ driver.navigate().back();
+ Thread.sleep(500);
+ DeletePDF();
+ }catch (Exception e){
+ System.out.print(e);
+ }
+ }
+ //test of an overlapping instance where it checks that there is only one regex result after attempting an overlap
+ @Test
+ public void TestOverlapRegexSearch() {
+ try{
+ //Test for overlapping regex searches
+ UploadPDF();
+ PageRefresh();
+
+ PatternInputStrings("District", "Total");
+ ClickRegexButton();
+ Thread.sleep(5000);
+ PatternInputStrings("2017 House", "District");
+ InclusiveButtons(false, true);
+ ClickRegexButton();
+ Thread.sleep(5000);
+ driver.switchTo().alert().accept(); //accept error pop-up window
+ //Checks that there is only one regex result, since it shouldn't had allowed for 2 results to appear since the
+ // 2nd one causes an overlap
+ Thread.sleep(2000);
+ List regex_rows = driver.findElements(By.className("regex-result"));
+ int regex_count = regex_rows.size();
+ int regex_count1 = 1;
+ assertTrue("Failed, Tabula found more than one match for an overlap regex search",
+ (regex_count1 == regex_count ));
+ PreviewandExportDatapg();
+ String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'83')]")).getText();
+ Boolean regex_data;
+ if (result_data.equals("83")) { regex_data = true;
+ } else { regex_data = false; }
+ String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'120')]")).getText();
+ Boolean regex_data2;
+ if (result_data2.equals("120")) { regex_data2 = true;
+ } else { regex_data2 = false; }
+ Boolean final_results;
+ if (regex_data && regex_data2) { final_results = true;
+ } else { final_results = false; }
+ assertTrue("Failed, Tabula found no match for the multi-page table", final_results);
+ driver.navigate().back();
+ driver.navigate().back();
+ Thread.sleep(500);
+ DeletePDF();
+ }catch (Exception e){
+ System.out.print(e);
+ }
+ }
+ @AfterClass
+ public static void TearDown(){
+ driver.quit();
+ }
+}
diff --git a/src/test/java/TestOneStopVotingSiteListNov2012.java b/src/test/java/TestOneStopVotingSiteListNov2012.java
new file mode 100644
index 000000000..bd7963464
--- /dev/null
+++ b/src/test/java/TestOneStopVotingSiteListNov2012.java
@@ -0,0 +1,345 @@
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.chrome.ChromeOptions;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import java.util.List;
+
+import static junit.framework.TestCase.assertTrue;
+
+//Test of the OneStopVotingSiteListNov2012 pdf file, it will go through various user scenarios to test the functionality of the regex
+// implementation (spanning pages, multiple search results, inclusive and non-inclusive, and overlap)
+// @author SM modified: 4/28/18
+
+public class TestOneStopVotingSiteListNov2012 {
+ private static WebDriver driver;
+ private static String Tabula_url = "http://127.0.0.1:9292/";
+ private WebDriverWait wait = new WebDriverWait(driver, 500);
+
+ //will continue to refresh the page until it sees one of the buttons appear inthe menu option of the extraction page
+ private void PageRefresh() throws InterruptedException {
+ //menu options did not fully load
+ Thread.sleep(1000);
+ //refresh the page
+ while(driver.findElements( By.id("restore-detected-tables")).size() == 0) {
+ driver.navigate().refresh();
+ Thread.sleep(700);
+ }
+ }
+ //will navigate and wait for the data to appear in the preview and export data page
+ private void PreviewandExportDatapg(){
+ By previewandexport_id = By.id("all-data");
+ WebElement previewandexport_button = wait.until(ExpectedConditions.visibilityOfElementLocated(previewandexport_id));
+ previewandexport_button.click();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("detection-row")));
+ }
+ //will wait for the regex button to become clickable and then click the regex button
+ private void ClickRegexButton() throws InterruptedException {
+ By regex_search_id = By.id("regex-search");
+ WebElement regex_button = wait.until(ExpectedConditions.elementToBeClickable(regex_search_id));
+ regex_button.click();
+ Thread.sleep(500);
+ }
+ //send regex inputs to the corresponding pattern type
+ private void PatternInputStrings(String pattern_before, String pattern_after){
+ By pattern_before_input = By.id("pattern_before");
+ By pattern_after_input = By.id("pattern_after");
+ driver.findElement(pattern_before_input).sendKeys(pattern_before);
+ driver.findElement(pattern_after_input).sendKeys(pattern_after);
+ }
+ //send corresponding info of inclusive to the pattern type
+ private void InclusiveButtons(boolean patternbefore, boolean patternafter){
+ WebElement inclusive_before_btn = new WebDriverWait(driver, 30).until(ExpectedConditions.
+ elementToBeClickable(driver.findElement(By.id("include_pattern_before"))));
+ WebElement inclusive_after_btn = new WebDriverWait(driver, 30).until(ExpectedConditions.
+ elementToBeClickable(driver.findElement(By.id("include_pattern_after"))));
+ if (patternbefore){
+ inclusive_before_btn.click(); }
+ if(patternafter){
+ inclusive_after_btn.click(); }
+ }
+ //go on and upload the pdf file
+ private void UploadPDF() throws InterruptedException {
+ String filePath = System.getProperty("user.dir") + "/src/test/pdf/One_Stop_Voting_Site_List_Nov2012.pdf";
+ WebElement chooseFile = driver.findElement(By.id("file"));
+ chooseFile.sendKeys(filePath);
+ Thread.sleep(1000);
+ WebElement import_btn = driver.findElement(By.id("import_file"));
+ import_btn.click();
+ Thread.sleep(5000);
+ wait.until(ExpectedConditions.elementToBeClickable(By.id("restore-detected-tables")));
+ }
+ //delete the pdf file
+ private void DeletePDF(){
+ //navigates back and deletes the pdf utilized
+ driver.findElement(By.id("delete_pdf")).click();
+ driver.switchTo().alert().accept();
+ }
+ //instantiation of Tabula
+ @BeforeClass
+ public static void SetUp(){
+ //set up of chromedriver and navigation to the url, as well as uploading of the pdf file
+ System.setProperty("webdriver.chrome.driver","/usr/local/bin/chromedriver");
+ ChromeOptions options = new ChromeOptions();
+ options.addArguments("headless");
+ options.addArguments("no-sandbox");
+
+ driver = new ChromeDriver(options);
+ driver.get(Tabula_url);
+ driver.manage().window().maximize();
+ }
+ //test of 2 different instances of inputting regex to get a multi spanning table
+ @Test
+ public void TestMultiPageTables() {
+ try {
+ UploadPDF();
+ PageRefresh();
+
+ //Test of regex input with inclusive for pattern before for a table of 2 pages in length
+ PatternInputStrings("JEFFERSON", "BRUNSWICK");
+ InclusiveButtons(true, false);
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ //Confirm a result shows up in the regex search table
+ String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'1')]")).getText();
+ Boolean regex_result;
+ if (result.equals("1")) {
+ regex_result = true;
+ } //if true, there are zero matches
+ else {
+ regex_result = false;
+ }
+ PreviewandExportDatapg();
+ //verify data extraction
+ String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'JEFFERSON')]")).getText();
+ Boolean regex_data;
+ if (result_data.equals("JEFFERSON, NC 28640")) {
+ regex_data = true;
+ } else {
+ regex_data = false;
+ }
+ String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'DUBLIN')]")).getText();
+ Boolean regex_data2;
+ if (result_data2.equals("DUBLIN, NC 28332")) {
+ regex_data2 = true;
+ } else {
+ regex_data2 = false;
+ }
+ Boolean final_results;
+ if (regex_result && regex_data && regex_data2) {
+ final_results = true;
+ } else {
+ final_results = false;
+ }
+ assertTrue("Failed, regex found no match for inclusive input for pattern before for a 2 page length table"
+ , final_results);
+ driver.navigate().refresh();
+ PageRefresh();
+
+ //Test of regex input with inclusive for pattern after for a table of 5 pages in length
+ PatternInputStrings("CHEROKEE", "CUMBERLAND");
+ InclusiveButtons(true, true);
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ String result3 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'1')]")).getText();
+ Boolean regex_result3;
+ if (result3.equals("1")) {
+ regex_result3 = true;
+ } //if true, there are zero matches
+ else {
+ regex_result3 = false;
+ }
+ PreviewandExportDatapg();
+ String result_data5 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'CHEROKEE')]")).getText();
+ Boolean regex_data5;
+ if (result_data5.equals("CHEROKEE COUNTY BOARD OF ELECTIONS OFFICE")) {
+ regex_data5 = true;
+ } else {
+ regex_data5 = false;
+ }
+ String result_data6 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'CUMBERLAND')]")).getText();
+ Boolean regex_data6;
+ if (result_data6.equals("CUMBERLAND")) {
+ regex_data6 = true;
+ } else {
+ regex_data6 = false;
+ }
+ Boolean final_results3;
+ if (regex_result3 && regex_data5 && regex_data6) {
+ final_results3 = true;
+ } else {
+ final_results3 = false;
+ }
+ assertTrue("Failed, Tabula found no match for a multi page table spanning more than 2 pages",
+ final_results3);
+
+ driver.navigate().back();
+ driver.navigate().back();
+ Thread.sleep(500);
+ DeletePDF();
+ }catch (Exception e){
+ System.out.print(e);
+ }
+ }
+ //test of 3 different instances of inputting regex searches with 3 different types of inclusive combinations to
+ // get multiple regex results
+ @Test
+ public void TestInclusivePatternswithRegexSearches() {
+ try{
+ UploadPDF();
+ PageRefresh();
+
+ //Tests for inclusive for pattern before and non-inclusive for pattern after
+ PatternInputStrings("COUNTY","COUNTY");
+ InclusiveButtons(true, false);
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'69')]")).
+ getText();
+ Boolean regex_result;
+ if(result.equals("69")){ regex_result = true;} //if true, there are zero matches
+ else{ regex_result = false;}
+ PreviewandExportDatapg();
+ String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'County')]")).getText();
+ Boolean regex_data;
+ if(result_data.equals("County")){ regex_data = true;}
+ else{ regex_data = false;}
+ Thread.sleep(600);
+ String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'Thursday, November 1')]")).getText();
+ Boolean regex_data2;
+ if(result_data2.equals("Thursday, November 1 - Friday, November 2")){ regex_data2 = true;}
+ else{ regex_data2 = false;}
+ Boolean final_results;
+ if(regex_result && regex_data && regex_data2){ final_results = true;}
+ else{final_results = false;}
+ assertTrue("Failed, Tabula found no match for inclusive for pattern before and non-inclusive for " +
+ "pattern after", final_results);
+ driver.navigate().refresh();
+ PageRefresh();
+
+ //Tests for non-inclusive for pattern before and inclusive for pattern after
+ PatternInputStrings("Thursday", "Saturday");
+ InclusiveButtons(false, true);
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ String result2 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'326')]")).getText();
+ Boolean regex_result3;
+ if(result2.equals("326")){ regex_result3 = true;} //if true, there are zero matches
+ else{ regex_result3 = false;}
+ PreviewandExportDatapg();
+ String result_data3 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'Monday, October 22 - Friday, October 26')]")).getText();
+ Boolean regex_data3;
+ if(result_data3.equals("Monday, October 22 - Friday, October 26")){ regex_data3 = true;}
+ else{ regex_data3 = false;}
+ Thread.sleep(1000);
+ String result_data4 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'225 WEST MAIN ST')]")).getText();
+ Boolean regex_data4;
+ if(result_data4.equals("225 WEST MAIN ST")){ regex_data4 = true;}
+ else{ regex_data4 = false;}
+ Boolean final_results2;
+ if(regex_result3 && regex_data3 && regex_data4){ final_results2 = true;}
+ else{final_results2 = false;}
+ assertTrue("Failed, Tabula found no match for inclusive for pattern after and non-inclusive for " +
+ "pattern before", final_results2);
+ driver.navigate().refresh();
+ PageRefresh();
+
+ //Tests for inclusive for pattern before and for pattern after
+ PatternInputStrings("8:00","7:00");
+ InclusiveButtons(true, true);
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ String result3 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'68')]")).getText();
+ Boolean regex_result4;
+ if(result3.equals("68")){ regex_result4 = true;} //if true, there are zero matches
+ else{ regex_result4 = false;}
+ PreviewandExportDatapg();
+ String result_data5 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'Friday, October 19')]")).getText();
+ Boolean regex_data5;
+ if(result_data5.equals("Friday, October 19")){ regex_data5 = true;}
+ else{ regex_data5 = false;}
+ Thread.sleep(700);
+ String result_data6 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.,'YANCEY')]")).getText();
+ Boolean regex_data6;
+ if(result_data6.equals("YANCEY")){ regex_data6 = true;}
+ else{ regex_data6 = false;}
+ Boolean final_results3;
+ if(regex_result4 && regex_data5 && regex_data6){ final_results3 = true;}
+ else{final_results3 = false;}
+ assertTrue("Failed, Tabula found no match for inclusive for pattern after and inclusive for " +
+ "pattern before", final_results3);
+ driver.navigate().back();
+ driver.navigate().back();
+ Thread.sleep(500);
+ DeletePDF();
+ }catch(Exception e){
+ System.out.print(e);
+ }
+ }
+ //test of an overlapping instance where it checks that there is only one regex result after attempting an overlap
+ @Test
+ public void TestOverlapRegexSearch() {
+ try{
+ //Test for overlapping regex searches
+ UploadPDF();
+ PageRefresh();
+
+ PatternInputStrings("BERTIE", "CABARRUS");
+ InclusiveButtons(true, false);
+ ClickRegexButton();
+ Thread.sleep(5000);
+ PatternInputStrings("ANSON", "BUNCOMBE");
+ InclusiveButtons(false, true);
+ ClickRegexButton();
+ Thread.sleep(5000);
+ driver.switchTo().alert().accept(); //accept error pop-up window
+ //Checks that there is only one regex result, since it shouldn't had allowed for 2 results to appear since the
+ // 2nd one causes an overlap
+ Thread.sleep(2000);
+ List regex_rows = driver.findElements(By.className("regex-result"));
+ int regex_count = regex_rows.size();
+ int regex_count1 = 1;
+ assertTrue("Failed, Tabula found more than one match for an overlap regex search",
+ (regex_count1 == regex_count ));
+ PreviewandExportDatapg();
+ String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'MORGANTON, NC 28655')]")).getText();
+ Boolean regex_data;
+ if (result_data.equals("MORGANTON, NC 28655")) { regex_data = true;
+ } else { regex_data = false; }
+ String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'BERTIE COUNTY BOARD OF')]")).getText();
+ Boolean regex_data2;
+ if (result_data2.equals("BERTIE COUNTY BOARD OF ELECTIONS OFFICE")) { regex_data2 = true;
+ } else { regex_data2 = false; }
+ Boolean final_results;
+ if (regex_data && regex_data2) { final_results = true;
+ } else { final_results = false; }
+ assertTrue("Failed, Tabula found no match for the multi-page table", final_results);
+ driver.navigate().back();
+ driver.navigate().back();
+ Thread.sleep(500);
+ DeletePDF();
+ }catch (Exception e){
+ System.out.print(e);
+ }
+ }
+ @AfterClass
+ public static void TearDown(){
+ driver.quit();
+ }
+}
diff --git a/src/test/java/TestPreviewandExportData.java b/src/test/java/TestPreviewandExportData.java
new file mode 100644
index 000000000..4b32e7658
--- /dev/null
+++ b/src/test/java/TestPreviewandExportData.java
@@ -0,0 +1,117 @@
+import org.junit.After;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.chrome.ChromeOptions;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import java.util.List;
+import java.util.concurrent.TimeUnit;
+
+import static junit.framework.TestCase.assertTrue;
+import static org.junit.Assert.assertFalse;
+
+//Test of Tabula's Preview and Export Data page, including the links and buttons on both pages
+// that it navigates. For the preview page it toggles between the two different types to display data and
+// doesn't go into testing the preview's menu due to testing done already in the back-end on the different functionality.
+// For this test case, eu_002.pdf is utilized.
+// @author SM modified: 4/29/18
+public class TestPreviewandExportData {
+ private void PageRefresh() throws InterruptedException {
+ //menu options did not fully load
+ Thread.sleep(1000);
+ //refresh the page
+ while(driver.findElements( By.id("restore-detected-tables")).size() == 0) {
+ driver.navigate().refresh();
+ Thread.sleep(700);
+ }
+ }
+ WebDriver driver;
+ @Test
+ public void startWebDriver() throws InterruptedException {
+ System.setProperty("webdriver.chrome.driver","/usr/local/bin/chromedriver");
+ ChromeOptions options = new ChromeOptions();
+ options.addArguments("headless");
+ options.addArguments("no-sandbox");
+
+ driver = new ChromeDriver(options);
+ driver.get("http://127.0.0.1:9292/");
+ driver.manage().window().maximize();
+ WebDriverWait wait = new WebDriverWait(driver, 500);
+ String filePath = System.getProperty("user.dir") + "/src/test/pdf/eu-002.pdf";
+ WebElement chooseFile = driver.findElement(By.id("file"));
+ chooseFile.sendKeys(filePath);
+ WebElement import_btn = driver.findElement(By.id("import_file"));
+ import_btn.click();
+ Thread.sleep(5000);
+ try{
+ //navigates to the extraction page and checks that it is in the extraction page
+ PageRefresh();
+ //clicks on the Autodetect Tables and waits for Tabula to detect something (this will not be extensively tested
+ // for the sake that this is just a component test) then it wait and click the Preview & Export Data button
+ By autodetect_id = By.id("restore-detected-tables");
+ WebElement autodetect_button = wait.until(ExpectedConditions.elementToBeClickable(autodetect_id));
+ autodetect_button.click();
+ Thread.sleep(600);
+ By previewandexport_id = By.id("all-data");
+ WebElement previewandexport_button = driver.findElement(previewandexport_id);
+ previewandexport_button.click();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("detection-row")));
+
+ By revise_selections_id = By.id("revise-selections");
+ WebElement revise_selections_button = wait.until(ExpectedConditions.elementToBeClickable(revise_selections_id));
+ revise_selections_button.click();
+ driver.manage().timeouts().pageLoadTimeout(150, TimeUnit.SECONDS);
+ //checks that it navigated back to the extraction page
+ String regex_options_string = "Regex Options";
+ By regex_options_title = By.id("regex_options_title");
+ WebElement regex_options = wait.until(ExpectedConditions.elementToBeClickable(regex_options_title));
+ driver.manage().timeouts().pageLoadTimeout(150, TimeUnit.SECONDS);
+ assertTrue("Failed, couldn't find Extraction page", regex_options_string.equals(regex_options.getText()));
+ driver.navigate().back();
+ //counts the number of rows displayed when the stream button is set to default and compares the row count
+ //Thread.sleep(1000);
+ driver.manage().timeouts().pageLoadTimeout(150, TimeUnit.SECONDS);
+ List stream_rows = driver.findElements(By.className("detection-row"));
+ int stream_count = stream_rows.size();
+ int stream_hc_count = 38;
+ assertTrue("Failed, number of rows, from the Stream option, did not match", (stream_hc_count == stream_count ));
+
+ By lattice_id = By.id("spreadsheet-method-btn");
+ WebElement lattice_button = wait.until(ExpectedConditions.elementToBeClickable(lattice_id));
+ driver.manage().timeouts().pageLoadTimeout(150, TimeUnit.SECONDS);
+ lattice_button.click();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("detection-row")));
+ driver.manage().timeouts().pageLoadTimeout(150, TimeUnit.SECONDS);
+ List lattice_rows = driver.findElements(By.className("detection-row"));
+ int lattice_count = lattice_rows.size();
+ int lattice_hc_count = 7;
+ assertTrue("Failed, number of rows, from the Lattice option, did not match", (lattice_hc_count == lattice_count ));
+
+ By contact_name = By.linkText("Contact the developers");
+ WebElement contact_button = wait.until(ExpectedConditions.elementToBeClickable(contact_name));
+ contact_button.click();
+ String contact_url = "http://www.github.com/tabulapdf/tabula/issues/new";
+ driver.manage().timeouts().pageLoadTimeout(150, TimeUnit.SECONDS);
+ assertFalse("Failed, couldn't find GitHub's sign-in page to view the report an issue page", driver.getCurrentUrl().equals(contact_url));
+ driver.navigate().back();
+ By navbar_class = By.className("navbar-brand");
+ WebElement navbar_icon = wait.until(ExpectedConditions.visibilityOfElementLocated(navbar_class));
+ navbar_icon.click();
+ By delete_pdf = By.id("delete_pdf");
+ WebElement delete_btn = wait.until(ExpectedConditions.elementToBeClickable(delete_pdf));
+ delete_btn.click();
+ driver.switchTo().alert().accept();
+
+ }catch(Exception e){
+ System.out.print(e);
+ }
+ }
+ @After
+ public void TearDown(){
+ driver.quit();
+ }
+}
diff --git a/src/test/java/Testboron_isotopic.java b/src/test/java/Testboron_isotopic.java
new file mode 100644
index 000000000..e4ab2d421
--- /dev/null
+++ b/src/test/java/Testboron_isotopic.java
@@ -0,0 +1,303 @@
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openqa.selenium.By;
+import org.openqa.selenium.WebDriver;
+import org.openqa.selenium.WebElement;
+import org.openqa.selenium.chrome.ChromeDriver;
+import org.openqa.selenium.chrome.ChromeOptions;
+import org.openqa.selenium.support.ui.ExpectedConditions;
+import org.openqa.selenium.support.ui.WebDriverWait;
+
+import java.util.List;
+
+import static junit.framework.TestCase.assertTrue;
+//Test of the boron_isotopic pdf file, it will go through various user scenarios to test the functionality of the regex
+// implementation (spanning pages, multiple search results, inclusive and non-inclusive, and overlap)
+// @author SM modified: 4/29/18
+public class Testboron_isotopic {
+ //Test of the boron_isotopic pdf file.
+ private static WebDriver driver;
+ private static String Tabula_url = "http://127.0.0.1:9292/";
+ private WebDriverWait wait = new WebDriverWait(driver, 500);
+
+ //will continue to refresh the page until it sees one of the buttons appear in the menu option of the extraction page
+ private void PageRefresh() throws InterruptedException {
+ //menu options did not fully load
+ Thread.sleep(1000);
+ //refresh the page
+ while(driver.findElements( By.id("restore-detected-tables")).size() == 0) {
+ driver.navigate().refresh();
+ Thread.sleep(700);
+ }
+ }
+ //will navigate and wait for the data to appear in the preview and export data page
+ private void PreviewandExportDatapg(){
+ By previewandexport_id = By.id("all-data");
+ WebElement previewandexport_button = wait.until(ExpectedConditions.visibilityOfElementLocated(previewandexport_id));
+ previewandexport_button.click();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("detection-row")));
+ }
+ //will wait for the regex button to become clickable and then click the regex button
+ private void ClickRegexButton() throws InterruptedException {
+ By regex_search_id = By.id("regex-search");
+ WebElement regex_button = new WebDriverWait(driver, 30).until(ExpectedConditions.
+ elementToBeClickable(regex_search_id));
+ regex_button.click();
+ Thread.sleep(800);
+ }
+ //send regex inputs to the corresponding pattern type
+ private void PatternInputStrings(String pattern_before, String pattern_after){
+ By pattern_before_input = By.id("pattern_before");
+ By pattern_after_input = By.id("pattern_after");
+ driver.findElement(pattern_before_input).sendKeys(pattern_before);
+ driver.findElement(pattern_after_input).sendKeys(pattern_after);
+ }
+ //send corresponding info of inclusive to the pattern type
+ private void InclusiveButtons(boolean patternbefore, boolean patternafter){
+ WebElement inclusive_before_btn = new WebDriverWait(driver, 30).
+ until(ExpectedConditions.elementToBeClickable(driver.findElement(By.id("include_pattern_before"))));
+ WebElement inclusive_after_btn = new WebDriverWait(driver, 30).
+ until(ExpectedConditions.elementToBeClickable(driver.findElement(By.id("include_pattern_after"))));
+ if (patternbefore){
+ inclusive_before_btn.click(); }
+ if(patternafter){
+ inclusive_after_btn.click(); }
+ }
+ //go on and upload the pdf file
+ private void UploadPDF() throws InterruptedException {
+ String filePath = System.getProperty("user.dir") + "/src/test/pdf/boron_isotopic_anal.pdf";
+ WebElement chooseFile = driver.findElement(By.id("file"));
+ chooseFile.sendKeys(filePath);
+ Thread.sleep(1000);
+ WebElement import_btn = driver.findElement(By.id("import_file"));
+ import_btn.click();
+ Thread.sleep(5000);
+ wait.until(ExpectedConditions.elementToBeClickable(By.id("templates_title")));
+ }
+ //delete the pdf file
+ private void DeletePDF(){
+ //navigates back and deletes the pdf utilized
+ driver.findElement(By.id("delete_pdf")).click();
+ driver.switchTo().alert().accept();
+ }
+ //instantiation of Tabula
+ @BeforeClass
+ public static void SetUp(){
+ //set up of chromdriver and navigation to the url, as well as uploading of the pdf file
+ System.setProperty("webdriver.chrome.driver","/usr/local/bin/chromedriver");
+ ChromeOptions options = new ChromeOptions();
+ options.addArguments("headless");
+ options.addArguments("no-sandbox");
+
+ driver = new ChromeDriver(options);
+ driver.get(Tabula_url);
+ driver.manage().window().maximize();
+ }
+ //test of 2 different instances of inputting regex to get a multi spanning table
+ @Test
+ public void TestMultiPageTables() {
+ try {
+ UploadPDF();
+ PageRefresh();
+
+ //Test of regex input with inclusive for pattern before for a table of 3 pages in length
+ PatternInputStrings("ABSTRACT", "VibeCore");
+ InclusiveButtons(true, false);
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ //Confirm search found
+ String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'1')]")).getText();
+ Boolean regex_result;
+ if (result.equals("1")) {
+ regex_result = true;
+ } //if true, there are zero matches
+ else {
+ regex_result = false;
+ }
+ PreviewandExportDatapg();
+ //verify data extraction
+ String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'ABSTRACT: In the U.S., coal fired power plants produce over 136 million')]")).getText();
+ Boolean regex_data;
+ if (result_data.equals("ABSTRACT: In the U.S., coal fired power plants produce over 136 million")) {
+ regex_data = true;
+ } else {
+ regex_data = false;
+ }
+ String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'slower.24,26 Another consideration would be the addition of')]")).getText();
+ Boolean regex_data2;
+ if (result_data2.equals("slower.24,26 Another consideration would be the addition of")) {
+ regex_data2 = true;
+ } else {
+ regex_data2 = false;
+ }
+ Boolean final_results;
+ if (regex_result && regex_data && regex_data2) {
+ final_results = true;
+ } else {
+ final_results = false;
+ }
+ assertTrue("Failed, regex found no match for inclusive input for pattern before for a 3 page length table"
+ , final_results);
+ driver.navigate().back();
+ driver.navigate().back();
+ Thread.sleep(500);
+ DeletePDF();
+ }catch (Exception e){
+ System.out.print(e);
+ }
+ }
+ //test of 3 different instances of inputting regex searches with 3 different types of inclusive combinations to
+ // get multiple regex results
+ @Test
+ public void TestInclusivePatternswithRegexSearches() {
+ try{
+ UploadPDF();
+ PageRefresh();
+
+ //Tests for inclusive for pattern before and non-inclusive for pattern after
+ PatternInputStrings("Coal","CCRs");
+ InclusiveButtons(true, false);
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ String result = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'9')]")).getText();
+ Boolean regex_result;
+ if(result.equals("9")){ regex_result = true;} //if true, there are zero matches
+ else{ regex_result = false;}
+ PreviewandExportDatapg();
+ String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'Boron and Strontium Isotopic Characterization of Coal Combustion')]")).getText();
+ Boolean regex_data;
+ if(result_data.equals("Boron and Strontium Isotopic Characterization of Coal Combustion")){ regex_data = true;}
+ else{ regex_data = false;}
+ Thread.sleep(600);
+ String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'post treatment such as FGD, the boron and strontium isotopic')]")).getText();
+ Boolean regex_data2;
+ if(result_data2.equals("post treatment such as FGD, the boron and strontium isotopic")){ regex_data2 = true;}
+ else{ regex_data2 = false;}
+ Boolean final_results;
+ if(regex_result && regex_data && regex_data2){ final_results = true;}
+ else{final_results = false;}
+ assertTrue("Failed, Tabula found no match for inclusive for pattern before and non-inclusive for " +
+ "pattern after", final_results);
+ driver.navigate().refresh();
+ PageRefresh();
+
+ //Tests for non-inclusive for pattern before and inclusive for pattern after
+ PatternInputStrings("Boron", "Strontium");
+ InclusiveButtons(false, true);
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ String result2 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'7')]")).getText();
+ Boolean regex_result3;
+ if(result2.equals("7")){ regex_result3 = true;} //if true, there are zero matches
+ else{ regex_result3 = false;}
+ PreviewandExportDatapg();
+ String result_data3 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'elements20 that adsorbed onto the fly ash particles during')]")).getText();
+ Boolean regex_data3;
+ if(result_data3.equals("elements20 that adsorbed onto the fly ash particles during")){ regex_data3 = true;}
+ else{ regex_data3 = false;}
+ Thread.sleep(1000);
+ String result_data4 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'C.; Schroeder, K. T.; Brubaker, T. M. Strontium isotope study of coal')]")).getText();
+ Boolean regex_data4;
+ if(result_data4.equals("C.; Schroeder, K. T.; Brubaker, T. M. Strontium isotope study of coal")){ regex_data4 = true;}
+ else{ regex_data4 = false;}
+ Boolean final_results2;
+ if(regex_result3 && regex_data3 && regex_data4){ final_results2 = true;}
+ else{final_results2 = false;}
+ assertTrue("Failed, Tabula found no match for inclusive for pattern after and non-inclusive for " +
+ "pattern before", final_results2);
+ driver.navigate().refresh();
+ PageRefresh();
+
+ //Tests for inclusive for pattern before and for pattern after
+ PatternInputStrings("CCRs","Boron");
+ InclusiveButtons(true, true);
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ String result3 = driver.findElement(By.xpath(".//*[@class='regex-results-table']//td[contains(.,'4')]")).getText();
+ Boolean regex_result4;
+ if(result3.equals("4")){ regex_result4 = true;} //if true, there are zero matches
+ else{ regex_result4 = false;}
+ PreviewandExportDatapg();
+ String result_data5 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'composition of leachates generated from CCRs in coal-fired')]")).getText();
+ Boolean regex_data5;
+ if(result_data5.equals("composition of leachates generated from CCRs in coal-fired")){ regex_data5 = true;}
+ else{ regex_data5 = false;}
+ Thread.sleep(700);
+ String result_data6 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'and quantifying their impact on the environment.')]")).getText();
+ Boolean regex_data6;
+ if(result_data6.equals("and quantifying their impact on the environment.")){ regex_data6 = true;}
+ else{ regex_data6 = false;}
+ Boolean final_results3;
+ if(regex_result4 && regex_data5 && regex_data6){ final_results3 = true;}
+ else{final_results3 = false;}
+ assertTrue("Failed, Tabula found no match for inclusive for pattern after and inclusive for " +
+ "pattern before", final_results3);
+ driver.navigate().back();
+ driver.navigate().back();
+ Thread.sleep(500);
+ DeletePDF();
+ }catch(Exception e){
+ System.out.print(e);
+ }
+ }
+ //test of an overlapping instance where it checks that there is only one regex result after attempting an overlap
+ @Test
+ public void TestOverlapRegexSearch() {
+ try{
+ //Test for overlapping regex searches
+ UploadPDF();
+ PageRefresh();
+
+ PatternInputStrings("(17)", "(26)");
+ InclusiveButtons(true, false);
+ ClickRegexButton();
+ wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("regex-result")));
+ PatternInputStrings("(25)", "10041");
+ InclusiveButtons(false, true);
+ ClickRegexButton();
+ Thread.sleep(5000);
+ driver.switchTo().alert().accept(); //accept error pop-up window
+ //Checks that there is only one regex result, since it shouldn't had allowed for 2 results to appear since the
+ // 2nd one causes an overlap
+ Thread.sleep(2000);
+ List regex_rows = driver.findElements(By.className("regex-result"));
+ int regex_count = regex_rows.size();
+ int regex_count1 = 1;
+ assertTrue("Failed, Tabula found more than one match for an overlap regex search", (regex_count1 == regex_count ));
+ PreviewandExportDatapg();
+ String result_data = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'Plant 1')]")).getText();
+ Boolean regex_data;
+ if (result_data.equals("Plant 1")) { regex_data = true;
+ } else { regex_data = false; }
+ String result_data2 = driver.findElement(By.xpath(".//*[@id='extracted-table']//td[contains(.," +
+ "'10041−10048.')]")).getText();
+ Boolean regex_data2;
+ if (result_data2.equals("10041−10048.")) { regex_data2 = true;
+ } else { regex_data2 = false; }
+ Boolean final_results;
+ if (regex_data && regex_data2) { final_results = true;
+ } else { final_results = false; }
+ assertTrue("Failed, Tabula found no match for the multi-page table", final_results);
+ driver.navigate().back();
+ driver.navigate().back();
+ Thread.sleep(500);
+ DeletePDF();
+ }catch (Exception e){
+ System.out.print(e);
+ }
+ }
+ @AfterClass
+ public static void TearDown(){
+ driver.quit();
+ }
+}
diff --git a/src/test/pdf/4._Buck_CAP_Part_2_Appx_A_partial.pdf b/src/test/pdf/4._Buck_CAP_Part_2_Appx_A_partial.pdf
new file mode 100644
index 000000000..14a24ffdd
Binary files /dev/null and b/src/test/pdf/4._Buck_CAP_Part_2_Appx_A_partial.pdf differ
diff --git a/src/test/pdf/Allen_CSA_table_6-9_gradients.pdf b/src/test/pdf/Allen_CSA_table_6-9_gradients.pdf
new file mode 100644
index 000000000..a897ff853
Binary files /dev/null and b/src/test/pdf/Allen_CSA_table_6-9_gradients.pdf differ
diff --git a/src/test/pdf/Cliffside_CSA_Report_NCDENR_Submittal.pdf b/src/test/pdf/Cliffside_CSA_Report_NCDENR_Submittal.pdf
new file mode 100644
index 000000000..9e0d1e502
Binary files /dev/null and b/src/test/pdf/Cliffside_CSA_Report_NCDENR_Submittal.pdf differ
diff --git a/src/test/pdf/Correspondence_FINAL_SBE_one-stop_plans_adopted_for_non-unanimous_countiespdf.pdf b/src/test/pdf/Correspondence_FINAL_SBE_one-stop_plans_adopted_for_non-unanimous_countiespdf.pdf
new file mode 100644
index 000000000..56182de2a
Binary files /dev/null and b/src/test/pdf/Correspondence_FINAL_SBE_one-stop_plans_adopted_for_non-unanimous_countiespdf.pdf differ
diff --git a/src/test/pdf/Feb_9,_2016_1_4700_PM_ESTRE_Voters.pdf b/src/test/pdf/Feb_9,_2016_1_4700_PM_ESTRE_Voters.pdf
new file mode 100644
index 000000000..70bec34ad
Binary files /dev/null and b/src/test/pdf/Feb_9,_2016_1_4700_PM_ESTRE_Voters.pdf differ
diff --git a/src/test/pdf/Mecklenburg.Majority.pdf b/src/test/pdf/Mecklenburg.Majority.pdf
new file mode 100644
index 000000000..78cee3de8
Binary files /dev/null and b/src/test/pdf/Mecklenburg.Majority.pdf differ
diff --git a/src/test/pdf/NC_HOUSE_2017_Stat_Pack_8.21.17.pdf b/src/test/pdf/NC_HOUSE_2017_Stat_Pack_8.21.17.pdf
new file mode 100644
index 000000000..391b2bbcb
Binary files /dev/null and b/src/test/pdf/NC_HOUSE_2017_Stat_Pack_8.21.17.pdf differ
diff --git a/src/test/pdf/One_Stop_Voting_Site_List_Nov2012.pdf b/src/test/pdf/One_Stop_Voting_Site_List_Nov2012.pdf
new file mode 100644
index 000000000..353bb34df
Binary files /dev/null and b/src/test/pdf/One_Stop_Voting_Site_List_Nov2012.pdf differ
diff --git a/src/test/pdf/boron_isotopic_anal.pdf b/src/test/pdf/boron_isotopic_anal.pdf
new file mode 100644
index 000000000..e6abb7fed
Binary files /dev/null and b/src/test/pdf/boron_isotopic_anal.pdf differ
diff --git a/src/test/pdf/eu-002.pdf b/src/test/pdf/eu-002.pdf
new file mode 100644
index 000000000..adf49dc01
Binary files /dev/null and b/src/test/pdf/eu-002.pdf differ
diff --git a/src/test/test.iml b/src/test/test.iml
new file mode 100644
index 000000000..a0e49a3ba
--- /dev/null
+++ b/src/test/test.iml
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst
new file mode 100644
index 000000000..e69de29bb
diff --git a/waitForServerLoad.sh b/waitForServerLoad.sh
new file mode 100644
index 000000000..82ff5a6c8
--- /dev/null
+++ b/waitForServerLoad.sh
@@ -0,0 +1,24 @@
+#!/usr/bin/env bash
+gem update --system
+res=1;
+num_iter=20
+iter="$num_iter";
+while [[ "$res" -ne 0 ]] && [[ "$iter" -gt 0 ]]
+do
+ sleep 1m #Sleep for a minute in between curl calls...
+ iter=$((iter-1));
+ printf "Iteration #%d\n" "$(($num_iter-$iter))"
+ curl -s http://localhost:9292/
+ res=$?
+ printf "Return value of curl:%d\n" "$res"
+done
+
+if [[ "$res" -ne 0 ]]
+then
+ printf "CONNECTION COULD NOT BE MADE TO SERVER...\n"
+else
+ printf "CONNECTION MADE TO SERVER: BEGINNING TEST CASES...\n"
+fi
+
+exit $res
+
diff --git a/webapp/index.html b/webapp/index.html
index 4c47eaabb..165ea12db 100644
--- a/webapp/index.html
+++ b/webapp/index.html
@@ -1,3 +1,13 @@
+
@@ -47,10 +57,7 @@
My Templates
About
Help
- Source Code
-
-
@@ -69,16 +76,16 @@
@@ -87,15 +94,17 @@
- <%= original_filename %>
+ <%= original_filename %>
-