From 981fca657f397ac5bb05ced0c13be727be9b72ba Mon Sep 17 00:00:00 2001 From: withanage Date: Mon, 20 Feb 2017 12:08:24 +0100 Subject: [PATCH 01/84] limit_by --- controllers/catalog.py | 8 +++++++- modules | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/controllers/catalog.py b/controllers/catalog.py index 81b9c408..9f69f9f4 100755 --- a/controllers/catalog.py +++ b/controllers/catalog.py @@ -13,6 +13,9 @@ def category(): + + + ignored_submission_id = myconf.take('omp.ignore_submissions') if myconf.take( 'omp.ignore_submissions') else -1 @@ -113,8 +116,11 @@ def series(): def index(): ompdal = OMPDAL(db, myconf) - press = ompdal.getPress(myconf.take('omp.press_id')) + limit_by = request.vars.get('catalog_limit_by', session.get('limit_by')) + + + if not press: redirect(URL('home', 'index')) press_settings = OMPSettings(ompdal.getPressSettings(press.press_id)) diff --git a/modules b/modules index 6609519d..f5ee616f 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit 6609519d37e02a2c411ba300272743f551d25fc5 +Subproject commit f5ee616f2cffdf9f670ded7fdd71e27476de0c19 From 9c7ed23c2965f8c997f20710b2611f1ef5a66d76 Mon Sep 17 00:00:00 2001 From: withanage Date: Mon, 20 Feb 2017 12:27:51 +0100 Subject: [PATCH 02/84] limit_by --- controllers/catalog.py | 6 ++++-- modules | 2 +- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/controllers/catalog.py b/controllers/catalog.py index ab79b51c..ece4a3cf 100755 --- a/controllers/catalog.py +++ b/controllers/catalog.py @@ -122,7 +122,9 @@ def series(): def index(): ompdal = OMPDAL(db, myconf) press = ompdal.getPress(myconf.take('omp.press_id')) - limit_by = request.vars.get('catalog_limit_by', session.get('limit_by')) + per_page = int(request.vars.get('per_page', session.get('catalog_per_page',20))) + page_nr = int(request.vars.get('page_nr',0)) + limit_by = ((page_nr*per_page), (page_nr+1)*per_page) @@ -134,7 +136,7 @@ def index(): 'omp.ignore_submissions') else -1 submissions = [] - for submission_row in ompdal.getSubmissionsByPress(press.press_id, ignored_submission_id): + for submission_row in ompdal.getSubmissionsByPress(press.press_id, ignored_submission_id, limit_by): authors = [OMPItem(author, OMPSettings(ompdal.getAuthorSettings(author.author_id))) for author in ompdal.getAuthorsBySubmission(submission_row.submission_id)] editors = [OMPItem(editor, OMPSettings(ompdal.getAuthorSettings(editor.author_id))) diff --git a/modules b/modules index f5ee616f..378bc526 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit f5ee616f2cffdf9f670ded7fdd71e27476de0c19 +Subproject commit 378bc52615d8a3758f3b64d8a91b37e7487dd1a8 From d8d880bb953da901ab12032a9c1d9c25de62be6a Mon Sep 17 00:00:00 2001 From: withanage Date: Mon, 20 Feb 2017 16:29:32 +0100 Subject: [PATCH 03/84] bootstrap limit --- controllers/catalog.py | 11 +++++++--- modules | 2 +- views/catalog/index.html | 46 ++++++++++++++++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 4 deletions(-) diff --git a/controllers/catalog.py b/controllers/catalog.py index ece4a3cf..71ef87c5 100755 --- a/controllers/catalog.py +++ b/controllers/catalog.py @@ -122,9 +122,9 @@ def series(): def index(): ompdal = OMPDAL(db, myconf) press = ompdal.getPress(myconf.take('omp.press_id')) + per_page = int(request.vars.get('per_page', session.get('catalog_per_page',20))) - page_nr = int(request.vars.get('page_nr',0)) - limit_by = ((page_nr*per_page), (page_nr+1)*per_page) + page_nr = int(request.vars.get('page_nr',0))-1 @@ -136,7 +136,9 @@ def index(): 'omp.ignore_submissions') else -1 submissions = [] - for submission_row in ompdal.getSubmissionsByPress(press.press_id, ignored_submission_id, limit_by): + submission_rows = ompdal.getSubmissionsByPress(press.press_id, ignored_submission_id) + + for submission_row in submission_rows: authors = [OMPItem(author, OMPSettings(ompdal.getAuthorSettings(author.author_id))) for author in ompdal.getAuthorsBySubmission(submission_row.submission_id)] editors = [OMPItem(editor, OMPSettings(ompdal.getAuthorSettings(editor.author_id))) @@ -165,7 +167,10 @@ def index(): submissions = sorted(submissions, key=lambda s: min( s.associated_items.get('publication_dates', [datetime(1, 1, 1)])), reverse=True) + #submissions = sorted(submissions,key=lambda s: s.associated_items.get('category',None), reverse=False) + #Slice + submissions = submissions[page_nr*per_page:(page_nr+1)*(per_page)] return locals() diff --git a/modules b/modules index 378bc526..23c58467 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit 378bc52615d8a3758f3b64d8a91b37e7487dd1a8 +Subproject commit 23c58467e6c9f18ef17f88b64d110fc7009bd5bc diff --git a/views/catalog/index.html b/views/catalog/index.html index 30f54c02..ab08f796 100755 --- a/views/catalog/index.html +++ b/views/catalog/index.html @@ -3,7 +3,53 @@ {{from ompformat import formatContributors, coverImageLink}}
+ +
+ +
+
+
+
+ + + + {{results_per_page=[2,10,50]}} + +
+ + +
+ + +
{{for submission in submissions:}}
From 89494a8a865616cae70115f734cede646a5695dd Mon Sep 17 00:00:00 2001 From: withanage Date: Mon, 20 Feb 2017 16:56:30 +0100 Subject: [PATCH 04/84] catalog --- controllers/catalog.py | 9 +++++++-- views/catalog/index.html | 11 +++++++---- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/controllers/catalog.py b/controllers/catalog.py index 71ef87c5..db57a573 100755 --- a/controllers/catalog.py +++ b/controllers/catalog.py @@ -123,8 +123,13 @@ def index(): ompdal = OMPDAL(db, myconf) press = ompdal.getPress(myconf.take('omp.press_id')) - per_page = int(request.vars.get('per_page', session.get('catalog_per_page',20))) - page_nr = int(request.vars.get('page_nr',0))-1 + per_page = request.vars.get('per_page') + if per_page : + session.catalog_per_page = int(per_page) + + per_page = int(session.get('catalog_per_page', 20)) + + page_nr = int(request.vars.get('page_nr',0)) diff --git a/views/catalog/index.html b/views/catalog/index.html index ab08f796..bb66f446 100755 --- a/views/catalog/index.html +++ b/views/catalog/index.html @@ -17,7 +17,7 @@ Results per page - {{results_per_page=[2,10,50]}} + {{results_per_page=[2,3,4]}}
+
-
{{for submission in submissions:}} -
-
-
-
-
- {{=IMG(_src=coverImageLink(request, press.press_id, submission.attributes.submission_id))}} -
-
-
-
-
-
- {{include 'catalog/snippets/submission.html'}} - {{series = submission.associated_items.get('series', None)}} - - {{if series:}} - {{series_title = series.settings.getLocalizedValue('title', locale)}} - {{series_subtitle = series.settings.getLocalizedValue('subtitle', locale)}} - {{=series_title}}{{ if series_subtitle: }} – {{=series_subtitle}}{{pass}}{{if submission.attributes.series_position:}}, {{=T('Vol.')}} {{=submission.attributes.series_position}} {{pass}} - {{pass}} -
-

- - {{abstract = submission.settings.getLocalizedValue('abstract', locale)}} - {{if abstract:}} - {{=XML(abstract)}} - {{pass}} -

- -
-
-
-
- {{pass}} -
-
-
-
-
-
+
+
+
+
+
+ {{=IMG(_src=coverImageLink(request, press.press_id, submission.attributes.submission_id))}}
+
+
+
+
-

{{=T('Forthcoming')}}

+ {{include 'catalog/snippets/submission.html'}} + {{series = submission.associated_items.get('series', None)}} + + {{if series:}} + {{series_title = series.settings.getLocalizedValue('title', locale)}} + {{series_subtitle = series.settings.getLocalizedValue('subtitle', locale)}} + {{=series_title}}{{ if series_subtitle: }} – {{=series_subtitle}}{{pass}}{{if submission.attributes.series_position:}}, {{=T('Vol.')}} {{=submission.attributes.series_position}} {{pass}} + {{pass}}
-
+

+ + {{abstract = submission.settings.getLocalizedValue('abstract', locale)}} + {{if abstract:}} + {{=XML(abstract)}} + {{pass}} +

+ -
+
- - -
-
-
-
- -
-
-
-
-
-
-

Corinna Forberg, Philipp W. Stockhammer (Eds.)

- -
-

The Transformative Power of the Copy
- A Transcultural and Interdisciplinary Approach

- Heidelberg Studies in Transculturality, vol. 2 + {{pass}} +
+
+
+
+
+
+
+
+

{{=T('Forthcoming')}}

+
+
+
+
-

-

This volume offers a fresh perspective on the copy and the practice of copying, two topics that, while the focus of much academic discussion in recent decades, have been underrepresented in the discourse on transculturality. Here, experts from a wide range of academic disciplines present their views on the copy from a transcultural perspective, seeking not to define the copy uniformly, but to reveal its dynamic and transformative power. The copy and the practice of copying are thus presented as constituents of transculturality via thought-provoking contributions on topics spanning time periods from antiquity to the present, and regions from Asia to Europe. In so doing, these contributions aim to create the basis for a novel, interdisciplinary discourse on the copy and its transcultural impact throughout history.

-
+
-
-
-
-
-
- -
-
+ + +
+
+
+
+ +
+
+
+
+
+
+

Corinna Forberg, Philipp W. Stockhammer (Eds.)

+ +
+

The Transformative Power of the Copy
+ A Transcultural and Interdisciplinary Approach

+ Heidelberg Studies in Transculturality, vol. 2 +
+

+

This volume offers a fresh perspective on the copy and the practice of copying, two topics that, while the focus of much academic discussion in recent decades, have been underrepresented in the discourse on transculturality. Here, experts from a wide range of academic disciplines present their views on the copy from a transcultural perspective, seeking not to define the copy uniformly, but to reveal its dynamic and transformative power. The copy and the practice of copying are thus presented as constituents of transculturality via thought-provoking contributions on topics spanning time periods from antiquity to the present, and regions from Asia to Europe. In so doing, these contributions aim to create the basis for a novel, interdisciplinary discourse on the copy and its transcultural impact throughout history.

+
+
-
-
-
-

Horst Gundlach

- -
-

Wilhelm Windelband und die Psychologie – Das Fach Philosophie und die Wissenschaft Psychologie im Deutschen Kaiserreich

-
-

-

Wilhelm Windelband (1848-1915) war Ordinarius der Philosophie im Deutschen Kaiserreich, Haupt der südwestdeutschen Schule des Neukantianismus und einflussreicher Kathederfürst. Dem Neukantianismus wird Gegnerschaft zur Psychologie nachgesagt, und Windelband gilt in der Wissenschaftsgeschichte als jemand, der eine ausgeprägte Abneigung gegen die Psychologie hegte und diese polemisch von sich gab. Die hier erstmalig untersuchte Wirklichkeit sah anders aus. Er setzte sich frühzeitig für die Selbständigkeit der Psychologie ein, arbeitete an einem Buch zur Psychologie und hielt mehr als zwanzig Hauptvorlesungen zur Psychologie. Institutionelle Hintergründe des problematischen Verhältnisses zwischen Philosophie und Psychologie werden untersucht und gezeigt, weshalb Windelband kein Einzelfall in der Geschichte des Faches Philosophie war.

-
+
+
+
+
+ +
+
+
+
+
+
+

Horst Gundlach

+ +
+

Wilhelm Windelband und die Psychologie – Das Fach Philosophie und die Wissenschaft Psychologie im Deutschen Kaiserreich

+
+

+

Wilhelm Windelband (1848-1915) war Ordinarius der Philosophie im Deutschen Kaiserreich, Haupt der südwestdeutschen Schule des Neukantianismus und einflussreicher Kathederfürst. Dem Neukantianismus wird Gegnerschaft zur Psychologie nachgesagt, und Windelband gilt in der Wissenschaftsgeschichte als jemand, der eine ausgeprägte Abneigung gegen die Psychologie hegte und diese polemisch von sich gab. Die hier erstmalig untersuchte Wirklichkeit sah anders aus. Er setzte sich frühzeitig für die Selbständigkeit der Psychologie ein, arbeitete an einem Buch zur Psychologie und hielt mehr als zwanzig Hauptvorlesungen zur Psychologie. Institutionelle Hintergründe des problematischen Verhältnisses zwischen Philosophie und Psychologie werden untersucht und gezeigt, weshalb Windelband kein Einzelfall in der Geschichte des Faches Philosophie war.

+
+
-
-
- +
+
From 239402b58fc1075aa08c87e299c3d0dc3d52f225 Mon Sep 17 00:00:00 2001 From: withanage Date: Fri, 3 Mar 2017 09:55:27 +0100 Subject: [PATCH 06/84] Solr docs --- static/docs/SOLR.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 static/docs/SOLR.md diff --git a/static/docs/SOLR.md b/static/docs/SOLR.md new file mode 100644 index 00000000..e69de29b From 73b0b1427f797272e4020ff4144d23e6acd1da02 Mon Sep 17 00:00:00 2001 From: Dulip Withanage Date: Fri, 3 Mar 2017 10:05:22 +0100 Subject: [PATCH 07/84] Update SOLR.md --- static/docs/SOLR.md | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/static/docs/SOLR.md b/static/docs/SOLR.md index e69de29b..7fb183c4 100644 --- a/static/docs/SOLR.md +++ b/static/docs/SOLR.md @@ -0,0 +1,25 @@ +# Install Solr + +### Install JDK, if not installed. +``` +sudo apt-get -y install openjdk-7-jdk +mkdir /usr/java +ln -s /usr/lib/jvm/java-7-openjdk-amd64 /usr/java/default +``` +## (Ubuntu / Debian Systems) + +### from binaries +``` +sudo apt-get -y install solr-tomcat +``` +## From Source +cd /opt +wget http://archive.apache.org/dist/lucene/solr/6.4.1/solr-6.4.1-src.tgz +tar -xvf solr-6.4.1-src.tgz +cp -R solr-6.4.1-src.tgz/example /opt/solr +cd /opt/solr +java -jar start.jar + + + + From baf1c1a2f112d75aae83272bd7b511e0fee89dbd Mon Sep 17 00:00:00 2001 From: Dulip Withanage Date: Fri, 3 Mar 2017 10:10:58 +0100 Subject: [PATCH 08/84] Update SOLR.md --- static/docs/SOLR.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/static/docs/SOLR.md b/static/docs/SOLR.md index 7fb183c4..ff4c9988 100644 --- a/static/docs/SOLR.md +++ b/static/docs/SOLR.md @@ -12,13 +12,17 @@ ln -s /usr/lib/jvm/java-7-openjdk-amd64 /usr/java/default ``` sudo apt-get -y install solr-tomcat ``` -## From Source -cd /opt +## From Source +(You must be root or have rights on the /usr/local/ folder, otherwise change accordingly ) +``` +cd /usr/local +mkdir /usr/local/solr wget http://archive.apache.org/dist/lucene/solr/6.4.1/solr-6.4.1-src.tgz tar -xvf solr-6.4.1-src.tgz -cp -R solr-6.4.1-src.tgz/example /opt/solr -cd /opt/solr +cp -R solr-6.4.1/solr/example/ /usr/local/solr/ +cd /usr/local/solr java -jar start.jar +``` From 63118d291cc505f503e9b9fb38e6dc4e0f219556 Mon Sep 17 00:00:00 2001 From: Dulip Withanage Date: Fri, 3 Mar 2017 12:50:24 +0100 Subject: [PATCH 09/84] Update SOLR.md --- static/docs/SOLR.md | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/static/docs/SOLR.md b/static/docs/SOLR.md index ff4c9988..f28f1d83 100644 --- a/static/docs/SOLR.md +++ b/static/docs/SOLR.md @@ -1,6 +1,6 @@ # Install Solr -### Install JDK, if not installed. + ``` sudo apt-get -y install openjdk-7-jdk mkdir /usr/java @@ -8,22 +8,21 @@ ln -s /usr/lib/jvm/java-7-openjdk-amd64 /usr/java/default ``` ## (Ubuntu / Debian Systems) -### from binaries +### Install JDK, if not installed. ``` -sudo apt-get -y install solr-tomcat +sudo apt-get update && apt-get upgrade -y +sudo apt-get install python-software-properties +sudo add-apt-repository ppa:webupd8team/java +sudo apt-get update +sudo apt-get install oracle-java8-installer +java -version ``` -## From Source -(You must be root or have rights on the /usr/local/ folder, otherwise change accordingly ) +## Install Solr ``` -cd /usr/local -mkdir /usr/local/solr -wget http://archive.apache.org/dist/lucene/solr/6.4.1/solr-6.4.1-src.tgz -tar -xvf solr-6.4.1-src.tgz -cp -R solr-6.4.1/solr/example/ /usr/local/solr/ -cd /usr/local/solr -java -jar start.jar +cd /tmp/ +wget http://archive.apache.org/dist/lucene/solr/6.4.1/solr-6.4.1.tgz +tar xzf solr-6.4.1.tgz solr-6.4.1/bin/install_solr_service.sh --strip-components=2 +sudo ./install_solr_service.sh solr-6.4.1.tgz ``` - - - - +Solr will be installed under /opt/solr and it start in port 8983 +Check with (http://localhost:8983/solr)[http://localhost:8983/solr] From 897cb65f3c4edf9c9e0574a528a842616753f84f Mon Sep 17 00:00:00 2001 From: Dulip Withanage Date: Fri, 3 Mar 2017 12:50:37 +0100 Subject: [PATCH 10/84] Update SOLR.md --- static/docs/SOLR.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/docs/SOLR.md b/static/docs/SOLR.md index f28f1d83..81bc3e05 100644 --- a/static/docs/SOLR.md +++ b/static/docs/SOLR.md @@ -25,4 +25,4 @@ tar xzf solr-6.4.1.tgz solr-6.4.1/bin/install_solr_service.sh --strip-components sudo ./install_solr_service.sh solr-6.4.1.tgz ``` Solr will be installed under /opt/solr and it start in port 8983 -Check with (http://localhost:8983/solr)[http://localhost:8983/solr] +Check with [http://localhost:8983/solr](http://localhost:8983/solr) From f1f8064da03f8c1a0ff403d6de563cf053d2173e Mon Sep 17 00:00:00 2001 From: Dulip Withanage Date: Fri, 3 Mar 2017 12:53:12 +0100 Subject: [PATCH 11/84] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 7ebcd341..7ac7d2d5 100755 --- a/README.md +++ b/README.md @@ -7,6 +7,7 @@ Table of Contents * [Features](#features) * [Installation](#installation) * [Help Tools](#help-tools) + * [Solt Search](https://github.com/UB-Heidelberg/UBHD-OMPPortal/blob/categories/static/docs/SOLR.md) * [VGWort Pixel Import](#vgwort-pixel-import) * [Description](#description) * [Installation](#installation-1) From 3b390ca1a8edd045129a214731900ab44a07bdea Mon Sep 17 00:00:00 2001 From: Dulip Withanage Date: Fri, 3 Mar 2017 13:00:42 +0100 Subject: [PATCH 12/84] Update SOLR.md --- static/docs/SOLR.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/static/docs/SOLR.md b/static/docs/SOLR.md index 81bc3e05..9bd9968a 100644 --- a/static/docs/SOLR.md +++ b/static/docs/SOLR.md @@ -26,3 +26,9 @@ sudo ./install_solr_service.sh solr-6.4.1.tgz ``` Solr will be installed under /opt/solr and it start in port 8983 Check with [http://localhost:8983/solr](http://localhost:8983/solr) + +## Create a OMP Collection and scheme + +``` + sudo su - solr -c "/opt/solr/bin/solr create -c presss_portal -n omp" + ``` From 17682311ebd3e6f8e89038fa34f1217f188e796d Mon Sep 17 00:00:00 2001 From: Dulip Withanage Date: Fri, 3 Mar 2017 13:06:33 +0100 Subject: [PATCH 13/84] Update SOLR.md --- static/docs/SOLR.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/static/docs/SOLR.md b/static/docs/SOLR.md index 9bd9968a..e5b14d70 100644 --- a/static/docs/SOLR.md +++ b/static/docs/SOLR.md @@ -32,3 +32,9 @@ Check with [http://localhost:8983/solr](http://localhost:8983/solr) ``` sudo su - solr -c "/opt/solr/bin/solr create -c presss_portal -n omp" ``` +## Install Python dependancy + +``` +sudo pip install sunburnt + +``` From df7bdd6390a4220597110f096ef061f2cc9620f4 Mon Sep 17 00:00:00 2001 From: Dulip Withanage Date: Fri, 3 Mar 2017 13:06:46 +0100 Subject: [PATCH 14/84] Update SOLR.md --- static/docs/SOLR.md | 1 - 1 file changed, 1 deletion(-) diff --git a/static/docs/SOLR.md b/static/docs/SOLR.md index e5b14d70..9abc17bc 100644 --- a/static/docs/SOLR.md +++ b/static/docs/SOLR.md @@ -36,5 +36,4 @@ Check with [http://localhost:8983/solr](http://localhost:8983/solr) ``` sudo pip install sunburnt - ``` From 7dc55ec398ed25ac1c942d935cd38fb5fb1ff73c Mon Sep 17 00:00:00 2001 From: Dulip Withanage Date: Fri, 3 Mar 2017 14:52:42 +0100 Subject: [PATCH 15/84] Update SOLR.md --- static/docs/SOLR.md | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/static/docs/SOLR.md b/static/docs/SOLR.md index 9abc17bc..fbbc3276 100644 --- a/static/docs/SOLR.md +++ b/static/docs/SOLR.md @@ -1,14 +1,15 @@ -# Install Solr +# Installation +## (Ubuntu / Debian Systems) +### Install JDK, if not installed. ``` sudo apt-get -y install openjdk-7-jdk mkdir /usr/java ln -s /usr/lib/jvm/java-7-openjdk-amd64 /usr/java/default ``` -## (Ubuntu / Debian Systems) -### Install JDK, if not installed. + ``` sudo apt-get update && apt-get upgrade -y sudo apt-get install python-software-properties @@ -17,7 +18,7 @@ sudo apt-get update sudo apt-get install oracle-java8-installer java -version ``` -## Install Solr +### Install Solr ``` cd /tmp/ wget http://archive.apache.org/dist/lucene/solr/6.4.1/solr-6.4.1.tgz @@ -27,6 +28,13 @@ sudo ./install_solr_service.sh solr-6.4.1.tgz Solr will be installed under /opt/solr and it start in port 8983 Check with [http://localhost:8983/solr](http://localhost:8983/solr) +### Install Python dependancy + +``` +sudo pip install sunburnt +``` + +# Configuration ## Create a OMP Collection and scheme ``` From 4d5631e0fea042663be828bfea7006d1cd19b839 Mon Sep 17 00:00:00 2001 From: withanage Date: Mon, 6 Mar 2017 14:48:47 +0100 Subject: [PATCH 16/84] Solr plugin dev --- controllers/catalog.py | 10 + static/utils/solr/schema.xml | 427 +++++++++++++++++++++++++++++++++++ 2 files changed, 437 insertions(+) create mode 100644 static/utils/solr/schema.xml diff --git a/controllers/catalog.py b/controllers/catalog.py index db9f2daa..24ca212d 100755 --- a/controllers/catalog.py +++ b/controllers/catalog.py @@ -120,6 +120,16 @@ def series(): def index(): + import sunburnt + solr_results=[] + solr_url = "http://localhost:8983/solr/presss_portal/" + try: + si = sunburnt.SolrInterface(solr_url) + for i in si.query(book_title ="My First *").filter(id=1).execute(): + solr_results.append(i) + except RuntimeError as err: + raise HTTP(400, '{} {} {}'.format(err, solr_url, T('not found'))) + ompdal = OMPDAL(db, myconf) press = ompdal.getPress(myconf.take('omp.press_id')) diff --git a/static/utils/solr/schema.xml b/static/utils/solr/schema.xml new file mode 100644 index 00000000..75d5c516 --- /dev/null +++ b/static/utils/solr/schema.xml @@ -0,0 +1,427 @@ + + + + + + + + + + + + + + + + + + + + + +id + + +text + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From ce48edd0cf28a460a44dab35c0d0f23176922197 Mon Sep 17 00:00:00 2001 From: withanage Date: Mon, 6 Mar 2017 15:09:58 +0100 Subject: [PATCH 17/84] Restructured documentation --- .gitignore | 1 + README.md | 88 ++------------------------------------- static/docs/DEVELOPERS.md | 27 ++++++++++++ static/docs/INSTALL.md | 21 ++++++++++ static/docs/SOLR.md | 26 +++++++++--- static/docs/VGWORT.md | 21 ++++++++++ 6 files changed, 94 insertions(+), 90 deletions(-) create mode 100644 static/docs/DEVELOPERS.md create mode 100644 static/docs/INSTALL.md create mode 100644 static/docs/VGWORT.md diff --git a/.gitignore b/.gitignore index eaeff253..c03f8939 100755 --- a/.gitignore +++ b/.gitignore @@ -8,6 +8,7 @@ *.so *.pyc *.*~ +*.ipynb # Packages # ############ diff --git a/README.md b/README.md index f0e4ceae..93013adf 100755 --- a/README.md +++ b/README.md @@ -6,18 +6,10 @@ Table of Contents * [Demo](#demo) * [Features](#features) * [Installation](#installation) - * [Help Tools](#help-tools) - * [Solt Search](https://github.com/UB-Heidelberg/UBHD-OMPPortal/blob/categories/static/docs/SOLR.md) - * [VGWort Pixel Import](#vgwort-pixel-import) - * [Description](#description) - * [Installation](#installation-1) - * [Usage](#usage) - * [Add keys](#add-keys) - * [Run program](#run-program) - * [For developers](#for-developers) - * [General information](#general-information) - * [Folder structure](#folder-structure) - * [Additional information for customizations](#additional-information-for-customizations) + * Plugins + * [Solr Search](https://github.com/UB-Heidelberg/UBHD-OMPPortal/blob/categories/static/docs/SOLR.md) + * [VGWort Pixel Import](https://github.com/UB-Heidelberg/UBHD-OMPPortal/blob/categories/static/docs/VGWORT.md) + * [License](#license) * [Credits](#Credits) @@ -36,80 +28,8 @@ Table of Contents - Detailed usage statistics - Easy migration using web2py app structure - VGWORT plugin for royalties (for Germany, requires pythonn- urllib to check if the vgwort is enabled ) -- Solr Plugin (Work in progress) - -# Installation -- Prerequisites - 1. Install Open Monograph Press. See [documentation](http://pkp.sfu.ca/omp/README) - 2. Install web2py - 1. [Download] (http://web2py.com/init/default/download) web2py - 2. Unzip it - 3. change directory to the the unzipped folder - 4. If you have python installed : run ```python2.7 web2py.py``` or install [python](https://www.python.org/downloads/release/python-2710/) for your distribution -- Install UBHD-OMPPortal - 1. ```cd web2py_folder/applications/``` - 2. ```git clone https://github.com/UB-Heidelberg/UBHD-OMPPortal.git press_name``` - - Notice: press_name *should* contain only characters, numbers or _ - - Please do not use **-** in the **press_name** - 3. Change the settings for your local omp installation private/appconfig.ini - 1. **username** and **password** for the OMP database - 2. **press_id** of the local omp press - 3. define the **press_name** you selected when cloning from git - 4. Mount or symlink the files folder of the OMP to **web2py_folder**/applications/**press_name**/static/monographs/ - - ``` - ln -s web2py_folder/applications/press_name/static/monographs/ omp_folder/files/presses/press_id/monographs - ``` - -# Help Tools -## VGWort Pixel Import -### Description - This tool imports royalty information for germany's vgwort using a Excel File -### Installation - 1. Requires python xlrd library ```sudo pip2 install xlrd``` - -## Solr Plugin -### Description - -### Usage - -#### Add keys - - Add new VGWORT keys to UBHD_OMPPortal/static/utils/vgwort.xls - - ``` cd $WEB2PY_HOME/ ``` - which may be something like - ``` - cd /usr/local/web2py/ - ``` - -#### Run program - ``` - python web2py.py -R applications/UBHD_OMPPortal/static/utils/vgwortInsertBySubmission.py -M --shell UBHD_OMPPortal - ``` - -# For developers - -## General information - - A general knowledge in python and sql is necessary for further development. - - Some basic knowledge in web2y is helpful. See [docs](http://web2py.com) - - The OJS intergration is in progress. - - We have included a minified [lens](https://github.com/elifesciences/lens/) viewer. If you want to customize it, either use the [lens git](https://github.com/elifesciences/lens/) or [contact us](mailto:dulip.withanage@gmail.com). We will be happy to help you. - -## Folder structure -**strictly follows MVC (Model-View-Control) design principle** - - **controllers** - contains all the functions for enabling pages. - - **cron** - automated tasks - - **databases** - automatically generated by web2py. Do not edit this folder contents - - **languages** - language files. Web2py generates automatic entries for any word written in T() Block. e.g. T('word') in python files or {{=T('word')}} in HTML. Default language is english. - - **models** - database models for Open monograph press. Web2py uses a data abstraction layer. - - **private** - all the files, which contain sensitive information and configuration files - - **modules** - table mappings of omp and varibales that are globally accessible from the application. - - **static** - all the static files as such as javascript files and css files. - - **views** - for each controller (e.g. catalog.py) file, you have to add a folder with the same name (e.g. catalog) and a html file (index.html) for each function in the controller file. -## Additional information for customizations --Book view - - Current book details page views/catalog/book.html displays xml files in the lens viewer, if you name the category into XML. But this can ba changed in private/appconfig.ini # License This software is released under the the [GNU General Public License](LICENSE.md). diff --git a/static/docs/DEVELOPERS.md b/static/docs/DEVELOPERS.md new file mode 100644 index 00000000..835a8095 --- /dev/null +++ b/static/docs/DEVELOPERS.md @@ -0,0 +1,27 @@ +* [For developers](#for-developers) + * [General information](#general-information) + * [Folder structure](#folder-structure) + * [Additional information for customizations](#additional-information-for-customizations) + +## General information + - A general knowledge in python and sql is necessary for further development. + - Some basic knowledge in web2y is helpful. See [docs](http://web2py.com) + - The OJS intergration is in progress. + - We have included a minified [lens](https://github.com/elifesciences/lens/) viewer. If you want to customize it, either use the [lens git](https://github.com/elifesciences/lens/) or [contact us](mailto:dulip.withanage@gmail.com). We will be happy to help you. + +## Folder structure +**strictly follows MVC (Model-View-Control) design principle** + + - **controllers** - contains all the functions for enabling pages. + - **cron** - automated tasks + - **databases** - automatically generated by web2py. Do not edit this folder contents + - **languages** - language files. Web2py generates automatic entries for any word written in T() Block. e.g. T('word') in python files or {{=T('word')}} in HTML. Default language is english. + - **models** - database models for Open monograph press. Web2py uses a data abstraction layer. + - **private** - all the files, which contain sensitive information and configuration files + - **modules** - table mappings of omp and varibales that are globally accessible from the application. + - **static** - all the static files as such as javascript files and css files. + - **views** - for each controller (e.g. catalog.py) file, you have to add a folder with the same name (e.g. catalog) and a html file (index.html) for each function in the controller file. + +## Additional information for customizations +- Book view + - Current book details page views/catalog/book.html displays xml files in the lens viewer, if you name the category into XML. But this can ba changed in private/appconfig.ini \ No newline at end of file diff --git a/static/docs/INSTALL.md b/static/docs/INSTALL.md new file mode 100644 index 00000000..d1b62b2e --- /dev/null +++ b/static/docs/INSTALL.md @@ -0,0 +1,21 @@ +# Installation +- Prerequisites + 1. Install Open Monograph Press. See [documentation](http://pkp.sfu.ca/omp/README) + 2. Install web2py + 1. [Download] (http://web2py.com/init/default/download) web2py + 2. Unzip it + 3. change directory to the the unzipped folder + 4. If you have python installed : run ```python2.7 web2py.py``` or install [python](https://www.python.org/downloads/release/python-2710/) for your distribution +- Install UBHD-OMPPortal + 1. ```cd web2py_folder/applications/``` + 2. ```git clone https://github.com/UB-Heidelberg/UBHD-OMPPortal.git press_name``` + - Notice: press_name *should* contain only characters, numbers or _ + - Please do not use **-** in the **press_name** + 3. Change the settings for your local omp installation private/appconfig.ini + 1. **username** and **password** for the OMP database + 2. **press_id** of the local omp press + 3. define the **press_name** you selected when cloning from git + 4. Mount or symlink the files folder of the OMP to **web2py_folder**/applications/**press_name**/static/monographs/ + + ``` + ln -s web2py_folder/applications/press_name/static/monographs/ omp_folder/files/presses/press_id/monographs \ No newline at end of file diff --git a/static/docs/SOLR.md b/static/docs/SOLR.md index fbbc3276..cde01cb2 100644 --- a/static/docs/SOLR.md +++ b/static/docs/SOLR.md @@ -1,6 +1,6 @@ # Installation -## (Ubuntu / Debian Systems) +Cut and paste for (Ubuntu / Debian Systems) for other systems, plese see relevent docucmentation ### Install JDK, if not installed. ``` @@ -18,6 +18,10 @@ sudo apt-get update sudo apt-get install oracle-java8-installer java -version ``` + + + + ### Install Solr ``` cd /tmp/ @@ -28,20 +32,30 @@ sudo ./install_solr_service.sh solr-6.4.1.tgz Solr will be installed under /opt/solr and it start in port 8983 Check with [http://localhost:8983/solr](http://localhost:8983/solr) + + +--- + + ### Install Python dependancy ``` sudo pip install sunburnt ``` -# Configuration -## Create a OMP Collection and scheme +## Configuration + + +### Create a OMP Collection and scheme ``` sudo su - solr -c "/opt/solr/bin/solr create -c presss_portal -n omp" ``` -## Install Python dependancy + + +### Copy solr schema.xml in to your solr directory ``` -sudo pip install sunburnt -``` +cp /UBHD_OMPPortal/static/utils/solr/schema.xml /data/presss_portal/conf + ``` + diff --git a/static/docs/VGWORT.md b/static/docs/VGWORT.md new file mode 100644 index 00000000..af95e310 --- /dev/null +++ b/static/docs/VGWORT.md @@ -0,0 +1,21 @@ +## VGWort Pixel Import +### Description + This tool imports royalty information for germany's vgwort using a Excel File +### Installation +- Requires python xlrd library + + ```sudo pip2 install xlrd``` + + +#### Configuration + - Add new VGWORT keys to UBHD_OMPPortal/static/utils/vgwort.xls + + +#### Run program +- Change directory in to web2py folder + + ``` cd /usr/local/web2py/ ``` +- Execute + + ```python web2py.py -R applications/UBHD_OMPPortal/static/utils/vgwortInsertBySubmission.py -M --shell UBHD_OMPPortal ``` + From 80f2f57c14f745d6bb7087a055a16f2f91e4f675 Mon Sep 17 00:00:00 2001 From: withanage Date: Mon, 6 Mar 2017 15:39:29 +0100 Subject: [PATCH 18/84] Restructured documentation --- static/docs/APPCONFIG.md | 91 +++++++++++++++++++++++++++++++++++++++ static/docs/INSTALL.md | 11 +++-- static/docs/appconfig.ini | 53 +++++++++++++++++++++++ 3 files changed, 152 insertions(+), 3 deletions(-) create mode 100644 static/docs/APPCONFIG.md create mode 100644 static/docs/appconfig.ini diff --git a/static/docs/APPCONFIG.md b/static/docs/APPCONFIG.md new file mode 100644 index 00000000..06c327a7 --- /dev/null +++ b/static/docs/APPCONFIG.md @@ -0,0 +1,91 @@ + +## appconfig variables + +### db configuration + +#### [db] + +##### database url : path to mysql database + ``` +uri = mysql://mysql-user:mysql-password@localhost:3306/omp_database +``` + +##### table migration +enables automatic table migration using web2py database layer, only set 1, if you want to add tables, which are not defined in OMP., otherwise let defaults +``` +migrate = 0 +``` + +##### Used for Connection Pooling +[more Details](http://www.web2py.com/books/default/chapter/29/06/the-database-abstraction-layer#Connection-pooling) +``` +pool_size = 1 +``` + +### smtp address and credentials +Necessary, if you want to send emails using the press web-site + +#### [smtp] + +##### mail server +``` +server = smtp.gmail.com:587 +``` + +##### Sender email Address +``` +sender = you@gmail.com +``` + +##### Login username and password +``` +login = username:password +``` + + + +### form styling +Only change if you do not use bootstrap themes. [More details](http://www.web2py.com/books/default/chapter/29/07/forms-and-validators?search=formstyle#Custom-forms) + +#### [forms] + +``` +formstyle = bootstrap3_inline +``` +``` +separator = +``` + + +[omp] +doi_format_name=PDF +press_id=6 +ignore_format=Softcover +monograph_type_id=68 +representative_id_type=6 +ignore_submissions=0 +xml_category_name=XML +vgwort_enable=1 +review_type_id=89 +editor_id=99 +author_ids=98,100 + +[web] +application=UBHD_OMPPortal +url=http://heiup.uni-heidelberg.de +vgwort_server1=http://vg07.met.vgwort.de/na/ +vgwort_server2=http://vg08.met.vgwort.de/na/ + +[statistik] +enable=0 +id=_omphp + +piwik_plugin=1 + + + +[emails] +notification=1 + +[plugins] +solr_index =1 \ No newline at end of file diff --git a/static/docs/INSTALL.md b/static/docs/INSTALL.md index d1b62b2e..957bf4fe 100644 --- a/static/docs/INSTALL.md +++ b/static/docs/INSTALL.md @@ -5,17 +5,22 @@ 1. [Download] (http://web2py.com/init/default/download) web2py 2. Unzip it 3. change directory to the the unzipped folder - 4. If you have python installed : run ```python2.7 web2py.py``` or install [python](https://www.python.org/downloads/release/python-2710/) for your distribution + 4. If you have python installed : run ```python2.7 web2py.py``` or install [python](https://www.python.org/downloads/release/python-2710/) - Install UBHD-OMPPortal 1. ```cd web2py_folder/applications/``` 2. ```git clone https://github.com/UB-Heidelberg/UBHD-OMPPortal.git press_name``` - Notice: press_name *should* contain only characters, numbers or _ - Please do not use **-** in the **press_name** - 3. Change the settings for your local omp installation private/appconfig.ini + 3. Copy appconfig.ini and cahnges the settings accordingly Datails on appconfig.ini are + ``` + mkdir private + cp web2py_folder/application/UBHD_OMPPortal/static/docs/appconfig.ini web2py_folder/application/UBHD_OMPPortal/private/ + ``` + 4. Change the settings for your local omp installation private/appconfig.ini [Details](https://github.com/UB-Heidelberg/UBHD-OMPPortal/blob/categories/static/docs/APPCONFIG.md) 1. **username** and **password** for the OMP database 2. **press_id** of the local omp press 3. define the **press_name** you selected when cloning from git - 4. Mount or symlink the files folder of the OMP to **web2py_folder**/applications/**press_name**/static/monographs/ + 5. Mount or symlink the files folder of the OMP to **web2py_folder**/applications/**press_name**/static/monographs/ ``` ln -s web2py_folder/applications/press_name/static/monographs/ omp_folder/files/presses/press_id/monographs \ No newline at end of file diff --git a/static/docs/appconfig.ini b/static/docs/appconfig.ini new file mode 100644 index 00000000..2204463f --- /dev/null +++ b/static/docs/appconfig.ini @@ -0,0 +1,53 @@ +; App configuration + +; db configuration +[db] +uri = mysql://mysql-user:mysql-password@localhost:3306/omp_database +migrate = 0 +pool_size = 1 + +; smtp address and credentials +[smtp] +server = smtp.gmail.com:587 +sender = you@gmail.com +login = username:password + + +; form styling +[forms] +formstyle = bootstrap3_inline +separator = + + +[omp] +doi_format_name=PDF +press_id=6 +ignore_format=Softcover +monograph_type_id=68 +representative_id_type=6 +ignore_submissions=0 +xml_category_name=XML +vgwort_enable=1 +review_type_id=89 +editor_id=99 +author_ids=98,100 + +[web] +application=UBHD_OMPPortal +url=http://heiup.uni-heidelberg.de +vgwort_server1=http://vg07.met.vgwort.de/na/ +vgwort_server2=http://vg08.met.vgwort.de/na/ + +[statistik] +enable=0 +id=_omphp + +piwik_plugin=1 + + + +[emails] +notification=1 + +[plugins] +solr_index =1 From 5cc7810a1c0ef1bf2dd14b5e857c0f2c0eaf4a88 Mon Sep 17 00:00:00 2001 From: withanage Date: Mon, 6 Mar 2017 15:40:48 +0100 Subject: [PATCH 19/84] Restructured documentation --- README.md | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 93013adf..d34f7643 100755 --- a/README.md +++ b/README.md @@ -1,17 +1,9 @@ # UBHD-OMPPortal UBHD-OMPPortal is a flexible, responsive Frontend portal for [pkp](https://pkp.sfu.ca/) 's [Open Monograph Press](https://pkp.sfu.ca/omp/) written in python programming language and based on the python web framework [web2py](http://www.web2py.com). -Table of Contents -================= - * [Demo](#demo) - * [Features](#features) - * [Installation](#installation) - * Plugins - * [Solr Search](https://github.com/UB-Heidelberg/UBHD-OMPPortal/blob/categories/static/docs/SOLR.md) - * [VGWort Pixel Import](https://github.com/UB-Heidelberg/UBHD-OMPPortal/blob/categories/static/docs/VGWORT.md) - - * [License](#license) - * [Credits](#Credits) + * [Demo](#demo) , [Features](#features), [Installation](https://github.com/UB-Heidelberg/UBHD-OMPPortal/blob/categories/static/docs/INSTALL.md) + * Plugins [Solr Search](https://github.com/UB-Heidelberg/UBHD-OMPPortal/blob/categories/static/docs/SOLR.md), [VGWort Pixel Import](https://github.com/UB-Heidelberg/UBHD-OMPPortal/blob/categories/static/docs/VGWORT.md) + * [License](#license) and [Credits](#Credits) # Demo - Heidelberg University Publishing [Web](http://heiup.uni-heidelberg.de/) From a8a1537082cf1abda8726ec25a0f8d713744a37f Mon Sep 17 00:00:00 2001 From: withanage Date: Mon, 6 Mar 2017 15:44:06 +0100 Subject: [PATCH 20/84] Restructured documentation --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index d34f7643..58cea45d 100755 --- a/README.md +++ b/README.md @@ -28,11 +28,12 @@ This software is released under the the [GNU General Public License](LICENSE.md) See the file [LICENSE.md](LICENSE.md) included with this distribution for the terms of this license. # Credits -The lead deveopper and software architect is Dulip Withanage, Heidelberg University Library +The lead deveopper and software architect is +- Dulip Withanage, Heidelberg University Library Additional contributions were made, in alphabetical order by: -Katharina Wäschle , Heidelberg University Library -Nils Weiher, Heidelberg University Library -Web-Team, University Library Heidelberg +- Katharina Wäschle , Heidelberg University Library +- Nils Weiher, Heidelberg University Library +- Web-Team, University Library Heidelberg From f12659053f9748bbeb1b2646bd1656f058dd8f56 Mon Sep 17 00:00:00 2001 From: withanage Date: Mon, 6 Mar 2017 15:49:18 +0100 Subject: [PATCH 21/84] Restructured documentation --- static/docs/INSTALL.md | 57 ++++++++++++++++++++++++------------------ 1 file changed, 32 insertions(+), 25 deletions(-) diff --git a/static/docs/INSTALL.md b/static/docs/INSTALL.md index 957bf4fe..1fd0e09f 100644 --- a/static/docs/INSTALL.md +++ b/static/docs/INSTALL.md @@ -1,26 +1,33 @@ # Installation -- Prerequisites - 1. Install Open Monograph Press. See [documentation](http://pkp.sfu.ca/omp/README) - 2. Install web2py - 1. [Download] (http://web2py.com/init/default/download) web2py - 2. Unzip it - 3. change directory to the the unzipped folder - 4. If you have python installed : run ```python2.7 web2py.py``` or install [python](https://www.python.org/downloads/release/python-2710/) -- Install UBHD-OMPPortal - 1. ```cd web2py_folder/applications/``` - 2. ```git clone https://github.com/UB-Heidelberg/UBHD-OMPPortal.git press_name``` - - Notice: press_name *should* contain only characters, numbers or _ - - Please do not use **-** in the **press_name** - 3. Copy appconfig.ini and cahnges the settings accordingly Datails on appconfig.ini are - ``` - mkdir private - cp web2py_folder/application/UBHD_OMPPortal/static/docs/appconfig.ini web2py_folder/application/UBHD_OMPPortal/private/ - ``` - 4. Change the settings for your local omp installation private/appconfig.ini [Details](https://github.com/UB-Heidelberg/UBHD-OMPPortal/blob/categories/static/docs/APPCONFIG.md) - 1. **username** and **password** for the OMP database - 2. **press_id** of the local omp press - 3. define the **press_name** you selected when cloning from git - 5. Mount or symlink the files folder of the OMP to **web2py_folder**/applications/**press_name**/static/monographs/ - - ``` - ln -s web2py_folder/applications/press_name/static/monographs/ omp_folder/files/presses/press_id/monographs \ No newline at end of file + +## Prerequisites +1. Install Open Monograph Press. See [documentation](http://pkp.sfu.ca/omp/README) +2. Install web2py +1. [Download] (http://web2py.com/init/default/download) web2py +2. Unzip it +3. change directory to the the unzipped folder +4. If you have python installed : run ```python2.7 web2py.py``` + +## Install UBHD-OMPPortal +1. ```cd web2py_folder/applications/``` + +2. ```git clone https://github.com/UB-Heidelberg/UBHD-OMPPortal.git press_name``` + - Notice + - press_name *should* contain only characters, numbers or _ + - Please do not use **-** in the **press_name** + +3. Copy appconfig.ini and cahnges the settings accordingly Datails on appconfig.ini are + + ``` mkdir private ``` + + ``` cp web2py_folder/application/UBHD_OMPPortal/static/docs/appconfig.ini web2py_folder/application/UBHD_OMPPortal/private/ ``` + +4. Change the settings for your local omp installation private/appconfig.ini [Details](https://github.com/UB-Heidelberg/UBHD-OMPPortal/blob/categories/static/docs/APPCONFIG.md) + 1. **username** and **password** for the OMP database + 2. **press_id** of the local omp press + 3. define the **press_name** you selected when cloning from git + +5. Mount or symlink the files folder of the OMP to **web2py_folder**/applications/**press_name**/static/monographs/ + +``` +ln -s web2py_folder/applications/press_name/static/monographs/ omp_folder/files/presses/press_id/monographs \ No newline at end of file From 3331b93700c88ce0eb78ebffa00a09ec5189ac23 Mon Sep 17 00:00:00 2001 From: withanage Date: Tue, 7 Mar 2017 15:16:05 +0100 Subject: [PATCH 22/84] doc --- static/docs/SOLR.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/static/docs/SOLR.md b/static/docs/SOLR.md index cde01cb2..4c2b825f 100644 --- a/static/docs/SOLR.md +++ b/static/docs/SOLR.md @@ -29,11 +29,12 @@ wget http://archive.apache.org/dist/lucene/solr/6.4.1/solr-6.4.1.tgz tar xzf solr-6.4.1.tgz solr-6.4.1/bin/install_solr_service.sh --strip-components=2 sudo ./install_solr_service.sh solr-6.4.1.tgz ``` + + Solr will be installed under /opt/solr and it start in port 8983 Check with [http://localhost:8983/solr](http://localhost:8983/solr) - --- @@ -48,6 +49,8 @@ sudo pip install sunburnt ### Create a OMP Collection and scheme +Change /opt/solr to your custom path + ``` sudo su - solr -c "/opt/solr/bin/solr create -c presss_portal -n omp" ``` From 58a9133d9786a8177ffb50f411ee86ba5b9653ed Mon Sep 17 00:00:00 2001 From: withanage Date: Tue, 7 Mar 2017 15:24:01 +0100 Subject: [PATCH 23/84] add ci --- .travis.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 .travis.yml diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 00000000..d1ad0ae5 --- /dev/null +++ b/.travis.yml @@ -0,0 +1 @@ +language: python From 7be21420a25c100e4f7bb6f5b40d75d9ce608563 Mon Sep 17 00:00:00 2001 From: withanage Date: Wed, 8 Mar 2017 10:06:08 +0100 Subject: [PATCH 24/84] wizard --- wizard.metadata | 188 ------------------------------------------------ 1 file changed, 188 deletions(-) delete mode 100755 wizard.metadata diff --git a/wizard.metadata b/wizard.metadata deleted file mode 100755 index d3d29e63..00000000 --- a/wizard.metadata +++ /dev/null @@ -1,188 +0,0 @@ -(dp0 -S'tables' -p1 -(lp2 -S'onix_additionals' -p3 -asS'name' -p4 -S'pod' -p5 -sS'table_onix_additionals' -p6 -(lp7 -S'verlagsverkehrsnummer integer' -p8 -aS'zusatz_isbn_ean required' -p9 -aS'verlags_bestell_nr' -p10 -aS'medienbeilage' -p11 -aS'belletristik' -p12 -aS'weitere_angaben' -p13 -aS'produktionsjahr' -p14 -aS'zusatzinformationen' -p15 -aS'teilband' -p16 -aS'auflage required' -p17 -aS'laufzeit_in_minuten' -p18 -aS'umfang required' -p19 -aS'abbildungen' -p20 -aS'verpackungs_angaben_in_mm' -p21 -aS'fsk_or_usk_angabe required' -p22 -aS'altersempfehlung requierd' -p23 -aS'warnhinweis required' -p24 -aS'warengruppe_lt_vlb' -p25 -aS'auslieferungstermin required' -p26 -aS'ladenpreis_euro_de required double required' -p27 -aS'ladenpreis_euro_at required double required' -p28 -aS'mwst double required' -p29 -aS'vorbestelldatum date' -p30 -aS'vorbestellpreis_euro_de double required' -p31 -aS'vorbestellpreis_euro_at double required' -p32 -aS'vorbestellpreis_euro_sfr double required' -p33 -aS'zolltarifnummer_verzeihnis required' -p34 -aS'warennummer_ztn required' -p35 -aS'ursprungsland required' -p36 -aS'cover_image upload' -p37 -aS'klassifizierung_hochschulschriften required' -p38 -aS'mehrbaendiger_werke required' -p39 -aS'issn required' -p40 -asS'page_index' -p41 -S'# Print on Demand plugin f\xc3\xbcr KNV\r\n## Beschreibung\r\nGeneriet aus Open Monograph Press und zus\xc3\xa4tzlichen Eingabe Feldern ein KNV - Zip Datei und schickt automatisch an die KNV.\r\n' -p42 -sS'page_error' -p43 -S'# Error: Dokument existiert nicht\r\n' -p44 -sS'params' -p45 -(lp46 -(S'title' -p47 -S'Heidelberg University Press' -p48 -tp49 -a(S'subtitle' -p50 -S'' -p51 -tp52 -a(S'author' -p53 -S'Dr. Veit Probst' -p54 -tp55 -a(S'author_email' -p56 -S'heiup@ub.uni-heidelberg.de' -p57 -tp58 -a(S'keywords' -p59 -S'omp, python, mysql, knv, onix' -p60 -tp61 -a(S'description' -p62 -g51 -tp63 -a(S'layout_theme' -p64 -S'Default' -p65 -tp66 -a(S'database_uri' -p67 -S'sqlite://storage.sqlite' -p68 -tp69 -a(S'security_key' -p70 -S'1228409b-a1fc-4868-92b1-a973a607d3f1' -p71 -tp72 -a(S'email_server' -p73 -S'login' -p74 -tp75 -a(S'email_sender' -p76 -S'login' -p77 -tp78 -a(S'email_login' -p79 -g51 -tp80 -a(S'login_method' -p81 -S'local' -p82 -tp83 -a(S'login_config' -p84 -g51 -tp85 -a(S'plugins' -p86 -(lp87 -tp88 -asS'table_auth_user' -p89 -(lp90 -S'username' -p91 -aS'first_name' -p92 -aS'last_name' -p93 -aS'email' -p94 -aS'password' -p95 -asS'pages' -p96 -(lp97 -S'index' -p98 -aS'error' -p99 -aS'onix_additionals_manage' -p100 -asS'page_onix_additionals_manage' -p101 -S'##Onix Daten-verwaltung\r\n{{=form}}' -p102 -s. From b44800809632ee90ac631e5acdbd203524885d51 Mon Sep 17 00:00:00 2001 From: withanage Date: Wed, 8 Mar 2017 15:44:42 +0100 Subject: [PATCH 25/84] SOLR --- controllers/catalog.py | 35 +- static/docs/SOLR.md | 63 ++- static/utils/solr/schema.xml | 742 +++++++++++++++++++---------------- views/catalog/index.html | 5 +- 4 files changed, 484 insertions(+), 361 deletions(-) diff --git a/controllers/catalog.py b/controllers/catalog.py index 24ca212d..0fc0575d 100755 --- a/controllers/catalog.py +++ b/controllers/catalog.py @@ -120,15 +120,32 @@ def series(): def index(): - import sunburnt - solr_results=[] - solr_url = "http://localhost:8983/solr/presss_portal/" - try: - si = sunburnt.SolrInterface(solr_url) - for i in si.query(book_title ="My First *").filter(id=1).execute(): - solr_results.append(i) - except RuntimeError as err: - raise HTTP(400, '{} {} {}'.format(err, solr_url, T('not found'))) + solr_results = [] + # curl "http://localhost:8983/solr/presss_portal/update?commit=true" -H "Content-Type: text/xml" --data-binary '*:*' + if myconf.take("plugins.solr") == str(1): + try: + import sunburnt + except ImportError as err: + raise HTTP(400, '{}
{}'.format(err, "Install using sudo pip install sunburnt")) + + try: + try: + solr_url = myconf.take('plugin_solr.url') + except BaseException as err: + raise HTTP(400, '{}
add
[plugin_solr]
url= http:/presss_portal/
in private/appconfig.ini'.format(err)) + try: + si = sunburnt.SolrInterface(solr_url) + document = {"submission_id":43, "press_id":6,"title_de":u"爭家光的去是是聯","title_en":"Test EN","locale":"de","authors":["Dulip Withanage","Max Musterman"]} + #si.add(document) + #si.delete(queries=si.Q("*")) + #si.commit() + + for i in si.query(press_id="6").execute(): + solr_results.append(i) + except (RuntimeError,OverflowError, sunburnt.SolrError) as err: + raise HTTP(400, '{}'.format(err)) + except RuntimeError as err: + raise HTTP(400, err) ompdal = OMPDAL(db, myconf) press = ompdal.getPress(myconf.take('omp.press_id')) diff --git a/static/docs/SOLR.md b/static/docs/SOLR.md index 4c2b825f..8a149924 100644 --- a/static/docs/SOLR.md +++ b/static/docs/SOLR.md @@ -1,7 +1,22 @@ + +Table of Contents +================= + + * [Table of Contents](#table-of-contents) + * [Installation](#installation) + * [Install JDK](#install--jdk) + * [Install Solr](#install-solr) + * [Install Python modules](#install-python-modules) + * [Configuration](#configuration) + * [Create OMP Collection and schema file](#create-omp-collection-and-schema-file) + * [Copy solr schema.xml in to your solr directory](#copy-solr-schemaxml-in-to-your-solr-directory) + * [Run solr](#run-solr) + + # Installation Cut and paste for (Ubuntu / Debian Systems) for other systems, plese see relevent docucmentation -### Install JDK, if not installed. +### Install JDK ``` sudo apt-get -y install openjdk-7-jdk @@ -34,23 +49,45 @@ sudo ./install_solr_service.sh solr-6.4.1.tgz Solr will be installed under /opt/solr and it start in port 8983 Check with [http://localhost:8983/solr](http://localhost:8983/solr) +### Stop Solr +``` + sudo /opt/solr/bin/solr stop +``` ---- -### Install Python dependancy +### Install Python modules ``` -sudo pip install sunburnt +sudo pip install pysolr + ``` -## Configuration +# Configuration -### Create a OMP Collection and scheme +### Set folder rights (if necessary) +Set solr to run under local user +``` +sudo chown -R my-user:my-group /opt/solr +``` -Change /opt/solr to your custom path +# Run solr + ``` + /opt/solr/bin/solr -p 8983 + ``` + + +### Create OMP Collection and schema file + +Change /opt/solr to your custom path +##### As current user + +``` +/opt/solr/bin/solr create -c presss_portal -n omp +``` +##### As root ``` sudo su - solr -c "/opt/solr/bin/solr create -c presss_portal -n omp" ``` @@ -59,6 +96,16 @@ Change /opt/solr to your custom path ### Copy solr schema.xml in to your solr directory ``` -cp /UBHD_OMPPortal/static/utils/solr/schema.xml /data/presss_portal/conf + cp $WEB2PY_HOME/applications/$MyApplicationName/static/utils/solr/schema.xml /opt/solr/server/solr/presss_portal/conf/ ``` +### Activate SOLR Plugin in $WEB2PY_HOME/applications/$MyApplicationName/private/appconfig.ini +``` +[plugins] +solr =1 +``` +### Configure solr properties in $WEB2PY_HOME/applications/$MyApplicationName/private/appconfig.ini +``` +[solr_plugin] +url = "http://localhost:8983/solr/presss_portal/" +```` diff --git a/static/utils/solr/schema.xml b/static/utils/solr/schema.xml index 75d5c516..d56eeedc 100644 --- a/static/utils/solr/schema.xml +++ b/static/utils/solr/schema.xml @@ -1,427 +1,483 @@ - - - - - - - - - - - - - - - - - - - -id - - -text - - - - - - - - + * schema.xml + * + * Copyright (c) 2014-2017 Simon Fraser University + * Copyright (c) 2003-2017 John Willinsky + * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. + * + * OJS solr/lucene search plugin index schema default configuration. + * + * NB: You may customize the index/query analyzer chains. Do not change the field + * configuration, though, as this will probably break the OJS/solr indexing or + * search protocol. - - - - - - + Original file + https://github.com/pkp/ojs/blob/master/plugins/generic/lucene/embedded/solr/conf/schema.xml + + Modified by + Dulip Withanage + + + --> + + + + + + + + + - - - - - - + + + + + + + + + - --> - - + + - + + - - - + + + - - + + + + - + + + + + + - - + + + + + + - - - + + + - - - + + + - - - - + + + - + + + + + - - + + + - - - - + + + - - - - - - - - + + + + + + + - - + + + - - - - - - - - + + + + + + + + + + + + - - + + - - - - + + + + - - + - - - + + + - + + + - + + + - + + + + + - - + + + + + + + + + + + + + + + + + - - - - - + + + - - + - + + + + + + - - + + + + + - - + + + - + + + - - - + - - + + + + + + + + + + + + + + + + + + + + - - + + - - - - - - - - + + + + + + + + - - + + + - + + + + + + + - + - + + - - - + + + + + + + + - + - - + + - - + + + + + + + + - + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + submission_id - + + submission_id + + + diff --git a/views/catalog/index.html b/views/catalog/index.html index 81c1e497..e4c374e5 100755 --- a/views/catalog/index.html +++ b/views/catalog/index.html @@ -47,7 +47,10 @@
- +{{for s in solr_results:}} +{{=XML(s)}} +{{=BR()}} +{{pass}}
{{for submission in submissions:}} From 067c7749354939201b8a0f5efef276cd727612f6 Mon Sep 17 00:00:00 2001 From: withanage Date: Wed, 8 Mar 2017 15:54:03 +0100 Subject: [PATCH 26/84] SOLR --- controllers/catalog.py | 6 +++--- static/utils/solr/schema.xml | 26 +++++++++++++------------- views/catalog/index.html | 2 +- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/controllers/catalog.py b/controllers/catalog.py index 0fc0575d..b92a227c 100755 --- a/controllers/catalog.py +++ b/controllers/catalog.py @@ -135,10 +135,10 @@ def index(): raise HTTP(400, '{}
add
[plugin_solr]
url= http:/presss_portal/
in private/appconfig.ini'.format(err)) try: si = sunburnt.SolrInterface(solr_url) - document = {"submission_id":43, "press_id":6,"title_de":u"爭家光的去是是聯","title_en":"Test EN","locale":"de","authors":["Dulip Withanage","Max Musterman"]} - #si.add(document) + document = {"submission_id":43, "press_id":6,"en_title_s":u"爭家光的去是是聯","de_title_s":"Test EN","locale_s":"de","authors":["Dulip Withanage","Max Musterman"]} + si.add(document) #si.delete(queries=si.Q("*")) - #si.commit() + si.commit() for i in si.query(press_id="6").execute(): solr_results.append(i) diff --git a/static/utils/solr/schema.xml b/static/utils/solr/schema.xml index d56eeedc..1c3cb378 100644 --- a/static/utils/solr/schema.xml +++ b/static/utils/solr/schema.xml @@ -396,21 +396,21 @@ - - - - - + + + + + - - - - + + + + - - - - + + + + diff --git a/views/catalog/index.html b/views/catalog/index.html index e4c374e5..d3639cd5 100755 --- a/views/catalog/index.html +++ b/views/catalog/index.html @@ -48,7 +48,7 @@
{{for s in solr_results:}} -{{=XML(s)}} +{{=s.get("en_title_s").encode(encoding='utf-8')}} {{=BR()}} {{pass}} From 946bdf92e2a159fbbe98cdb367bb6dd0bc68ff2d Mon Sep 17 00:00:00 2001 From: withanage Date: Wed, 8 Mar 2017 15:56:28 +0100 Subject: [PATCH 27/84] SOLR --- controllers/catalog.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/controllers/catalog.py b/controllers/catalog.py index b92a227c..376e07b8 100755 --- a/controllers/catalog.py +++ b/controllers/catalog.py @@ -135,10 +135,10 @@ def index(): raise HTTP(400, '{}
add
[plugin_solr]
url= http:/presss_portal/
in private/appconfig.ini'.format(err)) try: si = sunburnt.SolrInterface(solr_url) - document = {"submission_id":43, "press_id":6,"en_title_s":u"爭家光的去是是聯","de_title_s":"Test EN","locale_s":"de","authors":["Dulip Withanage","Max Musterman"]} - si.add(document) + document = {"submission_id":43, "press_id":6,"en_title_s":u"öüßä","de_title_s":"Test EN","locale_s":"de","authors":["Dulip Withanage","Max Musterman"]} + #si.add(document) #si.delete(queries=si.Q("*")) - si.commit() + #si.commit() for i in si.query(press_id="6").execute(): solr_results.append(i) From bb3057e62489109f99cd2dc1d9d14016feca5dae Mon Sep 17 00:00:00 2001 From: withanage Date: Wed, 8 Mar 2017 16:52:28 +0100 Subject: [PATCH 28/84] SOLR as module --- controllers/catalog.py | 29 +++-------------------------- modules | 2 +- 2 files changed, 4 insertions(+), 27 deletions(-) diff --git a/controllers/catalog.py b/controllers/catalog.py index 376e07b8..29688b67 100755 --- a/controllers/catalog.py +++ b/controllers/catalog.py @@ -10,7 +10,7 @@ from ompdal import OMPDAL, OMPSettings, OMPItem from ompformat import dateFromRow, seriesPositionCompare from datetime import datetime - +from ompsolr import OMPSOLR def category(): @@ -120,32 +120,9 @@ def series(): def index(): - solr_results = [] - # curl "http://localhost:8983/solr/presss_portal/update?commit=true" -H "Content-Type: text/xml" --data-binary '*:*' if myconf.take("plugins.solr") == str(1): - try: - import sunburnt - except ImportError as err: - raise HTTP(400, '{}
{}'.format(err, "Install using sudo pip install sunburnt")) - - try: - try: - solr_url = myconf.take('plugin_solr.url') - except BaseException as err: - raise HTTP(400, '{}
add
[plugin_solr]
url= http:/presss_portal/
in private/appconfig.ini'.format(err)) - try: - si = sunburnt.SolrInterface(solr_url) - document = {"submission_id":43, "press_id":6,"en_title_s":u"öüßä","de_title_s":"Test EN","locale_s":"de","authors":["Dulip Withanage","Max Musterman"]} - #si.add(document) - #si.delete(queries=si.Q("*")) - #si.commit() - - for i in si.query(press_id="6").execute(): - solr_results.append(i) - except (RuntimeError,OverflowError, sunburnt.SolrError) as err: - raise HTTP(400, '{}'.format(err)) - except RuntimeError as err: - raise HTTP(400, err) + solr = OMPSOLR(db,myconf) + x = solr.si.query(press_id="6").execute() ompdal = OMPDAL(db, myconf) press = ompdal.getPress(myconf.take('omp.press_id')) diff --git a/modules b/modules index 23c58467..0d8ca6c8 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit 23c58467e6c9f18ef17f88b64d110fc7009bd5bc +Subproject commit 0d8ca6c83ea088c933bacf19ca55d597bf5591dc From d2a772443d4186d70e712b3238fcd737620e289f Mon Sep 17 00:00:00 2001 From: withanage Date: Fri, 7 Apr 2017 08:07:15 +0200 Subject: [PATCH 29/84] Schema --- static/utils/solr/schema.xml | 11 +++++------ views/catalog/index.html | 10 ++++++---- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/static/utils/solr/schema.xml b/static/utils/solr/schema.xml index 1c3cb378..84ab56f0 100644 --- a/static/utils/solr/schema.xml +++ b/static/utils/solr/schema.xml @@ -6,18 +6,17 @@ * Copyright (c) 2003-2017 John Willinsky * Distributed under the GNU GPL v2. For full terms see the file docs/COPYING. * - * OJS solr/lucene search plugin index schema default configuration. + * OMP solr/lucene search plugin index schema default configuration. * * NB: You may customize the index/query analyzer chains. Do not change the field * configuration, though, as this will probably break the OJS/solr indexing or * search protocol. - Original file - https://github.com/pkp/ojs/blob/master/plugins/generic/lucene/embedded/solr/conf/schema.xml - - Modified by - Dulip Withanage + * Original file + * https://github.com/pkp/ojs/blob/master/plugins/generic/lucene/embedded/solr/conf/schema.xml + * Modified by + * Dulip Withanage --> diff --git a/views/catalog/index.html b/views/catalog/index.html index d3639cd5..23f51a21 100755 --- a/views/catalog/index.html +++ b/views/catalog/index.html @@ -47,11 +47,13 @@
-{{for s in solr_results:}} -{{=s.get("en_title_s").encode(encoding='utf-8')}} -{{=BR()}} -{{pass}} + + {{ + for i in x: + =TR(TD(i.get('en_title_s').encode('utf-8'),_class="col-lg-1"),TD(i.get('authors'),_class="col-lg-3"),TD(i)) + pass}} +
{{for submission in submissions:}}
From 555a78f9ceed645cedeb7fa02a8e34c7b9b8fde1 Mon Sep 17 00:00:00 2001 From: Dulip Withanage Date: Fri, 7 Apr 2017 14:35:11 +0200 Subject: [PATCH 30/84] Update SOLR.md --- static/docs/SOLR.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/static/docs/SOLR.md b/static/docs/SOLR.md index 8a149924..7d1c9e91 100644 --- a/static/docs/SOLR.md +++ b/static/docs/SOLR.md @@ -109,3 +109,8 @@ solr =1 [solr_plugin] url = "http://localhost:8983/solr/presss_portal/" ```` + +# Update solr index +python web2py.py -R applications/UBHD_OMPPortal/static/utils/solr/updateSolrIndex.py -M --shell UBHD_OMPPortal + + From 1805e846603bf23e72f9b5737136ec4b766603a5 Mon Sep 17 00:00:00 2001 From: withanage Date: Fri, 7 Apr 2017 15:18:57 +0200 Subject: [PATCH 31/84] solr --- controllers/catalog.py | 2 +- modules | 2 +- static/utils/solr/updateSolrIndex.py | 30 ++++++++++++++++++++++++++++ views/catalog/index.html | 3 ++- 4 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 static/utils/solr/updateSolrIndex.py diff --git a/controllers/catalog.py b/controllers/catalog.py index 29688b67..b6cd63c4 100755 --- a/controllers/catalog.py +++ b/controllers/catalog.py @@ -122,7 +122,7 @@ def series(): def index(): if myconf.take("plugins.solr") == str(1): solr = OMPSOLR(db,myconf) - x = solr.si.query(press_id="6").execute() + x = solr.si.query(id="1").execute() ompdal = OMPDAL(db, myconf) press = ompdal.getPress(myconf.take('omp.press_id')) diff --git a/modules b/modules index 0d8ca6c8..5ce0d0be 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit 0d8ca6c83ea088c933bacf19ca55d597bf5591dc +Subproject commit 5ce0d0be8408ffc51491cd13907663c79e793088 diff --git a/static/utils/solr/updateSolrIndex.py b/static/utils/solr/updateSolrIndex.py new file mode 100644 index 00000000..05010cc0 --- /dev/null +++ b/static/utils/solr/updateSolrIndex.py @@ -0,0 +1,30 @@ +# -*- coding: utf-8 -*- +''' +Copyright (c) 2017 Heidelberg University Library +Distributed under the GNU GPL v3. For full terms see the file +LICENSE.md +''' + +from gluon import DAL +from ompdal import OMPDAL + +ompdal = OMPDAL(db, myconf) + +class Solr: + def __init__(self): + pass + +def main(): + solr = Solr() + ps = ompdal.getPresses() + for p in ps: + submissions = ompdal.getSubmissionsByPress(p.press_id) + for s in submissions: + print p.press_id, s.submission_id + #print ompdal.getActualAuthorsBySubmission(s.submission_id) + print ompdal.getSubmissionSettings(s.submission_id) + + + +if __name__ == '__main__': + main() \ No newline at end of file diff --git a/views/catalog/index.html b/views/catalog/index.html index 23f51a21..fc0391dc 100755 --- a/views/catalog/index.html +++ b/views/catalog/index.html @@ -51,7 +51,8 @@ {{ for i in x: - =TR(TD(i.get('en_title_s').encode('utf-8'),_class="col-lg-1"),TD(i.get('authors'),_class="col-lg-3"),TD(i)) + =i + #=TR(TD(i.get('en_title_s').encode('utf-8'),_class="col-lg-1"),TD(i.get('authors'),_class="col-lg-3"),TD(i)) pass}}
From 57002ebe4ebac0036450f4bb7a7d927b4af4d5c8 Mon Sep 17 00:00:00 2001 From: withanage Date: Mon, 10 Apr 2017 16:17:16 +0200 Subject: [PATCH 32/84] SOlr --- controllers/catalog.py | 17 ++++++++++++-- static/utils/solr/schema.xml | 35 ++++++++++++++++------------ static/utils/solr/updateSolrIndex.py | 32 ++++++++++++++++++++++--- views/catalog/index.html | 7 ------ views/catalog/search.html | 11 +++++++++ 5 files changed, 75 insertions(+), 27 deletions(-) create mode 100644 views/catalog/search.html diff --git a/controllers/catalog.py b/controllers/catalog.py index b6cd63c4..e38d73fe 100755 --- a/controllers/catalog.py +++ b/controllers/catalog.py @@ -119,10 +119,23 @@ def series(): return locals() -def index(): + +def search(): + q = {'authors':"Dulip Withanag?",'press_id':'6'} + sort= ['de_title_s','-en_title_s'] + if myconf.take("plugins.solr") == str(1): solr = OMPSOLR(db,myconf) - x = solr.si.query(id="1").execute() + results = solr.si.query(**q) + for s in sort: + results =results.sort_by(s) + results= results.paginate(start=0, rows=10) + results = results.execute() + + return locals() + + +def index(): ompdal = OMPDAL(db, myconf) press = ompdal.getPress(myconf.take('omp.press_id')) diff --git a/static/utils/solr/schema.xml b/static/utils/solr/schema.xml index 84ab56f0..95da027f 100644 --- a/static/utils/solr/schema.xml +++ b/static/utils/solr/schema.xml @@ -367,6 +367,8 @@ + + @@ -394,22 +396,25 @@ --> + + + - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + diff --git a/static/utils/solr/updateSolrIndex.py b/static/utils/solr/updateSolrIndex.py index 05010cc0..e14fcdc6 100644 --- a/static/utils/solr/updateSolrIndex.py +++ b/static/utils/solr/updateSolrIndex.py @@ -7,23 +7,49 @@ from gluon import DAL from ompdal import OMPDAL +import sunburnt +from ompsolr import OMPSOLR + ompdal = OMPDAL(db, myconf) + class Solr: def __init__(self): pass def main(): - solr = Solr() ps = ompdal.getPresses() + solr = OMPSOLR(db, myconf) + submissions = [] + for p in ps: submissions = ompdal.getSubmissionsByPress(p.press_id) for s in submissions: - print p.press_id, s.submission_id + sub = {} + sub['omp_press_id'] = p.press_id + sub['submission_id'] = s.submission_id + #print ompdal.getActualAuthorsBySubmission(s.submission_id) - print ompdal.getSubmissionSettings(s.submission_id) + ss = ompdal.getSubmissionSettings(s.submission_id) + for value in ss: + print value.get('locale') + print value + + + document = [{"id": "0553573403", + "cat": "book", + "name": "A Game of Thrones", + "price": 7.99, + "inStock": True, + "author_t": + "George R.R. Martin", + "series_t": "A Song of Ice and Fire", + "sequence_i": 1, + "genre_s": "fantasy"}] + #solr.si.add(submissions) + #solr.si.commit() if __name__ == '__main__': diff --git a/views/catalog/index.html b/views/catalog/index.html index fc0391dc..982af383 100755 --- a/views/catalog/index.html +++ b/views/catalog/index.html @@ -47,14 +47,7 @@ - - {{ - for i in x: - =i - #=TR(TD(i.get('en_title_s').encode('utf-8'),_class="col-lg-1"),TD(i.get('authors'),_class="col-lg-3"),TD(i)) - pass}} -
{{for submission in submissions:}}
diff --git a/views/catalog/search.html b/views/catalog/search.html new file mode 100644 index 00000000..3b98ee6a --- /dev/null +++ b/views/catalog/search.html @@ -0,0 +1,11 @@ +{{#extend 'layout.html'}} +{{import re, os}} +{{from ompformat import formatContributors, coverImageLink}} + + {{ + + for r in results: + =TR(TD(r.get('en_title_s').encode('utf-8'),_class="col-lg-1"),TD(r.get('authors'),_class="col-lg-3"),TD(i)) + =r + pass}} +
\ No newline at end of file From 5665c4bcf69a2b5f9603bbadf6ffd20fe839dd6b Mon Sep 17 00:00:00 2001 From: withanage Date: Mon, 10 Apr 2017 16:57:15 +0200 Subject: [PATCH 33/84] SOlr --- controllers/catalog.py | 23 +++++++++++++++++------ views/catalog/search.html | 9 ++++++--- 2 files changed, 23 insertions(+), 9 deletions(-) diff --git a/controllers/catalog.py b/controllers/catalog.py index e38d73fe..f78c6635 100755 --- a/controllers/catalog.py +++ b/controllers/catalog.py @@ -121,16 +121,27 @@ def series(): def search(): - q = {'authors':"Dulip Withanag?",'press_id':'6'} - sort= ['de_title_s','-en_title_s'] + q = {'de_title_s': 'Test E*','press_id':'6'} + sort= ['de_title_s','en_title_s'] + start= 0 + rows =10 + fq = {'de_title_s':'*','locale_s': 'de'} + exc = {'submission_id':'42'} + fl = ['de_title_s','submission_id','press_id','en_title_s'] if myconf.take("plugins.solr") == str(1): solr = OMPSOLR(db,myconf) - results = solr.si.query(**q) + r = solr.si.query(**q) for s in sort: - results =results.sort_by(s) - results= results.paginate(start=0, rows=10) - results = results.execute() + r =r.sort_by(s) + r = r.filter(**fq) + r = r.exclude(**exc) + r = r.field_limit(fl) + r = r.highlight(q.keys()) + + r= r.paginate(start=start, rows=rows) + results = r.execute() + hl = results.highlighting return locals() diff --git a/views/catalog/search.html b/views/catalog/search.html index 3b98ee6a..6b6bb37f 100644 --- a/views/catalog/search.html +++ b/views/catalog/search.html @@ -5,7 +5,10 @@ {{ for r in results: - =TR(TD(r.get('en_title_s').encode('utf-8'),_class="col-lg-1"),TD(r.get('authors'),_class="col-lg-3"),TD(i)) - =r + #=TR(TD(r.get('en_title_s').encode('utf-8'),_class="col-lg-1"),TD(r.get('authors'),_class="col-lg-3"),TD(i)) + =TR(r) pass}} - \ No newline at end of file + +{{=results}} + +{{=hl}} \ No newline at end of file From 387a4b2eea59fee110500e37fe3e401502b4874f Mon Sep 17 00:00:00 2001 From: withanage Date: Mon, 10 Apr 2017 17:06:43 +0200 Subject: [PATCH 34/84] SOlr --- controllers/catalog.py | 1 - 1 file changed, 1 deletion(-) diff --git a/controllers/catalog.py b/controllers/catalog.py index f78c6635..ef47fe03 100755 --- a/controllers/catalog.py +++ b/controllers/catalog.py @@ -138,7 +138,6 @@ def search(): r = r.exclude(**exc) r = r.field_limit(fl) r = r.highlight(q.keys()) - r= r.paginate(start=start, rows=rows) results = r.execute() hl = results.highlighting From 0fdeef456a6d537b208e9991a9544af4de91dbf8 Mon Sep 17 00:00:00 2001 From: withanage Date: Tue, 11 Apr 2017 15:25:21 +0200 Subject: [PATCH 35/84] FacetSuche --- controllers/catalog.py | 39 +++++++++++++------- static/utils/solr/schema.xml | 53 +++++++++++++++++++--------- static/utils/solr/updateSolrIndex.py | 41 ++++++++++----------- views/catalog/index.html | 14 ++++++-- views/catalog/search.html | 4 +-- 5 files changed, 97 insertions(+), 54 deletions(-) diff --git a/controllers/catalog.py b/controllers/catalog.py index ef47fe03..ccad6a94 100755 --- a/controllers/catalog.py +++ b/controllers/catalog.py @@ -11,6 +11,8 @@ from ompformat import dateFromRow, seriesPositionCompare from datetime import datetime from ompsolr import OMPSOLR +import json + def category(): @@ -121,26 +123,39 @@ def series(): def search(): - q = {'de_title_s': 'Test E*','press_id':'6'} - sort= ['de_title_s','en_title_s'] + title = '{}'.format(request.vars.title) if request.vars.title else '' + press_id = request.vars.press_id if request.vars.press_id else '' + + form = form = SQLFORM.factory( + Field("title", default="rituale*"), + Field("press_id"), + formstyle='divs', + submit_button="Search", + ) + if form.process().accepted: + title = form.vars.title + + sort= ['title_de','title_en'] start= 0 rows =10 - fq = {'de_title_s':'*','locale_s': 'de'} + fq = {'title_en':'*','locale': 'de'} exc = {'submission_id':'42'} - fl = ['de_title_s','submission_id','press_id','en_title_s'] + fl = ['title_de','submission_id','press_id','title_en'] if myconf.take("plugins.solr") == str(1): solr = OMPSOLR(db,myconf) - r = solr.si.query(**q) - for s in sort: - r =r.sort_by(s) - r = r.filter(**fq) - r = r.exclude(**exc) - r = r.field_limit(fl) - r = r.highlight(q.keys()) + r = solr.si.query(solr.si.Q(title_en=title) | solr.si.Q(title_de=title)) + #for s in sort: + # r =r.sort_by(s) + #r = r.filter(**fq) + #r = r.exclude(**exc) + #r = r.field_limit(fl) + #r = r.highlight(q.keys()) r= r.paginate(start=start, rows=rows) results = r.execute() - hl = results.highlighting + #hl = results.highlighting + + return locals() diff --git a/static/utils/solr/schema.xml b/static/utils/solr/schema.xml index 95da027f..1603f000 100644 --- a/static/utils/solr/schema.xml +++ b/static/utils/solr/schema.xml @@ -367,6 +367,27 @@ + + + + + + + + + + + + + + + + + + + + + @@ -400,21 +421,21 @@ - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + @@ -480,7 +501,7 @@ submission_id - submission_id + title_en diff --git a/static/utils/solr/updateSolrIndex.py b/static/utils/solr/updateSolrIndex.py index e14fcdc6..7a7aa413 100644 --- a/static/utils/solr/updateSolrIndex.py +++ b/static/utils/solr/updateSolrIndex.py @@ -9,6 +9,7 @@ from ompdal import OMPDAL import sunburnt from ompsolr import OMPSOLR +import sys ompdal = OMPDAL(db, myconf) @@ -21,35 +22,31 @@ def __init__(self): def main(): ps = ompdal.getPresses() solr = OMPSOLR(db, myconf) - submissions = [] + document = [] + solr.si.delete(queries=solr.si.Q("*")) + solr.si.commit() for p in ps: submissions = ompdal.getSubmissionsByPress(p.press_id) for s in submissions: sub = {} - sub['omp_press_id'] = p.press_id + sub['press_id'] = p.press_id sub['submission_id'] = s.submission_id - + sub['locale'] = s.locale #print ompdal.getActualAuthorsBySubmission(s.submission_id) - ss = ompdal.getSubmissionSettings(s.submission_id) - for value in ss: - print value.get('locale') - print value - - - document = [{"id": "0553573403", - "cat": "book", - "name": "A Game of Thrones", - "price": 7.99, - "inStock": True, - "author_t": - "George R.R. Martin", - "series_t": "A Song of Ice and Fire", - "sequence_i": 1, - "genre_s": "fantasy"}] - - #solr.si.add(submissions) - #solr.si.commit() + s_settings = ompdal.getSubmissionSettings(s.submission_id) + for v in s_settings: + if v.get('locale'): + key = '{}_{}'.format(v.get('setting_name').lower(),v.get('locale').split('_')[0]) + sub[key] = v.get('setting_value').decode('utf-8') + document.append(sub) + + + + + solr.si.add(document) + + solr.si.commit() if __name__ == '__main__': diff --git a/views/catalog/index.html b/views/catalog/index.html index 982af383..e3fa1922 100755 --- a/views/catalog/index.html +++ b/views/catalog/index.html @@ -33,13 +33,23 @@ {{pass}} {{pages = len(submission_rows)/per_page}} {{odd = len(submission_rows)%per_page > 0}} + {{for i in range(0,pages):}} - {{=LI(A(i+1, _href=URL('index?page_nr='+str(i+1))))}} + {{next = i+1}} + {{if i==page_nr:}} + {{next = B(next)}} + {{pass}} + {{=LI(A(next, _href=URL('index?page_nr='+str(i+1))))}} {{pass}} {{if odd:}} - {{=LI(A(pages+1, _href=URL('index?page_nr='+str(pages+1))))}} + {{last = pages+1}} + {{if page_nr == pages:}} + {{last= B(last)}} {{pass}} + {{=LI(A(last, _href=URL('index?page_nr='+str(pages+1))))}} + {{pass}} + {{if (page_nr < pages-1) or (page_nr < pages & odd ):}}
  • {{pass}} diff --git a/views/catalog/search.html b/views/catalog/search.html index 6b6bb37f..920da117 100644 --- a/views/catalog/search.html +++ b/views/catalog/search.html @@ -1,14 +1,14 @@ {{#extend 'layout.html'}} {{import re, os}} {{from ompformat import formatContributors, coverImageLink}} +{{=form}} {{ for r in results: #=TR(TD(r.get('en_title_s').encode('utf-8'),_class="col-lg-1"),TD(r.get('authors'),_class="col-lg-3"),TD(i)) - =TR(r) + #=TR(r) pass}}
    {{=results}} -{{=hl}} \ No newline at end of file From 03f9dd64efed2a7344e28f75ad1517ed268ea420 Mon Sep 17 00:00:00 2001 From: Dulip Withanage Date: Wed, 12 Apr 2017 10:57:28 +0200 Subject: [PATCH 36/84] Update INSTALL.md --- static/docs/INSTALL.md | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/static/docs/INSTALL.md b/static/docs/INSTALL.md index 1fd0e09f..5a3f8b17 100644 --- a/static/docs/INSTALL.md +++ b/static/docs/INSTALL.md @@ -15,19 +15,26 @@ - Notice - press_name *should* contain only characters, numbers or _ - Please do not use **-** in the **press_name** + +3. Install dependencies +``` +cd web2py_folder/applications/UBHD_OMPPortal +sudo pip2 install -r requirements.txt +``` -3. Copy appconfig.ini and cahnges the settings accordingly Datails on appconfig.ini are +4. Copy appconfig.ini and cahnges the settings accordingly Datails on appconfig.ini are ``` mkdir private ``` ``` cp web2py_folder/application/UBHD_OMPPortal/static/docs/appconfig.ini web2py_folder/application/UBHD_OMPPortal/private/ ``` -4. Change the settings for your local omp installation private/appconfig.ini [Details](https://github.com/UB-Heidelberg/UBHD-OMPPortal/blob/categories/static/docs/APPCONFIG.md) +5. Change the settings for your local omp installation private/appconfig.ini [Details](https://github.com/UB-Heidelberg/UBHD-OMPPortal/blob/categories/static/docs/APPCONFIG.md) 1. **username** and **password** for the OMP database 2. **press_id** of the local omp press 3. define the **press_name** you selected when cloning from git -5. Mount or symlink the files folder of the OMP to **web2py_folder**/applications/**press_name**/static/monographs/ +6. Mount or symlink the files folder of the OMP to **web2py_folder**/applications/**press_name**/static/monographs/ ``` -ln -s web2py_folder/applications/press_name/static/monographs/ omp_folder/files/presses/press_id/monographs \ No newline at end of file +ln -s web2py_folder/applications/press_name/static/monographs/ omp_folder/files/presses/press_id/monographs + From 0521975b485d9e366429207ffb1b19c1b64ec929 Mon Sep 17 00:00:00 2001 From: Dulip Withanage Date: Wed, 12 Apr 2017 10:59:21 +0200 Subject: [PATCH 37/84] Update INSTALL.md --- static/docs/INSTALL.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/static/docs/INSTALL.md b/static/docs/INSTALL.md index 5a3f8b17..74ab3d0d 100644 --- a/static/docs/INSTALL.md +++ b/static/docs/INSTALL.md @@ -14,11 +14,11 @@ 2. ```git clone https://github.com/UB-Heidelberg/UBHD-OMPPortal.git press_name``` - Notice - press_name *should* contain only characters, numbers or _ - - Please do not use **-** in the **press_name** + - Please do not use **-** symbol in the **press_name** to 3. Install dependencies ``` -cd web2py_folder/applications/UBHD_OMPPortal +cd web2py_folder/applications/$press_name sudo pip2 install -r requirements.txt ``` @@ -26,7 +26,7 @@ sudo pip2 install -r requirements.txt ``` mkdir private ``` - ``` cp web2py_folder/application/UBHD_OMPPortal/static/docs/appconfig.ini web2py_folder/application/UBHD_OMPPortal/private/ ``` + ``` cp web2py_folder/application/$press_name/static/docs/appconfig.ini web2py_folder/application/$press_name/private/ ``` 5. Change the settings for your local omp installation private/appconfig.ini [Details](https://github.com/UB-Heidelberg/UBHD-OMPPortal/blob/categories/static/docs/APPCONFIG.md) 1. **username** and **password** for the OMP database From 976851f075c3ba2beeeeddd766a8f1ffa4fee41c Mon Sep 17 00:00:00 2001 From: Dulip Withanage Date: Wed, 12 Apr 2017 11:03:23 +0200 Subject: [PATCH 38/84] Update INSTALL.md --- static/docs/INSTALL.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/static/docs/INSTALL.md b/static/docs/INSTALL.md index 74ab3d0d..5f3c28da 100644 --- a/static/docs/INSTALL.md +++ b/static/docs/INSTALL.md @@ -13,8 +13,7 @@ 2. ```git clone https://github.com/UB-Heidelberg/UBHD-OMPPortal.git press_name``` - Notice - - press_name *should* contain only characters, numbers or _ - - Please do not use **-** symbol in the **press_name** to + - Please use **only** **_**, ascii alphabet and numbers for the **press_name** 3. Install dependencies ``` From 398149f8ebbbe5e26f9704fefa950c7af2e37586 Mon Sep 17 00:00:00 2001 From: withanage Date: Wed, 12 Apr 2017 11:03:52 +0200 Subject: [PATCH 39/84] Requirements --- controllers/catalog.py | 12 ++++++++++++ requirements.txt | 2 ++ views/catalog/search.html | 3 ++- 3 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 requirements.txt diff --git a/controllers/catalog.py b/controllers/catalog.py index ccad6a94..90a10047 100755 --- a/controllers/catalog.py +++ b/controllers/catalog.py @@ -155,7 +155,19 @@ def search(): results = r.execute() #hl = results.highlighting + from paginate import Page, make_html_tag + def paginate_link_tag(item): + """ + Create an A-HREF tag that points to another page usable in paginate. + """ + a_tag = Page.default_link_tag(item) + if item['type'] == 'current_page': + return make_html_tag('li', a_tag, **{'class': 'active'}) + return make_html_tag('li', a_tag) + + + p = Page(['test','test2'], page=15, items_per_page=15, item_count=10) return locals() diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 00000000..03e66bc4 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,2 @@ +sunburnt>=0.6 +paginate>=0.5.6 diff --git a/views/catalog/search.html b/views/catalog/search.html index 920da117..296059b3 100644 --- a/views/catalog/search.html +++ b/views/catalog/search.html @@ -10,5 +10,6 @@ #=TR(r) pass}} -{{=results}} +{{#=results}} +{{=p}} From 9a9cd24460defd329b5c19463796c2a191b92d8e Mon Sep 17 00:00:00 2001 From: withanage Date: Wed, 12 Apr 2017 16:54:02 +0200 Subject: [PATCH 40/84] Facetierung --- controllers/catalog.py | 57 +++++++++++++++++++++++++++++---- static/utils/solr/schema.xml | 4 +-- views/catalog/index.html | 61 +++++++----------------------------- views/catalog/search.html | 2 +- 4 files changed, 66 insertions(+), 58 deletions(-) diff --git a/controllers/catalog.py b/controllers/catalog.py index 90a10047..12866152 100755 --- a/controllers/catalog.py +++ b/controllers/catalog.py @@ -127,7 +127,7 @@ def search(): press_id = request.vars.press_id if request.vars.press_id else '' form = form = SQLFORM.factory( - Field("title", default="rituale*"), + Field("title"), Field("press_id"), formstyle='divs', submit_button="Search", @@ -144,7 +144,8 @@ def search(): if myconf.take("plugins.solr") == str(1): solr = OMPSOLR(db,myconf) - r = solr.si.query(solr.si.Q(title_en=title) | solr.si.Q(title_de=title)) + #r = solr.si.query(solr.si.Q(title_en=title) | solr.si.Q(title_de=title)) + r = solr.si.query('aktuelle*') #for s in sort: # r =r.sort_by(s) #r = r.filter(**fq) @@ -172,10 +173,50 @@ def paginate_link_tag(item): return locals() + + def index(): + def create_pagination(total, per_page, current): + li = [] + al = {'_aria-label': "Page navigation"} + for i in range(0, total): + l = A(i + 1, _href=URL('index?page_nr=' + str(i + 1))) + li.append(LI(l, _class="active")) if i == current else li.append(LI(l)) + return TAG.nav(UL(li, _class="pagination"), **al) + + def create_per_page_nav(): + li = [LI(A(i, _href=URL('index?per_page=' + str(i)))) for i in [2,3,4]] + ul =UL(li, _class="dropdown-menu") + button_cs= { "_type":"button", "_class":"btn btn-default dropdown-toggle","_data-toggle":"dropdown", "_aria-haspopup":"true","_aria-expanded":"false"} + button =TAG.button("Results per Page",SPAN(_class='caret'),**button_cs ) + return DIV(button,ul,_class="btn-group") + + def create_sort(submissions, sort_by): + default = sorted(submissions, key=lambda s: min(s.associated_items.get('publication_dates', [datetime(1, 1, 1)])), + reverse=False) + if sort_by=="date": + results = default + elif sort_by=="title": + results = sorted(submissions, key=lambda s: s.settings.getLocalizedValue('title', locale), reverse=False) + else: + results = sorted(submissions, key=lambda s: s.associated_items.get(sort_by), reverse=True) + + + return results + + def create_sort_nav(): + li = [LI(A(i, _href=URL('index?sort_by=' + str(i)))) for i in ["title","authors","date","category","series"]] + ul =UL(li, _class="dropdown-menu") + button_cs= { "_type":"button", "_class":"btn btn-default dropdown-toggle","_data-toggle":"dropdown", "_aria-haspopup":"true","_aria-expanded":"false"} + button =TAG.button(T("sort by"),SPAN(_class='caret'),**button_cs ) + return DIV(button,ul,_class="btn-group") ompdal = OMPDAL(db, myconf) press = ompdal.getPress(myconf.take('omp.press_id')) + sort_by = request.vars.get('sort_by') + session.sort_by = sort_by if sort_by else session.get('sort_by','date') + + per_page = request.vars.get('per_page') if per_page : @@ -224,13 +265,17 @@ def index(): submissions.append(submission) - submissions = sorted(submissions, key=lambda s: min( - s.associated_items.get('publication_dates', [datetime(1, 1, 1)])), reverse=True) + submissions = create_sort(submissions,session.get('sort_by')) - #submissions = sorted(submissions,key=lambda s: s.associated_items.get('category',None), reverse=False) - #Slice submissions = submissions[page_nr*per_page:(page_nr+1)*(per_page)] + pages = len(submission_rows)/per_page + if len(submission_rows) % per_page >0: + pages = pages +1 + pagination = create_pagination(pages, per_page, page_nr) + results_per_page = create_per_page_nav() + sort_nav = create_sort_nav() + return locals() diff --git a/static/utils/solr/schema.xml b/static/utils/solr/schema.xml index 1603f000..b3c3b3b1 100644 --- a/static/utils/solr/schema.xml +++ b/static/utils/solr/schema.xml @@ -367,7 +367,7 @@ - + @@ -377,7 +377,7 @@ - + diff --git a/views/catalog/index.html b/views/catalog/index.html index e3fa1922..151bdfe3 100755 --- a/views/catalog/index.html +++ b/views/catalog/index.html @@ -3,62 +3,25 @@ {{from ompformat import formatContributors, coverImageLink}}
    - +{{for s in submissions: + for l in s.associated_items.get('authors'): + =l.attributes.get('last_name') + pass + pass + }}
    -
    -
    -
    - - - - {{results_per_page=[2,3,4]}} - -
    - - - -
    + {{=results_per_page}} +{{=sort_nav}}
    +
    {{=pagination}}
    + +
    {{for submission in submissions:}}
    diff --git a/views/catalog/search.html b/views/catalog/search.html index 296059b3..e0701ec1 100644 --- a/views/catalog/search.html +++ b/views/catalog/search.html @@ -10,6 +10,6 @@ #=TR(r) pass}} -{{#=results}} +{{=results}} {{=p}} From b0e0672a6f5141472f92fc57f095b38f7c1b1a6f Mon Sep 17 00:00:00 2001 From: withanage Date: Thu, 13 Apr 2017 10:51:32 +0200 Subject: [PATCH 41/84] Facetierung --- controllers/catalog.py | 2 +- static/omp-resources | 2 +- views/catalog/index.html | 13 +++++++++---- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/controllers/catalog.py b/controllers/catalog.py index 924da2dd..f6e72d89 100755 --- a/controllers/catalog.py +++ b/controllers/catalog.py @@ -195,7 +195,7 @@ def create_sort(submissions, sort_by): if sort_by=="date": results = default elif sort_by=="title": - results = sorted(submissions, key=lambda s: s.settings.getLocalizedValue('title', locale), reverse=False) + results = sorted(submissions, key=lambda s: s.settings.getLocalizedValue('title', locale).lower(), reverse=False) else: results = sorted(submissions, key=lambda s: s.associated_items.get(sort_by), reverse=True) diff --git a/static/omp-resources b/static/omp-resources index 6c2f252b..5255622f 160000 --- a/static/omp-resources +++ b/static/omp-resources @@ -1 +1 @@ -Subproject commit 6c2f252b4b8a6b383377c17737ceac044e711ae1 +Subproject commit 5255622f1dcbf56826e769e2d081481d458ab0ea diff --git a/views/catalog/index.html b/views/catalog/index.html index 151bdfe3..636ec145 100755 --- a/views/catalog/index.html +++ b/views/catalog/index.html @@ -3,12 +3,17 @@ {{from ompformat import formatContributors, coverImageLink}}
    -{{for s in submissions: - for l in s.associated_items.get('authors'): - =l.attributes.get('last_name') +{{ + submissions = sorted(submissions, key=lambda s: s.settings.getLocalizedValue('title', locale).lower(), reverse=False) + titles = [] + for s in submissions: + #=s.settings.__dict__ + =(s.settings.getLocalizedValue('title',locale)) + =BR() pass pass - }} + +}}
    From 9400d7614c9979895464d274e69fd292e8915dcd Mon Sep 17 00:00:00 2001 From: withanage Date: Thu, 13 Apr 2017 10:54:56 +0200 Subject: [PATCH 42/84] Module update --- modules | 2 +- static/omp-resources | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modules b/modules index 5ce0d0be..d3538c70 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit 5ce0d0be8408ffc51491cd13907663c79e793088 +Subproject commit d3538c70b84920eb44773b17e3bc2fcef7d3a089 diff --git a/static/omp-resources b/static/omp-resources index 5255622f..6c2f252b 160000 --- a/static/omp-resources +++ b/static/omp-resources @@ -1 +1 @@ -Subproject commit 5255622f1dcbf56826e769e2d081481d458ab0ea +Subproject commit 6c2f252b4b8a6b383377c17737ceac044e711ae1 From 51ed853b160652a8e508ffb389eca258d2208b7f Mon Sep 17 00:00:00 2001 From: withanage Date: Thu, 13 Apr 2017 11:12:00 +0200 Subject: [PATCH 43/84] Sorting - Testdata --- controllers/catalog.py | 13 ++++++------- views/catalog/index.html | 10 +++++++++- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/controllers/catalog.py b/controllers/catalog.py index f6e72d89..a9e0ef80 100755 --- a/controllers/catalog.py +++ b/controllers/catalog.py @@ -190,20 +190,19 @@ def create_per_page_nav(): return DIV(button,ul,_class="btn-group") def create_sort(submissions, sort_by): - default = sorted(submissions, key=lambda s: min(s.associated_items.get('publication_dates', [datetime(1, 1, 1)])), + results = sorted(submissions, key=lambda s: min(s.associated_items.get('publication_dates', [datetime(1, 1, 1)])), reverse=False) - if sort_by=="date": - results = default - elif sort_by=="title": + if sort_by=="title": results = sorted(submissions, key=lambda s: s.settings.getLocalizedValue('title', locale).lower(), reverse=False) - else: - results = sorted(submissions, key=lambda s: s.associated_items.get(sort_by), reverse=True) + elif sort_by=="category": + results = sorted(submissions, key=lambda s: s.associated_items.get('category'), reverse=False) + return results def create_sort_nav(): - li = [LI(A(i, _href=URL('index?sort_by=' + str(i)))) for i in ["title","authors","date","category","series"]] + li = [LI(A(i, _href=URL('index?sort_by=' + str(i)))) for i in ["title","date","category","series"]] ul =UL(li, _class="dropdown-menu") button_cs= { "_type":"button", "_class":"btn btn-default dropdown-toggle","_data-toggle":"dropdown", "_aria-haspopup":"true","_aria-expanded":"false"} button =TAG.button(T("sort by"),SPAN(_class='caret'),**button_cs ) diff --git a/views/catalog/index.html b/views/catalog/index.html index 636ec145..1958caa5 100755 --- a/views/catalog/index.html +++ b/views/catalog/index.html @@ -4,11 +4,19 @@
    {{ - submissions = sorted(submissions, key=lambda s: s.settings.getLocalizedValue('title', locale).lower(), reverse=False) + titles = [] for s in submissions: #=s.settings.__dict__ =(s.settings.getLocalizedValue('title',locale)) + if s.associated_items.get('category'): + =XML('-----') + = (s.associated_items.get('category').settings.getLocalizedValue('title',locale)) + =XML('-----') + pass + if s.associated_items.get('series'): + = (s.associated_items.get('series').settings.getLocalizedValue('title',locale)) + pass =BR() pass pass From c4fde2e99f2dc024dfd31132e11d14a6771373b1 Mon Sep 17 00:00:00 2001 From: withanage Date: Thu, 13 Apr 2017 11:14:30 +0200 Subject: [PATCH 44/84] Sorting - Testdata --- controllers/catalog.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/controllers/catalog.py b/controllers/catalog.py index a9e0ef80..615a4e5f 100755 --- a/controllers/catalog.py +++ b/controllers/catalog.py @@ -196,13 +196,10 @@ def create_sort(submissions, sort_by): results = sorted(submissions, key=lambda s: s.settings.getLocalizedValue('title', locale).lower(), reverse=False) elif sort_by=="category": results = sorted(submissions, key=lambda s: s.associated_items.get('category'), reverse=False) - - - return results def create_sort_nav(): - li = [LI(A(i, _href=URL('index?sort_by=' + str(i)))) for i in ["title","date","category","series"]] + li = [LI(A(i, _href=URL('index?sort_by=' + str(i)))) for i in ["title","date","category"]] ul =UL(li, _class="dropdown-menu") button_cs= { "_type":"button", "_class":"btn btn-default dropdown-toggle","_data-toggle":"dropdown", "_aria-haspopup":"true","_aria-expanded":"false"} button =TAG.button(T("sort by"),SPAN(_class='caret'),**button_cs ) From 8c30e68e4e751040ccd4fe27f96be213b067e5e8 Mon Sep 17 00:00:00 2001 From: withanage Date: Thu, 13 Apr 2017 13:31:19 +0200 Subject: [PATCH 45/84] omp browse plugin --- controllers/catalog.py | 65 ++++++++++++---------------------------- modules | 2 +- views/catalog/index.html | 30 ++++--------------- 3 files changed, 25 insertions(+), 72 deletions(-) diff --git a/controllers/catalog.py b/controllers/catalog.py index 615a4e5f..93c83e71 100755 --- a/controllers/catalog.py +++ b/controllers/catalog.py @@ -7,8 +7,9 @@ from ompdal import OMPDAL, OMPSettings, OMPItem from ompformat import dateFromRow, seriesPositionCompare -from datetime import datetime + from ompsolr import OMPSOLR +from ompbrowse import Pagination , Sort import json @@ -174,51 +175,17 @@ def paginate_link_tag(item): def index(): - def create_pagination(total, per_page, current): - li = [] - al = {'_aria-label': "Page navigation"} - for i in range(0, total): - l = A(i + 1, _href=URL('index?page_nr=' + str(i + 1))) - li.append(LI(l, _class="active")) if i == current else li.append(LI(l)) - return TAG.nav(UL(li, _class="pagination"), **al) - - def create_per_page_nav(): - li = [LI(A(i, _href=URL('index?per_page=' + str(i)))) for i in [2,3,4]] - ul =UL(li, _class="dropdown-menu") - button_cs= { "_type":"button", "_class":"btn btn-default dropdown-toggle","_data-toggle":"dropdown", "_aria-haspopup":"true","_aria-expanded":"false"} - button =TAG.button("Results per Page",SPAN(_class='caret'),**button_cs ) - return DIV(button,ul,_class="btn-group") - - def create_sort(submissions, sort_by): - results = sorted(submissions, key=lambda s: min(s.associated_items.get('publication_dates', [datetime(1, 1, 1)])), - reverse=False) - if sort_by=="title": - results = sorted(submissions, key=lambda s: s.settings.getLocalizedValue('title', locale).lower(), reverse=False) - elif sort_by=="category": - results = sorted(submissions, key=lambda s: s.associated_items.get('category'), reverse=False) - return results - - def create_sort_nav(): - li = [LI(A(i, _href=URL('index?sort_by=' + str(i)))) for i in ["title","date","category"]] - ul =UL(li, _class="dropdown-menu") - button_cs= { "_type":"button", "_class":"btn btn-default dropdown-toggle","_data-toggle":"dropdown", "_aria-haspopup":"true","_aria-expanded":"false"} - button =TAG.button(T("sort by"),SPAN(_class='caret'),**button_cs ) - return DIV(button,ul,_class="btn-group") ompdal = OMPDAL(db, myconf) press = ompdal.getPress(myconf.take('omp.press_id')) + sort_by = request.vars.get('sort_by') session.sort_by = sort_by if sort_by else session.get('sort_by','date') - - per_page = request.vars.get('per_page') - if per_page : - session.catalog_per_page = int(per_page) - - per_page = int(session.get('catalog_per_page', 20)) + session.per_page = int(per_page) if per_page else int(session.get('per_page', 20)) - page_nr = int(request.vars.get('page_nr',1))-1 + current = int(request.vars.get('page_nr',1))-1 @@ -259,16 +226,22 @@ def create_sort_nav(): submissions.append(submission) - submissions = create_sort(submissions,session.get('sort_by')) + pages = len(submission_rows) / session.get('per_page') + if len(submission_rows) % session.get('per_page') >0: + pages = pages +1 + + sort = Sort(locale) + sort_select = sort.get_sort_select() + + + submissions = sort.sort_submissions(submissions, session.get('sort_by')) + submissions = submissions[current * session.get('per_page'):(current + 1) * (session.get('per_page'))] + + pagination = Pagination(current,pages) + navigation_select = pagination.get_navigation_select() + navigation_result = pagination.get_navigation_result() - submissions = submissions[page_nr*per_page:(page_nr+1)*(per_page)] - pages = len(submission_rows)/per_page - if len(submission_rows) % per_page >0: - pages = pages +1 - pagination = create_pagination(pages, per_page, page_nr) - results_per_page = create_per_page_nav() - sort_nav = create_sort_nav() return locals() diff --git a/modules b/modules index d3538c70..992c7694 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit d3538c70b84920eb44773b17e3bc2fcef7d3a089 +Subproject commit 992c769469334365493f664d266a6e59618bdc51 diff --git a/views/catalog/index.html b/views/catalog/index.html index 1958caa5..d3016e91 100755 --- a/views/catalog/index.html +++ b/views/catalog/index.html @@ -3,38 +3,18 @@ {{from ompformat import formatContributors, coverImageLink}}
    -{{ - - titles = [] - for s in submissions: - #=s.settings.__dict__ - =(s.settings.getLocalizedValue('title',locale)) - if s.associated_items.get('category'): - =XML('-----') - = (s.associated_items.get('category').settings.getLocalizedValue('title',locale)) - =XML('-----') - pass - if s.associated_items.get('series'): - = (s.associated_items.get('series').settings.getLocalizedValue('title',locale)) - pass - =BR() - pass - pass - -}}
    - - {{=results_per_page}} -{{=sort_nav}} - + {{=navigation_select}}{{=sort_select}} +
    +
    + {{=navigation_result}}
    -
    {{=pagination}}
    -
    + {{for submission in submissions:}}
    From ab6c85a71f000f174fbd9624d3384a7c5351841a Mon Sep 17 00:00:00 2001 From: withanage Date: Thu, 13 Apr 2017 13:36:21 +0200 Subject: [PATCH 46/84] omp browse plugin --- modules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules b/modules index 992c7694..71906bb2 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit 992c769469334365493f664d266a6e59618bdc51 +Subproject commit 71906bb21b1d3c4a44e4079ef49e7d689926a212 From 49f5ebfac3999bbab9b6bc1e80601b107ecf16a3 Mon Sep 17 00:00:00 2001 From: withanage Date: Thu, 13 Apr 2017 14:17:05 +0200 Subject: [PATCH 47/84] omp browse plugin --- modules | 2 +- views/catalog/index.html | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/modules b/modules index 71906bb2..cd4dc87f 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit 71906bb21b1d3c4a44e4079ef49e7d689926a212 +Subproject commit cd4dc87f4b9e643813f6d79cc8faf27d3aa5e1dc diff --git a/views/catalog/index.html b/views/catalog/index.html index d3016e91..b3a76bc2 100755 --- a/views/catalog/index.html +++ b/views/catalog/index.html @@ -8,10 +8,11 @@
    - {{=navigation_select}}{{=sort_select}} +
    - {{=navigation_result}} + {{=navigation_result}}{{=navigation_select}}{{=sort_select}} +
    From 799662fbb1faba8202f2a7eea2dd8e67bed38c56 Mon Sep 17 00:00:00 2001 From: wwwubhd Date: Thu, 13 Apr 2017 14:27:21 +0200 Subject: [PATCH 48/84] Module update --- modules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules b/modules index cd4dc87f..5ce0d0be 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit cd4dc87f4b9e643813f6d79cc8faf27d3aa5e1dc +Subproject commit 5ce0d0be8408ffc51491cd13907663c79e793088 From e990ce90bf79e2a907a7f79ba0b4c2bc34622fd9 Mon Sep 17 00:00:00 2001 From: withanage Date: Thu, 13 Apr 2017 14:32:52 +0200 Subject: [PATCH 49/84] module update --- modules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules b/modules index cd4dc87f..5ce0d0be 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit cd4dc87f4b9e643813f6d79cc8faf27d3aa5e1dc +Subproject commit 5ce0d0be8408ffc51491cd13907663c79e793088 From 5b793c2644f2a5f27d4e503c26e4512c3ade1336 Mon Sep 17 00:00:00 2001 From: withanage Date: Thu, 13 Apr 2017 14:44:57 +0200 Subject: [PATCH 50/84] Browser --- modules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules b/modules index 5ce0d0be..eaabcc8b 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit 5ce0d0be8408ffc51491cd13907663c79e793088 +Subproject commit eaabcc8bfcb8d89c2f3234715c8b0cae26a29f37 From e6b2e11c5b92cc98a85b7d7f40bbc237ef40b7f3 Mon Sep 17 00:00:00 2001 From: withanage Date: Thu, 13 Apr 2017 16:22:08 +0200 Subject: [PATCH 51/84] Browser --- controllers/catalog.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/controllers/catalog.py b/controllers/catalog.py index 93c83e71..0f96d7a7 100755 --- a/controllers/catalog.py +++ b/controllers/catalog.py @@ -11,7 +11,7 @@ from ompsolr import OMPSOLR from ompbrowse import Pagination , Sort import json - +from datetime import datetime def category(): @@ -233,8 +233,11 @@ def index(): sort = Sort(locale) sort_select = sort.get_sort_select() - + #submissions = filter(lambda s: s.associated_items.get('category') != None, submissions) submissions = sort.sort_submissions(submissions, session.get('sort_by')) + #submissions = filter(lambda s: datetime.strptime(str(2016),'%Y') < min(s.associated_items.get('publication_dates', [datetime(1, 1, 1)])) < datetime.strptime(str(2017),'%Y') , submissions) + + submissions = submissions[current * session.get('per_page'):(current + 1) * (session.get('per_page'))] pagination = Pagination(current,pages) From a16128815cf9141fc2f9eb7591c97fe5c9f0924d Mon Sep 17 00:00:00 2001 From: withanage Date: Thu, 20 Apr 2017 16:40:09 +0200 Subject: [PATCH 52/84] Fadceting as Web2py Module --- controllers/catalog.py | 31 ++++++------------ languages/de.py | 3 ++ models/logger.py | 69 ++++++++++++++++++++++++++++++++++++++++ modules | 2 +- views/catalog/index.html | 16 ++++++++-- 5 files changed, 96 insertions(+), 25 deletions(-) create mode 100644 models/logger.py diff --git a/controllers/catalog.py b/controllers/catalog.py index 0f96d7a7..7fb2a506 100755 --- a/controllers/catalog.py +++ b/controllers/catalog.py @@ -9,7 +9,7 @@ from ompformat import dateFromRow, seriesPositionCompare from ompsolr import OMPSOLR -from ompbrowse import Pagination , Sort +from ompbrowse import Browser import json from datetime import datetime @@ -179,13 +179,6 @@ def index(): ompdal = OMPDAL(db, myconf) press = ompdal.getPress(myconf.take('omp.press_id')) - sort_by = request.vars.get('sort_by') - session.sort_by = sort_by if sort_by else session.get('sort_by','date') - - per_page = request.vars.get('per_page') - session.per_page = int(per_page) if per_page else int(session.get('per_page', 20)) - - current = int(request.vars.get('page_nr',1))-1 @@ -199,6 +192,7 @@ def index(): submissions = [] submission_rows = ompdal.getSubmissionsByPress(press.press_id, ignored_submission_id) + for submission_row in submission_rows: authors = [OMPItem(author, OMPSettings(ompdal.getAuthorSettings(author.author_id))) for author in ompdal.getAuthorsBySubmission(submission_row.submission_id)] @@ -226,23 +220,16 @@ def index(): submissions.append(submission) - pages = len(submission_rows) / session.get('per_page') - if len(submission_rows) % session.get('per_page') >0: - pages = pages +1 - - sort = Sort(locale) - sort_select = sort.get_sort_select() - - #submissions = filter(lambda s: s.associated_items.get('category') != None, submissions) - submissions = sort.sort_submissions(submissions, session.get('sort_by')) - #submissions = filter(lambda s: datetime.strptime(str(2016),'%Y') < min(s.associated_items.get('publication_dates', [datetime(1, 1, 1)])) < datetime.strptime(str(2017),'%Y') , submissions) + session.filters =request.vars.get('filters') if request.vars.get('filters') else session.get('filters', {}) + session.per_page = int(request.vars.get('per_page')) if request.vars.get('per_page') else int(session.get('per_page', 20)) + session.sort_by = request.vars.get('sort_by') if request.vars.get('sort_by') else session.get('sort_by', 'date') + current = int(request.vars.get('page_nr', 1)) - 1 - submissions = submissions[current * session.get('per_page'):(current + 1) * (session.get('per_page'))] - pagination = Pagination(current,pages) - navigation_select = pagination.get_navigation_select() - navigation_result = pagination.get_navigation_result() + b = Browser(submissions,current,locale, session.get('per_page'), session.get('sort_by'), session.get('filters')) + b.submissions = b.filter_submissions(submissions) + submissions =b.process_submissions(b.submissions) diff --git a/languages/de.py b/languages/de.py index 231d0bc3..5969fe7b 100755 --- a/languages/de.py +++ b/languages/de.py @@ -168,6 +168,7 @@ 'Farbraum': 'Farbraum', 'Felix M. Michl\nDie limitierte Auflage': 'Felix M. Michl\nDie limitierte Auflage', 'Felix M. Michl Die limitierte Auflage': 'Felix M. Michl Die limitierte Auflage', +'Filter': 'Filter', 'First name': 'Vorname', 'Follow us on Twitter': 'Besuchen Sie uns auf Twitter', 'For Authors': 'Informationen für Autoren', @@ -362,6 +363,7 @@ 'Reihe': 'Reihe', 'Remember me (for 30 days)': 'Eingeloggt bleiben (30 Tage lang)', 'Reset Password key': 'Passwortschlüssel zurücksetzen', +'Results per Page': 'Results per Page', 'Rights and Licences': 'Rechte und Lizenzen', 'Role': 'Rolle', 'Roles': 'Rollen', @@ -387,6 +389,7 @@ 'Sign Up': 'Sign Up', 'Size of cache:': 'Cachegröße:', 'Soon': 'Demnächst', +'sort by': 'sort by', 'Speicherung': 'Speicherung', 'Sprache': 'Sprache', 'state': 'Status', diff --git a/models/logger.py b/models/logger.py new file mode 100644 index 00000000..3f093112 --- /dev/null +++ b/models/logger.py @@ -0,0 +1,69 @@ +import logging, logging.handlers + +class GAEHandler(logging.Handler): + """ + Logging handler for GAE DataStore + """ + def emit(self, record): + + from google.appengine.ext import db + + class Log(db.Model): + name = db.StringProperty() + level = db.StringProperty() + module = db.StringProperty() + func_name = db.StringProperty() + line_no = db.IntegerProperty() + thread = db.IntegerProperty() + thread_name = db.StringProperty() + process = db.IntegerProperty() + message = db.StringProperty(multiline=True) + args = db.StringProperty(multiline=True) + date = db.DateTimeProperty(auto_now_add=True) + + log = Log() + log.name = record.name + log.level = record.levelname + log.module = record.module + log.func_name = record.funcName + log.line_no = record.lineno + log.thread = record.thread + log.thread_name = record.threadName + log.process = record.process + log.message = record.msg + log.args = str(record.args) + log.put() + +def get_configured_logger(name): + logger = logging.getLogger(name) + if (len(logger.handlers) == 0): + # This logger has no handlers, so we can assume it hasn't yet been configured + # (Configure logger) + + # Create default handler + if request.env.web2py_runtime_gae: + # Create GAEHandler + handler = GAEHandler() + else: + # Create RotatingFileHandler + import os + formatter="%(asctime)s %(levelname)s %(process)s %(thread)s %(funcName)s():%(lineno)d %(message)s" + handler = logging.handlers.RotatingFileHandler(os.path.join(request.folder,'private/app.log'),maxBytes=1024,backupCount=2) + handler.setFormatter(logging.Formatter(formatter)) + + handler.setLevel(logging.DEBUG) + + logger.addHandler(handler) + logger.setLevel(logging.DEBUG) + + # Test entry: + logger.debug(name + ' logger created') + else: + # Test entry: + logger.debug(name + ' already exists') + + return logger + +# Assign application logger to a global var + +logger = get_configured_logger(request.application) diff --git a/modules b/modules index eaabcc8b..fa96e8ab 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit eaabcc8bfcb8d89c2f3234715c8b0cae26a29f37 +Subproject commit fa96e8abde9cb5ecb3d8610682b29ddda8a759a8 diff --git a/views/catalog/index.html b/views/catalog/index.html index b3a76bc2..1c7b6118 100755 --- a/views/catalog/index.html +++ b/views/catalog/index.html @@ -4,14 +4,26 @@
    +
    - + {{=session}}
    - {{=navigation_result}}{{=navigation_select}}{{=sort_select}} + +
    + +
    + + {{=b.navigation_list}}{{=b.navigation_select}}{{=b.sort_select}}
    From 8c936f6ac35c84513661960ac216d05a60576097 Mon Sep 17 00:00:00 2001 From: withanage Date: Mon, 24 Apr 2017 13:40:50 +0200 Subject: [PATCH 53/84] Facet beta 1 --- controllers/catalog.py | 11 ++--------- languages/de.py | 2 ++ modules | 2 +- views/catalog/index.html | 12 +++--------- 4 files changed, 8 insertions(+), 19 deletions(-) diff --git a/controllers/catalog.py b/controllers/catalog.py index 7fb2a506..024c47f8 100755 --- a/controllers/catalog.py +++ b/controllers/catalog.py @@ -179,9 +179,6 @@ def index(): ompdal = OMPDAL(db, myconf) press = ompdal.getPress(myconf.take('omp.press_id')) - - - if not press: redirect(URL('home', 'index')) press_settings = OMPSettings(ompdal.getPressSettings(press.press_id)) @@ -220,18 +217,14 @@ def index(): submissions.append(submission) - session.filters =request.vars.get('filters') if request.vars.get('filters') else session.get('filters', {}) + session.filters =request.vars.get('filter_by').strip('[').strip(']') if request.vars.get('filter_by') else session.get('filters', '') session.per_page = int(request.vars.get('per_page')) if request.vars.get('per_page') else int(session.get('per_page', 20)) session.sort_by = request.vars.get('sort_by') if request.vars.get('sort_by') else session.get('sort_by', 'date') current = int(request.vars.get('page_nr', 1)) - 1 - b = Browser(submissions,current,locale, session.get('per_page'), session.get('sort_by'), session.get('filters')) - b.submissions = b.filter_submissions(submissions) - submissions =b.process_submissions(b.submissions) - - + submissions = b.process_submissions(b.submissions) return locals() diff --git a/languages/de.py b/languages/de.py index 5969fe7b..12e24a3a 100755 --- a/languages/de.py +++ b/languages/de.py @@ -55,6 +55,7 @@ 'Adresszeile3': 'Adresszeile3', 'Advisory Board': 'Beirat', 'Ajax Recipes': 'Ajax Rezepte', +'All': 'All', 'Altersempfehlung': 'Altersempfehlung', 'and': 'und', 'Ansichtsexemplar': 'Ansichtsexemplar', @@ -169,6 +170,7 @@ 'Felix M. Michl\nDie limitierte Auflage': 'Felix M. Michl\nDie limitierte Auflage', 'Felix M. Michl Die limitierte Auflage': 'Felix M. Michl Die limitierte Auflage', 'Filter': 'Filter', +'Filter By': 'Filter By', 'First name': 'Vorname', 'Follow us on Twitter': 'Besuchen Sie uns auf Twitter', 'For Authors': 'Informationen für Autoren', diff --git a/modules b/modules index fa96e8ab..35067f0a 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit fa96e8abde9cb5ecb3d8610682b29ddda8a759a8 +Subproject commit 35067f0a74b434b2c764b37a8467499e1c7dc04a diff --git a/views/catalog/index.html b/views/catalog/index.html index 1c7b6118..7b76f878 100755 --- a/views/catalog/index.html +++ b/views/catalog/index.html @@ -13,18 +13,11 @@
    -
    - -
    +{{=b.filter_select}} {{=b.navigation_list}}{{=b.navigation_select}}{{=b.sort_select}} +
    @@ -135,3 +128,4 @@

    Wilhelm Windelband und die Psychologie – Das Fach Philosophie und die

    + From 2e661495d19cd75c72c3392f666daa2b8e3eeadb Mon Sep 17 00:00:00 2001 From: withanage Date: Mon, 24 Apr 2017 13:42:06 +0200 Subject: [PATCH 54/84] Facet beta 1 --- views/catalog/index.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/views/catalog/index.html b/views/catalog/index.html index 7b76f878..79d67d1f 100755 --- a/views/catalog/index.html +++ b/views/catalog/index.html @@ -9,7 +9,7 @@
    - {{=session}} +
    From e9afe31a30ef2884a2850ec856475f1a02062520 Mon Sep 17 00:00:00 2001 From: withanage Date: Wed, 26 Apr 2017 13:14:04 +0200 Subject: [PATCH 55/84] Solr config --- static/utils/solr/managed-schema | 513 +++++++++++++++++++++++++++ static/utils/solr/updateSolrIndex.py | 7 +- 2 files changed, 517 insertions(+), 3 deletions(-) create mode 100644 static/utils/solr/managed-schema diff --git a/static/utils/solr/managed-schema b/static/utils/solr/managed-schema new file mode 100644 index 00000000..795983f7 --- /dev/null +++ b/static/utils/solr/managed-schema @@ -0,0 +1,513 @@ + + + + id + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/static/utils/solr/updateSolrIndex.py b/static/utils/solr/updateSolrIndex.py index 7a7aa413..ca910161 100644 --- a/static/utils/solr/updateSolrIndex.py +++ b/static/utils/solr/updateSolrIndex.py @@ -23,8 +23,8 @@ def main(): ps = ompdal.getPresses() solr = OMPSOLR(db, myconf) document = [] - solr.si.delete(queries=solr.si.Q("*")) - solr.si.commit() + #solr.si.delete(queries=solr.si.Q("*")) + #solr.si.commit() for p in ps: submissions = ompdal.getSubmissionsByPress(p.press_id) @@ -32,6 +32,7 @@ def main(): sub = {} sub['press_id'] = p.press_id sub['submission_id'] = s.submission_id + #sub['id'] = s.submission_id sub['locale'] = s.locale #print ompdal.getActualAuthorsBySubmission(s.submission_id) s_settings = ompdal.getSubmissionSettings(s.submission_id) @@ -44,8 +45,8 @@ def main(): + #print document solr.si.add(document) - solr.si.commit() From fe956d5d62f94362b7c207ab8cbec1120adf9071 Mon Sep 17 00:00:00 2001 From: withanage Date: Wed, 26 Apr 2017 14:09:27 +0200 Subject: [PATCH 56/84] Quality assuarance menu disable --- controllers/catalog.py | 5 +++-- models/z_menu.py | 19 ++++++------------ views/catalog/search.html | 41 +++++++++++++++++++++++++++------------ 3 files changed, 38 insertions(+), 27 deletions(-) diff --git a/controllers/catalog.py b/controllers/catalog.py index 024c47f8..80f98cba 100755 --- a/controllers/catalog.py +++ b/controllers/catalog.py @@ -144,7 +144,8 @@ def search(): if myconf.take("plugins.solr") == str(1): solr = OMPSOLR(db,myconf) #r = solr.si.query(solr.si.Q(title_en=title) | solr.si.Q(title_de=title)) - r = solr.si.query('aktuelle*') + r = solr.si.query(solr.si.Q(title_de='*Leben*')) + #r = solr.si.query('*Leben*') #for s in sort: # r =r.sort_by(s) #r = r.filter(**fq) @@ -153,7 +154,7 @@ def search(): #r = r.highlight(q.keys()) r= r.paginate(start=start, rows=rows) results = r.execute() - #hl = results.highlighting + hl = results.highlighting from paginate import Page, make_html_tag diff --git a/models/z_menu.py b/models/z_menu.py index b2dd143b..5406cba2 100755 --- a/models/z_menu.py +++ b/models/z_menu.py @@ -48,21 +48,17 @@ def category_setting(c, name): publishing_dict = [['for_authors', T('Information for Authors')], - ['rights_and_licences', T('Rights and Licences')] + ['rights_and_licences', T('Rights and Licences')], + ['peer_review', T('Peer Review')], + ['plagiarism', T('Plagiarism')], + ['data_privacy', T('Data Privacy')] ] publishing_dict_list = [LI(A(i[1], _href=URL('publishing', i[0]))) for i in publishing_dict] -quality_control_dict = [ - ['peer_review', T('Peer Review')], - ['plagiarism', T('Plagiarism')], - ['data_privacy', T('Data Privacy')], -] -quality_control_dict_list = [ - LI(A(i[1], _href=URL('quality_control', i[0]))) for i in quality_control_dict] response.menu = UL([LI(A(T('Home'), @@ -87,11 +83,8 @@ def category_setting(c, name): LI(XML(title('Publishing')), UL(publishing_dict_list, _class="dropdown-menu"), - _class="dropdown"), - LI(XML(title('Quality Control')), - UL(quality_control_dict_list, - _class="dropdown-menu"), - _class="dropdown"), + _class="dropdown") + ], _class="nav navbar-nav") diff --git a/views/catalog/search.html b/views/catalog/search.html index e0701ec1..8250c600 100644 --- a/views/catalog/search.html +++ b/views/catalog/search.html @@ -1,15 +1,32 @@ -{{#extend 'layout.html'}} +{{extend 'layout.html'}} {{import re, os}} {{from ompformat import formatContributors, coverImageLink}} -{{=form}} - - {{ - - for r in results: - #=TR(TD(r.get('en_title_s').encode('utf-8'),_class="col-lg-1"),TD(r.get('authors'),_class="col-lg-3"),TD(i)) - #=TR(r) - pass}} -
    -{{=results}} -{{=p}} +
    + + +
    + +
    +
    + +
    +
    + {{=form}} + + {{ + + for r in results: + =TR(TD(r.get('title_en').encode('utf-8'),_class="col-lg-1"),TD(r.get('authors'),_class="col-lg-3")) + #=TR(r) + =BR() + pass}} +
    + {{#=results}} + {{=p}} + +
    +
    +
    +
    + From 5bb98681f41b9bef498cf21d289b5886430bd07b Mon Sep 17 00:00:00 2001 From: withanage Date: Wed, 26 Apr 2017 15:02:57 +0200 Subject: [PATCH 57/84] Solr general search bata --- controllers/catalog.py | 8 ++++---- languages/de.py | 1 + models/z_menu.py | 11 +++++++++-- static/utils/solr/managed-schema | 4 +++- static/utils/solr/updateSolrIndex.py | 4 ++-- views/catalog/search.html | 2 +- 6 files changed, 20 insertions(+), 10 deletions(-) diff --git a/controllers/catalog.py b/controllers/catalog.py index 80f98cba..6024f6a3 100755 --- a/controllers/catalog.py +++ b/controllers/catalog.py @@ -122,8 +122,8 @@ def series(): def search(): - title = '{}'.format(request.vars.title) if request.vars.title else '' - press_id = request.vars.press_id if request.vars.press_id else '' + q = '{}'.format(request.vars.q) if request.vars.q else '*' + form = form = SQLFORM.factory( Field("title"), @@ -144,8 +144,8 @@ def search(): if myconf.take("plugins.solr") == str(1): solr = OMPSOLR(db,myconf) #r = solr.si.query(solr.si.Q(title_en=title) | solr.si.Q(title_de=title)) - r = solr.si.query(solr.si.Q(title_de='*Leben*')) - #r = solr.si.query('*Leben*') + #r = solr.si.query(solr.si.Q(title_de='*Leben*')) + r = solr.si.query(solr.si.Q(q) & solr.si.Q(press_id=myconf.take('omp.press_id')) ) #for s in sort: # r =r.sort_by(s) #r = r.filter(**fq) diff --git a/languages/de.py b/languages/de.py index 12e24a3a..7043a49d 100755 --- a/languages/de.py +++ b/languages/de.py @@ -373,6 +373,7 @@ 'Rows selected': 'Reihen ausgewählt', 'Rückenart': 'Rückenart', 'Save model as...': 'Speichere Vorlage als...', +'search': 'search', 'Search': 'Suche', 'Semantic': 'Semantik', 'Send': 'Verschicken', diff --git a/models/z_menu.py b/models/z_menu.py index 5406cba2..751e15bf 100755 --- a/models/z_menu.py +++ b/models/z_menu.py @@ -58,7 +58,13 @@ def category_setting(c, name): for i in publishing_dict] - +def display_form(): + form=FORM( INPUT(_name='search',_class="form-control", _placeholder=T("Search")), + #INPUT(_type='submit',_class="btn btn-default",), + _class="navbar-form navbar-left") + if form.accepts(request,session): + redirect(URL('catalog','search?q='+request.vars.search)) + return form response.menu = UL([LI(A(T('Home'), @@ -83,7 +89,8 @@ def category_setting(c, name): LI(XML(title('Publishing')), UL(publishing_dict_list, _class="dropdown-menu"), - _class="dropdown") + _class="dropdown"), + LI(display_form(), _class="dropdown") ], _class="nav navbar-nav") diff --git a/static/utils/solr/managed-schema b/static/utils/solr/managed-schema index 795983f7..91ceaf74 100644 --- a/static/utils/solr/managed-schema +++ b/static/utils/solr/managed-schema @@ -400,9 +400,10 @@ + - + @@ -492,6 +493,7 @@ + diff --git a/static/utils/solr/updateSolrIndex.py b/static/utils/solr/updateSolrIndex.py index ca910161..721fcdc4 100644 --- a/static/utils/solr/updateSolrIndex.py +++ b/static/utils/solr/updateSolrIndex.py @@ -23,8 +23,8 @@ def main(): ps = ompdal.getPresses() solr = OMPSOLR(db, myconf) document = [] - #solr.si.delete(queries=solr.si.Q("*")) - #solr.si.commit() + solr.si.delete(queries=solr.si.Q("*")) + solr.si.commit() for p in ps: submissions = ompdal.getSubmissionsByPress(p.press_id) diff --git a/views/catalog/search.html b/views/catalog/search.html index 8250c600..5ae2b992 100644 --- a/views/catalog/search.html +++ b/views/catalog/search.html @@ -3,7 +3,7 @@ {{from ompformat import formatContributors, coverImageLink}}
    - +{{=request.vars}}
    From 00b2438620da253484086c864dfd15bbcfabeb46 Mon Sep 17 00:00:00 2001 From: withanage Date: Wed, 26 Apr 2017 15:41:55 +0200 Subject: [PATCH 58/84] Solr general search added utf-8 support --- controllers/catalog.py | 2 +- views/catalog/search.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/controllers/catalog.py b/controllers/catalog.py index 6024f6a3..24534dfc 100755 --- a/controllers/catalog.py +++ b/controllers/catalog.py @@ -145,7 +145,7 @@ def search(): solr = OMPSOLR(db,myconf) #r = solr.si.query(solr.si.Q(title_en=title) | solr.si.Q(title_de=title)) #r = solr.si.query(solr.si.Q(title_de='*Leben*')) - r = solr.si.query(solr.si.Q(q) & solr.si.Q(press_id=myconf.take('omp.press_id')) ) + r = solr.si.query(solr.si.Q(q.decode('utf-8')) & solr.si.Q(press_id=myconf.take('omp.press_id')) ) #for s in sort: # r =r.sort_by(s) #r = r.filter(**fq) diff --git a/views/catalog/search.html b/views/catalog/search.html index 5ae2b992..b0627333 100644 --- a/views/catalog/search.html +++ b/views/catalog/search.html @@ -22,7 +22,7 @@ pass}} {{#=results}} - {{=p}} + {{#=p}}
    From 72d467e7c91e053ea2dd77cbeaed3814b93525ae Mon Sep 17 00:00:00 2001 From: withanage Date: Wed, 26 Apr 2017 16:46:25 +0200 Subject: [PATCH 59/84] search interface --- views/catalog/search.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/views/catalog/search.html b/views/catalog/search.html index b0627333..5ddba4b1 100644 --- a/views/catalog/search.html +++ b/views/catalog/search.html @@ -21,8 +21,8 @@ =BR() pass}} - {{#=results}} - {{#=p}} + {{=results}} +
    From f9ee5fdd97691c9ae1b3dee1952be8feb56fd1bb Mon Sep 17 00:00:00 2001 From: withanage Date: Fri, 12 May 2017 10:20:44 +0200 Subject: [PATCH 60/84] Search deactivate, order of peer-view --- models/z_menu.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/models/z_menu.py b/models/z_menu.py index 751e15bf..5ef52b77 100755 --- a/models/z_menu.py +++ b/models/z_menu.py @@ -48,8 +48,8 @@ def category_setting(c, name): publishing_dict = [['for_authors', T('Information for Authors')], - ['rights_and_licences', T('Rights and Licences')], ['peer_review', T('Peer Review')], + ['rights_and_licences', T('Rights and Licences')], ['plagiarism', T('Plagiarism')], ['data_privacy', T('Data Privacy')] ] @@ -90,7 +90,7 @@ def display_form(): UL(publishing_dict_list, _class="dropdown-menu"), _class="dropdown"), - LI(display_form(), _class="dropdown") + #LI(display_form(), _class="dropdown") ], _class="nav navbar-nav") From e0e929c498277d6dd5485675bd2aa8f07d4f2521 Mon Sep 17 00:00:00 2001 From: withanage Date: Mon, 15 May 2017 11:17:46 +0200 Subject: [PATCH 61/84] Changed stylesheet for filter --- modules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules b/modules index 35067f0a..e7668ad3 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit 35067f0a74b434b2c764b37a8467499e1c7dc04a +Subproject commit e7668ad30a437267824f7c5ad6f70bb7d4e6305f From 74f0e759ba91be66118f4bec3b21a93897524a30 Mon Sep 17 00:00:00 2001 From: withanage Date: Mon, 15 May 2017 11:25:09 +0200 Subject: [PATCH 62/84] Sparten filter --- modules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules b/modules index e7668ad3..e229accc 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit e7668ad30a437267824f7c5ad6f70bb7d4e6305f +Subproject commit e229acccd32b22affc78e901fb02d4daafe6db12 From c839f431d1c129d31236de1ed54bd7ace471b4e3 Mon Sep 17 00:00:00 2001 From: withanage Date: Mon, 15 May 2017 12:23:35 +0200 Subject: [PATCH 63/84] solr deactivate --- modules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules b/modules index e229accc..9a326579 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit e229acccd32b22affc78e901fb02d4daafe6db12 +Subproject commit 9a32657920c8a415a2f14ffd0a47709b8216439a From 85f08e011d05265aeee5d98065d383c088cf433d Mon Sep 17 00:00:00 2001 From: WWW-Team UB Heidelberg Date: Mon, 15 May 2017 16:23:37 +0200 Subject: [PATCH 64/84] =?UTF-8?q?CSS-=C3=84nderungen=20f=C3=BCr=20Filter?= =?UTF-8?q?=20auf=20Katalogseite?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- static/css/bootstrap.min.css | 2 +- static/css/style.css | 112 +++++++++++++++++++++++------------ 2 files changed, 76 insertions(+), 38 deletions(-) diff --git a/static/css/bootstrap.min.css b/static/css/bootstrap.min.css index 381834ec..4718746a 100755 --- a/static/css/bootstrap.min.css +++ b/static/css/bootstrap.min.css @@ -4,4 +4,4 @@ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) */ -/*! normalize.css v3.0.0 | 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:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.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:-.5em}sub{bottom:-.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 silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}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}}*{-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:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#333;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;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 .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#999}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-muted{color:#999}.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;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 #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}.list-inline>li:first-child{padding-left:0}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.428571429}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.428571429;color:#999}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 #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}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;white-space:nowrap;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,.25)}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:#333;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}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666666666666%}.col-xs-10{width:83.33333333333334%}.col-xs-9{width:75%}.col-xs-8{width:66.66666666666666%}.col-xs-7{width:58.333333333333336%}.col-xs-6{width:50%}.col-xs-5{width:41.66666666666667%}.col-xs-4{width:33.33333333333333%}.col-xs-3{width:25%}.col-xs-2{width:16.666666666666664%}.col-xs-1{width:8.333333333333332%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666666666666%}.col-xs-pull-10{right:83.33333333333334%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666666666666%}.col-xs-pull-7{right:58.333333333333336%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666666666667%}.col-xs-pull-4{right:33.33333333333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.666666666666664%}.col-xs-pull-1{right:8.333333333333332%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666666666666%}.col-xs-push-10{left:83.33333333333334%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666666666666%}.col-xs-push-7{left:58.333333333333336%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666666666667%}.col-xs-push-4{left:33.33333333333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.666666666666664%}.col-xs-push-1{left:8.333333333333332%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666666666666%}.col-xs-offset-10{margin-left:83.33333333333334%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666666666666%}.col-xs-offset-7{margin-left:58.333333333333336%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666666666667%}.col-xs-offset-4{margin-left:33.33333333333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.666666666666664%}.col-xs-offset-1{margin-left:8.333333333333332%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666666666666%}.col-sm-10{width:83.33333333333334%}.col-sm-9{width:75%}.col-sm-8{width:66.66666666666666%}.col-sm-7{width:58.333333333333336%}.col-sm-6{width:50%}.col-sm-5{width:41.66666666666667%}.col-sm-4{width:33.33333333333333%}.col-sm-3{width:25%}.col-sm-2{width:16.666666666666664%}.col-sm-1{width:8.333333333333332%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666666666666%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666666666667%}.col-sm-push-4{left:33.33333333333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666666666666%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666666666666%}.col-md-10{width:83.33333333333334%}.col-md-9{width:75%}.col-md-8{width:66.66666666666666%}.col-md-7{width:58.333333333333336%}.col-md-6{width:50%}.col-md-5{width:41.66666666666667%}.col-md-4{width:33.33333333333333%}.col-md-3{width:25%}.col-md-2{width:16.666666666666664%}.col-md-1{width:8.333333333333332%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666666666666%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666666666666%}.col-md-push-10{left:83.33333333333334%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666666666666%}.col-md-push-7{left:58.333333333333336%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666666666667%}.col-md-push-4{left:33.33333333333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.666666666666664%}.col-md-push-1{left:8.333333333333332%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666666666666%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666666666666%}.col-lg-10{width:83.33333333333334%}.col-lg-9{width:75%}.col-lg-8{width:66.66666666666666%}.col-lg-7{width:58.333333333333336%}.col-lg-6{width:50%}.col-lg-5{width:41.66666666666667%}.col-lg-4{width:33.33333333333333%}.col-lg-3{width:25%}.col-lg-2{width:16.666666666666664%}.col-lg-1{width:8.333333333333332%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666666666666%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.666666666666664%}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666666666666%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-0{margin-left:0}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.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>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-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>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:scroll;-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>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=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:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.428571429;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control:-moz-placeholder{color:#999}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=date]{line-height:34px}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;margin-top:10px;margin-bottom:10px;padding-left:20px}.radio label,.checkbox label{display:inline;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{float:left;margin-left:-20px}.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:400;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.has-feedback .form-control-feedback{position:absolute;top:25px;right:0;display:block;width:34px;height:34px;line-height:34px;text-align:center}.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,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;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,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;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,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{float:none;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .control-label,.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-control-static{padding-top:7px}@media (min-width:768px){.form-horizontal .control-label{text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}.btn{display:inline-block;margin-bottom:0;font-weight:400;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;-o-user-select:none;user-select:none}.btn: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,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.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 .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#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 .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#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 .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.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 .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#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 .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#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 .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#428bca;font-weight:400;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,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-left:0;padding-right:0}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\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"}.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;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);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:400;line-height:1.428571429;color:#333;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:#999}.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:#999}.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{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn: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 .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-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-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%}[data-toggle=buttons]>.btn>input[type=radio],[data-toggle=buttons]>.btn>input[type=checkbox]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.input-group .form-control{float:left;width:100%;margin-bottom:0}.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-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=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>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;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:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.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}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px;height:20px}.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,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{float:none;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@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{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-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-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.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:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.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>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index: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:#999;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 li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:gray}.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:700;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#999;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.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 .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{display:block;max-width:100%;height:auto;margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .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,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media,.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;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.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,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group .list-group-item:first-child{border-top:0}.panel>.list-group .list-group-item:last-child{border-bottom:0}.panel>.list-group:first-child .list-group-item:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>tfoot>tr:first-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tfoot>tr:first-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:first-child>td{border-top:0}.panel>.table-bordered>thead>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:last-child>th,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:last-child>td,.panel>.table-responsive>.table-bordered>thead>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.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-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px;overflow:hidden}.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:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.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-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-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-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-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-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:auto;overflow-y:scroll;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.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,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(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:.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:20px}.modal-footer{margin-top:15px;padding:19px 20px 20px;text-align:right;border-top:1px solid #e5e5e5}.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}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1030;display:block;visibility:visible;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.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:1010;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,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);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:400;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:#999;border-top-color:rgba(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:#999;border-right-color:rgba(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:#999;border-bottom-color:rgba(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:#999;border-left-color:rgba(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:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;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:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.5) 0),color-stop(rgba(0,0,0,.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(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,color-stop(rgba(0,0,0,.0001) 0),color-stop(rgba(0,0,0,.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(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:.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%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-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:rgba(0,0,0,0)}.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,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicons-chevron-left,.carousel-control .glyphicons-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,tr.visible-xs,th.visible-xs,td.visible-xs{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}}.visible-sm,tr.visible-sm,th.visible-sm,td.visible-sm{display:none!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}}.visible-md,tr.visible-md,th.visible-md,td.visible-md{display:none!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}}.visible-lg,tr.visible-lg,th.visible-lg,td.visible-lg{display:none!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 (max-width:767px){.hidden-xs,tr.hidden-xs,th.hidden-xs,td.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm,tr.hidden-sm,th.hidden-sm,td.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md,tr.hidden-md,th.hidden-md,td.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg,tr.hidden-lg,th.hidden-lg,td.hidden-lg{display:none!important}}.visible-print,tr.visible-print,th.visible-print,td.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}}@media print{.hidden-print,tr.hidden-print,th.hidden-print,td.hidden-print{display:none!important}} \ No newline at end of file +/*! normalize.css v3.0.0 | 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:0 0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}dfn{font-style:italic}h1{font-size:2em;margin:.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:-.5em}sub{bottom:-.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 silver;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:700}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}}*{-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:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#333;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;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 .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0,0,0,0);border:0}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:400;line-height:1;color:#999}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:200;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}cite{font-style:normal}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-muted{color:#999}.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;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 #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}.list-inline>li:first-child{padding-left:0}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.428571429}dt{font-weight:700}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.428571429;color:#999}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 #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}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;white-space:nowrap;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,.25)}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:#333;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}@media (min-width:768px){.container{width:750px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:1170px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666666666666%}.col-xs-10{width:83.33333333333334%}.col-xs-9{width:75%}.col-xs-8{width:66.66666666666666%}.col-xs-7{width:58.333333333333336%}.col-xs-6{width:50%}.col-xs-5{width:41.66666666666667%}.col-xs-4{width:33.33333333333333%}.col-xs-3{width:25%}.col-xs-2{width:16.666666666666664%}.col-xs-1{width:8.333333333333332%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666666666666%}.col-xs-pull-10{right:83.33333333333334%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666666666666%}.col-xs-pull-7{right:58.333333333333336%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666666666667%}.col-xs-pull-4{right:33.33333333333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.666666666666664%}.col-xs-pull-1{right:8.333333333333332%}.col-xs-pull-0{right:0}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666666666666%}.col-xs-push-10{left:83.33333333333334%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666666666666%}.col-xs-push-7{left:58.333333333333336%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666666666667%}.col-xs-push-4{left:33.33333333333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.666666666666664%}.col-xs-push-1{left:8.333333333333332%}.col-xs-push-0{left:0}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666666666666%}.col-xs-offset-10{margin-left:83.33333333333334%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666666666666%}.col-xs-offset-7{margin-left:58.333333333333336%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666666666667%}.col-xs-offset-4{margin-left:33.33333333333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.666666666666664%}.col-xs-offset-1{margin-left:8.333333333333332%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666666666666%}.col-sm-10{width:83.33333333333334%}.col-sm-9{width:75%}.col-sm-8{width:66.66666666666666%}.col-sm-7{width:58.333333333333336%}.col-sm-6{width:50%}.col-sm-5{width:41.66666666666667%}.col-sm-4{width:33.33333333333333%}.col-sm-3{width:25%}.col-sm-2{width:16.666666666666664%}.col-sm-1{width:8.333333333333332%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-0{right:0}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666666666666%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666666666667%}.col-sm-push-4{left:33.33333333333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-0{left:0}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666666666666%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666666666666%}.col-md-10{width:83.33333333333334%}.col-md-9{width:75%}.col-md-8{width:66.66666666666666%}.col-md-7{width:58.333333333333336%}.col-md-6{width:50%}.col-md-5{width:41.66666666666667%}.col-md-4{width:33.33333333333333%}.col-md-3{width:25%}.col-md-2{width:16.666666666666664%}.col-md-1{width:8.333333333333332%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666666666666%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-0{right:0}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666666666666%}.col-md-push-10{left:83.33333333333334%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666666666666%}.col-md-push-7{left:58.333333333333336%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666666666667%}.col-md-push-4{left:33.33333333333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.666666666666664%}.col-md-push-1{left:8.333333333333332%}.col-md-push-0{left:0}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666666666666%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666666666666%}.col-lg-10{width:83.33333333333334%}.col-lg-9{width:75%}.col-lg-8{width:66.66666666666666%}.col-lg-7{width:58.333333333333336%}.col-lg-6{width:50%}.col-lg-5{width:41.66666666666667%}.col-lg-4{width:33.33333333333333%}.col-lg-3{width:25%}.col-lg-2{width:16.666666666666664%}.col-lg-1{width:8.333333333333332%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-0{right:0}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666666666666%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.666666666666664%}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-0{left:0}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666666666666%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-0{margin-left:0}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.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>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-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>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}@media (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;overflow-x:scroll;-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>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:700}input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=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:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.428571429;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control:-moz-placeholder{color:#999}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee;opacity:1}textarea.form-control{height:auto}input[type=date]{line-height:34px}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;margin-top:10px;margin-bottom:10px;padding-left:20px}.radio label,.checkbox label{display:inline;font-weight:400;cursor:pointer}.radio input[type=radio],.radio-inline input[type=radio],.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox]{float:left;margin-left:-20px}.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:400;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type=radio][disabled],input[type=checkbox][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type=radio],fieldset[disabled] input[type=checkbox],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.has-feedback .form-control-feedback{position:absolute;top:25px;right:0;display:block;width:34px;height:34px;line-height:34px;text-align:center}.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,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;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,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;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,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.form-control-static{margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.form-inline .radio input[type=radio],.form-inline .checkbox input[type=checkbox]{float:none;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .control-label,.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-control-static{padding-top:7px}@media (min-width:768px){.form-horizontal .control-label{text-align:right}}.form-horizontal .has-feedback .form-control-feedback{top:0;right:15px}.btn{display:inline-block;margin-bottom:0;font-weight:400;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;-o-user-select:none;user-select:none}.btn: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,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;pointer-events:none;opacity:.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 .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#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 .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#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 .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.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 .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#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 .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#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 .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#428bca;font-weight:400;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,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%;padding-left:0;padding-right:0}.btn-block+.btn-block{margin-top:5px}input[type=submit].btn-block,input[type=reset].btn-block,input[type=button].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:400;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\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"}.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:100%;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);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:400;line-height:1.428571429;color:#333;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:#999}.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:#999}.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{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn: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 .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-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-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%}[data-toggle=buttons]>.btn>input[type=radio],[data-toggle=buttons]>.btn>input[type=checkbox]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*=col-]{float:none;padding-left:0;padding-right:0}.input-group .form-control{float:left;width:100%;margin-bottom:0}.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-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=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>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;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:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.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}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px;height:20px}.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,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;padding-left:0;vertical-align:middle}.navbar-form .radio input[type=radio],.navbar-form .checkbox input[type=checkbox]{float:none;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@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{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-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-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.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:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#999}.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>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{color:#2a6496;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index: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:#999;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 li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:700;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:gray}.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:700;color:#fff;line-height:1;vertical-align:baseline;white-space:nowrap;text-align:center;background-color:#999;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.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 .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img,.thumbnail a>img{display:block;max-width:100%;height:auto;margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:700}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .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,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media,.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;background-color:#f5f5f5}a.list-group-item.active,a.list-group-item.active:hover,a.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}a.list-group-item.active .list-group-item-heading,a.list-group-item.active:hover .list-group-item-heading,a.list-group-item.active:focus .list-group-item-heading{color:inherit}a.list-group-item.active .list-group-item-text,a.list-group-item.active:hover .list-group-item-text,a.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,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-body{padding:15px}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group .list-group-item:first-child{border-top:0}.panel>.list-group .list-group-item:last-child{border-bottom:0}.panel>.list-group:first-child .list-group-item:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table,.panel>.table-responsive>.table{margin-bottom:0}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th,.panel>.table-bordered>tfoot>tr:first-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:first-child>th,.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>tfoot>tr:first-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:first-child>td{border-top:0}.panel>.table-bordered>thead>tr:last-child>th,.panel>.table-responsive>.table-bordered>thead>tr:last-child>th,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th,.panel>.table-bordered>thead>tr:last-child>td,.panel>.table-responsive>.table-bordered>thead>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.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-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px;overflow:hidden}.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:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.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-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-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-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-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-footer+.panel-collapse .panel-body{border-bottom-color:#ebccd1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:700;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:auto;overflow-y:scroll;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.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,.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(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:.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:20px}.modal-footer{margin-top:15px;padding:19px 20px 20px;text-align:right;border-top:1px solid #e5e5e5}.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}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}.modal-sm{width:300px}.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1030;display:block;visibility:visible;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.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:1010;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,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2);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:400;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:#999;border-top-color:rgba(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:#999;border-right-color:rgba(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:#999;border-bottom-color:rgba(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:#999;border-left-color:rgba(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:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;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:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-control.left{background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.5) 0),color-stop(rgba(0,0,0,.0001) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(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,color-stop(rgba(0,0,0,.0001) 0),color-stop(rgba(0,0,0,.5) 100%));background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(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:.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%}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-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:rgba(0,0,0,0)}.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,.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicons-chevron-left,.carousel-control .glyphicons-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none!important;visibility:hidden!important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,tr.visible-xs,th.visible-xs,td.visible-xs{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}}.visible-sm,tr.visible-sm,th.visible-sm,td.visible-sm{display:none!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}}.visible-md,tr.visible-md,th.visible-md,td.visible-md{display:none!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}}.visible-lg,tr.visible-lg,th.visible-lg,td.visible-lg{display:none!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 (max-width:767px){.hidden-xs,tr.hidden-xs,th.hidden-xs,td.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm,tr.hidden-sm,th.hidden-sm,td.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md,tr.hidden-md,th.hidden-md,td.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg,tr.hidden-lg,th.hidden-lg,td.hidden-lg{display:none!important}}.visible-print,tr.visible-print,th.visible-print,td.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}}@media print{.hidden-print,tr.hidden-print,th.hidden-print,td.hidden-print{display:none!important}} \ No newline at end of file diff --git a/static/css/style.css b/static/css/style.css index 4eb7a3d4..fa04eeed 100755 --- a/static/css/style.css +++ b/static/css/style.css @@ -1294,18 +1294,18 @@ ul.meta-post li a{ #pagination a, #pagination span { - display: block; - float: left; - margin: 0 7px 0 0; - padding: 7px 10px 6px 10px; - font-size: 12px; - line-height:12px; - color: #888; - font-weight:600; + display: block; + float: left; + margin: 0 7px 0 0; + padding: 7px 10px 6px 10px; + font-size: 12px; + line-height:12px; + color: #888; + font-weight: 600; } #pagination a:hover { - color: #fff; + color: #fff; text-decoration:none; } @@ -1884,7 +1884,6 @@ article img.pull-right, article .align-right{ z-index: 1000; display: none; float: left; - min-width: 160px; padding: 5px 0; margin: 2px 0 0; font-size: 13px; @@ -2006,9 +2005,11 @@ article img.pull-right, article .align-right{ } -/*Anpassungen WWW Heidelberg*/ +/*Änderungen WWW Heidelberg*/ -.bildrahmen, .post-image img {border:1px solid #cdcbcc} +.bildrahmen, .post-image img { + border: 1px solid #cdcbcc; +} .container { padding: 0; @@ -2115,6 +2116,9 @@ li.active { border: none; } + +/**Inhaltsbereich**/ + .box-gray h4 { text-align: left; } @@ -2232,7 +2236,7 @@ ul.standard li { /** Spartenmakierung**/ -.spartenMarker { +/*.spartenMarker { float: right; font-size: 0.8em; text-align: right; @@ -2271,13 +2275,65 @@ ul.standard li { .sparte li:nth-child(2) { background: #909090; width: 2em; - height: 2em; + height: 2em; */ } .fa-stop { color: #909090; } +#spartenmarker { + color: #979797; + font-size: 115%; + margin-top: 0.5ex; + padding-right: 5%; + text-align: right; + text-transform: uppercase; +} + +#spartenmarker a { + text-decoration: none; + color: #979797; +} + +#spartenmarker::after { + color: #979797; + content: "■"; + font-size: 165%; +} + +/*Filterfunktion Seite catalog*/ + +.dropdown-menu li a { + border-bottom: 0; + padding: 5px 10px 5px 5px; + text-transform: uppercase; +} + +.open > .dropdown-menu { + text-align: right; +} + +.pagination > .active > a, +.pagination > .active > a:focus, +.pagination > .active > a:hover { + background: #c9c9c9; + border-color: #cccccc; +} + +.pagination > li:first-child > a, +.pagination > li:last-child > a, +.btn-group > .btn:first-child, +.btn-group > .btn:last-child { + border-radius: 0; +} + +.pagination > li > a, +.pagination > li > a:focus, +.pagination > li > a:hover { + color: #c9c9c9; +} + /**Beirat**/ @@ -2318,32 +2374,10 @@ figcaption { /** Button dropdownMenu 1 'Kaufen' etc - Abstand Pfeil **/ .btn .caret { - margin-left: 3px; + margin-left: 5px; } -/** Spartenmarkierung **/ - -#spartenmarker { - color: #979797; - font-size: 115%; - margin-top: 0.5ex; - padding-right: 5%; - text-align: right; - text-transform: uppercase; -} - -#spartenmarker a { - text-decoration: none; - color: #979797; -} - -#spartenmarker::after { - color: #979797; - content: "■"; - font-size: 165%; -} - /*** Footer ****/ footer { padding-left: 10px; @@ -2364,6 +2398,10 @@ footer { float: left; } + + + + /******/ .print { display: none; From fabf57fa15f0f03023ad6fa0a87120fcc77cfb90 Mon Sep 17 00:00:00 2001 From: withanage Date: Mon, 15 May 2017 17:02:09 +0200 Subject: [PATCH 65/84] @wwwubhd fyi https://github.com/UB-Heidelberg/UBHD-OMPPortal/issues/78 --- views/catalog/index.html | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/views/catalog/index.html b/views/catalog/index.html index 79d67d1f..8c8be469 100755 --- a/views/catalog/index.html +++ b/views/catalog/index.html @@ -14,8 +14,7 @@
    -{{=b.filter_select}} - {{=b.navigation_list}}{{=b.navigation_select}}{{=b.sort_select}} +{{=b.filter_select}} {{=b.sort_select}}
    @@ -59,8 +58,14 @@
    +
    {{pass}} +
    +
    + {{=b.navigation_list}}{{=b.navigation_select}} +
    +
    From 16107f3edfb0e7ddd80dcb0b708ef3be73d7a867 Mon Sep 17 00:00:00 2001 From: WWW-Team UB Heidelberg Date: Tue, 16 May 2017 08:57:55 +0200 Subject: [PATCH 66/84] Layout Filter-/Paginierungsfunktion: CSS und index.html --- static/css/style.css | 23 ++++++++++++++++++----- views/catalog/index.html | 7 ++++++- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/static/css/style.css b/static/css/style.css index fa04eeed..110edb90 100755 --- a/static/css/style.css +++ b/static/css/style.css @@ -2314,6 +2314,22 @@ ul.standard li { text-align: right; } +.pagination { + margin: 0 10px 0 0; +} + +.pagination > li > a{ + padding: 4px 10px; +} + + +.pagination > li > a, +.pagination > li > a:focus, +.pagination > li > a:hover { + color: #c9c9c9; +} + + .pagination > .active > a, .pagination > .active > a:focus, .pagination > .active > a:hover { @@ -2321,6 +2337,7 @@ ul.standard li { border-color: #cccccc; } + .pagination > li:first-child > a, .pagination > li:last-child > a, .btn-group > .btn:first-child, @@ -2328,11 +2345,7 @@ ul.standard li { border-radius: 0; } -.pagination > li > a, -.pagination > li > a:focus, -.pagination > li > a:hover { - color: #c9c9c9; -} + diff --git a/views/catalog/index.html b/views/catalog/index.html index 8c8be469..4c9a81cf 100755 --- a/views/catalog/index.html +++ b/views/catalog/index.html @@ -63,7 +63,12 @@
    {{pass}}
    - {{=b.navigation_list}}{{=b.navigation_select}} +
    +
    +
    + {{=b.navigation_list}} + {{=b.navigation_select}} +
    From 61af74a2edad7d7e3e2bc10a1338c8d9dfd64a9e Mon Sep 17 00:00:00 2001 From: withanage Date: Tue, 16 May 2017 09:15:52 +0200 Subject: [PATCH 67/84] results per page https://gitlab.ub.uni-heidelberg.de/wit/verlag-portale/issues/50#note_1012 --- modules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules b/modules index 9a326579..56c1c3d2 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit 9a32657920c8a415a2f14ffd0a47709b8216439a +Subproject commit 56c1c3d26391fb95b227e46fc8164100e10e1354 From ae0a064399d37826d138829405ba2d38695653c9 Mon Sep 17 00:00:00 2001 From: withanage Date: Tue, 16 May 2017 09:23:33 +0200 Subject: [PATCH 68/84] results per page --- modules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules b/modules index 56c1c3d2..d7e590c1 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit 56c1c3d26391fb95b227e46fc8164100e10e1354 +Subproject commit d7e590c1d9a8ddb2805f94ca81cc74969684fdb4 From b1abe8b58d0beb5bf3086fcdcd2b228780c60551 Mon Sep 17 00:00:00 2001 From: WWW-Team UB Heidelberg Date: Tue, 16 May 2017 13:06:15 +0200 Subject: [PATCH 69/84] Stylesheet: Ausrichtung Dropdown-Menu Trefferanzeigen-Steuerung Katalogseite --- static/css/style.css | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/static/css/style.css b/static/css/style.css index 110edb90..2becab77 100755 --- a/static/css/style.css +++ b/static/css/style.css @@ -2092,7 +2092,7 @@ header .navbar-nav > li { .open > .dropdown-menu { - margin-left: 20px; + margin-left: 8px; background: #f5f5f5; } @@ -2346,7 +2346,9 @@ ul.standard li { } - +.pull-left > .dropdown-menu { + margin-left: 0; +} /**Beirat**/ From 28c418e1fdf8e6f014eafdebb55d982d6426bdd4 Mon Sep 17 00:00:00 2001 From: WWW-Team UB Heidelberg Date: Wed, 17 May 2017 09:29:27 +0200 Subject: [PATCH 70/84] =?UTF-8?q?Sprachdatei=20de.py:=20deutsche=20Begriff?= =?UTF-8?q?e=20f=C3=BCr=20Filtersortierung=20erg=C3=A4nzt?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- languages/de.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/languages/de.py b/languages/de.py index 7043a49d..e1120e49 100755 --- a/languages/de.py +++ b/languages/de.py @@ -55,7 +55,7 @@ 'Adresszeile3': 'Adresszeile3', 'Advisory Board': 'Beirat', 'Ajax Recipes': 'Ajax Rezepte', -'All': 'All', +'All': 'Alle', 'Altersempfehlung': 'Altersempfehlung', 'and': 'und', 'Ansichtsexemplar': 'Ansichtsexemplar', @@ -100,6 +100,7 @@ 'Campus Media ': 'Campus Media ', 'Cannot be empty': 'Darf nicht leer sein', 'Capitals': 'Capitals', +'Category': 'Sparte', 'Categories': 'Sparten', 'Chapters': 'Kapitel', 'Check to delete': 'Auswählen um zu löschen', @@ -131,6 +132,7 @@ 'Database': 'Datenbank', 'Database %s select': 'Datenbank %s ausgewählt', 'Database Administration (appadmin)': 'Datenbankadministration (appadmin)', +'Date': 'Datum', 'Dateiname PDF (cover)': 'Dateiname PDF (cover)', 'Dateiname PDF (innerwork)': 'Dateiname PDF (innerwork)', 'db': 'db', @@ -365,7 +367,7 @@ 'Reihe': 'Reihe', 'Remember me (for 30 days)': 'Eingeloggt bleiben (30 Tage lang)', 'Reset Password key': 'Passwortschlüssel zurücksetzen', -'Results per Page': 'Results per Page', +'Results per Page': 'Treffer pro Seite', 'Rights and Licences': 'Rechte und Lizenzen', 'Role': 'Rolle', 'Roles': 'Rollen', @@ -392,7 +394,7 @@ 'Sign Up': 'Sign Up', 'Size of cache:': 'Cachegröße:', 'Soon': 'Demnächst', -'sort by': 'sort by', +'sort by': 'Sortieren nach', 'Speicherung': 'Speicherung', 'Sprache': 'Sprache', 'state': 'Status', @@ -420,7 +422,7 @@ 'This email already has an account': 'This email already has an account', 'Time in Cache (h:m:s)': 'Zeit im Cache (h:m:s)', 'Timestamp': 'Zeitstempel', -'Titel': 'Titel', +'Title': 'Titel', 'Titel der Original Ausgabe': 'Titel der Original Ausgabe', 'Titles': 'Titel', 'To be published %(date)s. ## %B %Y': 'Erscheint im %(date)s.', From 37f7b896a90cc762ee221b695d9abd72f85533ae Mon Sep 17 00:00:00 2001 From: withanage Date: Wed, 17 May 2017 11:19:40 +0200 Subject: [PATCH 71/84] =?UTF-8?q?spartel=20=C3=BCbersetzung?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- languages/de.py | 7 +++++-- modules | 2 +- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/languages/de.py b/languages/de.py index e1120e49..581ed99a 100755 --- a/languages/de.py +++ b/languages/de.py @@ -100,8 +100,9 @@ 'Campus Media ': 'Campus Media ', 'Cannot be empty': 'Darf nicht leer sein', 'Capitals': 'Capitals', -'Category': 'Sparte', 'Categories': 'Sparten', +'category': 'spartel', +'Category': 'Sparte', 'Chapters': 'Kapitel', 'Check to delete': 'Auswählen um zu löschen', 'Choose citation style': 'Zitationsstil auswählen', @@ -132,6 +133,7 @@ 'Database': 'Datenbank', 'Database %s select': 'Datenbank %s ausgewählt', 'Database Administration (appadmin)': 'Datenbankadministration (appadmin)', +'date': 'datum', 'Date': 'Datum', 'Dateiname PDF (cover)': 'Dateiname PDF (cover)', 'Dateiname PDF (innerwork)': 'Dateiname PDF (innerwork)', @@ -422,8 +424,9 @@ 'This email already has an account': 'This email already has an account', 'Time in Cache (h:m:s)': 'Zeit im Cache (h:m:s)', 'Timestamp': 'Zeitstempel', -'Title': 'Titel', 'Titel der Original Ausgabe': 'Titel der Original Ausgabe', +'Title': 'Titel', +'title': 'titel', 'Titles': 'Titel', 'To be published %(date)s. ## %B %Y': 'Erscheint im %(date)s.', 'To be published %(date)s. ## %x': 'Erscheint am %(date)s.', diff --git a/modules b/modules index d7e590c1..556fb966 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit d7e590c1d9a8ddb2805f94ca81cc74969684fdb4 +Subproject commit 556fb96694b49c3437a30038b20309590d1185ce From 572cda89deecdc4ca545d4dcd1809bc86aed3f22 Mon Sep 17 00:00:00 2001 From: withanage Date: Wed, 17 May 2017 12:28:08 +0200 Subject: [PATCH 72/84] Sort by https://github.com/UB-Heidelberg/UBHD-OMPPortal/issues/78 --- languages/de.py | 2 ++ languages/default.py | 2 ++ modules | 2 +- 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/languages/de.py b/languages/de.py index 581ed99a..b34b6dda 100755 --- a/languages/de.py +++ b/languages/de.py @@ -289,12 +289,14 @@ 'New Record': 'Neuer Eintrag', 'new record inserted': 'neuer Eintrag hinzugefügt', 'New Titles': 'Neuerscheinung', +'newest_to_oldest': 'Erscheinungsdatum (↓) ', 'News': 'Aktuelles', 'next %s rows': 'nächste %s Reihen', 'No databases in this application': 'Keine Datenbank in dieser Anwendung', 'Nur wenn check-trim-box yes ist, Standardwert 4 mm, kann aber frei gewählt werden.': 'Nur wenn check-trim-box yes ist, Standardwert 4 mm, kann aber frei gewählt werden.', 'Nur wenn Prüfung Trimbox "yes" ist, Standardwert 2,5 mm, kann aber frei gewählt werden. Bei Dezimalzahlen Trennzeichen "Punkt".': 'Nur wenn Prüfung Trimbox "yes" ist, Standardwert 2,5 mm, kann aber frei gewählt werden. Bei Dezimalzahlen Trennzeichen "Punkt".', 'Object or table name': 'Objekt- oder Tabellenname', +'oldest_to_newest': 'Erscheinungsdatum (↑)', 'ONIX': 'ONIX', 'Onix': 'Onix', 'Onix Additionals': 'Onix Additionals', diff --git a/languages/default.py b/languages/default.py index 730ba971..746d51cc 100755 --- a/languages/default.py +++ b/languages/default.py @@ -160,6 +160,7 @@ 'New %(entity)s': 'New %(entity)s', 'New Record': 'New Record', 'New Search': 'New Search', + 'newest_to_oldest': 'Newest to oldest', 'No records found': 'No records found', 'not authorized': 'not authorized', 'not in': 'not in', @@ -172,6 +173,7 @@ 'Other Plugins': 'Other Plugins', 'Other Recipes': 'Other Recipes', 'Overview': 'Overview', + 'oldest_to_newest': 'oldest to newest', 'Password': 'Password', "Password fields don't match": "Password fields don't match", 'please input your password again': 'please input your password again', diff --git a/modules b/modules index 556fb966..55f72c4c 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit 556fb96694b49c3437a30038b20309590d1185ce +Subproject commit 55f72c4cdbc35ad83506904293ed30c1912bbd27 From ebaf0823a4e8db4be0bce189d3d94976a473804a Mon Sep 17 00:00:00 2001 From: withanage Date: Wed, 17 May 2017 12:35:55 +0200 Subject: [PATCH 73/84] limit by minimum 20 : https://github.com/UB-Heidelberg/UBHD-OMPPortal/issues/78 --- modules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules b/modules index 55f72c4c..3b87a87f 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit 55f72c4cdbc35ad83506904293ed30c1912bbd27 +Subproject commit 3b87a87f3972fffbe55eef74fa316fa6348ab6af From 413a063538dc4c52eb30ff7d7aba083555c03a3b Mon Sep 17 00:00:00 2001 From: withanage Date: Wed, 17 May 2017 12:38:36 +0200 Subject: [PATCH 74/84] limit by minimum 20 : https://github.com/UB-Heidelberg/UBHD-OMPPortal/issues/78 --- modules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modules b/modules index 3b87a87f..7d527c4c 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit 3b87a87f3972fffbe55eef74fa316fa6348ab6af +Subproject commit 7d527c4c759432ddbef0d944b0b136ab0303cdca From d3e2072e1d97ce37c173b542e49e19a501cb0ba4 Mon Sep 17 00:00:00 2001 From: withanage Date: Thu, 18 May 2017 16:09:52 +0200 Subject: [PATCH 75/84] doc updated --- static/docs/INSTALL.md | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/static/docs/INSTALL.md b/static/docs/INSTALL.md index 5f3c28da..e1b73539 100644 --- a/static/docs/INSTALL.md +++ b/static/docs/INSTALL.md @@ -6,7 +6,20 @@ 1. [Download] (http://web2py.com/init/default/download) web2py 2. Unzip it 3. change directory to the the unzipped folder -4. If you have python installed : run ```python2.7 web2py.py``` +4. If you have python installed : run ```python web2py.py --nogui -a "mypassword"``` + +Output should look like this +``` +web2py Web Framework +Created by Massimo Di Pierro, Copyright 2007-2017 +Version 2.14.6-stable+timestamp.2016.05.10.00.21.47 +Database drivers available: pymysql, imaplib, pg8000, sqlite3, sqlite2, pyodbc, mysqlconnector +please visit: + http://127.0.0.1:8000/ +use "kill -SIGTERM 30529" to shutdown the web2py server + +``` + ## Install UBHD-OMPPortal 1. ```cd web2py_folder/applications/``` @@ -36,4 +49,12 @@ sudo pip2 install -r requirements.txt ``` ln -s web2py_folder/applications/press_name/static/monographs/ omp_folder/files/presses/press_id/monographs +``` +7. Test your installation +``` +http://127.0.0.1:8000/press_name +``` + + + From 18a2edc7d584ee06dda519b099b8accd2abffdfb Mon Sep 17 00:00:00 2001 From: Dulip Withanage Date: Thu, 18 May 2017 17:09:44 +0200 Subject: [PATCH 76/84] Update INSTALL.md --- static/docs/INSTALL.md | 1 + 1 file changed, 1 insertion(+) diff --git a/static/docs/INSTALL.md b/static/docs/INSTALL.md index e1b73539..f6b9b940 100644 --- a/static/docs/INSTALL.md +++ b/static/docs/INSTALL.md @@ -32,6 +32,7 @@ use "kill -SIGTERM 30529" to shutdown the web2py server ``` cd web2py_folder/applications/$press_name sudo pip2 install -r requirements.txt +git submodule update ``` 4. Copy appconfig.ini and cahnges the settings accordingly Datails on appconfig.ini are From 4762c4243251efe8d432366fa77c62f3cbcfd1df Mon Sep 17 00:00:00 2001 From: withanage Date: Mon, 22 May 2017 14:42:53 +0200 Subject: [PATCH 77/84] added bookstats --- static/utils/bookStats.py | 71 ++++++++++++++++++++++++++++----------- 1 file changed, 51 insertions(+), 20 deletions(-) diff --git a/static/utils/bookStats.py b/static/utils/bookStats.py index 24113aca..134cd543 100755 --- a/static/utils/bookStats.py +++ b/static/utils/bookStats.py @@ -34,7 +34,8 @@ import socket import struct import sys - +from json2html import * +from collections import OrderedDict logging.basicConfig(filename='jatsPostProcess.log', level=logging.DEBUG) @@ -59,16 +60,16 @@ def ip2long(self, ip): packedIP = socket.inet_aton(ip) return struct.unpack("!L", packedIP)[0] - def get_ips(self, m): + def get_ips(self,a): """ returns the IPS per monograph """ r = list() - q = ''.join( - [ - "SELECT request_args, INET_ATON(REPLACE(client_ip, 'xxx', '0')), 1 FROM omp.t_usage_statistics where request_args like '|", - str(m), - "|%' "]) + sql = [ "SELECT request_args, INET_ATON(REPLACE(client_ip, 'xxx', '0')), 1 FROM omp.t_usage_statistics"] + if self.config.get('sql'): + if self.config.get('sql').get(a): + sql.append(self.config.get('sql').get(a)) + q = ' '.join(sql) self.cursor.execute(q) [r.append((row[0], row[1], row[2])) for row in self.cursor] return r @@ -138,14 +139,34 @@ def filter_monographs(self, s): """ return True if len(s) == 32 or len(s) == 4 else False - def create_html(self, m, filter): + def total_create_html(self, a): + result = self.get_stats_by_country(self.get_ips(a), 1, filter=[]) + # total for all monographs + r = {} + for i in result: + for k in result[i].keys(): + if r.get(k): + r[k]= r[k]+ result[i][k] + else: + r[k] = result[i][k] + #print k , result[i][k] + result = r + result= OrderedDict(sorted(result.items(), key=lambda x: -x[1])) + result['Total']= sum(result.values()) + return json2html.convert(json = result) + + + def monograph_create_html(self, m, filter): """ generates HTML Table """ result = self.get_stats_by_country(self.get_ips(m), 1, filter) + total = 0 t = self.h.table(style=" border-collapse: collapse; border: 1px solid black;") for r in sorted(result): + ls = sum(result[r].values()) + total = total +ls if self.filter_monographs(r): if len(r.split('-')) > 2: if r.split('-')[2]: @@ -170,6 +191,7 @@ def create_html(self, m, filter): tr = t.tr(style="border: 1px solid black;") tr.td(str(c[0])) tr.td(str(c[1])) + print total return ''.join([' ',str(t)]) def get_config(self, f): @@ -194,21 +216,30 @@ def get_connection(self, config): database=config["mysql"]["db"]) return cnx - def create_stats(self, bs, m): + + + def create_stats(self, bs,m): """ generate stats html, with filter and without filter """ - ofilter = ''.join([os.getcwd(), '/', str(m), '-filter.html']) - f = open(ofilter, 'w') - f.write(bs.create_html(m, bs.config["filters"])) - f.close() + if m: + ofilter = ''.join([os.getcwd(), '/', str(m), '-filter.html']) + f = open(ofilter, 'w') + f.write(bs.monograph_create_html(m, bs.config["filters"])) + f.close() + + outfile = ''.join([os.getcwd(), '/', str(m), '.html']) + f = open(outfile, 'w') + f.write(bs.monograph_create_html(m, [])) + f.close() + else : + args = {'pdf':'select_all_pdf','xml':'select_all_xml'} + for a in args: + f = open('{}{}'.format(a,'-total.html'), 'w') + f.write(bs.total_create_html(args[a])) + f.close() - outfile = ''.join([os.getcwd(), '/', str(m), '.html']) - f = open(outfile, 'w') - f.write(bs.create_html(m, [])) - f.close() if __name__ == "__main__": - m = sys.argv[1] if len(sys.argv) > 1 else '' - bs = BookStats("bookStatsConfig.json") - bs.create_stats(bs, m) + bs = BookStats("/home/wit/scripts/bookStatsConfig.json") + bs.create_stats(bs, m=None) From a8812f21c4429e46976fd540033d3592c7910256 Mon Sep 17 00:00:00 2001 From: withanage Date: Mon, 22 May 2017 15:48:19 +0200 Subject: [PATCH 78/84] stats --- static/utils/bookStats.py | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/static/utils/bookStats.py b/static/utils/bookStats.py index 134cd543..d9881396 100755 --- a/static/utils/bookStats.py +++ b/static/utils/bookStats.py @@ -97,16 +97,31 @@ def u(self, s): """ return s.encode('utf-8') + def int2IP(self, ipnum): + o1 = int(ipnum / 16777216) % 256 + o2 = int(ipnum / 65536) % 256 + o3 = int(ipnum / 256) % 256 + o4 = int(ipnum) % 256 + return '%(o1)s.%(o2)s.%(o3)s.%(o4)s' % locals() + def filter_ip(self, ip, list): """ filters a list of ips """ for i in list: - if ip == self.ip2long(i): - return False - else: - return True + if ip: + x1 = self.int2IP(ip) + x = x1.split('.') + x[2] =0 + + x = [str(j) for j in x] + y = '.'.join(x) + if self.ip2long(y) == self.ip2long(i): + return False + + else: + return True def get_stats_by_country(self, iplist, pos, filter): """ @@ -114,6 +129,7 @@ def get_stats_by_country(self, iplist, pos, filter): """ rs = {} for ips in iplist: + if self.filter_ip(ips[pos], filter): q = "".join(["SELECT country_code, country_name FROM omp.t_geoip_country where INET_ATON(ip_begin) < ", str( ips[pos]), " and INET_ATON(ip_end) > ", str(ips[pos]), ";"]) @@ -140,7 +156,7 @@ def filter_monographs(self, s): return True if len(s) == 32 or len(s) == 4 else False def total_create_html(self, a): - result = self.get_stats_by_country(self.get_ips(a), 1, filter=[]) + result = self.get_stats_by_country(self.get_ips(a), 1, filter=self.config.get('filters')) # total for all monographs r = {} for i in result: @@ -149,7 +165,7 @@ def total_create_html(self, a): r[k]= r[k]+ result[i][k] else: r[k] = result[i][k] - #print k , result[i][k] + result = r result= OrderedDict(sorted(result.items(), key=lambda x: -x[1])) result['Total']= sum(result.values()) From dbe95b9b02402d5e6651a747878eaa2c48f55db3 Mon Sep 17 00:00:00 2001 From: withanage Date: Mon, 22 May 2017 16:06:12 +0200 Subject: [PATCH 79/84] stats --- static/utils/bookStats.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/utils/bookStats.py b/static/utils/bookStats.py index d9881396..604258e1 100755 --- a/static/utils/bookStats.py +++ b/static/utils/bookStats.py @@ -249,7 +249,7 @@ def create_stats(self, bs,m): f.write(bs.monograph_create_html(m, [])) f.close() else : - args = {'pdf':'select_all_pdf','xml':'select_all_xml'} + args = {'pdf':'select_all_pdf','xml':'select_all_xml','html':'select_web_site'} for a in args: f = open('{}{}'.format(a,'-total.html'), 'w') f.write(bs.total_create_html(args[a])) From df278b31da839aba72cc77c6bdb5f9e889e54cbf Mon Sep 17 00:00:00 2001 From: withanage Date: Tue, 23 May 2017 13:35:27 +0200 Subject: [PATCH 80/84] stats --- static/utils/bookStats.py | 80 +++++++++++++++++++++++++++++++-------- 1 file changed, 64 insertions(+), 16 deletions(-) diff --git a/static/utils/bookStats.py b/static/utils/bookStats.py index 604258e1..3f56432e 100755 --- a/static/utils/bookStats.py +++ b/static/utils/bookStats.py @@ -47,12 +47,30 @@ def __init__(self, config): self.con = self.get_connection(self.get_config(config)) self.cursor = self.con.cursor() self.locale = '"de_DE"' + self.monographs = self.get_monographs() + self.countries = self.get_countries() + + self.h = HTML() def __del__(self): self.cursor.close() self.con.close() + + def get_monographs(self): + monographs = [] + q1 = "".join( + ["SELECT submission_id FROM omp1_2.submissions where context_id=",str(self.config.get('press'))," group by submission_id;"]) + try: + self.cursor.execute(q1) + for row in self.cursor: + # print row + monographs.append(row[0]) + except: + logging.error(q1) + return monographs + def ip2long(self, ip): """ Convert an IP string to long @@ -68,10 +86,25 @@ def get_ips(self,a): sql = [ "SELECT request_args, INET_ATON(REPLACE(client_ip, 'xxx', '0')), 1 FROM omp.t_usage_statistics"] if self.config.get('sql'): if self.config.get('sql').get(a): + sql.append("where") sql.append(self.config.get('sql').get(a)) + + + + q = ' '.join(sql) self.cursor.execute(q) - [r.append((row[0], row[1], row[2])) for row in self.cursor] + for row in self.cursor: + + # check for the monoggraph id + if len(row[0]) ==32 and (a =='select_all_xml' or a =='select_all_pdf' ) : + if row[0].split('|')[1].isdigit(): + if int(row[0].split('|')[1]) in self.monographs: + r.append((row[0], row[1], row[2])) + + if a =='select_web_site': + r.append((row[0], row[1], row[2])) + return r def get_chapter_name(self, m): @@ -129,26 +162,40 @@ def get_stats_by_country(self, iplist, pos, filter): """ rs = {} for ips in iplist: - + # check if monograph is in press if self.filter_ip(ips[pos], filter): - q = "".join(["SELECT country_code, country_name FROM omp.t_geoip_country where INET_ATON(ip_begin) < ", str( - ips[pos]), " and INET_ATON(ip_end) > ", str(ips[pos]), ";"]) - try: - self.cursor.execute(q) - except: - logging.error(q) - for row in self.cursor: - f = ips[0].strip() - if rs.get(f): - if rs.get(f).get(row[1]): - rs[f][row[1]] = ips[2] + rs[f][row[1]] + q = "".join(["SELECT country_code, country_name FROM omp.t_geoip_country where INET_ATON(ip_begin) < ", str( + ips[pos]), " and INET_ATON(ip_end) > ", str(ips[pos]), ";"]) + try: + self.cursor.execute(q) + + except: + logging.error(q) + for row in self.cursor: + f = ips[0].strip() + if rs.get(f): + if rs.get(f).get(row[1]): + rs[f][row[1]] = ips[2] + rs[f][row[1]] + else: + rs[f][row[1]] = ips[2] else: + rs[f] = {} rs[f][row[1]] = ips[2] - else: - rs[f] = {} - rs[f][row[1]] = ips[2] return rs + def get_countries(self): + countries = {} + q1 = "".join( + ["SELECT country_code, country_name, INET_ATON(ip_begin), INET_ATON(ip_end) FROM omp.t_geoip_country"]) + try: + self.cursor.execute(q1) + for row in self.cursor: + # print row + countries[row[1]] = {'ip_begin': row[2], 'ip_end': row[3]} + except: + logging.error(q1) + return countries + def filter_monographs(self, s): """ filter the monographs with length @@ -156,6 +203,7 @@ def filter_monographs(self, s): return True if len(s) == 32 or len(s) == 4 else False def total_create_html(self, a): + print a result = self.get_stats_by_country(self.get_ips(a), 1, filter=self.config.get('filters')) # total for all monographs r = {} From 413f2487c19e0c5dde417677b60ef71ad325b2fb Mon Sep 17 00:00:00 2001 From: withanage Date: Tue, 23 May 2017 14:23:48 +0200 Subject: [PATCH 81/84] stats --- static/utils/bookStats.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/static/utils/bookStats.py b/static/utils/bookStats.py index 3f56432e..ad92445a 100755 --- a/static/utils/bookStats.py +++ b/static/utils/bookStats.py @@ -48,6 +48,7 @@ def __init__(self, config): self.cursor = self.con.cursor() self.locale = '"de_DE"' self.monographs = self.get_monographs() + print self.monographs self.countries = self.get_countries() @@ -93,18 +94,18 @@ def get_ips(self,a): q = ' '.join(sql) + print q self.cursor.execute(q) for row in self.cursor: - # check for the monoggraph id - if len(row[0]) ==32 and (a =='select_all_xml' or a =='select_all_pdf' ) : + print row + if (len(row[0]) >=32) and (a =='select_all_xml' or a =='select_all_pdf' ) : if row[0].split('|')[1].isdigit(): if int(row[0].split('|')[1]) in self.monographs: - r.append((row[0], row[1], row[2])) + r.append((row[0], row[1], row[2])) if a =='select_web_site': r.append((row[0], row[1], row[2])) - return r def get_chapter_name(self, m): From e53242680479cf216b8c1c6e96e8ca4bae798bc1 Mon Sep 17 00:00:00 2001 From: withanage Date: Wed, 24 May 2017 14:13:58 +0200 Subject: [PATCH 82/84] Ticket https://gitlab.ub.uni-heidelberg.de/wit/verlag-portale/issues/50 --- languages/de.py | 3 ++- modules | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/languages/de.py b/languages/de.py index b34b6dda..9e19b911 100755 --- a/languages/de.py +++ b/languages/de.py @@ -69,6 +69,7 @@ 'Are you sure you want to delete this object?': 'Sind Sie sich sicher, dass Sie dieses Objekt löschen wollen?', 'Auflage': 'Auflage', 'Auslieferungstermin': 'Auslieferungstermin', +'authors': 'Autor', 'Autoren': 'Autoren', 'Autoren : Vorname Nachname )': 'Autoren : Vorname Nachname )', 'Available Databases and Tables': 'Verfügbare Datenbanken und Tabellen', @@ -101,7 +102,7 @@ 'Cannot be empty': 'Darf nicht leer sein', 'Capitals': 'Capitals', 'Categories': 'Sparten', -'category': 'spartel', +'category': 'sparte', 'Category': 'Sparte', 'Chapters': 'Kapitel', 'Check to delete': 'Auswählen um zu löschen', diff --git a/modules b/modules index 7d527c4c..0206d252 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit 7d527c4c759432ddbef0d944b0b136ab0303cdca +Subproject commit 0206d252773b4e0ed829071865ba61aa2a5a1abf From 1d03df82445473ba7ff1e5a9d80cb224d7980d69 Mon Sep 17 00:00:00 2001 From: withanage Date: Wed, 24 May 2017 14:45:41 +0200 Subject: [PATCH 83/84] Ticket https://gitlab.ub.uni-heidelberg.de/wit/verlag-portale/issues/50 --- views/catalog/index.html | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/views/catalog/index.html b/views/catalog/index.html index 4c9a81cf..b899e49a 100755 --- a/views/catalog/index.html +++ b/views/catalog/index.html @@ -21,6 +21,7 @@
    {{for submission in submissions:}} +
    @@ -71,6 +72,8 @@
    + + {{if session.filters=='':}}
    @@ -88,7 +91,6 @@

    {{=T('Forthcoming')}}

    -
    @@ -134,8 +136,9 @@

    Wilhelm Windelband und die Psychologie – Das Fach Philosophie und die

    - +
    + {{pass}}
    From 9e87c0e10f5d41ada898210693567d332e0c0c48 Mon Sep 17 00:00:00 2001 From: withanage Date: Fri, 26 May 2017 10:24:04 +0200 Subject: [PATCH 84/84] https://gitlab.ub.uni-heidelberg.de/wit/verlag-portale/issues/50 --- controllers/catalog.py | 2 +- languages/de.py | 1 + modules | 2 +- 3 files changed, 3 insertions(+), 2 deletions(-) diff --git a/controllers/catalog.py b/controllers/catalog.py index 24534dfc..457ae124 100755 --- a/controllers/catalog.py +++ b/controllers/catalog.py @@ -220,7 +220,7 @@ def index(): session.filters =request.vars.get('filter_by').strip('[').strip(']') if request.vars.get('filter_by') else session.get('filters', '') session.per_page = int(request.vars.get('per_page')) if request.vars.get('per_page') else int(session.get('per_page', 20)) - session.sort_by = request.vars.get('sort_by') if request.vars.get('sort_by') else session.get('sort_by', 'date') + session.sort_by = request.vars.get('sort_by') if request.vars.get('sort_by') else session.get('sort_by', 'newest_to_oldest') current = int(request.vars.get('page_nr', 1)) - 1 diff --git a/languages/de.py b/languages/de.py index 9e19b911..bbf78fc1 100755 --- a/languages/de.py +++ b/languages/de.py @@ -69,6 +69,7 @@ 'Are you sure you want to delete this object?': 'Sind Sie sich sicher, dass Sie dieses Objekt löschen wollen?', 'Auflage': 'Auflage', 'Auslieferungstermin': 'Auslieferungstermin', +'author': 'Autor', 'authors': 'Autor', 'Autoren': 'Autoren', 'Autoren : Vorname Nachname )': 'Autoren : Vorname Nachname )', diff --git a/modules b/modules index 0206d252..174cdb84 160000 --- a/modules +++ b/modules @@ -1 +1 @@ -Subproject commit 0206d252773b4e0ed829071865ba61aa2a5a1abf +Subproject commit 174cdb84b790b2592bba4e2e242b39a8e91bf0a8